vinext 0.0.53 → 0.0.55

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 (276) hide show
  1. package/README.md +1 -0
  2. package/dist/build/inline-css.d.ts +7 -0
  3. package/dist/build/inline-css.js +50 -0
  4. package/dist/build/inline-css.js.map +1 -0
  5. package/dist/build/prerender.js +2 -1
  6. package/dist/build/prerender.js.map +1 -1
  7. package/dist/check.js +19 -3
  8. package/dist/check.js.map +1 -1
  9. package/dist/client/navigation-runtime.d.ts +3 -1
  10. package/dist/client/navigation-runtime.js +1 -1
  11. package/dist/client/navigation-runtime.js.map +1 -1
  12. package/dist/client/window-next.d.ts +7 -0
  13. package/dist/client/window-next.js.map +1 -1
  14. package/dist/config/next-config.d.ts +97 -2
  15. package/dist/config/next-config.js +155 -6
  16. package/dist/config/next-config.js.map +1 -1
  17. package/dist/config/tsconfig-paths.d.ts +12 -3
  18. package/dist/config/tsconfig-paths.js +55 -24
  19. package/dist/config/tsconfig-paths.js.map +1 -1
  20. package/dist/deploy.js +13 -0
  21. package/dist/deploy.js.map +1 -1
  22. package/dist/entries/app-browser-entry.d.ts +11 -1
  23. package/dist/entries/app-browser-entry.js +16 -6
  24. package/dist/entries/app-browser-entry.js.map +1 -1
  25. package/dist/entries/app-rsc-entry.d.ts +9 -1
  26. package/dist/entries/app-rsc-entry.js +30 -5
  27. package/dist/entries/app-rsc-entry.js.map +1 -1
  28. package/dist/entries/app-rsc-manifest.d.ts +21 -1
  29. package/dist/entries/app-rsc-manifest.js +28 -9
  30. package/dist/entries/app-rsc-manifest.js.map +1 -1
  31. package/dist/entries/pages-client-entry.d.ts +4 -1
  32. package/dist/entries/pages-client-entry.js +18 -2
  33. package/dist/entries/pages-client-entry.js.map +1 -1
  34. package/dist/entries/pages-server-entry.js +123 -8
  35. package/dist/entries/pages-server-entry.js.map +1 -1
  36. package/dist/entries/runtime-entry-module.d.ts +1 -10
  37. package/dist/entries/runtime-entry-module.js +2 -12
  38. package/dist/entries/runtime-entry-module.js.map +1 -1
  39. package/dist/index.js +144 -44
  40. package/dist/index.js.map +1 -1
  41. package/dist/plugins/import-meta-url.d.ts +16 -0
  42. package/dist/plugins/import-meta-url.js +193 -0
  43. package/dist/plugins/import-meta-url.js.map +1 -0
  44. package/dist/plugins/remove-console.d.ts +16 -0
  45. package/dist/plugins/remove-console.js +176 -0
  46. package/dist/plugins/remove-console.js.map +1 -0
  47. package/dist/routing/app-route-graph.d.ts +24 -1
  48. package/dist/routing/app-route-graph.js +52 -4
  49. package/dist/routing/app-route-graph.js.map +1 -1
  50. package/dist/routing/app-router.d.ts +2 -2
  51. package/dist/routing/app-router.js +2 -2
  52. package/dist/routing/app-router.js.map +1 -1
  53. package/dist/routing/file-matcher.d.ts +21 -1
  54. package/dist/routing/file-matcher.js +39 -1
  55. package/dist/routing/file-matcher.js.map +1 -1
  56. package/dist/routing/pages-router.d.ts +1 -1
  57. package/dist/routing/pages-router.js +10 -3
  58. package/dist/routing/pages-router.js.map +1 -1
  59. package/dist/server/api-handler.js +1 -1
  60. package/dist/server/app-browser-action-result.d.ts +9 -16
  61. package/dist/server/app-browser-action-result.js +25 -14
  62. package/dist/server/app-browser-action-result.js.map +1 -1
  63. package/dist/server/app-browser-entry.js +195 -60
  64. package/dist/server/app-browser-entry.js.map +1 -1
  65. package/dist/server/app-browser-mpa-navigation.d.ts +16 -0
  66. package/dist/server/app-browser-mpa-navigation.js +36 -0
  67. package/dist/server/app-browser-mpa-navigation.js.map +1 -0
  68. package/dist/server/app-browser-navigation-controller.d.ts +2 -0
  69. package/dist/server/app-browser-navigation-controller.js +4 -0
  70. package/dist/server/app-browser-navigation-controller.js.map +1 -1
  71. package/dist/server/app-browser-popstate.d.ts +3 -1
  72. package/dist/server/app-browser-popstate.js +15 -1
  73. package/dist/server/app-browser-popstate.js.map +1 -1
  74. package/dist/server/app-browser-state.js +2 -1
  75. package/dist/server/app-browser-state.js.map +1 -1
  76. package/dist/server/app-elements-wire.d.ts +13 -4
  77. package/dist/server/app-elements-wire.js +10 -1
  78. package/dist/server/app-elements-wire.js.map +1 -1
  79. package/dist/server/app-elements.d.ts +2 -2
  80. package/dist/server/app-elements.js +2 -2
  81. package/dist/server/app-elements.js.map +1 -1
  82. package/dist/server/app-fallback-renderer.d.ts +15 -5
  83. package/dist/server/app-fallback-renderer.js +10 -4
  84. package/dist/server/app-fallback-renderer.js.map +1 -1
  85. package/dist/server/app-inline-css-client.d.ts +7 -0
  86. package/dist/server/app-inline-css-client.js +37 -0
  87. package/dist/server/app-inline-css-client.js.map +1 -0
  88. package/dist/server/app-layout-param-observation.d.ts +30 -0
  89. package/dist/server/app-layout-param-observation.js +130 -0
  90. package/dist/server/app-layout-param-observation.js.map +1 -0
  91. package/dist/server/app-page-boundary-render.js +2 -2
  92. package/dist/server/app-page-boundary-render.js.map +1 -1
  93. package/dist/server/app-page-boundary.d.ts +21 -1
  94. package/dist/server/app-page-boundary.js +28 -3
  95. package/dist/server/app-page-boundary.js.map +1 -1
  96. package/dist/server/app-page-cache.d.ts +7 -3
  97. package/dist/server/app-page-cache.js +7 -7
  98. package/dist/server/app-page-cache.js.map +1 -1
  99. package/dist/server/app-page-dispatch.d.ts +10 -1
  100. package/dist/server/app-page-dispatch.js +126 -79
  101. package/dist/server/app-page-dispatch.js.map +1 -1
  102. package/dist/server/app-page-element-builder.js +12 -28
  103. package/dist/server/app-page-element-builder.js.map +1 -1
  104. package/dist/server/app-page-params.d.ts +2 -1
  105. package/dist/server/app-page-params.js +14 -1
  106. package/dist/server/app-page-params.js.map +1 -1
  107. package/dist/server/app-page-probe.d.ts +12 -1
  108. package/dist/server/app-page-probe.js +116 -1
  109. package/dist/server/app-page-probe.js.map +1 -1
  110. package/dist/server/app-page-render-identity.d.ts +22 -0
  111. package/dist/server/app-page-render-identity.js +42 -0
  112. package/dist/server/app-page-render-identity.js.map +1 -0
  113. package/dist/server/app-page-render.d.ts +8 -1
  114. package/dist/server/app-page-render.js +4 -1
  115. package/dist/server/app-page-render.js.map +1 -1
  116. package/dist/server/app-page-request.d.ts +6 -3
  117. package/dist/server/app-page-request.js +5 -2
  118. package/dist/server/app-page-request.js.map +1 -1
  119. package/dist/server/app-page-response.js +2 -2
  120. package/dist/server/app-page-response.js.map +1 -1
  121. package/dist/server/app-page-route-wiring.d.ts +15 -0
  122. package/dist/server/app-page-route-wiring.js +7 -5
  123. package/dist/server/app-page-route-wiring.js.map +1 -1
  124. package/dist/server/app-page-stream.d.ts +11 -0
  125. package/dist/server/app-page-stream.js +1 -0
  126. package/dist/server/app-page-stream.js.map +1 -1
  127. package/dist/server/app-route-handler-response.js +37 -5
  128. package/dist/server/app-route-handler-response.js.map +1 -1
  129. package/dist/server/app-rsc-cache-busting.d.ts +3 -2
  130. package/dist/server/app-rsc-cache-busting.js +9 -7
  131. package/dist/server/app-rsc-cache-busting.js.map +1 -1
  132. package/dist/server/app-rsc-handler.d.ts +14 -3
  133. package/dist/server/app-rsc-handler.js +56 -6
  134. package/dist/server/app-rsc-handler.js.map +1 -1
  135. package/dist/server/app-rsc-request-normalization.d.ts +2 -1
  136. package/dist/server/app-rsc-request-normalization.js +3 -2
  137. package/dist/server/app-rsc-request-normalization.js.map +1 -1
  138. package/dist/server/app-segment-config.d.ts +1 -1
  139. package/dist/server/app-segment-config.js +4 -1
  140. package/dist/server/app-segment-config.js.map +1 -1
  141. package/dist/server/app-server-action-execution.d.ts +26 -3
  142. package/dist/server/app-server-action-execution.js +240 -29
  143. package/dist/server/app-server-action-execution.js.map +1 -1
  144. package/dist/server/app-ssr-entry.d.ts +6 -0
  145. package/dist/server/app-ssr-entry.js +22 -7
  146. package/dist/server/app-ssr-entry.js.map +1 -1
  147. package/dist/server/app-ssr-error-meta.js +3 -3
  148. package/dist/server/app-ssr-error-meta.js.map +1 -1
  149. package/dist/server/app-ssr-stream.d.ts +2 -1
  150. package/dist/server/app-ssr-stream.js +176 -31
  151. package/dist/server/app-ssr-stream.js.map +1 -1
  152. package/dist/server/artifact-compatibility.d.ts +2 -1
  153. package/dist/server/artifact-compatibility.js +10 -1
  154. package/dist/server/artifact-compatibility.js.map +1 -1
  155. package/dist/server/client-reuse-manifest.d.ts +9 -4
  156. package/dist/server/client-reuse-manifest.js +2 -1
  157. package/dist/server/client-reuse-manifest.js.map +1 -1
  158. package/dist/server/client-trace-metadata.d.ts +31 -0
  159. package/dist/server/client-trace-metadata.js +83 -0
  160. package/dist/server/client-trace-metadata.js.map +1 -0
  161. package/dist/server/cookie-utils.d.ts +13 -0
  162. package/dist/server/cookie-utils.js +20 -0
  163. package/dist/server/cookie-utils.js.map +1 -0
  164. package/dist/server/dev-server.d.ts +8 -1
  165. package/dist/server/dev-server.js +83 -12
  166. package/dist/server/dev-server.js.map +1 -1
  167. package/dist/server/document-initial-head.d.ts +7 -0
  168. package/dist/server/document-initial-head.js +35 -0
  169. package/dist/server/document-initial-head.js.map +1 -0
  170. package/dist/server/html.d.ts +2 -1
  171. package/dist/server/html.js +6 -1
  172. package/dist/server/html.js.map +1 -1
  173. package/dist/server/isr-cache.d.ts +7 -5
  174. package/dist/server/isr-cache.js +17 -6
  175. package/dist/server/isr-cache.js.map +1 -1
  176. package/dist/server/middleware-runtime.js +1 -2
  177. package/dist/server/middleware-runtime.js.map +1 -1
  178. package/dist/server/pages-document-initial-props.d.ts +89 -0
  179. package/dist/server/pages-document-initial-props.js +140 -0
  180. package/dist/server/pages-document-initial-props.js.map +1 -0
  181. package/dist/server/pages-node-compat.js +1 -1
  182. package/dist/server/pages-page-data.js +3 -0
  183. package/dist/server/pages-page-data.js.map +1 -1
  184. package/dist/server/pages-page-method.d.ts +48 -0
  185. package/dist/server/pages-page-method.js +19 -0
  186. package/dist/server/pages-page-method.js.map +1 -0
  187. package/dist/server/pages-page-response.d.ts +20 -0
  188. package/dist/server/pages-page-response.js +37 -7
  189. package/dist/server/pages-page-response.js.map +1 -1
  190. package/dist/server/pages-serializable-props.d.ts +25 -0
  191. package/dist/server/pages-serializable-props.js +69 -0
  192. package/dist/server/pages-serializable-props.js.map +1 -0
  193. package/dist/server/prod-server.js +16 -6
  194. package/dist/server/prod-server.js.map +1 -1
  195. package/dist/server/server-action-not-found.js +3 -2
  196. package/dist/server/server-action-not-found.js.map +1 -1
  197. package/dist/server/skip-cache-proof.d.ts +23 -2
  198. package/dist/server/skip-cache-proof.js +81 -12
  199. package/dist/server/skip-cache-proof.js.map +1 -1
  200. package/dist/server/static-file-cache.js +2 -1
  201. package/dist/server/static-file-cache.js.map +1 -1
  202. package/dist/server/static-layout-client-reuse-proof.d.ts +16 -0
  203. package/dist/server/static-layout-client-reuse-proof.js +35 -0
  204. package/dist/server/static-layout-client-reuse-proof.js.map +1 -0
  205. package/dist/shims/app-router-scroll-state.d.ts +4 -2
  206. package/dist/shims/app-router-scroll-state.js +16 -3
  207. package/dist/shims/app-router-scroll-state.js.map +1 -1
  208. package/dist/shims/app-router-scroll.d.ts +16 -2
  209. package/dist/shims/app-router-scroll.js +18 -3
  210. package/dist/shims/app-router-scroll.js.map +1 -1
  211. package/dist/shims/cache.d.ts +27 -1
  212. package/dist/shims/cache.js +108 -6
  213. package/dist/shims/cache.js.map +1 -1
  214. package/dist/shims/document.d.ts +6 -0
  215. package/dist/shims/document.js +7 -8
  216. package/dist/shims/document.js.map +1 -1
  217. package/dist/shims/error-boundary.d.ts +4 -4
  218. package/dist/shims/error-boundary.js +27 -28
  219. package/dist/shims/error-boundary.js.map +1 -1
  220. package/dist/shims/error.js +3 -0
  221. package/dist/shims/error.js.map +1 -1
  222. package/dist/shims/fetch-cache.d.ts +3 -1
  223. package/dist/shims/fetch-cache.js +16 -5
  224. package/dist/shims/fetch-cache.js.map +1 -1
  225. package/dist/shims/hash-scroll.d.ts +4 -1
  226. package/dist/shims/hash-scroll.js +13 -1
  227. package/dist/shims/hash-scroll.js.map +1 -1
  228. package/dist/shims/head-state.d.ts +1 -0
  229. package/dist/shims/head-state.js +18 -3
  230. package/dist/shims/head-state.js.map +1 -1
  231. package/dist/shims/head.d.ts +35 -1
  232. package/dist/shims/head.js +113 -14
  233. package/dist/shims/head.js.map +1 -1
  234. package/dist/shims/headers.d.ts +7 -0
  235. package/dist/shims/headers.js +9 -1
  236. package/dist/shims/headers.js.map +1 -1
  237. package/dist/shims/internal/app-route-detection.d.ts +37 -0
  238. package/dist/shims/internal/app-route-detection.js +69 -0
  239. package/dist/shims/internal/app-route-detection.js.map +1 -0
  240. package/dist/shims/internal/pages-data-fetch-dedup.d.ts +56 -0
  241. package/dist/shims/internal/pages-data-fetch-dedup.js +70 -0
  242. package/dist/shims/internal/pages-data-fetch-dedup.js.map +1 -0
  243. package/dist/shims/link.d.ts +18 -2
  244. package/dist/shims/link.js +98 -8
  245. package/dist/shims/link.js.map +1 -1
  246. package/dist/shims/metadata.d.ts +7 -6
  247. package/dist/shims/metadata.js +9 -5
  248. package/dist/shims/metadata.js.map +1 -1
  249. package/dist/shims/navigation.d.ts +40 -3
  250. package/dist/shims/navigation.js +124 -25
  251. package/dist/shims/navigation.js.map +1 -1
  252. package/dist/shims/router.d.ts +5 -0
  253. package/dist/shims/router.js +51 -21
  254. package/dist/shims/router.js.map +1 -1
  255. package/dist/shims/script.d.ts +11 -1
  256. package/dist/shims/script.js +75 -6
  257. package/dist/shims/script.js.map +1 -1
  258. package/dist/shims/thenable-params.d.ts +5 -2
  259. package/dist/shims/thenable-params.js +25 -1
  260. package/dist/shims/thenable-params.js.map +1 -1
  261. package/dist/shims/unified-request-context.js +3 -0
  262. package/dist/shims/unified-request-context.js.map +1 -1
  263. package/dist/utils/client-build-manifest.d.ts +15 -0
  264. package/dist/utils/client-build-manifest.js +54 -0
  265. package/dist/utils/client-build-manifest.js.map +1 -0
  266. package/dist/utils/hash.js +1 -1
  267. package/dist/utils/hash.js.map +1 -1
  268. package/dist/utils/lazy-chunks.d.ts +1 -1
  269. package/dist/utils/lazy-chunks.js.map +1 -1
  270. package/dist/utils/path.d.ts +13 -0
  271. package/dist/utils/path.js +16 -0
  272. package/dist/utils/path.js.map +1 -0
  273. package/dist/utils/vite-version.d.ts +11 -0
  274. package/dist/utils/vite-version.js +36 -0
  275. package/dist/utils/vite-version.js.map +1 -0
  276. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"pages-client-entry.js","names":["pagesPatternToNextFormat"],"sources":["../../src/entries/pages-client-entry.ts"],"sourcesContent":["/**\n * Pages Router client hydration entry generator.\n *\n * Generates the virtual client entry module (`virtual:vinext-client-entry`).\n * This is the entry point for `vite build` (client bundle). It maps route\n * patterns to dynamic imports of page modules so Vite code-splits each page\n * into its own chunk. At runtime it reads __NEXT_DATA__ to determine which\n * page to hydrate.\n *\n * Extracted from index.ts.\n */\nimport {\n pagesRouter,\n patternToNextFormat as pagesPatternToNextFormat,\n type Route,\n} from \"../routing/pages-router.js\";\nimport { createValidFileMatcher } from \"../routing/file-matcher.js\";\nimport { type ResolvedNextConfig } from \"../config/next-config.js\";\nimport { findFileWithExts } from \"./pages-entry-helpers.js\";\nimport { normalizePathSeparators } from \"./runtime-entry-module.js\";\n\nexport async function generateClientEntry(\n pagesDir: string,\n nextConfig: ResolvedNextConfig,\n fileMatcher: ReturnType<typeof createValidFileMatcher>,\n): Promise<string> {\n const pageRoutes = await pagesRouter(pagesDir, nextConfig?.pageExtensions, fileMatcher);\n\n const appFilePath = findFileWithExts(pagesDir, \"_app\", fileMatcher);\n const hasApp = appFilePath !== null;\n\n // Build a map of route pattern -> dynamic import.\n // Keys must use Next.js bracket format (e.g. \"/user/[id]\") to match\n // __NEXT_DATA__.page which is set via patternToNextFormat() during SSR.\n const loaderEntries = pageRoutes.map((r: Route) => {\n const absPath = normalizePathSeparators(r.filePath);\n const nextFormatPattern = pagesPatternToNextFormat(r.pattern);\n // JSON.stringify safely escapes quotes, backslashes, and special chars in\n // both the route pattern and the absolute file path.\n // lgtm[js/bad-code-sanitization]\n return ` ${JSON.stringify(nextFormatPattern)}: () => import(${JSON.stringify(absPath)})`;\n });\n\n const appFileBase = appFilePath ? normalizePathSeparators(appFilePath) : undefined;\n\n return `\nimport \"vinext/instrumentation-client\";\nimport React from \"react\";\nimport { hydrateRoot } from \"react-dom/client\";\nimport { installPagesRouterRuntime } from \"vinext/pages-router-runtime\";\n// Statically import next/router as the very first vinext shim so that\n// (a) installWindowNext runs at top-level — \\`window.next.router\\` is\n// available to test harnesses and third-party scripts BEFORE\n// hydrate() resolves (see .nextjs-ref/packages/next/src/client/next.ts\n// line 13, which also sets window.next as a top-level side effect),\n// and (b) the popstate handler is registered before\n// installPagesRouterRuntime() runs, removing the race window where a\n// popstate event could fire between hydration and runtime install.\n//\n// Mirrors Next.js's bootstrap order: client/next.ts statically imports\n// from './' before calling initialize/hydrate, so window.next is set up\n// before any async work.\nimport { wrapWithRouterContext } from \"next/router\";\n\nconst pageLoaders = {\n${loaderEntries.join(\",\\n\")}\n};\n${\n hasApp\n ? `\nconst appLoader = () => import(${JSON.stringify(appFileBase!)});\n`\n : `\nconst appLoader = undefined;\n`\n}\n// Expose the code-split loader manifest on window so client-side\n// _next/data navigations in shims/router.ts can resolve the correct page\n// chunk for any route. Without this, navigateClient() would have to extract\n// the chunk URL from an HTML response — the whole point of switching to the\n// JSON data endpoint is to avoid that round trip.\n//\n// Keys are route patterns in Next.js bracket format (matching __NEXT_DATA__.page\n// and the keys of pageLoaders above). The patterns list is the same as\n// Object.keys(pageLoaders), exposed separately so navigateClient() can iterate\n// it without re-keying the map. Ordering is the insertion order of pageRoutes,\n// which pagesRouter() has already sorted by specificity (static → dynamic →\n// catch-all → optional catch-all) via compareRoutes — so matchPagesPattern()\n// can iterate in order and trust the first match.\nwindow.__VINEXT_PAGE_LOADERS__ = pageLoaders;\nwindow.__VINEXT_PAGE_PATTERNS__ = Object.keys(pageLoaders);\nwindow.__VINEXT_APP_LOADER__ = appLoader;\n\nasync function hydrate() {\n const nextData = window.__NEXT_DATA__;\n if (!nextData) {\n console.error(\"[vinext] No __NEXT_DATA__ found\");\n return;\n }\n\n const { pageProps } = nextData.props;\n const loader = pageLoaders[nextData.page];\n if (!loader) {\n console.error(\"[vinext] No page loader for route:\", nextData.page);\n return;\n }\n\n const pageModule = await loader();\n const PageComponent = pageModule.default;\n if (!PageComponent) {\n console.error(\"[vinext] Page module has no default export\");\n return;\n }\n\n let element;\n ${\n hasApp\n ? `\n try {\n const appModule = await appLoader();\n const AppComponent = appModule.default;\n window.__VINEXT_APP__ = AppComponent;\n element = React.createElement(AppComponent, { Component: PageComponent, pageProps });\n } catch {\n element = React.createElement(PageComponent, pageProps);\n }\n `\n : `\n element = React.createElement(PageComponent, pageProps);\n `\n }\n\n // Wrap with RouterContext.Provider so next/router and next/compat/router work during hydration.\n element = wrapWithRouterContext(element);\n\n const container = document.getElementById(\"__next\");\n if (!container) {\n console.error(\"[vinext] No #__next element found\");\n return;\n }\n\n const root = hydrateRoot(container, element);\n window.__VINEXT_ROOT__ = root;\n installPagesRouterRuntime();\n const hydratedAt = performance.now();\n window.__VINEXT_HYDRATED_AT = hydratedAt;\n window.__NEXT_HYDRATED = true;\n window.__NEXT_HYDRATED_AT = hydratedAt;\n window.__NEXT_HYDRATED_CB?.();\n}\n\nhydrate();\n`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAqBA,eAAsB,oBACpB,UACA,YACA,aACiB;CACjB,MAAM,aAAa,MAAM,YAAY,UAAU,YAAY,gBAAgB,YAAY;CAEvF,MAAM,cAAc,iBAAiB,UAAU,QAAQ,YAAY;CACnE,MAAM,SAAS,gBAAgB;CAK/B,MAAM,gBAAgB,WAAW,KAAK,MAAa;EACjD,MAAM,UAAU,wBAAwB,EAAE,SAAS;EACnD,MAAM,oBAAoBA,oBAAyB,EAAE,QAAQ;EAI7D,OAAO,KAAK,KAAK,UAAU,kBAAkB,CAAC,iBAAiB,KAAK,UAAU,QAAQ,CAAC;GACvF;CAEF,MAAM,cAAc,cAAc,wBAAwB,YAAY,GAAG,KAAA;CAEzE,OAAO;;;;;;;;;;;;;;;;;;;;EAoBP,cAAc,KAAK,MAAM,CAAC;;EAG1B,SACI;iCAC2B,KAAK,UAAU,YAAa,CAAC;IAExD;;EAGL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAyCG,SACI;;;;;;;;;MAUA;;IAGL"}
