vinext 0.0.7 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * vinext deploy — one-command Cloudflare Workers deployment.\n *\n * Takes any Next.js app and deploys it to Cloudflare Workers:\n *\n * 1. Detects App Router vs Pages Router\n * 2. Auto-generates missing config files (wrangler.jsonc, worker/index.ts, vite.config.ts)\n * 3. Ensures dependencies are installed (@cloudflare/vite-plugin, wrangler, @vitejs/plugin-rsc)\n * 4. Runs the Vite build\n * 5. Deploys to Cloudflare Workers via wrangler\n *\n * Design: Everything is auto-generated into a `.vinext/` directory (not the\n * project root) to avoid cluttering the user's project. If the user already\n * has these files, we use theirs.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createRequire } from \"node:module\";\nimport { execFileSync, execSync, type ExecSyncOptions } from \"node:child_process\";\nimport { parseArgs as nodeParseArgs } from \"node:util\";\nimport { createBuilder, build } from \"vite\";\nimport {\n ensureESModule as _ensureESModule,\n renameCJSConfigs as _renameCJSConfigs,\n detectPackageManager as _detectPackageManager,\n} from \"./utils/project.js\";\nimport { getReactUpgradeDeps } from \"./init.js\";\nimport { runTPR } from \"./cloudflare/tpr.js\";\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface DeployOptions {\n /** Project root directory */\n root: string;\n /** Deploy to preview environment (default: production) */\n preview?: boolean;\n /** Wrangler environment name from wrangler.jsonc env.<name> */\n env?: string;\n /** Custom project name for the Worker */\n name?: string;\n /** Skip the build step (assume already built) */\n skipBuild?: boolean;\n /** Dry run — generate config files but don't build or deploy */\n dryRun?: boolean;\n /** Enable experimental TPR (Traffic-aware Pre-Rendering) */\n experimentalTPR?: boolean;\n /** TPR: traffic coverage percentage target (0–100, default: 90) */\n tprCoverage?: number;\n /** TPR: hard cap on number of pages to pre-render (default: 1000) */\n tprLimit?: number;\n /** TPR: analytics lookback window in hours (default: 24) */\n tprWindow?: number;\n}\n\n// ─── CLI arg parsing (uses Node.js util.parseArgs) ──────────────────────────\n\n/** Deploy command flag definitions for util.parseArgs. */\nconst deployArgOptions = {\n help: { type: \"boolean\", short: \"h\", default: false },\n preview: { type: \"boolean\", default: false },\n env: { type: \"string\" },\n name: { type: \"string\" },\n \"skip-build\": { type: \"boolean\", default: false },\n \"dry-run\": { type: \"boolean\", default: false },\n \"experimental-tpr\": { type: \"boolean\", default: false },\n \"tpr-coverage\": { type: \"string\" },\n \"tpr-limit\": { type: \"string\" },\n \"tpr-window\": { type: \"string\" },\n} as const;\n\nexport function parseDeployArgs(args: string[]) {\n const { values } = nodeParseArgs({ args, options: deployArgOptions, strict: true });\n return {\n help: values.help,\n preview: values.preview,\n env: values.env?.trim() || undefined,\n name: values.name?.trim() || undefined,\n skipBuild: values[\"skip-build\"],\n dryRun: values[\"dry-run\"],\n experimentalTPR: values[\"experimental-tpr\"],\n tprCoverage: values[\"tpr-coverage\"] ? parseInt(values[\"tpr-coverage\"], 10) : undefined,\n tprLimit: values[\"tpr-limit\"] ? parseInt(values[\"tpr-limit\"], 10) : undefined,\n tprWindow: values[\"tpr-window\"] ? parseInt(values[\"tpr-window\"], 10) : undefined,\n };\n}\n\n// ─── Project Detection ──────────────────────────────────────────────────────\n\ninterface ProjectInfo {\n root: string;\n isAppRouter: boolean;\n isPagesRouter: boolean;\n hasViteConfig: boolean;\n hasWranglerConfig: boolean;\n hasWorkerEntry: boolean;\n hasCloudflarePlugin: boolean;\n hasRscPlugin: boolean;\n hasWrangler: boolean;\n projectName: string;\n /** Pages that use `revalidate` (ISR) */\n hasISR: boolean;\n /** package.json has \"type\": \"module\" */\n hasTypeModule: boolean;\n /** .mdx files detected in app/ or pages/ */\n hasMDX: boolean;\n /** CodeHike is a dependency */\n hasCodeHike: boolean;\n /** Native Node modules that need stubbing for Workers */\n nativeModulesToStub: string[];\n}\n\n// ─── Detection ───────────────────────────────────────────────────────────────\n\nexport function detectProject(root: string): ProjectInfo {\n const hasApp =\n fs.existsSync(path.join(root, \"app\")) ||\n fs.existsSync(path.join(root, \"src\", \"app\"));\n const hasPages =\n fs.existsSync(path.join(root, \"pages\")) ||\n fs.existsSync(path.join(root, \"src\", \"pages\"));\n\n // Prefer App Router if both exist\n const isAppRouter = hasApp;\n const isPagesRouter = !hasApp && hasPages;\n\n const hasViteConfig =\n fs.existsSync(path.join(root, \"vite.config.ts\")) ||\n fs.existsSync(path.join(root, \"vite.config.js\")) ||\n fs.existsSync(path.join(root, \"vite.config.mjs\"));\n\n const hasWranglerConfig =\n fs.existsSync(path.join(root, \"wrangler.jsonc\")) ||\n fs.existsSync(path.join(root, \"wrangler.json\")) ||\n fs.existsSync(path.join(root, \"wrangler.toml\"));\n\n const hasWorkerEntry =\n fs.existsSync(path.join(root, \"worker\", \"index.ts\")) ||\n fs.existsSync(path.join(root, \"worker\", \"index.js\"));\n\n // Check node_modules for installed packages\n const hasCloudflarePlugin = fs.existsSync(\n path.join(root, \"node_modules\", \"@cloudflare\", \"vite-plugin\"),\n );\n const hasRscPlugin = fs.existsSync(\n path.join(root, \"node_modules\", \"@vitejs\", \"plugin-rsc\"),\n );\n const hasWrangler = fs.existsSync(\n path.join(root, \"node_modules\", \".bin\", \"wrangler\"),\n );\n\n // Derive project name from package.json or directory name\n let projectName = path.basename(root);\n const pkgPath = path.join(root, \"package.json\");\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n if (pkg.name) {\n // Sanitize: Workers names must be lowercase alphanumeric + hyphens\n projectName = pkg.name\n .replace(/^@[^/]+\\//, \"\") // strip npm scope\n .replace(/[^a-z0-9-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n }\n } catch {\n // ignore parse errors\n }\n }\n\n // Detect ISR usage (rough heuristic: search for `revalidate` exports)\n const hasISR = detectISR(root, isAppRouter);\n\n // Detect \"type\": \"module\" in package.json\n let hasTypeModule = false;\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n hasTypeModule = pkg.type === \"module\";\n } catch {\n // ignore\n }\n }\n\n // Detect MDX usage\n const hasMDX = detectMDX(root, isAppRouter, hasPages);\n\n // Detect CodeHike dependency\n let hasCodeHike = false;\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n hasCodeHike = \"codehike\" in allDeps;\n } catch {\n // ignore\n }\n }\n\n // Detect native Node modules that need stubbing for Workers\n const nativeModulesToStub = detectNativeModules(root);\n\n return {\n root,\n isAppRouter,\n isPagesRouter,\n hasViteConfig,\n hasWranglerConfig,\n hasWorkerEntry,\n hasCloudflarePlugin,\n hasRscPlugin,\n hasWrangler,\n projectName,\n hasISR,\n hasTypeModule,\n hasMDX,\n hasCodeHike,\n nativeModulesToStub,\n };\n}\n\nfunction detectISR(root: string, isAppRouter: boolean): boolean {\n if (!isAppRouter) return false;\n try {\n // Check root-level app/ first, then fall back to src/app/\n let appDir = path.join(root, \"app\");\n if (!fs.existsSync(appDir)) {\n appDir = path.join(root, \"src\", \"app\");\n }\n if (!fs.existsSync(appDir)) return false;\n // Quick check: search .ts/.tsx files in app/ for `export const revalidate`\n return scanDirForPattern(appDir, /export\\s+const\\s+revalidate\\s*=/);\n } catch {\n return false;\n }\n}\n\nfunction scanDirForPattern(dir: string, pattern: RegExp): boolean {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory() && !entry.name.startsWith(\".\") && entry.name !== \"node_modules\") {\n if (scanDirForPattern(fullPath, pattern)) return true;\n } else if (entry.isFile() && /\\.(ts|tsx|js|jsx)$/.test(entry.name)) {\n try {\n const content = fs.readFileSync(fullPath, \"utf-8\");\n if (pattern.test(content)) return true;\n } catch {\n // skip unreadable files\n }\n }\n }\n return false;\n}\n\n/**\n * Detect .mdx files in the project's app/ or pages/ directory,\n * or `pageExtensions` including \"mdx\" in next.config.\n */\nfunction detectMDX(root: string, isAppRouter: boolean, hasPages: boolean): boolean {\n // Check next.config for pageExtensions with mdx\n const configFiles = [\"next.config.ts\", \"next.config.mjs\", \"next.config.js\", \"next.config.cjs\"];\n for (const f of configFiles) {\n const p = path.join(root, f);\n if (fs.existsSync(p)) {\n try {\n const content = fs.readFileSync(p, \"utf-8\");\n if (/pageExtensions.*mdx/i.test(content) || /@next\\/mdx/.test(content)) return true;\n } catch {\n // ignore\n }\n }\n }\n\n // Check for .mdx files in app/ or pages/ (with src/ fallback)\n const dirs: string[] = [];\n if (isAppRouter) {\n const appDir = fs.existsSync(path.join(root, \"app\"))\n ? path.join(root, \"app\")\n : path.join(root, \"src\", \"app\");\n dirs.push(appDir);\n }\n if (hasPages) {\n const pagesDir = fs.existsSync(path.join(root, \"pages\"))\n ? path.join(root, \"pages\")\n : path.join(root, \"src\", \"pages\");\n dirs.push(pagesDir);\n }\n\n for (const dir of dirs) {\n if (fs.existsSync(dir) && scanDirForExtension(dir, \".mdx\")) return true;\n }\n\n return false;\n}\n\nfunction scanDirForExtension(dir: string, ext: string): boolean {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory() && !entry.name.startsWith(\".\") && entry.name !== \"node_modules\") {\n if (scanDirForExtension(fullPath, ext)) return true;\n } else if (entry.isFile() && entry.name.endsWith(ext)) {\n return true;\n }\n }\n return false;\n}\n\n/** Known native Node modules that can't run in Workers */\nconst NATIVE_MODULES_TO_STUB = [\n \"@resvg/resvg-js\",\n \"satori\",\n \"lightningcss\",\n \"@napi-rs/canvas\",\n \"sharp\",\n];\n\n/**\n * Detect native Node modules in dependencies that need stubbing for Workers.\n */\nfunction detectNativeModules(root: string): string[] {\n const pkgPath = path.join(root, \"package.json\");\n if (!fs.existsSync(pkgPath)) return [];\n\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n return NATIVE_MODULES_TO_STUB.filter((mod) => mod in allDeps);\n } catch {\n return [];\n }\n}\n\n// ─── Project Preparation (pre-build transforms) ─────────────────────────────\n//\n// These are delegated to shared utilities in ./utils/project.ts so they can\n// be reused by both `vinext deploy` and `vinext init`.\n\n/** @see {@link _ensureESModule} */\nexport const ensureESModule = _ensureESModule;\n\n/** @see {@link _renameCJSConfigs} */\nexport const renameCJSConfigs = _renameCJSConfigs;\n\n// ─── File Generation ─────────────────────────────────────────────────────────\n\n/** Generate wrangler.jsonc content */\nexport function generateWranglerConfig(info: ProjectInfo): string {\n const today = new Date().toISOString().split(\"T\")[0];\n\n const config: Record<string, unknown> = {\n $schema: \"node_modules/wrangler/config-schema.json\",\n name: info.projectName,\n compatibility_date: today,\n compatibility_flags: [\"nodejs_compat\"],\n main: \"./worker/index.ts\",\n assets: {\n not_found_handling: \"none\",\n // Expose static assets to the Worker via env.ASSETS so the image\n // optimization handler can fetch source images programmatically.\n binding: \"ASSETS\",\n },\n // Cloudflare Images binding for next/image optimization.\n // Enables resize, format negotiation (AVIF/WebP), and quality transforms\n // at the edge. No user setup needed — wrangler creates the binding automatically.\n images: {\n binding: \"IMAGES\",\n },\n };\n\n if (info.hasISR) {\n config.kv_namespaces = [\n {\n binding: \"VINEXT_CACHE\",\n id: \"<your-kv-namespace-id>\",\n },\n ];\n }\n\n return JSON.stringify(config, null, 2) + \"\\n\";\n}\n\n/** Generate worker/index.ts for App Router */\nexport function generateAppRouterWorkerEntry(): string {\n return `/**\n * Cloudflare Worker entry point — auto-generated by vinext deploy.\n * Edit freely or delete to regenerate on next deploy.\n *\n * For apps without image optimization, you can use vinext/server/app-router-entry\n * directly in wrangler.jsonc: \"main\": \"vinext/server/app-router-entry\"\n */\nimport { handleImageOptimization } from \"vinext/server/image-optimization\";\nimport handler from \"vinext/server/app-router-entry\";\n\ninterface Env {\n ASSETS: Fetcher;\n IMAGES: {\n input(stream: ReadableStream): {\n transform(options: Record<string, unknown>): {\n output(options: { format: string; quality: number }): Promise<{ response(): Response }>;\n };\n };\n };\n}\n\nexport default {\n async fetch(request: Request, env: Env): Promise<Response> {\n const url = new URL(request.url);\n\n // Image optimization via Cloudflare Images binding\n if (url.pathname === \"/_vinext/image\") {\n return handleImageOptimization(request, {\n fetchAsset: (path) => env.ASSETS.fetch(new Request(new URL(path, request.url))),\n transformImage: async (body, { width, format, quality }) => {\n const result = await env.IMAGES.input(body).transform(width > 0 ? { width } : {}).output({ format, quality });\n return result.response();\n },\n });\n }\n\n // Delegate everything else to vinext\n return handler.fetch(request);\n },\n};\n`;\n}\n\n/** Generate worker/index.ts for Pages Router */\nexport function generatePagesRouterWorkerEntry(): string {\n return `/**\n * Cloudflare Worker entry point — auto-generated by vinext deploy.\n * Edit freely or delete to regenerate on next deploy.\n */\nimport { handleImageOptimization } from \"vinext/server/image-optimization\";\n\n// @ts-expect-error — virtual module resolved by vinext at build time\nimport { renderPage, handleApiRoute } from \"virtual:vinext-server-entry\";\n\ninterface Env {\n ASSETS: Fetcher;\n IMAGES: {\n input(stream: ReadableStream): {\n transform(options: Record<string, unknown>): {\n output(options: { format: string; quality: number }): Promise<{ response(): Response }>;\n };\n };\n };\n}\n\nexport default {\n async fetch(request: Request, env: Env): Promise<Response> {\n try {\n const url = new URL(request.url);\n const pathname = url.pathname;\n const urlWithQuery = pathname + url.search;\n\n // Block protocol-relative URL open redirect attacks (//evil.com/).\n if (pathname.startsWith(\"//\")) {\n return new Response(\"404 Not Found\", { status: 404 });\n }\n\n // ── Image optimization via Cloudflare Images binding ──────────\n if (pathname === \"/_vinext/image\") {\n return handleImageOptimization(request, {\n fetchAsset: (path) => env.ASSETS.fetch(new Request(new URL(path, request.url))),\n transformImage: async (body, { width, format, quality }) => {\n const result = await env.IMAGES.input(body).transform(width > 0 ? { width } : {}).output({ format, quality });\n return result.response();\n },\n });\n }\n\n // API routes\n if (pathname.startsWith(\"/api/\") || pathname === \"/api\") {\n return await handleApiRoute(request, urlWithQuery);\n }\n\n // Page routes\n return await renderPage(request, urlWithQuery, null);\n } catch (error) {\n console.error(\"[vinext] Worker error:\", error);\n return new Response(\"Internal Server Error\", { status: 500 });\n }\n },\n};\n`;\n}\n\n/** Generate vite.config.ts for App Router */\nexport function generateAppRouterViteConfig(info?: ProjectInfo): string {\n const imports: string[] = [\n `import { defineConfig } from \"vite\";`,\n `import vinext from \"vinext\";`,\n `import { cloudflare } from \"@cloudflare/vite-plugin\";`,\n ];\n\n if (info?.nativeModulesToStub && info.nativeModulesToStub.length > 0) {\n imports.push(`import path from \"node:path\";`);\n }\n\n const plugins: string[] = [];\n\n if (info?.hasMDX) {\n plugins.push(` // vinext auto-injects @mdx-js/rollup with plugins from next.config`);\n }\n plugins.push(` vinext(),`);\n\n plugins.push(` cloudflare({\n viteEnvironment: {\n name: \"rsc\",\n childEnvironments: [\"ssr\"],\n },\n }),`);\n\n // Build resolve.alias for native module stubs (tsconfig paths are handled\n // automatically by vite-tsconfig-paths inside the vinext plugin)\n let resolveBlock = \"\";\n const aliases: string[] = [];\n\n if (info?.nativeModulesToStub && info.nativeModulesToStub.length > 0) {\n for (const mod of info.nativeModulesToStub) {\n aliases.push(` \"${mod}\": path.resolve(__dirname, \"empty-stub.js\"),`);\n }\n }\n\n if (aliases.length > 0) {\n resolveBlock = `\\n resolve: {\\n alias: {\\n${aliases.join(\"\\n\")}\\n },\\n },`;\n }\n\n return `${imports.join(\"\\n\")}\n\nexport default defineConfig({\n plugins: [\n${plugins.join(\"\\n\")}\n ],${resolveBlock}\n});\n`;\n}\n\n/** Generate vite.config.ts for Pages Router */\nexport function generatePagesRouterViteConfig(info?: ProjectInfo): string {\n const imports: string[] = [\n `import { defineConfig } from \"vite\";`,\n `import vinext from \"vinext\";`,\n `import { cloudflare } from \"@cloudflare/vite-plugin\";`,\n ];\n\n if (info?.nativeModulesToStub && info.nativeModulesToStub.length > 0) {\n imports.push(`import path from \"node:path\";`);\n }\n\n // Build resolve.alias for native module stubs (tsconfig paths are handled\n // automatically by vite-tsconfig-paths inside the vinext plugin)\n let resolveBlock = \"\";\n const aliases: string[] = [];\n\n if (info?.nativeModulesToStub && info.nativeModulesToStub.length > 0) {\n for (const mod of info.nativeModulesToStub) {\n aliases.push(` \"${mod}\": path.resolve(__dirname, \"empty-stub.js\"),`);\n }\n }\n\n if (aliases.length > 0) {\n resolveBlock = `\\n resolve: {\\n alias: {\\n${aliases.join(\"\\n\")}\\n },\\n },`;\n }\n\n return `${imports.join(\"\\n\")}\n\nexport default defineConfig({\n plugins: [\n vinext(),\n cloudflare(),\n ],${resolveBlock}\n});\n`;\n}\n\n// ─── Dependency Management ───────────────────────────────────────────────────\n\ninterface MissingDep {\n name: string;\n version: string;\n}\n\n/**\n * Check if a package is resolvable from a given root directory using\n * Node's module resolution (createRequire). Handles hoisting, pnpm\n * symlinks, monorepos, and Yarn PnP correctly.\n */\nexport function isPackageResolvable(root: string, packageName: string): boolean {\n try {\n const req = createRequire(path.join(root, \"package.json\"));\n req.resolve(packageName);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function getMissingDeps(\n info: ProjectInfo,\n /** Override for testing — defaults to `isPackageResolvable` */\n _isResolvable: (root: string, pkg: string) => boolean = isPackageResolvable,\n): MissingDep[] {\n const missing: MissingDep[] = [];\n\n if (!info.hasCloudflarePlugin) {\n missing.push({ name: \"@cloudflare/vite-plugin\", version: \"latest\" });\n }\n if (!info.hasWrangler) {\n missing.push({ name: \"wrangler\", version: \"latest\" });\n }\n if (info.isAppRouter && !info.hasRscPlugin) {\n missing.push({ name: \"@vitejs/plugin-rsc\", version: \"latest\" });\n }\n if (info.isAppRouter) {\n // react-server-dom-webpack must be resolvable from the project root for Vite.\n if (!_isResolvable(info.root, \"react-server-dom-webpack\")) {\n missing.push({ name: \"react-server-dom-webpack\", version: \"latest\" });\n }\n }\n if (info.hasMDX) {\n // Check if @mdx-js/rollup is already installed\n const hasMdxRollup = fs.existsSync(\n path.join(info.root, \"node_modules\", \"@mdx-js\", \"rollup\"),\n );\n if (!hasMdxRollup) {\n missing.push({ name: \"@mdx-js/rollup\", version: \"latest\" });\n }\n }\n\n return missing;\n}\n\nfunction installDeps(root: string, deps: MissingDep[]): void {\n if (deps.length === 0) return;\n\n const depsStr = deps.map((d) => `${d.name}@${d.version}`).join(\" \");\n const installCmd = detectPackageManager(root);\n\n console.log(` Installing: ${deps.map((d) => d.name).join(\", \")}`);\n execSync(`${installCmd} ${depsStr}`, {\n cwd: root,\n stdio: \"inherit\",\n });\n}\n\nconst detectPackageManager = _detectPackageManager;\n\n// ─── File Writing ────────────────────────────────────────────────────────────\n\ninterface GeneratedFile {\n path: string;\n content: string;\n description: string;\n}\n\nexport function getFilesToGenerate(info: ProjectInfo): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n\n if (!info.hasWranglerConfig) {\n files.push({\n path: path.join(info.root, \"wrangler.jsonc\"),\n content: generateWranglerConfig(info),\n description: \"wrangler.jsonc\",\n });\n }\n\n if (!info.hasWorkerEntry) {\n const workerContent = info.isAppRouter\n ? generateAppRouterWorkerEntry()\n : generatePagesRouterWorkerEntry();\n files.push({\n path: path.join(info.root, \"worker\", \"index.ts\"),\n content: workerContent,\n description: \"worker/index.ts\",\n });\n }\n\n if (!info.hasViteConfig) {\n const viteContent = info.isAppRouter\n ? generateAppRouterViteConfig(info)\n : generatePagesRouterViteConfig(info);\n files.push({\n path: path.join(info.root, \"vite.config.ts\"),\n content: viteContent,\n description: \"vite.config.ts\",\n });\n }\n\n return files;\n}\n\nfunction writeGeneratedFiles(files: GeneratedFile[]): void {\n for (const file of files) {\n const dir = path.dirname(file.path);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(file.path, file.content, \"utf-8\");\n console.log(` Created ${file.description}`);\n }\n}\n\n// ─── Build ───────────────────────────────────────────────────────────────────\n\nasync function runBuild(info: ProjectInfo): Promise<void> {\n console.log(\"\\n Building for Cloudflare Workers...\\n\");\n\n // Use Vite's JS API for the build. The user's vite.config.ts (or our\n // generated one) has the cloudflare() plugin which handles the Worker\n // output format. We just need to trigger the build.\n //\n // For App Router, createBuilder().buildApp() handles multi-environment builds.\n // For Pages Router, a single build() call suffices (cloudflare plugin manages it).\n\n if (info.isAppRouter) {\n const builder = await createBuilder({ root: info.root });\n await builder.buildApp();\n } else {\n await build({ root: info.root });\n }\n}\n\n// ─── Deploy ──────────────────────────────────────────────────────────────────\n\nexport interface WranglerDeployArgs {\n args: string[];\n env: string | undefined;\n}\n\nexport function buildWranglerDeployArgs(options: Pick<DeployOptions, \"preview\" | \"env\">): WranglerDeployArgs {\n const args = [\"deploy\"];\n const env = options.env || (options.preview ? \"preview\" : undefined);\n if (env) {\n args.push(\"--env\", env);\n }\n return { args, env };\n}\n\nfunction runWranglerDeploy(root: string, options: Pick<DeployOptions, \"preview\" | \"env\">): string {\n const wranglerBin = path.join(root, \"node_modules\", \".bin\", \"wrangler\");\n\n const execOpts: ExecSyncOptions = {\n cwd: root,\n stdio: \"pipe\",\n encoding: \"utf-8\",\n };\n\n const { args, env } = buildWranglerDeployArgs(options);\n\n if (env) {\n console.log(`\\n Deploying to env: ${env}...`);\n } else {\n console.log(\"\\n Deploying to production...\");\n }\n\n // Use execFileSync to avoid shell injection — args are passed as an array,\n // never interpolated into a shell command string.\n const output = execFileSync(wranglerBin, args, execOpts) as string;\n\n // Parse the deployed URL from wrangler output\n // Wrangler prints: \"Published <name> (version_id)\\n https://<name>.<subdomain>.workers.dev\"\n const urlMatch = output.match(/https:\\/\\/[^\\s]+\\.workers\\.dev[^\\s]*/);\n const deployedUrl = urlMatch ? urlMatch[0] : null;\n\n // Also print raw output for transparency\n if (output.trim()) {\n for (const line of output.trim().split(\"\\n\")) {\n console.log(` ${line}`);\n }\n }\n\n return deployedUrl ?? \"(URL not detected in wrangler output)\";\n}\n\n// ─── Main Entry ──────────────────────────────────────────────────────────────\n\nexport async function deploy(options: DeployOptions): Promise<void> {\n const root = path.resolve(options.root);\n\n console.log(\"\\n vinext deploy\\n\");\n\n // Step 1: Detect project structure\n const info = detectProject(root);\n\n if (!info.isAppRouter && !info.isPagesRouter) {\n console.error(\" Error: No app/ or pages/ directory found.\");\n console.error(\" vinext deploy requires a Next.js project with an app/ or pages/ directory\");\n console.error(\" (also checks src/app/ and src/pages/).\\n\");\n process.exit(1);\n }\n\n if (options.name) {\n info.projectName = options.name;\n }\n\n console.log(` Project: ${info.projectName}`);\n console.log(` Router: ${info.isAppRouter ? \"App Router\" : \"Pages Router\"}`);\n console.log(` ISR: ${info.hasISR ? \"detected\" : \"none\"}`);\n\n // Step 2: Check and install missing dependencies\n // For App Router: upgrade React first if needed for react-server-dom-webpack compatibility\n if (info.isAppRouter) {\n const reactUpgrade = getReactUpgradeDeps(root);\n if (reactUpgrade.length > 0) {\n const installCmd = detectPackageManager(root).replace(/ -D$/, \"\");\n console.log(` Upgrading ${reactUpgrade.map(d => d.replace(/@latest$/, \"\")).join(\", \")}...`);\n execSync(`${installCmd} ${reactUpgrade.join(\" \")}`, { cwd: root, stdio: \"inherit\" });\n }\n }\n const missingDeps = getMissingDeps(info);\n if (missingDeps.length > 0) {\n console.log();\n installDeps(root, missingDeps);\n // Re-detect after install\n info.hasCloudflarePlugin = true;\n info.hasWrangler = true;\n if (info.isAppRouter) info.hasRscPlugin = true;\n }\n\n // Step 3: Ensure ESM + rename CJS configs\n if (!info.hasTypeModule) {\n const renamedConfigs = renameCJSConfigs(root);\n for (const [oldName, newName] of renamedConfigs) {\n console.log(` Renamed ${oldName} → ${newName} (CJS → .cjs)`);\n }\n if (ensureESModule(root)) {\n console.log(` Added \"type\": \"module\" to package.json`);\n info.hasTypeModule = true;\n }\n }\n\n // Step 4: Generate missing config files\n const filesToGenerate = getFilesToGenerate(info);\n if (filesToGenerate.length > 0) {\n console.log();\n writeGeneratedFiles(filesToGenerate);\n }\n\n if (options.dryRun) {\n console.log(\"\\n Dry run complete. Files generated but no build or deploy performed.\\n\");\n return;\n }\n\n // Step 5: Build\n if (!options.skipBuild) {\n await runBuild(info);\n } else {\n console.log(\"\\n Skipping build (--skip-build)\");\n }\n\n // Step 6: TPR — pre-render hot pages into KV cache (experimental, opt-in)\n if (options.experimentalTPR) {\n console.log();\n const tprResult = await runTPR({\n root,\n coverage: Math.max(1, Math.min(100, options.tprCoverage ?? 90)),\n limit: Math.max(1, options.tprLimit ?? 1000),\n window: Math.max(1, options.tprWindow ?? 24),\n });\n\n if (tprResult.skipped) {\n console.log(` TPR: Skipped (${tprResult.skipped})`);\n }\n }\n\n // Step 7: Deploy via wrangler\n const url = runWranglerDeploy(root, {\n preview: options.preview ?? false,\n env: options.env,\n });\n\n console.log(\"\\n ─────────────────────────────────────────\");\n console.log(` Deployed to: ${url}`);\n console.log(\" ─────────────────────────────────────────\\n\");\n}\n"]}
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * vinext deploy — one-command Cloudflare Workers deployment.\n *\n * Takes any Next.js app and deploys it to Cloudflare Workers:\n *\n * 1. Detects App Router vs Pages Router\n * 2. Auto-generates missing config files (wrangler.jsonc, worker/index.ts, vite.config.ts)\n * 3. Ensures dependencies are installed (@cloudflare/vite-plugin, wrangler, @vitejs/plugin-rsc)\n * 4. Runs the Vite build\n * 5. Deploys to Cloudflare Workers via wrangler\n *\n * Design: Everything is auto-generated into a `.vinext/` directory (not the\n * project root) to avoid cluttering the user's project. If the user already\n * has these files, we use theirs.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createRequire } from \"node:module\";\nimport { execFileSync, execSync, type ExecSyncOptions } from \"node:child_process\";\nimport { parseArgs as nodeParseArgs } from \"node:util\";\nimport { createBuilder, build } from \"vite\";\nimport {\n ensureESModule as _ensureESModule,\n renameCJSConfigs as _renameCJSConfigs,\n detectPackageManager as _detectPackageManager,\n} from \"./utils/project.js\";\nimport { getReactUpgradeDeps } from \"./init.js\";\nimport { runTPR } from \"./cloudflare/tpr.js\";\nimport { loadDotenv } from \"./config/dotenv.js\";\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface DeployOptions {\n /** Project root directory */\n root: string;\n /** Deploy to preview environment (default: production) */\n preview?: boolean;\n /** Wrangler environment name from wrangler.jsonc env.<name> */\n env?: string;\n /** Custom project name for the Worker */\n name?: string;\n /** Skip the build step (assume already built) */\n skipBuild?: boolean;\n /** Dry run — generate config files but don't build or deploy */\n dryRun?: boolean;\n /** Enable experimental TPR (Traffic-aware Pre-Rendering) */\n experimentalTPR?: boolean;\n /** TPR: traffic coverage percentage target (0–100, default: 90) */\n tprCoverage?: number;\n /** TPR: hard cap on number of pages to pre-render (default: 1000) */\n tprLimit?: number;\n /** TPR: analytics lookback window in hours (default: 24) */\n tprWindow?: number;\n}\n\n// ─── CLI arg parsing (uses Node.js util.parseArgs) ──────────────────────────\n\n/** Deploy command flag definitions for util.parseArgs. */\nconst deployArgOptions = {\n help: { type: \"boolean\", short: \"h\", default: false },\n preview: { type: \"boolean\", default: false },\n env: { type: \"string\" },\n name: { type: \"string\" },\n \"skip-build\": { type: \"boolean\", default: false },\n \"dry-run\": { type: \"boolean\", default: false },\n \"experimental-tpr\": { type: \"boolean\", default: false },\n \"tpr-coverage\": { type: \"string\" },\n \"tpr-limit\": { type: \"string\" },\n \"tpr-window\": { type: \"string\" },\n} as const;\n\nexport function parseDeployArgs(args: string[]) {\n const { values } = nodeParseArgs({ args, options: deployArgOptions, strict: true });\n return {\n help: values.help,\n preview: values.preview,\n env: values.env?.trim() || undefined,\n name: values.name?.trim() || undefined,\n skipBuild: values[\"skip-build\"],\n dryRun: values[\"dry-run\"],\n experimentalTPR: values[\"experimental-tpr\"],\n tprCoverage: values[\"tpr-coverage\"] ? parseInt(values[\"tpr-coverage\"], 10) : undefined,\n tprLimit: values[\"tpr-limit\"] ? parseInt(values[\"tpr-limit\"], 10) : undefined,\n tprWindow: values[\"tpr-window\"] ? parseInt(values[\"tpr-window\"], 10) : undefined,\n };\n}\n\n// ─── Project Detection ──────────────────────────────────────────────────────\n\ninterface ProjectInfo {\n root: string;\n isAppRouter: boolean;\n isPagesRouter: boolean;\n hasViteConfig: boolean;\n hasWranglerConfig: boolean;\n hasWorkerEntry: boolean;\n hasCloudflarePlugin: boolean;\n hasRscPlugin: boolean;\n hasWrangler: boolean;\n projectName: string;\n /** Pages that use `revalidate` (ISR) */\n hasISR: boolean;\n /** package.json has \"type\": \"module\" */\n hasTypeModule: boolean;\n /** .mdx files detected in app/ or pages/ */\n hasMDX: boolean;\n /** CodeHike is a dependency */\n hasCodeHike: boolean;\n /** Native Node modules that need stubbing for Workers */\n nativeModulesToStub: string[];\n}\n\n// ─── Detection ───────────────────────────────────────────────────────────────\n\nexport function detectProject(root: string): ProjectInfo {\n const hasApp =\n fs.existsSync(path.join(root, \"app\")) ||\n fs.existsSync(path.join(root, \"src\", \"app\"));\n const hasPages =\n fs.existsSync(path.join(root, \"pages\")) ||\n fs.existsSync(path.join(root, \"src\", \"pages\"));\n\n // Prefer App Router if both exist\n const isAppRouter = hasApp;\n const isPagesRouter = !hasApp && hasPages;\n\n const hasViteConfig =\n fs.existsSync(path.join(root, \"vite.config.ts\")) ||\n fs.existsSync(path.join(root, \"vite.config.js\")) ||\n fs.existsSync(path.join(root, \"vite.config.mjs\"));\n\n const hasWranglerConfig =\n fs.existsSync(path.join(root, \"wrangler.jsonc\")) ||\n fs.existsSync(path.join(root, \"wrangler.json\")) ||\n fs.existsSync(path.join(root, \"wrangler.toml\"));\n\n const hasWorkerEntry =\n fs.existsSync(path.join(root, \"worker\", \"index.ts\")) ||\n fs.existsSync(path.join(root, \"worker\", \"index.js\"));\n\n // Check node_modules for installed packages\n const hasCloudflarePlugin = fs.existsSync(\n path.join(root, \"node_modules\", \"@cloudflare\", \"vite-plugin\"),\n );\n const hasRscPlugin = fs.existsSync(\n path.join(root, \"node_modules\", \"@vitejs\", \"plugin-rsc\"),\n );\n const hasWrangler = fs.existsSync(\n path.join(root, \"node_modules\", \".bin\", \"wrangler\"),\n );\n\n // Derive project name from package.json or directory name\n let projectName = path.basename(root);\n const pkgPath = path.join(root, \"package.json\");\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n if (pkg.name) {\n // Sanitize: Workers names must be lowercase alphanumeric + hyphens\n projectName = pkg.name\n .replace(/^@[^/]+\\//, \"\") // strip npm scope\n .replace(/[^a-z0-9-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n }\n } catch {\n // ignore parse errors\n }\n }\n\n // Detect ISR usage (rough heuristic: search for `revalidate` exports)\n const hasISR = detectISR(root, isAppRouter);\n\n // Detect \"type\": \"module\" in package.json\n let hasTypeModule = false;\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n hasTypeModule = pkg.type === \"module\";\n } catch {\n // ignore\n }\n }\n\n // Detect MDX usage\n const hasMDX = detectMDX(root, isAppRouter, hasPages);\n\n // Detect CodeHike dependency\n let hasCodeHike = false;\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n hasCodeHike = \"codehike\" in allDeps;\n } catch {\n // ignore\n }\n }\n\n // Detect native Node modules that need stubbing for Workers\n const nativeModulesToStub = detectNativeModules(root);\n\n return {\n root,\n isAppRouter,\n isPagesRouter,\n hasViteConfig,\n hasWranglerConfig,\n hasWorkerEntry,\n hasCloudflarePlugin,\n hasRscPlugin,\n hasWrangler,\n projectName,\n hasISR,\n hasTypeModule,\n hasMDX,\n hasCodeHike,\n nativeModulesToStub,\n };\n}\n\nfunction detectISR(root: string, isAppRouter: boolean): boolean {\n if (!isAppRouter) return false;\n try {\n // Check root-level app/ first, then fall back to src/app/\n let appDir = path.join(root, \"app\");\n if (!fs.existsSync(appDir)) {\n appDir = path.join(root, \"src\", \"app\");\n }\n if (!fs.existsSync(appDir)) return false;\n // Quick check: search .ts/.tsx files in app/ for `export const revalidate`\n return scanDirForPattern(appDir, /export\\s+const\\s+revalidate\\s*=/);\n } catch {\n return false;\n }\n}\n\nfunction scanDirForPattern(dir: string, pattern: RegExp): boolean {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory() && !entry.name.startsWith(\".\") && entry.name !== \"node_modules\") {\n if (scanDirForPattern(fullPath, pattern)) return true;\n } else if (entry.isFile() && /\\.(ts|tsx|js|jsx)$/.test(entry.name)) {\n try {\n const content = fs.readFileSync(fullPath, \"utf-8\");\n if (pattern.test(content)) return true;\n } catch {\n // skip unreadable files\n }\n }\n }\n return false;\n}\n\n/**\n * Detect .mdx files in the project's app/ or pages/ directory,\n * or `pageExtensions` including \"mdx\" in next.config.\n */\nfunction detectMDX(root: string, isAppRouter: boolean, hasPages: boolean): boolean {\n // Check next.config for pageExtensions with mdx\n const configFiles = [\"next.config.ts\", \"next.config.mjs\", \"next.config.js\", \"next.config.cjs\"];\n for (const f of configFiles) {\n const p = path.join(root, f);\n if (fs.existsSync(p)) {\n try {\n const content = fs.readFileSync(p, \"utf-8\");\n if (/pageExtensions.*mdx/i.test(content) || /@next\\/mdx/.test(content)) return true;\n } catch {\n // ignore\n }\n }\n }\n\n // Check for .mdx files in app/ or pages/ (with src/ fallback)\n const dirs: string[] = [];\n if (isAppRouter) {\n const appDir = fs.existsSync(path.join(root, \"app\"))\n ? path.join(root, \"app\")\n : path.join(root, \"src\", \"app\");\n dirs.push(appDir);\n }\n if (hasPages) {\n const pagesDir = fs.existsSync(path.join(root, \"pages\"))\n ? path.join(root, \"pages\")\n : path.join(root, \"src\", \"pages\");\n dirs.push(pagesDir);\n }\n\n for (const dir of dirs) {\n if (fs.existsSync(dir) && scanDirForExtension(dir, \".mdx\")) return true;\n }\n\n return false;\n}\n\nfunction scanDirForExtension(dir: string, ext: string): boolean {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory() && !entry.name.startsWith(\".\") && entry.name !== \"node_modules\") {\n if (scanDirForExtension(fullPath, ext)) return true;\n } else if (entry.isFile() && entry.name.endsWith(ext)) {\n return true;\n }\n }\n return false;\n}\n\n/** Known native Node modules that can't run in Workers */\nconst NATIVE_MODULES_TO_STUB = [\n \"@resvg/resvg-js\",\n \"satori\",\n \"lightningcss\",\n \"@napi-rs/canvas\",\n \"sharp\",\n];\n\n/**\n * Detect native Node modules in dependencies that need stubbing for Workers.\n */\nfunction detectNativeModules(root: string): string[] {\n const pkgPath = path.join(root, \"package.json\");\n if (!fs.existsSync(pkgPath)) return [];\n\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n return NATIVE_MODULES_TO_STUB.filter((mod) => mod in allDeps);\n } catch {\n return [];\n }\n}\n\n// ─── Project Preparation (pre-build transforms) ─────────────────────────────\n//\n// These are delegated to shared utilities in ./utils/project.ts so they can\n// be reused by both `vinext deploy` and `vinext init`.\n\n/** @see {@link _ensureESModule} */\nexport const ensureESModule = _ensureESModule;\n\n/** @see {@link _renameCJSConfigs} */\nexport const renameCJSConfigs = _renameCJSConfigs;\n\n// ─── File Generation ─────────────────────────────────────────────────────────\n\n/** Generate wrangler.jsonc content */\nexport function generateWranglerConfig(info: ProjectInfo): string {\n const today = new Date().toISOString().split(\"T\")[0];\n\n const config: Record<string, unknown> = {\n $schema: \"node_modules/wrangler/config-schema.json\",\n name: info.projectName,\n compatibility_date: today,\n compatibility_flags: [\"nodejs_compat\"],\n main: \"./worker/index.ts\",\n assets: {\n not_found_handling: \"none\",\n // Expose static assets to the Worker via env.ASSETS so the image\n // optimization handler can fetch source images programmatically.\n binding: \"ASSETS\",\n },\n // Cloudflare Images binding for next/image optimization.\n // Enables resize, format negotiation (AVIF/WebP), and quality transforms\n // at the edge. No user setup needed — wrangler creates the binding automatically.\n images: {\n binding: \"IMAGES\",\n },\n };\n\n if (info.hasISR) {\n config.kv_namespaces = [\n {\n binding: \"VINEXT_CACHE\",\n id: \"<your-kv-namespace-id>\",\n },\n ];\n }\n\n return JSON.stringify(config, null, 2) + \"\\n\";\n}\n\n/** Generate worker/index.ts for App Router */\nexport function generateAppRouterWorkerEntry(): string {\n return `/**\n * Cloudflare Worker entry point — auto-generated by vinext deploy.\n * Edit freely or delete to regenerate on next deploy.\n *\n * For apps without image optimization, you can use vinext/server/app-router-entry\n * directly in wrangler.jsonc: \"main\": \"vinext/server/app-router-entry\"\n */\nimport { handleImageOptimization } from \"vinext/server/image-optimization\";\nimport handler from \"vinext/server/app-router-entry\";\n\ninterface Env {\n ASSETS: Fetcher;\n IMAGES: {\n input(stream: ReadableStream): {\n transform(options: Record<string, unknown>): {\n output(options: { format: string; quality: number }): Promise<{ response(): Response }>;\n };\n };\n };\n}\n\nexport default {\n async fetch(request: Request, env: Env): Promise<Response> {\n const url = new URL(request.url);\n\n // Image optimization via Cloudflare Images binding\n if (url.pathname === \"/_vinext/image\") {\n return handleImageOptimization(request, {\n fetchAsset: (path) => env.ASSETS.fetch(new Request(new URL(path, request.url))),\n transformImage: async (body, { width, format, quality }) => {\n const result = await env.IMAGES.input(body).transform(width > 0 ? { width } : {}).output({ format, quality });\n return result.response();\n },\n });\n }\n\n // Delegate everything else to vinext\n return handler.fetch(request);\n },\n};\n`;\n}\n\n/** Generate worker/index.ts for Pages Router */\nexport function generatePagesRouterWorkerEntry(): string {\n return `/**\n * Cloudflare Worker entry point — auto-generated by vinext deploy.\n * Edit freely or delete to regenerate on next deploy.\n */\nimport { handleImageOptimization } from \"vinext/server/image-optimization\";\n\n// @ts-expect-error — virtual module resolved by vinext at build time\nimport { renderPage, handleApiRoute } from \"virtual:vinext-server-entry\";\n\ninterface Env {\n ASSETS: Fetcher;\n IMAGES: {\n input(stream: ReadableStream): {\n transform(options: Record<string, unknown>): {\n output(options: { format: string; quality: number }): Promise<{ response(): Response }>;\n };\n };\n };\n}\n\nexport default {\n async fetch(request: Request, env: Env): Promise<Response> {\n try {\n const url = new URL(request.url);\n const pathname = url.pathname;\n const urlWithQuery = pathname + url.search;\n\n // Block protocol-relative URL open redirect attacks (//evil.com/).\n if (pathname.startsWith(\"//\")) {\n return new Response(\"404 Not Found\", { status: 404 });\n }\n\n // ── Image optimization via Cloudflare Images binding ──────────\n if (pathname === \"/_vinext/image\") {\n return handleImageOptimization(request, {\n fetchAsset: (path) => env.ASSETS.fetch(new Request(new URL(path, request.url))),\n transformImage: async (body, { width, format, quality }) => {\n const result = await env.IMAGES.input(body).transform(width > 0 ? { width } : {}).output({ format, quality });\n return result.response();\n },\n });\n }\n\n // API routes\n if (pathname.startsWith(\"/api/\") || pathname === \"/api\") {\n return await handleApiRoute(request, urlWithQuery);\n }\n\n // Page routes\n return await renderPage(request, urlWithQuery, null);\n } catch (error) {\n console.error(\"[vinext] Worker error:\", error);\n return new Response(\"Internal Server Error\", { status: 500 });\n }\n },\n};\n`;\n}\n\n/** Generate vite.config.ts for App Router */\nexport function generateAppRouterViteConfig(info?: ProjectInfo): string {\n const imports: string[] = [\n `import { defineConfig } from \"vite\";`,\n `import vinext from \"vinext\";`,\n `import { cloudflare } from \"@cloudflare/vite-plugin\";`,\n ];\n\n if (info?.nativeModulesToStub && info.nativeModulesToStub.length > 0) {\n imports.push(`import path from \"node:path\";`);\n }\n\n const plugins: string[] = [];\n\n if (info?.hasMDX) {\n plugins.push(` // vinext auto-injects @mdx-js/rollup with plugins from next.config`);\n }\n plugins.push(` vinext(),`);\n\n plugins.push(` cloudflare({\n viteEnvironment: {\n name: \"rsc\",\n childEnvironments: [\"ssr\"],\n },\n }),`);\n\n // Build resolve.alias for native module stubs (tsconfig paths are handled\n // automatically by vite-tsconfig-paths inside the vinext plugin)\n let resolveBlock = \"\";\n const aliases: string[] = [];\n\n if (info?.nativeModulesToStub && info.nativeModulesToStub.length > 0) {\n for (const mod of info.nativeModulesToStub) {\n aliases.push(` \"${mod}\": path.resolve(__dirname, \"empty-stub.js\"),`);\n }\n }\n\n if (aliases.length > 0) {\n resolveBlock = `\\n resolve: {\\n alias: {\\n${aliases.join(\"\\n\")}\\n },\\n },`;\n }\n\n return `${imports.join(\"\\n\")}\n\nexport default defineConfig({\n plugins: [\n${plugins.join(\"\\n\")}\n ],${resolveBlock}\n});\n`;\n}\n\n/** Generate vite.config.ts for Pages Router */\nexport function generatePagesRouterViteConfig(info?: ProjectInfo): string {\n const imports: string[] = [\n `import { defineConfig } from \"vite\";`,\n `import vinext from \"vinext\";`,\n `import { cloudflare } from \"@cloudflare/vite-plugin\";`,\n ];\n\n if (info?.nativeModulesToStub && info.nativeModulesToStub.length > 0) {\n imports.push(`import path from \"node:path\";`);\n }\n\n // Build resolve.alias for native module stubs (tsconfig paths are handled\n // automatically by vite-tsconfig-paths inside the vinext plugin)\n let resolveBlock = \"\";\n const aliases: string[] = [];\n\n if (info?.nativeModulesToStub && info.nativeModulesToStub.length > 0) {\n for (const mod of info.nativeModulesToStub) {\n aliases.push(` \"${mod}\": path.resolve(__dirname, \"empty-stub.js\"),`);\n }\n }\n\n if (aliases.length > 0) {\n resolveBlock = `\\n resolve: {\\n alias: {\\n${aliases.join(\"\\n\")}\\n },\\n },`;\n }\n\n return `${imports.join(\"\\n\")}\n\nexport default defineConfig({\n plugins: [\n vinext(),\n cloudflare(),\n ],${resolveBlock}\n});\n`;\n}\n\n// ─── Dependency Management ───────────────────────────────────────────────────\n\ninterface MissingDep {\n name: string;\n version: string;\n}\n\n/**\n * Check if a package is resolvable from a given root directory using\n * Node's module resolution (createRequire). Handles hoisting, pnpm\n * symlinks, monorepos, and Yarn PnP correctly.\n */\nexport function isPackageResolvable(root: string, packageName: string): boolean {\n try {\n const req = createRequire(path.join(root, \"package.json\"));\n req.resolve(packageName);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function getMissingDeps(\n info: ProjectInfo,\n /** Override for testing — defaults to `isPackageResolvable` */\n _isResolvable: (root: string, pkg: string) => boolean = isPackageResolvable,\n): MissingDep[] {\n const missing: MissingDep[] = [];\n\n if (!info.hasCloudflarePlugin) {\n missing.push({ name: \"@cloudflare/vite-plugin\", version: \"latest\" });\n }\n if (!info.hasWrangler) {\n missing.push({ name: \"wrangler\", version: \"latest\" });\n }\n if (info.isAppRouter && !info.hasRscPlugin) {\n missing.push({ name: \"@vitejs/plugin-rsc\", version: \"latest\" });\n }\n if (info.isAppRouter) {\n // react-server-dom-webpack must be resolvable from the project root for Vite.\n if (!_isResolvable(info.root, \"react-server-dom-webpack\")) {\n missing.push({ name: \"react-server-dom-webpack\", version: \"latest\" });\n }\n }\n if (info.hasMDX) {\n // Check if @mdx-js/rollup is already installed\n const hasMdxRollup = fs.existsSync(\n path.join(info.root, \"node_modules\", \"@mdx-js\", \"rollup\"),\n );\n if (!hasMdxRollup) {\n missing.push({ name: \"@mdx-js/rollup\", version: \"latest\" });\n }\n }\n\n return missing;\n}\n\nfunction installDeps(root: string, deps: MissingDep[]): void {\n if (deps.length === 0) return;\n\n const depsStr = deps.map((d) => `${d.name}@${d.version}`).join(\" \");\n const installCmd = detectPackageManager(root);\n\n console.log(` Installing: ${deps.map((d) => d.name).join(\", \")}`);\n execSync(`${installCmd} ${depsStr}`, {\n cwd: root,\n stdio: \"inherit\",\n });\n}\n\nconst detectPackageManager = _detectPackageManager;\n\n// ─── File Writing ────────────────────────────────────────────────────────────\n\ninterface GeneratedFile {\n path: string;\n content: string;\n description: string;\n}\n\nexport function getFilesToGenerate(info: ProjectInfo): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n\n if (!info.hasWranglerConfig) {\n files.push({\n path: path.join(info.root, \"wrangler.jsonc\"),\n content: generateWranglerConfig(info),\n description: \"wrangler.jsonc\",\n });\n }\n\n if (!info.hasWorkerEntry) {\n const workerContent = info.isAppRouter\n ? generateAppRouterWorkerEntry()\n : generatePagesRouterWorkerEntry();\n files.push({\n path: path.join(info.root, \"worker\", \"index.ts\"),\n content: workerContent,\n description: \"worker/index.ts\",\n });\n }\n\n if (!info.hasViteConfig) {\n const viteContent = info.isAppRouter\n ? generateAppRouterViteConfig(info)\n : generatePagesRouterViteConfig(info);\n files.push({\n path: path.join(info.root, \"vite.config.ts\"),\n content: viteContent,\n description: \"vite.config.ts\",\n });\n }\n\n return files;\n}\n\nfunction writeGeneratedFiles(files: GeneratedFile[]): void {\n for (const file of files) {\n const dir = path.dirname(file.path);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(file.path, file.content, \"utf-8\");\n console.log(` Created ${file.description}`);\n }\n}\n\n// ─── Build ───────────────────────────────────────────────────────────────────\n\nasync function runBuild(info: ProjectInfo): Promise<void> {\n console.log(\"\\n Building for Cloudflare Workers...\\n\");\n\n // Use Vite's JS API for the build. The user's vite.config.ts (or our\n // generated one) has the cloudflare() plugin which handles the Worker\n // output format. We just need to trigger the build.\n //\n // For App Router, createBuilder().buildApp() handles multi-environment builds.\n // For Pages Router, a single build() call suffices (cloudflare plugin manages it).\n\n if (info.isAppRouter) {\n const builder = await createBuilder({ root: info.root });\n await builder.buildApp();\n } else {\n await build({ root: info.root });\n }\n}\n\n// ─── Deploy ──────────────────────────────────────────────────────────────────\n\nexport interface WranglerDeployArgs {\n args: string[];\n env: string | undefined;\n}\n\nexport function buildWranglerDeployArgs(options: Pick<DeployOptions, \"preview\" | \"env\">): WranglerDeployArgs {\n const args = [\"deploy\"];\n const env = options.env || (options.preview ? \"preview\" : undefined);\n if (env) {\n args.push(\"--env\", env);\n }\n return { args, env };\n}\n\nfunction runWranglerDeploy(root: string, options: Pick<DeployOptions, \"preview\" | \"env\">): string {\n const wranglerBin = path.join(root, \"node_modules\", \".bin\", \"wrangler\");\n\n const execOpts: ExecSyncOptions = {\n cwd: root,\n stdio: \"pipe\",\n encoding: \"utf-8\",\n };\n\n const { args, env } = buildWranglerDeployArgs(options);\n\n if (env) {\n console.log(`\\n Deploying to env: ${env}...`);\n } else {\n console.log(\"\\n Deploying to production...\");\n }\n\n // Use execFileSync to avoid shell injection — args are passed as an array,\n // never interpolated into a shell command string.\n const output = execFileSync(wranglerBin, args, execOpts) as string;\n\n // Parse the deployed URL from wrangler output\n // Wrangler prints: \"Published <name> (version_id)\\n https://<name>.<subdomain>.workers.dev\"\n const urlMatch = output.match(/https:\\/\\/[^\\s]+\\.workers\\.dev[^\\s]*/);\n const deployedUrl = urlMatch ? urlMatch[0] : null;\n\n // Also print raw output for transparency\n if (output.trim()) {\n for (const line of output.trim().split(\"\\n\")) {\n console.log(` ${line}`);\n }\n }\n\n return deployedUrl ?? \"(URL not detected in wrangler output)\";\n}\n\n// ─── Main Entry ──────────────────────────────────────────────────────────────\n\nexport async function deploy(options: DeployOptions): Promise<void> {\n const root = path.resolve(options.root);\n loadDotenv({ root, mode: \"production\" });\n\n console.log(\"\\n vinext deploy\\n\");\n\n // Step 1: Detect project structure\n const info = detectProject(root);\n\n if (!info.isAppRouter && !info.isPagesRouter) {\n console.error(\" Error: No app/ or pages/ directory found.\");\n console.error(\" vinext deploy requires a Next.js project with an app/ or pages/ directory\");\n console.error(\" (also checks src/app/ and src/pages/).\\n\");\n process.exit(1);\n }\n\n if (options.name) {\n info.projectName = options.name;\n }\n\n console.log(` Project: ${info.projectName}`);\n console.log(` Router: ${info.isAppRouter ? \"App Router\" : \"Pages Router\"}`);\n console.log(` ISR: ${info.hasISR ? \"detected\" : \"none\"}`);\n\n // Step 2: Check and install missing dependencies\n // For App Router: upgrade React first if needed for react-server-dom-webpack compatibility\n if (info.isAppRouter) {\n const reactUpgrade = getReactUpgradeDeps(root);\n if (reactUpgrade.length > 0) {\n const installCmd = detectPackageManager(root).replace(/ -D$/, \"\");\n console.log(` Upgrading ${reactUpgrade.map(d => d.replace(/@latest$/, \"\")).join(\", \")}...`);\n execSync(`${installCmd} ${reactUpgrade.join(\" \")}`, { cwd: root, stdio: \"inherit\" });\n }\n }\n const missingDeps = getMissingDeps(info);\n if (missingDeps.length > 0) {\n console.log();\n installDeps(root, missingDeps);\n // Re-detect after install\n info.hasCloudflarePlugin = true;\n info.hasWrangler = true;\n if (info.isAppRouter) info.hasRscPlugin = true;\n }\n\n // Step 3: Ensure ESM + rename CJS configs\n if (!info.hasTypeModule) {\n const renamedConfigs = renameCJSConfigs(root);\n for (const [oldName, newName] of renamedConfigs) {\n console.log(` Renamed ${oldName} → ${newName} (CJS → .cjs)`);\n }\n if (ensureESModule(root)) {\n console.log(` Added \"type\": \"module\" to package.json`);\n info.hasTypeModule = true;\n }\n }\n\n // Step 4: Generate missing config files\n const filesToGenerate = getFilesToGenerate(info);\n if (filesToGenerate.length > 0) {\n console.log();\n writeGeneratedFiles(filesToGenerate);\n }\n\n if (options.dryRun) {\n console.log(\"\\n Dry run complete. Files generated but no build or deploy performed.\\n\");\n return;\n }\n\n // Step 5: Build\n if (!options.skipBuild) {\n await runBuild(info);\n } else {\n console.log(\"\\n Skipping build (--skip-build)\");\n }\n\n // Step 6: TPR — pre-render hot pages into KV cache (experimental, opt-in)\n if (options.experimentalTPR) {\n console.log();\n const tprResult = await runTPR({\n root,\n coverage: Math.max(1, Math.min(100, options.tprCoverage ?? 90)),\n limit: Math.max(1, options.tprLimit ?? 1000),\n window: Math.max(1, options.tprWindow ?? 24),\n });\n\n if (tprResult.skipped) {\n console.log(` TPR: Skipped (${tprResult.skipped})`);\n }\n }\n\n // Step 7: Deploy via wrangler\n const url = runWranglerDeploy(root, {\n preview: options.preview ?? false,\n env: options.env,\n });\n\n console.log(\"\\n ─────────────────────────────────────────\");\n console.log(` Deployed to: ${url}`);\n console.log(\" ─────────────────────────────────────────\\n\");\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"app-router.d.ts","sourceRoot":"","sources":["../../src/routing/app-router.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,aAAa,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,uDAAuD;IACvD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,wEAAwE;IACxE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,oDAAoD;IACpD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,kDAAkD;IAClD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,2CAA2C;IAC3C,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;IACxC;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,yDAAyD;IACzD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,qDAAqD;IACrD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,6EAA6E;IAC7E,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,mFAAmF;IACnF,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,6BAA6B;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,iDAAiD;IACjD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;;;;OAMG;IACH,gBAAgB,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IACpC,mEAAmE;IACnE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;;;;;OAKG;IACH,aAAa,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IACjC,qCAAqC;IACrC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,wCAAwC;IACxC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC;;;;;;OAMG;IACH,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,sCAAsC;IACtC,SAAS,EAAE,OAAO,CAAC;IACnB,2CAA2C;IAC3C,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAMD,wBAAgB,uBAAuB,IAAI,IAAI,CAG9C;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CA4CnE;AA+yBD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,QAAQ,EAAE,GACjB;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAA;CAAE,GAAG,IAAI,CAiBvE"}
1
+ {"version":3,"file":"app-router.d.ts","sourceRoot":"","sources":["../../src/routing/app-router.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,aAAa,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,uDAAuD;IACvD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,wEAAwE;IACxE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,oDAAoD;IACpD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,kDAAkD;IAClD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,2CAA2C;IAC3C,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;IACxC;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,yDAAyD;IACzD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,qDAAqD;IACrD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,6EAA6E;IAC7E,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,mFAAmF;IACnF,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,6BAA6B;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,iDAAiD;IACjD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;;;;OAMG;IACH,gBAAgB,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IACpC,mEAAmE;IACnE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;;;;;OAKG;IACH,aAAa,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IACjC,qCAAqC;IACrC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,wCAAwC;IACxC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC;;;;;;OAMG;IACH,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,sCAAsC;IACtC,SAAS,EAAE,OAAO,CAAC;IACnB,2CAA2C;IAC3C,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAMD,wBAAgB,uBAAuB,IAAI,IAAI,CAG9C;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAmCnE;AA+yBD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,QAAQ,EAAE,GACjB;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAA;CAAE,GAAG,IAAI,CAiBvE"}
@@ -13,9 +13,9 @@
13
13
  * - Error: app/error.tsx -> ErrorBoundary
14
14
  * - Not Found: app/not-found.tsx
15
15
  */
16
- import { glob } from "glob";
17
16
  import path from "node:path";
18
17
  import fs from "node:fs";
18
+ import { glob } from "node:fs/promises";
19
19
  // Cache for app routes
20
20
  let cachedRoutes = null;
21
21
  let cachedAppDir = null;
@@ -31,19 +31,15 @@ export async function appRouter(appDir) {
31
31
  return cachedRoutes;
32
32
  // Find all page.tsx and route.ts files, excluding @slot directories
33
33
  // (slot pages are not standalone routes — they're rendered as props of their parent layout)
34
- const allPageFiles = await glob("**/page.{tsx,ts,jsx,js}", { cwd: appDir });
35
- const pageFiles = allPageFiles.filter((f) => !f.split(path.sep).some((s) => s.startsWith("@")));
36
- const allRouteFiles = await glob("**/route.{tsx,ts,jsx,js}", { cwd: appDir });
37
- const routeFiles = allRouteFiles.filter((f) => !f.split(path.sep).some((s) => s.startsWith("@")));
38
34
  const routes = [];
39
- // Process page files
40
- for (const file of pageFiles) {
35
+ // Process page files in a single pass
36
+ for await (const file of glob("**/page.{tsx,ts,jsx,js}", { cwd: appDir, exclude: ["**/@*"] })) {
41
37
  const route = fileToAppRoute(file, appDir, "page");
42
38
  if (route)
43
39
  routes.push(route);
44
40
  }
45
- // Process route handler files (API routes)
46
- for (const file of routeFiles) {
41
+ // Process route handler files (API routes) in a single pass
42
+ for await (const file of glob("**/route.{tsx,ts,jsx,js}", { cwd: appDir, exclude: ["**/@*"] })) {
47
43
  const route = fileToAppRoute(file, appDir, "route");
48
44
  if (route)
49
45
  routes.push(route);
@@ -1 +1 @@
1
- {"version":3,"file":"app-router.js","sourceRoot":"","sources":["../../src/routing/app-router.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * App Router file-system routing.\n *\n * Scans the app/ directory following Next.js App Router conventions:\n * - app/page.tsx -> /\n * - app/about/page.tsx -> /about\n * - app/blog/[slug]/page.tsx -> /blog/:slug\n * - app/[...catchAll]/page.tsx -> /:catchAll+\n * - app/route.ts -> / (API route)\n * - app/(group)/page.tsx -> / (route groups are transparent)\n * - Layouts: app/layout.tsx wraps all children\n * - Loading: app/loading.tsx -> Suspense fallback\n * - Error: app/error.tsx -> ErrorBoundary\n * - Not Found: app/not-found.tsx\n */\nimport { glob } from \"glob\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\n\nexport interface InterceptingRoute {\n /** The interception convention: \".\" | \"..\" | \"../..\" | \"...\" */\n convention: string;\n /** The URL pattern this intercepts (e.g. \"/photos/:id\") */\n targetPattern: string;\n /** Absolute path to the intercepting page component */\n pagePath: string;\n /** Parameter names for dynamic segments */\n params: string[];\n}\n\nexport interface ParallelSlot {\n /** Slot name (e.g. \"team\" from @team) */\n name: string;\n /** Absolute path to the slot's page component */\n pagePath: string | null;\n /** Absolute path to the slot's default.tsx fallback */\n defaultPath: string | null;\n /** Absolute path to the slot's layout component (wraps slot content) */\n layoutPath: string | null;\n /** Absolute path to the slot's loading component */\n loadingPath: string | null;\n /** Absolute path to the slot's error component */\n errorPath: string | null;\n /** Intercepting routes within this slot */\n interceptingRoutes: InterceptingRoute[];\n /**\n * The layout index (0-based, in route.layouts[]) that this slot belongs to.\n * Slots are passed as props to the layout at their directory level, not\n * necessarily the innermost layout. -1 means \"innermost\" (legacy default).\n */\n layoutIndex: number;\n}\n\nexport interface AppRoute {\n /** URL pattern, e.g. \"/\" or \"/about\" or \"/blog/:slug\" */\n pattern: string;\n /** Absolute file path to the page component */\n pagePath: string | null;\n /** Absolute file path to the route handler (route.ts) */\n routePath: string | null;\n /** Ordered list of layout files from root to leaf */\n layouts: string[];\n /** Ordered list of template files from root to leaf (parallel to layouts) */\n templates: string[];\n /** Parallel route slots (from @slot directories at the route's directory level) */\n parallelSlots: ParallelSlot[];\n /** Loading component path */\n loadingPath: string | null;\n /** Error component path (leaf directory only) */\n errorPath: string | null;\n /**\n * Per-layout error boundary paths, aligned with the layouts array.\n * Each entry is the error.tsx at the same directory level as the\n * corresponding layout (or null if that level has no error.tsx).\n * Used to interleave ErrorBoundary components with layouts so that\n * ancestor error boundaries catch errors from descendant segments.\n */\n layoutErrorPaths: (string | null)[];\n /** Not-found component path (nearest, walking up from page dir) */\n notFoundPath: string | null;\n /**\n * Not-found component paths per layout level (aligned with layouts array).\n * Each entry is the not-found.tsx at that layout's directory, or null.\n * Used to create per-layout NotFoundBoundary so that notFound() thrown from\n * a layout is caught by the parent layout's boundary (matching Next.js behavior).\n */\n notFoundPaths: (string | null)[];\n /** Forbidden component path (403) */\n forbiddenPath: string | null;\n /** Unauthorized component path (401) */\n unauthorizedPath: string | null;\n /**\n * URL segment depth for each layout in the layouts array.\n * Used by useSelectedLayoutSegments() to determine which segments are\n * below a given layout. For example, root layout has depth 0, a layout\n * at app/dashboard/ has depth 1 (one URL segment: \"dashboard\").\n * Route groups and parallel slots don't contribute to the depth.\n */\n layoutSegmentDepths: number[];\n /** Whether this is a dynamic route */\n isDynamic: boolean;\n /** Parameter names for dynamic segments */\n params: string[];\n}\n\n// Cache for app routes\nlet cachedRoutes: AppRoute[] | null = null;\nlet cachedAppDir: string | null = null;\n\nexport function invalidateAppRouteCache(): void {\n cachedRoutes = null;\n cachedAppDir = null;\n}\n\n/**\n * Scan the app/ directory and return a list of routes.\n */\nexport async function appRouter(appDir: string): Promise<AppRoute[]> {\n if (cachedRoutes && cachedAppDir === appDir) return cachedRoutes;\n\n // Find all page.tsx and route.ts files, excluding @slot directories\n // (slot pages are not standalone routes — they're rendered as props of their parent layout)\n const allPageFiles = await glob(\"**/page.{tsx,ts,jsx,js}\", { cwd: appDir });\n const pageFiles = allPageFiles.filter(\n (f) => !f.split(path.sep).some((s) => s.startsWith(\"@\")),\n );\n const allRouteFiles = await glob(\"**/route.{tsx,ts,jsx,js}\", { cwd: appDir });\n const routeFiles = allRouteFiles.filter(\n (f) => !f.split(path.sep).some((s) => s.startsWith(\"@\")),\n );\n\n const routes: AppRoute[] = [];\n\n // Process page files\n for (const file of pageFiles) {\n const route = fileToAppRoute(file, appDir, \"page\");\n if (route) routes.push(route);\n }\n\n // Process route handler files (API routes)\n for (const file of routeFiles) {\n const route = fileToAppRoute(file, appDir, \"route\");\n if (route) routes.push(route);\n }\n\n // Discover sub-routes created by nested pages within parallel slots.\n // In Next.js, pages nested inside @slot directories create additional URL routes.\n // For example, @audience/demographics/page.tsx at app/parallel-routes/ creates\n // a route at /parallel-routes/demographics.\n const slotSubRoutes = discoverSlotSubRoutes(routes, appDir);\n routes.push(...slotSubRoutes);\n\n // Sort: static routes first, then dynamic, then catch-all\n routes.sort((a, b) => {\n const diff = routePrecedence(a.pattern) - routePrecedence(b.pattern);\n return diff !== 0 ? diff : a.pattern.localeCompare(b.pattern);\n });\n\n cachedRoutes = routes;\n cachedAppDir = appDir;\n return routes;\n}\n\n/**\n * Discover sub-routes created by nested pages within parallel slots.\n *\n * In Next.js, pages nested inside @slot directories create additional URL routes.\n * For example, given:\n * app/parallel-routes/@audience/demographics/page.tsx\n * This creates a route at /parallel-routes/demographics where:\n * - children slot → parent's default.tsx\n * - @audience slot → @audience/demographics/page.tsx (matched)\n * - other slots → their default.tsx (fallback)\n */\nfunction discoverSlotSubRoutes(\n routes: AppRoute[],\n _appDir: string,\n): AppRoute[] {\n const syntheticRoutes: AppRoute[] = [];\n const existingPatterns = new Set(routes.map((r) => r.pattern));\n\n for (const parentRoute of routes) {\n if (parentRoute.parallelSlots.length === 0) continue;\n if (!parentRoute.pagePath) continue;\n\n const parentPageDir = path.dirname(parentRoute.pagePath);\n\n // Collect sub-paths from all slots.\n // Map: relative sub-path (e.g., \"demographics\") -> Map<slotName, pagePath>\n const subPathMap = new Map<string, Map<string, string>>();\n\n for (const slot of parentRoute.parallelSlots) {\n const slotDir = path.join(parentPageDir, `@${slot.name}`);\n if (!fs.existsSync(slotDir)) continue;\n\n const subPages = findSlotSubPages(slotDir);\n for (const { relativePath, pagePath } of subPages) {\n if (!subPathMap.has(relativePath)) {\n subPathMap.set(relativePath, new Map());\n }\n subPathMap.get(relativePath)!.set(slot.name, pagePath);\n }\n }\n\n if (subPathMap.size === 0) continue;\n\n // Find the default.tsx for the children slot at the parent directory\n const childrenDefault = findFile(parentPageDir, \"default\");\n\n for (const [subPath, slotPages] of subPathMap) {\n // Convert sub-path segments to URL pattern parts\n const subSegments = subPath.split(path.sep);\n const urlParts: string[] = [];\n const subParams: string[] = [];\n let subIsDynamic = false;\n\n for (const seg of subSegments) {\n // Route groups are transparent\n if (seg.startsWith(\"(\") && seg.endsWith(\")\")) continue;\n\n const catchAllMatch = seg.match(/^\\[\\.\\.\\.(\\w+)\\]$/);\n if (catchAllMatch) {\n subIsDynamic = true;\n subParams.push(catchAllMatch[1]);\n urlParts.push(`:${catchAllMatch[1]}+`);\n continue;\n }\n const optionalCatchAllMatch = seg.match(/^\\[\\[\\.\\.\\.(\\w+)\\]\\]$/);\n if (optionalCatchAllMatch) {\n subIsDynamic = true;\n subParams.push(optionalCatchAllMatch[1]);\n urlParts.push(`:${optionalCatchAllMatch[1]}*`);\n continue;\n }\n const dynamicMatch = seg.match(/^\\[(\\w+)\\]$/);\n if (dynamicMatch) {\n subIsDynamic = true;\n subParams.push(dynamicMatch[1]);\n urlParts.push(`:${dynamicMatch[1]}`);\n continue;\n }\n\n urlParts.push(seg);\n }\n\n const subUrlPath = urlParts.join(\"/\");\n const pattern =\n parentRoute.pattern === \"/\"\n ? \"/\" + subUrlPath\n : parentRoute.pattern + \"/\" + subUrlPath;\n\n // Skip if this pattern already exists as a regular route\n if (existingPatterns.has(pattern)) continue;\n if (syntheticRoutes.some((r) => r.pattern === pattern)) continue;\n\n // Build parallel slots for this sub-route: matching slots get the sub-page,\n // non-matching slots get null pagePath (rendering falls back to defaultPath)\n const subSlots: ParallelSlot[] = parentRoute.parallelSlots.map(\n (slot) => ({\n ...slot,\n pagePath: slotPages.get(slot.name) || null,\n }),\n );\n\n syntheticRoutes.push({\n pattern,\n pagePath: childrenDefault, // children slot uses parent's default.tsx as page\n routePath: null,\n layouts: parentRoute.layouts,\n templates: parentRoute.templates,\n parallelSlots: subSlots,\n loadingPath: parentRoute.loadingPath,\n errorPath: parentRoute.errorPath,\n layoutErrorPaths: parentRoute.layoutErrorPaths,\n notFoundPath: parentRoute.notFoundPath,\n notFoundPaths: parentRoute.notFoundPaths,\n forbiddenPath: parentRoute.forbiddenPath,\n unauthorizedPath: parentRoute.unauthorizedPath,\n layoutSegmentDepths: parentRoute.layoutSegmentDepths,\n isDynamic: parentRoute.isDynamic || subIsDynamic,\n params: [...parentRoute.params, ...subParams],\n });\n }\n }\n\n return syntheticRoutes;\n}\n\n/**\n * Find all page files in subdirectories of a parallel slot directory.\n * Returns relative paths (from the slot dir) and absolute page paths.\n * Skips the root page.tsx (already handled as the slot's main page)\n * and intercepting route directories.\n */\nfunction findSlotSubPages(\n slotDir: string,\n): Array<{ relativePath: string; pagePath: string }> {\n const results: Array<{ relativePath: string; pagePath: string }> = [];\n\n function scan(dir: string): void {\n if (!fs.existsSync(dir)) return;\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n // Skip intercepting route directories\n if (matchInterceptConvention(entry.name)) continue;\n // Skip private folders (prefixed with _)\n if (entry.name.startsWith(\"_\")) continue;\n\n const subDir = path.join(dir, entry.name);\n const page = findFile(subDir, \"page\");\n if (page) {\n const relativePath = path.relative(slotDir, subDir);\n results.push({ relativePath, pagePath: page });\n }\n // Continue scanning deeper for nested sub-pages\n scan(subDir);\n }\n }\n\n scan(slotDir);\n return results;\n}\n\n/**\n * Convert a file path relative to app/ into an AppRoute.\n */\nfunction fileToAppRoute(\n file: string,\n appDir: string,\n type: \"page\" | \"route\",\n): AppRoute | null {\n // Remove the filename (page.tsx or route.ts)\n const dir = path.dirname(file);\n const segments = dir === \".\" ? [] : dir.split(path.sep);\n\n const params: string[] = [];\n let isDynamic = false;\n\n // Convert segments to URL pattern, stripping route groups and parallel slots\n const urlSegments: string[] = [];\n for (const segment of segments) {\n // Route groups: (group) -> skip (transparent in URL)\n if (segment.startsWith(\"(\") && segment.endsWith(\")\")) {\n continue;\n }\n\n // Parallel slots: @slot -> skip (invisible in URL, content passed as layout props)\n if (segment.startsWith(\"@\")) {\n continue;\n }\n\n // Catch-all: [...slug]\n const catchAllMatch = segment.match(/^\\[\\.\\.\\.(\\w+)\\]$/);\n if (catchAllMatch) {\n isDynamic = true;\n params.push(catchAllMatch[1]);\n urlSegments.push(`:${catchAllMatch[1]}+`);\n continue;\n }\n\n // Optional catch-all: [[...slug]]\n const optionalCatchAllMatch = segment.match(/^\\[\\[\\.\\.\\.(\\w+)\\]\\]$/);\n if (optionalCatchAllMatch) {\n isDynamic = true;\n params.push(optionalCatchAllMatch[1]);\n urlSegments.push(`:${optionalCatchAllMatch[1]}*`);\n continue;\n }\n\n // Dynamic segment: [id]\n const dynamicMatch = segment.match(/^\\[(\\w+)\\]$/);\n if (dynamicMatch) {\n isDynamic = true;\n params.push(dynamicMatch[1]);\n urlSegments.push(`:${dynamicMatch[1]}`);\n continue;\n }\n\n try {\n urlSegments.push(decodeURIComponent(segment));\n } catch {\n urlSegments.push(segment);\n }\n }\n\n const pattern = \"/\" + urlSegments.join(\"/\");\n\n // Discover layouts and templates from root to leaf\n const layouts = discoverLayouts(segments, appDir);\n const templates = discoverTemplates(segments, appDir);\n\n // Compute the URL segment depth for each layout.\n // Each layout corresponds to a directory level. We need to count how many\n // of the filesystem segments up to that layout's level contribute URL segments\n // (i.e., are not route groups or parallel slots).\n const layoutSegmentDepths = computeLayoutSegmentDepths(\n segments,\n appDir,\n layouts,\n );\n\n // Discover per-layout error boundaries (aligned with layouts array).\n // In Next.js, each segment independently wraps its children with an ErrorBoundary.\n // This array enables interleaving error boundaries with layouts in the rendering.\n const layoutErrorPaths = discoverLayoutAlignedErrors(segments, appDir);\n\n // Discover loading, error in the route's directory\n const routeDir = dir === \".\" ? appDir : path.join(appDir, dir);\n const loadingPath = findFile(routeDir, \"loading\");\n const errorPath = findFile(routeDir, \"error\");\n\n // Discover not-found/forbidden/unauthorized: walk from route directory up to root (nearest wins).\n const notFoundPath = discoverBoundaryFile(segments, appDir, \"not-found\");\n const forbiddenPath = discoverBoundaryFile(segments, appDir, \"forbidden\");\n const unauthorizedPath = discoverBoundaryFile(\n segments,\n appDir,\n \"unauthorized\",\n );\n\n // Discover per-layout not-found files (one per layout directory).\n // These are used for per-layout NotFoundBoundary to match Next.js behavior where\n // notFound() thrown from a layout is caught by the parent layout's boundary.\n const notFoundPaths = discoverBoundaryFilePerLayout(layouts, \"not-found\");\n\n // Discover parallel slots (@team, @analytics, etc.).\n // Slots at the route's own directory use page.tsx; slots at ancestor directories\n // (inherited from parent layouts) use default.tsx as fallback.\n const parallelSlots = discoverInheritedParallelSlots(\n segments,\n appDir,\n routeDir,\n );\n\n return {\n pattern: pattern === \"/\" ? \"/\" : pattern,\n pagePath: type === \"page\" ? path.join(appDir, file) : null,\n routePath: type === \"route\" ? path.join(appDir, file) : null,\n layouts,\n templates,\n parallelSlots,\n loadingPath,\n errorPath,\n layoutErrorPaths,\n notFoundPath,\n notFoundPaths,\n forbiddenPath,\n unauthorizedPath,\n layoutSegmentDepths,\n isDynamic,\n params,\n };\n}\n\n/**\n * Compute the URL segment depth for each layout in the layouts array.\n * Root layout = 0, then each directory level that contributes a URL segment\n * increments the depth. Route groups and parallel slots don't contribute.\n */\nfunction computeLayoutSegmentDepths(\n segments: string[],\n appDir: string,\n layouts: string[],\n): number[] {\n // Build a map: layout file path → depth in URL segments\n // Walk the segments directory-by-directory, tracking cumulative URL depth\n const depthMap = new Map<string, number>();\n\n // Root layout (at appDir) always has depth 0\n const rootLayout = findFile(appDir, \"layout\");\n if (rootLayout) depthMap.set(rootLayout, 0);\n\n let urlDepth = 0;\n let currentDir = appDir;\n for (const segment of segments) {\n currentDir = path.join(currentDir, segment);\n\n // Count URL-visible segments (skip route groups and parallel slots)\n const isRouteGroup = segment.startsWith(\"(\") && segment.endsWith(\")\");\n const isParallelSlot = segment.startsWith(\"@\");\n if (!isRouteGroup && !isParallelSlot) {\n urlDepth++;\n }\n\n const layout = findFile(currentDir, \"layout\");\n if (layout) {\n depthMap.set(layout, urlDepth);\n }\n }\n\n // Map the ordered layouts array to their depths\n return layouts.map((layoutPath) => depthMap.get(layoutPath) ?? 0);\n}\n\n/**\n * Discover all layout files from root to the given directory.\n * Each level of the directory tree may have a layout.tsx.\n */\nfunction discoverLayouts(segments: string[], appDir: string): string[] {\n const layouts: string[] = [];\n\n // Check root layout\n const rootLayout = findFile(appDir, \"layout\");\n if (rootLayout) layouts.push(rootLayout);\n\n // Check each directory level\n let currentDir = appDir;\n for (const segment of segments) {\n currentDir = path.join(currentDir, segment);\n const layout = findFile(currentDir, \"layout\");\n if (layout) layouts.push(layout);\n }\n\n return layouts;\n}\n\n/**\n * Discover all template files from root to the given directory.\n * Each level of the directory tree may have a template.tsx.\n * Templates are like layouts but re-mount on navigation.\n */\nfunction discoverTemplates(segments: string[], appDir: string): string[] {\n const templates: string[] = [];\n\n // Check root template\n const rootTemplate = findFile(appDir, \"template\");\n if (rootTemplate) templates.push(rootTemplate);\n\n // Check each directory level\n let currentDir = appDir;\n for (const segment of segments) {\n currentDir = path.join(currentDir, segment);\n const template = findFile(currentDir, \"template\");\n if (template) templates.push(template);\n }\n\n return templates;\n}\n\n/**\n * Discover error.tsx files aligned with the layouts array.\n * Walks the same directory levels as discoverLayouts and, for each level\n * that contributes a layout entry, checks whether error.tsx also exists.\n * Returns an array of the same length as discoverLayouts() would return,\n * with the error path (or null) at each corresponding layout level.\n *\n * This enables interleaving ErrorBoundary components with layouts in the\n * rendering tree, matching Next.js behavior where each segment independently\n * wraps its children with an error boundary.\n */\nfunction discoverLayoutAlignedErrors(\n segments: string[],\n appDir: string,\n): (string | null)[] {\n const errors: (string | null)[] = [];\n\n // Root level (only if root has a layout — matching discoverLayouts logic)\n const rootLayout = findFile(appDir, \"layout\");\n if (rootLayout) {\n errors.push(findFile(appDir, \"error\"));\n }\n\n // Check each directory level\n let currentDir = appDir;\n for (const segment of segments) {\n currentDir = path.join(currentDir, segment);\n const layout = findFile(currentDir, \"layout\");\n if (layout) {\n errors.push(findFile(currentDir, \"error\"));\n }\n }\n\n return errors;\n}\n\n/**\n * Discover the nearest boundary file (not-found, forbidden, unauthorized)\n * by walking from the route's directory up to the app root.\n * Returns the first (closest) file found, or null.\n */\nfunction discoverBoundaryFile(\n segments: string[],\n appDir: string,\n fileName: string,\n): string | null {\n // Build all directory paths from leaf to root\n const dirs: string[] = [];\n let dir = appDir;\n dirs.push(dir);\n for (const segment of segments) {\n dir = path.join(dir, segment);\n dirs.push(dir);\n }\n\n // Walk from leaf (last) to root (first)\n for (let i = dirs.length - 1; i >= 0; i--) {\n const f = findFile(dirs[i], fileName);\n if (f) return f;\n }\n return null;\n}\n\n/**\n * Discover boundary files (not-found, forbidden, unauthorized) at each layout directory.\n * Returns an array aligned with the layouts array, where each entry is the boundary\n * file at that layout's directory, or null if none exists there.\n *\n * This is used for per-layout error boundaries. In Next.js, each layout level\n * has its own boundary that wraps the layout's children. When notFound() is thrown\n * from a layout, it propagates up to the parent layout's boundary.\n */\nfunction discoverBoundaryFilePerLayout(\n layouts: string[],\n fileName: string,\n): (string | null)[] {\n return layouts.map((layoutPath) => {\n const layoutDir = path.dirname(layoutPath);\n return findFile(layoutDir, fileName);\n });\n}\n\n/**\n * Discover parallel slots inherited from ancestor directories.\n *\n * In Next.js, parallel slots belong to the layout that defines them. When a\n * child route is rendered, its parent layout's slots must still be present.\n * If the child doesn't have matching content in a slot, the slot's default.tsx\n * is rendered instead.\n *\n * Walk from appDir through each segment to the route's directory. At each level\n * that has @slot dirs, collect them. Slots at the route's own directory level\n * use page.tsx; slots at ancestor levels use default.tsx only.\n */\nfunction discoverInheritedParallelSlots(\n segments: string[],\n appDir: string,\n routeDir: string,\n): ParallelSlot[] {\n const slotMap = new Map<string, ParallelSlot>();\n\n // Walk from appDir through each segment, tracking layout indices.\n // layoutIndex tracks which position in the route's layouts[] array corresponds\n // to a given directory. Only directories with a layout.tsx file increment.\n let currentDir = appDir;\n const dirsToCheck: { dir: string; layoutIdx: number }[] = [];\n let layoutIdx = findFile(appDir, \"layout\") ? 0 : -1;\n dirsToCheck.push({ dir: appDir, layoutIdx: Math.max(layoutIdx, 0) });\n\n for (const segment of segments) {\n currentDir = path.join(currentDir, segment);\n if (findFile(currentDir, \"layout\")) {\n layoutIdx++;\n }\n dirsToCheck.push({ dir: currentDir, layoutIdx: Math.max(layoutIdx, 0) });\n }\n\n for (const { dir, layoutIdx: lvlLayoutIdx } of dirsToCheck) {\n const isOwnDir = dir === routeDir;\n const slotsAtLevel = discoverParallelSlots(dir, appDir);\n\n for (const slot of slotsAtLevel) {\n if (isOwnDir) {\n // At the route's own directory: use page.tsx (normal behavior)\n slot.layoutIndex = lvlLayoutIdx;\n slotMap.set(slot.name, slot);\n } else {\n // At an ancestor directory: use default.tsx as the page, not page.tsx\n // (the slot's page.tsx is for the parent route, not this child route)\n const inheritedSlot: ParallelSlot = {\n ...slot,\n pagePath: null, // Don't use ancestor's page.tsx\n layoutIndex: lvlLayoutIdx,\n // defaultPath, loadingPath, errorPath, interceptingRoutes remain\n };\n // Only inherit if we haven't seen this slot at a closer level\n if (!slotMap.has(slot.name)) {\n slotMap.set(slot.name, inheritedSlot);\n }\n }\n }\n }\n\n return Array.from(slotMap.values());\n}\n\n/**\n * Discover parallel route slots (@team, @analytics, etc.) in a directory.\n * Returns a ParallelSlot for each @-prefixed subdirectory that has a page or default component.\n */\nfunction discoverParallelSlots(dir: string, appDir: string): ParallelSlot[] {\n if (!fs.existsSync(dir)) return [];\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n const slots: ParallelSlot[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory() || !entry.name.startsWith(\"@\")) continue;\n\n const slotName = entry.name.slice(1); // \"@team\" -> \"team\"\n const slotDir = path.join(dir, entry.name);\n\n const pagePath = findFile(slotDir, \"page\");\n const defaultPath = findFile(slotDir, \"default\");\n const interceptingRoutes = discoverInterceptingRoutes(slotDir, dir, appDir);\n\n // Only include slots that have at least a page, default, or intercepting route\n if (!pagePath && !defaultPath && interceptingRoutes.length === 0) continue;\n\n slots.push({\n name: slotName,\n pagePath,\n defaultPath,\n layoutPath: findFile(slotDir, \"layout\"),\n loadingPath: findFile(slotDir, \"loading\"),\n errorPath: findFile(slotDir, \"error\"),\n interceptingRoutes,\n layoutIndex: -1, // Will be set by discoverInheritedParallelSlots\n });\n }\n\n return slots;\n}\n\n/**\n * The interception convention prefix patterns.\n * (.) — same level, (..) — one level up, (..)(..)\" — two levels up, (...) — root\n */\nconst INTERCEPT_PATTERNS = [\n { prefix: \"(...)\", convention: \"...\" },\n { prefix: \"(..)(..)\", convention: \"../..\" },\n { prefix: \"(..)\", convention: \"..\" },\n { prefix: \"(.)\", convention: \".\" },\n] as const;\n\n/**\n * Discover intercepting routes inside a parallel slot directory.\n *\n * Intercepting routes use conventions like (.)photo, (..)feed, (...), etc.\n * They intercept navigation to another route and render within the slot instead.\n *\n * @param slotDir - The parallel slot directory (e.g. app/feed/@modal)\n * @param routeDir - The directory of the route that owns this slot (e.g. app/feed)\n * @param appDir - The root app directory\n */\nfunction discoverInterceptingRoutes(\n slotDir: string,\n routeDir: string,\n appDir: string,\n): InterceptingRoute[] {\n if (!fs.existsSync(slotDir)) return [];\n\n const results: InterceptingRoute[] = [];\n\n // Recursively scan for page files inside intercepting directories\n scanForInterceptingPages(slotDir, routeDir, appDir, results);\n\n return results;\n}\n\n/**\n * Recursively scan a directory tree for page.tsx files that are inside\n * intercepting route directories.\n */\nfunction scanForInterceptingPages(\n currentDir: string,\n routeDir: string,\n appDir: string,\n results: InterceptingRoute[],\n): void {\n if (!fs.existsSync(currentDir)) return;\n\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n // Check if this directory name starts with an interception convention\n const interceptMatch = matchInterceptConvention(entry.name);\n\n if (interceptMatch) {\n // This directory is the start of an intercepting route\n // e.g. \"(.)photos\" means intercept same-level \"photos\" route\n const restOfName = entry.name.slice(interceptMatch.prefix.length);\n const interceptDir = path.join(currentDir, entry.name);\n\n // Find page files within this intercepting directory tree\n collectInterceptingPages(\n interceptDir,\n interceptDir,\n interceptMatch.convention,\n restOfName,\n routeDir,\n appDir,\n results,\n );\n } else {\n // Regular subdirectory — keep scanning for intercepting dirs\n scanForInterceptingPages(\n path.join(currentDir, entry.name),\n routeDir,\n appDir,\n results,\n );\n }\n }\n}\n\n/**\n * Match a directory name against interception convention prefixes.\n */\nfunction matchInterceptConvention(\n name: string,\n): { prefix: string; convention: string } | null {\n for (const pattern of INTERCEPT_PATTERNS) {\n if (name.startsWith(pattern.prefix)) {\n return pattern;\n }\n }\n return null;\n}\n\n/**\n * Collect page.tsx files inside an intercepting route directory tree\n * and compute their target URL patterns.\n */\nfunction collectInterceptingPages(\n currentDir: string,\n interceptRoot: string,\n convention: string,\n interceptSegment: string,\n routeDir: string,\n appDir: string,\n results: InterceptingRoute[],\n): void {\n // Check for page.tsx in current directory\n const page = findFile(currentDir, \"page\");\n if (page) {\n const targetPattern = computeInterceptTarget(\n convention,\n interceptSegment,\n currentDir,\n interceptRoot,\n routeDir,\n appDir,\n );\n if (targetPattern) {\n results.push({\n convention,\n targetPattern: targetPattern.pattern,\n pagePath: page,\n params: targetPattern.params,\n });\n }\n }\n\n // Recurse into subdirectories for nested intercepting routes\n if (!fs.existsSync(currentDir)) return;\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n collectInterceptingPages(\n path.join(currentDir, entry.name),\n interceptRoot,\n convention,\n interceptSegment,\n routeDir,\n appDir,\n results,\n );\n }\n}\n\n/**\n * Compute the target URL pattern for an intercepting route.\n *\n * - (.) same level: resolve relative to routeDir\n * - (..) one level up: resolve relative to parent of routeDir\n * - (..)(..)\" two levels up: resolve relative to grandparent of routeDir\n * - (...) root: resolve from appDir\n */\nfunction computeInterceptTarget(\n convention: string,\n interceptSegment: string,\n currentDir: string,\n interceptRoot: string,\n routeDir: string,\n appDir: string,\n): { pattern: string; params: string[] } | null {\n // Determine the base directory for target resolution\n let baseDir: string;\n switch (convention) {\n case \".\":\n baseDir = routeDir;\n break;\n case \"..\":\n baseDir = path.dirname(routeDir);\n break;\n case \"../..\":\n baseDir = path.dirname(path.dirname(routeDir));\n break;\n case \"...\":\n baseDir = appDir;\n break;\n default:\n return null;\n }\n\n // Build the target URL segments from baseDir relative to appDir\n const baseParts = path\n .relative(appDir, baseDir)\n .split(path.sep)\n .filter(Boolean);\n\n // Add the intercept segment and any nested path segments\n const nestedParts = path\n .relative(interceptRoot, currentDir)\n .split(path.sep)\n .filter(Boolean);\n const allSegments = [...baseParts, interceptSegment, ...nestedParts];\n\n // Convert segments to URL pattern\n const urlSegments: string[] = [];\n const params: string[] = [];\n\n for (const segment of allSegments) {\n if (segment === \".\") continue;\n // Route groups and @ slots are transparent\n if (segment.startsWith(\"(\") && segment.endsWith(\")\")) continue;\n if (segment.startsWith(\"@\")) continue;\n\n // Dynamic segments\n const catchAllMatch = segment.match(/^\\[\\.\\.\\.(\\w+)\\]$/);\n if (catchAllMatch) {\n params.push(catchAllMatch[1]);\n urlSegments.push(`:${catchAllMatch[1]}+`);\n continue;\n }\n const optionalCatchAllMatch = segment.match(/^\\[\\[\\.\\.\\.(\\w+)\\]\\]$/);\n if (optionalCatchAllMatch) {\n params.push(optionalCatchAllMatch[1]);\n urlSegments.push(`:${optionalCatchAllMatch[1]}*`);\n continue;\n }\n const dynamicMatch = segment.match(/^\\[(\\w+)\\]$/);\n if (dynamicMatch) {\n params.push(dynamicMatch[1]);\n urlSegments.push(`:${dynamicMatch[1]}`);\n continue;\n }\n\n // Decode URL-encoded directory names (e.g., %5Fsites -> _sites)\n try {\n urlSegments.push(decodeURIComponent(segment));\n } catch {\n urlSegments.push(segment);\n }\n }\n\n const pattern = \"/\" + urlSegments.join(\"/\");\n return { pattern: pattern === \"/\" ? \"/\" : pattern, params };\n}\n\n/**\n * Find a file by name (without extension) in a directory.\n * Checks .tsx, .ts, .jsx, .js extensions.\n */\nfunction findFile(dir: string, name: string): string | null {\n const extensions = [\".tsx\", \".ts\", \".jsx\", \".js\"];\n for (const ext of extensions) {\n const filePath = path.join(dir, name + ext);\n if (fs.existsSync(filePath)) return filePath;\n }\n return null;\n}\n\n/**\n * Match a URL against App Router routes.\n */\nexport function matchAppRoute(\n url: string,\n routes: AppRoute[],\n): { route: AppRoute; params: Record<string, string | string[]> } | null {\n const pathname = url.split(\"?\")[0];\n let normalizedUrl = pathname === \"/\" ? \"/\" : pathname.replace(/\\/$/, \"\");\n try {\n normalizedUrl = decodeURIComponent(normalizedUrl);\n } catch {\n /* malformed percent-encoding — match as-is */\n }\n\n for (const route of routes) {\n const params = matchPattern(normalizedUrl, route.pattern);\n if (params !== null) {\n return { route, params };\n }\n }\n\n return null;\n}\n\nfunction matchPattern(\n url: string,\n pattern: string,\n): Record<string, string | string[]> | null {\n const urlParts = url.split(\"/\").filter(Boolean);\n const patternParts = pattern.split(\"/\").filter(Boolean);\n\n const params: Record<string, string | string[]> = Object.create(null);\n\n for (let i = 0; i < patternParts.length; i++) {\n const pp = patternParts[i];\n\n if (pp.endsWith(\"+\")) {\n const paramName = pp.slice(1, -1);\n const remaining = urlParts.slice(i);\n if (remaining.length === 0) return null;\n params[paramName] = remaining;\n return params;\n }\n\n if (pp.endsWith(\"*\")) {\n const paramName = pp.slice(1, -1);\n const remaining = urlParts.slice(i);\n params[paramName] = remaining;\n return params;\n }\n\n if (pp.startsWith(\":\")) {\n const paramName = pp.slice(1);\n if (i >= urlParts.length) return null;\n params[paramName] = urlParts[i];\n continue;\n }\n\n if (i >= urlParts.length || urlParts[i] !== pp) return null;\n }\n\n if (urlParts.length !== patternParts.length) return null;\n\n return params;\n}\n\n/**\n * Route precedence — lower score is higher priority.\n * Matches Next.js specificity rules:\n * 1. Static routes first (scored by segment count, more = more specific)\n * 2. Dynamic segments penalized by position\n * 3. Catch-all comes after dynamic\n * 4. Optional catch-all last\n * 5. Lexicographic tiebreaker for determinism\n *\n * Key insight: routes with static prefix segments should have higher priority\n * than catch-all routes without them. E.g., /_sites/:subdomain/:slug* should\n * match before /:slug* because \"_sites\" must match exactly.\n */\nfunction routePrecedence(pattern: string): number {\n const parts = pattern.split(\"/\").filter(Boolean);\n let score = 0;\n let staticPrefixCount = 0;\n\n // Count static prefix segments (before first dynamic/catch-all)\n for (const p of parts) {\n if (p.startsWith(\":\") || p.endsWith(\"+\") || p.endsWith(\"*\")) break;\n staticPrefixCount++;\n }\n\n // Static prefix segments dramatically reduce score (increase priority).\n // Each static prefix segment gives -10000 priority boost.\n score -= staticPrefixCount * 10000;\n\n for (let i = 0; i < parts.length; i++) {\n const p = parts[i];\n if (p.endsWith(\"+\")) {\n score += 1000 + i; // catch-all: moderate penalty\n } else if (p.endsWith(\"*\")) {\n score += 2000 + i; // optional catch-all: high penalty\n } else if (p.startsWith(\":\")) {\n score += 100 + i; // dynamic: small penalty by position\n }\n // static segments after first dynamic don't contribute extra\n }\n return score;\n}\n"]}
1
+ {"version":3,"file":"app-router.js","sourceRoot":"","sources":["../../src/routing/app-router.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * App Router file-system routing.\n *\n * Scans the app/ directory following Next.js App Router conventions:\n * - app/page.tsx -> /\n * - app/about/page.tsx -> /about\n * - app/blog/[slug]/page.tsx -> /blog/:slug\n * - app/[...catchAll]/page.tsx -> /:catchAll+\n * - app/route.ts -> / (API route)\n * - app/(group)/page.tsx -> / (route groups are transparent)\n * - Layouts: app/layout.tsx wraps all children\n * - Loading: app/loading.tsx -> Suspense fallback\n * - Error: app/error.tsx -> ErrorBoundary\n * - Not Found: app/not-found.tsx\n */\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport { glob } from \"node:fs/promises\";\n\nexport interface InterceptingRoute {\n /** The interception convention: \".\" | \"..\" | \"../..\" | \"...\" */\n convention: string;\n /** The URL pattern this intercepts (e.g. \"/photos/:id\") */\n targetPattern: string;\n /** Absolute path to the intercepting page component */\n pagePath: string;\n /** Parameter names for dynamic segments */\n params: string[];\n}\n\nexport interface ParallelSlot {\n /** Slot name (e.g. \"team\" from @team) */\n name: string;\n /** Absolute path to the slot's page component */\n pagePath: string | null;\n /** Absolute path to the slot's default.tsx fallback */\n defaultPath: string | null;\n /** Absolute path to the slot's layout component (wraps slot content) */\n layoutPath: string | null;\n /** Absolute path to the slot's loading component */\n loadingPath: string | null;\n /** Absolute path to the slot's error component */\n errorPath: string | null;\n /** Intercepting routes within this slot */\n interceptingRoutes: InterceptingRoute[];\n /**\n * The layout index (0-based, in route.layouts[]) that this slot belongs to.\n * Slots are passed as props to the layout at their directory level, not\n * necessarily the innermost layout. -1 means \"innermost\" (legacy default).\n */\n layoutIndex: number;\n}\n\nexport interface AppRoute {\n /** URL pattern, e.g. \"/\" or \"/about\" or \"/blog/:slug\" */\n pattern: string;\n /** Absolute file path to the page component */\n pagePath: string | null;\n /** Absolute file path to the route handler (route.ts) */\n routePath: string | null;\n /** Ordered list of layout files from root to leaf */\n layouts: string[];\n /** Ordered list of template files from root to leaf (parallel to layouts) */\n templates: string[];\n /** Parallel route slots (from @slot directories at the route's directory level) */\n parallelSlots: ParallelSlot[];\n /** Loading component path */\n loadingPath: string | null;\n /** Error component path (leaf directory only) */\n errorPath: string | null;\n /**\n * Per-layout error boundary paths, aligned with the layouts array.\n * Each entry is the error.tsx at the same directory level as the\n * corresponding layout (or null if that level has no error.tsx).\n * Used to interleave ErrorBoundary components with layouts so that\n * ancestor error boundaries catch errors from descendant segments.\n */\n layoutErrorPaths: (string | null)[];\n /** Not-found component path (nearest, walking up from page dir) */\n notFoundPath: string | null;\n /**\n * Not-found component paths per layout level (aligned with layouts array).\n * Each entry is the not-found.tsx at that layout's directory, or null.\n * Used to create per-layout NotFoundBoundary so that notFound() thrown from\n * a layout is caught by the parent layout's boundary (matching Next.js behavior).\n */\n notFoundPaths: (string | null)[];\n /** Forbidden component path (403) */\n forbiddenPath: string | null;\n /** Unauthorized component path (401) */\n unauthorizedPath: string | null;\n /**\n * URL segment depth for each layout in the layouts array.\n * Used by useSelectedLayoutSegments() to determine which segments are\n * below a given layout. For example, root layout has depth 0, a layout\n * at app/dashboard/ has depth 1 (one URL segment: \"dashboard\").\n * Route groups and parallel slots don't contribute to the depth.\n */\n layoutSegmentDepths: number[];\n /** Whether this is a dynamic route */\n isDynamic: boolean;\n /** Parameter names for dynamic segments */\n params: string[];\n}\n\n// Cache for app routes\nlet cachedRoutes: AppRoute[] | null = null;\nlet cachedAppDir: string | null = null;\n\nexport function invalidateAppRouteCache(): void {\n cachedRoutes = null;\n cachedAppDir = null;\n}\n\n/**\n * Scan the app/ directory and return a list of routes.\n */\nexport async function appRouter(appDir: string): Promise<AppRoute[]> {\n if (cachedRoutes && cachedAppDir === appDir) return cachedRoutes;\n\n // Find all page.tsx and route.ts files, excluding @slot directories\n // (slot pages are not standalone routes — they're rendered as props of their parent layout)\n const routes: AppRoute[] = [];\n\n // Process page files in a single pass\n for await (const file of glob(\"**/page.{tsx,ts,jsx,js}\", { cwd: appDir, exclude: [\"**/@*\"] })) {\n const route = fileToAppRoute(file, appDir, \"page\");\n if (route) routes.push(route);\n }\n\n // Process route handler files (API routes) in a single pass\n for await (const file of glob(\"**/route.{tsx,ts,jsx,js}\", { cwd: appDir, exclude: [\"**/@*\"] })) {\n const route = fileToAppRoute(file, appDir, \"route\");\n if (route) routes.push(route);\n }\n\n // Discover sub-routes created by nested pages within parallel slots.\n // In Next.js, pages nested inside @slot directories create additional URL routes.\n // For example, @audience/demographics/page.tsx at app/parallel-routes/ creates\n // a route at /parallel-routes/demographics.\n const slotSubRoutes = discoverSlotSubRoutes(routes, appDir);\n routes.push(...slotSubRoutes);\n\n // Sort: static routes first, then dynamic, then catch-all\n routes.sort((a, b) => {\n const diff = routePrecedence(a.pattern) - routePrecedence(b.pattern);\n return diff !== 0 ? diff : a.pattern.localeCompare(b.pattern);\n });\n\n cachedRoutes = routes;\n cachedAppDir = appDir;\n return routes;\n}\n\n/**\n * Discover sub-routes created by nested pages within parallel slots.\n *\n * In Next.js, pages nested inside @slot directories create additional URL routes.\n * For example, given:\n * app/parallel-routes/@audience/demographics/page.tsx\n * This creates a route at /parallel-routes/demographics where:\n * - children slot → parent's default.tsx\n * - @audience slot → @audience/demographics/page.tsx (matched)\n * - other slots → their default.tsx (fallback)\n */\nfunction discoverSlotSubRoutes(\n routes: AppRoute[],\n _appDir: string,\n): AppRoute[] {\n const syntheticRoutes: AppRoute[] = [];\n const existingPatterns = new Set(routes.map((r) => r.pattern));\n\n for (const parentRoute of routes) {\n if (parentRoute.parallelSlots.length === 0) continue;\n if (!parentRoute.pagePath) continue;\n\n const parentPageDir = path.dirname(parentRoute.pagePath);\n\n // Collect sub-paths from all slots.\n // Map: relative sub-path (e.g., \"demographics\") -> Map<slotName, pagePath>\n const subPathMap = new Map<string, Map<string, string>>();\n\n for (const slot of parentRoute.parallelSlots) {\n const slotDir = path.join(parentPageDir, `@${slot.name}`);\n if (!fs.existsSync(slotDir)) continue;\n\n const subPages = findSlotSubPages(slotDir);\n for (const { relativePath, pagePath } of subPages) {\n if (!subPathMap.has(relativePath)) {\n subPathMap.set(relativePath, new Map());\n }\n subPathMap.get(relativePath)!.set(slot.name, pagePath);\n }\n }\n\n if (subPathMap.size === 0) continue;\n\n // Find the default.tsx for the children slot at the parent directory\n const childrenDefault = findFile(parentPageDir, \"default\");\n\n for (const [subPath, slotPages] of subPathMap) {\n // Convert sub-path segments to URL pattern parts\n const subSegments = subPath.split(path.sep);\n const urlParts: string[] = [];\n const subParams: string[] = [];\n let subIsDynamic = false;\n\n for (const seg of subSegments) {\n // Route groups are transparent\n if (seg.startsWith(\"(\") && seg.endsWith(\")\")) continue;\n\n const catchAllMatch = seg.match(/^\\[\\.\\.\\.(\\w+)\\]$/);\n if (catchAllMatch) {\n subIsDynamic = true;\n subParams.push(catchAllMatch[1]);\n urlParts.push(`:${catchAllMatch[1]}+`);\n continue;\n }\n const optionalCatchAllMatch = seg.match(/^\\[\\[\\.\\.\\.(\\w+)\\]\\]$/);\n if (optionalCatchAllMatch) {\n subIsDynamic = true;\n subParams.push(optionalCatchAllMatch[1]);\n urlParts.push(`:${optionalCatchAllMatch[1]}*`);\n continue;\n }\n const dynamicMatch = seg.match(/^\\[(\\w+)\\]$/);\n if (dynamicMatch) {\n subIsDynamic = true;\n subParams.push(dynamicMatch[1]);\n urlParts.push(`:${dynamicMatch[1]}`);\n continue;\n }\n\n urlParts.push(seg);\n }\n\n const subUrlPath = urlParts.join(\"/\");\n const pattern =\n parentRoute.pattern === \"/\"\n ? \"/\" + subUrlPath\n : parentRoute.pattern + \"/\" + subUrlPath;\n\n // Skip if this pattern already exists as a regular route\n if (existingPatterns.has(pattern)) continue;\n if (syntheticRoutes.some((r) => r.pattern === pattern)) continue;\n\n // Build parallel slots for this sub-route: matching slots get the sub-page,\n // non-matching slots get null pagePath (rendering falls back to defaultPath)\n const subSlots: ParallelSlot[] = parentRoute.parallelSlots.map(\n (slot) => ({\n ...slot,\n pagePath: slotPages.get(slot.name) || null,\n }),\n );\n\n syntheticRoutes.push({\n pattern,\n pagePath: childrenDefault, // children slot uses parent's default.tsx as page\n routePath: null,\n layouts: parentRoute.layouts,\n templates: parentRoute.templates,\n parallelSlots: subSlots,\n loadingPath: parentRoute.loadingPath,\n errorPath: parentRoute.errorPath,\n layoutErrorPaths: parentRoute.layoutErrorPaths,\n notFoundPath: parentRoute.notFoundPath,\n notFoundPaths: parentRoute.notFoundPaths,\n forbiddenPath: parentRoute.forbiddenPath,\n unauthorizedPath: parentRoute.unauthorizedPath,\n layoutSegmentDepths: parentRoute.layoutSegmentDepths,\n isDynamic: parentRoute.isDynamic || subIsDynamic,\n params: [...parentRoute.params, ...subParams],\n });\n }\n }\n\n return syntheticRoutes;\n}\n\n/**\n * Find all page files in subdirectories of a parallel slot directory.\n * Returns relative paths (from the slot dir) and absolute page paths.\n * Skips the root page.tsx (already handled as the slot's main page)\n * and intercepting route directories.\n */\nfunction findSlotSubPages(\n slotDir: string,\n): Array<{ relativePath: string; pagePath: string }> {\n const results: Array<{ relativePath: string; pagePath: string }> = [];\n\n function scan(dir: string): void {\n if (!fs.existsSync(dir)) return;\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n // Skip intercepting route directories\n if (matchInterceptConvention(entry.name)) continue;\n // Skip private folders (prefixed with _)\n if (entry.name.startsWith(\"_\")) continue;\n\n const subDir = path.join(dir, entry.name);\n const page = findFile(subDir, \"page\");\n if (page) {\n const relativePath = path.relative(slotDir, subDir);\n results.push({ relativePath, pagePath: page });\n }\n // Continue scanning deeper for nested sub-pages\n scan(subDir);\n }\n }\n\n scan(slotDir);\n return results;\n}\n\n/**\n * Convert a file path relative to app/ into an AppRoute.\n */\nfunction fileToAppRoute(\n file: string,\n appDir: string,\n type: \"page\" | \"route\",\n): AppRoute | null {\n // Remove the filename (page.tsx or route.ts)\n const dir = path.dirname(file);\n const segments = dir === \".\" ? [] : dir.split(path.sep);\n\n const params: string[] = [];\n let isDynamic = false;\n\n // Convert segments to URL pattern, stripping route groups and parallel slots\n const urlSegments: string[] = [];\n for (const segment of segments) {\n // Route groups: (group) -> skip (transparent in URL)\n if (segment.startsWith(\"(\") && segment.endsWith(\")\")) {\n continue;\n }\n\n // Parallel slots: @slot -> skip (invisible in URL, content passed as layout props)\n if (segment.startsWith(\"@\")) {\n continue;\n }\n\n // Catch-all: [...slug]\n const catchAllMatch = segment.match(/^\\[\\.\\.\\.(\\w+)\\]$/);\n if (catchAllMatch) {\n isDynamic = true;\n params.push(catchAllMatch[1]);\n urlSegments.push(`:${catchAllMatch[1]}+`);\n continue;\n }\n\n // Optional catch-all: [[...slug]]\n const optionalCatchAllMatch = segment.match(/^\\[\\[\\.\\.\\.(\\w+)\\]\\]$/);\n if (optionalCatchAllMatch) {\n isDynamic = true;\n params.push(optionalCatchAllMatch[1]);\n urlSegments.push(`:${optionalCatchAllMatch[1]}*`);\n continue;\n }\n\n // Dynamic segment: [id]\n const dynamicMatch = segment.match(/^\\[(\\w+)\\]$/);\n if (dynamicMatch) {\n isDynamic = true;\n params.push(dynamicMatch[1]);\n urlSegments.push(`:${dynamicMatch[1]}`);\n continue;\n }\n\n try {\n urlSegments.push(decodeURIComponent(segment));\n } catch {\n urlSegments.push(segment);\n }\n }\n\n const pattern = \"/\" + urlSegments.join(\"/\");\n\n // Discover layouts and templates from root to leaf\n const layouts = discoverLayouts(segments, appDir);\n const templates = discoverTemplates(segments, appDir);\n\n // Compute the URL segment depth for each layout.\n // Each layout corresponds to a directory level. We need to count how many\n // of the filesystem segments up to that layout's level contribute URL segments\n // (i.e., are not route groups or parallel slots).\n const layoutSegmentDepths = computeLayoutSegmentDepths(\n segments,\n appDir,\n layouts,\n );\n\n // Discover per-layout error boundaries (aligned with layouts array).\n // In Next.js, each segment independently wraps its children with an ErrorBoundary.\n // This array enables interleaving error boundaries with layouts in the rendering.\n const layoutErrorPaths = discoverLayoutAlignedErrors(segments, appDir);\n\n // Discover loading, error in the route's directory\n const routeDir = dir === \".\" ? appDir : path.join(appDir, dir);\n const loadingPath = findFile(routeDir, \"loading\");\n const errorPath = findFile(routeDir, \"error\");\n\n // Discover not-found/forbidden/unauthorized: walk from route directory up to root (nearest wins).\n const notFoundPath = discoverBoundaryFile(segments, appDir, \"not-found\");\n const forbiddenPath = discoverBoundaryFile(segments, appDir, \"forbidden\");\n const unauthorizedPath = discoverBoundaryFile(\n segments,\n appDir,\n \"unauthorized\",\n );\n\n // Discover per-layout not-found files (one per layout directory).\n // These are used for per-layout NotFoundBoundary to match Next.js behavior where\n // notFound() thrown from a layout is caught by the parent layout's boundary.\n const notFoundPaths = discoverBoundaryFilePerLayout(layouts, \"not-found\");\n\n // Discover parallel slots (@team, @analytics, etc.).\n // Slots at the route's own directory use page.tsx; slots at ancestor directories\n // (inherited from parent layouts) use default.tsx as fallback.\n const parallelSlots = discoverInheritedParallelSlots(\n segments,\n appDir,\n routeDir,\n );\n\n return {\n pattern: pattern === \"/\" ? \"/\" : pattern,\n pagePath: type === \"page\" ? path.join(appDir, file) : null,\n routePath: type === \"route\" ? path.join(appDir, file) : null,\n layouts,\n templates,\n parallelSlots,\n loadingPath,\n errorPath,\n layoutErrorPaths,\n notFoundPath,\n notFoundPaths,\n forbiddenPath,\n unauthorizedPath,\n layoutSegmentDepths,\n isDynamic,\n params,\n };\n}\n\n/**\n * Compute the URL segment depth for each layout in the layouts array.\n * Root layout = 0, then each directory level that contributes a URL segment\n * increments the depth. Route groups and parallel slots don't contribute.\n */\nfunction computeLayoutSegmentDepths(\n segments: string[],\n appDir: string,\n layouts: string[],\n): number[] {\n // Build a map: layout file path → depth in URL segments\n // Walk the segments directory-by-directory, tracking cumulative URL depth\n const depthMap = new Map<string, number>();\n\n // Root layout (at appDir) always has depth 0\n const rootLayout = findFile(appDir, \"layout\");\n if (rootLayout) depthMap.set(rootLayout, 0);\n\n let urlDepth = 0;\n let currentDir = appDir;\n for (const segment of segments) {\n currentDir = path.join(currentDir, segment);\n\n // Count URL-visible segments (skip route groups and parallel slots)\n const isRouteGroup = segment.startsWith(\"(\") && segment.endsWith(\")\");\n const isParallelSlot = segment.startsWith(\"@\");\n if (!isRouteGroup && !isParallelSlot) {\n urlDepth++;\n }\n\n const layout = findFile(currentDir, \"layout\");\n if (layout) {\n depthMap.set(layout, urlDepth);\n }\n }\n\n // Map the ordered layouts array to their depths\n return layouts.map((layoutPath) => depthMap.get(layoutPath) ?? 0);\n}\n\n/**\n * Discover all layout files from root to the given directory.\n * Each level of the directory tree may have a layout.tsx.\n */\nfunction discoverLayouts(segments: string[], appDir: string): string[] {\n const layouts: string[] = [];\n\n // Check root layout\n const rootLayout = findFile(appDir, \"layout\");\n if (rootLayout) layouts.push(rootLayout);\n\n // Check each directory level\n let currentDir = appDir;\n for (const segment of segments) {\n currentDir = path.join(currentDir, segment);\n const layout = findFile(currentDir, \"layout\");\n if (layout) layouts.push(layout);\n }\n\n return layouts;\n}\n\n/**\n * Discover all template files from root to the given directory.\n * Each level of the directory tree may have a template.tsx.\n * Templates are like layouts but re-mount on navigation.\n */\nfunction discoverTemplates(segments: string[], appDir: string): string[] {\n const templates: string[] = [];\n\n // Check root template\n const rootTemplate = findFile(appDir, \"template\");\n if (rootTemplate) templates.push(rootTemplate);\n\n // Check each directory level\n let currentDir = appDir;\n for (const segment of segments) {\n currentDir = path.join(currentDir, segment);\n const template = findFile(currentDir, \"template\");\n if (template) templates.push(template);\n }\n\n return templates;\n}\n\n/**\n * Discover error.tsx files aligned with the layouts array.\n * Walks the same directory levels as discoverLayouts and, for each level\n * that contributes a layout entry, checks whether error.tsx also exists.\n * Returns an array of the same length as discoverLayouts() would return,\n * with the error path (or null) at each corresponding layout level.\n *\n * This enables interleaving ErrorBoundary components with layouts in the\n * rendering tree, matching Next.js behavior where each segment independently\n * wraps its children with an error boundary.\n */\nfunction discoverLayoutAlignedErrors(\n segments: string[],\n appDir: string,\n): (string | null)[] {\n const errors: (string | null)[] = [];\n\n // Root level (only if root has a layout — matching discoverLayouts logic)\n const rootLayout = findFile(appDir, \"layout\");\n if (rootLayout) {\n errors.push(findFile(appDir, \"error\"));\n }\n\n // Check each directory level\n let currentDir = appDir;\n for (const segment of segments) {\n currentDir = path.join(currentDir, segment);\n const layout = findFile(currentDir, \"layout\");\n if (layout) {\n errors.push(findFile(currentDir, \"error\"));\n }\n }\n\n return errors;\n}\n\n/**\n * Discover the nearest boundary file (not-found, forbidden, unauthorized)\n * by walking from the route's directory up to the app root.\n * Returns the first (closest) file found, or null.\n */\nfunction discoverBoundaryFile(\n segments: string[],\n appDir: string,\n fileName: string,\n): string | null {\n // Build all directory paths from leaf to root\n const dirs: string[] = [];\n let dir = appDir;\n dirs.push(dir);\n for (const segment of segments) {\n dir = path.join(dir, segment);\n dirs.push(dir);\n }\n\n // Walk from leaf (last) to root (first)\n for (let i = dirs.length - 1; i >= 0; i--) {\n const f = findFile(dirs[i], fileName);\n if (f) return f;\n }\n return null;\n}\n\n/**\n * Discover boundary files (not-found, forbidden, unauthorized) at each layout directory.\n * Returns an array aligned with the layouts array, where each entry is the boundary\n * file at that layout's directory, or null if none exists there.\n *\n * This is used for per-layout error boundaries. In Next.js, each layout level\n * has its own boundary that wraps the layout's children. When notFound() is thrown\n * from a layout, it propagates up to the parent layout's boundary.\n */\nfunction discoverBoundaryFilePerLayout(\n layouts: string[],\n fileName: string,\n): (string | null)[] {\n return layouts.map((layoutPath) => {\n const layoutDir = path.dirname(layoutPath);\n return findFile(layoutDir, fileName);\n });\n}\n\n/**\n * Discover parallel slots inherited from ancestor directories.\n *\n * In Next.js, parallel slots belong to the layout that defines them. When a\n * child route is rendered, its parent layout's slots must still be present.\n * If the child doesn't have matching content in a slot, the slot's default.tsx\n * is rendered instead.\n *\n * Walk from appDir through each segment to the route's directory. At each level\n * that has @slot dirs, collect them. Slots at the route's own directory level\n * use page.tsx; slots at ancestor levels use default.tsx only.\n */\nfunction discoverInheritedParallelSlots(\n segments: string[],\n appDir: string,\n routeDir: string,\n): ParallelSlot[] {\n const slotMap = new Map<string, ParallelSlot>();\n\n // Walk from appDir through each segment, tracking layout indices.\n // layoutIndex tracks which position in the route's layouts[] array corresponds\n // to a given directory. Only directories with a layout.tsx file increment.\n let currentDir = appDir;\n const dirsToCheck: { dir: string; layoutIdx: number }[] = [];\n let layoutIdx = findFile(appDir, \"layout\") ? 0 : -1;\n dirsToCheck.push({ dir: appDir, layoutIdx: Math.max(layoutIdx, 0) });\n\n for (const segment of segments) {\n currentDir = path.join(currentDir, segment);\n if (findFile(currentDir, \"layout\")) {\n layoutIdx++;\n }\n dirsToCheck.push({ dir: currentDir, layoutIdx: Math.max(layoutIdx, 0) });\n }\n\n for (const { dir, layoutIdx: lvlLayoutIdx } of dirsToCheck) {\n const isOwnDir = dir === routeDir;\n const slotsAtLevel = discoverParallelSlots(dir, appDir);\n\n for (const slot of slotsAtLevel) {\n if (isOwnDir) {\n // At the route's own directory: use page.tsx (normal behavior)\n slot.layoutIndex = lvlLayoutIdx;\n slotMap.set(slot.name, slot);\n } else {\n // At an ancestor directory: use default.tsx as the page, not page.tsx\n // (the slot's page.tsx is for the parent route, not this child route)\n const inheritedSlot: ParallelSlot = {\n ...slot,\n pagePath: null, // Don't use ancestor's page.tsx\n layoutIndex: lvlLayoutIdx,\n // defaultPath, loadingPath, errorPath, interceptingRoutes remain\n };\n // Only inherit if we haven't seen this slot at a closer level\n if (!slotMap.has(slot.name)) {\n slotMap.set(slot.name, inheritedSlot);\n }\n }\n }\n }\n\n return Array.from(slotMap.values());\n}\n\n/**\n * Discover parallel route slots (@team, @analytics, etc.) in a directory.\n * Returns a ParallelSlot for each @-prefixed subdirectory that has a page or default component.\n */\nfunction discoverParallelSlots(dir: string, appDir: string): ParallelSlot[] {\n if (!fs.existsSync(dir)) return [];\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n const slots: ParallelSlot[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory() || !entry.name.startsWith(\"@\")) continue;\n\n const slotName = entry.name.slice(1); // \"@team\" -> \"team\"\n const slotDir = path.join(dir, entry.name);\n\n const pagePath = findFile(slotDir, \"page\");\n const defaultPath = findFile(slotDir, \"default\");\n const interceptingRoutes = discoverInterceptingRoutes(slotDir, dir, appDir);\n\n // Only include slots that have at least a page, default, or intercepting route\n if (!pagePath && !defaultPath && interceptingRoutes.length === 0) continue;\n\n slots.push({\n name: slotName,\n pagePath,\n defaultPath,\n layoutPath: findFile(slotDir, \"layout\"),\n loadingPath: findFile(slotDir, \"loading\"),\n errorPath: findFile(slotDir, \"error\"),\n interceptingRoutes,\n layoutIndex: -1, // Will be set by discoverInheritedParallelSlots\n });\n }\n\n return slots;\n}\n\n/**\n * The interception convention prefix patterns.\n * (.) — same level, (..) — one level up, (..)(..)\" — two levels up, (...) — root\n */\nconst INTERCEPT_PATTERNS = [\n { prefix: \"(...)\", convention: \"...\" },\n { prefix: \"(..)(..)\", convention: \"../..\" },\n { prefix: \"(..)\", convention: \"..\" },\n { prefix: \"(.)\", convention: \".\" },\n] as const;\n\n/**\n * Discover intercepting routes inside a parallel slot directory.\n *\n * Intercepting routes use conventions like (.)photo, (..)feed, (...), etc.\n * They intercept navigation to another route and render within the slot instead.\n *\n * @param slotDir - The parallel slot directory (e.g. app/feed/@modal)\n * @param routeDir - The directory of the route that owns this slot (e.g. app/feed)\n * @param appDir - The root app directory\n */\nfunction discoverInterceptingRoutes(\n slotDir: string,\n routeDir: string,\n appDir: string,\n): InterceptingRoute[] {\n if (!fs.existsSync(slotDir)) return [];\n\n const results: InterceptingRoute[] = [];\n\n // Recursively scan for page files inside intercepting directories\n scanForInterceptingPages(slotDir, routeDir, appDir, results);\n\n return results;\n}\n\n/**\n * Recursively scan a directory tree for page.tsx files that are inside\n * intercepting route directories.\n */\nfunction scanForInterceptingPages(\n currentDir: string,\n routeDir: string,\n appDir: string,\n results: InterceptingRoute[],\n): void {\n if (!fs.existsSync(currentDir)) return;\n\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n // Check if this directory name starts with an interception convention\n const interceptMatch = matchInterceptConvention(entry.name);\n\n if (interceptMatch) {\n // This directory is the start of an intercepting route\n // e.g. \"(.)photos\" means intercept same-level \"photos\" route\n const restOfName = entry.name.slice(interceptMatch.prefix.length);\n const interceptDir = path.join(currentDir, entry.name);\n\n // Find page files within this intercepting directory tree\n collectInterceptingPages(\n interceptDir,\n interceptDir,\n interceptMatch.convention,\n restOfName,\n routeDir,\n appDir,\n results,\n );\n } else {\n // Regular subdirectory — keep scanning for intercepting dirs\n scanForInterceptingPages(\n path.join(currentDir, entry.name),\n routeDir,\n appDir,\n results,\n );\n }\n }\n}\n\n/**\n * Match a directory name against interception convention prefixes.\n */\nfunction matchInterceptConvention(\n name: string,\n): { prefix: string; convention: string } | null {\n for (const pattern of INTERCEPT_PATTERNS) {\n if (name.startsWith(pattern.prefix)) {\n return pattern;\n }\n }\n return null;\n}\n\n/**\n * Collect page.tsx files inside an intercepting route directory tree\n * and compute their target URL patterns.\n */\nfunction collectInterceptingPages(\n currentDir: string,\n interceptRoot: string,\n convention: string,\n interceptSegment: string,\n routeDir: string,\n appDir: string,\n results: InterceptingRoute[],\n): void {\n // Check for page.tsx in current directory\n const page = findFile(currentDir, \"page\");\n if (page) {\n const targetPattern = computeInterceptTarget(\n convention,\n interceptSegment,\n currentDir,\n interceptRoot,\n routeDir,\n appDir,\n );\n if (targetPattern) {\n results.push({\n convention,\n targetPattern: targetPattern.pattern,\n pagePath: page,\n params: targetPattern.params,\n });\n }\n }\n\n // Recurse into subdirectories for nested intercepting routes\n if (!fs.existsSync(currentDir)) return;\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n collectInterceptingPages(\n path.join(currentDir, entry.name),\n interceptRoot,\n convention,\n interceptSegment,\n routeDir,\n appDir,\n results,\n );\n }\n}\n\n/**\n * Compute the target URL pattern for an intercepting route.\n *\n * - (.) same level: resolve relative to routeDir\n * - (..) one level up: resolve relative to parent of routeDir\n * - (..)(..)\" two levels up: resolve relative to grandparent of routeDir\n * - (...) root: resolve from appDir\n */\nfunction computeInterceptTarget(\n convention: string,\n interceptSegment: string,\n currentDir: string,\n interceptRoot: string,\n routeDir: string,\n appDir: string,\n): { pattern: string; params: string[] } | null {\n // Determine the base directory for target resolution\n let baseDir: string;\n switch (convention) {\n case \".\":\n baseDir = routeDir;\n break;\n case \"..\":\n baseDir = path.dirname(routeDir);\n break;\n case \"../..\":\n baseDir = path.dirname(path.dirname(routeDir));\n break;\n case \"...\":\n baseDir = appDir;\n break;\n default:\n return null;\n }\n\n // Build the target URL segments from baseDir relative to appDir\n const baseParts = path\n .relative(appDir, baseDir)\n .split(path.sep)\n .filter(Boolean);\n\n // Add the intercept segment and any nested path segments\n const nestedParts = path\n .relative(interceptRoot, currentDir)\n .split(path.sep)\n .filter(Boolean);\n const allSegments = [...baseParts, interceptSegment, ...nestedParts];\n\n // Convert segments to URL pattern\n const urlSegments: string[] = [];\n const params: string[] = [];\n\n for (const segment of allSegments) {\n if (segment === \".\") continue;\n // Route groups and @ slots are transparent\n if (segment.startsWith(\"(\") && segment.endsWith(\")\")) continue;\n if (segment.startsWith(\"@\")) continue;\n\n // Dynamic segments\n const catchAllMatch = segment.match(/^\\[\\.\\.\\.(\\w+)\\]$/);\n if (catchAllMatch) {\n params.push(catchAllMatch[1]);\n urlSegments.push(`:${catchAllMatch[1]}+`);\n continue;\n }\n const optionalCatchAllMatch = segment.match(/^\\[\\[\\.\\.\\.(\\w+)\\]\\]$/);\n if (optionalCatchAllMatch) {\n params.push(optionalCatchAllMatch[1]);\n urlSegments.push(`:${optionalCatchAllMatch[1]}*`);\n continue;\n }\n const dynamicMatch = segment.match(/^\\[(\\w+)\\]$/);\n if (dynamicMatch) {\n params.push(dynamicMatch[1]);\n urlSegments.push(`:${dynamicMatch[1]}`);\n continue;\n }\n\n // Decode URL-encoded directory names (e.g., %5Fsites -> _sites)\n try {\n urlSegments.push(decodeURIComponent(segment));\n } catch {\n urlSegments.push(segment);\n }\n }\n\n const pattern = \"/\" + urlSegments.join(\"/\");\n return { pattern: pattern === \"/\" ? \"/\" : pattern, params };\n}\n\n/**\n * Find a file by name (without extension) in a directory.\n * Checks .tsx, .ts, .jsx, .js extensions.\n */\nfunction findFile(dir: string, name: string): string | null {\n const extensions = [\".tsx\", \".ts\", \".jsx\", \".js\"];\n for (const ext of extensions) {\n const filePath = path.join(dir, name + ext);\n if (fs.existsSync(filePath)) return filePath;\n }\n return null;\n}\n\n/**\n * Match a URL against App Router routes.\n */\nexport function matchAppRoute(\n url: string,\n routes: AppRoute[],\n): { route: AppRoute; params: Record<string, string | string[]> } | null {\n const pathname = url.split(\"?\")[0];\n let normalizedUrl = pathname === \"/\" ? \"/\" : pathname.replace(/\\/$/, \"\");\n try {\n normalizedUrl = decodeURIComponent(normalizedUrl);\n } catch {\n /* malformed percent-encoding — match as-is */\n }\n\n for (const route of routes) {\n const params = matchPattern(normalizedUrl, route.pattern);\n if (params !== null) {\n return { route, params };\n }\n }\n\n return null;\n}\n\nfunction matchPattern(\n url: string,\n pattern: string,\n): Record<string, string | string[]> | null {\n const urlParts = url.split(\"/\").filter(Boolean);\n const patternParts = pattern.split(\"/\").filter(Boolean);\n\n const params: Record<string, string | string[]> = Object.create(null);\n\n for (let i = 0; i < patternParts.length; i++) {\n const pp = patternParts[i];\n\n if (pp.endsWith(\"+\")) {\n const paramName = pp.slice(1, -1);\n const remaining = urlParts.slice(i);\n if (remaining.length === 0) return null;\n params[paramName] = remaining;\n return params;\n }\n\n if (pp.endsWith(\"*\")) {\n const paramName = pp.slice(1, -1);\n const remaining = urlParts.slice(i);\n params[paramName] = remaining;\n return params;\n }\n\n if (pp.startsWith(\":\")) {\n const paramName = pp.slice(1);\n if (i >= urlParts.length) return null;\n params[paramName] = urlParts[i];\n continue;\n }\n\n if (i >= urlParts.length || urlParts[i] !== pp) return null;\n }\n\n if (urlParts.length !== patternParts.length) return null;\n\n return params;\n}\n\n/**\n * Route precedence — lower score is higher priority.\n * Matches Next.js specificity rules:\n * 1. Static routes first (scored by segment count, more = more specific)\n * 2. Dynamic segments penalized by position\n * 3. Catch-all comes after dynamic\n * 4. Optional catch-all last\n * 5. Lexicographic tiebreaker for determinism\n *\n * Key insight: routes with static prefix segments should have higher priority\n * than catch-all routes without them. E.g., /_sites/:subdomain/:slug* should\n * match before /:slug* because \"_sites\" must match exactly.\n */\nfunction routePrecedence(pattern: string): number {\n const parts = pattern.split(\"/\").filter(Boolean);\n let score = 0;\n let staticPrefixCount = 0;\n\n // Count static prefix segments (before first dynamic/catch-all)\n for (const p of parts) {\n if (p.startsWith(\":\") || p.endsWith(\"+\") || p.endsWith(\"*\")) break;\n staticPrefixCount++;\n }\n\n // Static prefix segments dramatically reduce score (increase priority).\n // Each static prefix segment gives -10000 priority boost.\n score -= staticPrefixCount * 10000;\n\n for (let i = 0; i < parts.length; i++) {\n const p = parts[i];\n if (p.endsWith(\"+\")) {\n score += 1000 + i; // catch-all: moderate penalty\n } else if (p.endsWith(\"*\")) {\n score += 2000 + i; // optional catch-all: high penalty\n } else if (p.startsWith(\":\")) {\n score += 100 + i; // dynamic: small penalty by position\n }\n // static segments after first dynamic don't contribute extra\n }\n return score;\n}\n"]}