vinext 0.0.38 → 0.0.39

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 (226) hide show
  1. package/README.md +33 -20
  2. package/dist/build/nitro-route-rules.d.ts +50 -0
  3. package/dist/build/nitro-route-rules.js +81 -0
  4. package/dist/build/nitro-route-rules.js.map +1 -0
  5. package/dist/build/precompress.d.ts +17 -0
  6. package/dist/build/precompress.js +102 -0
  7. package/dist/build/precompress.js.map +1 -0
  8. package/dist/build/prerender.d.ts +27 -22
  9. package/dist/build/prerender.js +17 -17
  10. package/dist/build/prerender.js.map +1 -1
  11. package/dist/build/report.d.ts +3 -4
  12. package/dist/build/report.js.map +1 -1
  13. package/dist/build/run-prerender.d.ts +3 -4
  14. package/dist/build/run-prerender.js.map +1 -1
  15. package/dist/build/standalone.d.ts +32 -0
  16. package/dist/build/standalone.js +199 -0
  17. package/dist/build/standalone.js.map +1 -0
  18. package/dist/build/static-export.d.ts +17 -29
  19. package/dist/build/static-export.js.map +1 -1
  20. package/dist/check.d.ts +4 -4
  21. package/dist/check.js +1 -1
  22. package/dist/check.js.map +1 -1
  23. package/dist/cli.js +31 -4
  24. package/dist/cli.js.map +1 -1
  25. package/dist/client/instrumentation-client.d.ts +2 -2
  26. package/dist/client/instrumentation-client.js.map +1 -1
  27. package/dist/client/vinext-next-data.d.ts +5 -8
  28. package/dist/cloudflare/index.js +1 -1
  29. package/dist/cloudflare/kv-cache-handler.d.ts +5 -3
  30. package/dist/cloudflare/kv-cache-handler.js +1 -1
  31. package/dist/cloudflare/kv-cache-handler.js.map +1 -1
  32. package/dist/cloudflare/tpr.d.ts +35 -27
  33. package/dist/cloudflare/tpr.js +36 -12
  34. package/dist/cloudflare/tpr.js.map +1 -1
  35. package/dist/config/config-matchers.d.ts +2 -2
  36. package/dist/config/config-matchers.js +1 -1
  37. package/dist/config/config-matchers.js.map +1 -1
  38. package/dist/config/dotenv.d.ts +4 -4
  39. package/dist/config/dotenv.js.map +1 -1
  40. package/dist/config/next-config.d.ts +40 -61
  41. package/dist/config/next-config.js +5 -4
  42. package/dist/config/next-config.js.map +1 -1
  43. package/dist/deploy.d.ts +25 -41
  44. package/dist/deploy.js +1 -1
  45. package/dist/deploy.js.map +1 -1
  46. package/dist/entries/app-rsc-entry.d.ts +6 -10
  47. package/dist/entries/app-rsc-entry.js +4 -6
  48. package/dist/entries/app-rsc-entry.js.map +1 -1
  49. package/dist/entries/pages-server-entry.js +1 -3
  50. package/dist/entries/pages-server-entry.js.map +1 -1
  51. package/dist/index.d.ts +23 -33
  52. package/dist/index.js +165 -84
  53. package/dist/index.js.map +1 -1
  54. package/dist/init.d.ts +14 -26
  55. package/dist/init.js +8 -2
  56. package/dist/init.js.map +1 -1
  57. package/dist/plugins/client-reference-dedup.js.map +1 -1
  58. package/dist/plugins/fix-use-server-closure-collision.js.map +1 -1
  59. package/dist/plugins/fonts.d.ts +18 -1
  60. package/dist/plugins/fonts.js +107 -8
  61. package/dist/plugins/fonts.js.map +1 -1
  62. package/dist/plugins/optimize-imports.d.ts +2 -2
  63. package/dist/plugins/optimize-imports.js +4 -4
  64. package/dist/plugins/optimize-imports.js.map +1 -1
  65. package/dist/plugins/server-externals-manifest.d.ts +27 -0
  66. package/dist/plugins/server-externals-manifest.js +76 -0
  67. package/dist/plugins/server-externals-manifest.js.map +1 -0
  68. package/dist/routing/app-router.d.ts +29 -55
  69. package/dist/routing/app-router.js.map +1 -1
  70. package/dist/routing/file-matcher.d.ts +2 -2
  71. package/dist/routing/file-matcher.js.map +1 -1
  72. package/dist/routing/pages-router.d.ts +6 -11
  73. package/dist/routing/pages-router.js.map +1 -1
  74. package/dist/routing/route-trie.d.ts +2 -2
  75. package/dist/routing/route-trie.js.map +1 -1
  76. package/dist/server/api-handler.js.map +1 -1
  77. package/dist/server/app-browser-entry.js +270 -39
  78. package/dist/server/app-browser-entry.js.map +1 -1
  79. package/dist/server/app-browser-stream.d.ts +6 -6
  80. package/dist/server/app-browser-stream.js.map +1 -1
  81. package/dist/server/app-page-boundary-render.d.ts +8 -8
  82. package/dist/server/app-page-boundary-render.js +2 -2
  83. package/dist/server/app-page-boundary-render.js.map +1 -1
  84. package/dist/server/app-page-boundary.d.ts +13 -11
  85. package/dist/server/app-page-boundary.js +1 -1
  86. package/dist/server/app-page-boundary.js.map +1 -1
  87. package/dist/server/app-page-cache.d.ts +10 -10
  88. package/dist/server/app-page-cache.js.map +1 -1
  89. package/dist/server/app-page-execution.d.ts +10 -10
  90. package/dist/server/app-page-execution.js.map +1 -1
  91. package/dist/server/app-page-probe.d.ts +2 -2
  92. package/dist/server/app-page-probe.js.map +1 -1
  93. package/dist/server/app-page-render.d.ts +4 -4
  94. package/dist/server/app-page-render.js.map +1 -1
  95. package/dist/server/app-page-request.d.ts +12 -12
  96. package/dist/server/app-page-request.js.map +1 -1
  97. package/dist/server/app-page-response.d.ts +18 -18
  98. package/dist/server/app-page-response.js.map +1 -1
  99. package/dist/server/app-page-stream.d.ts +18 -18
  100. package/dist/server/app-page-stream.js.map +1 -1
  101. package/dist/server/app-route-handler-cache.d.ts +2 -2
  102. package/dist/server/app-route-handler-cache.js.map +1 -1
  103. package/dist/server/app-route-handler-execution.d.ts +6 -6
  104. package/dist/server/app-route-handler-execution.js.map +1 -1
  105. package/dist/server/app-route-handler-policy.d.ts +8 -8
  106. package/dist/server/app-route-handler-policy.js.map +1 -1
  107. package/dist/server/app-route-handler-response.d.ts +6 -6
  108. package/dist/server/app-route-handler-response.js.map +1 -1
  109. package/dist/server/app-route-handler-runtime.d.ts +4 -4
  110. package/dist/server/app-route-handler-runtime.js.map +1 -1
  111. package/dist/server/app-ssr-entry.d.ts +4 -4
  112. package/dist/server/app-ssr-entry.js.map +1 -1
  113. package/dist/server/app-ssr-stream.d.ts +2 -2
  114. package/dist/server/app-ssr-stream.js +1 -3
  115. package/dist/server/app-ssr-stream.js.map +1 -1
  116. package/dist/server/dev-module-runner.d.ts +2 -2
  117. package/dist/server/dev-module-runner.js.map +1 -1
  118. package/dist/server/dev-server.js +5 -7
  119. package/dist/server/dev-server.js.map +1 -1
  120. package/dist/server/image-optimization.d.ts +7 -12
  121. package/dist/server/image-optimization.js.map +1 -1
  122. package/dist/server/instrumentation.d.ts +8 -12
  123. package/dist/server/instrumentation.js +1 -1
  124. package/dist/server/instrumentation.js.map +1 -1
  125. package/dist/server/isr-cache.d.ts +2 -2
  126. package/dist/server/isr-cache.js.map +1 -1
  127. package/dist/server/metadata-routes.d.ts +14 -19
  128. package/dist/server/metadata-routes.js.map +1 -1
  129. package/dist/server/middleware.d.ts +9 -17
  130. package/dist/server/middleware.js +1 -1
  131. package/dist/server/middleware.js.map +1 -1
  132. package/dist/server/pages-api-route.d.ts +6 -6
  133. package/dist/server/pages-api-route.js.map +1 -1
  134. package/dist/server/pages-i18n.d.ts +4 -4
  135. package/dist/server/pages-i18n.js.map +1 -1
  136. package/dist/server/pages-node-compat.d.ts +10 -10
  137. package/dist/server/pages-node-compat.js.map +1 -1
  138. package/dist/server/pages-page-data.d.ts +22 -22
  139. package/dist/server/pages-page-data.js.map +1 -1
  140. package/dist/server/pages-page-response.d.ts +8 -8
  141. package/dist/server/pages-page-response.js.map +1 -1
  142. package/dist/server/prod-server.d.ts +20 -15
  143. package/dist/server/prod-server.js +170 -53
  144. package/dist/server/prod-server.js.map +1 -1
  145. package/dist/server/seed-cache.js.map +1 -1
  146. package/dist/server/static-file-cache.d.ts +57 -0
  147. package/dist/server/static-file-cache.js +219 -0
  148. package/dist/server/static-file-cache.js.map +1 -0
  149. package/dist/shims/app.d.ts +2 -2
  150. package/dist/shims/cache-runtime.d.ts +6 -9
  151. package/dist/shims/cache-runtime.js.map +1 -1
  152. package/dist/shims/cache.d.ts +28 -31
  153. package/dist/shims/cache.js.map +1 -1
  154. package/dist/shims/config.d.ts +2 -2
  155. package/dist/shims/config.js.map +1 -1
  156. package/dist/shims/dynamic.d.ts +2 -2
  157. package/dist/shims/dynamic.js +5 -7
  158. package/dist/shims/dynamic.js.map +1 -1
  159. package/dist/shims/error-boundary.d.ts +7 -7
  160. package/dist/shims/error-boundary.js.map +1 -1
  161. package/dist/shims/error.d.ts +2 -2
  162. package/dist/shims/error.js.map +1 -1
  163. package/dist/shims/fetch-cache.d.ts +4 -4
  164. package/dist/shims/fetch-cache.js.map +1 -1
  165. package/dist/shims/font-google-base.d.ts +4 -4
  166. package/dist/shims/font-google-base.js.map +1 -1
  167. package/dist/shims/font-local.d.ts +6 -6
  168. package/dist/shims/font-local.js.map +1 -1
  169. package/dist/shims/form.d.ts +4 -8
  170. package/dist/shims/form.js +4 -6
  171. package/dist/shims/form.js.map +1 -1
  172. package/dist/shims/head-state.d.ts +2 -2
  173. package/dist/shims/head-state.js.map +1 -1
  174. package/dist/shims/head.d.ts +2 -2
  175. package/dist/shims/head.js +18 -20
  176. package/dist/shims/head.js.map +1 -1
  177. package/dist/shims/headers.d.ts +4 -4
  178. package/dist/shims/headers.js.map +1 -1
  179. package/dist/shims/i18n-context.d.ts +2 -2
  180. package/dist/shims/i18n-context.js.map +1 -1
  181. package/dist/shims/i18n-state.d.ts +2 -2
  182. package/dist/shims/i18n-state.js.map +1 -1
  183. package/dist/shims/image-config.d.ts +2 -2
  184. package/dist/shims/image-config.js.map +1 -1
  185. package/dist/shims/image.d.ts +5 -6
  186. package/dist/shims/image.js.map +1 -1
  187. package/dist/shims/internal/app-router-context.d.ts +6 -6
  188. package/dist/shims/internal/app-router-context.js.map +1 -1
  189. package/dist/shims/internal/utils.d.ts +2 -2
  190. package/dist/shims/internal/utils.js.map +1 -1
  191. package/dist/shims/layout-segment-context.d.ts +12 -5
  192. package/dist/shims/layout-segment-context.js +9 -4
  193. package/dist/shims/layout-segment-context.js.map +1 -1
  194. package/dist/shims/legacy-image.d.ts +5 -8
  195. package/dist/shims/legacy-image.js.map +1 -1
  196. package/dist/shims/link.d.ts +21 -31
  197. package/dist/shims/link.js +4 -58
  198. package/dist/shims/link.js.map +1 -1
  199. package/dist/shims/metadata.d.ts +23 -31
  200. package/dist/shims/metadata.js.map +1 -1
  201. package/dist/shims/navigation-state.d.ts +2 -2
  202. package/dist/shims/navigation-state.js.map +1 -1
  203. package/dist/shims/navigation.d.ts +102 -17
  204. package/dist/shims/navigation.js +359 -113
  205. package/dist/shims/navigation.js.map +1 -1
  206. package/dist/shims/request-context.d.ts +2 -2
  207. package/dist/shims/request-context.js.map +1 -1
  208. package/dist/shims/router-state.d.ts +4 -4
  209. package/dist/shims/router-state.js.map +1 -1
  210. package/dist/shims/router.d.ts +28 -47
  211. package/dist/shims/router.js.map +1 -1
  212. package/dist/shims/script.d.ts +16 -31
  213. package/dist/shims/script.js.map +1 -1
  214. package/dist/shims/server.d.ts +10 -10
  215. package/dist/shims/server.js.map +1 -1
  216. package/dist/shims/unified-request-context.d.ts +3 -5
  217. package/dist/shims/unified-request-context.js.map +1 -1
  218. package/dist/shims/web-vitals.d.ts +2 -2
  219. package/dist/shims/web-vitals.js.map +1 -1
  220. package/dist/utils/lazy-chunks.d.ts +34 -0
  221. package/dist/utils/lazy-chunks.js +50 -0
  222. package/dist/utils/lazy-chunks.js.map +1 -0
  223. package/dist/utils/vinext-root.d.ts +24 -0
  224. package/dist/utils/vinext-root.js +31 -0
  225. package/dist/utils/vinext-root.js.map +1 -0
  226. package/package.json +1 -1
