vinext 0.0.22 → 0.0.23

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 (45) hide show
  1. package/dist/build/static-export.d.ts.map +1 -1
  2. package/dist/build/static-export.js +9 -7
  3. package/dist/build/static-export.js.map +1 -1
  4. package/dist/config/next-config.d.ts +4 -1
  5. package/dist/config/next-config.d.ts.map +1 -1
  6. package/dist/config/next-config.js +10 -5
  7. package/dist/config/next-config.js.map +1 -1
  8. package/dist/deploy.d.ts.map +1 -1
  9. package/dist/deploy.js +11 -1
  10. package/dist/deploy.js.map +1 -1
  11. package/dist/index.d.ts +25 -0
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +202 -28
  14. package/dist/index.js.map +1 -1
  15. package/dist/routing/app-router.d.ts +2 -1
  16. package/dist/routing/app-router.d.ts.map +1 -1
  17. package/dist/routing/app-router.js +73 -66
  18. package/dist/routing/app-router.js.map +1 -1
  19. package/dist/routing/file-matcher.d.ts +24 -0
  20. package/dist/routing/file-matcher.d.ts.map +1 -0
  21. package/dist/routing/file-matcher.js +75 -0
  22. package/dist/routing/file-matcher.js.map +1 -0
  23. package/dist/routing/pages-router.d.ts +3 -2
  24. package/dist/routing/pages-router.d.ts.map +1 -1
  25. package/dist/routing/pages-router.js +24 -17
  26. package/dist/routing/pages-router.js.map +1 -1
  27. package/dist/server/app-dev-server.d.ts.map +1 -1
  28. package/dist/server/app-dev-server.js +54 -45
  29. package/dist/server/app-dev-server.js.map +1 -1
  30. package/dist/server/dev-server.d.ts +2 -1
  31. package/dist/server/dev-server.d.ts.map +1 -1
  32. package/dist/server/dev-server.js +16 -14
  33. package/dist/server/dev-server.js.map +1 -1
  34. package/dist/server/prod-server.d.ts.map +1 -1
  35. package/dist/server/prod-server.js +26 -2
  36. package/dist/server/prod-server.js.map +1 -1
  37. package/dist/shims/cache.d.ts +1 -1
  38. package/dist/shims/cache.d.ts.map +1 -1
  39. package/dist/shims/cache.js +8 -3
  40. package/dist/shims/cache.js.map +1 -1
  41. package/dist/shims/metadata.d.ts +1 -0
  42. package/dist/shims/metadata.d.ts.map +1 -1
  43. package/dist/shims/metadata.js +5 -1
  44. package/dist/shims/metadata.js.map +1 -1
  45. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"static-export.d.ts","sourceRoot":"","sources":["../../src/build/static-export.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAwBnE,MAAM,WAAW,mBAAmB;IAClC,+CAA+C;IAC/C,MAAM,EAAE,aAAa,CAAC;IACtB,mDAAmD;IACnD,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,4BAA4B;IAC5B,SAAS,EAAE,KAAK,EAAE,CAAC;IACnB,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,qDAAqD;IACrD,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAmK7B;AAiXD,MAAM,WAAW,sBAAsB;IACrC,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,MAAM,EAAE,aAAa,CAAC;IACtB,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,kBAAkB,CAAC,CAgI7B"}
