vinext 0.0.0 → 0.0.2

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 (272) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -0
  3. package/dist/build/static-export.d.ts +78 -0
  4. package/dist/build/static-export.d.ts.map +1 -0
  5. package/dist/build/static-export.js +553 -0
  6. package/dist/build/static-export.js.map +1 -0
  7. package/dist/check.d.ts +52 -0
  8. package/dist/check.d.ts.map +1 -0
  9. package/dist/check.js +483 -0
  10. package/dist/check.js.map +1 -0
  11. package/dist/cli.d.ts +15 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +565 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/client/entry.d.ts +2 -0
  16. package/dist/client/entry.d.ts.map +1 -0
  17. package/dist/client/entry.js +85 -0
  18. package/dist/client/entry.js.map +1 -0
  19. package/dist/cloudflare/index.d.ts +8 -0
  20. package/dist/cloudflare/index.d.ts.map +1 -0
  21. package/dist/cloudflare/index.js +8 -0
  22. package/dist/cloudflare/index.js.map +1 -0
  23. package/dist/cloudflare/kv-cache-handler.d.ts +68 -0
  24. package/dist/cloudflare/kv-cache-handler.d.ts.map +1 -0
  25. package/dist/cloudflare/kv-cache-handler.js +304 -0
  26. package/dist/cloudflare/kv-cache-handler.js.map +1 -0
  27. package/dist/cloudflare/tpr.d.ts +78 -0
  28. package/dist/cloudflare/tpr.d.ts.map +1 -0
  29. package/dist/cloudflare/tpr.js +672 -0
  30. package/dist/cloudflare/tpr.js.map +1 -0
  31. package/dist/config/config-matchers.d.ts +106 -0
  32. package/dist/config/config-matchers.d.ts.map +1 -0
  33. package/dist/config/config-matchers.js +499 -0
  34. package/dist/config/config-matchers.js.map +1 -0
  35. package/dist/config/next-config.d.ts +153 -0
  36. package/dist/config/next-config.d.ts.map +1 -0
  37. package/dist/config/next-config.js +274 -0
  38. package/dist/config/next-config.js.map +1 -0
  39. package/dist/deploy.d.ts +87 -0
  40. package/dist/deploy.d.ts.map +1 -0
  41. package/dist/deploy.js +644 -0
  42. package/dist/deploy.js.map +1 -0
  43. package/dist/index.d.ts +156 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +3296 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/init.d.ts +55 -0
  48. package/dist/init.d.ts.map +1 -0
  49. package/dist/init.js +201 -0
  50. package/dist/init.js.map +1 -0
  51. package/dist/routing/app-router.d.ts +96 -0
  52. package/dist/routing/app-router.d.ts.map +1 -0
  53. package/dist/routing/app-router.js +815 -0
  54. package/dist/routing/app-router.js.map +1 -0
  55. package/dist/routing/pages-router.d.ts +52 -0
  56. package/dist/routing/pages-router.d.ts.map +1 -0
  57. package/dist/routing/pages-router.js +239 -0
  58. package/dist/routing/pages-router.js.map +1 -0
  59. package/dist/server/api-handler.d.ts +18 -0
  60. package/dist/server/api-handler.d.ts.map +1 -0
  61. package/dist/server/api-handler.js +169 -0
  62. package/dist/server/api-handler.js.map +1 -0
  63. package/dist/server/app-dev-server.d.ts +42 -0
  64. package/dist/server/app-dev-server.d.ts.map +1 -0
  65. package/dist/server/app-dev-server.js +2718 -0
  66. package/dist/server/app-dev-server.js.map +1 -0
  67. package/dist/server/app-router-entry.d.ts +18 -0
  68. package/dist/server/app-router-entry.d.ts.map +1 -0
  69. package/dist/server/app-router-entry.js +34 -0
  70. package/dist/server/app-router-entry.js.map +1 -0
  71. package/dist/server/dev-server.d.ts +40 -0
  72. package/dist/server/dev-server.d.ts.map +1 -0
  73. package/dist/server/dev-server.js +758 -0
  74. package/dist/server/dev-server.js.map +1 -0
  75. package/dist/server/html.d.ts +22 -0
  76. package/dist/server/html.d.ts.map +1 -0
  77. package/dist/server/html.js +29 -0
  78. package/dist/server/html.js.map +1 -0
  79. package/dist/server/image-optimization.d.ts +56 -0
  80. package/dist/server/image-optimization.d.ts.map +1 -0
  81. package/dist/server/image-optimization.js +103 -0
  82. package/dist/server/image-optimization.js.map +1 -0
  83. package/dist/server/instrumentation.d.ts +68 -0
  84. package/dist/server/instrumentation.d.ts.map +1 -0
  85. package/dist/server/instrumentation.js +90 -0
  86. package/dist/server/instrumentation.js.map +1 -0
  87. package/dist/server/isr-cache.d.ts +61 -0
  88. package/dist/server/isr-cache.d.ts.map +1 -0
  89. package/dist/server/isr-cache.js +134 -0
  90. package/dist/server/isr-cache.js.map +1 -0
  91. package/dist/server/metadata-routes.d.ts +103 -0
  92. package/dist/server/metadata-routes.d.ts.map +1 -0
  93. package/dist/server/metadata-routes.js +270 -0
  94. package/dist/server/metadata-routes.js.map +1 -0
  95. package/dist/server/middleware.d.ts +77 -0
  96. package/dist/server/middleware.d.ts.map +1 -0
  97. package/dist/server/middleware.js +228 -0
  98. package/dist/server/middleware.js.map +1 -0
  99. package/dist/server/prod-server.d.ts +78 -0
  100. package/dist/server/prod-server.d.ts.map +1 -0
  101. package/dist/server/prod-server.js +712 -0
  102. package/dist/server/prod-server.js.map +1 -0
  103. package/dist/shims/amp.d.ts +17 -0
  104. package/dist/shims/amp.d.ts.map +1 -0
  105. package/dist/shims/amp.js +21 -0
  106. package/dist/shims/amp.js.map +1 -0
  107. package/dist/shims/app.d.ts +12 -0
  108. package/dist/shims/app.d.ts.map +1 -0
  109. package/dist/shims/app.js +2 -0
  110. package/dist/shims/app.js.map +1 -0
  111. package/dist/shims/cache-runtime.d.ts +68 -0
  112. package/dist/shims/cache-runtime.d.ts.map +1 -0
  113. package/dist/shims/cache-runtime.js +437 -0
  114. package/dist/shims/cache-runtime.js.map +1 -0
  115. package/dist/shims/cache.d.ts +243 -0
  116. package/dist/shims/cache.d.ts.map +1 -0
  117. package/dist/shims/cache.js +415 -0
  118. package/dist/shims/cache.js.map +1 -0
  119. package/dist/shims/client-only.d.ts +18 -0
  120. package/dist/shims/client-only.d.ts.map +1 -0
  121. package/dist/shims/client-only.js +18 -0
  122. package/dist/shims/client-only.js.map +1 -0
  123. package/dist/shims/config.d.ts +27 -0
  124. package/dist/shims/config.d.ts.map +1 -0
  125. package/dist/shims/config.js +30 -0
  126. package/dist/shims/config.js.map +1 -0
  127. package/dist/shims/constants.d.ts +13 -0
  128. package/dist/shims/constants.d.ts.map +1 -0
  129. package/dist/shims/constants.js +13 -0
  130. package/dist/shims/constants.js.map +1 -0
  131. package/dist/shims/document.d.ts +33 -0
  132. package/dist/shims/document.d.ts.map +1 -0
  133. package/dist/shims/document.js +32 -0
  134. package/dist/shims/document.js.map +1 -0
  135. package/dist/shims/dynamic.d.ts +33 -0
  136. package/dist/shims/dynamic.d.ts.map +1 -0
  137. package/dist/shims/dynamic.js +149 -0
  138. package/dist/shims/dynamic.js.map +1 -0
  139. package/dist/shims/error-boundary.d.ts +33 -0
  140. package/dist/shims/error-boundary.d.ts.map +1 -0
  141. package/dist/shims/error-boundary.js +88 -0
  142. package/dist/shims/error-boundary.js.map +1 -0
  143. package/dist/shims/error.d.ts +16 -0
  144. package/dist/shims/error.d.ts.map +1 -0
  145. package/dist/shims/error.js +45 -0
  146. package/dist/shims/error.js.map +1 -0
  147. package/dist/shims/fetch-cache.d.ts +61 -0
  148. package/dist/shims/fetch-cache.d.ts.map +1 -0
  149. package/dist/shims/fetch-cache.js +307 -0
  150. package/dist/shims/fetch-cache.js.map +1 -0
  151. package/dist/shims/font-google.d.ts +122 -0
  152. package/dist/shims/font-google.d.ts.map +1 -0
  153. package/dist/shims/font-google.js +387 -0
  154. package/dist/shims/font-google.js.map +1 -0
  155. package/dist/shims/font-local.d.ts +61 -0
  156. package/dist/shims/font-local.d.ts.map +1 -0
  157. package/dist/shims/font-local.js +303 -0
  158. package/dist/shims/font-local.js.map +1 -0
  159. package/dist/shims/form.d.ts +30 -0
  160. package/dist/shims/form.d.ts.map +1 -0
  161. package/dist/shims/form.js +78 -0
  162. package/dist/shims/form.js.map +1 -0
  163. package/dist/shims/head-state.d.ts +11 -0
  164. package/dist/shims/head-state.d.ts.map +1 -0
  165. package/dist/shims/head-state.js +47 -0
  166. package/dist/shims/head-state.js.map +1 -0
  167. package/dist/shims/head.d.ts +28 -0
  168. package/dist/shims/head.d.ts.map +1 -0
  169. package/dist/shims/head.js +148 -0
  170. package/dist/shims/head.js.map +1 -0
  171. package/dist/shims/headers.d.ts +150 -0
  172. package/dist/shims/headers.d.ts.map +1 -0
  173. package/dist/shims/headers.js +412 -0
  174. package/dist/shims/headers.js.map +1 -0
  175. package/dist/shims/image-config.d.ts +30 -0
  176. package/dist/shims/image-config.d.ts.map +1 -0
  177. package/dist/shims/image-config.js +91 -0
  178. package/dist/shims/image-config.js.map +1 -0
  179. package/dist/shims/image.d.ts +63 -0
  180. package/dist/shims/image.d.ts.map +1 -0
  181. package/dist/shims/image.js +284 -0
  182. package/dist/shims/image.js.map +1 -0
  183. package/dist/shims/internal/api-utils.d.ts +12 -0
  184. package/dist/shims/internal/api-utils.d.ts.map +1 -0
  185. package/dist/shims/internal/api-utils.js +7 -0
  186. package/dist/shims/internal/api-utils.js.map +1 -0
  187. package/dist/shims/internal/app-router-context.d.ts +21 -0
  188. package/dist/shims/internal/app-router-context.d.ts.map +1 -0
  189. package/dist/shims/internal/app-router-context.js +15 -0
  190. package/dist/shims/internal/app-router-context.js.map +1 -0
  191. package/dist/shims/internal/cookies.d.ts +9 -0
  192. package/dist/shims/internal/cookies.d.ts.map +1 -0
  193. package/dist/shims/internal/cookies.js +9 -0
  194. package/dist/shims/internal/cookies.js.map +1 -0
  195. package/dist/shims/internal/router-context.d.ts +2 -0
  196. package/dist/shims/internal/router-context.d.ts.map +1 -0
  197. package/dist/shims/internal/router-context.js +9 -0
  198. package/dist/shims/internal/router-context.js.map +1 -0
  199. package/dist/shims/internal/utils.d.ts +48 -0
  200. package/dist/shims/internal/utils.d.ts.map +1 -0
  201. package/dist/shims/internal/utils.js +35 -0
  202. package/dist/shims/internal/utils.js.map +1 -0
  203. package/dist/shims/internal/work-unit-async-storage.d.ts +12 -0
  204. package/dist/shims/internal/work-unit-async-storage.d.ts.map +1 -0
  205. package/dist/shims/internal/work-unit-async-storage.js +13 -0
  206. package/dist/shims/internal/work-unit-async-storage.js.map +1 -0
  207. package/dist/shims/layout-segment-context.d.ts +21 -0
  208. package/dist/shims/layout-segment-context.d.ts.map +1 -0
  209. package/dist/shims/layout-segment-context.js +27 -0
  210. package/dist/shims/layout-segment-context.js.map +1 -0
  211. package/dist/shims/legacy-image.d.ts +52 -0
  212. package/dist/shims/legacy-image.d.ts.map +1 -0
  213. package/dist/shims/legacy-image.js +46 -0
  214. package/dist/shims/legacy-image.js.map +1 -0
  215. package/dist/shims/link.d.ts +48 -0
  216. package/dist/shims/link.d.ts.map +1 -0
  217. package/dist/shims/link.js +395 -0
  218. package/dist/shims/link.js.map +1 -0
  219. package/dist/shims/metadata.d.ts +184 -0
  220. package/dist/shims/metadata.d.ts.map +1 -0
  221. package/dist/shims/metadata.js +472 -0
  222. package/dist/shims/metadata.js.map +1 -0
  223. package/dist/shims/navigation-state.d.ts +14 -0
  224. package/dist/shims/navigation-state.d.ts.map +1 -0
  225. package/dist/shims/navigation-state.js +77 -0
  226. package/dist/shims/navigation-state.js.map +1 -0
  227. package/dist/shims/navigation.d.ts +201 -0
  228. package/dist/shims/navigation.d.ts.map +1 -0
  229. package/dist/shims/navigation.js +672 -0
  230. package/dist/shims/navigation.js.map +1 -0
  231. package/dist/shims/og.d.ts +20 -0
  232. package/dist/shims/og.d.ts.map +1 -0
  233. package/dist/shims/og.js +19 -0
  234. package/dist/shims/og.js.map +1 -0
  235. package/dist/shims/router-state.d.ts +11 -0
  236. package/dist/shims/router-state.d.ts.map +1 -0
  237. package/dist/shims/router-state.js +56 -0
  238. package/dist/shims/router-state.js.map +1 -0
  239. package/dist/shims/router.d.ts +103 -0
  240. package/dist/shims/router.d.ts.map +1 -0
  241. package/dist/shims/router.js +536 -0
  242. package/dist/shims/router.js.map +1 -0
  243. package/dist/shims/script.d.ts +58 -0
  244. package/dist/shims/script.d.ts.map +1 -0
  245. package/dist/shims/script.js +163 -0
  246. package/dist/shims/script.js.map +1 -0
  247. package/dist/shims/server-only.d.ts +19 -0
  248. package/dist/shims/server-only.d.ts.map +1 -0
  249. package/dist/shims/server-only.js +19 -0
  250. package/dist/shims/server-only.js.map +1 -0
  251. package/dist/shims/server.d.ts +178 -0
  252. package/dist/shims/server.d.ts.map +1 -0
  253. package/dist/shims/server.js +377 -0
  254. package/dist/shims/server.js.map +1 -0
  255. package/dist/shims/web-vitals.d.ts +24 -0
  256. package/dist/shims/web-vitals.d.ts.map +1 -0
  257. package/dist/shims/web-vitals.js +17 -0
  258. package/dist/shims/web-vitals.js.map +1 -0
  259. package/dist/utils/hash.d.ts +6 -0
  260. package/dist/utils/hash.d.ts.map +1 -0
  261. package/dist/utils/hash.js +20 -0
  262. package/dist/utils/hash.js.map +1 -0
  263. package/dist/utils/project.d.ts +36 -0
  264. package/dist/utils/project.d.ts.map +1 -0
  265. package/dist/utils/project.js +112 -0
  266. package/dist/utils/project.js.map +1 -0
  267. package/dist/utils/query.d.ts +10 -0
  268. package/dist/utils/query.d.ts.map +1 -0
  269. package/dist/utils/query.js +27 -0
  270. package/dist/utils/query.js.map +1 -0
  271. package/package.json +65 -7
  272. package/index.js +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-export.js","sourceRoot":"","sources":["../../src/build/static-export.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Static export for `output: 'export'`.\n *\n * Renders all pages to static HTML files at build time. Produces a directory\n * of HTML + client JS/CSS that can be deployed to any static file host\n * (S3, Cloudflare Pages, GitHub Pages, Nginx, etc.) with no server required.\n *\n * Pages Router:\n * - Static pages → render to HTML\n * - getStaticProps pages → call at build time, render with props\n * - Dynamic routes → call getStaticPaths (must be fallback: false), render each\n * - getServerSideProps → build error\n * - API routes → skipped with warning\n *\n * App Router:\n * - Static pages → run Server Components at build time, render to HTML\n * - Dynamic routes → call generateStaticParams(), render each\n * - Dynamic routes without generateStaticParams → build error\n */\nimport type { ViteDevServer } from \"vite\";\nimport type { Route } from \"../routing/pages-router.js\";\nimport type { AppRoute } from \"../routing/app-router.js\";\nimport type { ResolvedNextConfig } from \"../config/next-config.js\";\nimport { safeJsonStringify } from \"../server/html.js\";\nimport { escapeAttr } from \"../shims/head.js\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport React from \"react\";\nimport { renderToReadableStream } from \"react-dom/server.edge\";\n\nconst PAGE_EXTENSIONS = [\".tsx\", \".ts\", \".jsx\", \".js\"];\n\nfunction findFileWithExtensions(basePath: string): boolean {\n return PAGE_EXTENSIONS.some((ext) => fs.existsSync(basePath + ext));\n}\n\n/**\n * Render a React element to string using renderToReadableStream (Suspense support).\n * Uses Web Streams API — works in Node.js 18+ and Cloudflare Workers.\n */\nasync function renderToStringAsync(element: React.ReactElement): Promise<string> {\n const stream = await renderToReadableStream(element);\n await stream.allReady;\n return new Response(stream).text();\n}\n\nexport interface StaticExportOptions {\n /** Vite dev server (for SSR module loading) */\n server: ViteDevServer;\n /** Discovered page routes (excludes API routes) */\n routes: Route[];\n /** Discovered API routes */\n apiRoutes: Route[];\n /** Pages directory path */\n pagesDir: string;\n /** Output directory for static files */\n outDir: string;\n /** Resolved next.config.js */\n config: ResolvedNextConfig;\n}\n\nexport interface StaticExportResult {\n /** Number of HTML files generated */\n pageCount: number;\n /** Generated file paths (relative to outDir) */\n files: string[];\n /** Warnings encountered */\n warnings: string[];\n /** Errors encountered (non-fatal, specific pages) */\n errors: Array<{ route: string; error: string }>;\n}\n\n/**\n * Run static export for Pages Router.\n *\n * Creates a directory of static HTML files by rendering each route at build time.\n */\nexport async function staticExportPages(\n options: StaticExportOptions,\n): Promise<StaticExportResult> {\n const { server, routes, apiRoutes, pagesDir, outDir, config } = options;\n const result: StaticExportResult = {\n pageCount: 0,\n files: [],\n warnings: [],\n errors: [],\n };\n\n // Ensure output directory exists\n fs.mkdirSync(outDir, { recursive: true });\n\n // Warn about API routes\n if (apiRoutes.length > 0) {\n result.warnings.push(\n `${apiRoutes.length} API route(s) skipped — API routes are not supported with output: 'export'`,\n );\n }\n\n // Gather all pages to render (expand dynamic routes via getStaticPaths)\n const pagesToRender: Array<{\n route: Route;\n urlPath: string;\n params: Record<string, string | string[]>;\n }> = [];\n\n for (const route of routes) {\n // Skip internal pages\n const routeName = path.basename(route.filePath, path.extname(route.filePath));\n if (routeName.startsWith(\"_\")) continue;\n\n const pageModule = await server.ssrLoadModule(route.filePath);\n\n // Validate: getServerSideProps is not allowed with static export\n if (typeof pageModule.getServerSideProps === \"function\") {\n result.errors.push({\n route: route.pattern,\n error: `Page uses getServerSideProps which is not supported with output: 'export'. Use getStaticProps instead.`,\n });\n continue;\n }\n\n if (route.isDynamic) {\n // Dynamic route — must have getStaticPaths\n if (typeof pageModule.getStaticPaths !== \"function\") {\n result.errors.push({\n route: route.pattern,\n error: `Dynamic route requires getStaticPaths with output: 'export'`,\n });\n continue;\n }\n\n const pathsResult = await pageModule.getStaticPaths({\n locales: [],\n defaultLocale: \"\",\n });\n const fallback = pathsResult?.fallback ?? false;\n\n if (fallback !== false) {\n result.errors.push({\n route: route.pattern,\n error: `getStaticPaths must return fallback: false with output: 'export' (got: ${JSON.stringify(fallback)})`,\n });\n continue;\n }\n\n const paths: Array<{ params: Record<string, string | string[]> }> =\n pathsResult?.paths ?? [];\n\n for (const { params } of paths) {\n // Build the URL path from the route pattern and params\n const urlPath = buildUrlFromParams(route.pattern, params);\n pagesToRender.push({ route, urlPath, params });\n }\n } else {\n // Static route — render directly\n pagesToRender.push({ route, urlPath: route.pattern, params: {} });\n }\n }\n\n // Load shared components (_app, _document, head shim, dynamic shim)\n let AppComponent: React.ComponentType<{\n Component: React.ComponentType;\n pageProps: Record<string, unknown>;\n }> | null = null;\n const appPath = path.join(pagesDir, \"_app\");\n if (findFileWithExtensions(appPath)) {\n try {\n const appModule = await server.ssrLoadModule(appPath);\n AppComponent = appModule.default ?? null;\n } catch {\n // _app exists but failed to load\n }\n }\n\n let DocumentComponent: React.ComponentType | null = null;\n const docPath = path.join(pagesDir, \"_document\");\n if (findFileWithExtensions(docPath)) {\n try {\n const docModule = await server.ssrLoadModule(docPath);\n DocumentComponent = docModule.default ?? null;\n } catch {\n // _document exists but failed to load\n }\n }\n\n const headShim = await server.ssrLoadModule(\"next/head\");\n const dynamicShim = await server.ssrLoadModule(\"next/dynamic\");\n const routerShim = await server.ssrLoadModule(\"next/router\");\n\n // Render each page\n for (const { route, urlPath, params } of pagesToRender) {\n try {\n const html = await renderStaticPage({\n server,\n route,\n urlPath,\n params,\n pagesDir,\n config,\n AppComponent,\n DocumentComponent,\n headShim,\n dynamicShim,\n routerShim,\n });\n\n const outputPath = getOutputPath(urlPath, config.trailingSlash);\n const fullPath = path.join(outDir, outputPath);\n fs.mkdirSync(path.dirname(fullPath), { recursive: true });\n fs.writeFileSync(fullPath, html, \"utf-8\");\n\n result.files.push(outputPath);\n result.pageCount++;\n } catch (e) {\n result.errors.push({\n route: urlPath,\n error: (e as Error).message,\n });\n }\n }\n\n // Render 404 page\n try {\n const html404 = await renderErrorPage({\n server,\n pagesDir,\n statusCode: 404,\n AppComponent,\n DocumentComponent,\n headShim,\n });\n if (html404) {\n const fullPath = path.join(outDir, \"404.html\");\n fs.writeFileSync(fullPath, html404, \"utf-8\");\n result.files.push(\"404.html\");\n result.pageCount++;\n }\n } catch {\n // No custom 404, skip\n }\n\n return result;\n}\n\ninterface RenderStaticPageOptions {\n server: ViteDevServer;\n route: Route;\n urlPath: string;\n params: Record<string, string | string[]>;\n pagesDir: string;\n config: ResolvedNextConfig;\n AppComponent: React.ComponentType<{\n Component: React.ComponentType;\n pageProps: Record<string, unknown>;\n }> | null;\n DocumentComponent: React.ComponentType | null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n headShim: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n dynamicShim: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n routerShim: any;\n}\n\nasync function renderStaticPage(options: RenderStaticPageOptions): Promise<string> {\n const {\n server,\n route,\n urlPath,\n params,\n config: _config,\n AppComponent,\n DocumentComponent,\n headShim,\n dynamicShim,\n routerShim,\n } = options;\n\n // Set SSR context for router shim\n if (typeof routerShim.setSSRContext === \"function\") {\n routerShim.setSSRContext({\n pathname: urlPath,\n query: params,\n asPath: urlPath,\n });\n }\n\n const pageModule = await server.ssrLoadModule(route.filePath);\n const PageComponent = pageModule.default;\n if (!PageComponent) {\n throw new Error(`Page ${route.filePath} has no default export`);\n }\n\n // Collect page props\n let pageProps: Record<string, unknown> = {};\n\n if (typeof pageModule.getStaticProps === \"function\") {\n const result = await pageModule.getStaticProps({ params });\n if (result && \"props\" in result) {\n pageProps = result.props as Record<string, unknown>;\n }\n if (result && \"redirect\" in result) {\n // Static export can't handle redirects — write a meta redirect\n const redirect = result.redirect as { destination: string };\n return `<!DOCTYPE html><html><head><meta http-equiv=\"refresh\" content=\"0;url=${escapeAttr(redirect.destination)}\" /></head><body></body></html>`;\n }\n if (result && \"notFound\" in result && result.notFound) {\n throw new Error(`Page ${urlPath} returned notFound: true`);\n }\n }\n\n // Build element\n const createElement = React.createElement;\n let element: React.ReactElement;\n\n if (AppComponent) {\n element = createElement(AppComponent, {\n Component: PageComponent,\n pageProps,\n });\n } else {\n element = createElement(PageComponent, pageProps);\n }\n\n // Reset head collector and flush dynamic preloads\n if (typeof headShim.resetSSRHead === \"function\") {\n headShim.resetSSRHead();\n }\n if (typeof dynamicShim.flushPreloads === \"function\") {\n await dynamicShim.flushPreloads();\n }\n\n // Render page body\n const bodyHtml = await renderToStringAsync(element);\n\n // Collect head tags\n const ssrHeadHTML =\n typeof headShim.getSSRHeadHTML === \"function\"\n ? headShim.getSSRHeadHTML()\n : \"\";\n\n // __NEXT_DATA__ for client hydration\n const nextDataScript = `<script>window.__NEXT_DATA__ = ${safeJsonStringify({\n props: { pageProps },\n page: route.pattern,\n query: params,\n })}</script>`;\n\n // Build HTML shell\n let html: string;\n\n if (DocumentComponent) {\n const docElement = createElement(DocumentComponent);\n // renderToReadableStream auto-prepends <!DOCTYPE html> when root is <html>\n let docHtml = await renderToStringAsync(docElement);\n docHtml = docHtml.replace(\"__NEXT_MAIN__\", bodyHtml);\n if (ssrHeadHTML) {\n docHtml = docHtml.replace(\"</head>\", ` ${ssrHeadHTML}\\n</head>`);\n }\n docHtml = docHtml.replace(\"<!-- __NEXT_SCRIPTS__ -->\", nextDataScript);\n if (!docHtml.includes(\"__NEXT_DATA__\")) {\n docHtml = docHtml.replace(\"</body>\", ` ${nextDataScript}\\n</body>`);\n }\n html = docHtml;\n } else {\n html = `<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n ${ssrHeadHTML}\n</head>\n<body>\n <div id=\"__next\">${bodyHtml}</div>\n ${nextDataScript}\n</body>\n</html>`;\n }\n\n // Clear SSR context\n if (typeof routerShim.setSSRContext === \"function\") {\n routerShim.setSSRContext(null);\n }\n\n return html;\n}\n\ninterface RenderErrorPageOptions {\n server: ViteDevServer;\n pagesDir: string;\n statusCode: number;\n AppComponent: React.ComponentType<{\n Component: React.ComponentType;\n pageProps: Record<string, unknown>;\n }> | null;\n DocumentComponent: React.ComponentType | null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n headShim: any;\n}\n\nasync function renderErrorPage(\n options: RenderErrorPageOptions,\n): Promise<string | null> {\n const { server, pagesDir, statusCode, AppComponent, DocumentComponent, headShim } =\n options;\n\n const candidates =\n statusCode === 404\n ? [\"404\", \"_error\"]\n : statusCode === 500\n ? [\"500\", \"_error\"]\n : [\"_error\"];\n\n for (const candidate of candidates) {\n const candidatePath = path.join(pagesDir, candidate);\n if (!findFileWithExtensions(candidatePath)) continue;\n\n const errorModule = await server.ssrLoadModule(candidatePath);\n const ErrorComponent = errorModule.default;\n if (!ErrorComponent) continue;\n\n const createElement = React.createElement;\n const errorProps = { statusCode };\n\n let element: React.ReactElement;\n if (AppComponent) {\n element = createElement(AppComponent, {\n Component: ErrorComponent,\n pageProps: errorProps,\n });\n } else {\n element = createElement(ErrorComponent, errorProps);\n }\n\n if (typeof headShim.resetSSRHead === \"function\") {\n headShim.resetSSRHead();\n }\n\n const bodyHtml = await renderToStringAsync(element);\n\n let html: string;\n if (DocumentComponent) {\n const docElement = createElement(DocumentComponent);\n let docHtml = await renderToStringAsync(docElement);\n docHtml = docHtml.replace(\"__NEXT_MAIN__\", bodyHtml);\n docHtml = docHtml.replace(\"<!-- __NEXT_SCRIPTS__ -->\", \"\");\n html = docHtml;\n } else {\n html = `<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n</head>\n<body>\n <div id=\"__next\">${bodyHtml}</div>\n</body>\n</html>`;\n }\n\n return html;\n }\n\n return null;\n}\n\n/**\n * Build a URL path from a route pattern and params.\n * E.g., \"/posts/:id\" + { id: \"42\" } → \"/posts/42\"\n * E.g., \"/docs/:slug+\" + { slug: [\"a\", \"b\"] } → \"/docs/a/b\"\n */\nfunction buildUrlFromParams(\n pattern: string,\n params: Record<string, string | string[]>,\n): string {\n const parts = pattern.split(\"/\").filter(Boolean);\n const result: string[] = [];\n\n for (const part of parts) {\n if (part.endsWith(\"+\") || part.endsWith(\"*\")) {\n // Catch-all: :slug+ or :slug*\n const paramName = part.slice(1, -1);\n const value = params[paramName];\n if (Array.isArray(value)) {\n result.push(...value);\n } else if (value) {\n result.push(String(value));\n }\n } else if (part.startsWith(\":\")) {\n // Dynamic segment: :id\n const paramName = part.slice(1);\n const value = params[paramName];\n result.push(String(value));\n } else {\n result.push(part);\n }\n }\n\n return \"/\" + result.join(\"/\");\n}\n\n/**\n * Determine the output file path for a given URL.\n * Respects trailingSlash config.\n */\nfunction getOutputPath(urlPath: string, trailingSlash: boolean): string {\n if (urlPath === \"/\") {\n return \"index.html\";\n }\n\n // Remove leading slash\n const clean = urlPath.replace(/^\\//, \"\");\n\n if (trailingSlash) {\n return `${clean}/index.html`;\n }\n return `${clean}.html`;\n}\n\n/**\n * Resolve parent dynamic segment params for a route.\n *\n * Implements Next.js's top-down params passing for generateStaticParams().\n * Walks up the route hierarchy to find parent dynamic segments that have their\n * own generateStaticParams. Collects parent params by calling each parent's\n * generateStaticParams in order, merging results top-down.\n *\n * Returns an array of parent param combinations. If empty, the child should\n * be called with `{ params: {} }` (bottom-up approach).\n */\nasync function resolveParentParams(\n childRoute: AppRoute,\n allRoutes: AppRoute[],\n server: ViteDevServer,\n): Promise<Record<string, string | string[]>[]> {\n // Extract the dynamic segment names from the pattern\n const patternParts = childRoute.pattern.split(\"/\").filter(Boolean);\n\n // Identify parent dynamic segments: each :param in the pattern except the last one(s)\n // that belong to the leaf page's directory.\n // Strategy: find ancestor routes (layout-level) that export generateStaticParams.\n // An ancestor route's pattern is a prefix of the child's pattern.\n\n // Collect parent segments with generateStaticParams by looking at page modules\n // along the ancestor path. We look for pages/layouts that define generateStaticParams\n // at each level of the path hierarchy.\n type ParentSegment = {\n params: string[];\n generateStaticParams: (opts: { params: Record<string, string | string[]> }) => Promise<Record<string, string | string[]>[]>;\n };\n\n const parentSegments: ParentSegment[] = [];\n\n // Walk pattern parts to find intermediate dynamic segments\n // For /products/:category/:id, we look for a route or layout at /products/:category\n // that has generateStaticParams\n for (let i = 0; i < patternParts.length; i++) {\n const part = patternParts[i];\n if (!part.startsWith(\":\")) continue;\n\n // Check if this is not the last dynamic param (i.e., it's a parent segment)\n const isLastDynamicPart = !patternParts.slice(i + 1).some((p) => p.startsWith(\":\"));\n if (isLastDynamicPart) break; // This is the child's own segment\n\n // Build the prefix pattern up to this segment\n const prefixPattern = \"/\" + patternParts.slice(0, i + 1).join(\"/\");\n\n // Find a route at this prefix that has generateStaticParams\n const parentRoute = allRoutes.find((r) => r.pattern === prefixPattern);\n if (parentRoute?.pagePath) {\n try {\n const parentModule = await server.ssrLoadModule(parentRoute.pagePath);\n if (typeof parentModule.generateStaticParams === \"function\") {\n const paramName = part.replace(/^:/, \"\").replace(/[+*]$/, \"\");\n parentSegments.push({\n params: [paramName],\n generateStaticParams: parentModule.generateStaticParams,\n });\n }\n } catch {\n // Skip — parent module couldn't be loaded\n }\n }\n }\n\n if (parentSegments.length === 0) return [];\n\n // Top-down resolution: call each parent's generateStaticParams in order,\n // accumulating params\n let currentParams: Record<string, string | string[]>[] = [{}];\n\n for (const segment of parentSegments) {\n const nextParams: Record<string, string | string[]>[] = [];\n for (const parentParams of currentParams) {\n const results = await segment.generateStaticParams({ params: parentParams });\n if (Array.isArray(results)) {\n for (const result of results) {\n nextParams.push({ ...parentParams, ...result });\n }\n }\n }\n currentParams = nextParams;\n }\n\n return currentParams;\n}\n\n// -------------------------------------------------------------------\n// App Router static export\n// -------------------------------------------------------------------\n\nexport interface AppStaticExportOptions {\n /** Base URL of a running dev server (e.g. \"http://localhost:5173\") */\n baseUrl: string;\n /** Discovered app routes */\n routes: AppRoute[];\n /** App directory path (for loading modules to call generateStaticParams) */\n appDir: string;\n /** Vite dev server (for loading page modules) */\n server: ViteDevServer;\n /** Output directory */\n outDir: string;\n /** Resolved next.config.js */\n config: ResolvedNextConfig;\n}\n\n/**\n * Run static export for App Router.\n *\n * Fetches each route from a running dev server and writes the HTML to disk.\n * For dynamic routes, calls generateStaticParams() to expand all paths.\n */\nexport async function staticExportApp(\n options: AppStaticExportOptions,\n): Promise<StaticExportResult> {\n const { baseUrl, routes, server, outDir, config } = options;\n const result: StaticExportResult = {\n pageCount: 0,\n files: [],\n warnings: [],\n errors: [],\n };\n\n fs.mkdirSync(outDir, { recursive: true });\n\n // Collect all URLs to render\n const urlsToRender: string[] = [];\n\n for (const route of routes) {\n // Skip API route handlers — not supported in static export\n if (route.routePath && !route.pagePath) {\n result.warnings.push(\n `Route handler ${route.pattern} skipped — API routes are not supported with output: 'export'`,\n );\n continue;\n }\n\n if (!route.pagePath) continue;\n\n if (route.isDynamic) {\n // Dynamic route — must have generateStaticParams\n try {\n const pageModule = await server.ssrLoadModule(route.pagePath);\n\n if (typeof pageModule.generateStaticParams !== \"function\") {\n result.errors.push({\n route: route.pattern,\n error: `Dynamic route requires generateStaticParams() with output: 'export'`,\n });\n continue;\n }\n\n // Resolve parent dynamic segments for top-down params passing.\n // Find all other routes whose patterns are prefixes of this route's pattern\n // and that have dynamic params, then collect their generateStaticParams.\n const parentParamSets = await resolveParentParams(route, routes, server);\n\n let paramSets: Record<string, string | string[]>[];\n if (parentParamSets.length > 0) {\n // Top-down: call child's generateStaticParams for each parent param set\n paramSets = [];\n for (const parentParams of parentParamSets) {\n const childResults = await pageModule.generateStaticParams({ params: parentParams });\n if (Array.isArray(childResults)) {\n for (const childParams of childResults) {\n paramSets.push({ ...parentParams, ...childParams });\n }\n }\n }\n } else {\n // Bottom-up: no parent params, call with empty params\n paramSets = await pageModule.generateStaticParams({ params: {} });\n }\n\n if (!Array.isArray(paramSets) || paramSets.length === 0) {\n result.warnings.push(\n `generateStaticParams() for ${route.pattern} returned empty array — no pages generated`,\n );\n continue;\n }\n\n for (const params of paramSets) {\n const urlPath = buildUrlFromParams(route.pattern, params);\n urlsToRender.push(urlPath);\n }\n } catch (e) {\n result.errors.push({\n route: route.pattern,\n error: `Failed to call generateStaticParams(): ${(e as Error).message}`,\n });\n }\n } else {\n // Static route\n urlsToRender.push(route.pattern);\n }\n }\n\n // Fetch each URL from the dev server and write HTML\n for (const urlPath of urlsToRender) {\n try {\n const res = await fetch(`${baseUrl}${urlPath}`);\n if (!res.ok) {\n result.errors.push({\n route: urlPath,\n error: `Server returned ${res.status}`,\n });\n continue;\n }\n\n const html = await res.text();\n const outputPath = getOutputPath(urlPath, config.trailingSlash);\n const fullPath = path.join(outDir, outputPath);\n fs.mkdirSync(path.dirname(fullPath), { recursive: true });\n fs.writeFileSync(fullPath, html, \"utf-8\");\n\n result.files.push(outputPath);\n result.pageCount++;\n } catch (e) {\n result.errors.push({\n route: urlPath,\n error: (e as Error).message,\n });\n }\n }\n\n // Render 404 page\n try {\n const res = await fetch(`${baseUrl}/__nonexistent_page_for_404__`);\n if (res.status === 404) {\n const html = await res.text();\n if (html.length > 0) {\n const fullPath = path.join(outDir, \"404.html\");\n fs.writeFileSync(fullPath, html, \"utf-8\");\n result.files.push(\"404.html\");\n result.pageCount++;\n }\n }\n } catch {\n // No custom 404, skip\n }\n\n return result;\n}\n"]}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * vinext check — compatibility scanner for Next.js apps
