{"version":3,"sources":["../src/route-call-scanner.ts","../src/routes-shared.ts"],"sourcesContent":["/**\n * Tokenizer-aware extractor for programmatic route path literals.\n *\n * `page(\"/…\")` / `createRoute(\"/…\")` declarations are discovered by scanning raw source\n * files. A naive regex over the raw source matches the same call shape inside comments,\n * string literals, regex literals, and member-access calls (e.g. `pager.page(\"/x\")`),\n * which can feed non-call text through `normalizeProgrammaticRoutePath` (crashing the\n * type-generation step) or silently widen the generated route unions with phantom paths.\n *\n * This module walks the source with a tiny lexer that classifies every code region\n * (skipping comments, string literals, template literals, and regex literals) and only\n * collects string-literal first arguments of real `page(…)` / `createRoute(…)` call\n * expressions. The previous significant token is tracked so member-access calls are\n * excluded and `/` is disambiguated as a regex literal versus a division operator.\n *\n * Static template-literal arguments (`` page(`/products/list`, …) `` with no `${…}`)\n * are preserved; dynamic templates are excluded.\n */\n\nexport function extractProgrammaticPageCallPathLiterals(source: string): string[] {\n  const results = new Set<string>();\n  const length = source.length;\n  let cursor = 0;\n  const controlParentheses: boolean[] = [];\n  let nextParenthesisIsControl = false;\n\n  type PrevKind =\n    | \"none\"\n    | \"identifier\"\n    | \"keyword\"\n    | \"value\" // string, template, regex, number, or value keyword\n    | \"dot\" // `.` member access\n    | \"questionDot\" // `?.` optional member access\n    | \"spread\" // `...`\n    | \"open\" // `(`, `[`, `{`\n    | \"close\" // `)`, `]`, `}`\n    | \"operator\"; // anything else that may begin an expression\n  let prev: PrevKind = \"none\";\n\n  const isWhitespace = (char: string): boolean =>\n    char === \" \" ||\n    char === \"\\t\" ||\n    char === \"\\n\" ||\n    char === \"\\r\" ||\n    char === \"\\f\" ||\n    char === \"\\v\";\n  const isIdentifierStart = (char: string): boolean => /[A-Za-z_$]/.test(char);\n  const isIdentifierPart = (char: string): boolean => /[A-Za-z0-9_$]/.test(char);\n  const isDigit = (char: string): boolean => char >= \"0\" && char <= \"9\";\n\n  // Keywords that are followed by an expression (regex literals may follow).\n  const EXPRESSION_KEYWORDS = new Set([\n    \"return\",\n    \"typeof\",\n    \"delete\",\n    \"void\",\n    \"new\",\n    \"throw\",\n    \"instanceof\",\n    \"in\",\n    \"of\",\n    \"await\",\n    \"yield\",\n    \"else\",\n    \"do\",\n    \"case\",\n  ]);\n  // Identifier-like keywords that denote a value (division follows).\n  const VALUE_KEYWORDS = new Set([\"true\", \"false\", \"null\", \"this\", \"super\", \"undefined\"]);\n  const CONTROL_PAREN_KEYWORDS = new Set([\"if\", \"for\", \"while\", \"switch\", \"with\", \"catch\"]);\n\n  const REGEX_CONTEXT: ReadonlySet<PrevKind> = new Set([\n    \"none\",\n    \"open\",\n    \"operator\",\n    \"keyword\",\n    \"spread\",\n  ]);\n\n  function readIdentifier(start: number): { end: number; text: string } {\n    let end = start;\n    while (end < length && isIdentifierPart(source[end])) end++;\n    return { end, text: source.slice(start, end) };\n  }\n\n  function readStringLiteral(\n    start: number,\n    quote: string,\n  ): { end: number; content: string } | null {\n    let end = start + 1;\n    while (end < length) {\n      const char = source[end];\n      if (char === \"\\\\\") {\n        end += 2;\n        continue;\n      }\n      if (char === quote) {\n        return { end: end + 1, content: source.slice(start + 1, end) };\n      }\n      end++;\n    }\n    return null;\n  }\n\n  function readTemplateLiteral(start: number): {\n    end: number;\n    content: string;\n    dynamic: boolean;\n  } | null {\n    let end = start + 1;\n    let dynamic = false;\n    while (end < length) {\n      const char = source[end];\n      if (char === \"\\\\\") {\n        end += 2;\n        continue;\n      }\n      if (char === \"`\") {\n        return { end: end + 1, content: source.slice(start + 1, end), dynamic };\n      }\n      if (char === \"$\" && source[end + 1] === \"{\") {\n        dynamic = true;\n        const after = skipTemplateInterpolation(end + 2);\n        if (after === -1) return null;\n        end = after;\n        continue;\n      }\n      end++;\n    }\n    return null;\n  }\n\n  function skipTemplateInterpolation(start: number): number {\n    let end = start;\n    let depth = 1;\n    while (end < length && depth > 0) {\n      const char = source[end];\n      if (char === \"\\\\\") {\n        end += 2;\n        continue;\n      }\n      if (char === \"{\") {\n        depth++;\n        end++;\n        continue;\n      }\n      if (char === \"}\") {\n        depth--;\n        end++;\n        continue;\n      }\n      if (char === '\"' || char === \"'\") {\n        const result = readStringLiteral(end, char);\n        if (!result) return -1;\n        end = result.end;\n        continue;\n      }\n      if (char === \"`\") {\n        const result = readTemplateLiteral(end);\n        if (!result) return -1;\n        end = result.end;\n        continue;\n      }\n      end++;\n    }\n    return depth === 0 ? end : -1;\n  }\n\n  function readRegexLiteral(start: number): number | null {\n    let end = start + 1;\n    let inClass = false;\n    while (end < length) {\n      const char = source[end];\n      if (char === \"\\\\\") {\n        end += 2;\n        continue;\n      }\n      if (char === \"[\") {\n        inClass = true;\n        end++;\n        continue;\n      }\n      if (char === \"]\") {\n        inClass = false;\n        end++;\n        continue;\n      }\n      if (char === \"/\" && !inClass) {\n        end++;\n        while (end < length && source[end] >= \"a\" && source[end] <= \"z\") end++;\n        return end;\n      }\n      if (char === \"\\n\") return null;\n      end++;\n    }\n    return null;\n  }\n\n  function skipLineComment(start: number): number {\n    let end = start + 2;\n    while (end < length && source[end] !== \"\\n\") end++;\n    return end;\n  }\n\n  function skipBlockComment(start: number): number {\n    let end = start + 2;\n    while (end < length) {\n      if (source[end] === \"*\" && source[end + 1] === \"/\") return end + 2;\n      end++;\n    }\n    return end;\n  }\n\n  function readNumber(start: number): number {\n    const first = source[start];\n    let end = start;\n    if (first === \"0\") {\n      const prefix = source[start + 1];\n      if (\n        prefix === \"x\" ||\n        prefix === \"X\" ||\n        prefix === \"o\" ||\n        prefix === \"O\" ||\n        prefix === \"b\" ||\n        prefix === \"B\"\n      ) {\n        end = start + 2;\n        while (end < length && /[0-9a-fA-F_]/.test(source[end])) end++;\n        if (source[end] === \"n\") end++;\n        return end;\n      }\n    }\n    while (end < length && (isDigit(source[end]) || source[end] === \"_\")) end++;\n    if (source[end] === \".\") {\n      end++;\n      while (end < length && (isDigit(source[end]) || source[end] === \"_\")) end++;\n    }\n    if (source[end] === \"e\" || source[end] === \"E\") {\n      end++;\n      if (source[end] === \"+\" || source[end] === \"-\") end++;\n      while (end < length && (isDigit(source[end]) || source[end] === \"_\")) end++;\n    }\n    if (source[end] === \"n\") end++;\n    return end;\n  }\n\n  function classifyWord(text: string): PrevKind {\n    if (VALUE_KEYWORDS.has(text)) return \"value\";\n    if (EXPRESSION_KEYWORDS.has(text)) return \"keyword\";\n    return \"identifier\";\n  }\n\n  while (cursor < length) {\n    const char = source[cursor];\n\n    if (isWhitespace(char)) {\n      cursor++;\n      continue;\n    }\n\n    if (char === \"/\" && source[cursor + 1] === \"/\") {\n      cursor = skipLineComment(cursor);\n      continue;\n    }\n    if (char === \"/\" && source[cursor + 1] === \"*\") {\n      cursor = skipBlockComment(cursor);\n      continue;\n    }\n\n    if (char === '\"' || char === \"'\") {\n      const result = readStringLiteral(cursor, char);\n      prev = \"value\";\n      nextParenthesisIsControl = false;\n      cursor = result ? result.end : length;\n      continue;\n    }\n\n    if (char === \"`\") {\n      const result = readTemplateLiteral(cursor);\n      prev = \"value\";\n      nextParenthesisIsControl = false;\n      cursor = result ? result.end : length;\n      continue;\n    }\n\n    if (char === \"/\" && REGEX_CONTEXT.has(prev)) {\n      const end = readRegexLiteral(cursor);\n      if (end !== null) {\n        prev = \"value\";\n        nextParenthesisIsControl = false;\n        cursor = end;\n        continue;\n      }\n      // Not a regex literal: fall through to operator handling.\n    }\n\n    if (isIdentifierStart(char)) {\n      const { end: idEnd, text } = readIdentifier(cursor);\n      const isMemberAccess = prev === \"dot\" || prev === \"questionDot\";\n\n      let next = idEnd;\n      while (next < length && isWhitespace(source[next])) next++;\n\n      if (!isMemberAccess && (text === \"page\" || text === \"createRoute\") && source[next] === \"(\") {\n        let argStart = next + 1;\n        while (argStart < length && isWhitespace(source[argStart])) argStart++;\n        const quote = source[argStart];\n\n        if (quote === '\"' || quote === \"'\") {\n          const arg = readStringLiteral(argStart, quote);\n          if (arg) {\n            results.add(arg.content);\n            prev = \"value\";\n            nextParenthesisIsControl = false;\n            cursor = arg.end;\n            continue;\n          }\n        } else if (quote === \"`\") {\n          const arg = readTemplateLiteral(argStart);\n          if (arg) {\n            if (!arg.dynamic) results.add(arg.content);\n            prev = \"value\";\n            nextParenthesisIsControl = false;\n            cursor = arg.end;\n            continue;\n          }\n        }\n      }\n\n      prev = classifyWord(text);\n      nextParenthesisIsControl = CONTROL_PAREN_KEYWORDS.has(text);\n      cursor = idEnd;\n      continue;\n    }\n\n    if (isDigit(char) || (char === \".\" && isDigit(source[cursor + 1] || \"\"))) {\n      prev = \"value\";\n      nextParenthesisIsControl = false;\n      cursor = readNumber(cursor);\n      continue;\n    }\n\n    if (char === \"?\" && source[cursor + 1] === \".\") {\n      prev = \"questionDot\";\n      nextParenthesisIsControl = false;\n      cursor += 2;\n      continue;\n    }\n    if (char === \".\" && source[cursor + 1] === \".\" && source[cursor + 2] === \".\") {\n      prev = \"spread\";\n      nextParenthesisIsControl = false;\n      cursor += 3;\n      continue;\n    }\n    if (char === \".\" && source[cursor + 1] === \".\") {\n      prev = \"operator\";\n      nextParenthesisIsControl = false;\n      cursor += 2;\n      continue;\n    }\n    if (char === \".\") {\n      prev = \"dot\";\n      nextParenthesisIsControl = false;\n      cursor += 1;\n      continue;\n    }\n\n    if (char === \"(\") {\n      controlParentheses.push(nextParenthesisIsControl);\n      nextParenthesisIsControl = false;\n      prev = \"open\";\n      cursor++;\n      continue;\n    }\n    if (char === \"[\" || char === \"{\") {\n      nextParenthesisIsControl = false;\n      prev = \"open\";\n      cursor++;\n      continue;\n    }\n    if (char === \")\") {\n      // A regex literal may begin an expression statement immediately after a\n      // control-flow condition (`if (ready) /.../.test(value)`). A plain\n      // \"close\" token would misread that slash as division and then discover\n      // phantom page() calls inside the regex body.\n      prev = controlParentheses.pop() ? \"keyword\" : \"close\";\n      nextParenthesisIsControl = false;\n      cursor++;\n      continue;\n    }\n    if (char === \"]\" || char === \"}\") {\n      prev = \"close\";\n      nextParenthesisIsControl = false;\n      cursor++;\n      continue;\n    }\n\n    prev = \"operator\";\n    nextParenthesisIsControl = false;\n    cursor++;\n  }\n\n  return results.size > 0 ? Array.from(results) : [];\n}\n","import type { ParsedRoute } from \"./types\";\nimport {\n  assertBrowserStableRoutePath,\n  assertTerminalCatchAll,\n  assertUniqueRouteParameters,\n} from \"./routing/specificity\";\nimport { extractProgrammaticPageCallPathLiterals } from \"./route-call-scanner\";\n\nexport const PROGRAMMATIC_ROUTE_FILE_NAMES = [\n  \"farm.route.ts\",\n  \"farm.route.tsx\",\n  \"farm.route.js\",\n  \"farm.route.jsx\",\n  \"farm.routes.ts\",\n  \"farm.routes.tsx\",\n  \"farm.routes.js\",\n  \"farm.routes.jsx\",\n  \"routes.ts\",\n  \"routes.tsx\",\n  \"routes.js\",\n  \"routes.jsx\",\n] as const;\n\nexport interface ProgrammaticRouteSearchClientOptions {\n  stripDefaults?: boolean | readonly string[];\n  preserve?: readonly string[];\n  temporary?: readonly string[];\n}\n\ntype ProgrammaticRouteSearchLike =\n  | { parse(value: unknown): unknown }\n  | ({\n      schema?: { parse(value: unknown): unknown };\n    } & ProgrammaticRouteSearchClientOptions);\n\nexport function getProgrammaticRouteSearchClientOptions(\n  search: ProgrammaticRouteSearchLike | undefined,\n): ProgrammaticRouteSearchClientOptions | undefined {\n  if (!search || \"parse\" in search) return undefined;\n\n  const options: ProgrammaticRouteSearchClientOptions = {};\n  if (typeof search.stripDefaults !== \"undefined\") options.stripDefaults = search.stripDefaults;\n  if (search.preserve?.length) options.preserve = [...search.preserve];\n  if (search.temporary?.length) options.temporary = [...search.temporary];\n\n  return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function isProgrammaticRoutesFileName(fileName: string): boolean {\n  const normalized = fileName.replace(/\\\\/g, \"/\");\n  const baseName = normalized.split(\"/\").pop() || normalized;\n  return PROGRAMMATIC_ROUTE_FILE_NAMES.includes(\n    baseName as (typeof PROGRAMMATIC_ROUTE_FILE_NAMES)[number],\n  );\n}\n\nexport function createProgrammaticRouteModuleId(\n  filePath: string,\n  kind: \"page\" | \"layout\" | \"api\",\n  routePath: string,\n): string {\n  return `${filePath}?farm-route=${kind}:${encodeURIComponent(normalizeProgrammaticRoutePath(routePath))}`;\n}\n\nexport function parseProgrammaticRouteModuleId(moduleId: string): {\n  filePath: string;\n  kind: \"page\" | \"layout\" | \"api\";\n  routePath: string;\n} | null {\n  const queryIndex = moduleId.indexOf(\"?\");\n  if (queryIndex === -1) return null;\n\n  const filePath = moduleId.slice(0, queryIndex);\n  const params = new URLSearchParams(moduleId.slice(queryIndex + 1));\n  const value = params.get(\"farm-route\");\n  if (!value) return null;\n\n  const separator = value.indexOf(\":\");\n  if (separator === -1) return null;\n\n  const kind = value.slice(0, separator);\n  if (kind !== \"page\" && kind !== \"layout\" && kind !== \"api\") return null;\n\n  return {\n    filePath,\n    kind,\n    routePath: normalizeProgrammaticRoutePath(value.slice(separator + 1)),\n  };\n}\n\nexport function parseProgrammaticRoutePath(\n  routePath: string,\n  type: ParsedRoute[\"type\"] = \"page\",\n): ParsedRoute {\n  const fileName = type === \"layout\" ? \"layout.tsx\" : \"page.tsx\";\n  const normalized = normalizeProgrammaticRoutePath(routePath);\n  assertTerminalCatchAll(normalized);\n  assertUniqueRouteParameters(normalized);\n  const filePath =\n    normalized === \"/\" ? fileName : `${normalized.slice(1).replace(/\\/+$/, \"\")}/${fileName}`;\n\n  return {\n    filePath,\n    segments: normalized\n      .split(\"/\")\n      .filter(Boolean)\n      .filter((segment) => !(segment.startsWith(\"(\") && segment.endsWith(\")\")))\n      .map(parseRouteSegment),\n    type,\n  };\n}\n\nexport function scanProgrammaticPagePaths(source: string): string[] {\n  const paths = new Set<string>();\n\n  for (const routePath of extractProgrammaticPageCallPathLiterals(source)) {\n    paths.add(normalizeProgrammaticRoutePath(routePath));\n  }\n\n  return Array.from(paths);\n}\n\nexport function normalizeProgrammaticRoutePath(routePath: string): string {\n  if (routePath.includes(\"?\") || routePath.includes(\"#\")) {\n    throw new TypeError(\n      `Programmatic route path \"${routePath}\" must be a pathname without a query string or hash.`,\n    );\n  }\n  const withSlash = routePath.startsWith(\"/\") ? routePath : `/${routePath}`;\n  const withoutTrailing = withSlash.length > 1 ? withSlash.replace(/\\/+$/, \"\") : withSlash;\n  assertBrowserStableRoutePath(withoutTrailing);\n  return withoutTrailing || \"/\";\n}\n\nfunction parseRouteSegment(segment: string): ParsedRoute[\"segments\"][number] {\n  if (segment.startsWith(\"[\") && segment.endsWith(\"]\")) {\n    let name = segment.slice(1, -1);\n    let isOptional = false;\n    let isCatchAll = false;\n\n    if (name.startsWith(\"[\") && name.endsWith(\"]\")) {\n      isOptional = true;\n      name = name.slice(1, -1);\n    }\n\n    if (name.startsWith(\"...\")) {\n      isCatchAll = true;\n      name = name.slice(3);\n    }\n\n    return { segment: name, isDynamic: true, isOptional, isCatchAll };\n  }\n\n  return { segment, isDynamic: false, isOptional: false, isCatchAll: false };\n}\n"],"mappings":"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","names":[]}