{"version":3,"file":"paths.cjs","names":[],"sources":["../../../src/scan/paths.ts"],"sourcesContent":["import { basename } from \"node:path\";\nimport picomatch from \"picomatch\";\nimport { isHttpMethod } from \"@taserjs/router-utils/http\";\nimport { DEFAULT_IGNORE, ROUTE_VERB_PATTERN } from \"../constants.js\";\nimport { resolveImportExtension, type ExtensionOption } from \"../config.js\";\nimport { ScanError } from \"../support/errors.js\";\nimport { toPosixPath } from \"../support/paths.js\";\nimport type { HttpVerb, LayoutFile, RouteFileMethod } from \"../types.js\";\n\nconst VIRTUAL_CONFIG_PATTERN = /^__virtual\\.[mc]?[jt]s$/;\nconst SPLIT_DOT_REGEX = /(?<!\\[)\\.(?!\\])/g;\nconst matcherCache = new Map<string, (test: string) => boolean>();\n\nfunction getMatcher(patterns: readonly string[]): (test: string) => boolean {\n  const key = patterns.join(\"::\");\n  let matcher = matcherCache.get(key);\n  if (!matcher) {\n    matcher = picomatch(patterns as string[], { dot: true });\n    matcherCache.set(key, matcher);\n  }\n  return matcher;\n}\n\nexport function shouldIgnoreRoutePath(\n  relPath: string,\n  ignorePatterns?: readonly string[],\n): boolean {\n  const normalized = toPosixPath(relPath).replace(/^\\/+/, \"\");\n  const segments = normalized.split(\"/\");\n\n  for (const segment of segments) {\n    if (!segment) continue;\n    if (segment.startsWith(\".\")) return true;\n    if (VIRTUAL_CONFIG_PATTERN.test(segment)) return true;\n  }\n\n  const patterns = ignorePatterns && ignorePatterns.length > 0 ? ignorePatterns : DEFAULT_IGNORE;\n  const isMatch = getMatcher(patterns);\n\n  if (isMatch(normalized)) {\n    return true;\n  }\n\n  let currentPath = \"\";\n  for (const segment of segments) {\n    currentPath = currentPath ? `${currentPath}/${segment}` : segment;\n    if (isMatch(segment) || isMatch(currentPath)) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nexport function assertPhysicalRouteFile(rawRel: string): void {\n  const fileName = basename(rawRel);\n  if (VIRTUAL_CONFIG_PATTERN.test(fileName)) {\n    throw new ScanError(\n      \"Virtual route config files are not supported. Taser.js uses filesystem routes only.\",\n      rawRel,\n    );\n  }\n}\n\nexport function isRouteFile(filePath: string): boolean {\n  return ROUTE_VERB_PATTERN.test(filePath);\n}\n\nexport function getMethodFromRouteFile(filePath: string): RouteFileMethod {\n  const match = filePath.match(ROUTE_VERB_PATTERN);\n  if (!match?.[1]) {\n    throw new Error(`Unable to parse HTTP method from route file: ${filePath}`);\n  }\n  return match[1].toUpperCase() as RouteFileMethod;\n}\n\nexport function isHttpVerb(method: string): method is HttpVerb {\n  return isHttpMethod(method);\n}\n\nexport function routePathWithoutVerb(routeRel: string): string {\n  return routeRel.replace(ROUTE_VERB_PATTERN, \"\");\n}\n\nexport function isLayoutFile(routeRel: string): boolean {\n  if (isRouteFile(routeRel)) {\n    return false;\n  }\n  const lastSlash = Math.max(routeRel.lastIndexOf(\"/\"), routeRel.lastIndexOf(\"\\\\\"));\n  const base = lastSlash === -1 ? routeRel : routeRel.slice(lastSlash + 1);\n  return base.endsWith(\".ts\");\n}\n\nexport type RouteFileKind = \"route\" | \"layout\";\n\nexport function classifyRouteFile(relativePath: string): RouteFileKind | null {\n  if (isRouteFile(relativePath)) return \"route\";\n  if (isLayoutFile(relativePath)) return \"layout\";\n  return null;\n}\n\nexport function splitSegments(pathStr: string): string[] {\n  const rawParts = pathStr.split(\"/\");\n  const segments: string[] = [];\n  for (let i = 0; i < rawParts.length; i++) {\n    const part = rawParts[i]!;\n    if (part === \"\") continue;\n    if (part.indexOf(\".\") === -1) {\n      segments.push(part);\n      continue;\n    }\n    const subs = part.split(SPLIT_DOT_REGEX);\n    for (let j = 0; j < subs.length; j++) {\n      const sub = subs[j]!;\n      if (sub !== \"\") segments.push(sub);\n    }\n  }\n  return segments;\n}\n\nexport function normalizeRouteRel(routeRel: string): string {\n  const posix = toPosixPath(routeRel);\n  const isRoute = ROUTE_VERB_PATTERN.test(posix);\n  const withoutVerb = isRoute ? routePathWithoutVerb(posix) : posix.replace(/\\.ts$/, \"\");\n  const extension = isRoute ? posix.slice(withoutVerb.length) : \".ts\";\n\n  const segments = splitSegments(withoutVerb);\n  if (segments.length === 0) {\n    return isRoute ? `index${extension}` : \"index.ts\";\n  }\n\n  return `${segments.join(\"/\")}${extension}`;\n}\n\nexport function normalizeDynamicSegment(segment: string): string {\n  if (segment === \"$\") {\n    return \"*\";\n  }\n  if (segment.startsWith(\"$\")) {\n    return `:${segment.slice(1)}`;\n  }\n  return segment;\n}\n\nfunction segmentToUrlPart(segment: string): string | null {\n  const hasEscapedLeadingUnderscore =\n    segment.startsWith(\"[_]\") || (segment.startsWith(\"[_\") && segment.endsWith(\"]\"));\n  const hasEscapedTrailingUnderscore =\n    segment.endsWith(\"[_]\") || (segment.endsWith(\"_]\") && segment.startsWith(\"[\"));\n\n  if (!hasEscapedLeadingUnderscore && segment.startsWith(\"_\") && !segment.endsWith(\"_\")) {\n    return null;\n  }\n\n  let unwrapped = segment;\n  if (!hasEscapedTrailingUnderscore && segment.endsWith(\"_\") && segment.length > 1) {\n    unwrapped = segment.slice(0, -1);\n  }\n\n  unwrapped = unwrapped.replace(/\\[(.*?)\\]/g, \"$1\");\n  return normalizeDynamicSegment(unwrapped);\n}\n\nexport function buildUrlPath(routeRel: string): string {\n  const normalized = normalizeRouteRel(routeRel);\n  const withoutVerb = routePathWithoutVerb(normalized);\n  const parts = toPosixPath(withoutVerb).split(\"/\");\n  const urlSegments: string[] = [];\n\n  for (let index = 0; index < parts.length; index += 1) {\n    const part = parts[index]!;\n    const isLast = index === parts.length - 1;\n    const urlPart = segmentToUrlPart(part);\n\n    if (urlPart === null) {\n      continue;\n    }\n\n    const isEscapedIndex = part === \"[index]\";\n    if (isLast && urlPart === \"index\" && !isEscapedIndex) {\n      continue;\n    }\n\n    urlSegments.push(urlPart);\n  }\n\n  if (urlSegments.length === 0) {\n    return \"/\";\n  }\n\n  return `/${urlSegments.join(\"/\")}`;\n}\n\nexport function layoutIdFromPath(relativePath: string): string {\n  const withoutExt = relativePath.replace(/\\.ts$/, \"\");\n  const segments = splitSegments(toPosixPath(withoutExt));\n\n  if (segments.length === 0) {\n    return \"/index\";\n  }\n\n  const mapped = segments.map(normalizeDynamicSegment);\n  return `/${mapped.join(\"/\")}`;\n}\n\nconst pascalCache = new Map<string, string>();\n\nexport function segmentToPascal(segment: string): string {\n  const cached = pascalCache.get(segment);\n  if (cached !== undefined) {\n    return cached;\n  }\n  const clean = segment.replace(/\\[(.*?)\\]/g, \"$1\");\n  let result: string;\n  if (clean === \"index\") {\n    result = \"Index\";\n  } else if (clean === \"*\") {\n    result = \"Splat\";\n  } else if (clean.startsWith(\":\") || clean.startsWith(\"$\")) {\n    const paramName = clean.slice(1);\n    result = paramName === \"\" ? \"Param\" : paramName.charAt(0).toUpperCase() + paramName.slice(1);\n  } else if (clean.startsWith(\"_\")) {\n    result = clean.slice(1).charAt(0).toUpperCase() + clean.slice(2);\n  } else if (clean.endsWith(\"_\")) {\n    const base = clean.slice(0, -1);\n    result = base.charAt(0).toUpperCase() + base.slice(1);\n  } else {\n    const sanitized = clean.replace(/[^a-zA-Z0-9_]/g, \"\");\n    result = sanitized.charAt(0).toUpperCase() + sanitized.slice(1);\n  }\n  pascalCache.set(segment, result);\n  return result;\n}\n\nexport function layoutImportName(layoutId: string): string {\n  if (layoutId === \"/index\") {\n    return \"RootIndexLayoutImport\";\n  }\n  if (layoutId === \"/*\") {\n    return \"RootSplatLayoutImport\";\n  }\n  const cleanId = layoutId.startsWith(\"/\") ? layoutId.slice(1) : layoutId;\n  const parts = cleanId.split(\"/\");\n  const name = parts.map(segmentToPascal).join(\"\");\n  return `${name}LayoutImport`;\n}\n\nexport function routeImportName(routeRel: string, method: RouteFileMethod): string {\n  const withoutVerb = routePathWithoutVerb(routeRel);\n  const parts = toPosixPath(withoutVerb).split(\"/\");\n  const pathName = parts.map(segmentToPascal).join(\"\");\n  const methodPart = method.charAt(0) + method.slice(1).toLowerCase();\n\n  if (withoutVerb === \"index\") {\n    return `RootIndex${methodPart}RouteImport`;\n  }\n  return `${pathName}${methodPart}RouteImport`;\n}\n\nexport function toModuleImportPath(\n  routesImportPrefix: string,\n  routeRel: string,\n  extension: ExtensionOption = true,\n): string {\n  const withoutExtension = routeRel.replace(/\\.ts$/, \"\").replace(/^\\//, \"\");\n  const base = `${routesImportPrefix}/${withoutExtension}`;\n  const importExtension = resolveImportExtension(extension);\n  return importExtension ? `${base}${importExtension}` : base;\n}\n\nexport function importPathFromRouteRel(\n  routeRel: string,\n  routesImportPrefix: string,\n  extension: ExtensionOption = true,\n): string {\n  return toModuleImportPath(routesImportPrefix, routeRel, extension);\n}\n\nexport function layoutImportPathFromRouteRel(\n  routeRel: string,\n  routesImportPrefix: string,\n  extension: ExtensionOption = true,\n): string {\n  const withoutExtension = routeRel.replace(/\\.ts$/, \"\").replace(/^\\//, \"\");\n  return toModuleImportPath(routesImportPrefix, withoutExtension, extension);\n}\n\nfunction layoutDepth(layoutId: string): number {\n  if (layoutId === \"/*\") return 0;\n  if (layoutId === \"/index\") return 1;\n  const cleanId = layoutId.startsWith(\"/\") ? layoutId.slice(1) : layoutId;\n  if (cleanId.endsWith(\"/*\")) {\n    const prefix = cleanId.slice(0, -2);\n    return prefix === \"\" ? 0 : prefix.split(\"/\").length;\n  }\n  if (cleanId.endsWith(\"/index\")) {\n    return cleanId.split(\"/\").length + 0.5;\n  }\n  return cleanId.split(\"/\").length;\n}\n\nfunction segmentBase(segment: string): string {\n  return segment.endsWith(\"_\") && segment.length > 1 ? segment.slice(0, -1) : segment;\n}\n\nexport function layoutAppliesToRoute(layoutId: string, routeWithoutVerb: string): boolean {\n  if (layoutId === \"/*\") return true;\n\n  const routeSegments = splitSegments(toPosixPath(routeWithoutVerb));\n\n  if (layoutId === \"/index\") {\n    return (\n      routeSegments.length === 0 ||\n      (routeSegments.length === 1 && (routeSegments[0] === \"index\" || routeSegments[0] === \"\"))\n    );\n  }\n\n  const cleanLayout = layoutId.startsWith(\"/\") ? layoutId.slice(1) : layoutId;\n\n  if (cleanLayout.endsWith(\"/*\")) {\n    const prefix = cleanLayout.slice(0, -2);\n    if (prefix === \"\") return true;\n    const prefixSegments = prefix.split(\"/\");\n    if (routeSegments.length <= prefixSegments.length) return false;\n\n    for (let i = 0; i < prefixSegments.length; i += 1) {\n      const pSeg = prefixSegments[i]!;\n      const rSeg = routeSegments[i]!;\n      if (pSeg.startsWith(\":\") || pSeg.startsWith(\"$\")) continue;\n      if (segmentBase(pSeg) !== segmentBase(rSeg)) return false;\n    }\n    return true;\n  }\n\n  if (cleanLayout.endsWith(\"/index\")) {\n    const layoutWithoutIndex = cleanLayout.slice(0, -\"/index\".length);\n    const joinedRoute = routeSegments.join(\"/\");\n    return joinedRoute === cleanLayout || joinedRoute === layoutWithoutIndex;\n  }\n\n  const layoutSegments = cleanLayout.split(\"/\");\n  if (routeSegments.length < layoutSegments.length) {\n    return false;\n  }\n\n  for (let i = 0; i < layoutSegments.length; i += 1) {\n    const lSeg = layoutSegments[i]!;\n    const rSeg = routeSegments[i]!;\n    const lBase = segmentBase(lSeg).replace(/^[:$]/, \"\");\n    const rBase = segmentBase(rSeg).replace(/^[:$]/, \"\");\n\n    if (rSeg.endsWith(\"_\") && rSeg.length > 1 && !lSeg.endsWith(\"_\")) {\n      if (i === layoutSegments.length - 1 && rBase === lBase) {\n        return false;\n      }\n    }\n\n    if (lSeg.startsWith(\":\") || lSeg.startsWith(\"$\")) {\n      continue;\n    }\n\n    if (lBase !== rBase) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nexport function routeLayoutChain(routeWithoutVerb: string, layouts: LayoutFile[]): string[] {\n  return layouts\n    .filter((layout) => layoutAppliesToRoute(layout.id, routeWithoutVerb))\n    .sort((left, right) => layoutDepth(left.id) - layoutDepth(right.id))\n    .map((layout) => layout.id);\n}\n\nexport function layoutParentId(layoutId: string, layoutIds: Set<string>): string | null {\n  if (layoutId === \"/*\") return null;\n\n  const rootId = layoutIds.has(\"/*\") ? \"/*\" : null;\n  if (layoutId === \"/index\") return rootId;\n\n  const clean = layoutId.startsWith(\"/\") ? layoutId.slice(1) : layoutId;\n  const segments = clean.split(\"/\");\n  const isWildcard = segments[segments.length - 1] === \"*\";\n  const startDepth = segments.length - 1;\n\n  for (let i = startDepth; i >= 1; i -= 1) {\n    const prefix = `/${segments.slice(0, i).join(\"/\")}`;\n\n    if (!isWildcard || i < segments.length - 1) {\n      if (layoutIds.has(`${prefix}/*`)) return `${prefix}/*`;\n    }\n\n    if (layoutIds.has(prefix)) return prefix;\n    if (layoutIds.has(`${prefix}/index`)) return `${prefix}/index`;\n  }\n\n  return rootId;\n}\n"],"mappings":"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"}