3
+ *
4
+ * Scans an existing Next.js app and produces a compatibility report
5
+ * showing what will work, what needs changes, and an overall score.
6
+ */
7
+ type Status = "supported" | "partial" | "unsupported";
8
+ interface CheckItem {
9
+ name: string;
10
+ status: Status;
11
+ detail?: string;
12
+ files?: string[];
13
+ }
14
+ export interface CheckResult {
15
+ imports: CheckItem[];
16
+ config: CheckItem[];
17
+ libraries: CheckItem[];
18
+ conventions: CheckItem[];
19
+ summary: {
20
+ supported: number;
21
+ partial: number;
22
+ unsupported: number;
23
+ total: number;
24
+ score: number;
25
+ };
26
+ }
27
+ /**
28
+ * Scan source files for `import ... from 'next/...'` statements.
29
+ */
30
+ export declare function scanImports(root: string): CheckItem[];
31
+ /**
32
+ * Analyze next.config.js/mjs/ts for supported and unsupported options.
33
+ */
34
+ export declare function analyzeConfig(root: string): CheckItem[];
35
+ /**
36
+ * Check package.json dependencies for known libraries.
37
+ */
38
+ export declare function checkLibraries(root: string): CheckItem[];
39
+ /**
40
+ * Check file conventions (pages, app directory, middleware, etc.)
41
+ */
42
+ export declare function checkConventions(root: string): CheckItem[];
43
+ /**
44
+ * Run the full compatibility check.
45
+ */
46
+ export declare function runCheck(root: string): CheckResult;
47
+ /**
48
+ * Format the check result as a colored terminal report.
49
+ */
50
+ export declare function formatReport(result: CheckResult): string;
51
+ export {};
52
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,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,GAAG,MAAM,CA8FxD"}
package/dist/check.js ADDED
@@ -0,0 +1,483 @@
1
+ /**
2
+ * vinext check — compatibility scanner for Next.js apps
3
+ *
4
+ * Scans an existing Next.js app and produces a compatibility report
5
+ * showing what will work, what needs changes, and an overall score.
6
+ */
7
+ import fs from "node:fs";
8
+ import path from "node:path";
9
+ // ── Import support map ─────────────────────────────────────────────────────
10
+ const IMPORT_SUPPORT = {
11
+ "next": { status: "supported", detail: "type-only exports (Metadata, NextPage, etc.)" },
12
+ "next/link": { status: "supported" },
13
+ "next/image": { status: "supported", detail: "uses @unpic/react (no local optimization yet)" },
14
+ "next/router": { status: "supported" },
15
+ "next/navigation": { status: "supported" },
16
+ "next/headers": { status: "supported" },
17
+ "next/server": { status: "supported", detail: "NextRequest/NextResponse shimmed" },
18
+ "next/cache": { status: "supported", detail: "revalidateTag, revalidatePath, unstable_cache, cacheLife, cacheTag" },
19
+ "next/dynamic": { status: "supported" },
20
+ "next/head": { status: "supported" },
21
+ "next/script": { status: "supported" },
22
+ "next/font/google": { status: "partial", detail: "fonts loaded from CDN, not self-hosted at build time" },
23
+ "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" },
24
+ "next/og": { status: "supported", detail: "ImageResponse via @vercel/og" },
25
+ "next/config": { status: "supported" },
26
+ "next/amp": { status: "unsupported", detail: "AMP is not supported" },
27
+ "next/document": { status: "supported", detail: "custom _document.tsx" },
28
+ "next/app": { status: "supported", detail: "custom _app.tsx" },
29
+ "next/error": { status: "supported" },
30
+ "next/third-parties/google": { status: "unsupported", detail: "third-party script optimization not implemented" },
31
+ "server-only": { status: "supported" },
32
+ "client-only": { status: "supported" },
33
+ };
34
+ // ── Config support map ─────────────────────────────────────────────────────
35
+ const CONFIG_SUPPORT = {
36
+ basePath: { status: "supported" },
37
+ trailingSlash: { status: "supported" },
38
+ redirects: { status: "supported" },
39
+ rewrites: { status: "supported" },
40
+ headers: { status: "supported" },
41
+ i18n: { status: "supported", detail: "path-prefix routing (domains not yet supported)" },
42
+ env: { status: "supported" },
43
+ images: { status: "partial", detail: "remotePatterns validated, no local optimization" },
44
+ output: { status: "supported", detail: "'export' and 'standalone' modes" },
45
+ transpilePackages: { status: "supported", detail: "Vite handles this natively" },
46
+ webpack: { status: "unsupported", detail: "Vite replaces webpack — custom webpack configs need migration" },
47
+ "experimental.ppr": { status: "unsupported", detail: "partial prerendering not yet implemented" },
48
+ "experimental.typedRoutes": { status: "unsupported", detail: "typed routes not implemented" },
49
+ "experimental.serverActions": { status: "supported", detail: "server actions via 'use server' directive" },
50
+ "i18n.domains": { status: "unsupported", detail: "domain-based i18n routing not implemented" },
51
+ reactStrictMode: { status: "supported", detail: "always enabled" },
52
+ poweredByHeader: { status: "supported", detail: "not sent (matching Next.js default when disabled)" },
53
+ };
54
+ // ── Library support map ────────────────────────────────────────────────────
55
+ const LIBRARY_SUPPORT = {
56
+ "next-themes": { status: "supported" },
57
+ nuqs: { status: "supported" },
58
+ "next-view-transitions": { status: "supported" },
59
+ "@vercel/analytics": { status: "supported", detail: "analytics script injected client-side" },
60
+ "next-intl": { status: "partial", detail: "works with middleware-based setup, some server component features may differ" },
61
+ "@clerk/nextjs": { status: "unsupported", detail: "deep Next.js middleware integration not compatible" },
62
+ "@auth/nextjs": { status: "unsupported", detail: "relies on Next.js internal auth handlers; consider migrating to better-auth" },
63
+ "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)" },
64
+ "better-auth": { status: "supported", detail: "uses only public next/* APIs (headers, cookies, NextRequest/NextResponse)" },
65
+ "@sentry/nextjs": { status: "partial", detail: "client-side works, server integration needs manual setup" },
66
+ "@t3-oss/env-nextjs": { status: "supported" },
67
+ "tailwindcss": { status: "supported" },
68
+ "styled-components": { status: "partial", detail: "needs useServerInsertedHTML (not yet implemented)" },
69
+ "@emotion/react": { status: "partial", detail: "needs useServerInsertedHTML (not yet implemented)" },
70
+ "lucide-react": { status: "supported" },
71
+ "framer-motion": { status: "supported" },
72
+ "@radix-ui/react-dialog": { status: "supported" },
73
+ "shadcn-ui": { status: "supported" },
74
+ zod: { status: "supported" },
75
+ "react-hook-form": { status: "supported" },
76
+ prisma: { status: "supported", detail: "works on Cloudflare Workers with Prisma Accelerate" },
77
+ drizzle: { status: "supported", detail: "works with D1 on Cloudflare Workers" },
78
+ };
79
+ // ── Scanning functions ─────────────────────────────────────────────────────
80
+ /**
81
+ * Recursively find all source files in a directory.
82
+ */
83
+ function findSourceFiles(dir, extensions = [".ts", ".tsx", ".js", ".jsx", ".mjs"]) {
84
+ const results = [];
85
+ if (!fs.existsSync(dir))
86
+ return results;
87
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
88
+ for (const entry of entries) {
89
+ const fullPath = path.join(dir, entry.name);
90
+ if (entry.isDirectory()) {
91
+ if (entry.name === "node_modules" || entry.name === ".next" || entry.name === "dist" || entry.name === ".git")
92
+ continue;
93
+ results.push(...findSourceFiles(fullPath, extensions));
94
+ }
95
+ else if (extensions.some(ext => entry.name.endsWith(ext))) {
96
+ results.push(fullPath);
97
+ }
98
+ }
99
+ return results;
100
+ }
101
+ /**
102
+ * Scan source files for `import ... from 'next/...'` statements.
103
+ */
104
+ export function scanImports(root) {
105
+ const files = findSourceFiles(root);
106
+ const importUsage = new Map();
107
+ const importRegex = /(?:import\s+(?:[\w{},\s*]+\s+from\s+)?|require\s*\()['"]([^'"]+)['"]\)?/g;
108
+ // Skip `import type` and `import { type ... }` — they're erased at compile time
109
+ const typeOnlyImportRegex = /import\s+type\s+/;
110
+ for (const file of files) {
111
+ const content = fs.readFileSync(file, "utf-8");
112
+ let match;
113
+ while ((match = importRegex.exec(content)) !== null) {
114
+ const mod = match[1];
115
+ // Skip type-only imports (no runtime effect)
116
+ const lineStart = content.lastIndexOf("\n", match.index) + 1;
117
+ const line = content.slice(lineStart, match.index + match[0].length);
118
+ if (typeOnlyImportRegex.test(line))
119
+ continue;
120
+ // Only track next/* imports and server-only/client-only
121
+ if (mod.startsWith("next/") || mod === "next" || mod === "server-only" || mod === "client-only") {
122
+ // Normalize: next/font/google -> next/font/google
123
+ const normalized = mod === "next" ? "next" : mod;
124
+ if (!importUsage.has(normalized))
125
+ importUsage.set(normalized, []);
126
+ const relFile = path.relative(root, file);
127
+ if (!importUsage.get(normalized).includes(relFile)) {
128
+ importUsage.get(normalized).push(relFile);
129
+ }
130
+ }
131
+ }
132
+ }
133
+ const items = [];
134
+ for (const [mod, usedFiles] of importUsage) {
135
+ const support = IMPORT_SUPPORT[mod];
136
+ if (support) {
137
+ items.push({
138
+ name: mod,
139
+ status: support.status,
140
+ detail: support.detail,
141
+ files: usedFiles,
142
+ });
143
+ }
144
+ else {
145
+ items.push({
146
+ name: mod,
147
+ status: "unsupported",
148
+ detail: "not recognized by vinext",
149
+ files: usedFiles,
150
+ });
151
+ }
152
+ }
153
+ // Sort: unsupported first, then partial, then supported
154
+ items.sort((a, b) => {
155
+ const order = { unsupported: 0, partial: 1, supported: 2 };
156
+ return order[a.status] - order[b.status];
157
+ });
158
+ return items;
159
+ }
160
+ /**
161
+ * Analyze next.config.js/mjs/ts for supported and unsupported options.
162
+ */
163
+ export function analyzeConfig(root) {
164
+ const configFiles = ["next.config.ts", "next.config.mjs", "next.config.js", "next.config.cjs"];
165
+ let configPath = null;
166
+ for (const f of configFiles) {
167
+ const p = path.join(root, f);
168
+ if (fs.existsSync(p)) {
169
+ configPath = p;
170
+ break;
171
+ }
172
+ }
173
+ if (!configPath) {
174
+ return [{ name: "next.config", status: "supported", detail: "no config file found (defaults are fine)" }];
175
+ }
176
+ const content = fs.readFileSync(configPath, "utf-8");
177
+ const items = [];
178
+ // Check for known config options by searching for property names in the config file
179
+ const configOptions = [
180
+ "basePath", "trailingSlash", "redirects", "rewrites", "headers",
181
+ "i18n", "env", "images", "output", "transpilePackages", "webpack",
182
+ "reactStrictMode", "poweredByHeader",
183
+ ];
184
+ for (const opt of configOptions) {
185
+ // Simple heuristic: check if the option name appears as a property in the config
186
+ const regex = new RegExp(`\\b${opt}\\b`);
187
+ if (regex.test(content)) {
188
+ const support = CONFIG_SUPPORT[opt];
189
+ if (support) {
190
+ items.push({ name: opt, status: support.status, detail: support.detail });
191
+ }
192
+ else {
193
+ items.push({ name: opt, status: "unsupported", detail: "not recognized" });
194
+ }
195
+ }
196
+ }
197
+ // Check for experimental options
198
+ if (/experimental\s*[:=]\s*\{/.test(content)) {
199
+ if (/\bppr\b/.test(content)) {
200
+ items.push({ name: "experimental.ppr", ...CONFIG_SUPPORT["experimental.ppr"] });
201
+ }
202
+ if (/\btypedRoutes\b/.test(content)) {
203
+ items.push({ name: "experimental.typedRoutes", ...CONFIG_SUPPORT["experimental.typedRoutes"] });
204
+ }
205
+ if (/\bserverActions\b/.test(content)) {
206
+ items.push({ name: "experimental.serverActions", ...CONFIG_SUPPORT["experimental.serverActions"] });
207
+ }
208
+ }
209
+ // Check for i18n.domains
210
+ if (/domains\s*:/.test(content) && /i18n/.test(content)) {
211
+ items.push({ name: "i18n.domains", ...CONFIG_SUPPORT["i18n.domains"] });
212
+ }
213
+ // Sort: unsupported first
214
+ items.sort((a, b) => {
215
+ const order = { unsupported: 0, partial: 1, supported: 2 };
216
+ return order[a.status] - order[b.status];
217
+ });
218
+ return items;
219
+ }
220
+ /**
221
+ * Check package.json dependencies for known libraries.
222
+ */
223
+ export function checkLibraries(root) {
224
+ const pkgPath = path.join(root, "package.json");
225
+ if (!fs.existsSync(pkgPath))
226
+ return [];
227
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
228
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
229
+ const items = [];
230
+ for (const [lib, support] of Object.entries(LIBRARY_SUPPORT)) {
231
+ if (allDeps[lib]) {
232
+ items.push({
233
+ name: lib,
234
+ status: support.status,
235
+ detail: support.detail,
236
+ });
237
+ }
238
+ }
239
+ // Sort: unsupported first
240
+ items.sort((a, b) => {
241
+ const order = { unsupported: 0, partial: 1, supported: 2 };
242
+ return order[a.status] - order[b.status];
243
+ });
244
+ return items;
245
+ }
246
+ /**
247
+ * Check file conventions (pages, app directory, middleware, etc.)
248
+ */
249
+ export function checkConventions(root) {
250
+ const items = [];
251
+ // Check for pages/ and app/ at root level, then fall back to src/
252
+ const pagesDir = fs.existsSync(path.join(root, "pages"))
253
+ ? path.join(root, "pages")
254
+ : fs.existsSync(path.join(root, "src", "pages"))
255
+ ? path.join(root, "src", "pages")
256
+ : null;
257
+ const appDirPath = fs.existsSync(path.join(root, "app"))
258
+ ? path.join(root, "app")
259
+ : fs.existsSync(path.join(root, "src", "app"))
260
+ ? path.join(root, "src", "app")
261
+ : null;
262
+ const hasPages = pagesDir !== null;
263
+ const hasApp = appDirPath !== null;
264
+ const hasProxy = fs.existsSync(path.join(root, "proxy.ts")) || fs.existsSync(path.join(root, "proxy.js"));
265
+ const hasMiddleware = fs.existsSync(path.join(root, "middleware.ts")) || fs.existsSync(path.join(root, "middleware.js"));
266
+ if (hasPages) {
267
+ const isSrc = pagesDir.includes(path.join("src", "pages"));
268
+ items.push({ name: isSrc ? "Pages Router (src/pages/)" : "Pages Router (pages/)", status: "supported" });
269
+ // Count pages
270
+ const pageFiles = findSourceFiles(pagesDir);
271
+ const pages = pageFiles.filter(f => !f.includes("/api/") && !f.includes("_app") && !f.includes("_document") && !f.includes("_error"));
272
+ const apiRoutes = pageFiles.filter(f => f.includes("/api/"));
273
+ items.push({ name: `${pages.length} page(s)`, status: "supported" });
274
+ if (apiRoutes.length) {
275
+ items.push({ name: `${apiRoutes.length} API route(s)`, status: "supported" });
276
+ }
277
+ // Check for _app, _document
278
+ if (pageFiles.some(f => f.includes("_app"))) {
279
+ items.push({ name: "Custom _app", status: "supported" });
280
+ }
281
+ if (pageFiles.some(f => f.includes("_document"))) {
282
+ items.push({ name: "Custom _document", status: "supported" });
283
+ }
284
+ }
285
+ if (hasApp) {
286
+ const isSrc = appDirPath.includes(path.join("src", "app"));
287
+ items.push({ name: isSrc ? "App Router (src/app/)" : "App Router (app/)", status: "supported" });
288
+ const appFiles = findSourceFiles(appDirPath);
289
+ const pages = appFiles.filter(f => f.endsWith("page.tsx") || f.endsWith("page.jsx") || f.endsWith("page.ts") || f.endsWith("page.js"));
290
+ const layouts = appFiles.filter(f => f.endsWith("layout.tsx") || f.endsWith("layout.jsx") || f.endsWith("layout.ts") || f.endsWith("layout.js"));
291
+ const routes = appFiles.filter(f => f.endsWith("route.tsx") || f.endsWith("route.ts") || f.endsWith("route.js"));
292
+ const loadings = appFiles.filter(f => f.endsWith("loading.tsx") || f.endsWith("loading.jsx"));
293
+ const errors = appFiles.filter(f => f.endsWith("error.tsx") || f.endsWith("error.jsx"));
294
+ const notFounds = appFiles.filter(f => f.endsWith("not-found.tsx") || f.endsWith("not-found.jsx"));
295
+ items.push({ name: `${pages.length} page(s)`, status: "supported" });
296
+ if (layouts.length)
297
+ items.push({ name: `${layouts.length} layout(s)`, status: "supported" });
298
+ if (routes.length)
299
+ items.push({ name: `${routes.length} route handler(s)`, status: "supported" });
300
+ if (loadings.length)
301
+ items.push({ name: `${loadings.length} loading boundary(ies)`, status: "supported" });
302
+ if (errors.length)
303
+ items.push({ name: `${errors.length} error boundary(ies)`, status: "supported" });
304
+ if (notFounds.length)
305
+ items.push({ name: `${notFounds.length} not-found page(s)`, status: "supported" });
306
+ }
307
+ if (hasProxy) {
308
+ items.push({ name: "proxy.ts (Next.js 16)", status: "supported" });
309
+ }
310
+ else if (hasMiddleware) {
311
+ items.push({ name: "middleware.ts (deprecated in Next.js 16)", status: "supported" });
312
+ }
313
+ if (!hasPages && !hasApp) {
314
+ items.push({ name: "No pages/ or app/ directory found", status: "unsupported", detail: "vinext requires a pages/ or app/ directory" });
315
+ }
316
+ // Check for "type": "module" in package.json
317
+ const pkgPath = path.join(root, "package.json");
318
+ if (fs.existsSync(pkgPath)) {
319
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
320
+ if (pkg.type !== "module") {
321
+ items.push({
322
+ name: 'Missing "type": "module" in package.json',
323
+ status: "unsupported",
324
+ detail: "required for Vite — run `vinext init` to add it automatically",
325
+ });
326
+ }
327
+ }
328
+ // Scan for ViewTransition import from react
329
+ const allSourceFiles = findSourceFiles(root);
330
+ const viewTransitionRegex = /import\s+\{[^}]*\bViewTransition\b[^}]*\}\s+from\s+['"]react['"]/;
331
+ const viewTransitionFiles = [];
332
+ for (const file of allSourceFiles) {
333
+ const content = fs.readFileSync(file, "utf-8");
334
+ if (viewTransitionRegex.test(content)) {
335
+ viewTransitionFiles.push(path.relative(root, file));
336
+ }
337
+ }
338
+ if (viewTransitionFiles.length > 0) {
339
+ items.push({
340
+ name: "ViewTransition (React canary API)",
341
+ status: "partial",
342
+ detail: "vinext auto-shims with a passthrough fallback, view transitions won't animate",
343
+ files: viewTransitionFiles,
344
+ });
345
+ }
346
+ // Check PostCSS config for string-form plugins
347
+ const postcssConfigs = ["postcss.config.mjs", "postcss.config.js", "postcss.config.cjs"];
348
+ for (const configFile of postcssConfigs) {
349
+ const configPath = path.join(root, configFile);
350
+ if (fs.existsSync(configPath)) {
351
+ const content = fs.readFileSync(configPath, "utf-8");
352
+ // Detect string-form plugins: plugins: ["..."] or plugins: ['...']
353
+ const stringPluginRegex = /plugins\s*:\s*\[[\s\S]*?(['"][^'"]+['"])[\s\S]*?\]/;
354
+ const match = stringPluginRegex.exec(content);
355
+ if (match) {
356
+ // Check it's not require() or import() form — just bare string literals in the array
357
+ const pluginsBlock = match[0];
358
+ // If plugins array contains string literals not wrapped in require()
359
+ if (/plugins\s*:\s*\[[\s\n]*['"]/.test(pluginsBlock)) {
360
+ items.push({
361
+ name: `PostCSS string-form plugins (${configFile})`,
362
+ status: "partial",
363
+ detail: "string-form PostCSS plugins need resolution — vinext handles this automatically",
364
+ });
365
+ }
366
+ }
367
+ break; // Only check the first config file found
368
+ }
369
+ }
370
+ return items;
371
+ }
372
+ /**
373
+ * Run the full compatibility check.
374
+ */
375
+ export function runCheck(root) {
376
+ const imports = scanImports(root);
377
+ const config = analyzeConfig(root);
378
+ const libraries = checkLibraries(root);
379
+ const conventions = checkConventions(root);
380
+ const allItems = [...imports, ...config, ...libraries, ...conventions];
381
+ const supported = allItems.filter(i => i.status === "supported").length;
382
+ const partial = allItems.filter(i => i.status === "partial").length;
383
+ const unsupported = allItems.filter(i => i.status === "unsupported").length;
384
+ const total = allItems.length;
385
+ // Score: supported = 1, partial = 0.5, unsupported = 0
386
+ const score = total > 0 ? Math.round(((supported + partial * 0.5) / total) * 100) : 100;
387
+ return {
388
+ imports,
389
+ config,
390
+ libraries,
391
+ conventions,
392
+ summary: { supported, partial, unsupported, total, score },
393
+ };
394
+ }
395
+ /**
396
+ * Format the check result as a colored terminal report.
397
+ */
398
+ export function formatReport(result) {
399
+ const lines = [];
400
+ const statusIcon = (s) => s === "supported" ? "\x1b[32m✓\x1b[0m" : s === "partial" ? "\x1b[33m~\x1b[0m" : "\x1b[31m✗\x1b[0m";
401
+ lines.push("");
402
+ lines.push(" \x1b[1mvinext compatibility report\x1b[0m");
403
+ lines.push(" " + "=".repeat(40));
404
+ lines.push("");
405
+ // Imports
406
+ if (result.imports.length > 0) {
407
+ const importSupported = result.imports.filter(i => i.status === "supported").length;
408
+ lines.push(` \x1b[1mImports\x1b[0m: ${importSupported}/${result.imports.length} fully supported`);
409
+ for (const item of result.imports) {
410
+ const suffix = item.detail ? ` \x1b[90m— ${item.detail}\x1b[0m` : "";
411
+ const fileCount = item.files ? ` \x1b[90m(${item.files.length} file${item.files.length === 1 ? "" : "s"})\x1b[0m` : "";
412
+ lines.push(` ${statusIcon(item.status)} ${item.name}${fileCount}${suffix}`);
413
+ }
414
+ lines.push("");
415
+ }
416
+ // Config
417
+ if (result.config.length > 0) {
418
+ const configSupported = result.config.filter(i => i.status === "supported").length;
419
+ lines.push(` \x1b[1mConfig\x1b[0m: ${configSupported}/${result.config.length} options supported`);
420
+ for (const item of result.config) {
421
+ const suffix = item.detail ? ` \x1b[90m— ${item.detail}\x1b[0m` : "";
422
+ lines.push(` ${statusIcon(item.status)} ${item.name}${suffix}`);
423
+ }
424
+ lines.push("");
425
+ }
426
+ // Libraries
427
+ if (result.libraries.length > 0) {
428
+ const libSupported = result.libraries.filter(i => i.status === "supported").length;
429
+ lines.push(` \x1b[1mLibraries\x1b[0m: ${libSupported}/${result.libraries.length} compatible`);
430
+ for (const item of result.libraries) {
431
+ const suffix = item.detail ? ` \x1b[90m— ${item.detail}\x1b[0m` : "";
432
+ lines.push(` ${statusIcon(item.status)} ${item.name}${suffix}`);
433
+ }
434
+ lines.push("");
435
+ }
436
+ // Conventions
437
+ if (result.conventions.length > 0) {
438
+ lines.push(` \x1b[1mProject structure\x1b[0m:`);
439
+ for (const item of result.conventions) {
440
+ const suffix = item.detail ? ` \x1b[90m— ${item.detail}\x1b[0m` : "";
441
+ lines.push(` ${statusIcon(item.status)} ${item.name}${suffix}`);
442
+ }
443
+ lines.push("");
444
+ }
445
+ // Summary
446
+ const { score, supported, partial, unsupported } = result.summary;
447
+ const scoreColor = score >= 90 ? "\x1b[32m" : score >= 70 ? "\x1b[33m" : "\x1b[31m";
448
+ lines.push(" " + "-".repeat(40));
449
+ lines.push(` \x1b[1mOverall\x1b[0m: ${scoreColor}${score}% compatible\x1b[0m (${supported} supported, ${partial} partial, ${unsupported} issues)`);
450
+ if (unsupported > 0) {
451
+ lines.push("");
452
+ lines.push(" \x1b[1mIssues to address:\x1b[0m");
453
+ const allItems = [...result.imports, ...result.config, ...result.libraries, ...result.conventions];
454
+ for (const item of allItems) {
455
+ if (item.status === "unsupported") {
456
+ lines.push(` \x1b[31m✗\x1b[0m ${item.name}${item.detail ? ` — ${item.detail}` : ""}`);
457
+ }
458
+ }
459
+ }
460
+ if (result.summary.partial > 0) {
461
+ lines.push("");
462
+ lines.push(" \x1b[1mPartial support (may need attention):\x1b[0m");
463
+ const allItems = [...result.imports, ...result.config, ...result.libraries, ...result.conventions];
464
+ for (const item of allItems) {
465
+ if (item.status === "partial") {
466
+ lines.push(` \x1b[33m~\x1b[0m ${item.name}${item.detail ? ` — ${item.detail}` : ""}`);
467
+ }
468
+ }
469
+ }
470
+ // Actionable next steps
471
+ lines.push("");
472
+ lines.push(" \x1b[1mRecommended next steps:\x1b[0m");
473
+ lines.push(` Run \x1b[36mvinext init\x1b[0m to set up your project automatically`);
474
+ lines.push("");
475
+ lines.push(" Or manually:");
476
+ lines.push(` 1. Add \x1b[36m"type": "module"\x1b[0m to package.json`);
477
+ lines.push(` 2. Install: \x1b[36mnpm install -D vite @vitejs/plugin-rsc\x1b[0m`);
478
+ lines.push(` 3. Create vite.config.ts (see docs)`);
479
+ lines.push(` 4. Run: \x1b[36mnpx vite dev\x1b[0m`);
480
+ lines.push("");
481
+ return lines.join("\n");
482
+ }
483
+ //# sourceMappingURL=check.js.map