vinext 0.0.24 → 0.0.25

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.
Files changed (92) hide show
  1. package/README.md +24 -0
  2. package/dist/check.d.ts.map +1 -1
  3. package/dist/check.js +3 -2
  4. package/dist/check.js.map +1 -1
  5. package/dist/client/entry.js +1 -1
  6. package/dist/client/entry.js.map +1 -1
  7. package/dist/config/config-matchers.d.ts +21 -0
  8. package/dist/config/config-matchers.d.ts.map +1 -1
  9. package/dist/config/config-matchers.js +46 -6
  10. package/dist/config/config-matchers.js.map +1 -1
  11. package/dist/config/next-config.d.ts +8 -2
  12. package/dist/config/next-config.d.ts.map +1 -1
  13. package/dist/config/next-config.js +90 -35
  14. package/dist/config/next-config.js.map +1 -1
  15. package/dist/deploy.d.ts +10 -0
  16. package/dist/deploy.d.ts.map +1 -1
  17. package/dist/deploy.js +70 -35
  18. package/dist/deploy.js.map +1 -1
  19. package/dist/index.d.ts +3 -0
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +172 -18
  22. package/dist/index.js.map +1 -1
  23. package/dist/plugins/async-hooks-stub.d.ts +16 -0
  24. package/dist/plugins/async-hooks-stub.d.ts.map +1 -0
  25. package/dist/plugins/async-hooks-stub.js +45 -0
  26. package/dist/plugins/async-hooks-stub.js.map +1 -0
  27. package/dist/routing/app-router.d.ts +12 -6
  28. package/dist/routing/app-router.d.ts.map +1 -1
  29. package/dist/routing/app-router.js +19 -40
  30. package/dist/routing/app-router.js.map +1 -1
  31. package/dist/routing/pages-router.d.ts.map +1 -1
  32. package/dist/routing/pages-router.js +3 -9
  33. package/dist/routing/pages-router.js.map +1 -1
  34. package/dist/routing/utils.d.ts +9 -0
  35. package/dist/routing/utils.d.ts.map +1 -1
  36. package/dist/routing/utils.js +10 -0
  37. package/dist/routing/utils.js.map +1 -1
  38. package/dist/server/api-handler.d.ts.map +1 -1
  39. package/dist/server/api-handler.js +6 -0
  40. package/dist/server/api-handler.js.map +1 -1
  41. package/dist/server/app-dev-server.d.ts +2 -2
  42. package/dist/server/app-dev-server.d.ts.map +1 -1
  43. package/dist/server/app-dev-server.js +238 -114
  44. package/dist/server/app-dev-server.js.map +1 -1
  45. package/dist/server/dev-module-runner.d.ts +84 -0
  46. package/dist/server/dev-module-runner.d.ts.map +1 -0
  47. package/dist/server/dev-module-runner.js +105 -0
  48. package/dist/server/dev-module-runner.js.map +1 -0
  49. package/dist/server/dev-server.js.map +1 -1
  50. package/dist/server/instrumentation.d.ts +52 -9
  51. package/dist/server/instrumentation.d.ts.map +1 -1
  52. package/dist/server/instrumentation.js +52 -15
  53. package/dist/server/instrumentation.js.map +1 -1
  54. package/dist/server/middleware.d.ts +7 -3
  55. package/dist/server/middleware.d.ts.map +1 -1
  56. package/dist/server/middleware.js +16 -6
  57. package/dist/server/middleware.js.map +1 -1
  58. package/dist/server/prod-server.d.ts.map +1 -1
  59. package/dist/server/prod-server.js +15 -25
  60. package/dist/server/prod-server.js.map +1 -1
  61. package/dist/shims/cache.d.ts.map +1 -1
  62. package/dist/shims/cache.js +14 -2
  63. package/dist/shims/cache.js.map +1 -1
  64. package/dist/shims/fetch-cache.d.ts.map +1 -1
  65. package/dist/shims/fetch-cache.js +139 -29
  66. package/dist/shims/fetch-cache.js.map +1 -1
  67. package/dist/shims/form.d.ts.map +1 -1
  68. package/dist/shims/form.js +2 -3
  69. package/dist/shims/form.js.map +1 -1
  70. package/dist/shims/layout-segment-context.d.ts +5 -4
  71. package/dist/shims/layout-segment-context.d.ts.map +1 -1
  72. package/dist/shims/layout-segment-context.js +6 -5
  73. package/dist/shims/layout-segment-context.js.map +1 -1
  74. package/dist/shims/link.d.ts.map +1 -1
  75. package/dist/shims/link.js +32 -17
  76. package/dist/shims/link.js.map +1 -1
  77. package/dist/shims/navigation.d.ts +14 -11
  78. package/dist/shims/navigation.d.ts.map +1 -1
  79. package/dist/shims/navigation.js +122 -102
  80. package/dist/shims/navigation.js.map +1 -1
  81. package/dist/shims/router.d.ts.map +1 -1
  82. package/dist/shims/router.js +37 -21
  83. package/dist/shims/router.js.map +1 -1
  84. package/dist/shims/server.d.ts +2 -0
  85. package/dist/shims/server.d.ts.map +1 -1
  86. package/dist/shims/server.js +4 -0
  87. package/dist/shims/server.js.map +1 -1
  88. package/dist/shims/url-utils.d.ts +13 -0
  89. package/dist/shims/url-utils.d.ts.map +1 -0
  90. package/dist/shims/url-utils.js +28 -0
  91. package/dist/shims/url-utils.js.map +1 -0
  92. package/package.json +1 -1
package/README.md CHANGED
@@ -163,6 +163,30 @@ We track the public Next.js API surface and add support for new stable features.
163
163
 
164
164
  vinext has native integration with Cloudflare Workers through `@cloudflare/vite-plugin`, including bindings access via `cloudflare:workers`, KV caching, image optimization, and the `vinext deploy` one-command workflow.
165
165
 