1
+ {"version":3,"file":"static-export.d.ts","sourceRoot":"","sources":["../../src/build/static-export.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAuBnE,MAAM,WAAW,mBAAmB;IAClC,+CAA+C;IAC/C,MAAM,EAAE,aAAa,CAAC;IACtB,mDAAmD;IACnD,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,4BAA4B;IAC5B,SAAS,EAAE,KAAK,EAAE,CAAC;IACnB,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,qDAAqD;IACrD,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAqK7B;AAkXD,MAAM,WAAW,sBAAsB;IACrC,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,MAAM,EAAE,aAAa,CAAC;IACtB,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,kBAAkB,CAAC,CAgI7B"}
@@ -4,9 +4,9 @@ import path from "node:path";
4
4
  import fs from "node:fs";
5
5
  import React from "react";
6
6
  import { renderToReadableStream } from "react-dom/server.edge";
7
- const PAGE_EXTENSIONS = [".tsx", ".ts", ".jsx", ".js"];
8
- function findFileWithExtensions(basePath) {
9
- return PAGE_EXTENSIONS.some((ext) => fs.existsSync(basePath + ext));
7
+ import { createValidFileMatcher } from "../routing/file-matcher.js";
8
+ function findFileWithExtensions(basePath, matcher) {
9
+ return matcher.dottedExtensions.some((ext) => fs.existsSync(basePath + ext));
10
10
  }
11
11
  /**
12
12
  * Render a React element to string using renderToReadableStream (Suspense support).
@@ -24,6 +24,7 @@ async function renderToStringAsync(element) {
24
24
  */
25
25
  export async function staticExportPages(options) {
26
26
  const { server, routes, apiRoutes, pagesDir, outDir, config } = options;
27
+ const fileMatcher = createValidFileMatcher(config.pageExtensions);
27
28
  const result = {
28
29
  pageCount: 0,
29
30
  files: [],
@@ -88,7 +89,7 @@ export async function staticExportPages(options) {
88
89
  // Load shared components (_app, _document, head shim, dynamic shim)
89
90
  let AppComponent = null;
90
91
  const appPath = path.join(pagesDir, "_app");
91
- if (findFileWithExtensions(appPath)) {
92
+ if (findFileWithExtensions(appPath, fileMatcher)) {
92
93
  try {
93
94
  const appModule = await server.ssrLoadModule(appPath);
94
95
  AppComponent = appModule.default ?? null;
@@ -99,7 +100,7 @@ export async function staticExportPages(options) {
99
100
  }
100
101
  let DocumentComponent = null;
101
102
  const docPath = path.join(pagesDir, "_document");
102
- if (findFileWithExtensions(docPath)) {
103
+ if (findFileWithExtensions(docPath, fileMatcher)) {
103
104
  try {
104
105
  const docModule = await server.ssrLoadModule(docPath);
105
106
  DocumentComponent = docModule.default ?? null;
@@ -150,6 +151,7 @@ export async function staticExportPages(options) {
150
151
  AppComponent,
151
152
  DocumentComponent,
152
153
  headShim,
154
+ fileMatcher,
153
155
  });
154
156
  if (html404) {
155
157
  const fullPath = path.join(outDir, "404.html");
@@ -262,7 +264,7 @@ async function renderStaticPage(options) {
262
264
  return html;
263
265
  }
264
266
  async function renderErrorPage(options) {
265
- const { server, pagesDir, statusCode, AppComponent, DocumentComponent, headShim } = options;
267
+ const { server, pagesDir, statusCode, AppComponent, DocumentComponent, headShim, fileMatcher } = options;
266
268
  const candidates = statusCode === 404
267
269
  ? ["404", "_error"]
268
270
  : statusCode === 500
@@ -270,7 +272,7 @@ async function renderErrorPage(options) {
270
272
  : ["_error"];
271
273
  for (const candidate of candidates) {
272
274
  const candidatePath = path.join(pagesDir, candidate);
273
- if (!findFileWithExtensions(candidatePath))
275
+ if (!findFileWithExtensions(candidatePath, fileMatcher))
274
276
  continue;
275
277
  const errorModule = await server.ssrLoadModule(candidatePath);
276
278
  const ErrorComponent = errorModule.default;
@@ -1 +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"]}
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\";\nimport { createValidFileMatcher, type ValidFileMatcher } from \"../routing/file-matcher.js\";\n\nfunction findFileWithExtensions(basePath: string, matcher: ValidFileMatcher): boolean {\n return matcher.dottedExtensions.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 fileMatcher = createValidFileMatcher(config.pageExtensions);\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, fileMatcher)) {\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, fileMatcher)) {\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 fileMatcher,\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 fileMatcher: ValidFileMatcher;\n}\n\nasync function renderErrorPage(\n options: RenderErrorPageOptions,\n): Promise<string | null> {\n const { server, pagesDir, statusCode, AppComponent, DocumentComponent, headShim, fileMatcher } =\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, fileMatcher)) 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"]}
@@ -102,6 +102,8 @@ export interface NextConfig {
102
102
  };
103
103
  /** Build output mode: 'export' for full static export, 'standalone' for single server */
104
104
  output?: "export" | "standalone";
105
+ /** File extensions treated as routable pages/routes (Next.js pageExtensions) */
106
+ pageExtensions?: string[];
105
107
  /**
106
108
  * Enable Cache Components (Next.js 16).
107
109
  * When true, enables the "use cache" directive for pages, components, and functions.
@@ -123,6 +125,7 @@ export interface ResolvedNextConfig {
123
125
  basePath: string;
124
126
  trailingSlash: boolean;
125
127
  output: "" | "export" | "standalone";
128
+ pageExtensions: string[];
126
129
  cacheComponents: boolean;
127
130
  redirects: NextRedirect[];
128
131
  rewrites: {
@@ -147,7 +150,7 @@ export interface ResolvedNextConfig {
147
150
  * back to loading it via `createRequire` so that CJS config files (common in
148
151
  * the Next.js ecosystem for plugin wrappers like nextra, @next/mdx, etc.) work.
149
152
  */
150
- export declare function loadNextConfig(root: string): Promise<NextConfig | null>;
153
+ export declare function loadNextConfig(root: string, phase?: string): Promise<NextConfig | null>;
151
154
  /**
152
155
  * Resolve a NextConfig into a fully-resolved ResolvedNextConfig.
153
156
  * Awaits async functions for redirects/rewrites/headers.
@@ -1 +1 @@
1
- {"version":3,"file":"next-config.d.ts","sourceRoot":"","sources":["../../src/config/next-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"next-config.d.ts","sourceRoot":"","sources":["../../src/config/next-config.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,8 @@ import path from "node:path";
8
8
  import { pathToFileURL } from "node:url";
9
9
  import { createRequire } from "node:module";
10
10
  import fs from "node:fs";
11
+ import { PHASE_DEVELOPMENT_SERVER } from "../shims/constants.js";
12
+ import { normalizePageExtensions } from "../routing/file-matcher.js";
11
13
  const CONFIG_FILES = [
12
14
  "next.config.ts",
13
15
  "next.config.mjs",
@@ -33,10 +35,10 @@ function isCjsError(e) {
33
35
  * Unwrap the config value from a loaded module, calling it if it's a
34
36
  * function-form config (Next.js supports `module.exports = (phase, opts) => config`).
35
37
  */
36
- async function unwrapConfig(mod) {
38
+ async function unwrapConfig(mod, phase = PHASE_DEVELOPMENT_SERVER) {
37
39
  const config = mod.default ?? mod;
38
40
  if (typeof config === "function") {
39
- const result = await config("phase-development-server", {
41
+ const result = await config(phase, {
40
42
  defaultConfig: {},
41
43
  });
42
44
  return result;
@@ -52,7 +54,7 @@ async function unwrapConfig(mod) {
52
54
  * back to loading it via `createRequire` so that CJS config files (common in
53
55
  * the Next.js ecosystem for plugin wrappers like nextra, @next/mdx, etc.) work.
54
56
  */
55
- export async function loadNextConfig(root) {
57
+ export async function loadNextConfig(root, phase = PHASE_DEVELOPMENT_SERVER) {
56
58
  for (const filename of CONFIG_FILES) {
57
59
  const configPath = path.join(root, filename);
58
60
  if (!fs.existsSync(configPath))
@@ -61,7 +63,7 @@ export async function loadNextConfig(root) {
61
63
  // Use dynamic import for ESM/TS config files
62
64
  const fileUrl = pathToFileURL(configPath).href;
63
65
  const mod = await import(fileUrl);
64
- return await unwrapConfig(mod);
66
+ return await unwrapConfig(mod, phase);
65
67
  }
66
68
  catch (e) {
67
69
  // If the error indicates a CJS file loaded in ESM context, retry with
@@ -70,7 +72,7 @@ export async function loadNextConfig(root) {
70
72
  try {
71
73
  const require = createRequire(path.join(root, "package.json"));
72
74
  const mod = require(configPath);
73
- return await unwrapConfig({ default: mod });
75
+ return await unwrapConfig({ default: mod }, phase);
74
76
  }
75
77
  catch (e2) {
76
78
  console.warn(`[vinext] Failed to load ${filename}: ${e2.message}`);
@@ -94,6 +96,7 @@ export async function resolveNextConfig(config) {
94
96
  basePath: "",
95
97
  trailingSlash: false,
96
98
  output: "",
99
+ pageExtensions: normalizePageExtensions(),
97
100
  cacheComponents: false,
98
101
  redirects: [],
99
102
  rewrites: { beforeFiles: [], afterFiles: [], fallback: [] },
@@ -149,6 +152,7 @@ export async function resolveNextConfig(config) {
149
152
  if (output && output !== "export" && output !== "standalone") {
150
153
  console.warn(`[vinext] Unknown output mode "${output}", ignoring`);
151
154
  }
155
+ const pageExtensions = normalizePageExtensions(config.pageExtensions);
152
156
  // Parse i18n config
153
157
  let i18n = null;
154
158
  if (config.i18n) {
@@ -164,6 +168,7 @@ export async function resolveNextConfig(config) {
164
168
  basePath: config.basePath ?? "",
165
169
  trailingSlash: config.trailingSlash ?? false,
166
170
  output: output === "export" || output === "standalone" ? output : "",
171
+ pageExtensions,
167
172
  cacheComponents: config.cacheComponents ?? false,
168
173
  redirects,
169
174
  rewrites,
@@ -1 +1 @@
1
- {"version":3,"file":"next-config.js","sourceRoot":"","sources":["../../src/config/next-config.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * next.config.js / next.config.mjs / next.config.ts parser\n *\n * Loads the Next.js config file (if present) and extracts supported options.\n * Unsupported options are logged as warnings.\n */\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { createRequire } from \"node:module\";\nimport fs from \"node:fs\";\n\nexport interface HasCondition {\n type: \"header\" | \"cookie\" | \"query\" | \"host\";\n key: string;\n value?: string;\n}\n\nexport interface NextRedirect {\n source: string;\n destination: string;\n permanent: boolean;\n has?: HasCondition[];\n missing?: HasCondition[];\n}\n\nexport interface NextRewrite {\n source: string;\n destination: string;\n has?: HasCondition[];\n missing?: HasCondition[];\n}\n\nexport interface NextHeader {\n source: string;\n has?: HasCondition[];\n missing?: HasCondition[];\n headers: Array<{ key: string; value: string }>;\n}\n\nexport interface NextI18nConfig {\n /** List of supported locales */\n locales: string[];\n /** The default locale (used when no locale prefix is in the URL) */\n defaultLocale: string;\n /**\n * Whether to auto-detect locale from Accept-Language header.\n * Defaults to true in Next.js.\n */\n localeDetection?: boolean;\n /**\n * Domain-based routing. Each domain maps to a specific locale.\n */\n domains?: Array<{\n domain: string;\n defaultLocale: string;\n locales?: string[];\n http?: boolean;\n }>;\n}\n\n/**\n * MDX compilation options extracted from @next/mdx config.\n * These are passed through to @mdx-js/rollup so that custom\n * remark/rehype/recma plugins configured in next.config work with Vite.\n */\nexport interface MdxOptions {\n remarkPlugins?: unknown[];\n rehypePlugins?: unknown[];\n recmaPlugins?: unknown[];\n}\n\nexport interface NextConfig {\n /** Additional env variables */\n env?: Record<string, string>;\n /** Base URL path prefix */\n basePath?: string;\n /** Whether to add trailing slashes */\n trailingSlash?: boolean;\n /** Internationalization routing config */\n i18n?: NextI18nConfig;\n /** URL redirect rules */\n redirects?: () => Promise<NextRedirect[]> | NextRedirect[];\n /** URL rewrite rules */\n rewrites?: () =>\n | Promise<NextRewrite[] | { beforeFiles: NextRewrite[]; afterFiles: NextRewrite[]; fallback: NextRewrite[] }>\n | NextRewrite[]\n | { beforeFiles: NextRewrite[]; afterFiles: NextRewrite[]; fallback: NextRewrite[] };\n /** Custom response headers */\n headers?: () => Promise<NextHeader[]> | NextHeader[];\n /** Image optimization config */\n images?: {\n remotePatterns?: Array<{\n protocol?: string;\n hostname: string;\n port?: string;\n pathname?: string;\n search?: string;\n }>;\n domains?: string[];\n unoptimized?: boolean;\n /** Allowed device widths for image optimization. Defaults to Next.js defaults: [640, 750, 828, 1080, 1200, 1920, 2048, 3840] */\n deviceSizes?: number[];\n /** Allowed image sizes for fixed-width images. Defaults to Next.js defaults: [16, 32, 48, 64, 96, 128, 256, 384] */\n imageSizes?: number[];\n /** Allow SVG images through the image optimization endpoint. SVG can contain scripts, so only enable if you trust all image sources. */\n dangerouslyAllowSVG?: boolean;\n /** Content-Disposition header for image responses. Defaults to \"inline\". */\n contentDispositionType?: \"inline\" | \"attachment\";\n /** Content-Security-Policy header for image responses. Defaults to \"script-src 'none'; frame-src 'none'; sandbox;\" */\n contentSecurityPolicy?: string;\n };\n /** Build output mode: 'export' for full static export, 'standalone' for single server */\n output?: \"export\" | \"standalone\";\n /**\n * Enable Cache Components (Next.js 16).\n * When true, enables the \"use cache\" directive for pages, components, and functions.\n * Replaces the removed experimental.ppr and experimental.dynamicIO flags.\n */\n cacheComponents?: boolean;\n /** Transpile packages (Vite handles this natively) */\n transpilePackages?: string[];\n /** Webpack config (ignored — we use Vite) */\n webpack?: unknown;\n /** Any other options */\n [key: string]: unknown;\n}\n\n/**\n * Resolved configuration with all async values awaited.\n */\nexport interface ResolvedNextConfig {\n env: Record<string, string>;\n basePath: string;\n trailingSlash: boolean;\n output: \"\" | \"export\" | \"standalone\";\n cacheComponents: boolean;\n redirects: NextRedirect[];\n rewrites: {\n beforeFiles: NextRewrite[];\n afterFiles: NextRewrite[];\n fallback: NextRewrite[];\n };\n headers: NextHeader[];\n images: NextConfig[\"images\"];\n i18n: NextI18nConfig | null;\n /** MDX remark/rehype/recma plugins extracted from @next/mdx config */\n mdx: MdxOptions | null;\n /** Extra allowed origins for server action CSRF validation (from experimental.serverActions.allowedOrigins). */\n serverActionsAllowedOrigins: string[];\n}\n\nconst CONFIG_FILES = [\n \"next.config.ts\",\n \"next.config.mjs\",\n \"next.config.js\",\n \"next.config.cjs\",\n];\n\n/**\n * Check whether an error indicates a CJS module was loaded in an ESM context\n * (i.e. the file uses `require()` which is not available in ESM).\n */\nfunction isCjsError(e: unknown): boolean {\n if (!(e instanceof Error)) return false;\n const msg = e.message;\n return (\n msg.includes(\"require is not a function\") ||\n msg.includes(\"require is not defined\") ||\n msg.includes(\"exports is not defined\") ||\n msg.includes(\"module is not defined\") ||\n msg.includes(\"__dirname is not defined\") ||\n msg.includes(\"__filename is not defined\")\n );\n}\n\n/**\n * Unwrap the config value from a loaded module, calling it if it's a\n * function-form config (Next.js supports `module.exports = (phase, opts) => config`).\n */\nasync function unwrapConfig(mod: any): Promise<NextConfig> {\n const config = mod.default ?? mod;\n if (typeof config === \"function\") {\n const result = await config(\"phase-development-server\", {\n defaultConfig: {},\n });\n return result as NextConfig;\n }\n return config as NextConfig;\n}\n\n/**\n * Find and load the next.config file from the project root.\n * Returns null if no config file is found.\n *\n * Attempts ESM dynamic `import()` first. If the file uses CJS constructs\n * (`require`, `module.exports`) that aren't available in ESM context, falls\n * back to loading it via `createRequire` so that CJS config files (common in\n * the Next.js ecosystem for plugin wrappers like nextra, @next/mdx, etc.) work.\n */\nexport async function loadNextConfig(root: string): Promise<NextConfig | null> {\n for (const filename of CONFIG_FILES) {\n const configPath = path.join(root, filename);\n if (!fs.existsSync(configPath)) continue;\n\n try {\n // Use dynamic import for ESM/TS config files\n const fileUrl = pathToFileURL(configPath).href;\n const mod = await import(fileUrl);\n return await unwrapConfig(mod);\n } catch (e) {\n // If the error indicates a CJS file loaded in ESM context, retry with\n // createRequire which provides a proper CommonJS environment.\n if (isCjsError(e) && (filename.endsWith(\".js\") || filename.endsWith(\".cjs\"))) {\n try {\n const require = createRequire(path.join(root, \"package.json\"));\n const mod = require(configPath);\n return await unwrapConfig({ default: mod });\n } catch (e2) {\n console.warn(\n `[vinext] Failed to load ${filename}: ${(e2 as Error).message}`,\n );\n return null;\n }\n }\n\n console.warn(\n `[vinext] Failed to load ${filename}: ${(e as Error).message}`,\n );\n return null;\n }\n }\n\n return null;\n}\n\n/**\n * Resolve a NextConfig into a fully-resolved ResolvedNextConfig.\n * Awaits async functions for redirects/rewrites/headers.\n */\nexport async function resolveNextConfig(\n config: NextConfig | null,\n): Promise<ResolvedNextConfig> {\n if (!config) {\n return {\n env: {},\n basePath: \"\",\n trailingSlash: false,\n output: \"\",\n cacheComponents: false,\n redirects: [],\n rewrites: { beforeFiles: [], afterFiles: [], fallback: [] },\n headers: [],\n images: undefined,\n i18n: null,\n mdx: null,\n serverActionsAllowedOrigins: [],\n };\n }\n\n // Resolve redirects\n let redirects: NextRedirect[] = [];\n if (config.redirects) {\n const result = await config.redirects();\n redirects = Array.isArray(result) ? result : [];\n }\n\n // Resolve rewrites\n let rewrites = { beforeFiles: [] as NextRewrite[], afterFiles: [] as NextRewrite[], fallback: [] as NextRewrite[] };\n if (config.rewrites) {\n const result = await config.rewrites();\n if (Array.isArray(result)) {\n rewrites.afterFiles = result;\n } else {\n rewrites = {\n beforeFiles: result.beforeFiles ?? [],\n afterFiles: result.afterFiles ?? [],\n fallback: result.fallback ?? [],\n };\n }\n }\n\n // Resolve headers\n let headers: NextHeader[] = [];\n if (config.headers) {\n headers = await config.headers();\n }\n\n // Extract MDX remark/rehype plugins from @next/mdx's webpack wrapper\n const mdx = extractMdxOptions(config);\n\n // Resolve serverActions.allowedOrigins from experimental config\n const experimental = config.experimental as Record<string, unknown> | undefined;\n const serverActionsConfig = experimental?.serverActions as Record<string, unknown> | undefined;\n const serverActionsAllowedOrigins = Array.isArray(serverActionsConfig?.allowedOrigins)\n ? (serverActionsConfig.allowedOrigins as string[])\n : [];\n\n // Warn about unsupported options (skip webpack if we extracted MDX from it)\n const unsupported = mdx ? [] : [\"webpack\"];\n for (const key of unsupported) {\n if (config[key] !== undefined) {\n console.warn(\n `[vinext] next.config option \"${key}\" is not yet supported and will be ignored`,\n );\n }\n }\n\n const output = config.output ?? \"\";\n if (output && output !== \"export\" && output !== \"standalone\") {\n console.warn(`[vinext] Unknown output mode \"${output as string}\", ignoring`);\n }\n\n // Parse i18n config\n let i18n: NextI18nConfig | null = null;\n if (config.i18n) {\n i18n = {\n locales: config.i18n.locales,\n defaultLocale: config.i18n.defaultLocale,\n localeDetection: config.i18n.localeDetection ?? true,\n domains: config.i18n.domains,\n };\n }\n\n return {\n env: config.env ?? {},\n basePath: config.basePath ?? \"\",\n trailingSlash: config.trailingSlash ?? false,\n output: output === \"export\" || output === \"standalone\" ? output : \"\",\n cacheComponents: config.cacheComponents ?? false,\n redirects,\n rewrites,\n headers,\n images: config.images,\n i18n,\n mdx,\n serverActionsAllowedOrigins,\n };\n}\n\n/**\n * Extract MDX compilation options (remark/rehype/recma plugins) from\n * a Next.js config that uses @next/mdx.\n *\n * @next/mdx wraps the config with a webpack function that injects an MDX\n * loader rule. The remark/rehype plugins are captured in that closure.\n * We probe the webpack function with a mock config to extract them.\n */\nexport function extractMdxOptions(config: NextConfig): MdxOptions | null {\n if (typeof config.webpack !== \"function\") return null;\n\n // Build a mock webpack config object that @next/mdx's wrapper will mutate\n const mockModuleRules: any[] = [];\n const mockConfig = {\n resolve: { alias: {} as Record<string, string> },\n module: { rules: mockModuleRules },\n plugins: [] as any[],\n };\n const mockOptions = {\n defaultLoaders: { babel: { loader: \"next-babel-loader\" } },\n isServer: false,\n dev: false,\n dir: \"/mock\",\n };\n\n try {\n const result = (config.webpack as Function)(mockConfig, mockOptions);\n // @next/mdx may return the config or mutate in place\n const finalConfig = result ?? mockConfig;\n const rules: any[] = finalConfig.module?.rules ?? mockModuleRules;\n\n // Search through webpack rules for the MDX loader injected by @next/mdx\n for (const rule of rules) {\n const loaders = extractMdxLoaders(rule);\n if (loaders) return loaders;\n }\n } catch {\n // If the webpack function throws (e.g. expects real webpack internals),\n // silently skip — we'll fall back to bare mdx() with no plugins.\n }\n\n return null;\n}\n\n/**\n * Recursively search a webpack rule (which may have nested `oneOf` arrays)\n * for an MDX loader and extract its remark/rehype/recma plugin options.\n */\nfunction extractMdxLoaders(rule: any): MdxOptions | null {\n if (!rule) return null;\n\n // Check `oneOf` arrays (Next.js uses these extensively)\n if (Array.isArray(rule.oneOf)) {\n for (const child of rule.oneOf) {\n const result = extractMdxLoaders(child);\n if (result) return result;\n }\n }\n\n // Check `use` array (loader chain)\n const use = Array.isArray(rule.use) ? rule.use : rule.use ? [rule.use] : [];\n for (const loader of use) {\n const loaderPath = typeof loader === \"string\" ? loader : loader?.loader;\n if (typeof loaderPath === \"string\" && isMdxLoader(loaderPath)) {\n const opts = typeof loader === \"object\" ? loader.options : {};\n return extractPluginsFromOptions(opts);\n }\n }\n\n // Check direct `loader` field\n if (typeof rule.loader === \"string\" && isMdxLoader(rule.loader)) {\n return extractPluginsFromOptions(rule.options);\n }\n\n return null;\n}\n\nfunction isMdxLoader(loaderPath: string): boolean {\n return (\n loaderPath.includes(\"mdx\") &&\n (loaderPath.includes(\"@next\") ||\n loaderPath.includes(\"@mdx-js\") ||\n loaderPath.includes(\"mdx-js-loader\") ||\n loaderPath.includes(\"next-mdx\"))\n );\n}\n\nfunction extractPluginsFromOptions(opts: any): MdxOptions | null {\n if (!opts || typeof opts !== \"object\") return null;\n\n const remarkPlugins = Array.isArray(opts.remarkPlugins) ? opts.remarkPlugins : undefined;\n const rehypePlugins = Array.isArray(opts.rehypePlugins) ? opts.rehypePlugins : undefined;\n const recmaPlugins = Array.isArray(opts.recmaPlugins) ? opts.recmaPlugins : undefined;\n\n // Only return if at least one plugin array is non-empty\n if (\n (remarkPlugins && remarkPlugins.length > 0) ||\n (rehypePlugins && rehypePlugins.length > 0) ||\n (recmaPlugins && recmaPlugins.length > 0)\n ) {\n return {\n ...(remarkPlugins && remarkPlugins.length > 0 ? { remarkPlugins } : {}),\n ...(rehypePlugins && rehypePlugins.length > 0 ? { rehypePlugins } : {}),\n ...(recmaPlugins && recmaPlugins.length > 0 ? { recmaPlugins } : {}),\n };\n }\n\n return null;\n}\n"]}
1
+ {"version":3,"file":"next-config.js","sourceRoot":"","sources":["../../src/config/next-config.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * next.config.js / next.config.mjs / next.config.ts parser\n *\n * Loads the Next.js config file (if present) and extracts supported options.\n * Unsupported options are logged as warnings.\n */\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { createRequire } from \"node:module\";\nimport fs from \"node:fs\";\nimport { PHASE_DEVELOPMENT_SERVER } from \"../shims/constants.js\";\nimport { normalizePageExtensions } from \"../routing/file-matcher.js\";\n\nexport interface HasCondition {\n type: \"header\" | \"cookie\" | \"query\" | \"host\";\n key: string;\n value?: string;\n}\n\nexport interface NextRedirect {\n source: string;\n destination: string;\n permanent: boolean;\n has?: HasCondition[];\n missing?: HasCondition[];\n}\n\nexport interface NextRewrite {\n source: string;\n destination: string;\n has?: HasCondition[];\n missing?: HasCondition[];\n}\n\nexport interface NextHeader {\n source: string;\n has?: HasCondition[];\n missing?: HasCondition[];\n headers: Array<{ key: string; value: string }>;\n}\n\nexport interface NextI18nConfig {\n /** List of supported locales */\n locales: string[];\n /** The default locale (used when no locale prefix is in the URL) */\n defaultLocale: string;\n /**\n * Whether to auto-detect locale from Accept-Language header.\n * Defaults to true in Next.js.\n */\n localeDetection?: boolean;\n /**\n * Domain-based routing. Each domain maps to a specific locale.\n */\n domains?: Array<{\n domain: string;\n defaultLocale: string;\n locales?: string[];\n http?: boolean;\n }>;\n}\n\n/**\n * MDX compilation options extracted from @next/mdx config.\n * These are passed through to @mdx-js/rollup so that custom\n * remark/rehype/recma plugins configured in next.config work with Vite.\n */\nexport interface MdxOptions {\n remarkPlugins?: unknown[];\n rehypePlugins?: unknown[];\n recmaPlugins?: unknown[];\n}\n\nexport interface NextConfig {\n /** Additional env variables */\n env?: Record<string, string>;\n /** Base URL path prefix */\n basePath?: string;\n /** Whether to add trailing slashes */\n trailingSlash?: boolean;\n /** Internationalization routing config */\n i18n?: NextI18nConfig;\n /** URL redirect rules */\n redirects?: () => Promise<NextRedirect[]> | NextRedirect[];\n /** URL rewrite rules */\n rewrites?: () =>\n | Promise<NextRewrite[] | { beforeFiles: NextRewrite[]; afterFiles: NextRewrite[]; fallback: NextRewrite[] }>\n | NextRewrite[]\n | { beforeFiles: NextRewrite[]; afterFiles: NextRewrite[]; fallback: NextRewrite[] };\n /** Custom response headers */\n headers?: () => Promise<NextHeader[]> | NextHeader[];\n /** Image optimization config */\n images?: {\n remotePatterns?: Array<{\n protocol?: string;\n hostname: string;\n port?: string;\n pathname?: string;\n search?: string;\n }>;\n domains?: string[];\n unoptimized?: boolean;\n /** Allowed device widths for image optimization. Defaults to Next.js defaults: [640, 750, 828, 1080, 1200, 1920, 2048, 3840] */\n deviceSizes?: number[];\n /** Allowed image sizes for fixed-width images. Defaults to Next.js defaults: [16, 32, 48, 64, 96, 128, 256, 384] */\n imageSizes?: number[];\n /** Allow SVG images through the image optimization endpoint. SVG can contain scripts, so only enable if you trust all image sources. */\n dangerouslyAllowSVG?: boolean;\n /** Content-Disposition header for image responses. Defaults to \"inline\". */\n contentDispositionType?: \"inline\" | \"attachment\";\n /** Content-Security-Policy header for image responses. Defaults to \"script-src 'none'; frame-src 'none'; sandbox;\" */\n contentSecurityPolicy?: string;\n };\n /** Build output mode: 'export' for full static export, 'standalone' for single server */\n output?: \"export\" | \"standalone\";\n /** File extensions treated as routable pages/routes (Next.js pageExtensions) */\n pageExtensions?: string[];\n /**\n * Enable Cache Components (Next.js 16).\n * When true, enables the \"use cache\" directive for pages, components, and functions.\n * Replaces the removed experimental.ppr and experimental.dynamicIO flags.\n */\n cacheComponents?: boolean;\n /** Transpile packages (Vite handles this natively) */\n transpilePackages?: string[];\n /** Webpack config (ignored — we use Vite) */\n webpack?: unknown;\n /** Any other options */\n [key: string]: unknown;\n}\n\n/**\n * Resolved configuration with all async values awaited.\n */\nexport interface ResolvedNextConfig {\n env: Record<string, string>;\n basePath: string;\n trailingSlash: boolean;\n output: \"\" | \"export\" | \"standalone\";\n pageExtensions: string[];\n cacheComponents: boolean;\n redirects: NextRedirect[];\n rewrites: {\n beforeFiles: NextRewrite[];\n afterFiles: NextRewrite[];\n fallback: NextRewrite[];\n };\n headers: NextHeader[];\n images: NextConfig[\"images\"];\n i18n: NextI18nConfig | null;\n /** MDX remark/rehype/recma plugins extracted from @next/mdx config */\n mdx: MdxOptions | null;\n /** Extra allowed origins for server action CSRF validation (from experimental.serverActions.allowedOrigins). */\n serverActionsAllowedOrigins: string[];\n}\n\nconst CONFIG_FILES = [\n \"next.config.ts\",\n \"next.config.mjs\",\n \"next.config.js\",\n \"next.config.cjs\",\n];\n\n/**\n * Check whether an error indicates a CJS module was loaded in an ESM context\n * (i.e. the file uses `require()` which is not available in ESM).\n */\nfunction isCjsError(e: unknown): boolean {\n if (!(e instanceof Error)) return false;\n const msg = e.message;\n return (\n msg.includes(\"require is not a function\") ||\n msg.includes(\"require is not defined\") ||\n msg.includes(\"exports is not defined\") ||\n msg.includes(\"module is not defined\") ||\n msg.includes(\"__dirname is not defined\") ||\n msg.includes(\"__filename is not defined\")\n );\n}\n\n/**\n * Unwrap the config value from a loaded module, calling it if it's a\n * function-form config (Next.js supports `module.exports = (phase, opts) => config`).\n */\nasync function unwrapConfig(mod: any, phase: string = PHASE_DEVELOPMENT_SERVER): Promise<NextConfig> {\n const config = mod.default ?? mod;\n if (typeof config === \"function\") {\n const result = await config(phase, {\n defaultConfig: {},\n });\n return result as NextConfig;\n }\n return config as NextConfig;\n}\n\n/**\n * Find and load the next.config file from the project root.\n * Returns null if no config file is found.\n *\n * Attempts ESM dynamic `import()` first. If the file uses CJS constructs\n * (`require`, `module.exports`) that aren't available in ESM context, falls\n * back to loading it via `createRequire` so that CJS config files (common in\n * the Next.js ecosystem for plugin wrappers like nextra, @next/mdx, etc.) work.\n */\nexport async function loadNextConfig(root: string, phase: string = PHASE_DEVELOPMENT_SERVER): Promise<NextConfig | null> {\n for (const filename of CONFIG_FILES) {\n const configPath = path.join(root, filename);\n if (!fs.existsSync(configPath)) continue;\n\n try {\n // Use dynamic import for ESM/TS config files\n const fileUrl = pathToFileURL(configPath).href;\n const mod = await import(fileUrl);\n return await unwrapConfig(mod, phase);\n } catch (e) {\n // If the error indicates a CJS file loaded in ESM context, retry with\n // createRequire which provides a proper CommonJS environment.\n if (isCjsError(e) && (filename.endsWith(\".js\") || filename.endsWith(\".cjs\"))) {\n try {\n const require = createRequire(path.join(root, \"package.json\"));\n const mod = require(configPath);\n return await unwrapConfig({ default: mod }, phase);\n } catch (e2) {\n console.warn(\n `[vinext] Failed to load ${filename}: ${(e2 as Error).message}`,\n );\n return null;\n }\n }\n\n console.warn(\n `[vinext] Failed to load ${filename}: ${(e as Error).message}`,\n );\n return null;\n }\n }\n\n return null;\n}\n\n/**\n * Resolve a NextConfig into a fully-resolved ResolvedNextConfig.\n * Awaits async functions for redirects/rewrites/headers.\n */\nexport async function resolveNextConfig(\n config: NextConfig | null,\n): Promise<ResolvedNextConfig> {\n if (!config) {\n return {\n env: {},\n basePath: \"\",\n trailingSlash: false,\n output: \"\",\n pageExtensions: normalizePageExtensions(),\n cacheComponents: false,\n redirects: [],\n rewrites: { beforeFiles: [], afterFiles: [], fallback: [] },\n headers: [],\n images: undefined,\n i18n: null,\n mdx: null,\n serverActionsAllowedOrigins: [],\n };\n }\n\n // Resolve redirects\n let redirects: NextRedirect[] = [];\n if (config.redirects) {\n const result = await config.redirects();\n redirects = Array.isArray(result) ? result : [];\n }\n\n // Resolve rewrites\n let rewrites = { beforeFiles: [] as NextRewrite[], afterFiles: [] as NextRewrite[], fallback: [] as NextRewrite[] };\n if (config.rewrites) {\n const result = await config.rewrites();\n if (Array.isArray(result)) {\n rewrites.afterFiles = result;\n } else {\n rewrites = {\n beforeFiles: result.beforeFiles ?? [],\n afterFiles: result.afterFiles ?? [],\n fallback: result.fallback ?? [],\n };\n }\n }\n\n // Resolve headers\n let headers: NextHeader[] = [];\n if (config.headers) {\n headers = await config.headers();\n }\n\n // Extract MDX remark/rehype plugins from @next/mdx's webpack wrapper\n const mdx = extractMdxOptions(config);\n\n // Resolve serverActions.allowedOrigins from experimental config\n const experimental = config.experimental as Record<string, unknown> | undefined;\n const serverActionsConfig = experimental?.serverActions as Record<string, unknown> | undefined;\n const serverActionsAllowedOrigins = Array.isArray(serverActionsConfig?.allowedOrigins)\n ? (serverActionsConfig.allowedOrigins as string[])\n : [];\n\n // Warn about unsupported options (skip webpack if we extracted MDX from it)\n const unsupported = mdx ? [] : [\"webpack\"];\n for (const key of unsupported) {\n if (config[key] !== undefined) {\n console.warn(\n `[vinext] next.config option \"${key}\" is not yet supported and will be ignored`,\n );\n }\n }\n\n const output = config.output ?? \"\";\n if (output && output !== \"export\" && output !== \"standalone\") {\n console.warn(`[vinext] Unknown output mode \"${output as string}\", ignoring`);\n }\n\n const pageExtensions = normalizePageExtensions(config.pageExtensions);\n\n // Parse i18n config\n let i18n: NextI18nConfig | null = null;\n if (config.i18n) {\n i18n = {\n locales: config.i18n.locales,\n defaultLocale: config.i18n.defaultLocale,\n localeDetection: config.i18n.localeDetection ?? true,\n domains: config.i18n.domains,\n };\n }\n\n return {\n env: config.env ?? {},\n basePath: config.basePath ?? \"\",\n trailingSlash: config.trailingSlash ?? false,\n output: output === \"export\" || output === \"standalone\" ? output : \"\",\n pageExtensions,\n cacheComponents: config.cacheComponents ?? false,\n redirects,\n rewrites,\n headers,\n images: config.images,\n i18n,\n mdx,\n serverActionsAllowedOrigins,\n };\n}\n\n/**\n * Extract MDX compilation options (remark/rehype/recma plugins) from\n * a Next.js config that uses @next/mdx.\n *\n * @next/mdx wraps the config with a webpack function that injects an MDX\n * loader rule. The remark/rehype plugins are captured in that closure.\n * We probe the webpack function with a mock config to extract them.\n */\nexport function extractMdxOptions(config: NextConfig): MdxOptions | null {\n if (typeof config.webpack !== \"function\") return null;\n\n // Build a mock webpack config object that @next/mdx's wrapper will mutate\n const mockModuleRules: any[] = [];\n const mockConfig = {\n resolve: { alias: {} as Record<string, string> },\n module: { rules: mockModuleRules },\n plugins: [] as any[],\n };\n const mockOptions = {\n defaultLoaders: { babel: { loader: \"next-babel-loader\" } },\n isServer: false,\n dev: false,\n dir: \"/mock\",\n };\n\n try {\n const result = (config.webpack as Function)(mockConfig, mockOptions);\n // @next/mdx may return the config or mutate in place\n const finalConfig = result ?? mockConfig;\n const rules: any[] = finalConfig.module?.rules ?? mockModuleRules;\n\n // Search through webpack rules for the MDX loader injected by @next/mdx\n for (const rule of rules) {\n const loaders = extractMdxLoaders(rule);\n if (loaders) return loaders;\n }\n } catch {\n // If the webpack function throws (e.g. expects real webpack internals),\n // silently skip — we'll fall back to bare mdx() with no plugins.\n }\n\n return null;\n}\n\n/**\n * Recursively search a webpack rule (which may have nested `oneOf` arrays)\n * for an MDX loader and extract its remark/rehype/recma plugin options.\n */\nfunction extractMdxLoaders(rule: any): MdxOptions | null {\n if (!rule) return null;\n\n // Check `oneOf` arrays (Next.js uses these extensively)\n if (Array.isArray(rule.oneOf)) {\n for (const child of rule.oneOf) {\n const result = extractMdxLoaders(child);\n if (result) return result;\n }\n }\n\n // Check `use` array (loader chain)\n const use = Array.isArray(rule.use) ? rule.use : rule.use ? [rule.use] : [];\n for (const loader of use) {\n const loaderPath = typeof loader === \"string\" ? loader : loader?.loader;\n if (typeof loaderPath === \"string\" && isMdxLoader(loaderPath)) {\n const opts = typeof loader === \"object\" ? loader.options : {};\n return extractPluginsFromOptions(opts);\n }\n }\n\n // Check direct `loader` field\n if (typeof rule.loader === \"string\" && isMdxLoader(rule.loader)) {\n return extractPluginsFromOptions(rule.options);\n }\n\n return null;\n}\n\nfunction isMdxLoader(loaderPath: string): boolean {\n return (\n loaderPath.includes(\"mdx\") &&\n (loaderPath.includes(\"@next\") ||\n loaderPath.includes(\"@mdx-js\") ||\n loaderPath.includes(\"mdx-js-loader\") ||\n loaderPath.includes(\"next-mdx\"))\n );\n}\n\nfunction extractPluginsFromOptions(opts: any): MdxOptions | null {\n if (!opts || typeof opts !== \"object\") return null;\n\n const remarkPlugins = Array.isArray(opts.remarkPlugins) ? opts.remarkPlugins : undefined;\n const rehypePlugins = Array.isArray(opts.rehypePlugins) ? opts.rehypePlugins : undefined;\n const recmaPlugins = Array.isArray(opts.recmaPlugins) ? opts.recmaPlugins : undefined;\n\n // Only return if at least one plugin array is non-empty\n if (\n (remarkPlugins && remarkPlugins.length > 0) ||\n (rehypePlugins && rehypePlugins.length > 0) ||\n (recmaPlugins && recmaPlugins.length > 0)\n ) {\n return {\n ...(remarkPlugins && remarkPlugins.length > 0 ? { remarkPlugins } : {}),\n ...(rehypePlugins && rehypePlugins.length > 0 ? { rehypePlugins } : {}),\n ...(recmaPlugins && recmaPlugins.length > 0 ? { recmaPlugins } : {}),\n };\n }\n\n return null;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"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"}
package/dist/deploy.js CHANGED
@@ -526,10 +526,20 @@ export default {
526
526
  let resolvedPathname = resolvedUrl.split("?")[0];
527
527
 
528
528
  // ── 4. Apply custom headers from next.config.js ───────────────
529
+ // Config headers are additive for multi-value headers (Vary,
530
+ // Set-Cookie) and override for everything else. Vary values are
531
+ // comma-joined per HTTP spec. Set-Cookie values are comma-joined
532
+ // here because middlewareHeaders is a flat Record<string, string>;
533
+ // mergeHeaders() downstream handles multi-value expansion.
529
534
  if (configHeaders.length) {
530
535
  const matched = matchHeaders(resolvedPathname, configHeaders, reqCtx);
531
536
  for (const h of matched) {
532
- middlewareHeaders[h.key.toLowerCase()] = h.value;
537
+ const lk = h.key.toLowerCase();
538
+ if ((lk === "vary" || lk === "set-cookie") && middlewareHeaders[lk]) {
539
+ middlewareHeaders[lk] += ", " + h.value;
540
+ } else {
541
+ middlewareHeaders[lk] = h.value;
542
+ }
533
543
  }
534
544
  }
535
545