1
+ {"version":3,"file":"pages-client-entry.js","names":["pagesPatternToNextFormat"],"sources":["../../src/entries/pages-client-entry.ts"],"sourcesContent":["/**\n * Pages Router client hydration entry generator.\n *\n * Generates the virtual client entry module (`virtual:vinext-client-entry`).\n * This is the entry point for `vite build` (client bundle). It maps route\n * patterns to dynamic imports of page modules so Vite code-splits each page\n * into its own chunk. At runtime it reads __NEXT_DATA__ to determine which\n * page to hydrate.\n *\n * Extracted from index.ts.\n */\nimport {\n pagesRouter,\n patternToNextFormat as pagesPatternToNextFormat,\n type Route,\n} from \"../routing/pages-router.js\";\nimport { createValidFileMatcher } from \"../routing/file-matcher.js\";\nimport { type ResolvedNextConfig } from \"../config/next-config.js\";\nimport type { VinextLinkPrefetchRoute } from \"../client/vinext-next-data.js\";\nimport { findFileWithExts } from \"./pages-entry-helpers.js\";\nimport { normalizePathSeparators } from \"../utils/path.js\";\n\nexport async function generateClientEntry(\n pagesDir: string,\n nextConfig: ResolvedNextConfig,\n fileMatcher: ReturnType<typeof createValidFileMatcher>,\n options: { appPrefetchRoutes?: readonly VinextLinkPrefetchRoute[] } = {},\n): Promise<string> {\n const pageRoutes = await pagesRouter(pagesDir, nextConfig?.pageExtensions, fileMatcher);\n\n const appFilePath = findFileWithExts(pagesDir, \"_app\", fileMatcher);\n const hasApp = appFilePath !== null;\n const appPrefetchRoutes = options.appPrefetchRoutes ?? [];\n\n // Build a map of route pattern -> dynamic import.\n // Keys must use Next.js bracket format (e.g. \"/user/[id]\") to match\n // __NEXT_DATA__.page which is set via patternToNextFormat() during SSR.\n const loaderEntries = pageRoutes.map((r: Route) => {\n const absPath = normalizePathSeparators(r.filePath);\n const nextFormatPattern = pagesPatternToNextFormat(r.pattern);\n // JSON.stringify safely escapes quotes, backslashes, and special chars in\n // both the route pattern and the absolute file path.\n // lgtm[js/bad-code-sanitization]\n return ` ${JSON.stringify(nextFormatPattern)}: () => import(${JSON.stringify(absPath)})`;\n });\n\n const appFileBase = appFilePath ? normalizePathSeparators(appFilePath) : undefined;\n\n return `\nimport \"vinext/instrumentation-client\";\nimport React from \"react\";\nimport { hydrateRoot } from \"react-dom/client\";\nimport { installPagesRouterRuntime } from \"vinext/pages-router-runtime\";\n// Statically import next/router as the very first vinext shim so that\n// (a) installWindowNext runs at top-level — \\`window.next.router\\` is\n// available to test harnesses and third-party scripts BEFORE\n// hydrate() resolves (see .nextjs-ref/packages/next/src/client/next.ts\n// line 13, which also sets window.next as a top-level side effect),\n// and (b) the popstate handler is registered before\n// installPagesRouterRuntime() runs, removing the race window where a\n// popstate event could fire between hydration and runtime install.\n//\n// Mirrors Next.js's bootstrap order: client/next.ts statically imports\n// from './' before calling initialize/hydrate, so window.next is set up\n// before any async work.\nimport { wrapWithRouterContext } from \"next/router\";\n\nconst pageLoaders = {\n${loaderEntries.join(\",\\n\")}\n};\n${\n hasApp\n ? `\nconst appLoader = () => import(${JSON.stringify(appFileBase!)});\n`\n : `\nconst appLoader = undefined;\n`\n}\n// Expose the code-split loader manifest on window so client-side\n// _next/data navigations in shims/router.ts can resolve the correct page\n// chunk for any route. Without this, navigateClient() would have to extract\n// the chunk URL from an HTML response — the whole point of switching to the\n// JSON data endpoint is to avoid that round trip.\n//\n// Keys are route patterns in Next.js bracket format (matching __NEXT_DATA__.page\n// and the keys of pageLoaders above). The patterns list is the same as\n// Object.keys(pageLoaders), exposed separately so navigateClient() can iterate\n// it without re-keying the map. Ordering is the insertion order of pageRoutes,\n// which pagesRouter() has already sorted by specificity (static → dynamic →\n// catch-all → optional catch-all) via compareRoutes — so matchPagesPattern()\n// can iterate in order and trust the first match.\nwindow.__VINEXT_PAGE_LOADERS__ = pageLoaders;\nwindow.__VINEXT_PAGE_PATTERNS__ = Object.keys(pageLoaders);\nwindow.__VINEXT_APP_LOADER__ = appLoader;\n// Expose the App Router prefetch manifest so Pages Router \\`<Link>\\`s and\n// \\`Router.prefetch\\` can detect when a prefetch target is actually an App\n// Router route, and mark it on \\`Router.components[urlPathname]\\` with\n// \\`{ __appRouter: true }\\`. Mirrors Next.js's \\`_bfl\\`-driven marker write at\n// .nextjs-ref/packages/next/src/shared/lib/router/router.ts:2525, which the\n// Next.js deploy test\n// test/e2e/app-dir/app/index.test.ts → \"should successfully detect app\n// route during prefetch\"\n// asserts via \\`window.next.router.components[<path>]\\`. Issue #1526.\n//\n// In a hybrid Pages + App Router build, this entry runs when the user lands\n// on a Pages Router page. The App Router browser entry sets the same global\n// when the user lands on an App Router page (see app-browser-entry.ts) — the\n// two writes do not race because only one entry executes per page load.\nwindow.__VINEXT_LINK_PREFETCH_ROUTES__ = ${JSON.stringify(appPrefetchRoutes)};\n\nasync function hydrate() {\n const nextData = window.__NEXT_DATA__;\n if (!nextData) {\n console.error(\"[vinext] No __NEXT_DATA__ found\");\n return;\n }\n\n const { pageProps } = nextData.props;\n const loader = pageLoaders[nextData.page];\n if (!loader) {\n console.error(\"[vinext] No page loader for route:\", nextData.page);\n return;\n }\n\n const pageModule = await loader();\n const PageComponent = pageModule.default;\n if (!PageComponent) {\n console.error(\"[vinext] Page module has no default export\");\n return;\n }\n\n let element;\n ${\n hasApp\n ? `\n try {\n const appModule = await appLoader();\n const AppComponent = appModule.default;\n window.__VINEXT_APP__ = AppComponent;\n element = React.createElement(AppComponent, { Component: PageComponent, pageProps });\n } catch {\n element = React.createElement(PageComponent, pageProps);\n }\n `\n : `\n element = React.createElement(PageComponent, pageProps);\n `\n }\n\n // Wrap with RouterContext.Provider so next/router and next/compat/router work during hydration.\n element = wrapWithRouterContext(element);\n\n const container = document.getElementById(\"__next\");\n if (!container) {\n console.error(\"[vinext] No #__next element found\");\n return;\n }\n\n const root = hydrateRoot(container, element);\n window.__VINEXT_ROOT__ = root;\n installPagesRouterRuntime();\n const hydratedAt = performance.now();\n window.__VINEXT_HYDRATED_AT = hydratedAt;\n window.__NEXT_HYDRATED = true;\n window.__NEXT_HYDRATED_AT = hydratedAt;\n window.__NEXT_HYDRATED_CB?.();\n}\n\nhydrate();\n`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAsBA,eAAsB,oBACpB,UACA,YACA,aACA,UAAsE,EAAE,EACvD;CACjB,MAAM,aAAa,MAAM,YAAY,UAAU,YAAY,gBAAgB,YAAY;CAEvF,MAAM,cAAc,iBAAiB,UAAU,QAAQ,YAAY;CACnE,MAAM,SAAS,gBAAgB;CAC/B,MAAM,oBAAoB,QAAQ,qBAAqB,EAAE;CAKzD,MAAM,gBAAgB,WAAW,KAAK,MAAa;EACjD,MAAM,UAAU,wBAAwB,EAAE,SAAS;EACnD,MAAM,oBAAoBA,oBAAyB,EAAE,QAAQ;EAI7D,OAAO,KAAK,KAAK,UAAU,kBAAkB,CAAC,iBAAiB,KAAK,UAAU,QAAQ,CAAC;GACvF;CAEF,MAAM,cAAc,cAAc,wBAAwB,YAAY,GAAG,KAAA;CAEzE,OAAO;;;;;;;;;;;;;;;;;;;;EAoBP,cAAc,KAAK,MAAM,CAAC;;EAG1B,SACI;iCAC2B,KAAK,UAAU,YAAa,CAAC;IAExD;;EAGL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CA+B0C,KAAK,UAAU,kBAAkB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;IAyBzE,SACI;;;;;;;;;MAUA;;IAGL"}
@@ -1,5 +1,6 @@
1
1
  import { apiRouter, pagesRouter } from "../routing/pages-router.js";
2
- import { normalizePathSeparators, resolveEntryPath } from "./runtime-entry-module.js";
2
+ import { normalizePathSeparators } from "../utils/path.js";
3
+ import { resolveEntryPath } from "./runtime-entry-module.js";
3
4
  import { isProxyFile } from "../server/middleware.js";
4
5
  import { findFileWithExts } from "./pages-entry-helpers.js";
5
6
  //#region src/entries/pages-server-entry.ts
@@ -18,6 +19,7 @@ const _routeTriePath = resolveEntryPath("../routing/route-trie.js", import.meta.
18
19
  const _pagesI18nPath = resolveEntryPath("../server/pages-i18n.js", import.meta.url);
19
20
  const _pagesPageResponsePath = resolveEntryPath("../server/pages-page-response.js", import.meta.url);
20
21
  const _pagesPageDataPath = resolveEntryPath("../server/pages-page-data.js", import.meta.url);
22
+ const _pagesPageMethodPath = resolveEntryPath("../server/pages-page-method.js", import.meta.url);
21
23
  const _pagesDataRoutePath = resolveEntryPath("../server/pages-data-route.js", import.meta.url);
22
24
  const _pagesDefault404Path = resolveEntryPath("../server/pages-default-404.js", import.meta.url);
23
25
  const _pagesNodeCompatPath = resolveEntryPath("../server/pages-node-compat.js", import.meta.url);
@@ -72,7 +74,10 @@ async function generateServerEntry(pagesDir, nextConfig, fileMatcher, middleware
72
74
  },
73
75
  headers: nextConfig?.headers ?? [],
74
76
  expireTime: nextConfig?.expireTime,
77
+ cacheMaxMemorySize: nextConfig?.cacheMaxMemorySize,
75
78
  i18n: nextConfig?.i18n ?? null,
79
+ disableOptimizedLoading: nextConfig?.disableOptimizedLoading === true,
80
+ clientTraceMetadata: nextConfig?.clientTraceMetadata,
76
81
  images: {
77
82
  deviceSizes: nextConfig?.images?.deviceSizes,
78
83
  imageSizes: nextConfig?.images?.imageSizes,
@@ -140,10 +145,10 @@ export async function runMiddleware(request) {
140
145
  import ${JSON.stringify(_serverGlobalsPath)};
141
146
  import React from "react";
142
147
  import { renderToReadableStream } from "react-dom/server.edge";
143
- import { resetSSRHead, getSSRHeadHTML } from "next/head";
148
+ import { resetSSRHead, getSSRHeadHTML, setDocumentInitialHead } from "next/head";
144
149
  import { flushPreloads } from "next/dynamic";
145
150
  import { setSSRContext, wrapWithRouterContext } from "next/router";
146
- import { _runWithCacheState } from "next/cache";
151
+ import { _runWithCacheState, configureMemoryCacheHandler as __configureMemoryCacheHandler } from "next/cache";
147
152
  import { runWithPrivateCache } from "vinext/cache-runtime";
148
153
  import { ensureFetchPatch, runWithFetchCache } from "vinext/fetch-cache";
149
154
  import { runWithRequestContext as _runWithUnifiedCtx, createRequestContext as _createUnifiedCtx } from "vinext/unified-request-context";
@@ -171,6 +176,7 @@ import {
171
176
  } from ${JSON.stringify(_isrCachePath)};
172
177
  import { getScriptNonceFromHeaderSources as __getScriptNonceFromHeaderSources } from ${JSON.stringify(_cspPath)};
173
178
  import { resolvePagesPageData as __resolvePagesPageData } from ${JSON.stringify(_pagesPageDataPath)};
179
+ import { resolvePagesPageMethodResponse as __resolvePagesPageMethodResponse } from ${JSON.stringify(_pagesPageMethodPath)};
174
180
  import { buildNextDataJsonResponse as __buildNextDataJsonResponse, buildNextDataNotFoundResponse as __buildNextDataNotFoundResponse, isNextDataPathname as __isNextDataPathname, parseNextDataPathname as __parseNextDataPathname } from ${JSON.stringify(_pagesDataRoutePath)};
175
181
  import { buildDefaultPagesNotFoundResponse as __buildDefaultPagesNotFoundResponse } from ${JSON.stringify(_pagesDefault404Path)};
176
182
  import { renderPagesPageResponse as __renderPagesPageResponse } from ${JSON.stringify(_pagesPageResponsePath)};
@@ -191,6 +197,8 @@ const __hasMiddleware = ${JSON.stringify(Boolean(middlewarePath))};
191
197
  // Full resolved config for production server (embedded at build time)
192
198
  export const vinextConfig = ${vinextConfigJson};
193
199
 
200
+ __configureMemoryCacheHandler({ cacheMaxMemorySize: vinextConfig.cacheMaxMemorySize });
201
+
194
202
  // Path to the user's pages/_app file (or null). Used to look up the
195
203
  // _app's CSS/JS chunks in the SSR manifest so any global styles imported
196
204
  // by _app are included in every page's <link rel="stylesheet"> set.
@@ -377,6 +385,13 @@ function collectAssetTags(manifest, moduleIds, scriptNonce) {
377
385
  const tags = [];
378
386
  const seen = new Set();
379
387
  const nonceAttr = __createNonceAttribute(scriptNonce);
388
+ // Mirrors Next.js \`_document\` behaviour: when \`experimental.disableOptimizedLoading\`
389
+ // is false (the default), page scripts are emitted with \`defer\` in <head>. See
390
+ // .nextjs-ref/packages/next/src/pages/_document.tsx getScripts() — \`defer={!disableOptimizedLoading}\`.
391
+ // vinext always emits \`type="module"\` (which already defers implicitly), but
392
+ // upstream tests (e.g. test/e2e/optimized-loading) assert the literal \`defer\`
393
+ // attribute, and adding it preserves parity without changing browser behaviour.
394
+ const deferAttr = vinextConfig.disableOptimizedLoading ? "" : " defer";
380
395
 
381
396
  // Load the set of lazy chunk filenames (only reachable via dynamic imports).
382
397
  // These should NOT get <link rel="modulepreload"> or <script type="module">
@@ -390,7 +405,7 @@ function collectAssetTags(manifest, moduleIds, scriptNonce) {
390
405
  const entry = globalThis.__VINEXT_CLIENT_ENTRY__;
391
406
  seen.add(entry);
392
407
  tags.push('<link rel="modulepreload"' + nonceAttr + ' href="/' + entry + '" />');
393
- tags.push('<script type="module"' + nonceAttr + ' src="/' + entry + '" crossorigin><\/script>');
408
+ tags.push('<script type="module"' + deferAttr + nonceAttr + ' src="/' + entry + '" crossorigin><\/script>');
394
409
  }
395
410
  if (m) {
396
411
  // Always inject shared chunks (framework, vinext runtime, entry) and
@@ -460,7 +475,7 @@ function collectAssetTags(manifest, moduleIds, scriptNonce) {
460
475
  // (React.lazy, next/dynamic) and should only be fetched on demand.
461
476
  if (lazySet && lazySet.has(tf)) continue;
462
477
  tags.push('<link rel="modulepreload"' + nonceAttr + ' href="/' + tf + '" />');
463
- tags.push('<script type="module"' + nonceAttr + ' src="/' + tf + '" crossorigin><\/script>');
478
+ tags.push('<script type="module"' + deferAttr + nonceAttr + ' src="/' + tf + '" crossorigin><\/script>');
464
479
  }
465
480
  }
466
481
  }
@@ -504,6 +519,11 @@ async function _renderPage(request, url, manifest, middlewareHeaders, options) {
504
519
  const statusCode = options && typeof options.statusCode === "number" ? options.statusCode : undefined;
505
520
  const asPath = options && typeof options.asPath === "string" ? options.asPath : undefined;
506
521
  const renderErrorPageOnMiss = !(options && options.renderErrorPageOnMiss === false);
522
+ // Guard against infinite recursion when the user's custom 500/error page
523
+ // itself throws during render. When this flag is set, the catch block below
524
+ // returns the plain "Internal Server Error" text response instead of trying
525
+ // to render an error page again. Fixes #1458.
526
+ const isInternalErrorRender = !!(options && options.__isInternalErrorRender);
507
527
  const localeInfo = i18nConfig
508
528
  ? resolvePagesI18nRequest(
509
529
  url,
@@ -520,12 +540,26 @@ async function _renderPage(request, url, manifest, middlewareHeaders, options) {
520
540
  ? (localeInfo.domainLocale ? localeInfo.domainLocale.defaultLocale : i18nConfig.defaultLocale)
521
541
  : undefined;
522
542
  const domainLocales = i18nConfig ? i18nConfig.domains : undefined;
543
+ const i18nCacheVariant = i18nConfig
544
+ ? (localeInfo.domainLocale
545
+ ? "domain:" + String(localeInfo.domainLocale.domain).toLowerCase()
546
+ : "locale:" + String(locale))
547
+ : null;
548
+ const pageIsrCacheKey = i18nCacheVariant
549
+ ? (router, pathname) => isrCacheKey(router, pathname + "::i18n=" + encodeURIComponent(i18nCacheVariant))
550
+ : isrCacheKey;
523
551
 
524
552
  if (localeInfo.redirectUrl) {
525
553
  return new Response(null, { status: 307, headers: { Location: localeInfo.redirectUrl } });
526
554
  }
527
555
 
528
- let match = matchRoute(routeUrl, pageRoutes);
556
+ // Internal error render path: caller has pinned a specific route (the
557
+ // user's pages/500 or pages/_error) to render in response to an SSR throw.
558
+ // Skip route matching so we don't accidentally double-route, and skip the
559
+ // missing-route 404 fallback. See catch block below. Fixes #1458.
560
+ let match = options && options.__forcedRoute
561
+ ? { route: options.__forcedRoute, params: {} }
562
+ : matchRoute(routeUrl, pageRoutes);
529
563
  let renderStatusCodeOverride = statusCode;
530
564
  let renderAsPath = asPath;
531
565
  if (!match) {
@@ -587,6 +621,29 @@ async function _renderPage(request, url, manifest, middlewareHeaders, options) {
587
621
  if (!PageComponent) {
588
622
  return new Response("Page has no default export", { status: 500 });
589
623
  }
624
+
625
+ // Refs #1463: reject non-GET/HEAD methods on static (no
626
+ // getServerSideProps) Pages routes with 405 + Allow: GET, HEAD.
627
+ // Skip for error/status pages (/_error, /404, /500), data requests
628
+ // (those go through the JSON envelope path and have their own shape),
629
+ // and renders that are already an error-page miss-render override.
630
+ // Mirrors Next.js's base-server.ts L2277 carve-outs.
631
+ if (
632
+ !isDataReq &&
633
+ routePattern !== "/_error" &&
634
+ routePattern !== "/404" &&
635
+ routePattern !== "/500" &&
636
+ renderStatusCodeOverride === undefined
637
+ ) {
638
+ const methodResponse = __resolvePagesPageMethodResponse({
639
+ hasGetServerSideProps: typeof pageModule.getServerSideProps === "function",
640
+ method: request.method,
641
+ });
642
+ if (methodResponse) {
643
+ return methodResponse;
644
+ }
645
+ }
646
+
590
647
  const pageModuleUrl = resolveClientModuleUrl(manifest, route.filePath);
591
648
  const appModuleUrl = resolveClientModuleUrl(manifest, _appAssetPath);
592
649
  const scriptNonce = __getScriptNonceFromHeaderSources(request.headers, middlewareHeaders);
@@ -643,7 +700,7 @@ async function _renderPage(request, url, manifest, middlewareHeaders, options) {
643
700
  defaultLocale: currentDefaultLocale,
644
701
  domainLocales: domainLocales,
645
702
  },
646
- isrCacheKey,
703
+ isrCacheKey: pageIsrCacheKey,
647
704
  isrGet,
648
705
  isrSet,
649
706
  expireSeconds: vinextConfig.expireTime,
@@ -776,6 +833,30 @@ async function _renderPage(request, url, manifest, middlewareHeaders, options) {
776
833
  }
777
834
  return wrapWithRouterContext(currentElement);
778
835
  },
836
+ // Used by \`_document.getInitialProps\` -> \`ctx.renderPage\` to wrap
837
+ // App/Component with user-provided enhancers (e.g. styled-components,
838
+ // emotion). Falls back to identity when no enhancers are passed.
839
+ // \`pageProps\` is captured from the closure (unlike \`createPageElement\`
840
+ // which takes it as a param) — \`enhancePageElement\` is only ever invoked
841
+ // for this one request with this one \`pageProps\`, so there is no value to
842
+ // thread through; the renderPage contract only varies the enhancers.
843
+ enhancePageElement(renderPageOpts) {
844
+ var FinalApp = AppComponent;
845
+ var FinalComp = PageComponent;
846
+ if (renderPageOpts && typeof renderPageOpts.enhanceApp === "function" && FinalApp) {
847
+ FinalApp = renderPageOpts.enhanceApp(FinalApp);
848
+ }
849
+ if (renderPageOpts && typeof renderPageOpts.enhanceComponent === "function") {
850
+ FinalComp = renderPageOpts.enhanceComponent(FinalComp);
851
+ }
852
+ var enhancedElement;
853
+ if (FinalApp) {
854
+ enhancedElement = React.createElement(FinalApp, { Component: FinalComp, pageProps: pageProps });
855
+ } else {
856
+ enhancedElement = React.createElement(FinalComp, pageProps);
857
+ }
858
+ return wrapWithRouterContext(enhancedElement);
859
+ },
779
860
  DocumentComponent,
780
861
  flushPreloads: typeof flushPreloads === "function" ? flushPreloads : undefined,
781
862
  fontLinkHeader: _fontLinkHeader,
@@ -798,8 +879,9 @@ async function _renderPage(request, url, manifest, middlewareHeaders, options) {
798
879
  }
799
880
  },
800
881
  getSSRHeadHTML: typeof getSSRHeadHTML === "function" ? getSSRHeadHTML : undefined,
882
+ clientTraceMetadata: vinextConfig.clientTraceMetadata,
801
883
  gsspRes,
802
- isrCacheKey,
884
+ isrCacheKey: pageIsrCacheKey,
803
885
  expireSeconds: vinextConfig.expireTime,
804
886
  isrRevalidateSeconds,
805
887
  isrSet,
@@ -819,6 +901,8 @@ async function _renderPage(request, url, manifest, middlewareHeaders, options) {
819
901
  return renderToReadableStream(element);
820
902
  },
821
903
  resetSSRHead: typeof resetSSRHead === "function" ? resetSSRHead : undefined,
904
+ setDocumentInitialHead:
905
+ typeof setDocumentInitialHead === "function" ? setDocumentInitialHead : undefined,
822
906
  routePattern,
823
907
  routeUrl,
824
908
  safeJsonStringify,
@@ -837,6 +921,37 @@ async function _renderPage(request, url, manifest, middlewareHeaders, options) {
837
921
  { path: url, method: request.method, headers: Object.fromEntries(request.headers.entries()) },
838
922
  { routerKind: "Pages Router", routePath: route.pattern, routeType: "render" },
839
923
  ).catch(() => { /* ignore reporting errors */ });
924
+ // Data (_next/data) requests can't render HTML, and avoid recursion if
925
+ // we're already in the middle of rendering the error page itself.
926
+ // Mirrors Next.js base-server.ts which renders /500 (or _error) when
927
+ // SSR throws. Fixes #1458.
928
+ if (!isInternalErrorRender && !isDataReq) {
929
+ // Look for an explicit pages/500.tsx first, then fall back to _error.
930
+ // Only match the literal /500 pattern — never a catch-all/dynamic route.
931
+ let errorRoute = null;
932
+ for (var __i = 0; __i < pageRoutes.length; __i++) {
933
+ if (pageRoutes[__i].pattern === "/500") {
934
+ errorRoute = pageRoutes[__i];
935
+ break;
936
+ }
937
+ }
938
+ if (!errorRoute && _errorPageRoute) {
939
+ errorRoute = _errorPageRoute;
940
+ }
941
+ if (errorRoute) {
942
+ try {
943
+ return await _renderPage(request, url, manifest, middlewareHeaders, {
944
+ statusCode: 500,
945
+ asPath: url,
946
+ renderErrorPageOnMiss: false,
947
+ __isInternalErrorRender: true,
948
+ __forcedRoute: errorRoute,
949
+ });
950
+ } catch (errorPageErr) {
951
+ console.error("[vinext] Error page render failed:", errorPageErr);
952
+ }
953
+ }
954
+ }
840
955
  return new Response("Internal Server Error", { status: 500 });
841
956
  }
842
957
  });
@@ -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, normalizePathSeparators } 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 { findFileWithExts } from \"./pages-entry-helpers.js\";\n\nconst _requestContextShimPath = resolveEntryPath(\"../shims/request-context.js\", import.meta.url);\nconst _middlewareRuntimePath = resolveEntryPath(\"../server/middleware-runtime.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 _pagesDataRoutePath = resolveEntryPath(\"../server/pages-data-route.js\", import.meta.url);\nconst _pagesDefault404Path = resolveEntryPath(\"../server/pages-default-404.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);\nconst _cspPath = resolveEntryPath(\"../server/csp.js\", import.meta.url);\nconst _serverGlobalsPath = resolveEntryPath(\"../server/server-globals.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 = normalizePathSeparators(r.filePath);\n return `import * as page_${i} from ${JSON.stringify(absPath)};`;\n });\n\n const apiImports = apiRoutes.map((r: Route, i: number) => {\n const absPath = normalizePathSeparators(r.filePath);\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 = normalizePathSeparators(r.filePath);\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, _document, and _error.\n const appFilePath = findFileWithExts(pagesDir, \"_app\", fileMatcher);\n const docFilePath = findFileWithExts(pagesDir, \"_document\", fileMatcher);\n const errorFilePath = findFileWithExts(pagesDir, \"_error\", fileMatcher);\n // Embed the resolved _app path (or null) so the runtime can look it up\n // in the SSR manifest and include any CSS/JS chunks `_app` brings in\n // (e.g. global stylesheets imported by `_app.tsx`) alongside the page's\n // own assets. Without this, `_app`-imported CSS is emitted by Vite but\n // never `<link>`ed from the rendered HTML — see LHF-5 cluster.\n const appAssetPathJson =\n appFilePath !== null ? JSON.stringify(normalizePathSeparators(appFilePath)) : \"null\";\n const appImportCode =\n appFilePath !== null\n ? `import { default as AppComponent } from ${JSON.stringify(normalizePathSeparators(appFilePath))};`\n : `const AppComponent = null;`;\n\n const docImportCode =\n docFilePath !== null\n ? `import { default as DocumentComponent } from ${JSON.stringify(normalizePathSeparators(docFilePath))};`\n : `const DocumentComponent = null;`;\n\n const errorAssetPathJson =\n errorFilePath !== null ? JSON.stringify(normalizePathSeparators(errorFilePath)) : \"null\";\n const errorImportCode =\n errorFilePath !== null\n ? `import * as ErrorPageModule from ${JSON.stringify(normalizePathSeparators(errorFilePath))};`\n : `const ErrorPageModule = 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 assetPrefix: nextConfig?.assetPrefix ?? \"\",\n trailingSlash: nextConfig?.trailingSlash ?? false,\n redirects: nextConfig?.redirects ?? [],\n rewrites: nextConfig?.rewrites ?? { beforeFiles: [], afterFiles: [], fallback: [] },\n headers: nextConfig?.headers ?? [],\n expireTime: nextConfig?.expireTime,\n i18n: nextConfig?.i18n ?? null,\n images: {\n deviceSizes: nextConfig?.images?.deviceSizes,\n imageSizes: nextConfig?.images?.imageSizes,\n dangerouslyAllowSVG: nextConfig?.images?.dangerouslyAllowSVG,\n dangerouslyAllowLocalIP: nextConfig?.images?.dangerouslyAllowLocalIP,\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(normalizePathSeparators(instrumentationPath))};`\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(normalizePathSeparators(middlewarePath))};`\n : \"\";\n\n // The matcher config is read from the middleware module at request time.\n // The generated entry only wires the user module into the shared runtime\n // helper; matcher, execution, waitUntil, and result shaping live in normal\n // TypeScript modules so dev/prod paths cannot drift.\n const middlewareExportCode = middlewarePath\n ? `\nexport async function runMiddleware(request, ctx, options) {\n // Auto-detect /_next/data/<buildId>/<page>.json requests so user-written\n // worker entries don't need to know about the data endpoint protocol.\n // Mismatched buildId → JSON 404 short-circuit. Matched → middleware sees\n // the normalized page path via the request URL, and the worker sees the\n // normalized URL via result.rewriteUrl (if middleware didn't already\n // rewrite to something else).\n const __dataNorm = __normalizePagesDataRequest(request);\n if (__dataNorm.notFoundResponse) {\n return { continue: false, response: __dataNorm.notFoundResponse };\n }\n const __result = await __runGeneratedMiddleware({\n basePath: vinextConfig.basePath,\n ctx,\n i18nConfig,\n isDataRequest: options?.isDataRequest === true || __dataNorm.isDataReq,\n isProxy: ${JSON.stringify(isProxyFile(middlewarePath))},\n module: middlewareModule,\n request: __dataNorm.request,\n trailingSlash: vinextConfig.trailingSlash,\n });\n if (__dataNorm.isDataReq && __result.continue && !__result.rewriteUrl && !__result.redirectUrl) {\n return { ...__result, rewriteUrl: __dataNorm.normalizedPathname + __dataNorm.search };\n }\n return __result;\n}\n`\n : `\nexport async function runMiddleware(request) {\n // Even without user middleware, the data-endpoint URL must be normalized so\n // the worker pipeline sees the page path. Mismatched buildId → JSON 404.\n const __dataNorm = __normalizePagesDataRequest(request);\n if (__dataNorm.notFoundResponse) {\n return { continue: false, response: __dataNorm.notFoundResponse };\n }\n if (__dataNorm.isDataReq) {\n return { continue: true, rewriteUrl: __dataNorm.normalizedPathname + __dataNorm.search };\n }\n return { continue: true };\n}\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 ${JSON.stringify(_serverGlobalsPath)};\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 { createNonceAttribute as __createNonceAttribute, 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 { runGeneratedMiddleware as __runGeneratedMiddleware } from ${JSON.stringify(_middlewareRuntimePath)};\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 { getScriptNonceFromHeaderSources as __getScriptNonceFromHeaderSources } from ${JSON.stringify(_cspPath)};\nimport { resolvePagesPageData as __resolvePagesPageData } from ${JSON.stringify(_pagesPageDataPath)};\nimport { buildNextDataJsonResponse as __buildNextDataJsonResponse, buildNextDataNotFoundResponse as __buildNextDataNotFoundResponse, isNextDataPathname as __isNextDataPathname, parseNextDataPathname as __parseNextDataPathname } from ${JSON.stringify(_pagesDataRoutePath)};\nimport { buildDefaultPagesNotFoundResponse as __buildDefaultPagesNotFoundResponse } from ${JSON.stringify(_pagesDefault404Path)};\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). Exported so the production server can\n// match _next/data requests against the embedded buildId without needing\n// to load next.config.js at runtime.\nexport const buildId = ${buildIdJson};\nconst __hasMiddleware = ${JSON.stringify(Boolean(middlewarePath))};\n\n// Full resolved config for production server (embedded at build time)\nexport const vinextConfig = ${vinextConfigJson};\n\n// Path to the user's pages/_app file (or null). Used to look up the\n// _app's CSS/JS chunks in the SSR manifest so any global styles imported\n// by _app are included in every page's <link rel=\"stylesheet\"> set.\nconst _appAssetPath = ${appAssetPathJson};\n\nfunction isrGet(key) {\n return __sharedIsrGet(key);\n}\nfunction isrSet(key, data, revalidateSeconds, tags, expireSeconds) {\n return __sharedIsrSet(key, data, revalidateSeconds, tags, expireSeconds);\n}\nfunction triggerBackgroundRegeneration(key, renderFn, errorContext) {\n return __sharedTriggerBackgroundRegeneration(key, renderFn, errorContext);\n}\nfunction isrCacheKey(router, pathname) {\n return __sharedIsrCacheKey(router, pathname, buildId || undefined);\n}\n\n/**\n * Detect and normalize /_next/data/<buildId>/<page>.json requests in one\n * place so user-written worker entries don't need to know about the data\n * endpoint protocol. Returns the normalized request (with the page path as\n * its URL), an isDataReq flag, and notFoundResponse when the buildId in\n * the URL does not match this server's buildId — callers should return that\n * response immediately so a stale client falls back to a hard navigation.\n */\nfunction __normalizePagesDataRequest(request) {\n const reqUrl = new URL(request.url);\n if (!__isNextDataPathname(reqUrl.pathname)) {\n return { isDataReq: false, request, normalizedPathname: null, search: \"\", notFoundResponse: null };\n }\n const dataMatch = buildId ? __parseNextDataPathname(reqUrl.pathname, buildId) : null;\n if (!dataMatch) {\n return {\n isDataReq: false,\n request,\n normalizedPathname: null,\n search: \"\",\n notFoundResponse: __buildNextDataNotFoundResponse(),\n };\n }\n const normalizedUrl = new URL(reqUrl);\n normalizedUrl.pathname = dataMatch.pagePathname;\n return {\n isDataReq: true,\n request: new Request(normalizedUrl, request),\n normalizedPathname: dataMatch.pagePathname,\n search: reqUrl.search,\n notFoundResponse: null,\n };\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${errorImportCode}\n\nexport const pageRoutes = [\n${pageRouteEntries.join(\",\\n\")}\n];\nconst _pageRouteTrie = _buildRouteTrie(pageRoutes);\nconst _errorPageRoute = ErrorPageModule\n ? {\n pattern: \"/_error\",\n patternParts: [\"_error\"],\n isDynamic: false,\n params: [],\n module: ErrorPageModule,\n filePath: ${errorAssetPathJson},\n }\n : null;\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\nexport function matchPageRoute(url, request) {\n const routeUrl = i18nConfig && request\n ? resolvePagesI18nRequest(\n url,\n i18nConfig,\n request.headers,\n new URL(request.url).hostname,\n vinextConfig.basePath,\n vinextConfig.trailingSlash,\n ).url\n : url;\n return matchRoute(routeUrl, pageRoutes);\n}\n\nfunction parseQuery(url) {\n // Per RFC 3986 only the first \"?\" separates path from query, so additional\n // \"?\" chars belong to the query string (e.g. /linker?href=/about?hello=world\n // has query \"href=/about?hello=world\"). split(\"?\")[1] would drop everything\n // after the second \"?\" and strip embedded query strings from values.\n const queryIndex = url.indexOf(\"?\");\n if (queryIndex === -1) return {};\n const hashIndex = url.indexOf(\"#\", queryIndex + 1);\n const qs = hashIndex === -1 ? url.slice(queryIndex + 1) : url.slice(queryIndex + 1, hashIndex);\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 mergeRouteParamsIntoQuery(query, params) {\n return Object.assign(query, params);\n}\n\nfunction patternToNextFormat(pattern) {\n // Match any non-/ param name. Non-greedy with lookahead prevents\n // the +/* suffix being consumed into the param name when the name\n // itself contains + or * internally (e.g. :c++lang → [c++lang]).\n return pattern\n .replace(/:([^\\\\/]+?)\\\\+(?=\\\\/|$)/g, \"[...$1]\")\n .replace(/:([^\\\\/]+?)\\\\*(?=\\\\/|$)/g, \"[[...$1]]\")\n .replace(/:([^\\\\/]+?)(?=\\\\/|$)/g, \"[$1]\");\n}\n\nfunction resolveSsrManifest(manifest) {\n // Fall back to embedded manifest (set by vinext:cloudflare-build for Workers)\n return (manifest && Object.keys(manifest).length > 0)\n ? manifest\n : (typeof globalThis !== \"undefined\" && globalThis.__VINEXT_SSR_MANIFEST__) || null;\n}\n\nfunction getManifestFilesForModule(manifest, moduleId) {\n if (!manifest || !moduleId) return null;\n\n var files = manifest[moduleId];\n if (files) return files;\n\n for (var key in manifest) {\n if (moduleId.endsWith(\"/\" + key) || moduleId === key) {\n return manifest[key];\n }\n }\n return null;\n}\n\nfunction collectAssetTags(manifest, moduleIds, scriptNonce) {\n const m = resolveSsrManifest(manifest);\n const tags = [];\n const seen = new Set();\n const nonceAttr = __createNonceAttribute(scriptNonce);\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\"' + nonceAttr + ' href=\"/' + entry + '\" />');\n tags.push('<script type=\"module\"' + nonceAttr + ' 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 = getManifestFilesForModule(m, id);\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\"' + nonceAttr + ' 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\"' + nonceAttr + ' href=\"/' + tf + '\" />');\n tags.push('<script type=\"module\"' + nonceAttr + ' src=\"/' + tf + '\" crossorigin></script>');\n }\n }\n }\n return tags.join(\"\\\\n \");\n}\n\nfunction resolveClientModuleUrl(manifest, moduleId) {\n const files = getManifestFilesForModule(resolveSsrManifest(manifest), moduleId);\n if (!files) return undefined;\n for (var i = 0; i < files.length; i++) {\n var file = files[i];\n if (!file || !file.endsWith(\".js\")) continue;\n if (file.charAt(0) !== \"/\") file = \"/\" + file;\n return file;\n }\n return undefined;\n}\n\nexport async function renderPage(request, url, manifest, ctx, middlewareHeaders, options) {\n if (ctx) return _runWithExecutionContext(ctx, () => _renderPage(request, url, manifest, middlewareHeaders, options));\n return _renderPage(request, url, manifest, middlewareHeaders, options);\n}\n\nasync function _renderPage(request, url, manifest, middlewareHeaders, options) {\n let isDataReq = !!(options && options.isDataReq);\n // Auto-detect /_next/data/... requests by inspecting the incoming request\n // URL. The worker pipeline does not need to know about the data endpoint\n // protocol — when it forwards an unrewritten data URL as the url arg, we\n // normalize it to the page path here.\n if (!isDataReq) {\n const __dataNorm = __normalizePagesDataRequest(request);\n if (__dataNorm.notFoundResponse) return __dataNorm.notFoundResponse;\n if (__dataNorm.isDataReq) {\n isDataReq = true;\n if (url && url.startsWith(\"/_next/data/\")) {\n const __qs = url.includes(\"?\") ? url.slice(url.indexOf(\"?\")) : \"\";\n url = __dataNorm.normalizedPathname + __qs;\n }\n }\n }\n const statusCode = options && typeof options.statusCode === \"number\" ? options.statusCode : undefined;\n const asPath = options && typeof options.asPath === \"string\" ? options.asPath : undefined;\n const renderErrorPageOnMiss = !(options && options.renderErrorPageOnMiss === false);\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 let match = matchRoute(routeUrl, pageRoutes);\n let renderStatusCodeOverride = statusCode;\n let renderAsPath = asPath;\n if (!match) {\n if (isDataReq) {\n return __buildNextDataNotFoundResponse();\n }\n if (!renderErrorPageOnMiss) {\n return __buildDefaultPagesNotFoundResponse();\n }\n const notFoundMatch = matchRoute(\"/404\", pageRoutes);\n // matchRoute may match a catch-all (e.g. [...slug]); only use the explicit pages/404 route.\n if (notFoundMatch && notFoundMatch.route.pattern === \"/404\") {\n match = notFoundMatch;\n renderStatusCodeOverride = 404;\n renderAsPath = routeUrl;\n } else if (_errorPageRoute) {\n match = { route: _errorPageRoute, params: {} };\n renderStatusCodeOverride = 404;\n renderAsPath = routeUrl;\n } else {\n return __buildDefaultPagesNotFoundResponse();\n }\n }\n\n const { route, params } = match;\n const __uCtx = _createUnifiedCtx({\n executionContext: _getRequestExecutionContext(),\n });\n return _runWithUnifiedCtx(__uCtx, async () => {\n ensureFetchPatch();\n try {\n const routePattern = patternToNextFormat(route.pattern);\n const renderStatusCode = renderStatusCodeOverride ?? (routePattern === \"/404\" ? 404 : undefined);\n const query = mergeRouteParamsIntoQuery(parseQuery(routeUrl), params);\n if (typeof setSSRContext === \"function\") {\n setSSRContext({\n pathname: routePattern,\n query,\n asPath: renderAsPath || routeUrl,\n 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 if (!PageComponent) {\n return new Response(\"Page has no default export\", { status: 500 });\n }\n const pageModuleUrl = resolveClientModuleUrl(manifest, route.filePath);\n const appModuleUrl = resolveClientModuleUrl(manifest, _appAssetPath);\n const scriptNonce = __getScriptNonceFromHeaderSources(request.headers, middlewareHeaders);\n // Build font Link header early so it's available for ISR cached responses too.\n // Font preloads are module-level state populated at import time and persist across requests.\n var _fontLinkHeader = \"\";\n var _allFp = [];\n try {\n var _fpGoogle = typeof _getSSRFontPreloadsGoogle === \"function\" ? _getSSRFontPreloadsGoogle() : [];\n var _fpLocal = typeof _getSSRFontPreloadsLocal === \"function\" ? _getSSRFontPreloadsLocal() : [];\n _allFp = _fpGoogle.concat(_fpLocal);\n if (_allFp.length > 0) {\n _fontLinkHeader = _allFp.map(function(p) { return \"<\" + p.href + \">; rel=preload; as=font; type=\" + p.type + \"; crossorigin\"; }).join(\", \");\n }\n } catch (e) { /* font preloads not available */ }\n const pageDataResult = await __resolvePagesPageData({\n isDataReq,\n applyRequestContexts() {\n if (typeof setSSRContext === \"function\") {\n setSSRContext({\n pathname: routePattern,\n query,\n asPath: renderAsPath || routeUrl,\n locale: locale,\n locales: i18nConfig ? i18nConfig.locales : undefined,\n defaultLocale: currentDefaultLocale,\n domainLocales: domainLocales,\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 buildId,\n createGsspReqRes() {\n return __createPagesReqRes({ body: undefined, query, request, url: routeUrl });\n },\n createPageElement(currentPageProps) {\n var currentElement = AppComponent\n ? React.createElement(AppComponent, { Component: PageComponent, pageProps: currentPageProps })\n : React.createElement(PageComponent, currentPageProps);\n return wrapWithRouterContext(currentElement);\n },\n fontLinkHeader: _fontLinkHeader,\n i18n: {\n locale: locale,\n locales: i18nConfig ? i18nConfig.locales : undefined,\n defaultLocale: currentDefaultLocale,\n domainLocales: domainLocales,\n },\n isrCacheKey,\n isrGet,\n isrSet,\n expireSeconds: vinextConfig.expireTime,\n // The vinext build phase boots the prod server with VINEXT_PRERENDER=1\n // and fetches every statically-generated page through it. That hit is\n // the \"build\" prerender for revalidateReason; runtime hits are not.\n // Mirrors Next.js's \\`renderOpts.isBuildTimePrerendering\\`. See\n // \\`.nextjs-ref/packages/next/src/server/render.tsx\\` and\n // \\`packages/vinext/src/build/prerender.ts\\`.\n isBuildTimePrerendering: typeof process !== \"undefined\" && process.env && process.env.VINEXT_PRERENDER === \"1\",\n pageModule,\n params,\n query,\n renderIsrPassToStringAsync,\n route: {\n isDynamic: route.isDynamic,\n },\n routePattern,\n routeUrl,\n runInFreshUnifiedContext(callback) {\n var revalCtx = _createUnifiedCtx({\n executionContext: _getRequestExecutionContext(),\n });\n return _runWithUnifiedCtx(revalCtx, async () => {\n ensureFetchPatch();\n return callback();\n });\n },\n safeJsonStringify,\n sanitizeDestination: sanitizeDestinationLocal,\n scriptNonce,\n statusCode: renderStatusCode,\n triggerBackgroundRegeneration,\n vinext: {\n pageModuleUrl,\n appModuleUrl,\n hasMiddleware: __hasMiddleware,\n },\n });\n if (pageDataResult.kind === \"response\") {\n return pageDataResult.response;\n }\n let pageProps = pageDataResult.pageProps;\n if (routePattern === \"/_error\" && typeof renderStatusCode === \"number\") {\n pageProps = { ...pageProps, statusCode: renderStatusCode };\n }\n var gsspRes = pageDataResult.gsspRes;\n let isrRevalidateSeconds = pageDataResult.isrRevalidateSeconds;\n const isFallbackRender = pageDataResult.isFallback === true;\n\n // Republish the SSR context with isFallback flipped on so the page's\n // \\`useRouter().isFallback\\` returns true during render, matching Next.js's\n // \\`render.tsx\\` fallback shell. Without this, the page would still see\n // \\`isFallback: false\\` and run the non-fallback branch.\n if (isFallbackRender && typeof setSSRContext === \"function\") {\n setSSRContext({\n pathname: routePattern,\n query,\n asPath: renderAsPath || routeUrl,\n locale: locale,\n locales: i18nConfig ? i18nConfig.locales : undefined,\n defaultLocale: currentDefaultLocale,\n domainLocales: domainLocales,\n isFallback: true,\n });\n }\n\n // ── _next/data JSON envelope short-circuit ───────────────────────\n // For client-side navigations Next.js fetches /_next/data/<buildId>/<page>.json\n // and expects { pageProps } as JSON instead of the full HTML page. Skip\n // rendering the React tree and emit the JSON envelope directly via the\n // typed helper so the envelope shape stays in one place. Headers and\n // cookies set on the gsspRes by getServerSideProps are forwarded so\n // middleware/auth flows work the same as the HTML page.\n if (isDataReq) {\n const init = { headers: {} };\n if (gsspRes && typeof gsspRes.getHeaders === \"function\") {\n const gsspHeaders = gsspRes.getHeaders();\n for (const k of Object.keys(gsspHeaders)) {\n const v = gsspHeaders[k];\n if (v === undefined || v === null) continue;\n init.headers[k] = Array.isArray(v) ? v.join(\", \") : String(v);\n }\n }\n if (gsspRes) {\n // Default Cache-Control for gSSP-driven _next/data responses,\n // matching Next.js's pages-handler.ts (revalidate: 0 →\n // getCacheControlHeader). Skip when gSSP already set one via\n // res.setHeader (case-insensitive). Mirrors the HTML branch in\n // pages-page-response.ts and the dev-server branch. Fixes #1461.\n var hasUserCacheControl = false;\n for (const headerKey of Object.keys(init.headers)) {\n if (headerKey.toLowerCase() === \"cache-control\") {\n hasUserCacheControl = true;\n break;\n }\n }\n if (!hasUserCacheControl) {\n init.headers[\"Cache-Control\"] =\n \"private, no-cache, no-store, max-age=0, must-revalidate\";\n }\n }\n return __buildNextDataJsonResponse(pageProps, safeJsonStringify, init);\n }\n\n // Include both the matched page module and the global _app module\n // (if present). _app is wrapped around every page in Pages Router,\n // and any CSS/JS it imports must be linked from the rendered HTML\n // so the browser actually loads it. Without _app in this list, a\n // global stylesheet imported via import \"./globals.scss\" in\n // _app.tsx never reaches the page, producing the LHF-5 symptom\n // where styled elements render with the browser default colour.\n const pageModuleIds = [];\n if (route.filePath) pageModuleIds.push(route.filePath);\n if (_appAssetPath) pageModuleIds.push(_appAssetPath);\n const assetTags = collectAssetTags(manifest, pageModuleIds, scriptNonce);\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 getSSRHeadHTML: typeof getSSRHeadHTML === \"function\" ? getSSRHeadHTML : undefined,\n gsspRes,\n isrCacheKey,\n expireSeconds: vinextConfig.expireTime,\n isrRevalidateSeconds,\n isrSet,\n i18n: {\n locale: locale,\n locales: i18nConfig ? i18nConfig.locales : undefined,\n defaultLocale: currentDefaultLocale,\n domainLocales: domainLocales,\n },\n isFallback: isFallbackRender,\n pageProps,\n params,\n renderDocumentToString(element) {\n return renderToStringAsync(element);\n },\n renderToReadableStream(element) {\n return renderToReadableStream(element);\n },\n resetSSRHead: typeof resetSSRHead === \"function\" ? resetSSRHead : undefined,\n routePattern,\n routeUrl,\n safeJsonStringify,\n scriptNonce,\n statusCode: renderStatusCode,\n vinext: {\n pageModuleUrl,\n appModuleUrl,\n hasMiddleware: __hasMiddleware,\n },\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, ctx) {\n const match = matchRoute(url, apiRoutes);\n return __handlePagesApiRoute({\n ctx,\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":";;;;;;;;;;;;;;AAgBA,MAAM,0BAA0B,iBAAiB,+BAA+B,OAAO,KAAK,IAAI;AAChG,MAAM,yBAAyB,iBAAiB,mCAAmC,OAAO,KAAK,IAAI;AACnG,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,sBAAsB,iBAAiB,iCAAiC,OAAO,KAAK,IAAI;AAC9F,MAAM,uBAAuB,iBAAiB,kCAAkC,OAAO,KAAK,IAAI;AAChG,MAAM,uBAAuB,iBAAiB,kCAAkC,OAAO,KAAK,IAAI;AAChG,MAAM,qBAAqB,iBAAiB,gCAAgC,OAAO,KAAK,IAAI;AAC5F,MAAM,gBAAgB,iBAAiB,0BAA0B,OAAO,KAAK,IAAI;AACjF,MAAM,WAAW,iBAAiB,oBAAoB,OAAO,KAAK,IAAI;AACtE,MAAM,qBAAqB,iBAAiB,+BAA+B,OAAO,KAAK,IAAI;;;;;AAM3F,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,wBAAwB,EAAE,SAAS;EACnD,OAAO,oBAAoB,EAAE,QAAQ,KAAK,UAAU,QAAQ,CAAC;GAC7D;CAEF,MAAM,aAAa,UAAU,KAAK,GAAU,MAAc;EACxD,MAAM,UAAU,wBAAwB,EAAE,SAAS;EACnD,OAAO,mBAAmB,EAAE,QAAQ,KAAK,UAAU,QAAQ,CAAC;GAC5D;CAGF,MAAM,mBAAmB,WAAW,KAAK,GAAU,MAAc;EAC/D,MAAM,UAAU,wBAAwB,EAAE,SAAS;EACnD,OAAO,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,gBAAgB,iBAAiB,UAAU,UAAU,YAAY;CAMvE,MAAM,mBACJ,gBAAgB,OAAO,KAAK,UAAU,wBAAwB,YAAY,CAAC,GAAG;CAChF,MAAM,gBACJ,gBAAgB,OACZ,2CAA2C,KAAK,UAAU,wBAAwB,YAAY,CAAC,CAAC,KAChG;CAEN,MAAM,gBACJ,gBAAgB,OACZ,gDAAgD,KAAK,UAAU,wBAAwB,YAAY,CAAC,CAAC,KACrG;CAEN,MAAM,qBACJ,kBAAkB,OAAO,KAAK,UAAU,wBAAwB,cAAc,CAAC,GAAG;CACpF,MAAM,kBACJ,kBAAkB,OACd,oCAAoC,KAAK,UAAU,wBAAwB,cAAc,CAAC,CAAC,KAC3F;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,aAAa,YAAY,eAAe;EACxC,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,YAAY,YAAY;EACxB,MAAM,YAAY,QAAQ;EAC1B,QAAQ;GACN,aAAa,YAAY,QAAQ;GACjC,YAAY,YAAY,QAAQ;GAChC,qBAAqB,YAAY,QAAQ;GACzC,yBAAyB,YAAY,QAAQ;GAC7C,wBAAwB,YAAY,QAAQ;GAC5C,uBAAuB,YAAY,QAAQ;GAC5C;EACF,CAAC;CAWF,MAAM,4BAA4B,sBAC9B,qCAAqC,KAAK,UAAU,wBAAwB,oBAAoB,CAAC,CAAC,KAClG;CAEJ,MAAM,0BAA0B,sBAC5B;;;;;;;;;;KAWA;CAGJ,MAAM,uBAAuB,iBACzB,qCAAqC,KAAK,UAAU,wBAAwB,eAAe,CAAC,CAAC,KAC7F;CAMJ,MAAM,uBAAuB,iBACzB;;;;;;;;;;;;;;;;;eAiBS,KAAK,UAAU,YAAY,eAAe,CAAC,CAAC;;;;;;;;;;IAWrD;;;;;;;;;;;;;;CAiBJ,OAAO;SACA,KAAK,UAAU,mBAAmB,CAAC;;;;;;;;;;;;;;;;;;kEAkBsB,KAAK,UAAU,iBAAiB,gCAAgC,OAAO,KAAK,IAAI,CAAC,CAAC;iIACnB,KAAK,UAAU,wBAAwB,CAAC;qEACpG,KAAK,UAAU,uBAAuB,CAAC;6EAC/B,KAAK,UAAU,eAAe,CAAC;;0CAElE,KAAK,UAAU,eAAe,CAAC;2DACd,KAAK,UAAU,qBAAqB,CAAC;+DACjC,KAAK,UAAU,mBAAmB,CAAC;;;;;;SAMzF,KAAK,UAAU,cAAc,CAAC;uFACgD,KAAK,UAAU,SAAS,CAAC;iEAC/C,KAAK,UAAU,mBAAmB,CAAC;2OACuI,KAAK,UAAU,oBAAoB,CAAC;2FACpL,KAAK,UAAU,qBAAqB,CAAC;uEACzD,KAAK,UAAU,uBAAuB,CAAC;EAC5G,0BAA0B;EAC1B,qBAAqB;;EAErB,wBAAwB;;;qBAGL,eAAe;;;;;yBAKX,YAAY;0BACX,KAAK,UAAU,QAAQ,eAAe,CAAC,CAAC;;;8BAGpC,iBAAiB;;;;;wBAKvB,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsEvC,YAAY,KAAK,KAAK,CAAC;EACvB,WAAW,KAAK,KAAK,CAAC;;EAEtB,cAAc;EACd,cAAc;EACd,gBAAgB;;;EAGhB,iBAAiB,KAAK,MAAM,CAAC;;;;;;;;;;kBAUb,mBAAmB;;;;;EAKnC,gBAAgB,KAAK,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6jB5B,qBAAqB"}
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 { normalizePathSeparators } from \"../utils/path.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 { findFileWithExts } from \"./pages-entry-helpers.js\";\n\nconst _requestContextShimPath = resolveEntryPath(\"../shims/request-context.js\", import.meta.url);\nconst _middlewareRuntimePath = resolveEntryPath(\"../server/middleware-runtime.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 _pagesPageMethodPath = resolveEntryPath(\"../server/pages-page-method.js\", import.meta.url);\nconst _pagesDataRoutePath = resolveEntryPath(\"../server/pages-data-route.js\", import.meta.url);\nconst _pagesDefault404Path = resolveEntryPath(\"../server/pages-default-404.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);\nconst _cspPath = resolveEntryPath(\"../server/csp.js\", import.meta.url);\nconst _serverGlobalsPath = resolveEntryPath(\"../server/server-globals.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 = normalizePathSeparators(r.filePath);\n return `import * as page_${i} from ${JSON.stringify(absPath)};`;\n });\n\n const apiImports = apiRoutes.map((r: Route, i: number) => {\n const absPath = normalizePathSeparators(r.filePath);\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 = normalizePathSeparators(r.filePath);\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, _document, and _error.\n const appFilePath = findFileWithExts(pagesDir, \"_app\", fileMatcher);\n const docFilePath = findFileWithExts(pagesDir, \"_document\", fileMatcher);\n const errorFilePath = findFileWithExts(pagesDir, \"_error\", fileMatcher);\n // Embed the resolved _app path (or null) so the runtime can look it up\n // in the SSR manifest and include any CSS/JS chunks `_app` brings in\n // (e.g. global stylesheets imported by `_app.tsx`) alongside the page's\n // own assets. Without this, `_app`-imported CSS is emitted by Vite but\n // never `<link>`ed from the rendered HTML — see LHF-5 cluster.\n const appAssetPathJson =\n appFilePath !== null ? JSON.stringify(normalizePathSeparators(appFilePath)) : \"null\";\n const appImportCode =\n appFilePath !== null\n ? `import { default as AppComponent } from ${JSON.stringify(normalizePathSeparators(appFilePath))};`\n : `const AppComponent = null;`;\n\n const docImportCode =\n docFilePath !== null\n ? `import { default as DocumentComponent } from ${JSON.stringify(normalizePathSeparators(docFilePath))};`\n : `const DocumentComponent = null;`;\n\n const errorAssetPathJson =\n errorFilePath !== null ? JSON.stringify(normalizePathSeparators(errorFilePath)) : \"null\";\n const errorImportCode =\n errorFilePath !== null\n ? `import * as ErrorPageModule from ${JSON.stringify(normalizePathSeparators(errorFilePath))};`\n : `const ErrorPageModule = 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 assetPrefix: nextConfig?.assetPrefix ?? \"\",\n trailingSlash: nextConfig?.trailingSlash ?? false,\n redirects: nextConfig?.redirects ?? [],\n rewrites: nextConfig?.rewrites ?? { beforeFiles: [], afterFiles: [], fallback: [] },\n headers: nextConfig?.headers ?? [],\n expireTime: nextConfig?.expireTime,\n cacheMaxMemorySize: nextConfig?.cacheMaxMemorySize,\n i18n: nextConfig?.i18n ?? null,\n // Mirrors Next.js `experimental.disableOptimizedLoading` — when false\n // (the default), page scripts are emitted with `defer` in <head>. See\n // `.nextjs-ref/packages/next/src/pages/_document.tsx` getScripts().\n disableOptimizedLoading: nextConfig?.disableOptimizedLoading === true,\n clientTraceMetadata: nextConfig?.clientTraceMetadata,\n images: {\n deviceSizes: nextConfig?.images?.deviceSizes,\n imageSizes: nextConfig?.images?.imageSizes,\n dangerouslyAllowSVG: nextConfig?.images?.dangerouslyAllowSVG,\n dangerouslyAllowLocalIP: nextConfig?.images?.dangerouslyAllowLocalIP,\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(normalizePathSeparators(instrumentationPath))};`\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(normalizePathSeparators(middlewarePath))};`\n : \"\";\n\n // The matcher config is read from the middleware module at request time.\n // The generated entry only wires the user module into the shared runtime\n // helper; matcher, execution, waitUntil, and result shaping live in normal\n // TypeScript modules so dev/prod paths cannot drift.\n const middlewareExportCode = middlewarePath\n ? `\nexport async function runMiddleware(request, ctx, options) {\n // Auto-detect /_next/data/<buildId>/<page>.json requests so user-written\n // worker entries don't need to know about the data endpoint protocol.\n // Mismatched buildId → JSON 404 short-circuit. Matched → middleware sees\n // the normalized page path via the request URL, and the worker sees the\n // normalized URL via result.rewriteUrl (if middleware didn't already\n // rewrite to something else).\n const __dataNorm = __normalizePagesDataRequest(request);\n if (__dataNorm.notFoundResponse) {\n return { continue: false, response: __dataNorm.notFoundResponse };\n }\n const __result = await __runGeneratedMiddleware({\n basePath: vinextConfig.basePath,\n ctx,\n i18nConfig,\n isDataRequest: options?.isDataRequest === true || __dataNorm.isDataReq,\n isProxy: ${JSON.stringify(isProxyFile(middlewarePath))},\n module: middlewareModule,\n request: __dataNorm.request,\n trailingSlash: vinextConfig.trailingSlash,\n });\n if (__dataNorm.isDataReq && __result.continue && !__result.rewriteUrl && !__result.redirectUrl) {\n return { ...__result, rewriteUrl: __dataNorm.normalizedPathname + __dataNorm.search };\n }\n return __result;\n}\n`\n : `\nexport async function runMiddleware(request) {\n // Even without user middleware, the data-endpoint URL must be normalized so\n // the worker pipeline sees the page path. Mismatched buildId → JSON 404.\n const __dataNorm = __normalizePagesDataRequest(request);\n if (__dataNorm.notFoundResponse) {\n return { continue: false, response: __dataNorm.notFoundResponse };\n }\n if (__dataNorm.isDataReq) {\n return { continue: true, rewriteUrl: __dataNorm.normalizedPathname + __dataNorm.search };\n }\n return { continue: true };\n}\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 ${JSON.stringify(_serverGlobalsPath)};\nimport React from \"react\";\nimport { renderToReadableStream } from \"react-dom/server.edge\";\nimport { resetSSRHead, getSSRHeadHTML, setDocumentInitialHead } from \"next/head\";\nimport { flushPreloads } from \"next/dynamic\";\nimport { setSSRContext, wrapWithRouterContext } from \"next/router\";\nimport { _runWithCacheState, configureMemoryCacheHandler as __configureMemoryCacheHandler } 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 { createNonceAttribute as __createNonceAttribute, 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 { runGeneratedMiddleware as __runGeneratedMiddleware } from ${JSON.stringify(_middlewareRuntimePath)};\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 { getScriptNonceFromHeaderSources as __getScriptNonceFromHeaderSources } from ${JSON.stringify(_cspPath)};\nimport { resolvePagesPageData as __resolvePagesPageData } from ${JSON.stringify(_pagesPageDataPath)};\nimport { resolvePagesPageMethodResponse as __resolvePagesPageMethodResponse } from ${JSON.stringify(_pagesPageMethodPath)};\nimport { buildNextDataJsonResponse as __buildNextDataJsonResponse, buildNextDataNotFoundResponse as __buildNextDataNotFoundResponse, isNextDataPathname as __isNextDataPathname, parseNextDataPathname as __parseNextDataPathname } from ${JSON.stringify(_pagesDataRoutePath)};\nimport { buildDefaultPagesNotFoundResponse as __buildDefaultPagesNotFoundResponse } from ${JSON.stringify(_pagesDefault404Path)};\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). Exported so the production server can\n// match _next/data requests against the embedded buildId without needing\n// to load next.config.js at runtime.\nexport const buildId = ${buildIdJson};\nconst __hasMiddleware = ${JSON.stringify(Boolean(middlewarePath))};\n\n// Full resolved config for production server (embedded at build time)\nexport const vinextConfig = ${vinextConfigJson};\n\n__configureMemoryCacheHandler({ cacheMaxMemorySize: vinextConfig.cacheMaxMemorySize });\n\n// Path to the user's pages/_app file (or null). Used to look up the\n// _app's CSS/JS chunks in the SSR manifest so any global styles imported\n// by _app are included in every page's <link rel=\"stylesheet\"> set.\nconst _appAssetPath = ${appAssetPathJson};\n\nfunction isrGet(key) {\n return __sharedIsrGet(key);\n}\nfunction isrSet(key, data, revalidateSeconds, tags, expireSeconds) {\n return __sharedIsrSet(key, data, revalidateSeconds, tags, expireSeconds);\n}\nfunction triggerBackgroundRegeneration(key, renderFn, errorContext) {\n return __sharedTriggerBackgroundRegeneration(key, renderFn, errorContext);\n}\nfunction isrCacheKey(router, pathname) {\n return __sharedIsrCacheKey(router, pathname, buildId || undefined);\n}\n\n/**\n * Detect and normalize /_next/data/<buildId>/<page>.json requests in one\n * place so user-written worker entries don't need to know about the data\n * endpoint protocol. Returns the normalized request (with the page path as\n * its URL), an isDataReq flag, and notFoundResponse when the buildId in\n * the URL does not match this server's buildId — callers should return that\n * response immediately so a stale client falls back to a hard navigation.\n */\nfunction __normalizePagesDataRequest(request) {\n const reqUrl = new URL(request.url);\n if (!__isNextDataPathname(reqUrl.pathname)) {\n return { isDataReq: false, request, normalizedPathname: null, search: \"\", notFoundResponse: null };\n }\n const dataMatch = buildId ? __parseNextDataPathname(reqUrl.pathname, buildId) : null;\n if (!dataMatch) {\n return {\n isDataReq: false,\n request,\n normalizedPathname: null,\n search: \"\",\n notFoundResponse: __buildNextDataNotFoundResponse(),\n };\n }\n const normalizedUrl = new URL(reqUrl);\n normalizedUrl.pathname = dataMatch.pagePathname;\n return {\n isDataReq: true,\n request: new Request(normalizedUrl, request),\n normalizedPathname: dataMatch.pagePathname,\n search: reqUrl.search,\n notFoundResponse: null,\n };\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${errorImportCode}\n\nexport const pageRoutes = [\n${pageRouteEntries.join(\",\\n\")}\n];\nconst _pageRouteTrie = _buildRouteTrie(pageRoutes);\nconst _errorPageRoute = ErrorPageModule\n ? {\n pattern: \"/_error\",\n patternParts: [\"_error\"],\n isDynamic: false,\n params: [],\n module: ErrorPageModule,\n filePath: ${errorAssetPathJson},\n }\n : null;\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\nexport function matchPageRoute(url, request) {\n const routeUrl = i18nConfig && request\n ? resolvePagesI18nRequest(\n url,\n i18nConfig,\n request.headers,\n new URL(request.url).hostname,\n vinextConfig.basePath,\n vinextConfig.trailingSlash,\n ).url\n : url;\n return matchRoute(routeUrl, pageRoutes);\n}\n\nfunction parseQuery(url) {\n // Per RFC 3986 only the first \"?\" separates path from query, so additional\n // \"?\" chars belong to the query string (e.g. /linker?href=/about?hello=world\n // has query \"href=/about?hello=world\"). split(\"?\")[1] would drop everything\n // after the second \"?\" and strip embedded query strings from values.\n const queryIndex = url.indexOf(\"?\");\n if (queryIndex === -1) return {};\n const hashIndex = url.indexOf(\"#\", queryIndex + 1);\n const qs = hashIndex === -1 ? url.slice(queryIndex + 1) : url.slice(queryIndex + 1, hashIndex);\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 mergeRouteParamsIntoQuery(query, params) {\n return Object.assign(query, params);\n}\n\nfunction patternToNextFormat(pattern) {\n // Match any non-/ param name. Non-greedy with lookahead prevents\n // the +/* suffix being consumed into the param name when the name\n // itself contains + or * internally (e.g. :c++lang → [c++lang]).\n return pattern\n .replace(/:([^\\\\/]+?)\\\\+(?=\\\\/|$)/g, \"[...$1]\")\n .replace(/:([^\\\\/]+?)\\\\*(?=\\\\/|$)/g, \"[[...$1]]\")\n .replace(/:([^\\\\/]+?)(?=\\\\/|$)/g, \"[$1]\");\n}\n\nfunction resolveSsrManifest(manifest) {\n // Fall back to embedded manifest (set by vinext:cloudflare-build for Workers)\n return (manifest && Object.keys(manifest).length > 0)\n ? manifest\n : (typeof globalThis !== \"undefined\" && globalThis.__VINEXT_SSR_MANIFEST__) || null;\n}\n\nfunction getManifestFilesForModule(manifest, moduleId) {\n if (!manifest || !moduleId) return null;\n\n var files = manifest[moduleId];\n if (files) return files;\n\n for (var key in manifest) {\n if (moduleId.endsWith(\"/\" + key) || moduleId === key) {\n return manifest[key];\n }\n }\n return null;\n}\n\nfunction collectAssetTags(manifest, moduleIds, scriptNonce) {\n const m = resolveSsrManifest(manifest);\n const tags = [];\n const seen = new Set();\n const nonceAttr = __createNonceAttribute(scriptNonce);\n // Mirrors Next.js \\`_document\\` behaviour: when \\`experimental.disableOptimizedLoading\\`\n // is false (the default), page scripts are emitted with \\`defer\\` in <head>. See\n // .nextjs-ref/packages/next/src/pages/_document.tsx getScripts() — \\`defer={!disableOptimizedLoading}\\`.\n // vinext always emits \\`type=\"module\"\\` (which already defers implicitly), but\n // upstream tests (e.g. test/e2e/optimized-loading) assert the literal \\`defer\\`\n // attribute, and adding it preserves parity without changing browser behaviour.\n const deferAttr = vinextConfig.disableOptimizedLoading ? \"\" : \" defer\";\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\"' + nonceAttr + ' href=\"/' + entry + '\" />');\n tags.push('<script type=\"module\"' + deferAttr + nonceAttr + ' 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 = getManifestFilesForModule(m, id);\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\"' + nonceAttr + ' 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\"' + nonceAttr + ' href=\"/' + tf + '\" />');\n tags.push('<script type=\"module\"' + deferAttr + nonceAttr + ' src=\"/' + tf + '\" crossorigin></script>');\n }\n }\n }\n return tags.join(\"\\\\n \");\n}\n\nfunction resolveClientModuleUrl(manifest, moduleId) {\n const files = getManifestFilesForModule(resolveSsrManifest(manifest), moduleId);\n if (!files) return undefined;\n for (var i = 0; i < files.length; i++) {\n var file = files[i];\n if (!file || !file.endsWith(\".js\")) continue;\n if (file.charAt(0) !== \"/\") file = \"/\" + file;\n return file;\n }\n return undefined;\n}\n\nexport async function renderPage(request, url, manifest, ctx, middlewareHeaders, options) {\n if (ctx) return _runWithExecutionContext(ctx, () => _renderPage(request, url, manifest, middlewareHeaders, options));\n return _renderPage(request, url, manifest, middlewareHeaders, options);\n}\n\nasync function _renderPage(request, url, manifest, middlewareHeaders, options) {\n let isDataReq = !!(options && options.isDataReq);\n // Auto-detect /_next/data/... requests by inspecting the incoming request\n // URL. The worker pipeline does not need to know about the data endpoint\n // protocol — when it forwards an unrewritten data URL as the url arg, we\n // normalize it to the page path here.\n if (!isDataReq) {\n const __dataNorm = __normalizePagesDataRequest(request);\n if (__dataNorm.notFoundResponse) return __dataNorm.notFoundResponse;\n if (__dataNorm.isDataReq) {\n isDataReq = true;\n if (url && url.startsWith(\"/_next/data/\")) {\n const __qs = url.includes(\"?\") ? url.slice(url.indexOf(\"?\")) : \"\";\n url = __dataNorm.normalizedPathname + __qs;\n }\n }\n }\n const statusCode = options && typeof options.statusCode === \"number\" ? options.statusCode : undefined;\n const asPath = options && typeof options.asPath === \"string\" ? options.asPath : undefined;\n const renderErrorPageOnMiss = !(options && options.renderErrorPageOnMiss === false);\n // Guard against infinite recursion when the user's custom 500/error page\n // itself throws during render. When this flag is set, the catch block below\n // returns the plain \"Internal Server Error\" text response instead of trying\n // to render an error page again. Fixes #1458.\n const isInternalErrorRender = !!(options && options.__isInternalErrorRender);\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 const i18nCacheVariant = i18nConfig\n ? (localeInfo.domainLocale\n ? \"domain:\" + String(localeInfo.domainLocale.domain).toLowerCase()\n : \"locale:\" + String(locale))\n : null;\n const pageIsrCacheKey = i18nCacheVariant\n ? (router, pathname) => isrCacheKey(router, pathname + \"::i18n=\" + encodeURIComponent(i18nCacheVariant))\n : isrCacheKey;\n\n if (localeInfo.redirectUrl) {\n return new Response(null, { status: 307, headers: { Location: localeInfo.redirectUrl } });\n }\n\n // Internal error render path: caller has pinned a specific route (the\n // user's pages/500 or pages/_error) to render in response to an SSR throw.\n // Skip route matching so we don't accidentally double-route, and skip the\n // missing-route 404 fallback. See catch block below. Fixes #1458.\n let match = options && options.__forcedRoute\n ? { route: options.__forcedRoute, params: {} }\n : matchRoute(routeUrl, pageRoutes);\n let renderStatusCodeOverride = statusCode;\n let renderAsPath = asPath;\n if (!match) {\n if (isDataReq) {\n return __buildNextDataNotFoundResponse();\n }\n if (!renderErrorPageOnMiss) {\n return __buildDefaultPagesNotFoundResponse();\n }\n const notFoundMatch = matchRoute(\"/404\", pageRoutes);\n // matchRoute may match a catch-all (e.g. [...slug]); only use the explicit pages/404 route.\n if (notFoundMatch && notFoundMatch.route.pattern === \"/404\") {\n match = notFoundMatch;\n renderStatusCodeOverride = 404;\n renderAsPath = routeUrl;\n } else if (_errorPageRoute) {\n match = { route: _errorPageRoute, params: {} };\n renderStatusCodeOverride = 404;\n renderAsPath = routeUrl;\n } else {\n return __buildDefaultPagesNotFoundResponse();\n }\n }\n\n const { route, params } = match;\n const __uCtx = _createUnifiedCtx({\n executionContext: _getRequestExecutionContext(),\n });\n return _runWithUnifiedCtx(__uCtx, async () => {\n ensureFetchPatch();\n try {\n const routePattern = patternToNextFormat(route.pattern);\n const renderStatusCode = renderStatusCodeOverride ?? (routePattern === \"/404\" ? 404 : undefined);\n const query = mergeRouteParamsIntoQuery(parseQuery(routeUrl), params);\n if (typeof setSSRContext === \"function\") {\n setSSRContext({\n pathname: routePattern,\n query,\n asPath: renderAsPath || routeUrl,\n 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 if (!PageComponent) {\n return new Response(\"Page has no default export\", { status: 500 });\n }\n\n // Refs #1463: reject non-GET/HEAD methods on static (no\n // getServerSideProps) Pages routes with 405 + Allow: GET, HEAD.\n // Skip for error/status pages (/_error, /404, /500), data requests\n // (those go through the JSON envelope path and have their own shape),\n // and renders that are already an error-page miss-render override.\n // Mirrors Next.js's base-server.ts L2277 carve-outs.\n if (\n !isDataReq &&\n routePattern !== \"/_error\" &&\n routePattern !== \"/404\" &&\n routePattern !== \"/500\" &&\n renderStatusCodeOverride === undefined\n ) {\n const methodResponse = __resolvePagesPageMethodResponse({\n hasGetServerSideProps: typeof pageModule.getServerSideProps === \"function\",\n method: request.method,\n });\n if (methodResponse) {\n return methodResponse;\n }\n }\n\n const pageModuleUrl = resolveClientModuleUrl(manifest, route.filePath);\n const appModuleUrl = resolveClientModuleUrl(manifest, _appAssetPath);\n const scriptNonce = __getScriptNonceFromHeaderSources(request.headers, middlewareHeaders);\n // Build font Link header early so it's available for ISR cached responses too.\n // Font preloads are module-level state populated at import time and persist across requests.\n var _fontLinkHeader = \"\";\n var _allFp = [];\n try {\n var _fpGoogle = typeof _getSSRFontPreloadsGoogle === \"function\" ? _getSSRFontPreloadsGoogle() : [];\n var _fpLocal = typeof _getSSRFontPreloadsLocal === \"function\" ? _getSSRFontPreloadsLocal() : [];\n _allFp = _fpGoogle.concat(_fpLocal);\n if (_allFp.length > 0) {\n _fontLinkHeader = _allFp.map(function(p) { return \"<\" + p.href + \">; rel=preload; as=font; type=\" + p.type + \"; crossorigin\"; }).join(\", \");\n }\n } catch (e) { /* font preloads not available */ }\n const pageDataResult = await __resolvePagesPageData({\n isDataReq,\n applyRequestContexts() {\n if (typeof setSSRContext === \"function\") {\n setSSRContext({\n pathname: routePattern,\n query,\n asPath: renderAsPath || routeUrl,\n locale: locale,\n locales: i18nConfig ? i18nConfig.locales : undefined,\n defaultLocale: currentDefaultLocale,\n domainLocales: domainLocales,\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 buildId,\n createGsspReqRes() {\n return __createPagesReqRes({ body: undefined, query, request, url: routeUrl });\n },\n createPageElement(currentPageProps) {\n var currentElement = AppComponent\n ? React.createElement(AppComponent, { Component: PageComponent, pageProps: currentPageProps })\n : React.createElement(PageComponent, currentPageProps);\n return wrapWithRouterContext(currentElement);\n },\n fontLinkHeader: _fontLinkHeader,\n i18n: {\n locale: locale,\n locales: i18nConfig ? i18nConfig.locales : undefined,\n defaultLocale: currentDefaultLocale,\n domainLocales: domainLocales,\n },\n isrCacheKey: pageIsrCacheKey,\n isrGet,\n isrSet,\n expireSeconds: vinextConfig.expireTime,\n // The vinext build phase boots the prod server with VINEXT_PRERENDER=1\n // and fetches every statically-generated page through it. That hit is\n // the \"build\" prerender for revalidateReason; runtime hits are not.\n // Mirrors Next.js's \\`renderOpts.isBuildTimePrerendering\\`. See\n // \\`.nextjs-ref/packages/next/src/server/render.tsx\\` and\n // \\`packages/vinext/src/build/prerender.ts\\`.\n isBuildTimePrerendering: typeof process !== \"undefined\" && process.env && process.env.VINEXT_PRERENDER === \"1\",\n pageModule,\n params,\n query,\n renderIsrPassToStringAsync,\n route: {\n isDynamic: route.isDynamic,\n },\n routePattern,\n routeUrl,\n runInFreshUnifiedContext(callback) {\n var revalCtx = _createUnifiedCtx({\n executionContext: _getRequestExecutionContext(),\n });\n return _runWithUnifiedCtx(revalCtx, async () => {\n ensureFetchPatch();\n return callback();\n });\n },\n safeJsonStringify,\n sanitizeDestination: sanitizeDestinationLocal,\n scriptNonce,\n statusCode: renderStatusCode,\n triggerBackgroundRegeneration,\n vinext: {\n pageModuleUrl,\n appModuleUrl,\n hasMiddleware: __hasMiddleware,\n },\n });\n if (pageDataResult.kind === \"response\") {\n return pageDataResult.response;\n }\n let pageProps = pageDataResult.pageProps;\n if (routePattern === \"/_error\" && typeof renderStatusCode === \"number\") {\n pageProps = { ...pageProps, statusCode: renderStatusCode };\n }\n var gsspRes = pageDataResult.gsspRes;\n let isrRevalidateSeconds = pageDataResult.isrRevalidateSeconds;\n const isFallbackRender = pageDataResult.isFallback === true;\n\n // Republish the SSR context with isFallback flipped on so the page's\n // \\`useRouter().isFallback\\` returns true during render, matching Next.js's\n // \\`render.tsx\\` fallback shell. Without this, the page would still see\n // \\`isFallback: false\\` and run the non-fallback branch.\n if (isFallbackRender && typeof setSSRContext === \"function\") {\n setSSRContext({\n pathname: routePattern,\n query,\n asPath: renderAsPath || routeUrl,\n locale: locale,\n locales: i18nConfig ? i18nConfig.locales : undefined,\n defaultLocale: currentDefaultLocale,\n domainLocales: domainLocales,\n isFallback: true,\n });\n }\n\n // ── _next/data JSON envelope short-circuit ───────────────────────\n // For client-side navigations Next.js fetches /_next/data/<buildId>/<page>.json\n // and expects { pageProps } as JSON instead of the full HTML page. Skip\n // rendering the React tree and emit the JSON envelope directly via the\n // typed helper so the envelope shape stays in one place. Headers and\n // cookies set on the gsspRes by getServerSideProps are forwarded so\n // middleware/auth flows work the same as the HTML page.\n if (isDataReq) {\n const init = { headers: {} };\n if (gsspRes && typeof gsspRes.getHeaders === \"function\") {\n const gsspHeaders = gsspRes.getHeaders();\n for (const k of Object.keys(gsspHeaders)) {\n const v = gsspHeaders[k];\n if (v === undefined || v === null) continue;\n init.headers[k] = Array.isArray(v) ? v.join(\", \") : String(v);\n }\n }\n if (gsspRes) {\n // Default Cache-Control for gSSP-driven _next/data responses,\n // matching Next.js's pages-handler.ts (revalidate: 0 →\n // getCacheControlHeader). Skip when gSSP already set one via\n // res.setHeader (case-insensitive). Mirrors the HTML branch in\n // pages-page-response.ts and the dev-server branch. Fixes #1461.\n var hasUserCacheControl = false;\n for (const headerKey of Object.keys(init.headers)) {\n if (headerKey.toLowerCase() === \"cache-control\") {\n hasUserCacheControl = true;\n break;\n }\n }\n if (!hasUserCacheControl) {\n init.headers[\"Cache-Control\"] =\n \"private, no-cache, no-store, max-age=0, must-revalidate\";\n }\n }\n return __buildNextDataJsonResponse(pageProps, safeJsonStringify, init);\n }\n\n // Include both the matched page module and the global _app module\n // (if present). _app is wrapped around every page in Pages Router,\n // and any CSS/JS it imports must be linked from the rendered HTML\n // so the browser actually loads it. Without _app in this list, a\n // global stylesheet imported via import \"./globals.scss\" in\n // _app.tsx never reaches the page, producing the LHF-5 symptom\n // where styled elements render with the browser default colour.\n const pageModuleIds = [];\n if (route.filePath) pageModuleIds.push(route.filePath);\n if (_appAssetPath) pageModuleIds.push(_appAssetPath);\n const assetTags = collectAssetTags(manifest, pageModuleIds, scriptNonce);\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 // Used by \\`_document.getInitialProps\\` -> \\`ctx.renderPage\\` to wrap\n // App/Component with user-provided enhancers (e.g. styled-components,\n // emotion). Falls back to identity when no enhancers are passed.\n // \\`pageProps\\` is captured from the closure (unlike \\`createPageElement\\`\n // which takes it as a param) — \\`enhancePageElement\\` is only ever invoked\n // for this one request with this one \\`pageProps\\`, so there is no value to\n // thread through; the renderPage contract only varies the enhancers.\n enhancePageElement(renderPageOpts) {\n var FinalApp = AppComponent;\n var FinalComp = PageComponent;\n if (renderPageOpts && typeof renderPageOpts.enhanceApp === \"function\" && FinalApp) {\n FinalApp = renderPageOpts.enhanceApp(FinalApp);\n }\n if (renderPageOpts && typeof renderPageOpts.enhanceComponent === \"function\") {\n FinalComp = renderPageOpts.enhanceComponent(FinalComp);\n }\n var enhancedElement;\n if (FinalApp) {\n enhancedElement = React.createElement(FinalApp, { Component: FinalComp, pageProps: pageProps });\n } else {\n enhancedElement = React.createElement(FinalComp, pageProps);\n }\n return wrapWithRouterContext(enhancedElement);\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 getSSRHeadHTML: typeof getSSRHeadHTML === \"function\" ? getSSRHeadHTML : undefined,\n clientTraceMetadata: vinextConfig.clientTraceMetadata,\n gsspRes,\n isrCacheKey: pageIsrCacheKey,\n expireSeconds: vinextConfig.expireTime,\n isrRevalidateSeconds,\n isrSet,\n i18n: {\n locale: locale,\n locales: i18nConfig ? i18nConfig.locales : undefined,\n defaultLocale: currentDefaultLocale,\n domainLocales: domainLocales,\n },\n isFallback: isFallbackRender,\n pageProps,\n params,\n renderDocumentToString(element) {\n return renderToStringAsync(element);\n },\n renderToReadableStream(element) {\n return renderToReadableStream(element);\n },\n resetSSRHead: typeof resetSSRHead === \"function\" ? resetSSRHead : undefined,\n setDocumentInitialHead:\n typeof setDocumentInitialHead === \"function\" ? setDocumentInitialHead : undefined,\n routePattern,\n routeUrl,\n safeJsonStringify,\n scriptNonce,\n statusCode: renderStatusCode,\n vinext: {\n pageModuleUrl,\n appModuleUrl,\n hasMiddleware: __hasMiddleware,\n },\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 // Data (_next/data) requests can't render HTML, and avoid recursion if\n // we're already in the middle of rendering the error page itself.\n // Mirrors Next.js base-server.ts which renders /500 (or _error) when\n // SSR throws. Fixes #1458.\n if (!isInternalErrorRender && !isDataReq) {\n // Look for an explicit pages/500.tsx first, then fall back to _error.\n // Only match the literal /500 pattern — never a catch-all/dynamic route.\n let errorRoute = null;\n for (var __i = 0; __i < pageRoutes.length; __i++) {\n if (pageRoutes[__i].pattern === \"/500\") {\n errorRoute = pageRoutes[__i];\n break;\n }\n }\n if (!errorRoute && _errorPageRoute) {\n errorRoute = _errorPageRoute;\n }\n if (errorRoute) {\n try {\n return await _renderPage(request, url, manifest, middlewareHeaders, {\n statusCode: 500,\n asPath: url,\n renderErrorPageOnMiss: false,\n __isInternalErrorRender: true,\n __forcedRoute: errorRoute,\n });\n } catch (errorPageErr) {\n console.error(\"[vinext] Error page render failed:\", errorPageErr);\n }\n }\n }\n return new Response(\"Internal Server Error\", { status: 500 });\n }\n });\n}\n\nexport async function handleApiRoute(request, url, ctx) {\n const match = matchRoute(url, apiRoutes);\n return __handlePagesApiRoute({\n ctx,\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,13 +1,4 @@
1
1
  //#region src/entries/runtime-entry-module.d.ts
2
- /**
3
- * Convert Windows-style backslash path separators to forward slashes.
4
- *
5
- * Generated entry modules embed absolute filesystem paths inside `import`
6
- * statements. On Windows the OS-native paths use `\` which is invalid in JS
7
- * module specifiers, so every entry generator normalizes paths through this
8
- * helper before stringifying them into the emitted code.
9
- */
10
- declare function normalizePathSeparators(p: string): string;
11
2
  /**
12
3
  * Resolve a sibling module path relative to a caller's `import.meta.url`,
13
4
  * returning a forward-slash path safe for embedding in generated code.
@@ -31,5 +22,5 @@ declare function resolveEntryPath(rel: string, base: string): string;
31
22
  declare function resolveRuntimeEntryModule(name: string): string;
32
23
  declare function resolveClientRuntimeModule(name: string): string;
33
24
  //#endregion
34
- export { normalizePathSeparators, resolveClientRuntimeModule, resolveEntryPath, resolveRuntimeEntryModule };
25
+ export { resolveClientRuntimeModule, resolveEntryPath, resolveRuntimeEntryModule };
35
26
  //# sourceMappingURL=runtime-entry-module.d.ts.map
@@ -1,18 +1,8 @@
1
+ import { normalizePathSeparators } from "../utils/path.js";
1
2
  import fs from "node:fs";
2
3
  import { fileURLToPath } from "node:url";
3
4
  //#region src/entries/runtime-entry-module.ts
4
5
  /**
5
- * Convert Windows-style backslash path separators to forward slashes.
6
- *
7
- * Generated entry modules embed absolute filesystem paths inside `import`
8
- * statements. On Windows the OS-native paths use `\` which is invalid in JS
9
- * module specifiers, so every entry generator normalizes paths through this
10
- * helper before stringifying them into the emitted code.
11
- */
12
- function normalizePathSeparators(p) {
13
- return p.replace(/\\/g, "/");
14
- }
15
- /**
16
6
  * Resolve a sibling module path relative to a caller's `import.meta.url`,
17
7
  * returning a forward-slash path safe for embedding in generated code.
18
8
  *
@@ -53,6 +43,6 @@ function resolveRuntimeModulePath(directory, name) {
53
43
  return resolveEntryPath(`../${directory}/${name}.js`, import.meta.url);
54
44
  }
55
45
  //#endregion
56
- export { normalizePathSeparators, resolveClientRuntimeModule, resolveEntryPath, resolveRuntimeEntryModule };
46
+ export { resolveClientRuntimeModule, resolveEntryPath, resolveRuntimeEntryModule };
57
47
 
58
48
  //# sourceMappingURL=runtime-entry-module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-entry-module.js","names":[],"sources":["../../src/entries/runtime-entry-module.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * Convert Windows-style backslash path separators to forward slashes.\n *\n * Generated entry modules embed absolute filesystem paths inside `import`\n * statements. On Windows the OS-native paths use `\\` which is invalid in JS\n * module specifiers, so every entry generator normalizes paths through this\n * helper before stringifying them into the emitted code.\n */\nexport function normalizePathSeparators(p: string): string {\n return p.replace(/\\\\/g, \"/\");\n}\n\n/**\n * Resolve a sibling module path relative to a caller's `import.meta.url`,\n * returning a forward-slash path safe for embedding in generated code.\n *\n * This is the single place that owns the\n * `fileURLToPath(new URL(rel, base))` + path-separator normalization idiom so\n * callers don't duplicate it.\n *\n * @param rel - Relative path to the target module (e.g. `\"../server/foo.js\"`)\n * @param base - The caller's `import.meta.url`\n */\nexport function resolveEntryPath(rel: string, base: string): string {\n return normalizePathSeparators(fileURLToPath(new URL(rel, base)));\n}\n\n/**\n * Resolve a real runtime module for a virtual entry generator.\n *\n * During local development we want to point at source files (for example `.ts`),\n * while packed builds only contain emitted `.js` files in `dist/`. Probe the\n * common source/build extensions and fall back to the `.js` path that exists in\n * published packages.\n */\nexport function resolveRuntimeEntryModule(name: string): string {\n return resolveRuntimeModulePath(\"server\", name);\n}\n\nexport function resolveClientRuntimeModule(name: string): string {\n return resolveRuntimeModulePath(\"client\", name);\n}\n\nfunction resolveRuntimeModulePath(directory: \"client\" | \"server\", name: string): string {\n for (const ext of [\".ts\", \".js\", \".mts\", \".mjs\"]) {\n const filePath = resolveEntryPath(`../${directory}/${name}${ext}`, import.meta.url);\n if (fs.existsSync(filePath)) {\n return filePath;\n }\n }\n\n return resolveEntryPath(`../${directory}/${name}.js`, import.meta.url);\n}\n"],"mappings":";;;;;;;;;;;AAWA,SAAgB,wBAAwB,GAAmB;CACzD,OAAO,EAAE,QAAQ,OAAO,IAAI;;;;;;;;;;;;;AAc9B,SAAgB,iBAAiB,KAAa,MAAsB;CAClE,OAAO,wBAAwB,cAAc,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC;;;;;;;;;;AAWnE,SAAgB,0BAA0B,MAAsB;CAC9D,OAAO,yBAAyB,UAAU,KAAK;;AAGjD,SAAgB,2BAA2B,MAAsB;CAC/D,OAAO,yBAAyB,UAAU,KAAK;;AAGjD,SAAS,yBAAyB,WAAgC,MAAsB;CACtF,KAAK,MAAM,OAAO;EAAC;EAAO;EAAO;EAAQ;EAAO,EAAE;EAChD,MAAM,WAAW,iBAAiB,MAAM,UAAU,GAAG,OAAO,OAAO,OAAO,KAAK,IAAI;EACnF,IAAI,GAAG,WAAW,SAAS,EACzB,OAAO;;CAIX,OAAO,iBAAiB,MAAM,UAAU,GAAG,KAAK,MAAM,OAAO,KAAK,IAAI"}
1
+ {"version":3,"file":"runtime-entry-module.js","names":[],"sources":["../../src/entries/runtime-entry-module.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { normalizePathSeparators } from \"../utils/path.js\";\n\n/**\n * Resolve a sibling module path relative to a caller's `import.meta.url`,\n * returning a forward-slash path safe for embedding in generated code.\n *\n * This is the single place that owns the\n * `fileURLToPath(new URL(rel, base))` + path-separator normalization idiom so\n * callers don't duplicate it.\n *\n * @param rel - Relative path to the target module (e.g. `\"../server/foo.js\"`)\n * @param base - The caller's `import.meta.url`\n */\nexport function resolveEntryPath(rel: string, base: string): string {\n return normalizePathSeparators(fileURLToPath(new URL(rel, base)));\n}\n\n/**\n * Resolve a real runtime module for a virtual entry generator.\n *\n * During local development we want to point at source files (for example `.ts`),\n * while packed builds only contain emitted `.js` files in `dist/`. Probe the\n * common source/build extensions and fall back to the `.js` path that exists in\n * published packages.\n */\nexport function resolveRuntimeEntryModule(name: string): string {\n return resolveRuntimeModulePath(\"server\", name);\n}\n\nexport function resolveClientRuntimeModule(name: string): string {\n return resolveRuntimeModulePath(\"client\", name);\n}\n\nfunction resolveRuntimeModulePath(directory: \"client\" | \"server\", name: string): string {\n for (const ext of [\".ts\", \".js\", \".mts\", \".mjs\"]) {\n const filePath = resolveEntryPath(`../${directory}/${name}${ext}`, import.meta.url);\n if (fs.existsSync(filePath)) {\n return filePath;\n }\n }\n\n return resolveEntryPath(`../${directory}/${name}.js`, import.meta.url);\n}\n"],"mappings":";;;;;;;;;;;;;;;AAeA,SAAgB,iBAAiB,KAAa,MAAsB;CAClE,OAAO,wBAAwB,cAAc,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC;;;;;;;;;;AAWnE,SAAgB,0BAA0B,MAAsB;CAC9D,OAAO,yBAAyB,UAAU,KAAK;;AAGjD,SAAgB,2BAA2B,MAAsB;CAC/D,OAAO,yBAAyB,UAAU,KAAK;;AAGjD,SAAS,yBAAyB,WAAgC,MAAsB;CACtF,KAAK,MAAM,OAAO;EAAC;EAAO;EAAO;EAAQ;EAAO,EAAE;EAChD,MAAM,WAAW,iBAAiB,MAAM,UAAU,GAAG,OAAO,OAAO,OAAO,KAAK,IAAI;EACnF,IAAI,GAAG,WAAW,SAAS,EACzB,OAAO;;CAIX,OAAO,iBAAiB,MAAM,UAAU,GAAG,KAAK,MAAM,OAAO,KAAK,IAAI"}