166
+ #### Prerequisites
167
+
168
+ Before running `vinext deploy` for the first time you need to authenticate with Cloudflare and tell wrangler which account to deploy to.
169
+
170
+ **Authentication — pick one:**
171
+
172
+ - **`wrangler login`** (recommended for local development) — opens a browser window to authenticate. Run it once and wrangler caches the token.
173
+ - **`CLOUDFLARE_API_TOKEN` env var** (CI / non-interactive) — create a token at [dash.cloudflare.com/profile/api-tokens](https://dash.cloudflare.com/profile/api-tokens) using the **Edit Cloudflare Workers** template. That template grants all the permissions `vinext deploy` needs.
174
+
175
+ **Account ID:**
176
+
177
+ wrangler needs to know which Cloudflare account to deploy to. Add your account ID to `wrangler.jsonc`:
178
+
179
+ ```jsonc
180
+ {
181
+ "account_id": "<your-account-id>",
182
+ ...
183
+ }
184
+ ```
185
+
186
+ Find your account ID in the Cloudflare dashboard URL (`dash.cloudflare.com/<account-id>`) or by running `wrangler whoami` after logging in.
187
+
188
+ Alternatively, set the `CLOUDFLARE_ACCOUNT_ID` environment variable instead of hardcoding it in the config file.
189
+
166
190
  `vinext deploy` auto-generates the necessary configuration files (`vite.config.ts`, `wrangler.jsonc`, `worker/index.ts`) if they don't exist, builds the application, and deploys to Workers.
167
191
 
168
192
  ```bash
@@ -1 +1 @@
1
- {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,KAAK,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,aAAa,CAAC;AAEtD,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,SAAS,EAAE,SAAS,EAAE,CAAC;IACvB,WAAW,EAAE,SAAS,EAAE,CAAC;IACzB,OAAO,EAAE;QACP,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAoGD;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CAyDrD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CA4DvD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CAyBxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CAkI1D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAqBlD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAgG7F"}
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,KAAK,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,aAAa,CAAC;AAEtD,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,SAAS,EAAE,SAAS,EAAE,CAAC;IACvB,WAAW,EAAE,SAAS,EAAE,CAAC;IACzB,OAAO,EAAE;QACP,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAqGD;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CAyDrD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CA4DvD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CAyBxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CAkI1D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAqBlD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAgG7F"}
package/dist/check.js CHANGED
@@ -42,6 +42,7 @@ const CONFIG_SUPPORT = {
42
42
  i18n: { status: "supported", detail: "path-prefix routing (domains not yet supported)" },
43
43
  env: { status: "supported" },
44
44
  images: { status: "partial", detail: "remotePatterns validated, no local optimization" },
45
+ allowedDevOrigins: { status: "supported", detail: "dev server cross-origin allowlist" },
45
46
  output: { status: "supported", detail: "'export' and 'standalone' modes" },
46
47
  transpilePackages: { status: "supported", detail: "Vite handles this natively" },
47
48
  webpack: { status: "unsupported", detail: "Vite replaces webpack — custom webpack configs need migration" },
@@ -58,7 +59,7 @@ const LIBRARY_SUPPORT = {
58
59
  nuqs: { status: "supported" },
59
60
  "next-view-transitions": { status: "supported" },
60
61
  "@vercel/analytics": { status: "supported", detail: "analytics script injected client-side" },
61
- "next-intl": { status: "partial", detail: "works with middleware-based setup, some server component features may differ" },
62
+ "next-intl": { status: "partial", detail: "App Router works with next-intl/plugin + i18n/request.ts; some server component features may differ" },
62
63
  "@clerk/nextjs": { status: "unsupported", detail: "deep Next.js middleware integration not compatible" },
63
64
  "@auth/nextjs": { status: "unsupported", detail: "relies on Next.js internal auth handlers; consider migrating to better-auth" },
64
65
  "next-auth": { status: "unsupported", detail: "relies on Next.js API route internals; consider migrating to better-auth (see https://authjs.dev/getting-started/migrate-to-better-auth)" },
@@ -179,7 +180,7 @@ export function analyzeConfig(root) {
179
180
  // Check for known config options by searching for property names in the config file
180
181
  const configOptions = [
181
182
  "basePath", "trailingSlash", "redirects", "rewrites", "headers",
182
- "i18n", "env", "images", "output", "transpilePackages", "webpack",
183
+ "i18n", "env", "images", "allowedDevOrigins", "output", "transpilePackages", "webpack",
183
184
  "reactStrictMode", "poweredByHeader",
184
185
  ];
185
186
  for (const opt of configOptions) {
package/dist/check.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"check.js","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * vinext check — compatibility scanner for Next.js apps\n *\n * Scans an existing Next.js app and produces a compatibility report\n * showing what will work, what needs changes, and an overall score.\n */\n\nimport { detectPackageManager } from \"./utils/project.js\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\n// ── Support status definitions ─────────────────────────────────────────────\n\ntype Status = \"supported\" | \"partial\" | \"unsupported\";\n\ninterface CheckItem {\n name: string;\n status: Status;\n detail?: string;\n files?: string[];\n}\n\nexport interface CheckResult {\n imports: CheckItem[];\n config: CheckItem[];\n libraries: CheckItem[];\n conventions: CheckItem[];\n summary: {\n supported: number;\n partial: number;\n unsupported: number;\n total: number;\n score: number;\n };\n}\n\n// ── Import support map ─────────────────────────────────────────────────────\n\nconst IMPORT_SUPPORT: Record<string, { status: Status; detail?: string }> = {\n \"next\": { status: \"supported\", detail: \"type-only exports (Metadata, NextPage, etc.)\" },\n \"next/link\": { status: \"supported\" },\n \"next/image\": { status: \"supported\", detail: \"uses @unpic/react (no local optimization yet)\" },\n \"next/router\": { status: \"supported\" },\n \"next/navigation\": { status: \"supported\" },\n \"next/headers\": { status: \"supported\" },\n \"next/server\": { status: \"supported\", detail: \"NextRequest/NextResponse shimmed\" },\n \"next/cache\": { status: \"supported\", detail: \"revalidateTag, revalidatePath, unstable_cache, cacheLife, cacheTag\" },\n \"next/dynamic\": { status: \"supported\" },\n \"next/head\": { status: \"supported\" },\n \"next/script\": { status: \"supported\" },\n \"next/font/google\": { status: \"partial\", detail: \"fonts loaded from CDN, not self-hosted at build time\" },\n \"next/font/local\": { status: \"partial\", detail: \"font.className works but font.variable mode broken (CSS variable not set) — fonts fall back to system sans-serif\" },\n \"next/og\": { status: \"supported\", detail: \"ImageResponse via @vercel/og\" },\n \"next/config\": { status: \"supported\" },\n \"next/amp\": { status: \"unsupported\", detail: \"AMP is not supported\" },\n \"next/document\": { status: \"supported\", detail: \"custom _document.tsx\" },\n \"next/app\": { status: \"supported\", detail: \"custom _app.tsx\" },\n \"next/error\": { status: \"supported\" },\n \"next/third-parties/google\": { status: \"unsupported\", detail: \"third-party script optimization not implemented\" },\n \"server-only\": { status: \"supported\" },\n \"client-only\": { status: \"supported\" },\n};\n\n// ── Config support map ─────────────────────────────────────────────────────\n\nconst CONFIG_SUPPORT: Record<string, { status: Status; detail?: string }> = {\n basePath: { status: \"supported\" },\n trailingSlash: { status: \"supported\" },\n redirects: { status: \"supported\" },\n rewrites: { status: \"supported\" },\n headers: { status: \"supported\" },\n i18n: { status: \"supported\", detail: \"path-prefix routing (domains not yet supported)\" },\n env: { status: \"supported\" },\n images: { status: \"partial\", detail: \"remotePatterns validated, no local optimization\" },\n output: { status: \"supported\", detail: \"'export' and 'standalone' modes\" },\n transpilePackages: { status: \"supported\", detail: \"Vite handles this natively\" },\n webpack: { status: \"unsupported\", detail: \"Vite replaces webpack — custom webpack configs need migration\" },\n \"experimental.ppr\": { status: \"unsupported\", detail: \"partial prerendering not yet implemented\" },\n \"experimental.typedRoutes\": { status: \"unsupported\", detail: \"typed routes not implemented\" },\n \"experimental.serverActions\": { status: \"supported\", detail: \"server actions via 'use server' directive\" },\n \"i18n.domains\": { status: \"unsupported\", detail: \"domain-based i18n routing not implemented\" },\n reactStrictMode: { status: \"supported\", detail: \"always enabled\" },\n poweredByHeader: { status: \"supported\", detail: \"not sent (matching Next.js default when disabled)\" },\n};\n\n// ── Library support map ────────────────────────────────────────────────────\n\nconst LIBRARY_SUPPORT: Record<string, { status: Status; detail?: string }> = {\n \"next-themes\": { status: \"supported\" },\n nuqs: { status: \"supported\" },\n \"next-view-transitions\": { status: \"supported\" },\n \"@vercel/analytics\": { status: \"supported\", detail: \"analytics script injected client-side\" },\n \"next-intl\": { status: \"partial\", detail: \"works with middleware-based setup, some server component features may differ\" },\n \"@clerk/nextjs\": { status: \"unsupported\", detail: \"deep Next.js middleware integration not compatible\" },\n \"@auth/nextjs\": { status: \"unsupported\", detail: \"relies on Next.js internal auth handlers; consider migrating to better-auth\" },\n \"next-auth\": { status: \"unsupported\", detail: \"relies on Next.js API route internals; consider migrating to better-auth (see https://authjs.dev/getting-started/migrate-to-better-auth)\" },\n \"better-auth\": { status: \"supported\", detail: \"uses only public next/* APIs (headers, cookies, NextRequest/NextResponse)\" },\n \"@sentry/nextjs\": { status: \"partial\", detail: \"client-side works, server integration needs manual setup\" },\n \"@t3-oss/env-nextjs\": { status: \"supported\" },\n \"tailwindcss\": { status: \"supported\" },\n \"styled-components\": { status: \"partial\", detail: \"needs useServerInsertedHTML (not yet implemented)\" },\n \"@emotion/react\": { status: \"partial\", detail: \"needs useServerInsertedHTML (not yet implemented)\" },\n \"lucide-react\": { status: \"supported\" },\n \"framer-motion\": { status: \"supported\" },\n \"@radix-ui/react-dialog\": { status: \"supported\" },\n \"shadcn-ui\": { status: \"supported\" },\n zod: { status: \"supported\" },\n \"react-hook-form\": { status: \"supported\" },\n prisma: { status: \"supported\", detail: \"works on Cloudflare Workers with Prisma Accelerate\" },\n drizzle: { status: \"supported\", detail: \"works with D1 on Cloudflare Workers\" },\n};\n\n// ── Scanning functions ─────────────────────────────────────────────────────\n\n/**\n * Recursively find all source files in a directory.\n */\nfunction findSourceFiles(dir: string, extensions = [\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\"]): string[] {\n const results: string[] = [];\n if (!fs.existsSync(dir)) return results;\n\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()) {\n if (entry.name === \"node_modules\" || entry.name === \".next\" || entry.name === \"dist\" || entry.name === \".git\") continue;\n results.push(...findSourceFiles(fullPath, extensions));\n } else if (extensions.some(ext => entry.name.endsWith(ext))) {\n results.push(fullPath);\n }\n }\n return results;\n}\n\n/**\n * Scan source files for `import ... from 'next/...'` statements.\n */\nexport function scanImports(root: string): CheckItem[] {\n const files = findSourceFiles(root);\n const importUsage = new Map<string, string[]>();\n\n const importRegex = /(?:import\\s+(?:[\\w{},\\s*]+\\s+from\\s+)?|require\\s*\\()['\"]([^'\"]+)['\"]\\)?/g;\n // Skip `import type` and `import { type ... }` — they're erased at compile time\n const typeOnlyImportRegex = /import\\s+type\\s+/;\n\n for (const file of files) {\n const content = fs.readFileSync(file, \"utf-8\");\n let match;\n while ((match = importRegex.exec(content)) !== null) {\n const mod = match[1];\n // Skip type-only imports (no runtime effect)\n const lineStart = content.lastIndexOf(\"\\n\", match.index) + 1;\n const line = content.slice(lineStart, match.index + match[0].length);\n if (typeOnlyImportRegex.test(line)) continue;\n // Only track next/* imports and server-only/client-only\n if (mod.startsWith(\"next/\") || mod === \"next\" || mod === \"server-only\" || mod === \"client-only\") {\n // Normalize: next/font/google -> next/font/google\n const normalized = mod === \"next\" ? \"next\" : mod;\n if (!importUsage.has(normalized)) importUsage.set(normalized, []);\n const relFile = path.relative(root, file);\n if (!importUsage.get(normalized)!.includes(relFile)) {\n importUsage.get(normalized)!.push(relFile);\n }\n }\n }\n }\n\n const items: CheckItem[] = [];\n for (const [mod, usedFiles] of importUsage) {\n const support = IMPORT_SUPPORT[mod];\n if (support) {\n items.push({\n name: mod,\n status: support.status,\n detail: support.detail,\n files: usedFiles,\n });\n } else {\n items.push({\n name: mod,\n status: \"unsupported\",\n detail: \"not recognized by vinext\",\n files: usedFiles,\n });\n }\n }\n\n // Sort: unsupported first, then partial, then supported\n items.sort((a, b) => {\n const order: Record<Status, number> = { unsupported: 0, partial: 1, supported: 2 };\n return order[a.status] - order[b.status];\n });\n\n return items;\n}\n\n/**\n * Analyze next.config.js/mjs/ts for supported and unsupported options.\n */\nexport function analyzeConfig(root: string): CheckItem[] {\n const configFiles = [\"next.config.ts\", \"next.config.mjs\", \"next.config.js\", \"next.config.cjs\"];\n let configPath: string | null = null;\n for (const f of configFiles) {\n const p = path.join(root, f);\n if (fs.existsSync(p)) { configPath = p; break; }\n }\n\n if (!configPath) {\n return [{ name: \"next.config\", status: \"supported\", detail: \"no config file found (defaults are fine)\" }];\n }\n\n const content = fs.readFileSync(configPath, \"utf-8\");\n const items: CheckItem[] = [];\n\n // Check for known config options by searching for property names in the config file\n const configOptions = [\n \"basePath\", \"trailingSlash\", \"redirects\", \"rewrites\", \"headers\",\n \"i18n\", \"env\", \"images\", \"output\", \"transpilePackages\", \"webpack\",\n \"reactStrictMode\", \"poweredByHeader\",\n ];\n\n for (const opt of configOptions) {\n // Simple heuristic: check if the option name appears as a property in the config\n const regex = new RegExp(`\\\\b${opt}\\\\b`);\n if (regex.test(content)) {\n const support = CONFIG_SUPPORT[opt];\n if (support) {\n items.push({ name: opt, status: support.status, detail: support.detail });\n } else {\n items.push({ name: opt, status: \"unsupported\", detail: \"not recognized\" });\n }\n }\n }\n\n // Check for experimental options\n if (/experimental\\s*[:=]\\s*\\{/.test(content)) {\n if (/\\bppr\\b/.test(content)) {\n items.push({ name: \"experimental.ppr\", ...CONFIG_SUPPORT[\"experimental.ppr\"]! });\n }\n if (/\\btypedRoutes\\b/.test(content)) {\n items.push({ name: \"experimental.typedRoutes\", ...CONFIG_SUPPORT[\"experimental.typedRoutes\"]! });\n }\n if (/\\bserverActions\\b/.test(content)) {\n items.push({ name: \"experimental.serverActions\", ...CONFIG_SUPPORT[\"experimental.serverActions\"]! });\n }\n }\n\n // Check for i18n.domains\n if (/domains\\s*:/.test(content) && /i18n/.test(content)) {\n items.push({ name: \"i18n.domains\", ...CONFIG_SUPPORT[\"i18n.domains\"]! });\n }\n\n // Sort: unsupported first\n items.sort((a, b) => {\n const order: Record<Status, number> = { unsupported: 0, partial: 1, supported: 2 };\n return order[a.status] - order[b.status];\n });\n\n return items;\n}\n\n/**\n * Check package.json dependencies for known libraries.\n */\nexport function checkLibraries(root: string): CheckItem[] {\n const pkgPath = path.join(root, \"package.json\");\n if (!fs.existsSync(pkgPath)) return [];\n\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n const items: CheckItem[] = [];\n\n for (const [lib, support] of Object.entries(LIBRARY_SUPPORT)) {\n if (allDeps[lib]) {\n items.push({\n name: lib,\n status: support.status,\n detail: support.detail,\n });\n }\n }\n\n // Sort: unsupported first\n items.sort((a, b) => {\n const order: Record<Status, number> = { unsupported: 0, partial: 1, supported: 2 };\n return order[a.status] - order[b.status];\n });\n\n return items;\n}\n\n/**\n * Check file conventions (pages, app directory, middleware, etc.)\n */\nexport function checkConventions(root: string): CheckItem[] {\n const items: CheckItem[] = [];\n\n // Check for pages/ and app/ at root level, then fall back to src/\n const pagesDir = fs.existsSync(path.join(root, \"pages\"))\n ? path.join(root, \"pages\")\n : fs.existsSync(path.join(root, \"src\", \"pages\"))\n ? path.join(root, \"src\", \"pages\")\n : null;\n const appDirPath = fs.existsSync(path.join(root, \"app\"))\n ? path.join(root, \"app\")\n : fs.existsSync(path.join(root, \"src\", \"app\"))\n ? path.join(root, \"src\", \"app\")\n : null;\n\n const hasPages = pagesDir !== null;\n const hasApp = appDirPath !== null;\n const hasProxy = fs.existsSync(path.join(root, \"proxy.ts\")) || fs.existsSync(path.join(root, \"proxy.js\"));\n const hasMiddleware = fs.existsSync(path.join(root, \"middleware.ts\")) || fs.existsSync(path.join(root, \"middleware.js\"));\n\n if (hasPages) {\n const isSrc = pagesDir!.includes(path.join(\"src\", \"pages\"));\n items.push({ name: isSrc ? \"Pages Router (src/pages/)\" : \"Pages Router (pages/)\", status: \"supported\" });\n\n // Count pages\n const pageFiles = findSourceFiles(pagesDir!);\n const pages = pageFiles.filter(f => !f.includes(\"/api/\") && !f.includes(\"_app\") && !f.includes(\"_document\") && !f.includes(\"_error\"));\n const apiRoutes = pageFiles.filter(f => f.includes(\"/api/\"));\n items.push({ name: `${pages.length} page(s)`, status: \"supported\" });\n if (apiRoutes.length) {\n items.push({ name: `${apiRoutes.length} API route(s)`, status: \"supported\" });\n }\n\n // Check for _app, _document\n if (pageFiles.some(f => f.includes(\"_app\"))) {\n items.push({ name: \"Custom _app\", status: \"supported\" });\n }\n if (pageFiles.some(f => f.includes(\"_document\"))) {\n items.push({ name: \"Custom _document\", status: \"supported\" });\n }\n }\n\n if (hasApp) {\n const isSrc = appDirPath!.includes(path.join(\"src\", \"app\"));\n items.push({ name: isSrc ? \"App Router (src/app/)\" : \"App Router (app/)\", status: \"supported\" });\n\n const appFiles = findSourceFiles(appDirPath!);\n const pages = appFiles.filter(f => f.endsWith(\"page.tsx\") || f.endsWith(\"page.jsx\") || f.endsWith(\"page.ts\") || f.endsWith(\"page.js\"));\n const layouts = appFiles.filter(f => f.endsWith(\"layout.tsx\") || f.endsWith(\"layout.jsx\") || f.endsWith(\"layout.ts\") || f.endsWith(\"layout.js\"));\n const routes = appFiles.filter(f => f.endsWith(\"route.tsx\") || f.endsWith(\"route.ts\") || f.endsWith(\"route.js\"));\n const loadings = appFiles.filter(f => f.endsWith(\"loading.tsx\") || f.endsWith(\"loading.jsx\"));\n const errors = appFiles.filter(f => f.endsWith(\"error.tsx\") || f.endsWith(\"error.jsx\"));\n const notFounds = appFiles.filter(f => f.endsWith(\"not-found.tsx\") || f.endsWith(\"not-found.jsx\"));\n\n items.push({ name: `${pages.length} page(s)`, status: \"supported\" });\n if (layouts.length) items.push({ name: `${layouts.length} layout(s)`, status: \"supported\" });\n if (routes.length) items.push({ name: `${routes.length} route handler(s)`, status: \"supported\" });\n if (loadings.length) items.push({ name: `${loadings.length} loading boundary(ies)`, status: \"supported\" });\n if (errors.length) items.push({ name: `${errors.length} error boundary(ies)`, status: \"supported\" });\n if (notFounds.length) items.push({ name: `${notFounds.length} not-found page(s)`, status: \"supported\" });\n }\n\n if (hasProxy) {\n items.push({ name: \"proxy.ts (Next.js 16)\", status: \"supported\" });\n } else if (hasMiddleware) {\n items.push({ name: \"middleware.ts (deprecated in Next.js 16)\", status: \"supported\" });\n }\n\n if (!hasPages && !hasApp) {\n items.push({ name: \"No pages/ or app/ directory found\", status: \"unsupported\", detail: \"vinext requires a pages/ or app/ directory\" });\n }\n\n // Check for \"type\": \"module\" in package.json\n const pkgPath = path.join(root, \"package.json\");\n if (fs.existsSync(pkgPath)) {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n if (pkg.type !== \"module\") {\n items.push({\n name: 'Missing \"type\": \"module\" in package.json',\n status: \"unsupported\",\n detail: \"required for Vite — vinext init will add it automatically\",\n });\n }\n }\n\n // Scan for ViewTransition import from react\n const allSourceFiles = findSourceFiles(root);\n const viewTransitionRegex = /import\\s+\\{[^}]*\\bViewTransition\\b[^}]*\\}\\s+from\\s+['\"]react['\"]/;\n const viewTransitionFiles: string[] = [];\n for (const file of allSourceFiles) {\n const content = fs.readFileSync(file, \"utf-8\");\n if (viewTransitionRegex.test(content)) {\n viewTransitionFiles.push(path.relative(root, file));\n }\n }\n if (viewTransitionFiles.length > 0) {\n items.push({\n name: \"ViewTransition (React canary API)\",\n status: \"partial\",\n detail: \"vinext auto-shims with a passthrough fallback, view transitions won't animate\",\n files: viewTransitionFiles,\n });\n }\n\n // Check PostCSS config for string-form plugins\n const postcssConfigs = [\"postcss.config.mjs\", \"postcss.config.js\", \"postcss.config.cjs\"];\n for (const configFile of postcssConfigs) {\n const configPath = path.join(root, configFile);\n if (fs.existsSync(configPath)) {\n const content = fs.readFileSync(configPath, \"utf-8\");\n // Detect string-form plugins: plugins: [\"...\"] or plugins: ['...']\n const stringPluginRegex = /plugins\\s*:\\s*\\[[\\s\\S]*?(['\"][^'\"]+['\"])[\\s\\S]*?\\]/;\n const match = stringPluginRegex.exec(content);\n if (match) {\n // Check it's not require() or import() form — just bare string literals in the array\n const pluginsBlock = match[0];\n // If plugins array contains string literals not wrapped in require()\n if (/plugins\\s*:\\s*\\[[\\s\\n]*['\"]/.test(pluginsBlock)) {\n items.push({\n name: `PostCSS string-form plugins (${configFile})`,\n status: \"partial\",\n detail: \"string-form PostCSS plugins need resolution — vinext handles this automatically\",\n });\n }\n }\n break; // Only check the first config file found\n }\n }\n\n return items;\n}\n\n/**\n * Run the full compatibility check.\n */\nexport function runCheck(root: string): CheckResult {\n const imports = scanImports(root);\n const config = analyzeConfig(root);\n const libraries = checkLibraries(root);\n const conventions = checkConventions(root);\n\n const allItems = [...imports, ...config, ...libraries, ...conventions];\n const supported = allItems.filter(i => i.status === \"supported\").length;\n const partial = allItems.filter(i => i.status === \"partial\").length;\n const unsupported = allItems.filter(i => i.status === \"unsupported\").length;\n const total = allItems.length;\n // Score: supported = 1, partial = 0.5, unsupported = 0\n const score = total > 0 ? Math.round(((supported + partial * 0.5) / total) * 100) : 100;\n\n return {\n imports,\n config,\n libraries,\n conventions,\n summary: { supported, partial, unsupported, total, score },\n };\n}\n\n/**\n * Format the check result as a colored terminal report.\n */\nexport function formatReport(result: CheckResult, opts?: { calledFromInit?: boolean }): string {\n const lines: string[] = [];\n const statusIcon = (s: Status) => s === \"supported\" ? \"\\x1b[32m✓\\x1b[0m\" : s === \"partial\" ? \"\\x1b[33m~\\x1b[0m\" : \"\\x1b[31m✗\\x1b[0m\";\n\n lines.push(\"\");\n lines.push(\" \\x1b[1mvinext compatibility report\\x1b[0m\");\n lines.push(\" \" + \"=\".repeat(40));\n lines.push(\"\");\n\n // Imports\n if (result.imports.length > 0) {\n const importSupported = result.imports.filter(i => i.status === \"supported\").length;\n lines.push(` \\x1b[1mImports\\x1b[0m: ${importSupported}/${result.imports.length} fully supported`);\n for (const item of result.imports) {\n const suffix = item.detail ? ` \\x1b[90m— ${item.detail}\\x1b[0m` : \"\";\n const fileCount = item.files ? ` \\x1b[90m(${item.files.length} file${item.files.length === 1 ? \"\" : \"s\"})\\x1b[0m` : \"\";\n lines.push(` ${statusIcon(item.status)} ${item.name}${fileCount}${suffix}`);\n }\n lines.push(\"\");\n }\n\n // Config\n if (result.config.length > 0) {\n const configSupported = result.config.filter(i => i.status === \"supported\").length;\n lines.push(` \\x1b[1mConfig\\x1b[0m: ${configSupported}/${result.config.length} options supported`);\n for (const item of result.config) {\n const suffix = item.detail ? ` \\x1b[90m— ${item.detail}\\x1b[0m` : \"\";\n lines.push(` ${statusIcon(item.status)} ${item.name}${suffix}`);\n }\n lines.push(\"\");\n }\n\n // Libraries\n if (result.libraries.length > 0) {\n const libSupported = result.libraries.filter(i => i.status === \"supported\").length;\n lines.push(` \\x1b[1mLibraries\\x1b[0m: ${libSupported}/${result.libraries.length} compatible`);\n for (const item of result.libraries) {\n const suffix = item.detail ? ` \\x1b[90m— ${item.detail}\\x1b[0m` : \"\";\n lines.push(` ${statusIcon(item.status)} ${item.name}${suffix}`);\n }\n lines.push(\"\");\n }\n\n // Conventions\n if (result.conventions.length > 0) {\n lines.push(` \\x1b[1mProject structure\\x1b[0m:`);\n for (const item of result.conventions) {\n const suffix = item.detail ? ` \\x1b[90m— ${item.detail}\\x1b[0m` : \"\";\n lines.push(` ${statusIcon(item.status)} ${item.name}${suffix}`);\n }\n lines.push(\"\");\n }\n\n // Summary\n const { score, supported, partial, unsupported } = result.summary;\n const scoreColor = score >= 90 ? \"\\x1b[32m\" : score >= 70 ? \"\\x1b[33m\" : \"\\x1b[31m\";\n lines.push(\" \" + \"-\".repeat(40));\n lines.push(` \\x1b[1mOverall\\x1b[0m: ${scoreColor}${score}% compatible\\x1b[0m (${supported} supported, ${partial} partial, ${unsupported} issues)`);\n\n if (unsupported > 0) {\n lines.push(\"\");\n lines.push(\" \\x1b[1mIssues to address:\\x1b[0m\");\n const allItems = [...result.imports, ...result.config, ...result.libraries, ...result.conventions];\n for (const item of allItems) {\n if (item.status === \"unsupported\") {\n lines.push(` \\x1b[31m✗\\x1b[0m ${item.name}${item.detail ? ` — ${item.detail}` : \"\"}`);\n }\n }\n }\n\n if (result.summary.partial > 0) {\n lines.push(\"\");\n lines.push(\" \\x1b[1mPartial support (may need attention):\\x1b[0m\");\n const allItems = [...result.imports, ...result.config, ...result.libraries, ...result.conventions];\n for (const item of allItems) {\n if (item.status === \"partial\") {\n lines.push(` \\x1b[33m~\\x1b[0m ${item.name}${item.detail ? ` — ${item.detail}` : \"\"}`);\n }\n }\n }\n\n // Actionable next steps (skip when called from init — it prints its own summary)\n if (!opts?.calledFromInit) {\n lines.push(\"\");\n lines.push(\" \\x1b[1mRecommended next steps:\\x1b[0m\");\n lines.push(` Run \\x1b[36mvinext init\\x1b[0m to set up your project automatically`);\n lines.push(\"\");\n lines.push(\" Or manually:\");\n lines.push(` 1. Add \\x1b[36m\"type\": \"module\"\\x1b[0m to package.json`);\n lines.push(` 2. Install: \\x1b[36m${detectPackageManager(process.cwd())} vinext vite @vitejs/plugin-rsc\\x1b[0m`);\n lines.push(` 3. Create vite.config.ts (see docs)`);\n lines.push(` 4. Run: \\x1b[36mnpx vite dev\\x1b[0m`);\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n"]}
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * vinext check — compatibility scanner for Next.js apps\n *\n * Scans an existing Next.js app and produces a compatibility report\n * showing what will work, what needs changes, and an overall score.\n */\n\nimport { detectPackageManager } from \"./utils/project.js\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\n// ── Support status definitions ─────────────────────────────────────────────\n\ntype Status = \"supported\" | \"partial\" | \"unsupported\";\n\ninterface CheckItem {\n name: string;\n status: Status;\n detail?: string;\n files?: string[];\n}\n\nexport interface CheckResult {\n imports: CheckItem[];\n config: CheckItem[];\n libraries: CheckItem[];\n conventions: CheckItem[];\n summary: {\n supported: number;\n partial: number;\n unsupported: number;\n total: number;\n score: number;\n };\n}\n\n// ── Import support map ─────────────────────────────────────────────────────\n\nconst IMPORT_SUPPORT: Record<string, { status: Status; detail?: string }> = {\n \"next\": { status: \"supported\", detail: \"type-only exports (Metadata, NextPage, etc.)\" },\n \"next/link\": { status: \"supported\" },\n \"next/image\": { status: \"supported\", detail: \"uses @unpic/react (no local optimization yet)\" },\n \"next/router\": { status: \"supported\" },\n \"next/navigation\": { status: \"supported\" },\n \"next/headers\": { status: \"supported\" },\n \"next/server\": { status: \"supported\", detail: \"NextRequest/NextResponse shimmed\" },\n \"next/cache\": { status: \"supported\", detail: \"revalidateTag, revalidatePath, unstable_cache, cacheLife, cacheTag\" },\n \"next/dynamic\": { status: \"supported\" },\n \"next/head\": { status: \"supported\" },\n \"next/script\": { status: \"supported\" },\n \"next/font/google\": { status: \"partial\", detail: \"fonts loaded from CDN, not self-hosted at build time\" },\n \"next/font/local\": { status: \"partial\", detail: \"font.className works but font.variable mode broken (CSS variable not set) — fonts fall back to system sans-serif\" },\n \"next/og\": { status: \"supported\", detail: \"ImageResponse via @vercel/og\" },\n \"next/config\": { status: \"supported\" },\n \"next/amp\": { status: \"unsupported\", detail: \"AMP is not supported\" },\n \"next/document\": { status: \"supported\", detail: \"custom _document.tsx\" },\n \"next/app\": { status: \"supported\", detail: \"custom _app.tsx\" },\n \"next/error\": { status: \"supported\" },\n \"next/third-parties/google\": { status: \"unsupported\", detail: \"third-party script optimization not implemented\" },\n \"server-only\": { status: \"supported\" },\n \"client-only\": { status: \"supported\" },\n};\n\n// ── Config support map ─────────────────────────────────────────────────────\n\nconst CONFIG_SUPPORT: Record<string, { status: Status; detail?: string }> = {\n basePath: { status: \"supported\" },\n trailingSlash: { status: \"supported\" },\n redirects: { status: \"supported\" },\n rewrites: { status: \"supported\" },\n headers: { status: \"supported\" },\n i18n: { status: \"supported\", detail: \"path-prefix routing (domains not yet supported)\" },\n env: { status: \"supported\" },\n images: { status: \"partial\", detail: \"remotePatterns validated, no local optimization\" },\n allowedDevOrigins: { status: \"supported\", detail: \"dev server cross-origin allowlist\" },\n output: { status: \"supported\", detail: \"'export' and 'standalone' modes\" },\n transpilePackages: { status: \"supported\", detail: \"Vite handles this natively\" },\n webpack: { status: \"unsupported\", detail: \"Vite replaces webpack — custom webpack configs need migration\" },\n \"experimental.ppr\": { status: \"unsupported\", detail: \"partial prerendering not yet implemented\" },\n \"experimental.typedRoutes\": { status: \"unsupported\", detail: \"typed routes not implemented\" },\n \"experimental.serverActions\": { status: \"supported\", detail: \"server actions via 'use server' directive\" },\n \"i18n.domains\": { status: \"unsupported\", detail: \"domain-based i18n routing not implemented\" },\n reactStrictMode: { status: \"supported\", detail: \"always enabled\" },\n poweredByHeader: { status: \"supported\", detail: \"not sent (matching Next.js default when disabled)\" },\n};\n\n// ── Library support map ────────────────────────────────────────────────────\n\nconst LIBRARY_SUPPORT: Record<string, { status: Status; detail?: string }> = {\n \"next-themes\": { status: \"supported\" },\n nuqs: { status: \"supported\" },\n \"next-view-transitions\": { status: \"supported\" },\n \"@vercel/analytics\": { status: \"supported\", detail: \"analytics script injected client-side\" },\n \"next-intl\": { status: \"partial\", detail: \"App Router works with next-intl/plugin + i18n/request.ts; some server component features may differ\" },\n \"@clerk/nextjs\": { status: \"unsupported\", detail: \"deep Next.js middleware integration not compatible\" },\n \"@auth/nextjs\": { status: \"unsupported\", detail: \"relies on Next.js internal auth handlers; consider migrating to better-auth\" },\n \"next-auth\": { status: \"unsupported\", detail: \"relies on Next.js API route internals; consider migrating to better-auth (see https://authjs.dev/getting-started/migrate-to-better-auth)\" },\n \"better-auth\": { status: \"supported\", detail: \"uses only public next/* APIs (headers, cookies, NextRequest/NextResponse)\" },\n \"@sentry/nextjs\": { status: \"partial\", detail: \"client-side works, server integration needs manual setup\" },\n \"@t3-oss/env-nextjs\": { status: \"supported\" },\n \"tailwindcss\": { status: \"supported\" },\n \"styled-components\": { status: \"partial\", detail: \"needs useServerInsertedHTML (not yet implemented)\" },\n \"@emotion/react\": { status: \"partial\", detail: \"needs useServerInsertedHTML (not yet implemented)\" },\n \"lucide-react\": { status: \"supported\" },\n \"framer-motion\": { status: \"supported\" },\n \"@radix-ui/react-dialog\": { status: \"supported\" },\n \"shadcn-ui\": { status: \"supported\" },\n zod: { status: \"supported\" },\n \"react-hook-form\": { status: \"supported\" },\n prisma: { status: \"supported\", detail: \"works on Cloudflare Workers with Prisma Accelerate\" },\n drizzle: { status: \"supported\", detail: \"works with D1 on Cloudflare Workers\" },\n};\n\n// ── Scanning functions ─────────────────────────────────────────────────────\n\n/**\n * Recursively find all source files in a directory.\n */\nfunction findSourceFiles(dir: string, extensions = [\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\"]): string[] {\n const results: string[] = [];\n if (!fs.existsSync(dir)) return results;\n\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()) {\n if (entry.name === \"node_modules\" || entry.name === \".next\" || entry.name === \"dist\" || entry.name === \".git\") continue;\n results.push(...findSourceFiles(fullPath, extensions));\n } else if (extensions.some(ext => entry.name.endsWith(ext))) {\n results.push(fullPath);\n }\n }\n return results;\n}\n\n/**\n * Scan source files for `import ... from 'next/...'` statements.\n */\nexport function scanImports(root: string): CheckItem[] {\n const files = findSourceFiles(root);\n const importUsage = new Map<string, string[]>();\n\n const importRegex = /(?:import\\s+(?:[\\w{},\\s*]+\\s+from\\s+)?|require\\s*\\()['\"]([^'\"]+)['\"]\\)?/g;\n // Skip `import type` and `import { type ... }` — they're erased at compile time\n const typeOnlyImportRegex = /import\\s+type\\s+/;\n\n for (const file of files) {\n const content = fs.readFileSync(file, \"utf-8\");\n let match;\n while ((match = importRegex.exec(content)) !== null) {\n const mod = match[1];\n // Skip type-only imports (no runtime effect)\n const lineStart = content.lastIndexOf(\"\\n\", match.index) + 1;\n const line = content.slice(lineStart, match.index + match[0].length);\n if (typeOnlyImportRegex.test(line)) continue;\n // Only track next/* imports and server-only/client-only\n if (mod.startsWith(\"next/\") || mod === \"next\" || mod === \"server-only\" || mod === \"client-only\") {\n // Normalize: next/font/google -> next/font/google\n const normalized = mod === \"next\" ? \"next\" : mod;\n if (!importUsage.has(normalized)) importUsage.set(normalized, []);\n const relFile = path.relative(root, file);\n if (!importUsage.get(normalized)!.includes(relFile)) {\n importUsage.get(normalized)!.push(relFile);\n }\n }\n }\n }\n\n const items: CheckItem[] = [];\n for (const [mod, usedFiles] of importUsage) {\n const support = IMPORT_SUPPORT[mod];\n if (support) {\n items.push({\n name: mod,\n status: support.status,\n detail: support.detail,\n files: usedFiles,\n });\n } else {\n items.push({\n name: mod,\n status: \"unsupported\",\n detail: \"not recognized by vinext\",\n files: usedFiles,\n });\n }\n }\n\n // Sort: unsupported first, then partial, then supported\n items.sort((a, b) => {\n const order: Record<Status, number> = { unsupported: 0, partial: 1, supported: 2 };\n return order[a.status] - order[b.status];\n });\n\n return items;\n}\n\n/**\n * Analyze next.config.js/mjs/ts for supported and unsupported options.\n */\nexport function analyzeConfig(root: string): CheckItem[] {\n const configFiles = [\"next.config.ts\", \"next.config.mjs\", \"next.config.js\", \"next.config.cjs\"];\n let configPath: string | null = null;\n for (const f of configFiles) {\n const p = path.join(root, f);\n if (fs.existsSync(p)) { configPath = p; break; }\n }\n\n if (!configPath) {\n return [{ name: \"next.config\", status: \"supported\", detail: \"no config file found (defaults are fine)\" }];\n }\n\n const content = fs.readFileSync(configPath, \"utf-8\");\n const items: CheckItem[] = [];\n\n // Check for known config options by searching for property names in the config file\n const configOptions = [\n \"basePath\", \"trailingSlash\", \"redirects\", \"rewrites\", \"headers\",\n \"i18n\", \"env\", \"images\", \"allowedDevOrigins\", \"output\", \"transpilePackages\", \"webpack\",\n \"reactStrictMode\", \"poweredByHeader\",\n ];\n\n for (const opt of configOptions) {\n // Simple heuristic: check if the option name appears as a property in the config\n const regex = new RegExp(`\\\\b${opt}\\\\b`);\n if (regex.test(content)) {\n const support = CONFIG_SUPPORT[opt];\n if (support) {\n items.push({ name: opt, status: support.status, detail: support.detail });\n } else {\n items.push({ name: opt, status: \"unsupported\", detail: \"not recognized\" });\n }\n }\n }\n\n // Check for experimental options\n if (/experimental\\s*[:=]\\s*\\{/.test(content)) {\n if (/\\bppr\\b/.test(content)) {\n items.push({ name: \"experimental.ppr\", ...CONFIG_SUPPORT[\"experimental.ppr\"]! });\n }\n if (/\\btypedRoutes\\b/.test(content)) {\n items.push({ name: \"experimental.typedRoutes\", ...CONFIG_SUPPORT[\"experimental.typedRoutes\"]! });\n }\n if (/\\bserverActions\\b/.test(content)) {\n items.push({ name: \"experimental.serverActions\", ...CONFIG_SUPPORT[\"experimental.serverActions\"]! });\n }\n }\n\n // Check for i18n.domains\n if (/domains\\s*:/.test(content) && /i18n/.test(content)) {\n items.push({ name: \"i18n.domains\", ...CONFIG_SUPPORT[\"i18n.domains\"]! });\n }\n\n // Sort: unsupported first\n items.sort((a, b) => {\n const order: Record<Status, number> = { unsupported: 0, partial: 1, supported: 2 };\n return order[a.status] - order[b.status];\n });\n\n return items;\n}\n\n/**\n * Check package.json dependencies for known libraries.\n */\nexport function checkLibraries(root: string): CheckItem[] {\n const pkgPath = path.join(root, \"package.json\");\n if (!fs.existsSync(pkgPath)) return [];\n\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n const items: CheckItem[] = [];\n\n for (const [lib, support] of Object.entries(LIBRARY_SUPPORT)) {\n if (allDeps[lib]) {\n items.push({\n name: lib,\n status: support.status,\n detail: support.detail,\n });\n }\n }\n\n // Sort: unsupported first\n items.sort((a, b) => {\n const order: Record<Status, number> = { unsupported: 0, partial: 1, supported: 2 };\n return order[a.status] - order[b.status];\n });\n\n return items;\n}\n\n/**\n * Check file conventions (pages, app directory, middleware, etc.)\n */\nexport function checkConventions(root: string): CheckItem[] {\n const items: CheckItem[] = [];\n\n // Check for pages/ and app/ at root level, then fall back to src/\n const pagesDir = fs.existsSync(path.join(root, \"pages\"))\n ? path.join(root, \"pages\")\n : fs.existsSync(path.join(root, \"src\", \"pages\"))\n ? path.join(root, \"src\", \"pages\")\n : null;\n const appDirPath = fs.existsSync(path.join(root, \"app\"))\n ? path.join(root, \"app\")\n : fs.existsSync(path.join(root, \"src\", \"app\"))\n ? path.join(root, \"src\", \"app\")\n : null;\n\n const hasPages = pagesDir !== null;\n const hasApp = appDirPath !== null;\n const hasProxy = fs.existsSync(path.join(root, \"proxy.ts\")) || fs.existsSync(path.join(root, \"proxy.js\"));\n const hasMiddleware = fs.existsSync(path.join(root, \"middleware.ts\")) || fs.existsSync(path.join(root, \"middleware.js\"));\n\n if (hasPages) {\n const isSrc = pagesDir!.includes(path.join(\"src\", \"pages\"));\n items.push({ name: isSrc ? \"Pages Router (src/pages/)\" : \"Pages Router (pages/)\", status: \"supported\" });\n\n // Count pages\n const pageFiles = findSourceFiles(pagesDir!);\n const pages = pageFiles.filter(f => !f.includes(\"/api/\") && !f.includes(\"_app\") && !f.includes(\"_document\") && !f.includes(\"_error\"));\n const apiRoutes = pageFiles.filter(f => f.includes(\"/api/\"));\n items.push({ name: `${pages.length} page(s)`, status: \"supported\" });\n if (apiRoutes.length) {\n items.push({ name: `${apiRoutes.length} API route(s)`, status: \"supported\" });\n }\n\n // Check for _app, _document\n if (pageFiles.some(f => f.includes(\"_app\"))) {\n items.push({ name: \"Custom _app\", status: \"supported\" });\n }\n if (pageFiles.some(f => f.includes(\"_document\"))) {\n items.push({ name: \"Custom _document\", status: \"supported\" });\n }\n }\n\n if (hasApp) {\n const isSrc = appDirPath!.includes(path.join(\"src\", \"app\"));\n items.push({ name: isSrc ? \"App Router (src/app/)\" : \"App Router (app/)\", status: \"supported\" });\n\n const appFiles = findSourceFiles(appDirPath!);\n const pages = appFiles.filter(f => f.endsWith(\"page.tsx\") || f.endsWith(\"page.jsx\") || f.endsWith(\"page.ts\") || f.endsWith(\"page.js\"));\n const layouts = appFiles.filter(f => f.endsWith(\"layout.tsx\") || f.endsWith(\"layout.jsx\") || f.endsWith(\"layout.ts\") || f.endsWith(\"layout.js\"));\n const routes = appFiles.filter(f => f.endsWith(\"route.tsx\") || f.endsWith(\"route.ts\") || f.endsWith(\"route.js\"));\n const loadings = appFiles.filter(f => f.endsWith(\"loading.tsx\") || f.endsWith(\"loading.jsx\"));\n const errors = appFiles.filter(f => f.endsWith(\"error.tsx\") || f.endsWith(\"error.jsx\"));\n const notFounds = appFiles.filter(f => f.endsWith(\"not-found.tsx\") || f.endsWith(\"not-found.jsx\"));\n\n items.push({ name: `${pages.length} page(s)`, status: \"supported\" });\n if (layouts.length) items.push({ name: `${layouts.length} layout(s)`, status: \"supported\" });\n if (routes.length) items.push({ name: `${routes.length} route handler(s)`, status: \"supported\" });\n if (loadings.length) items.push({ name: `${loadings.length} loading boundary(ies)`, status: \"supported\" });\n if (errors.length) items.push({ name: `${errors.length} error boundary(ies)`, status: \"supported\" });\n if (notFounds.length) items.push({ name: `${notFounds.length} not-found page(s)`, status: \"supported\" });\n }\n\n if (hasProxy) {\n items.push({ name: \"proxy.ts (Next.js 16)\", status: \"supported\" });\n } else if (hasMiddleware) {\n items.push({ name: \"middleware.ts (deprecated in Next.js 16)\", status: \"supported\" });\n }\n\n if (!hasPages && !hasApp) {\n items.push({ name: \"No pages/ or app/ directory found\", status: \"unsupported\", detail: \"vinext requires a pages/ or app/ directory\" });\n }\n\n // Check for \"type\": \"module\" in package.json\n const pkgPath = path.join(root, \"package.json\");\n if (fs.existsSync(pkgPath)) {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n if (pkg.type !== \"module\") {\n items.push({\n name: 'Missing \"type\": \"module\" in package.json',\n status: \"unsupported\",\n detail: \"required for Vite — vinext init will add it automatically\",\n });\n }\n }\n\n // Scan for ViewTransition import from react\n const allSourceFiles = findSourceFiles(root);\n const viewTransitionRegex = /import\\s+\\{[^}]*\\bViewTransition\\b[^}]*\\}\\s+from\\s+['\"]react['\"]/;\n const viewTransitionFiles: string[] = [];\n for (const file of allSourceFiles) {\n const content = fs.readFileSync(file, \"utf-8\");\n if (viewTransitionRegex.test(content)) {\n viewTransitionFiles.push(path.relative(root, file));\n }\n }\n if (viewTransitionFiles.length > 0) {\n items.push({\n name: \"ViewTransition (React canary API)\",\n status: \"partial\",\n detail: \"vinext auto-shims with a passthrough fallback, view transitions won't animate\",\n files: viewTransitionFiles,\n });\n }\n\n // Check PostCSS config for string-form plugins\n const postcssConfigs = [\"postcss.config.mjs\", \"postcss.config.js\", \"postcss.config.cjs\"];\n for (const configFile of postcssConfigs) {\n const configPath = path.join(root, configFile);\n if (fs.existsSync(configPath)) {\n const content = fs.readFileSync(configPath, \"utf-8\");\n // Detect string-form plugins: plugins: [\"...\"] or plugins: ['...']\n const stringPluginRegex = /plugins\\s*:\\s*\\[[\\s\\S]*?(['\"][^'\"]+['\"])[\\s\\S]*?\\]/;\n const match = stringPluginRegex.exec(content);\n if (match) {\n // Check it's not require() or import() form — just bare string literals in the array\n const pluginsBlock = match[0];\n // If plugins array contains string literals not wrapped in require()\n if (/plugins\\s*:\\s*\\[[\\s\\n]*['\"]/.test(pluginsBlock)) {\n items.push({\n name: `PostCSS string-form plugins (${configFile})`,\n status: \"partial\",\n detail: \"string-form PostCSS plugins need resolution — vinext handles this automatically\",\n });\n }\n }\n break; // Only check the first config file found\n }\n }\n\n return items;\n}\n\n/**\n * Run the full compatibility check.\n */\nexport function runCheck(root: string): CheckResult {\n const imports = scanImports(root);\n const config = analyzeConfig(root);\n const libraries = checkLibraries(root);\n const conventions = checkConventions(root);\n\n const allItems = [...imports, ...config, ...libraries, ...conventions];\n const supported = allItems.filter(i => i.status === \"supported\").length;\n const partial = allItems.filter(i => i.status === \"partial\").length;\n const unsupported = allItems.filter(i => i.status === \"unsupported\").length;\n const total = allItems.length;\n // Score: supported = 1, partial = 0.5, unsupported = 0\n const score = total > 0 ? Math.round(((supported + partial * 0.5) / total) * 100) : 100;\n\n return {\n imports,\n config,\n libraries,\n conventions,\n summary: { supported, partial, unsupported, total, score },\n };\n}\n\n/**\n * Format the check result as a colored terminal report.\n */\nexport function formatReport(result: CheckResult, opts?: { calledFromInit?: boolean }): string {\n const lines: string[] = [];\n const statusIcon = (s: Status) => s === \"supported\" ? \"\\x1b[32m✓\\x1b[0m\" : s === \"partial\" ? \"\\x1b[33m~\\x1b[0m\" : \"\\x1b[31m✗\\x1b[0m\";\n\n lines.push(\"\");\n lines.push(\" \\x1b[1mvinext compatibility report\\x1b[0m\");\n lines.push(\" \" + \"=\".repeat(40));\n lines.push(\"\");\n\n // Imports\n if (result.imports.length > 0) {\n const importSupported = result.imports.filter(i => i.status === \"supported\").length;\n lines.push(` \\x1b[1mImports\\x1b[0m: ${importSupported}/${result.imports.length} fully supported`);\n for (const item of result.imports) {\n const suffix = item.detail ? ` \\x1b[90m— ${item.detail}\\x1b[0m` : \"\";\n const fileCount = item.files ? ` \\x1b[90m(${item.files.length} file${item.files.length === 1 ? \"\" : \"s\"})\\x1b[0m` : \"\";\n lines.push(` ${statusIcon(item.status)} ${item.name}${fileCount}${suffix}`);\n }\n lines.push(\"\");\n }\n\n // Config\n if (result.config.length > 0) {\n const configSupported = result.config.filter(i => i.status === \"supported\").length;\n lines.push(` \\x1b[1mConfig\\x1b[0m: ${configSupported}/${result.config.length} options supported`);\n for (const item of result.config) {\n const suffix = item.detail ? ` \\x1b[90m— ${item.detail}\\x1b[0m` : \"\";\n lines.push(` ${statusIcon(item.status)} ${item.name}${suffix}`);\n }\n lines.push(\"\");\n }\n\n // Libraries\n if (result.libraries.length > 0) {\n const libSupported = result.libraries.filter(i => i.status === \"supported\").length;\n lines.push(` \\x1b[1mLibraries\\x1b[0m: ${libSupported}/${result.libraries.length} compatible`);\n for (const item of result.libraries) {\n const suffix = item.detail ? ` \\x1b[90m— ${item.detail}\\x1b[0m` : \"\";\n lines.push(` ${statusIcon(item.status)} ${item.name}${suffix}`);\n }\n lines.push(\"\");\n }\n\n // Conventions\n if (result.conventions.length > 0) {\n lines.push(` \\x1b[1mProject structure\\x1b[0m:`);\n for (const item of result.conventions) {\n const suffix = item.detail ? ` \\x1b[90m— ${item.detail}\\x1b[0m` : \"\";\n lines.push(` ${statusIcon(item.status)} ${item.name}${suffix}`);\n }\n lines.push(\"\");\n }\n\n // Summary\n const { score, supported, partial, unsupported } = result.summary;\n const scoreColor = score >= 90 ? \"\\x1b[32m\" : score >= 70 ? \"\\x1b[33m\" : \"\\x1b[31m\";\n lines.push(\" \" + \"-\".repeat(40));\n lines.push(` \\x1b[1mOverall\\x1b[0m: ${scoreColor}${score}% compatible\\x1b[0m (${supported} supported, ${partial} partial, ${unsupported} issues)`);\n\n if (unsupported > 0) {\n lines.push(\"\");\n lines.push(\" \\x1b[1mIssues to address:\\x1b[0m\");\n const allItems = [...result.imports, ...result.config, ...result.libraries, ...result.conventions];\n for (const item of allItems) {\n if (item.status === \"unsupported\") {\n lines.push(` \\x1b[31m✗\\x1b[0m ${item.name}${item.detail ? ` — ${item.detail}` : \"\"}`);\n }\n }\n }\n\n if (result.summary.partial > 0) {\n lines.push(\"\");\n lines.push(\" \\x1b[1mPartial support (may need attention):\\x1b[0m\");\n const allItems = [...result.imports, ...result.config, ...result.libraries, ...result.conventions];\n for (const item of allItems) {\n if (item.status === \"partial\") {\n lines.push(` \\x1b[33m~\\x1b[0m ${item.name}${item.detail ? ` — ${item.detail}` : \"\"}`);\n }\n }\n }\n\n // Actionable next steps (skip when called from init — it prints its own summary)\n if (!opts?.calledFromInit) {\n lines.push(\"\");\n lines.push(\" \\x1b[1mRecommended next steps:\\x1b[0m\");\n lines.push(` Run \\x1b[36mvinext init\\x1b[0m to set up your project automatically`);\n lines.push(\"\");\n lines.push(\" Or manually:\");\n lines.push(` 1. Add \\x1b[36m\"type\": \"module\"\\x1b[0m to package.json`);\n lines.push(` 2. Install: \\x1b[36m${detectPackageManager(process.cwd())} vinext vite @vitejs/plugin-rsc\\x1b[0m`);\n lines.push(` 3. Create vite.config.ts (see docs)`);\n lines.push(` 4. Run: \\x1b[36mnpx vite dev\\x1b[0m`);\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n"]}
@@ -17,7 +17,7 @@ import "next/router";
17
17
  import { isValidModulePath } from "./validate-module-path.js";
18
18
  // Read the SSR data injected by the server
19
19
  const nextData = window.__NEXT_DATA__;
20
- const { pageProps } = nextData?.props ?? { pageProps: {} };
20
+ const pageProps = (nextData?.props.pageProps ?? {});
21
21
  const pageModulePath = nextData?.__pageModule;
22
22
  const appModulePath = nextData?.__appModule;
23
23
  async function hydrate() {
@@ -1 +1 @@
1
- {"version":3,"file":"entry.js","sourceRoot":"","sources":["../../src/client/entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,0EAA0E;AAC1E,6EAA6E;AAC7E,wDAAwD;AACxD,OAAO,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,2CAA2C;AAC3C,MAAM,QAAQ,GAAI,MAAc,CAAC,aAAa,CAAC;AAC/C,MAAM,EAAE,SAAS,EAAE,GAAG,QAAQ,EAAE,KAAK,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;AAC3D,MAAM,cAAc,GAAG,QAAQ,EAAE,YAAY,CAAC;AAC9C,MAAM,aAAa,GAAG,QAAQ,EAAE,WAAW,CAAC;AAE5C,KAAK,UAAU,OAAO;IACpB,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC3E,OAAO;IACT,CAAC;IAED,qCAAqC;IACrC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC;IAEzC,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IAED,IAAI,OAA2B,CAAC;IAEhC,kDAAkD;IAClD,IAAI,aAAa,EAAE,CAAC;QAClB,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC;gBACjE,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC;gBACvC,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,YAAY,EAAE;oBAC1C,SAAS,EAAE,aAAa;oBACxB,SAAS;iBACV,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,0FAA0F;IAC1F,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IACpD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAE7C,mEAAmE;IACnE,yEAAyE;IACzE,gEAAgE;IAC/D,MAAc,CAAC,eAAe,GAAG,IAAI,CAAC;AACzC,CAAC;AAED,KAAK,OAAO,EAAE,CAAC","sourcesContent":["/**\n * Client-side hydration entry point.\n *\n * This module is injected as a <script type=\"module\"> in the SSR HTML.\n * It reads __NEXT_DATA__ from the window, dynamically imports the page\n * component, and hydrates it onto #__next.\n *\n * The actual page import path is injected at serve-time by the plugin\n * via a virtual module or inline script.\n */\nimport React from \"react\";\nimport { hydrateRoot } from \"react-dom/client\";\n// Eagerly import the router shim so its module-level popstate listener is\n// registered. Without this, browser back/forward buttons do nothing because\n// navigateClient() is never invoked on history changes.\nimport \"next/router\";\nimport { isValidModulePath } from \"./validate-module-path.js\";\n\n// Read the SSR data injected by the server\nconst nextData = (window as any).__NEXT_DATA__;\nconst { pageProps } = nextData?.props ?? { pageProps: {} };\nconst pageModulePath = nextData?.__pageModule;\nconst appModulePath = nextData?.__appModule;\n\nasync function hydrate() {\n if (!isValidModulePath(pageModulePath)) {\n console.error(\"[vinext] Invalid or missing __pageModule in __NEXT_DATA__\");\n return;\n }\n\n // Dynamically import the page module\n const pageModule = await import(/* @vite-ignore */ pageModulePath);\n const PageComponent = pageModule.default;\n\n if (!PageComponent) {\n console.error(\"[vinext] Page module has no default export\");\n return;\n }\n\n let element: React.ReactElement;\n\n // If there's a custom _app, wrap the page with it\n if (appModulePath) {\n if (!isValidModulePath(appModulePath)) {\n console.error(\"[vinext] Invalid __appModule in __NEXT_DATA__\");\n } else {\n try {\n const appModule = await import(/* @vite-ignore */ appModulePath);\n const AppComponent = appModule.default;\n element = React.createElement(AppComponent, {\n Component: PageComponent,\n pageProps,\n });\n } catch {\n // No _app, render page directly\n }\n }\n }\n\n // @ts-expect-error -- element is assigned in the _app branch above, or falls through here\n if (!element) {\n element = React.createElement(PageComponent, pageProps);\n }\n\n const container = document.getElementById(\"__next\");\n if (!container) {\n console.error(\"[vinext] No #__next element found\");\n return;\n }\n\n const root = hydrateRoot(container, element);\n\n // Expose root on window so the router shim (a separate module) can\n // re-render the tree during client-side navigation. import.meta.hot.data\n // is module-scoped and cannot be read across module boundaries.\n (window as any).__VINEXT_ROOT__ = root;\n}\n\nvoid hydrate();\n"]}
1
+ {"version":3,"file":"entry.js","sourceRoot":"","sources":["../../src/client/entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,0EAA0E;AAC1E,6EAA6E;AAC7E,wDAAwD;AACxD,OAAO,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,2CAA2C;AAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAC;AACtC,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,IAAI,EAAE,CAA4B,CAAC;AAC/E,MAAM,cAAc,GAAG,QAAQ,EAAE,YAAY,CAAC;AAC9C,MAAM,aAAa,GAAG,QAAQ,EAAE,WAAW,CAAC;AAE5C,KAAK,UAAU,OAAO;IACpB,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC3E,OAAO;IACT,CAAC;IAED,qCAAqC;IACrC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC;IAEzC,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IAED,IAAI,OAA2B,CAAC;IAEhC,kDAAkD;IAClD,IAAI,aAAa,EAAE,CAAC;QAClB,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC;gBACjE,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC;gBACvC,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,YAAY,EAAE;oBAC1C,SAAS,EAAE,aAAa;oBACxB,SAAS;iBACV,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,0FAA0F;IAC1F,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IACpD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAE7C,mEAAmE;IACnE,yEAAyE;IACzE,gEAAgE;IAChE,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC;AAChC,CAAC;AAED,KAAK,OAAO,EAAE,CAAC","sourcesContent":["/**\n * Client-side hydration entry point.\n *\n * This module is injected as a <script type=\"module\"> in the SSR HTML.\n * It reads __NEXT_DATA__ from the window, dynamically imports the page\n * component, and hydrates it onto #__next.\n *\n * The actual page import path is injected at serve-time by the plugin\n * via a virtual module or inline script.\n */\nimport React from \"react\";\nimport { hydrateRoot } from \"react-dom/client\";\n// Eagerly import the router shim so its module-level popstate listener is\n// registered. Without this, browser back/forward buttons do nothing because\n// navigateClient() is never invoked on history changes.\nimport \"next/router\";\nimport { isValidModulePath } from \"./validate-module-path.js\";\n\n// Read the SSR data injected by the server\nconst nextData = window.__NEXT_DATA__;\nconst pageProps = (nextData?.props.pageProps ?? {}) as Record<string, unknown>;\nconst pageModulePath = nextData?.__pageModule;\nconst appModulePath = nextData?.__appModule;\n\nasync function hydrate() {\n if (!isValidModulePath(pageModulePath)) {\n console.error(\"[vinext] Invalid or missing __pageModule in __NEXT_DATA__\");\n return;\n }\n\n // Dynamically import the page module\n const pageModule = await import(/* @vite-ignore */ pageModulePath);\n const PageComponent = pageModule.default;\n\n if (!PageComponent) {\n console.error(\"[vinext] Page module has no default export\");\n return;\n }\n\n let element: React.ReactElement;\n\n // If there's a custom _app, wrap the page with it\n if (appModulePath) {\n if (!isValidModulePath(appModulePath)) {\n console.error(\"[vinext] Invalid __appModule in __NEXT_DATA__\");\n } else {\n try {\n const appModule = await import(/* @vite-ignore */ appModulePath);\n const AppComponent = appModule.default;\n element = React.createElement(AppComponent, {\n Component: PageComponent,\n pageProps,\n });\n } catch {\n // No _app, render page directly\n }\n }\n }\n\n // @ts-expect-error -- element is assigned in the _app branch above, or falls through here\n if (!element) {\n element = React.createElement(PageComponent, pageProps);\n }\n\n const container = document.getElementById(\"__next\");\n if (!container) {\n console.error(\"[vinext] No #__next element found\");\n return;\n }\n\n const root = hydrateRoot(container, element);\n\n // Expose root on window so the router shim (a separate module) can\n // re-render the tree during client-side navigation. import.meta.hot.data\n // is module-scoped and cannot be read across module boundaries.\n window.__VINEXT_ROOT__ = root;\n}\n\nvoid hydrate();\n"]}
@@ -49,6 +49,27 @@ export declare function parseCookies(cookieHeader: string | null): Record<string
49
49
  * Build a RequestContext from a Web Request object.
50
50
  */
51
51
  export declare function requestContextFromRequest(request: Request): RequestContext;
52
+ /**
53
+ * Unpack `x-middleware-request-*` headers from the collected middleware
54
+ * response headers into the actual request, and strip all `x-middleware-*`
55
+ * internal signals so they never reach clients.
56
+ *
57
+ * `middlewareHeaders` is mutated in-place (matching keys are deleted).
58
+ * Returns a (possibly cloned) `Request` with the unpacked headers applied,
59
+ * and a fresh `RequestContext` built from it — ready for post-middleware
60
+ * config rule matching (beforeFiles, afterFiles, fallback).
61
+ *
62
+ * Works for both Node.js requests (mutable headers) and Workers requests
63
+ * (immutable — cloned only when there are headers to apply).
64
+ *
65
+ * `x-middleware-request-*` values are always plain strings (they carry
66
+ * individual header values), so the wider `string | string[]` type of
67
+ * `middlewareHeaders` is safe to cast here.
68
+ */
69
+ export declare function applyMiddlewareRequestHeaders(middlewareHeaders: Record<string, string | string[]>, request: Request): {
70
+ request: Request;
71
+ postMwReqCtx: RequestContext;
72
+ };
52
73
  /**
53
74
  * Check all has/missing conditions for a config rule.
54
75
  * Returns true if the rule should be applied (all has conditions pass, all missing conditions pass).
@@ -1 +1 @@
1
- {"version":3,"file":"config-matchers.d.ts","sourceRoot":"","sources":["../../src/config/config-matchers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAc5F;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAsGpD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAczE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAsDzD;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,eAAe,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAWhF;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CAQ1E;AAmDD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,YAAY,EAAE,GAAG,SAAS,EAC/B,OAAO,EAAE,YAAY,EAAE,GAAG,SAAS,EACnC,GAAG,EAAE,cAAc,GAClB,OAAO,CAYT;AAsBD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAmG/B;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,YAAY,EAAE,EACzB,GAAG,EAAE,cAAc,GAClB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAuBpD;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,WAAW,EAAE,EACvB,GAAG,EAAE,cAAc,GAClB,MAAM,GAAG,IAAI,CAuBf;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWxD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,QAAQ,CAAC,CA0FnB;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,UAAU,EAAE,EACrB,GAAG,EAAE,cAAc,GAClB,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAevC"}
1
+ {"version":3,"file":"config-matchers.d.ts","sourceRoot":"","sources":["../../src/config/config-matchers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAc5F;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAsGpD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAczE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAsDzD;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,eAAe,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAWhF;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CAQ1E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,6BAA6B,CAC3C,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,EACpD,OAAO,EAAE,OAAO,GACf;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,cAAc,CAAA;CAAE,CA8BpD;AAmDD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,YAAY,EAAE,GAAG,SAAS,EAC/B,OAAO,EAAE,YAAY,EAAE,GAAG,SAAS,EACnC,GAAG,EAAE,cAAc,GAClB,OAAO,CAYT;AAsBD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAmG/B;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,YAAY,EAAE,EACzB,GAAG,EAAE,cAAc,GAClB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAuBpD;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,WAAW,EAAE,EACvB,GAAG,EAAE,cAAc,GAClB,MAAM,GAAG,IAAI,CAuBf;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWxD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,QAAQ,CAAC,CAoFnB;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,UAAU,EAAE,EACrB,GAAG,EAAE,cAAc,GAClB,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAevC"}
@@ -241,6 +241,52 @@ export function requestContextFromRequest(request) {
241
241
  host: request.headers.get("host") ?? url.host,
242
242
  };
243
243
  }
244
+ /**
245
+ * Unpack `x-middleware-request-*` headers from the collected middleware
246
+ * response headers into the actual request, and strip all `x-middleware-*`
247
+ * internal signals so they never reach clients.
248
+ *
249
+ * `middlewareHeaders` is mutated in-place (matching keys are deleted).
250
+ * Returns a (possibly cloned) `Request` with the unpacked headers applied,
251
+ * and a fresh `RequestContext` built from it — ready for post-middleware
252
+ * config rule matching (beforeFiles, afterFiles, fallback).
253
+ *
254
+ * Works for both Node.js requests (mutable headers) and Workers requests
255
+ * (immutable — cloned only when there are headers to apply).
256
+ *
257
+ * `x-middleware-request-*` values are always plain strings (they carry
258
+ * individual header values), so the wider `string | string[]` type of
259
+ * `middlewareHeaders` is safe to cast here.
260
+ */
261
+ export function applyMiddlewareRequestHeaders(middlewareHeaders, request) {
262
+ const mwReqPrefix = "x-middleware-request-";
263
+ const toApply = {};
264
+ for (const key of Object.keys(middlewareHeaders)) {
265
+ if (key.startsWith(mwReqPrefix)) {
266
+ const realName = key.slice(mwReqPrefix.length);
267
+ toApply[realName] = middlewareHeaders[key];
268
+ delete middlewareHeaders[key];
269
+ }
270
+ else if (key.startsWith("x-middleware-")) {
271
+ delete middlewareHeaders[key];
272
+ }
273
+ }
274
+ if (Object.keys(toApply).length > 0) {
275
+ // Headers may be immutable (Workers), so always clone via new Headers().
276
+ const newHeaders = new Headers(request.headers);
277
+ for (const [k, v] of Object.entries(toApply)) {
278
+ newHeaders.set(k, v);
279
+ }
280
+ request = new Request(request.url, {
281
+ method: request.method,
282
+ headers: newHeaders,
283
+ body: request.body,
284
+ // @ts-expect-error — duplex needed for streaming request bodies
285
+ duplex: request.body ? "half" : undefined,
286
+ });
287
+ }
288
+ return { request, postMwReqCtx: requestContextFromRequest(request) };
289
+ }
244
290
  /**
245
291
  * Check a single has/missing condition against request context.
246
292
  * Returns true if the condition is satisfied.
@@ -577,12 +623,6 @@ export async function proxyExternalRequest(request, externalUrl) {
577
623
  headers.set("host", targetUrl.host);
578
624
  // Remove headers that should not be forwarded to external services
579
625
  headers.delete("connection");
580
- // Strip credentials and internal headers to prevent leaking auth tokens,
581
- // session cookies, and middleware internals to third-party origins.
582
- headers.delete("cookie");
583
- headers.delete("authorization");
584
- headers.delete("x-api-key");
585
- headers.delete("proxy-authorization");
586
626
  const keysToDelete = [];
587
627
  for (const key of headers.keys()) {
588
628
  if (key.startsWith("x-middleware-")) {