@@ -40,9 +40,7 @@ async function generateServerEntry(pagesDir, nextConfig, fileMatcher, middleware
40
40
  const absPath = r.filePath.replace(/\\/g, "/");
41
41
  return ` { pattern: ${JSON.stringify(r.pattern)}, patternParts: ${JSON.stringify(r.patternParts)}, isDynamic: ${r.isDynamic}, params: ${JSON.stringify(r.params)}, module: page_${i}, filePath: ${JSON.stringify(absPath)} }`;
42
42
  });
43
- const apiRouteEntries = apiRoutes.map((r, i) => {
44
- return ` { pattern: ${JSON.stringify(r.pattern)}, patternParts: ${JSON.stringify(r.patternParts)}, isDynamic: ${r.isDynamic}, params: ${JSON.stringify(r.params)}, module: api_${i} }`;
45
- });
43
+ const apiRouteEntries = apiRoutes.map((r, i) => ` { pattern: ${JSON.stringify(r.pattern)}, patternParts: ${JSON.stringify(r.patternParts)}, isDynamic: ${r.isDynamic}, params: ${JSON.stringify(r.params)}, module: api_${i} }`);
46
44
  const appFilePath = findFileWithExts(pagesDir, "_app", fileMatcher);
47
45
  const docFilePath = findFileWithExts(pagesDir, "_document", fileMatcher);
48
46
  const appImportCode = appFilePath !== null ? `import { default as AppComponent } from ${JSON.stringify(appFilePath.replace(/\\/g, "/"))};` : `const AppComponent = null;`;
@@ -1 +1 @@
1
- {"version":3,"file":"pages-server-entry.js","names":[],"sources":["../../src/entries/pages-server-entry.ts"],"sourcesContent":["/**\n * Pages Router server entry generator.\n *\n * Generates the virtual SSR server entry module (`virtual:vinext-server-entry`).\n * This is the entry point for `vite build --ssr`. It handles SSR, API routes,\n * middleware, ISR, and i18n for the Pages Router.\n *\n * Extracted from index.ts.\n */\nimport { resolveEntryPath } from \"./runtime-entry-module.js\";\nimport { pagesRouter, apiRouter, type Route } from \"../routing/pages-router.js\";\nimport { createValidFileMatcher } from \"../routing/file-matcher.js\";\nimport { type ResolvedNextConfig } from \"../config/next-config.js\";\nimport { isProxyFile } from \"../server/middleware.js\";\nimport {\n generateSafeRegExpCode,\n generateMiddlewareMatcherCode,\n generateNormalizePathCode,\n generateRouteMatchNormalizationCode,\n} from \"../server/middleware-codegen.js\";\nimport { findFileWithExts } from \"./pages-entry-helpers.js\";\n\nconst _requestContextShimPath = resolveEntryPath(\"../shims/request-context.js\", import.meta.url);\nconst _routeTriePath = resolveEntryPath(\"../routing/route-trie.js\", import.meta.url);\nconst _pagesI18nPath = resolveEntryPath(\"../server/pages-i18n.js\", import.meta.url);\nconst _pagesPageResponsePath = resolveEntryPath(\n \"../server/pages-page-response.js\",\n import.meta.url,\n);\nconst _pagesPageDataPath = resolveEntryPath(\"../server/pages-page-data.js\", import.meta.url);\nconst _pagesNodeCompatPath = resolveEntryPath(\"../server/pages-node-compat.js\", import.meta.url);\nconst _pagesApiRoutePath = resolveEntryPath(\"../server/pages-api-route.js\", import.meta.url);\nconst _isrCachePath = resolveEntryPath(\"../server/isr-cache.js\", import.meta.url);\n\n/**\n * Generate the virtual SSR server entry module.\n * This is the entry point for `vite build --ssr`.\n */\nexport async function generateServerEntry(\n pagesDir: string,\n nextConfig: ResolvedNextConfig,\n fileMatcher: ReturnType<typeof createValidFileMatcher>,\n middlewarePath: string | null,\n instrumentationPath: string | null,\n): Promise<string> {\n const pageRoutes = await pagesRouter(pagesDir, nextConfig?.pageExtensions, fileMatcher);\n const apiRoutes = await apiRouter(pagesDir, nextConfig?.pageExtensions, fileMatcher);\n\n // Generate import statements using absolute paths since virtual\n // modules don't have a real file location for relative resolution.\n const pageImports = pageRoutes.map((r: Route, i: number) => {\n const absPath = r.filePath.replace(/\\\\/g, \"/\");\n return `import * as page_${i} from ${JSON.stringify(absPath)};`;\n });\n\n const apiImports = apiRoutes.map((r: Route, i: number) => {\n const absPath = r.filePath.replace(/\\\\/g, \"/\");\n return `import * as api_${i} from ${JSON.stringify(absPath)};`;\n });\n\n // Build the route table — include filePath for SSR manifest lookup\n const pageRouteEntries = pageRoutes.map((r: Route, i: number) => {\n const absPath = r.filePath.replace(/\\\\/g, \"/\");\n return ` { pattern: ${JSON.stringify(r.pattern)}, patternParts: ${JSON.stringify(r.patternParts)}, isDynamic: ${r.isDynamic}, params: ${JSON.stringify(r.params)}, module: page_${i}, filePath: ${JSON.stringify(absPath)} }`;\n });\n\n const apiRouteEntries = apiRoutes.map((r: Route, i: number) => {\n return ` { pattern: ${JSON.stringify(r.pattern)}, patternParts: ${JSON.stringify(r.patternParts)}, isDynamic: ${r.isDynamic}, params: ${JSON.stringify(r.params)}, module: api_${i} }`;\n });\n\n // Check for _app and _document\n const appFilePath = findFileWithExts(pagesDir, \"_app\", fileMatcher);\n const docFilePath = findFileWithExts(pagesDir, \"_document\", fileMatcher);\n const appImportCode =\n appFilePath !== null\n ? `import { default as AppComponent } from ${JSON.stringify(appFilePath.replace(/\\\\/g, \"/\"))};`\n : `const AppComponent = null;`;\n\n const docImportCode =\n docFilePath !== null\n ? `import { default as DocumentComponent } from ${JSON.stringify(docFilePath.replace(/\\\\/g, \"/\"))};`\n : `const DocumentComponent = null;`;\n\n // Serialize i18n config for embedding in the server entry\n const i18nConfigJson = nextConfig?.i18n\n ? JSON.stringify({\n locales: nextConfig.i18n.locales,\n defaultLocale: nextConfig.i18n.defaultLocale,\n localeDetection: nextConfig.i18n.localeDetection,\n domains: nextConfig.i18n.domains,\n })\n : \"null\";\n\n // Embed the resolved build ID at build time\n const buildIdJson = JSON.stringify(nextConfig?.buildId ?? null);\n\n // Serialize the full resolved config for the production server.\n // This embeds redirects, rewrites, headers, basePath, trailingSlash\n // so prod-server.ts can apply them without loading next.config.js at runtime.\n const vinextConfigJson = JSON.stringify({\n basePath: nextConfig?.basePath ?? \"\",\n trailingSlash: nextConfig?.trailingSlash ?? false,\n redirects: nextConfig?.redirects ?? [],\n rewrites: nextConfig?.rewrites ?? { beforeFiles: [], afterFiles: [], fallback: [] },\n headers: nextConfig?.headers ?? [],\n i18n: nextConfig?.i18n ?? null,\n images: {\n deviceSizes: nextConfig?.images?.deviceSizes,\n imageSizes: nextConfig?.images?.imageSizes,\n dangerouslyAllowSVG: nextConfig?.images?.dangerouslyAllowSVG,\n contentDispositionType: nextConfig?.images?.contentDispositionType,\n contentSecurityPolicy: nextConfig?.images?.contentSecurityPolicy,\n },\n });\n\n // Generate instrumentation code if instrumentation.ts exists.\n // For production (Cloudflare Workers), instrumentation.ts is bundled into the\n // Worker and register() is called as a top-level await at module evaluation time —\n // before any request is handled. This mirrors App Router behavior (generateRscEntry)\n // and matches Next.js semantics: register() runs once on startup in the process\n // that handles requests.\n //\n // The onRequestError handler is stored on globalThis so it is visible across\n // all code within the Worker (same global scope).\n const instrumentationImportCode = instrumentationPath\n ? `import * as _instrumentation from ${JSON.stringify(instrumentationPath.replace(/\\\\/g, \"/\"))};`\n : \"\";\n\n const instrumentationInitCode = instrumentationPath\n ? `// Run instrumentation register() once at module evaluation time — before any\n// requests are handled. Matches Next.js semantics: register() is called once\n// on startup in the process that handles requests.\nif (typeof _instrumentation.register === \"function\") {\n await _instrumentation.register();\n}\n// Store the onRequestError handler on globalThis so it is visible to all\n// code within the Worker (same global scope).\nif (typeof _instrumentation.onRequestError === \"function\") {\n globalThis.__VINEXT_onRequestErrorHandler__ = _instrumentation.onRequestError;\n}`\n : \"\";\n\n // Generate middleware code if middleware.ts exists\n const middlewareImportCode = middlewarePath\n ? `import * as middlewareModule from ${JSON.stringify(middlewarePath.replace(/\\\\/g, \"/\"))};\nimport { NextRequest, NextFetchEvent } from \"next/server\";`\n : \"\";\n\n // The matcher config is read from the middleware module at import time.\n // We inline the matching + execution logic so the prod server can call it.\n const middlewareExportCode = middlewarePath\n ? `\n// --- Middleware support (generated from middleware-codegen.ts) ---\n${generateNormalizePathCode(\"es5\")}\n${generateRouteMatchNormalizationCode(\"es5\")}\n${generateSafeRegExpCode(\"es5\")}\n${generateMiddlewareMatcherCode(\"es5\")}\n\nexport async function runMiddleware(request, ctx) {\n if (ctx) return _runWithExecutionContext(ctx, () => _runMiddleware(request));\n return _runMiddleware(request);\n}\n\nasync function _runMiddleware(request) {\n var isProxy = ${middlewarePath ? JSON.stringify(isProxyFile(middlewarePath)) : \"false\"};\n var middlewareFn = isProxy\n ? (middlewareModule.proxy ?? middlewareModule.default)\n : (middlewareModule.middleware ?? middlewareModule.default);\n if (typeof middlewareFn !== \"function\") {\n var fileType = isProxy ? \"Proxy\" : \"Middleware\";\n var expectedExport = isProxy ? \"proxy\" : \"middleware\";\n throw new Error(\"The \" + fileType + \" file must export a function named \\`\" + expectedExport + \"\\` or a \\`default\\` function.\");\n }\n\n var config = middlewareModule.config;\n var matcher = config && config.matcher;\n var url = new URL(request.url);\n\n // Normalize pathname before matching to prevent path-confusion bypasses\n // (percent-encoding like /%61dmin, double slashes like /dashboard//settings).\n var decodedPathname;\n try { decodedPathname = __normalizePathnameForRouteMatchStrict(url.pathname); } catch (e) {\n return { continue: false, response: new Response(\"Bad Request\", { status: 400 }) };\n }\n var normalizedPathname = __normalizePath(decodedPathname);\n\n if (!matchesMiddleware(normalizedPathname, matcher, request, i18nConfig)) return { continue: true };\n\n // Construct a new Request with the decoded + normalized pathname so middleware\n // always sees the same canonical path that the router uses.\n var mwRequest = request;\n if (normalizedPathname !== url.pathname) {\n var mwUrl = new URL(url);\n mwUrl.pathname = normalizedPathname;\n mwRequest = new Request(mwUrl, request);\n }\n var __mwNextConfig = (vinextConfig.basePath || i18nConfig) ? { basePath: vinextConfig.basePath, i18n: i18nConfig || undefined } : undefined;\n var nextRequest = mwRequest instanceof NextRequest ? mwRequest : new NextRequest(mwRequest, __mwNextConfig ? { nextConfig: __mwNextConfig } : undefined);\n var fetchEvent = new NextFetchEvent({ page: normalizedPathname });\n var response;\n try { response = await middlewareFn(nextRequest, fetchEvent); }\n catch (e) {\n console.error(\"[vinext] Middleware error:\", e);\n var _mwCtxErr = _getRequestExecutionContext();\n if (_mwCtxErr && typeof _mwCtxErr.waitUntil === \"function\") { _mwCtxErr.waitUntil(fetchEvent.drainWaitUntil()); } else { fetchEvent.drainWaitUntil(); }\n return { continue: false, response: new Response(\"Internal Server Error\", { status: 500 }) };\n }\n var _mwCtx = _getRequestExecutionContext();\n if (_mwCtx && typeof _mwCtx.waitUntil === \"function\") { _mwCtx.waitUntil(fetchEvent.drainWaitUntil()); } else { fetchEvent.drainWaitUntil(); }\n\n if (!response) return { continue: true };\n\n if (response.headers.get(\"x-middleware-next\") === \"1\") {\n var rHeaders = new Headers();\n for (var [key, value] of response.headers) {\n // Keep x-middleware-request-* headers so the production server can\n // apply middleware-request header overrides before stripping internals\n // from the final client response.\n if (\n !key.startsWith(\"x-middleware-\") ||\n key === \"x-middleware-override-headers\" ||\n key.startsWith(\"x-middleware-request-\")\n ) rHeaders.append(key, value);\n }\n return { continue: true, responseHeaders: rHeaders };\n }\n\n if (response.status >= 300 && response.status < 400) {\n var location = response.headers.get(\"Location\") || response.headers.get(\"location\");\n if (location) {\n var rdHeaders = new Headers();\n for (var [rk, rv] of response.headers) {\n if (!rk.startsWith(\"x-middleware-\") && rk.toLowerCase() !== \"location\") rdHeaders.append(rk, rv);\n }\n return { continue: false, redirectUrl: location, redirectStatus: response.status, responseHeaders: rdHeaders };\n }\n }\n\n var rewriteUrl = response.headers.get(\"x-middleware-rewrite\");\n if (rewriteUrl) {\n var rwHeaders = new Headers();\n for (var [k, v] of response.headers) {\n if (!k.startsWith(\"x-middleware-\") || k === \"x-middleware-override-headers\" || k.startsWith(\"x-middleware-request-\")) rwHeaders.append(k, v);\n }\n var rewritePath;\n try { var parsed = new URL(rewriteUrl, request.url); rewritePath = parsed.pathname + parsed.search; }\n catch { rewritePath = rewriteUrl; }\n return { continue: true, rewriteUrl: rewritePath, rewriteStatus: response.status !== 200 ? response.status : undefined, responseHeaders: rwHeaders };\n }\n\n return { continue: false, response: response };\n}\n`\n : `\nexport async function runMiddleware() { return { continue: true }; }\n`;\n\n // The server entry is a self-contained module that uses Web-standard APIs\n // (Request/Response, renderToReadableStream) so it runs on Cloudflare Workers.\n return `\nimport React from \"react\";\nimport { renderToReadableStream } from \"react-dom/server.edge\";\nimport { resetSSRHead, getSSRHeadHTML } from \"next/head\";\nimport { flushPreloads } from \"next/dynamic\";\nimport { setSSRContext, wrapWithRouterContext } from \"next/router\";\nimport { _runWithCacheState } from \"next/cache\";\nimport { runWithPrivateCache } from \"vinext/cache-runtime\";\nimport { ensureFetchPatch, runWithFetchCache } from \"vinext/fetch-cache\";\nimport { runWithRequestContext as _runWithUnifiedCtx, createRequestContext as _createUnifiedCtx } from \"vinext/unified-request-context\";\nimport \"vinext/router-state\";\nimport { runWithServerInsertedHTMLState } from \"vinext/navigation-state\";\nimport { runWithHeadState } from \"vinext/head-state\";\nimport \"vinext/i18n-state\";\nimport { setI18nContext } from \"vinext/i18n-context\";\nimport { safeJsonStringify } from \"vinext/html\";\nimport { getSSRFontLinks as _getSSRFontLinks, getSSRFontStyles as _getSSRFontStylesGoogle, getSSRFontPreloads as _getSSRFontPreloadsGoogle } from \"next/font/google\";\nimport { getSSRFontStyles as _getSSRFontStylesLocal, getSSRFontPreloads as _getSSRFontPreloadsLocal } from \"next/font/local\";\nimport { sanitizeDestination as sanitizeDestinationLocal } from ${JSON.stringify(resolveEntryPath(\"../config/config-matchers.js\", import.meta.url))};\nimport { runWithExecutionContext as _runWithExecutionContext, getRequestExecutionContext as _getRequestExecutionContext } from ${JSON.stringify(_requestContextShimPath)};\nimport { buildRouteTrie as _buildRouteTrie, trieMatch as _trieMatch } from ${JSON.stringify(_routeTriePath)};\nimport { reportRequestError as _reportRequestError } from \"vinext/instrumentation\";\nimport { resolvePagesI18nRequest } from ${JSON.stringify(_pagesI18nPath)};\nimport { createPagesReqRes as __createPagesReqRes } from ${JSON.stringify(_pagesNodeCompatPath)};\nimport { handlePagesApiRoute as __handlePagesApiRoute } from ${JSON.stringify(_pagesApiRoutePath)};\nimport {\n isrGet as __sharedIsrGet,\n isrSet as __sharedIsrSet,\n isrCacheKey as __sharedIsrCacheKey,\n triggerBackgroundRegeneration as __sharedTriggerBackgroundRegeneration,\n} from ${JSON.stringify(_isrCachePath)};\nimport { resolvePagesPageData as __resolvePagesPageData } from ${JSON.stringify(_pagesPageDataPath)};\nimport { renderPagesPageResponse as __renderPagesPageResponse } from ${JSON.stringify(_pagesPageResponsePath)};\n${instrumentationImportCode}\n${middlewareImportCode}\n\n${instrumentationInitCode}\n\n// i18n config (embedded at build time)\nconst i18nConfig = ${i18nConfigJson};\n\n// Build ID (embedded at build time)\nconst buildId = ${buildIdJson};\n\n// Full resolved config for production server (embedded at build time)\nexport const vinextConfig = ${vinextConfigJson};\n\nfunction isrGet(key) {\n return __sharedIsrGet(key);\n}\nfunction isrSet(key, data, revalidateSeconds, tags) {\n return __sharedIsrSet(key, data, revalidateSeconds, tags);\n}\nfunction triggerBackgroundRegeneration(key, renderFn) {\n return __sharedTriggerBackgroundRegeneration(key, renderFn);\n}\nfunction isrCacheKey(router, pathname) {\n return __sharedIsrCacheKey(router, pathname, buildId || undefined);\n}\n\nasync function renderToStringAsync(element) {\n const stream = await renderToReadableStream(element);\n await stream.allReady;\n return new Response(stream).text();\n}\n\nasync function renderIsrPassToStringAsync(element) {\n // The cache-fill render is a second render pass for the same request.\n // Reset render-scoped state so it cannot leak from the streamed response\n // render or affect async work that is still draining from that stream.\n // Keep request identity state (pathname/query/locale/executionContext)\n // intact: this second pass still belongs to the same request.\n return await runWithServerInsertedHTMLState(() =>\n runWithHeadState(() =>\n _runWithCacheState(() =>\n runWithPrivateCache(() => runWithFetchCache(async () => renderToStringAsync(element))),\n ),\n ),\n );\n}\n\n${pageImports.join(\"\\n\")}\n${apiImports.join(\"\\n\")}\n\n${appImportCode}\n${docImportCode}\n\nexport const pageRoutes = [\n${pageRouteEntries.join(\",\\n\")}\n];\nconst _pageRouteTrie = _buildRouteTrie(pageRoutes);\n\nconst apiRoutes = [\n${apiRouteEntries.join(\",\\n\")}\n];\nconst _apiRouteTrie = _buildRouteTrie(apiRoutes);\n\nfunction matchRoute(url, routes) {\n const pathname = url.split(\"?\")[0];\n let normalizedUrl = pathname === \"/\" ? \"/\" : pathname.replace(/\\\\/$/, \"\");\n // NOTE: Do NOT decodeURIComponent here. The pathname is already decoded at\n // the entry point. Decoding again would create a double-decode vector.\n const urlParts = normalizedUrl.split(\"/\").filter(Boolean);\n const trie = routes === pageRoutes ? _pageRouteTrie : _apiRouteTrie;\n return _trieMatch(trie, urlParts);\n}\n\nfunction parseQuery(url) {\n const qs = url.split(\"?\")[1];\n if (!qs) return {};\n const p = new URLSearchParams(qs);\n const q = {};\n for (const [k, v] of p) {\n if (k in q) {\n q[k] = Array.isArray(q[k]) ? q[k].concat(v) : [q[k], v];\n } else {\n q[k] = v;\n }\n }\n return q;\n}\n\nfunction patternToNextFormat(pattern) {\n return pattern\n .replace(/:([\\\\w]+)\\\\*/g, \"[[...$1]]\")\n .replace(/:([\\\\w]+)\\\\+/g, \"[...$1]\")\n .replace(/:([\\\\w]+)/g, \"[$1]\");\n}\n\nfunction collectAssetTags(manifest, moduleIds) {\n // Fall back to embedded manifest (set by vinext:cloudflare-build for Workers)\n const m = (manifest && Object.keys(manifest).length > 0)\n ? manifest\n : (typeof globalThis !== \"undefined\" && globalThis.__VINEXT_SSR_MANIFEST__) || null;\n const tags = [];\n const seen = new Set();\n\n // Load the set of lazy chunk filenames (only reachable via dynamic imports).\n // These should NOT get <link rel=\"modulepreload\"> or <script type=\"module\">\n // tags — they are fetched on demand when the dynamic import() executes (e.g.\n // chunks behind React.lazy() or next/dynamic boundaries).\n var lazyChunks = (typeof globalThis !== \"undefined\" && globalThis.__VINEXT_LAZY_CHUNKS__) || null;\n var lazySet = lazyChunks && lazyChunks.length > 0 ? new Set(lazyChunks) : null;\n\n // Inject the client entry script if embedded by vinext:cloudflare-build\n if (typeof globalThis !== \"undefined\" && globalThis.__VINEXT_CLIENT_ENTRY__) {\n const entry = globalThis.__VINEXT_CLIENT_ENTRY__;\n seen.add(entry);\n tags.push('<link rel=\"modulepreload\" href=\"/' + entry + '\" />');\n tags.push('<script type=\"module\" src=\"/' + entry + '\" crossorigin></script>');\n }\n if (m) {\n // Always inject shared chunks (framework, vinext runtime, entry) and\n // page-specific chunks. The manifest maps module file paths to their\n // associated JS/CSS assets.\n //\n // For page-specific injection, the module IDs may be absolute paths\n // while the manifest uses relative paths. Try both the original ID\n // and a suffix match to find the correct manifest entry.\n var allFiles = [];\n\n if (moduleIds && moduleIds.length > 0) {\n // Collect assets for the requested page modules\n for (var mi = 0; mi < moduleIds.length; mi++) {\n var id = moduleIds[mi];\n var files = m[id];\n if (!files) {\n // Absolute path didn't match — try matching by suffix.\n // Manifest keys are relative (e.g. \"pages/about.tsx\") while\n // moduleIds may be absolute (e.g. \"/home/.../pages/about.tsx\").\n for (var mk in m) {\n if (id.endsWith(\"/\" + mk) || id === mk) {\n files = m[mk];\n break;\n }\n }\n }\n if (files) {\n for (var fi = 0; fi < files.length; fi++) allFiles.push(files[fi]);\n }\n }\n\n // Also inject shared chunks that every page needs: framework,\n // vinext runtime, and the entry bootstrap. These are identified\n // by scanning all manifest values for chunk filenames containing\n // known prefixes.\n for (var key in m) {\n var vals = m[key];\n if (!vals) continue;\n for (var vi = 0; vi < vals.length; vi++) {\n var file = vals[vi];\n var basename = file.split(\"/\").pop() || \"\";\n if (\n basename.startsWith(\"framework-\") ||\n basename.startsWith(\"vinext-\") ||\n basename.includes(\"vinext-client-entry\") ||\n basename.includes(\"vinext-app-browser-entry\")\n ) {\n allFiles.push(file);\n }\n }\n }\n } else {\n // No specific modules — include all assets from manifest\n for (var akey in m) {\n var avals = m[akey];\n if (avals) {\n for (var ai = 0; ai < avals.length; ai++) allFiles.push(avals[ai]);\n }\n }\n }\n\n for (var ti = 0; ti < allFiles.length; ti++) {\n var tf = allFiles[ti];\n // Normalize: Vite's SSR manifest values include a leading '/'\n // (from base path), but we prepend '/' ourselves when building\n // href/src attributes. Strip any existing leading slash to avoid\n // producing protocol-relative URLs like \"//assets/chunk.js\".\n // This also ensures consistent keys for the seen-set dedup and\n // lazySet.has() checks (which use values without leading slash).\n if (tf.charAt(0) === '/') tf = tf.slice(1);\n if (seen.has(tf)) continue;\n seen.add(tf);\n if (tf.endsWith(\".css\")) {\n tags.push('<link rel=\"stylesheet\" href=\"/' + tf + '\" />');\n } else if (tf.endsWith(\".js\")) {\n // Skip lazy chunks — they are behind dynamic import() boundaries\n // (React.lazy, next/dynamic) and should only be fetched on demand.\n if (lazySet && lazySet.has(tf)) continue;\n tags.push('<link rel=\"modulepreload\" href=\"/' + tf + '\" />');\n tags.push('<script type=\"module\" src=\"/' + tf + '\" crossorigin></script>');\n }\n }\n }\n return tags.join(\"\\\\n \");\n}\n\n// i18n helpers\nfunction extractLocale(url) {\n if (!i18nConfig) return { locale: undefined, url, hadPrefix: false };\n const pathname = url.split(\"?\")[0];\n const parts = pathname.split(\"/\").filter(Boolean);\n const query = url.includes(\"?\") ? url.slice(url.indexOf(\"?\")) : \"\";\n if (parts.length > 0 && i18nConfig.locales.includes(parts[0])) {\n const locale = parts[0];\n const rest = \"/\" + parts.slice(1).join(\"/\");\n return { locale, url: (rest || \"/\") + query, hadPrefix: true };\n }\n return { locale: i18nConfig.defaultLocale, url, hadPrefix: false };\n}\n\nfunction detectLocaleFromHeaders(headers) {\n if (!i18nConfig) return null;\n const acceptLang = headers.get(\"accept-language\");\n if (!acceptLang) return null;\n const langs = acceptLang.split(\",\").map(function(part) {\n const pieces = part.trim().split(\";\");\n const q = pieces[1] ? parseFloat(pieces[1].replace(\"q=\", \"\")) : 1;\n return { lang: pieces[0].trim().toLowerCase(), q: q };\n }).sort(function(a, b) { return b.q - a.q; });\n for (let k = 0; k < langs.length; k++) {\n const lang = langs[k].lang;\n for (let j = 0; j < i18nConfig.locales.length; j++) {\n if (i18nConfig.locales[j].toLowerCase() === lang) return i18nConfig.locales[j];\n }\n const prefix = lang.split(\"-\")[0];\n for (let j = 0; j < i18nConfig.locales.length; j++) {\n const loc = i18nConfig.locales[j].toLowerCase();\n if (loc === prefix || loc.startsWith(prefix + \"-\")) return i18nConfig.locales[j];\n }\n }\n return null;\n}\n\nfunction parseCookieLocaleFromHeader(cookieHeader) {\n if (!i18nConfig || !cookieHeader) return null;\n const match = cookieHeader.match(/(?:^|;\\\\s*)NEXT_LOCALE=([^;]*)/);\n if (!match) return null;\n var value;\n try { value = decodeURIComponent(match[1].trim()); } catch (e) { return null; }\n if (i18nConfig.locales.indexOf(value) !== -1) return value;\n return null;\n}\n\nexport async function renderPage(request, url, manifest, ctx) {\n if (ctx) return _runWithExecutionContext(ctx, () => _renderPage(request, url, manifest));\n return _renderPage(request, url, manifest);\n}\n\nasync function _renderPage(request, url, manifest) {\n const localeInfo = i18nConfig\n ? resolvePagesI18nRequest(\n url,\n i18nConfig,\n request.headers,\n new URL(request.url).hostname,\n vinextConfig.basePath,\n vinextConfig.trailingSlash,\n )\n : { locale: undefined, url, hadPrefix: false, domainLocale: undefined, redirectUrl: undefined };\n const locale = localeInfo.locale;\n const routeUrl = localeInfo.url;\n const currentDefaultLocale = i18nConfig\n ? (localeInfo.domainLocale ? localeInfo.domainLocale.defaultLocale : i18nConfig.defaultLocale)\n : undefined;\n const domainLocales = i18nConfig ? i18nConfig.domains : undefined;\n\n if (localeInfo.redirectUrl) {\n return new Response(null, { status: 307, headers: { Location: localeInfo.redirectUrl } });\n }\n\n const match = matchRoute(routeUrl, pageRoutes);\n if (!match) {\n return new Response(\"<!DOCTYPE html><html><body><h1>404 - Page not found</h1></body></html>\",\n { status: 404, headers: { \"Content-Type\": \"text/html\" } });\n }\n\n\t const { route, params } = match;\n\t const __uCtx = _createUnifiedCtx({\n\t executionContext: _getRequestExecutionContext(),\n\t });\n\t return _runWithUnifiedCtx(__uCtx, async () => {\n\t ensureFetchPatch();\n\t try {\n\t const routePattern = patternToNextFormat(route.pattern);\n\t if (typeof setSSRContext === \"function\") {\n\t setSSRContext({\n\t pathname: routePattern,\n\t query: { ...params, ...parseQuery(routeUrl) },\n\t asPath: routeUrl,\n\t locale: locale,\n locales: i18nConfig ? i18nConfig.locales : undefined,\n defaultLocale: currentDefaultLocale,\n domainLocales: domainLocales,\n });\n }\n\n if (i18nConfig) {\n setI18nContext({\n locale: locale,\n locales: i18nConfig.locales,\n defaultLocale: currentDefaultLocale,\n domainLocales: domainLocales,\n hostname: new URL(request.url).hostname,\n });\n }\n\n const pageModule = route.module;\n const PageComponent = pageModule.default;\n\t if (!PageComponent) {\n\t return new Response(\"Page has no default export\", { status: 500 });\n\t }\n\t // Build font Link header early so it's available for ISR cached responses too.\n\t // Font preloads are module-level state populated at import time and persist across requests.\n\t var _fontLinkHeader = \"\";\n\t var _allFp = [];\n try {\n var _fpGoogle = typeof _getSSRFontPreloadsGoogle === \"function\" ? _getSSRFontPreloadsGoogle() : [];\n var _fpLocal = typeof _getSSRFontPreloadsLocal === \"function\" ? _getSSRFontPreloadsLocal() : [];\n _allFp = _fpGoogle.concat(_fpLocal);\n\t if (_allFp.length > 0) {\n\t _fontLinkHeader = _allFp.map(function(p) { return \"<\" + p.href + \">; rel=preload; as=font; type=\" + p.type + \"; crossorigin\"; }).join(\", \");\n\t }\n\t } catch (e) { /* font preloads not available */ }\n\t const query = parseQuery(routeUrl);\n\t const pageDataResult = await __resolvePagesPageData({\n\t applyRequestContexts() {\n\t if (typeof setSSRContext === \"function\") {\n\t setSSRContext({\n\t pathname: routePattern,\n\t query: { ...params, ...query },\n\t asPath: routeUrl,\n\t locale: locale,\n\t locales: i18nConfig ? i18nConfig.locales : undefined,\n\t defaultLocale: currentDefaultLocale,\n\t domainLocales: domainLocales,\n\t });\n\t }\n\t if (i18nConfig) {\n\t setI18nContext({\n\t locale: locale,\n\t locales: i18nConfig.locales,\n\t defaultLocale: currentDefaultLocale,\n\t domainLocales: domainLocales,\n\t hostname: new URL(request.url).hostname,\n\t });\n\t }\n\t },\n\t buildId,\n\t createGsspReqRes() {\n\t return __createPagesReqRes({ body: undefined, query, request, url: routeUrl });\n\t },\n\t createPageElement(currentPageProps) {\n\t var currentElement = AppComponent\n\t ? React.createElement(AppComponent, { Component: PageComponent, pageProps: currentPageProps })\n\t : React.createElement(PageComponent, currentPageProps);\n\t return wrapWithRouterContext(currentElement);\n\t },\n\t fontLinkHeader: _fontLinkHeader,\n\t i18n: {\n\t locale: locale,\n\t locales: i18nConfig ? i18nConfig.locales : undefined,\n\t defaultLocale: currentDefaultLocale,\n\t domainLocales: domainLocales,\n\t },\n\t isrCacheKey,\n\t isrGet,\n\t isrSet,\n\t pageModule,\n\t params,\n\t query,\n\t renderIsrPassToStringAsync,\n\t route: {\n\t isDynamic: route.isDynamic,\n\t },\n\t routePattern,\n\t routeUrl,\n\t runInFreshUnifiedContext(callback) {\n\t var revalCtx = _createUnifiedCtx({\n\t executionContext: _getRequestExecutionContext(),\n\t });\n\t return _runWithUnifiedCtx(revalCtx, async () => {\n\t ensureFetchPatch();\n\t return callback();\n\t });\n\t },\n\t safeJsonStringify,\n\t sanitizeDestination: sanitizeDestinationLocal,\n\t triggerBackgroundRegeneration,\n\t });\n\t if (pageDataResult.kind === \"response\") {\n\t return pageDataResult.response;\n\t }\n\t let pageProps = pageDataResult.pageProps;\n\t var gsspRes = pageDataResult.gsspRes;\n\t let isrRevalidateSeconds = pageDataResult.isrRevalidateSeconds;\n\n\t const pageModuleIds = route.filePath ? [route.filePath] : [];\n\t const assetTags = collectAssetTags(manifest, pageModuleIds);\n\n return __renderPagesPageResponse({\n assetTags,\n buildId,\n clearSsrContext() {\n if (typeof setSSRContext === \"function\") setSSRContext(null);\n },\n createPageElement(currentPageProps) {\n var currentElement;\n if (AppComponent) {\n currentElement = React.createElement(AppComponent, { Component: PageComponent, pageProps: currentPageProps });\n } else {\n currentElement = React.createElement(PageComponent, currentPageProps);\n }\n return wrapWithRouterContext(currentElement);\n },\n DocumentComponent,\n flushPreloads: typeof flushPreloads === \"function\" ? flushPreloads : undefined,\n fontLinkHeader: _fontLinkHeader,\n fontPreloads: _allFp,\n getFontLinks() {\n try {\n return typeof _getSSRFontLinks === \"function\" ? _getSSRFontLinks() : [];\n } catch (e) {\n return [];\n }\n },\n getFontStyles() {\n try {\n var allFontStyles = [];\n if (typeof _getSSRFontStylesGoogle === \"function\") allFontStyles.push(..._getSSRFontStylesGoogle());\n if (typeof _getSSRFontStylesLocal === \"function\") allFontStyles.push(..._getSSRFontStylesLocal());\n return allFontStyles;\n } catch (e) {\n return [];\n }\n },\n\t getSSRHeadHTML: typeof getSSRHeadHTML === \"function\" ? getSSRHeadHTML : undefined,\n\t gsspRes,\n isrCacheKey,\n isrRevalidateSeconds,\n isrSet,\n i18n: {\n locale: locale,\n locales: i18nConfig ? i18nConfig.locales : undefined,\n defaultLocale: currentDefaultLocale,\n domainLocales: domainLocales,\n },\n pageProps,\n params,\n renderDocumentToString(element) {\n return renderToStringAsync(element);\n },\n renderIsrPassToStringAsync,\n renderToReadableStream(element) {\n return renderToReadableStream(element);\n },\n resetSSRHead: typeof resetSSRHead === \"function\" ? resetSSRHead : undefined,\n\t routePattern,\n routeUrl,\n safeJsonStringify,\n });\n } catch (e) {\n console.error(\"[vinext] SSR error:\", e);\n _reportRequestError(\n e instanceof Error ? e : new Error(String(e)),\n { path: url, method: request.method, headers: Object.fromEntries(request.headers.entries()) },\n { routerKind: \"Pages Router\", routePath: route.pattern, routeType: \"render\" },\n ).catch(() => { /* ignore reporting errors */ });\n return new Response(\"Internal Server Error\", { status: 500 });\n }\n });\n}\n\nexport async function handleApiRoute(request, url) {\n const match = matchRoute(url, apiRoutes);\n return __handlePagesApiRoute({\n match,\n request,\n url,\n reportRequestError(error, routePattern) {\n console.error(\"[vinext] API error:\", error);\n void _reportRequestError(\n error,\n { path: url, method: request.method, headers: Object.fromEntries(request.headers.entries()) },\n { routerKind: \"Pages Router\", routePath: routePattern, routeType: \"route\" },\n );\n },\n });\n}\n\n${middlewareExportCode}\n`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"pages-server-entry.js","names":[],"sources":["../../src/entries/pages-server-entry.ts"],"sourcesContent":["/**\n * Pages Router server entry generator.\n *\n * Generates the virtual SSR server entry module (`virtual:vinext-server-entry`).\n * This is the entry point for `vite build --ssr`. It handles SSR, API routes,\n * middleware, ISR, and i18n for the Pages Router.\n *\n * Extracted from index.ts.\n */\nimport { resolveEntryPath } from \"./runtime-entry-module.js\";\nimport { pagesRouter, apiRouter, type Route } from \"../routing/pages-router.js\";\nimport { createValidFileMatcher } from \"../routing/file-matcher.js\";\nimport { type ResolvedNextConfig } from \"../config/next-config.js\";\nimport { isProxyFile } from \"../server/middleware.js\";\nimport {\n generateSafeRegExpCode,\n generateMiddlewareMatcherCode,\n generateNormalizePathCode,\n generateRouteMatchNormalizationCode,\n} from \"../server/middleware-codegen.js\";\nimport { findFileWithExts } from \"./pages-entry-helpers.js\";\n\nconst _requestContextShimPath = resolveEntryPath(\"../shims/request-context.js\", import.meta.url);\nconst _routeTriePath = resolveEntryPath(\"../routing/route-trie.js\", import.meta.url);\nconst _pagesI18nPath = resolveEntryPath(\"../server/pages-i18n.js\", import.meta.url);\nconst _pagesPageResponsePath = resolveEntryPath(\n \"../server/pages-page-response.js\",\n import.meta.url,\n);\nconst _pagesPageDataPath = resolveEntryPath(\"../server/pages-page-data.js\", import.meta.url);\nconst _pagesNodeCompatPath = resolveEntryPath(\"../server/pages-node-compat.js\", import.meta.url);\nconst _pagesApiRoutePath = resolveEntryPath(\"../server/pages-api-route.js\", import.meta.url);\nconst _isrCachePath = resolveEntryPath(\"../server/isr-cache.js\", import.meta.url);\n\n/**\n * Generate the virtual SSR server entry module.\n * This is the entry point for `vite build --ssr`.\n */\nexport async function generateServerEntry(\n pagesDir: string,\n nextConfig: ResolvedNextConfig,\n fileMatcher: ReturnType<typeof createValidFileMatcher>,\n middlewarePath: string | null,\n instrumentationPath: string | null,\n): Promise<string> {\n const pageRoutes = await pagesRouter(pagesDir, nextConfig?.pageExtensions, fileMatcher);\n const apiRoutes = await apiRouter(pagesDir, nextConfig?.pageExtensions, fileMatcher);\n\n // Generate import statements using absolute paths since virtual\n // modules don't have a real file location for relative resolution.\n const pageImports = pageRoutes.map((r: Route, i: number) => {\n const absPath = r.filePath.replace(/\\\\/g, \"/\");\n return `import * as page_${i} from ${JSON.stringify(absPath)};`;\n });\n\n const apiImports = apiRoutes.map((r: Route, i: number) => {\n const absPath = r.filePath.replace(/\\\\/g, \"/\");\n return `import * as api_${i} from ${JSON.stringify(absPath)};`;\n });\n\n // Build the route table — include filePath for SSR manifest lookup\n const pageRouteEntries = pageRoutes.map((r: Route, i: number) => {\n const absPath = r.filePath.replace(/\\\\/g, \"/\");\n return ` { pattern: ${JSON.stringify(r.pattern)}, patternParts: ${JSON.stringify(r.patternParts)}, isDynamic: ${r.isDynamic}, params: ${JSON.stringify(r.params)}, module: page_${i}, filePath: ${JSON.stringify(absPath)} }`;\n });\n\n const apiRouteEntries = apiRoutes.map(\n (r: Route, i: number) =>\n ` { pattern: ${JSON.stringify(r.pattern)}, patternParts: ${JSON.stringify(r.patternParts)}, isDynamic: ${r.isDynamic}, params: ${JSON.stringify(r.params)}, module: api_${i} }`,\n );\n\n // Check for _app and _document\n const appFilePath = findFileWithExts(pagesDir, \"_app\", fileMatcher);\n const docFilePath = findFileWithExts(pagesDir, \"_document\", fileMatcher);\n const appImportCode =\n appFilePath !== null\n ? `import { default as AppComponent } from ${JSON.stringify(appFilePath.replace(/\\\\/g, \"/\"))};`\n : `const AppComponent = null;`;\n\n const docImportCode =\n docFilePath !== null\n ? `import { default as DocumentComponent } from ${JSON.stringify(docFilePath.replace(/\\\\/g, \"/\"))};`\n : `const DocumentComponent = null;`;\n\n // Serialize i18n config for embedding in the server entry\n const i18nConfigJson = nextConfig?.i18n\n ? JSON.stringify({\n locales: nextConfig.i18n.locales,\n defaultLocale: nextConfig.i18n.defaultLocale,\n localeDetection: nextConfig.i18n.localeDetection,\n domains: nextConfig.i18n.domains,\n })\n : \"null\";\n\n // Embed the resolved build ID at build time\n const buildIdJson = JSON.stringify(nextConfig?.buildId ?? null);\n\n // Serialize the full resolved config for the production server.\n // This embeds redirects, rewrites, headers, basePath, trailingSlash\n // so prod-server.ts can apply them without loading next.config.js at runtime.\n const vinextConfigJson = JSON.stringify({\n basePath: nextConfig?.basePath ?? \"\",\n trailingSlash: nextConfig?.trailingSlash ?? false,\n redirects: nextConfig?.redirects ?? [],\n rewrites: nextConfig?.rewrites ?? { beforeFiles: [], afterFiles: [], fallback: [] },\n headers: nextConfig?.headers ?? [],\n i18n: nextConfig?.i18n ?? null,\n images: {\n deviceSizes: nextConfig?.images?.deviceSizes,\n imageSizes: nextConfig?.images?.imageSizes,\n dangerouslyAllowSVG: nextConfig?.images?.dangerouslyAllowSVG,\n contentDispositionType: nextConfig?.images?.contentDispositionType,\n contentSecurityPolicy: nextConfig?.images?.contentSecurityPolicy,\n },\n });\n\n // Generate instrumentation code if instrumentation.ts exists.\n // For production (Cloudflare Workers), instrumentation.ts is bundled into the\n // Worker and register() is called as a top-level await at module evaluation time —\n // before any request is handled. This mirrors App Router behavior (generateRscEntry)\n // and matches Next.js semantics: register() runs once on startup in the process\n // that handles requests.\n //\n // The onRequestError handler is stored on globalThis so it is visible across\n // all code within the Worker (same global scope).\n const instrumentationImportCode = instrumentationPath\n ? `import * as _instrumentation from ${JSON.stringify(instrumentationPath.replace(/\\\\/g, \"/\"))};`\n : \"\";\n\n const instrumentationInitCode = instrumentationPath\n ? `// Run instrumentation register() once at module evaluation time — before any\n// requests are handled. Matches Next.js semantics: register() is called once\n// on startup in the process that handles requests.\nif (typeof _instrumentation.register === \"function\") {\n await _instrumentation.register();\n}\n// Store the onRequestError handler on globalThis so it is visible to all\n// code within the Worker (same global scope).\nif (typeof _instrumentation.onRequestError === \"function\") {\n globalThis.__VINEXT_onRequestErrorHandler__ = _instrumentation.onRequestError;\n}`\n : \"\";\n\n // Generate middleware code if middleware.ts exists\n const middlewareImportCode = middlewarePath\n ? `import * as middlewareModule from ${JSON.stringify(middlewarePath.replace(/\\\\/g, \"/\"))};\nimport { NextRequest, NextFetchEvent } from \"next/server\";`\n : \"\";\n\n // The matcher config is read from the middleware module at import time.\n // We inline the matching + execution logic so the prod server can call it.\n const middlewareExportCode = middlewarePath\n ? `\n// --- Middleware support (generated from middleware-codegen.ts) ---\n${generateNormalizePathCode(\"es5\")}\n${generateRouteMatchNormalizationCode(\"es5\")}\n${generateSafeRegExpCode(\"es5\")}\n${generateMiddlewareMatcherCode(\"es5\")}\n\nexport async function runMiddleware(request, ctx) {\n if (ctx) return _runWithExecutionContext(ctx, () => _runMiddleware(request));\n return _runMiddleware(request);\n}\n\nasync function _runMiddleware(request) {\n var isProxy = ${middlewarePath ? JSON.stringify(isProxyFile(middlewarePath)) : \"false\"};\n var middlewareFn = isProxy\n ? (middlewareModule.proxy ?? middlewareModule.default)\n : (middlewareModule.middleware ?? middlewareModule.default);\n if (typeof middlewareFn !== \"function\") {\n var fileType = isProxy ? \"Proxy\" : \"Middleware\";\n var expectedExport = isProxy ? \"proxy\" : \"middleware\";\n throw new Error(\"The \" + fileType + \" file must export a function named \\`\" + expectedExport + \"\\` or a \\`default\\` function.\");\n }\n\n var config = middlewareModule.config;\n var matcher = config && config.matcher;\n var url = new URL(request.url);\n\n // Normalize pathname before matching to prevent path-confusion bypasses\n // (percent-encoding like /%61dmin, double slashes like /dashboard//settings).\n var decodedPathname;\n try { decodedPathname = __normalizePathnameForRouteMatchStrict(url.pathname); } catch (e) {\n return { continue: false, response: new Response(\"Bad Request\", { status: 400 }) };\n }\n var normalizedPathname = __normalizePath(decodedPathname);\n\n if (!matchesMiddleware(normalizedPathname, matcher, request, i18nConfig)) return { continue: true };\n\n // Construct a new Request with the decoded + normalized pathname so middleware\n // always sees the same canonical path that the router uses.\n var mwRequest = request;\n if (normalizedPathname !== url.pathname) {\n var mwUrl = new URL(url);\n mwUrl.pathname = normalizedPathname;\n mwRequest = new Request(mwUrl, request);\n }\n var __mwNextConfig = (vinextConfig.basePath || i18nConfig) ? { basePath: vinextConfig.basePath, i18n: i18nConfig || undefined } : undefined;\n var nextRequest = mwRequest instanceof NextRequest ? mwRequest : new NextRequest(mwRequest, __mwNextConfig ? { nextConfig: __mwNextConfig } : undefined);\n var fetchEvent = new NextFetchEvent({ page: normalizedPathname });\n var response;\n try { response = await middlewareFn(nextRequest, fetchEvent); }\n catch (e) {\n console.error(\"[vinext] Middleware error:\", e);\n var _mwCtxErr = _getRequestExecutionContext();\n if (_mwCtxErr && typeof _mwCtxErr.waitUntil === \"function\") { _mwCtxErr.waitUntil(fetchEvent.drainWaitUntil()); } else { fetchEvent.drainWaitUntil(); }\n return { continue: false, response: new Response(\"Internal Server Error\", { status: 500 }) };\n }\n var _mwCtx = _getRequestExecutionContext();\n if (_mwCtx && typeof _mwCtx.waitUntil === \"function\") { _mwCtx.waitUntil(fetchEvent.drainWaitUntil()); } else { fetchEvent.drainWaitUntil(); }\n\n if (!response) return { continue: true };\n\n if (response.headers.get(\"x-middleware-next\") === \"1\") {\n var rHeaders = new Headers();\n for (var [key, value] of response.headers) {\n // Keep x-middleware-request-* headers so the production server can\n // apply middleware-request header overrides before stripping internals\n // from the final client response.\n if (\n !key.startsWith(\"x-middleware-\") ||\n key === \"x-middleware-override-headers\" ||\n key.startsWith(\"x-middleware-request-\")\n ) rHeaders.append(key, value);\n }\n return { continue: true, responseHeaders: rHeaders };\n }\n\n if (response.status >= 300 && response.status < 400) {\n var location = response.headers.get(\"Location\") || response.headers.get(\"location\");\n if (location) {\n var rdHeaders = new Headers();\n for (var [rk, rv] of response.headers) {\n if (!rk.startsWith(\"x-middleware-\") && rk.toLowerCase() !== \"location\") rdHeaders.append(rk, rv);\n }\n return { continue: false, redirectUrl: location, redirectStatus: response.status, responseHeaders: rdHeaders };\n }\n }\n\n var rewriteUrl = response.headers.get(\"x-middleware-rewrite\");\n if (rewriteUrl) {\n var rwHeaders = new Headers();\n for (var [k, v] of response.headers) {\n if (!k.startsWith(\"x-middleware-\") || k === \"x-middleware-override-headers\" || k.startsWith(\"x-middleware-request-\")) rwHeaders.append(k, v);\n }\n var rewritePath;\n try { var parsed = new URL(rewriteUrl, request.url); rewritePath = parsed.pathname + parsed.search; }\n catch { rewritePath = rewriteUrl; }\n return { continue: true, rewriteUrl: rewritePath, rewriteStatus: response.status !== 200 ? response.status : undefined, responseHeaders: rwHeaders };\n }\n\n return { continue: false, response: response };\n}\n`\n : `\nexport async function runMiddleware() { return { continue: true }; }\n`;\n\n // The server entry is a self-contained module that uses Web-standard APIs\n // (Request/Response, renderToReadableStream) so it runs on Cloudflare Workers.\n return `\nimport React from \"react\";\nimport { renderToReadableStream } from \"react-dom/server.edge\";\nimport { resetSSRHead, getSSRHeadHTML } from \"next/head\";\nimport { flushPreloads } from \"next/dynamic\";\nimport { setSSRContext, wrapWithRouterContext } from \"next/router\";\nimport { _runWithCacheState } from \"next/cache\";\nimport { runWithPrivateCache } from \"vinext/cache-runtime\";\nimport { ensureFetchPatch, runWithFetchCache } from \"vinext/fetch-cache\";\nimport { runWithRequestContext as _runWithUnifiedCtx, createRequestContext as _createUnifiedCtx } from \"vinext/unified-request-context\";\nimport \"vinext/router-state\";\nimport { runWithServerInsertedHTMLState } from \"vinext/navigation-state\";\nimport { runWithHeadState } from \"vinext/head-state\";\nimport \"vinext/i18n-state\";\nimport { setI18nContext } from \"vinext/i18n-context\";\nimport { safeJsonStringify } from \"vinext/html\";\nimport { getSSRFontLinks as _getSSRFontLinks, getSSRFontStyles as _getSSRFontStylesGoogle, getSSRFontPreloads as _getSSRFontPreloadsGoogle } from \"next/font/google\";\nimport { getSSRFontStyles as _getSSRFontStylesLocal, getSSRFontPreloads as _getSSRFontPreloadsLocal } from \"next/font/local\";\nimport { sanitizeDestination as sanitizeDestinationLocal } from ${JSON.stringify(resolveEntryPath(\"../config/config-matchers.js\", import.meta.url))};\nimport { runWithExecutionContext as _runWithExecutionContext, getRequestExecutionContext as _getRequestExecutionContext } from ${JSON.stringify(_requestContextShimPath)};\nimport { buildRouteTrie as _buildRouteTrie, trieMatch as _trieMatch } from ${JSON.stringify(_routeTriePath)};\nimport { reportRequestError as _reportRequestError } from \"vinext/instrumentation\";\nimport { resolvePagesI18nRequest } from ${JSON.stringify(_pagesI18nPath)};\nimport { createPagesReqRes as __createPagesReqRes } from ${JSON.stringify(_pagesNodeCompatPath)};\nimport { handlePagesApiRoute as __handlePagesApiRoute } from ${JSON.stringify(_pagesApiRoutePath)};\nimport {\n isrGet as __sharedIsrGet,\n isrSet as __sharedIsrSet,\n isrCacheKey as __sharedIsrCacheKey,\n triggerBackgroundRegeneration as __sharedTriggerBackgroundRegeneration,\n} from ${JSON.stringify(_isrCachePath)};\nimport { resolvePagesPageData as __resolvePagesPageData } from ${JSON.stringify(_pagesPageDataPath)};\nimport { renderPagesPageResponse as __renderPagesPageResponse } from ${JSON.stringify(_pagesPageResponsePath)};\n${instrumentationImportCode}\n${middlewareImportCode}\n\n${instrumentationInitCode}\n\n// i18n config (embedded at build time)\nconst i18nConfig = ${i18nConfigJson};\n\n// Build ID (embedded at build time)\nconst buildId = ${buildIdJson};\n\n// Full resolved config for production server (embedded at build time)\nexport const vinextConfig = ${vinextConfigJson};\n\nfunction isrGet(key) {\n return __sharedIsrGet(key);\n}\nfunction isrSet(key, data, revalidateSeconds, tags) {\n return __sharedIsrSet(key, data, revalidateSeconds, tags);\n}\nfunction triggerBackgroundRegeneration(key, renderFn) {\n return __sharedTriggerBackgroundRegeneration(key, renderFn);\n}\nfunction isrCacheKey(router, pathname) {\n return __sharedIsrCacheKey(router, pathname, buildId || undefined);\n}\n\nasync function renderToStringAsync(element) {\n const stream = await renderToReadableStream(element);\n await stream.allReady;\n return new Response(stream).text();\n}\n\nasync function renderIsrPassToStringAsync(element) {\n // The cache-fill render is a second render pass for the same request.\n // Reset render-scoped state so it cannot leak from the streamed response\n // render or affect async work that is still draining from that stream.\n // Keep request identity state (pathname/query/locale/executionContext)\n // intact: this second pass still belongs to the same request.\n return await runWithServerInsertedHTMLState(() =>\n runWithHeadState(() =>\n _runWithCacheState(() =>\n runWithPrivateCache(() => runWithFetchCache(async () => renderToStringAsync(element))),\n ),\n ),\n );\n}\n\n${pageImports.join(\"\\n\")}\n${apiImports.join(\"\\n\")}\n\n${appImportCode}\n${docImportCode}\n\nexport const pageRoutes = [\n${pageRouteEntries.join(\",\\n\")}\n];\nconst _pageRouteTrie = _buildRouteTrie(pageRoutes);\n\nconst apiRoutes = [\n${apiRouteEntries.join(\",\\n\")}\n];\nconst _apiRouteTrie = _buildRouteTrie(apiRoutes);\n\nfunction matchRoute(url, routes) {\n const pathname = url.split(\"?\")[0];\n let normalizedUrl = pathname === \"/\" ? \"/\" : pathname.replace(/\\\\/$/, \"\");\n // NOTE: Do NOT decodeURIComponent here. The pathname is already decoded at\n // the entry point. Decoding again would create a double-decode vector.\n const urlParts = normalizedUrl.split(\"/\").filter(Boolean);\n const trie = routes === pageRoutes ? _pageRouteTrie : _apiRouteTrie;\n return _trieMatch(trie, urlParts);\n}\n\nfunction parseQuery(url) {\n const qs = url.split(\"?\")[1];\n if (!qs) return {};\n const p = new URLSearchParams(qs);\n const q = {};\n for (const [k, v] of p) {\n if (k in q) {\n q[k] = Array.isArray(q[k]) ? q[k].concat(v) : [q[k], v];\n } else {\n q[k] = v;\n }\n }\n return q;\n}\n\nfunction patternToNextFormat(pattern) {\n return pattern\n .replace(/:([\\\\w]+)\\\\*/g, \"[[...$1]]\")\n .replace(/:([\\\\w]+)\\\\+/g, \"[...$1]\")\n .replace(/:([\\\\w]+)/g, \"[$1]\");\n}\n\nfunction collectAssetTags(manifest, moduleIds) {\n // Fall back to embedded manifest (set by vinext:cloudflare-build for Workers)\n const m = (manifest && Object.keys(manifest).length > 0)\n ? manifest\n : (typeof globalThis !== \"undefined\" && globalThis.__VINEXT_SSR_MANIFEST__) || null;\n const tags = [];\n const seen = new Set();\n\n // Load the set of lazy chunk filenames (only reachable via dynamic imports).\n // These should NOT get <link rel=\"modulepreload\"> or <script type=\"module\">\n // tags — they are fetched on demand when the dynamic import() executes (e.g.\n // chunks behind React.lazy() or next/dynamic boundaries).\n var lazyChunks = (typeof globalThis !== \"undefined\" && globalThis.__VINEXT_LAZY_CHUNKS__) || null;\n var lazySet = lazyChunks && lazyChunks.length > 0 ? new Set(lazyChunks) : null;\n\n // Inject the client entry script if embedded by vinext:cloudflare-build\n if (typeof globalThis !== \"undefined\" && globalThis.__VINEXT_CLIENT_ENTRY__) {\n const entry = globalThis.__VINEXT_CLIENT_ENTRY__;\n seen.add(entry);\n tags.push('<link rel=\"modulepreload\" href=\"/' + entry + '\" />');\n tags.push('<script type=\"module\" src=\"/' + entry + '\" crossorigin></script>');\n }\n if (m) {\n // Always inject shared chunks (framework, vinext runtime, entry) and\n // page-specific chunks. The manifest maps module file paths to their\n // associated JS/CSS assets.\n //\n // For page-specific injection, the module IDs may be absolute paths\n // while the manifest uses relative paths. Try both the original ID\n // and a suffix match to find the correct manifest entry.\n var allFiles = [];\n\n if (moduleIds && moduleIds.length > 0) {\n // Collect assets for the requested page modules\n for (var mi = 0; mi < moduleIds.length; mi++) {\n var id = moduleIds[mi];\n var files = m[id];\n if (!files) {\n // Absolute path didn't match — try matching by suffix.\n // Manifest keys are relative (e.g. \"pages/about.tsx\") while\n // moduleIds may be absolute (e.g. \"/home/.../pages/about.tsx\").\n for (var mk in m) {\n if (id.endsWith(\"/\" + mk) || id === mk) {\n files = m[mk];\n break;\n }\n }\n }\n if (files) {\n for (var fi = 0; fi < files.length; fi++) allFiles.push(files[fi]);\n }\n }\n\n // Also inject shared chunks that every page needs: framework,\n // vinext runtime, and the entry bootstrap. These are identified\n // by scanning all manifest values for chunk filenames containing\n // known prefixes.\n for (var key in m) {\n var vals = m[key];\n if (!vals) continue;\n for (var vi = 0; vi < vals.length; vi++) {\n var file = vals[vi];\n var basename = file.split(\"/\").pop() || \"\";\n if (\n basename.startsWith(\"framework-\") ||\n basename.startsWith(\"vinext-\") ||\n basename.includes(\"vinext-client-entry\") ||\n basename.includes(\"vinext-app-browser-entry\")\n ) {\n allFiles.push(file);\n }\n }\n }\n } else {\n // No specific modules — include all assets from manifest\n for (var akey in m) {\n var avals = m[akey];\n if (avals) {\n for (var ai = 0; ai < avals.length; ai++) allFiles.push(avals[ai]);\n }\n }\n }\n\n for (var ti = 0; ti < allFiles.length; ti++) {\n var tf = allFiles[ti];\n // Normalize: Vite's SSR manifest values include a leading '/'\n // (from base path), but we prepend '/' ourselves when building\n // href/src attributes. Strip any existing leading slash to avoid\n // producing protocol-relative URLs like \"//assets/chunk.js\".\n // This also ensures consistent keys for the seen-set dedup and\n // lazySet.has() checks (which use values without leading slash).\n if (tf.charAt(0) === '/') tf = tf.slice(1);\n if (seen.has(tf)) continue;\n seen.add(tf);\n if (tf.endsWith(\".css\")) {\n tags.push('<link rel=\"stylesheet\" href=\"/' + tf + '\" />');\n } else if (tf.endsWith(\".js\")) {\n // Skip lazy chunks — they are behind dynamic import() boundaries\n // (React.lazy, next/dynamic) and should only be fetched on demand.\n if (lazySet && lazySet.has(tf)) continue;\n tags.push('<link rel=\"modulepreload\" href=\"/' + tf + '\" />');\n tags.push('<script type=\"module\" src=\"/' + tf + '\" crossorigin></script>');\n }\n }\n }\n return tags.join(\"\\\\n \");\n}\n\n// i18n helpers\nfunction extractLocale(url) {\n if (!i18nConfig) return { locale: undefined, url, hadPrefix: false };\n const pathname = url.split(\"?\")[0];\n const parts = pathname.split(\"/\").filter(Boolean);\n const query = url.includes(\"?\") ? url.slice(url.indexOf(\"?\")) : \"\";\n if (parts.length > 0 && i18nConfig.locales.includes(parts[0])) {\n const locale = parts[0];\n const rest = \"/\" + parts.slice(1).join(\"/\");\n return { locale, url: (rest || \"/\") + query, hadPrefix: true };\n }\n return { locale: i18nConfig.defaultLocale, url, hadPrefix: false };\n}\n\nfunction detectLocaleFromHeaders(headers) {\n if (!i18nConfig) return null;\n const acceptLang = headers.get(\"accept-language\");\n if (!acceptLang) return null;\n const langs = acceptLang.split(\",\").map(function(part) {\n const pieces = part.trim().split(\";\");\n const q = pieces[1] ? parseFloat(pieces[1].replace(\"q=\", \"\")) : 1;\n return { lang: pieces[0].trim().toLowerCase(), q: q };\n }).sort(function(a, b) { return b.q - a.q; });\n for (let k = 0; k < langs.length; k++) {\n const lang = langs[k].lang;\n for (let j = 0; j < i18nConfig.locales.length; j++) {\n if (i18nConfig.locales[j].toLowerCase() === lang) return i18nConfig.locales[j];\n }\n const prefix = lang.split(\"-\")[0];\n for (let j = 0; j < i18nConfig.locales.length; j++) {\n const loc = i18nConfig.locales[j].toLowerCase();\n if (loc === prefix || loc.startsWith(prefix + \"-\")) return i18nConfig.locales[j];\n }\n }\n return null;\n}\n\nfunction parseCookieLocaleFromHeader(cookieHeader) {\n if (!i18nConfig || !cookieHeader) return null;\n const match = cookieHeader.match(/(?:^|;\\\\s*)NEXT_LOCALE=([^;]*)/);\n if (!match) return null;\n var value;\n try { value = decodeURIComponent(match[1].trim()); } catch (e) { return null; }\n if (i18nConfig.locales.indexOf(value) !== -1) return value;\n return null;\n}\n\nexport async function renderPage(request, url, manifest, ctx) {\n if (ctx) return _runWithExecutionContext(ctx, () => _renderPage(request, url, manifest));\n return _renderPage(request, url, manifest);\n}\n\nasync function _renderPage(request, url, manifest) {\n const localeInfo = i18nConfig\n ? resolvePagesI18nRequest(\n url,\n i18nConfig,\n request.headers,\n new URL(request.url).hostname,\n vinextConfig.basePath,\n vinextConfig.trailingSlash,\n )\n : { locale: undefined, url, hadPrefix: false, domainLocale: undefined, redirectUrl: undefined };\n const locale = localeInfo.locale;\n const routeUrl = localeInfo.url;\n const currentDefaultLocale = i18nConfig\n ? (localeInfo.domainLocale ? localeInfo.domainLocale.defaultLocale : i18nConfig.defaultLocale)\n : undefined;\n const domainLocales = i18nConfig ? i18nConfig.domains : undefined;\n\n if (localeInfo.redirectUrl) {\n return new Response(null, { status: 307, headers: { Location: localeInfo.redirectUrl } });\n }\n\n const match = matchRoute(routeUrl, pageRoutes);\n if (!match) {\n return new Response(\"<!DOCTYPE html><html><body><h1>404 - Page not found</h1></body></html>\",\n { status: 404, headers: { \"Content-Type\": \"text/html\" } });\n }\n\n\t const { route, params } = match;\n\t const __uCtx = _createUnifiedCtx({\n\t executionContext: _getRequestExecutionContext(),\n\t });\n\t return _runWithUnifiedCtx(__uCtx, async () => {\n\t ensureFetchPatch();\n\t try {\n\t const routePattern = patternToNextFormat(route.pattern);\n\t if (typeof setSSRContext === \"function\") {\n\t setSSRContext({\n\t pathname: routePattern,\n\t query: { ...params, ...parseQuery(routeUrl) },\n\t asPath: routeUrl,\n\t locale: locale,\n locales: i18nConfig ? i18nConfig.locales : undefined,\n defaultLocale: currentDefaultLocale,\n domainLocales: domainLocales,\n });\n }\n\n if (i18nConfig) {\n setI18nContext({\n locale: locale,\n locales: i18nConfig.locales,\n defaultLocale: currentDefaultLocale,\n domainLocales: domainLocales,\n hostname: new URL(request.url).hostname,\n });\n }\n\n const pageModule = route.module;\n const PageComponent = pageModule.default;\n\t if (!PageComponent) {\n\t return new Response(\"Page has no default export\", { status: 500 });\n\t }\n\t // Build font Link header early so it's available for ISR cached responses too.\n\t // Font preloads are module-level state populated at import time and persist across requests.\n\t var _fontLinkHeader = \"\";\n\t var _allFp = [];\n try {\n var _fpGoogle = typeof _getSSRFontPreloadsGoogle === \"function\" ? _getSSRFontPreloadsGoogle() : [];\n var _fpLocal = typeof _getSSRFontPreloadsLocal === \"function\" ? _getSSRFontPreloadsLocal() : [];\n _allFp = _fpGoogle.concat(_fpLocal);\n\t if (_allFp.length > 0) {\n\t _fontLinkHeader = _allFp.map(function(p) { return \"<\" + p.href + \">; rel=preload; as=font; type=\" + p.type + \"; crossorigin\"; }).join(\", \");\n\t }\n\t } catch (e) { /* font preloads not available */ }\n\t const query = parseQuery(routeUrl);\n\t const pageDataResult = await __resolvePagesPageData({\n\t applyRequestContexts() {\n\t if (typeof setSSRContext === \"function\") {\n\t setSSRContext({\n\t pathname: routePattern,\n\t query: { ...params, ...query },\n\t asPath: routeUrl,\n\t locale: locale,\n\t locales: i18nConfig ? i18nConfig.locales : undefined,\n\t defaultLocale: currentDefaultLocale,\n\t domainLocales: domainLocales,\n\t });\n\t }\n\t if (i18nConfig) {\n\t setI18nContext({\n\t locale: locale,\n\t locales: i18nConfig.locales,\n\t defaultLocale: currentDefaultLocale,\n\t domainLocales: domainLocales,\n\t hostname: new URL(request.url).hostname,\n\t });\n\t }\n\t },\n\t buildId,\n\t createGsspReqRes() {\n\t return __createPagesReqRes({ body: undefined, query, request, url: routeUrl });\n\t },\n\t createPageElement(currentPageProps) {\n\t var currentElement = AppComponent\n\t ? React.createElement(AppComponent, { Component: PageComponent, pageProps: currentPageProps })\n\t : React.createElement(PageComponent, currentPageProps);\n\t return wrapWithRouterContext(currentElement);\n\t },\n\t fontLinkHeader: _fontLinkHeader,\n\t i18n: {\n\t locale: locale,\n\t locales: i18nConfig ? i18nConfig.locales : undefined,\n\t defaultLocale: currentDefaultLocale,\n\t domainLocales: domainLocales,\n\t },\n\t isrCacheKey,\n\t isrGet,\n\t isrSet,\n\t pageModule,\n\t params,\n\t query,\n\t renderIsrPassToStringAsync,\n\t route: {\n\t isDynamic: route.isDynamic,\n\t },\n\t routePattern,\n\t routeUrl,\n\t runInFreshUnifiedContext(callback) {\n\t var revalCtx = _createUnifiedCtx({\n\t executionContext: _getRequestExecutionContext(),\n\t });\n\t return _runWithUnifiedCtx(revalCtx, async () => {\n\t ensureFetchPatch();\n\t return callback();\n\t });\n\t },\n\t safeJsonStringify,\n\t sanitizeDestination: sanitizeDestinationLocal,\n\t triggerBackgroundRegeneration,\n\t });\n\t if (pageDataResult.kind === \"response\") {\n\t return pageDataResult.response;\n\t }\n\t let pageProps = pageDataResult.pageProps;\n\t var gsspRes = pageDataResult.gsspRes;\n\t let isrRevalidateSeconds = pageDataResult.isrRevalidateSeconds;\n\n\t const pageModuleIds = route.filePath ? [route.filePath] : [];\n\t const assetTags = collectAssetTags(manifest, pageModuleIds);\n\n return __renderPagesPageResponse({\n assetTags,\n buildId,\n clearSsrContext() {\n if (typeof setSSRContext === \"function\") setSSRContext(null);\n },\n createPageElement(currentPageProps) {\n var currentElement;\n if (AppComponent) {\n currentElement = React.createElement(AppComponent, { Component: PageComponent, pageProps: currentPageProps });\n } else {\n currentElement = React.createElement(PageComponent, currentPageProps);\n }\n return wrapWithRouterContext(currentElement);\n },\n DocumentComponent,\n flushPreloads: typeof flushPreloads === \"function\" ? flushPreloads : undefined,\n fontLinkHeader: _fontLinkHeader,\n fontPreloads: _allFp,\n getFontLinks() {\n try {\n return typeof _getSSRFontLinks === \"function\" ? _getSSRFontLinks() : [];\n } catch (e) {\n return [];\n }\n },\n getFontStyles() {\n try {\n var allFontStyles = [];\n if (typeof _getSSRFontStylesGoogle === \"function\") allFontStyles.push(..._getSSRFontStylesGoogle());\n if (typeof _getSSRFontStylesLocal === \"function\") allFontStyles.push(..._getSSRFontStylesLocal());\n return allFontStyles;\n } catch (e) {\n return [];\n }\n },\n\t getSSRHeadHTML: typeof getSSRHeadHTML === \"function\" ? getSSRHeadHTML : undefined,\n\t gsspRes,\n isrCacheKey,\n isrRevalidateSeconds,\n isrSet,\n i18n: {\n locale: locale,\n locales: i18nConfig ? i18nConfig.locales : undefined,\n defaultLocale: currentDefaultLocale,\n domainLocales: domainLocales,\n },\n pageProps,\n params,\n renderDocumentToString(element) {\n return renderToStringAsync(element);\n },\n renderIsrPassToStringAsync,\n renderToReadableStream(element) {\n return renderToReadableStream(element);\n },\n resetSSRHead: typeof resetSSRHead === \"function\" ? resetSSRHead : undefined,\n\t routePattern,\n routeUrl,\n safeJsonStringify,\n });\n } catch (e) {\n console.error(\"[vinext] SSR error:\", e);\n _reportRequestError(\n e instanceof Error ? e : new Error(String(e)),\n { path: url, method: request.method, headers: Object.fromEntries(request.headers.entries()) },\n { routerKind: \"Pages Router\", routePath: route.pattern, routeType: \"render\" },\n ).catch(() => { /* ignore reporting errors */ });\n return new Response(\"Internal Server Error\", { status: 500 });\n }\n });\n}\n\nexport async function handleApiRoute(request, url) {\n const match = matchRoute(url, apiRoutes);\n return __handlePagesApiRoute({\n match,\n request,\n url,\n reportRequestError(error, routePattern) {\n console.error(\"[vinext] API error:\", error);\n void _reportRequestError(\n error,\n { path: url, method: request.method, headers: Object.fromEntries(request.headers.entries()) },\n { routerKind: \"Pages Router\", routePath: routePattern, routeType: \"route\" },\n );\n },\n });\n}\n\n${middlewareExportCode}\n`;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAsBA,MAAM,0BAA0B,iBAAiB,+BAA+B,OAAO,KAAK,IAAI;AAChG,MAAM,iBAAiB,iBAAiB,4BAA4B,OAAO,KAAK,IAAI;AACpF,MAAM,iBAAiB,iBAAiB,2BAA2B,OAAO,KAAK,IAAI;AACnF,MAAM,yBAAyB,iBAC7B,oCACA,OAAO,KAAK,IACb;AACD,MAAM,qBAAqB,iBAAiB,gCAAgC,OAAO,KAAK,IAAI;AAC5F,MAAM,uBAAuB,iBAAiB,kCAAkC,OAAO,KAAK,IAAI;AAChG,MAAM,qBAAqB,iBAAiB,gCAAgC,OAAO,KAAK,IAAI;AAC5F,MAAM,gBAAgB,iBAAiB,0BAA0B,OAAO,KAAK,IAAI;;;;;AAMjF,eAAsB,oBACpB,UACA,YACA,aACA,gBACA,qBACiB;CACjB,MAAM,aAAa,MAAM,YAAY,UAAU,YAAY,gBAAgB,YAAY;CACvF,MAAM,YAAY,MAAM,UAAU,UAAU,YAAY,gBAAgB,YAAY;CAIpF,MAAM,cAAc,WAAW,KAAK,GAAU,MAAc;EAC1D,MAAM,UAAU,EAAE,SAAS,QAAQ,OAAO,IAAI;AAC9C,SAAO,oBAAoB,EAAE,QAAQ,KAAK,UAAU,QAAQ,CAAC;GAC7D;CAEF,MAAM,aAAa,UAAU,KAAK,GAAU,MAAc;EACxD,MAAM,UAAU,EAAE,SAAS,QAAQ,OAAO,IAAI;AAC9C,SAAO,mBAAmB,EAAE,QAAQ,KAAK,UAAU,QAAQ,CAAC;GAC5D;CAGF,MAAM,mBAAmB,WAAW,KAAK,GAAU,MAAc;EAC/D,MAAM,UAAU,EAAE,SAAS,QAAQ,OAAO,IAAI;AAC9C,SAAO,gBAAgB,KAAK,UAAU,EAAE,QAAQ,CAAC,kBAAkB,KAAK,UAAU,EAAE,aAAa,CAAC,eAAe,EAAE,UAAU,YAAY,KAAK,UAAU,EAAE,OAAO,CAAC,iBAAiB,EAAE,cAAc,KAAK,UAAU,QAAQ,CAAC;GAC3N;CAEF,MAAM,kBAAkB,UAAU,KAC/B,GAAU,MACT,gBAAgB,KAAK,UAAU,EAAE,QAAQ,CAAC,kBAAkB,KAAK,UAAU,EAAE,aAAa,CAAC,eAAe,EAAE,UAAU,YAAY,KAAK,UAAU,EAAE,OAAO,CAAC,gBAAgB,EAAE,IAChL;CAGD,MAAM,cAAc,iBAAiB,UAAU,QAAQ,YAAY;CACnE,MAAM,cAAc,iBAAiB,UAAU,aAAa,YAAY;CACxE,MAAM,gBACJ,gBAAgB,OACZ,2CAA2C,KAAK,UAAU,YAAY,QAAQ,OAAO,IAAI,CAAC,CAAC,KAC3F;CAEN,MAAM,gBACJ,gBAAgB,OACZ,gDAAgD,KAAK,UAAU,YAAY,QAAQ,OAAO,IAAI,CAAC,CAAC,KAChG;CAGN,MAAM,iBAAiB,YAAY,OAC/B,KAAK,UAAU;EACb,SAAS,WAAW,KAAK;EACzB,eAAe,WAAW,KAAK;EAC/B,iBAAiB,WAAW,KAAK;EACjC,SAAS,WAAW,KAAK;EAC1B,CAAC,GACF;CAGJ,MAAM,cAAc,KAAK,UAAU,YAAY,WAAW,KAAK;CAK/D,MAAM,mBAAmB,KAAK,UAAU;EACtC,UAAU,YAAY,YAAY;EAClC,eAAe,YAAY,iBAAiB;EAC5C,WAAW,YAAY,aAAa,EAAE;EACtC,UAAU,YAAY,YAAY;GAAE,aAAa,EAAE;GAAE,YAAY,EAAE;GAAE,UAAU,EAAE;GAAE;EACnF,SAAS,YAAY,WAAW,EAAE;EAClC,MAAM,YAAY,QAAQ;EAC1B,QAAQ;GACN,aAAa,YAAY,QAAQ;GACjC,YAAY,YAAY,QAAQ;GAChC,qBAAqB,YAAY,QAAQ;GACzC,wBAAwB,YAAY,QAAQ;GAC5C,uBAAuB,YAAY,QAAQ;GAC5C;EACF,CAAC;CAWF,MAAM,4BAA4B,sBAC9B,qCAAqC,KAAK,UAAU,oBAAoB,QAAQ,OAAO,IAAI,CAAC,CAAC,KAC7F;CAEJ,MAAM,0BAA0B,sBAC5B;;;;;;;;;;KAWA;CAGJ,MAAM,uBAAuB,iBACzB,qCAAqC,KAAK,UAAU,eAAe,QAAQ,OAAO,IAAI,CAAC,CAAC;8DAExF;CAIJ,MAAM,uBAAuB,iBACzB;;EAEJ,0BAA0B,MAAM,CAAC;EACjC,oCAAoC,MAAM,CAAC;EAC3C,uBAAuB,MAAM,CAAC;EAC9B,8BAA8B,MAAM,CAAC;;;;;;;;kBAQrB,iBAAiB,KAAK,UAAU,YAAY,eAAe,CAAC,GAAG,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAyFnF;;;AAMJ,QAAO;;;;;;;;;;;;;;;;;;kEAkByD,KAAK,UAAU,iBAAiB,gCAAgC,OAAO,KAAK,IAAI,CAAC,CAAC;iIACnB,KAAK,UAAU,wBAAwB,CAAC;6EAC5F,KAAK,UAAU,eAAe,CAAC;;0CAElE,KAAK,UAAU,eAAe,CAAC;2DACd,KAAK,UAAU,qBAAqB,CAAC;+DACjC,KAAK,UAAU,mBAAmB,CAAC;;;;;;SAMzF,KAAK,UAAU,cAAc,CAAC;iEAC0B,KAAK,UAAU,mBAAmB,CAAC;uEAC7B,KAAK,UAAU,uBAAuB,CAAC;EAC5G,0BAA0B;EAC1B,qBAAqB;;EAErB,wBAAwB;;;qBAGL,eAAe;;;kBAGlB,YAAY;;;8BAGA,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoC7C,YAAY,KAAK,KAAK,CAAC;EACvB,WAAW,KAAK,KAAK,CAAC;;EAEtB,cAAc;EACd,cAAc;;;EAGd,iBAAiB,KAAK,MAAM,CAAC;;;;;EAK7B,gBAAgB,KAAK,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqb5B,qBAAqB"}
package/dist/index.d.ts CHANGED
@@ -2,7 +2,8 @@ import { NextConfig, NextConfigInput } from "./config/next-config.js";
2
2
  import { AppStaticExportOptions, StaticExportOptions, StaticExportResult, staticExportApp, staticExportPages } from "./build/static-export.js";
3
3
  import { matchConfigPattern } from "./config/config-matchers.js";
4
4
  import { asyncHooksStubPlugin } from "./plugins/async-hooks-stub.js";
5
- import { parseStaticObjectLiteral } from "./plugins/fonts.js";
5
+ import { _findBalancedObject, _findCallEnd, parseStaticObjectLiteral } from "./plugins/fonts.js";
6
+ import { computeLazyChunks } from "./utils/lazy-chunks.js";
6
7
  import { PluginOption } from "vite";
7
8
  import { Options } from "@vitejs/plugin-react";
8
9
 
@@ -13,7 +14,7 @@ import { Options } from "@vitejs/plugin-react";
13
14
  * parallel) all await the same in-flight scan rather than each starting their own.
14
15
  */
15
16
  declare const _postcssCache: Map<string, Promise<{
16
- plugins: any[];
17
+ plugins: unknown[];
17
18
  } | undefined>>;
18
19
  /**
19
20
  * Resolve PostCSS string plugin names in a project's PostCSS config.
@@ -28,7 +29,7 @@ declare const _postcssCache: Map<string, Promise<{
28
29
  * `css.postcss`, or `undefined` if no resolution is needed.
29
30
  */
30
31
  declare function resolvePostcssStringPlugins(projectRoot: string): Promise<{
31
- plugins: any[];
32
+ plugins: unknown[];
32
33
  } | undefined>;
33
34
  /**
34
35
  * manualChunks function for client builds.
@@ -111,33 +112,6 @@ declare function getClientOutputConfigForVite(viteMajorVersion: number): {
111
112
  }[];
112
113
  };
113
114
  };
114
- type BuildManifestChunk = {
115
- file: string;
116
- isEntry?: boolean;
117
- isDynamicEntry?: boolean;
118
- imports?: string[];
119
- dynamicImports?: string[];
120
- css?: string[];
121
- assets?: string[];
122
- };
123
- /**
124
- * Compute the set of chunk filenames that are ONLY reachable through dynamic
125
- * imports (i.e. behind React.lazy(), next/dynamic, or manual import()).
126
- *
127
- * These chunks should NOT be modulepreloaded in the HTML — they will be
128
- * fetched on demand when the dynamic import executes.
129
- *
130
- * Algorithm: Starting from all entry chunks in the build manifest, walk the
131
- * static `imports` tree (breadth-first). Any chunk file NOT reached by this
132
- * walk is only reachable through `dynamicImports` and is therefore "lazy".
133
- *
134
- * @param buildManifest - Vite's build manifest (manifest.json), which is a
135
- * Record<string, ManifestChunk> where each chunk has `file`, `imports`,
136
- * `dynamicImports`, `isEntry`, and `isDynamicEntry` fields.
137
- * @returns Array of chunk filenames (e.g. "assets/mermaid-NOHMQCX5.js") that
138
- * should be excluded from modulepreload hints.
139
- */
140
- declare function computeLazyChunks(buildManifest: Record<string, BuildManifestChunk>): string[];
141
115
  type BundleBackfillChunk = {
142
116
  type: "chunk";
143
117
  fileName: string;
@@ -151,7 +125,7 @@ type BundleBackfillChunk = {
151
125
  declare function augmentSsrManifestFromBundle(ssrManifest: Record<string, string[]>, bundle: Record<string, BundleBackfillChunk | {
152
126
  type: string;
153
127
  }>, root: string, base?: string): Record<string, string[]>;
154
- interface VinextOptions {
128
+ type VinextOptions = {
155
129
  /**
156
130
  * Base directory containing the app/ and pages/ directories.
157
131
  * Can be an absolute path or a path relative to the Vite root.
@@ -209,6 +183,22 @@ interface VinextOptions {
209
183
  * @default true
210
184
  */
211
185
  react?: Options | boolean;
186
+ /**
187
+ * Enable build-time precompression of static assets (.br, .gz, .zst).
188
+ *
189
+ * When enabled, hashed assets in the client build are precompressed at
190
+ * build time so the production server can serve them without on-the-fly
191
+ * compression overhead.
192
+ *
193
+ * Disabled by default. Not useful when deploying to edge platforms
194
+ * (Cloudflare Workers, Nitro) that handle compression at the CDN layer.
195
+ *
196
+ * Can also be enabled via the `--precompress` CLI flag or by setting the
197
+ * `VINEXT_PRECOMPRESS=1` environment variable (useful for CI pipelines
198
+ * that need to enable precompression without modifying vite.config.ts).
199
+ * @default false
200
+ */
201
+ precompress?: boolean;
212
202
  /**
213
203
  * Experimental vinext-only feature flags.
214
204
  */
@@ -221,7 +211,7 @@ interface VinextOptions {
221
211
  */
222
212
  clientReferenceDedup?: boolean;
223
213
  };
224
- }
214
+ };
225
215
  declare function vinext(options?: VinextOptions): PluginOption[];
226
216
  /**
227
217
  * Strip server-only data-fetching exports (getServerSideProps,
@@ -240,5 +230,5 @@ declare const _mdxScanCache: Map<string, boolean>;
240
230
  */
241
231
  declare function hasMdxFiles(root: string, appDir: string | null, pagesDir: string | null): boolean;
242
232
  //#endregion
243
- export { type AppStaticExportOptions, type NextConfig, type StaticExportOptions, type StaticExportResult, VinextOptions, asyncHooksStubPlugin as _asyncHooksStubPlugin, augmentSsrManifestFromBundle as _augmentSsrManifestFromBundle, hasMdxFiles as _hasMdxFiles, _mdxScanCache, parseStaticObjectLiteral as _parseStaticObjectLiteral, _postcssCache, resolvePostcssStringPlugins as _resolvePostcssStringPlugins, stripServerExports as _stripServerExports, clientManualChunks, clientOutputConfig, clientTreeshakeConfig, computeLazyChunks, vinext as default, getClientOutputConfigForVite, matchConfigPattern, staticExportApp, staticExportPages };
233
+ export { type AppStaticExportOptions, type NextConfig, type StaticExportOptions, type StaticExportResult, VinextOptions, asyncHooksStubPlugin as _asyncHooksStubPlugin, augmentSsrManifestFromBundle as _augmentSsrManifestFromBundle, _findBalancedObject, _findCallEnd, hasMdxFiles as _hasMdxFiles, _mdxScanCache, parseStaticObjectLiteral as _parseStaticObjectLiteral, _postcssCache, resolvePostcssStringPlugins as _resolvePostcssStringPlugins, stripServerExports as _stripServerExports, clientManualChunks, clientOutputConfig, clientTreeshakeConfig, computeLazyChunks, vinext as default, getClientOutputConfigForVite, matchConfigPattern, staticExportApp, staticExportPages };
244
234
  //# sourceMappingURL=index.d.ts.map