vinext 0.0.50 → 0.0.52

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 (462) hide show
  1. package/dist/build/google-fonts/fallback-metrics-data.js +14031 -0
  2. package/dist/build/google-fonts/fallback-metrics-data.js.map +1 -0
  3. package/dist/build/google-fonts/fallback-metrics.d.ts +13 -0
  4. package/dist/build/google-fonts/fallback-metrics.js +46 -0
  5. package/dist/build/google-fonts/fallback-metrics.js.map +1 -0
  6. package/dist/build/precompress.d.ts +13 -2
  7. package/dist/build/precompress.js +23 -13
  8. package/dist/build/precompress.js.map +1 -1
  9. package/dist/build/prerender.d.ts +4 -15
  10. package/dist/build/prerender.js +83 -53
  11. package/dist/build/prerender.js.map +1 -1
  12. package/dist/build/report.d.ts +5 -4
  13. package/dist/build/report.js +196 -348
  14. package/dist/build/report.js.map +1 -1
  15. package/dist/check.js +5 -0
  16. package/dist/check.js.map +1 -1
  17. package/dist/cli-args.d.ts +1 -0
  18. package/dist/cli-args.js +5 -0
  19. package/dist/cli-args.js.map +1 -1
  20. package/dist/cli.js +99 -3
  21. package/dist/cli.js.map +1 -1
  22. package/dist/client/navigation-runtime.d.ts +47 -0
  23. package/dist/client/navigation-runtime.js +156 -0
  24. package/dist/client/navigation-runtime.js.map +1 -0
  25. package/dist/client/pages-router-link-navigation.d.ts +26 -0
  26. package/dist/client/pages-router-link-navigation.js +14 -0
  27. package/dist/client/pages-router-link-navigation.js.map +1 -0
  28. package/dist/client/vinext-next-data.d.ts +12 -2
  29. package/dist/client/vinext-next-data.js +50 -1
  30. package/dist/client/vinext-next-data.js.map +1 -0
  31. package/dist/client/window-next.d.ts +3 -1
  32. package/dist/client/window-next.js.map +1 -1
  33. package/dist/cloudflare/kv-cache-handler.js +2 -1
  34. package/dist/cloudflare/kv-cache-handler.js.map +1 -1
  35. package/dist/config/config-matchers.d.ts +63 -16
  36. package/dist/config/config-matchers.js +143 -8
  37. package/dist/config/config-matchers.js.map +1 -1
  38. package/dist/config/dotenv.d.ts +11 -1
  39. package/dist/config/dotenv.js.map +1 -1
  40. package/dist/config/next-config.d.ts +107 -5
  41. package/dist/config/next-config.js +233 -7
  42. package/dist/config/next-config.js.map +1 -1
  43. package/dist/config/tsconfig-paths.d.ts +13 -0
  44. package/dist/config/tsconfig-paths.js +117 -0
  45. package/dist/config/tsconfig-paths.js.map +1 -0
  46. package/dist/deploy.js +104 -41
  47. package/dist/deploy.js.map +1 -1
  48. package/dist/entries/app-browser-entry.d.ts +2 -2
  49. package/dist/entries/app-browser-entry.js +34 -3
  50. package/dist/entries/app-browser-entry.js.map +1 -1
  51. package/dist/entries/app-rsc-entry.d.ts +19 -1
  52. package/dist/entries/app-rsc-entry.js +89 -23
  53. package/dist/entries/app-rsc-entry.js.map +1 -1
  54. package/dist/entries/app-rsc-manifest.d.ts +10 -0
  55. package/dist/entries/app-rsc-manifest.js +57 -7
  56. package/dist/entries/app-rsc-manifest.js.map +1 -1
  57. package/dist/entries/app-ssr-entry.d.ts +3 -3
  58. package/dist/entries/app-ssr-entry.js +4 -4
  59. package/dist/entries/app-ssr-entry.js.map +1 -1
  60. package/dist/entries/pages-client-entry.js +21 -7
  61. package/dist/entries/pages-client-entry.js.map +1 -1
  62. package/dist/entries/pages-server-entry.js +77 -9
  63. package/dist/entries/pages-server-entry.js.map +1 -1
  64. package/dist/entries/runtime-entry-module.d.ts +2 -1
  65. package/dist/entries/runtime-entry-module.js +9 -3
  66. package/dist/entries/runtime-entry-module.js.map +1 -1
  67. package/dist/index.js +260 -75
  68. package/dist/index.js.map +1 -1
  69. package/dist/plugins/client-reference-dedup.d.ts +15 -2
  70. package/dist/plugins/client-reference-dedup.js +138 -16
  71. package/dist/plugins/client-reference-dedup.js.map +1 -1
  72. package/dist/plugins/css-data-url.d.ts +7 -0
  73. package/dist/plugins/css-data-url.js +81 -0
  74. package/dist/plugins/css-data-url.js.map +1 -0
  75. package/dist/plugins/fonts.d.ts +2 -2
  76. package/dist/plugins/fonts.js +20 -9
  77. package/dist/plugins/fonts.js.map +1 -1
  78. package/dist/plugins/middleware-server-only.d.ts +54 -0
  79. package/dist/plugins/middleware-server-only.js +91 -0
  80. package/dist/plugins/middleware-server-only.js.map +1 -0
  81. package/dist/plugins/optimize-imports.js +4 -4
  82. package/dist/plugins/optimize-imports.js.map +1 -1
  83. package/dist/plugins/sass.d.ts +34 -0
  84. package/dist/plugins/sass.js +22 -0
  85. package/dist/plugins/sass.js.map +1 -0
  86. package/dist/plugins/strip-server-exports.js +5 -8
  87. package/dist/plugins/strip-server-exports.js.map +1 -1
  88. package/dist/routing/app-route-graph.d.ts +50 -2
  89. package/dist/routing/app-route-graph.js +140 -16
  90. package/dist/routing/app-route-graph.js.map +1 -1
  91. package/dist/routing/app-router.d.ts +2 -2
  92. package/dist/routing/app-router.js +2 -2
  93. package/dist/routing/app-router.js.map +1 -1
  94. package/dist/routing/route-pattern.d.ts +56 -1
  95. package/dist/routing/route-pattern.js +60 -1
  96. package/dist/routing/route-pattern.js.map +1 -1
  97. package/dist/routing/utils.d.ts +2 -1
  98. package/dist/routing/utils.js +4 -1
  99. package/dist/routing/utils.js.map +1 -1
  100. package/dist/server/api-handler.js +139 -37
  101. package/dist/server/api-handler.js.map +1 -1
  102. package/dist/server/app-browser-action-result.d.ts +27 -2
  103. package/dist/server/app-browser-action-result.js +63 -2
  104. package/dist/server/app-browser-action-result.js.map +1 -1
  105. package/dist/server/app-browser-entry.js +493 -195
  106. package/dist/server/app-browser-entry.js.map +1 -1
  107. package/dist/server/app-browser-hydration.d.ts +13 -1
  108. package/dist/server/app-browser-hydration.js +9 -1
  109. package/dist/server/app-browser-hydration.js.map +1 -1
  110. package/dist/server/app-browser-interception-context.d.ts +24 -0
  111. package/dist/server/app-browser-interception-context.js +32 -0
  112. package/dist/server/app-browser-interception-context.js.map +1 -0
  113. package/dist/server/app-browser-navigation-controller.d.ts +17 -2
  114. package/dist/server/app-browser-navigation-controller.js +33 -10
  115. package/dist/server/app-browser-navigation-controller.js.map +1 -1
  116. package/dist/server/app-browser-popstate.d.ts +16 -0
  117. package/dist/server/app-browser-popstate.js +17 -0
  118. package/dist/server/app-browser-popstate.js.map +1 -0
  119. package/dist/server/app-browser-rsc-redirect.d.ts +29 -0
  120. package/dist/server/app-browser-rsc-redirect.js +37 -0
  121. package/dist/server/app-browser-rsc-redirect.js.map +1 -0
  122. package/dist/server/app-browser-state.d.ts +28 -7
  123. package/dist/server/app-browser-state.js +63 -27
  124. package/dist/server/app-browser-state.js.map +1 -1
  125. package/dist/server/app-browser-stream.d.ts +9 -17
  126. package/dist/server/app-browser-stream.js +18 -13
  127. package/dist/server/app-browser-stream.js.map +1 -1
  128. package/dist/server/app-browser-visible-commit.d.ts +7 -1
  129. package/dist/server/app-browser-visible-commit.js +39 -5
  130. package/dist/server/app-browser-visible-commit.js.map +1 -1
  131. package/dist/server/app-elements-wire.d.ts +43 -6
  132. package/dist/server/app-elements-wire.js +189 -7
  133. package/dist/server/app-elements-wire.js.map +1 -1
  134. package/dist/server/app-elements.d.ts +3 -2
  135. package/dist/server/app-elements.js +3 -2
  136. package/dist/server/app-elements.js.map +1 -1
  137. package/dist/server/app-fallback-renderer.d.ts +10 -1
  138. package/dist/server/app-fallback-renderer.js +41 -3
  139. package/dist/server/app-fallback-renderer.js.map +1 -1
  140. package/dist/server/app-history-state.d.ts +26 -0
  141. package/dist/server/app-history-state.js +53 -0
  142. package/dist/server/app-history-state.js.map +1 -0
  143. package/dist/server/app-middleware.d.ts +13 -0
  144. package/dist/server/app-middleware.js +3 -1
  145. package/dist/server/app-middleware.js.map +1 -1
  146. package/dist/server/app-optimistic-routing.d.ts +54 -0
  147. package/dist/server/app-optimistic-routing.js +200 -0
  148. package/dist/server/app-optimistic-routing.js.map +1 -0
  149. package/dist/server/app-page-boundary-render.d.ts +10 -1
  150. package/dist/server/app-page-boundary-render.js +13 -6
  151. package/dist/server/app-page-boundary-render.js.map +1 -1
  152. package/dist/server/app-page-boundary.js +3 -2
  153. package/dist/server/app-page-boundary.js.map +1 -1
  154. package/dist/server/app-page-cache.d.ts +26 -1
  155. package/dist/server/app-page-cache.js +86 -14
  156. package/dist/server/app-page-cache.js.map +1 -1
  157. package/dist/server/app-page-dispatch.d.ts +7 -0
  158. package/dist/server/app-page-dispatch.js +96 -12
  159. package/dist/server/app-page-dispatch.js.map +1 -1
  160. package/dist/server/app-page-element-builder.d.ts +7 -0
  161. package/dist/server/app-page-element-builder.js +34 -5
  162. package/dist/server/app-page-element-builder.js.map +1 -1
  163. package/dist/server/app-page-execution.d.ts +28 -1
  164. package/dist/server/app-page-execution.js +91 -7
  165. package/dist/server/app-page-execution.js.map +1 -1
  166. package/dist/server/app-page-head.d.ts +7 -0
  167. package/dist/server/app-page-head.js +23 -3
  168. package/dist/server/app-page-head.js.map +1 -1
  169. package/dist/server/app-page-probe.d.ts +23 -1
  170. package/dist/server/app-page-probe.js +29 -1
  171. package/dist/server/app-page-probe.js.map +1 -1
  172. package/dist/server/app-page-render-observation.d.ts +35 -0
  173. package/dist/server/app-page-render-observation.js +68 -0
  174. package/dist/server/app-page-render-observation.js.map +1 -0
  175. package/dist/server/app-page-render.d.ts +7 -1
  176. package/dist/server/app-page-render.js +81 -4
  177. package/dist/server/app-page-render.js.map +1 -1
  178. package/dist/server/app-page-request.d.ts +1 -0
  179. package/dist/server/app-page-request.js.map +1 -1
  180. package/dist/server/app-page-response.js +7 -5
  181. package/dist/server/app-page-response.js.map +1 -1
  182. package/dist/server/app-page-route-wiring.d.ts +3 -1
  183. package/dist/server/app-page-route-wiring.js +59 -24
  184. package/dist/server/app-page-route-wiring.js.map +1 -1
  185. package/dist/server/app-page-stream.d.ts +5 -0
  186. package/dist/server/app-page-stream.js +2 -0
  187. package/dist/server/app-page-stream.js.map +1 -1
  188. package/dist/server/app-prerender-static-params.d.ts +2 -1
  189. package/dist/server/app-prerender-static-params.js +44 -8
  190. package/dist/server/app-prerender-static-params.js.map +1 -1
  191. package/dist/server/app-route-handler-cache.d.ts +2 -2
  192. package/dist/server/app-route-handler-cache.js +3 -2
  193. package/dist/server/app-route-handler-cache.js.map +1 -1
  194. package/dist/server/app-route-handler-dispatch.d.ts +6 -1
  195. package/dist/server/app-route-handler-dispatch.js +1 -1
  196. package/dist/server/app-route-handler-dispatch.js.map +1 -1
  197. package/dist/server/app-route-handler-execution.d.ts +17 -2
  198. package/dist/server/app-route-handler-execution.js.map +1 -1
  199. package/dist/server/app-route-handler-response.js +5 -4
  200. package/dist/server/app-route-handler-response.js.map +1 -1
  201. package/dist/server/app-router-entry.js +7 -15
  202. package/dist/server/app-router-entry.js.map +1 -1
  203. package/dist/server/app-rsc-cache-busting.d.ts +19 -1
  204. package/dist/server/app-rsc-cache-busting.js +36 -1
  205. package/dist/server/app-rsc-cache-busting.js.map +1 -1
  206. package/dist/server/app-rsc-embedded-chunks.d.ts +9 -0
  207. package/dist/server/app-rsc-embedded-chunks.js +34 -0
  208. package/dist/server/app-rsc-embedded-chunks.js.map +1 -0
  209. package/dist/server/app-rsc-errors.d.ts +4 -1
  210. package/dist/server/app-rsc-errors.js +1 -1
  211. package/dist/server/app-rsc-errors.js.map +1 -1
  212. package/dist/server/app-rsc-handler.d.ts +21 -5
  213. package/dist/server/app-rsc-handler.js +38 -15
  214. package/dist/server/app-rsc-handler.js.map +1 -1
  215. package/dist/server/app-rsc-render-mode.d.ts +4 -3
  216. package/dist/server/app-rsc-render-mode.js +7 -1
  217. package/dist/server/app-rsc-render-mode.js.map +1 -1
  218. package/dist/server/app-rsc-request-normalization.d.ts +4 -1
  219. package/dist/server/app-rsc-request-normalization.js +4 -1
  220. package/dist/server/app-rsc-request-normalization.js.map +1 -1
  221. package/dist/server/app-rsc-response-finalizer.d.ts +8 -1
  222. package/dist/server/app-rsc-response-finalizer.js +10 -3
  223. package/dist/server/app-rsc-response-finalizer.js.map +1 -1
  224. package/dist/server/app-rsc-route-matching.d.ts +23 -0
  225. package/dist/server/app-rsc-route-matching.js +47 -25
  226. package/dist/server/app-rsc-route-matching.js.map +1 -1
  227. package/dist/server/app-server-action-execution.d.ts +35 -3
  228. package/dist/server/app-server-action-execution.js +87 -33
  229. package/dist/server/app-server-action-execution.js.map +1 -1
  230. package/dist/server/app-ssr-entry.d.ts +3 -0
  231. package/dist/server/app-ssr-entry.js +83 -58
  232. package/dist/server/app-ssr-entry.js.map +1 -1
  233. package/dist/server/app-ssr-error-meta.d.ts +14 -0
  234. package/dist/server/app-ssr-error-meta.js +50 -0
  235. package/dist/server/app-ssr-error-meta.js.map +1 -0
  236. package/dist/server/app-ssr-stream.d.ts +7 -2
  237. package/dist/server/app-ssr-stream.js +26 -15
  238. package/dist/server/app-ssr-stream.js.map +1 -1
  239. package/dist/server/artifact-compatibility.d.ts +13 -3
  240. package/dist/server/artifact-compatibility.js +12 -8
  241. package/dist/server/artifact-compatibility.js.map +1 -1
  242. package/dist/server/cache-headers.d.ts +7 -0
  243. package/dist/server/cache-headers.js +19 -0
  244. package/dist/server/cache-headers.js.map +1 -0
  245. package/dist/server/cache-proof.d.ts +170 -5
  246. package/dist/server/cache-proof.js +472 -18
  247. package/dist/server/cache-proof.js.map +1 -1
  248. package/dist/server/client-reuse-manifest.d.ts +99 -0
  249. package/dist/server/client-reuse-manifest.js +212 -0
  250. package/dist/server/client-reuse-manifest.js.map +1 -0
  251. package/dist/server/default-global-error-module.d.ts +20 -0
  252. package/dist/server/default-global-error-module.js +20 -0
  253. package/dist/server/default-global-error-module.js.map +1 -0
  254. package/dist/server/dev-lockfile.d.ts +110 -0
  255. package/dist/server/dev-lockfile.js +180 -0
  256. package/dist/server/dev-lockfile.js.map +1 -0
  257. package/dist/server/dev-server.d.ts +9 -1
  258. package/dist/server/dev-server.js +76 -19
  259. package/dist/server/dev-server.js.map +1 -1
  260. package/dist/server/edge-api-runtime.d.ts +5 -0
  261. package/dist/server/edge-api-runtime.js +8 -0
  262. package/dist/server/edge-api-runtime.js.map +1 -0
  263. package/dist/server/file-based-metadata.d.ts +13 -0
  264. package/dist/server/file-based-metadata.js +49 -2
  265. package/dist/server/file-based-metadata.js.map +1 -1
  266. package/dist/server/headers.d.ts +20 -1
  267. package/dist/server/headers.js +22 -2
  268. package/dist/server/headers.js.map +1 -1
  269. package/dist/server/html.js +1 -1
  270. package/dist/server/html.js.map +1 -1
  271. package/dist/server/http-error-responses.d.ts +26 -1
  272. package/dist/server/http-error-responses.js +32 -2
  273. package/dist/server/http-error-responses.js.map +1 -1
  274. package/dist/server/isr-cache.d.ts +8 -3
  275. package/dist/server/isr-cache.js +24 -6
  276. package/dist/server/isr-cache.js.map +1 -1
  277. package/dist/server/metadata-route-response.js +22 -5
  278. package/dist/server/metadata-route-response.js.map +1 -1
  279. package/dist/server/metadata-routes.js +27 -8
  280. package/dist/server/metadata-routes.js.map +1 -1
  281. package/dist/server/middleware-runtime.d.ts +15 -0
  282. package/dist/server/middleware-runtime.js +60 -7
  283. package/dist/server/middleware-runtime.js.map +1 -1
  284. package/dist/server/middleware.d.ts +13 -1
  285. package/dist/server/middleware.js +16 -2
  286. package/dist/server/middleware.js.map +1 -1
  287. package/dist/server/navigation-planner.d.ts +26 -6
  288. package/dist/server/navigation-planner.js +358 -24
  289. package/dist/server/navigation-planner.js.map +1 -1
  290. package/dist/server/navigation-trace.d.ts +9 -1
  291. package/dist/server/navigation-trace.js +8 -0
  292. package/dist/server/navigation-trace.js.map +1 -1
  293. package/dist/server/normalize-path.d.ts +2 -1
  294. package/dist/server/normalize-path.js +4 -1
  295. package/dist/server/normalize-path.js.map +1 -1
  296. package/dist/server/pages-api-route.d.ts +27 -1
  297. package/dist/server/pages-api-route.js +25 -3
  298. package/dist/server/pages-api-route.js.map +1 -1
  299. package/dist/server/pages-data-route.d.ts +77 -0
  300. package/dist/server/pages-data-route.js +97 -0
  301. package/dist/server/pages-data-route.js.map +1 -0
  302. package/dist/server/pages-i18n.d.ts +51 -1
  303. package/dist/server/pages-i18n.js +61 -1
  304. package/dist/server/pages-i18n.js.map +1 -1
  305. package/dist/server/pages-page-data.d.ts +32 -4
  306. package/dist/server/pages-page-data.js +52 -19
  307. package/dist/server/pages-page-data.js.map +1 -1
  308. package/dist/server/pages-page-response.d.ts +11 -1
  309. package/dist/server/pages-page-response.js +6 -4
  310. package/dist/server/pages-page-response.js.map +1 -1
  311. package/dist/server/prod-server.d.ts +26 -1
  312. package/dist/server/prod-server.js +150 -44
  313. package/dist/server/prod-server.js.map +1 -1
  314. package/dist/server/request-pipeline.d.ts +11 -2
  315. package/dist/server/request-pipeline.js +28 -11
  316. package/dist/server/request-pipeline.js.map +1 -1
  317. package/dist/server/seed-cache.d.ts +12 -31
  318. package/dist/server/seed-cache.js +22 -35
  319. package/dist/server/seed-cache.js.map +1 -1
  320. package/dist/server/server-action-not-found.d.ts +16 -3
  321. package/dist/server/server-action-not-found.js +27 -4
  322. package/dist/server/server-action-not-found.js.map +1 -1
  323. package/dist/server/server-globals.d.ts +5 -0
  324. package/dist/server/server-globals.js +37 -0
  325. package/dist/server/server-globals.js.map +1 -0
  326. package/dist/server/skip-cache-proof.d.ts +41 -0
  327. package/dist/server/skip-cache-proof.js +101 -0
  328. package/dist/server/skip-cache-proof.js.map +1 -0
  329. package/dist/server/static-file-cache.d.ts +1 -1
  330. package/dist/server/static-file-cache.js +7 -6
  331. package/dist/server/static-file-cache.js.map +1 -1
  332. package/dist/shims/cache-runtime.d.ts +19 -2
  333. package/dist/shims/cache-runtime.js +67 -11
  334. package/dist/shims/cache-runtime.js.map +1 -1
  335. package/dist/shims/cache.d.ts +5 -18
  336. package/dist/shims/cache.js +2 -0
  337. package/dist/shims/cache.js.map +1 -1
  338. package/dist/shims/client-locale.d.ts +15 -0
  339. package/dist/shims/client-locale.js +13 -0
  340. package/dist/shims/client-locale.js.map +1 -0
  341. package/dist/shims/default-global-error.d.ts +32 -0
  342. package/dist/shims/default-global-error.js +181 -0
  343. package/dist/shims/default-global-error.js.map +1 -0
  344. package/dist/shims/document.d.ts +59 -3
  345. package/dist/shims/document.js +36 -5
  346. package/dist/shims/document.js.map +1 -1
  347. package/dist/shims/error-boundary.d.ts +2 -2
  348. package/dist/shims/error-boundary.js +6 -8
  349. package/dist/shims/error-boundary.js.map +1 -1
  350. package/dist/shims/error.d.ts +18 -1
  351. package/dist/shims/error.js +56 -1
  352. package/dist/shims/error.js.map +1 -1
  353. package/dist/shims/fetch-cache.d.ts +4 -1
  354. package/dist/shims/fetch-cache.js +40 -5
  355. package/dist/shims/fetch-cache.js.map +1 -1
  356. package/dist/shims/font-google-base.d.ts +22 -8
  357. package/dist/shims/font-google-base.js +41 -71
  358. package/dist/shims/font-google-base.js.map +1 -1
  359. package/dist/shims/font-local.d.ts +3 -20
  360. package/dist/shims/font-local.js +23 -75
  361. package/dist/shims/font-local.js.map +1 -1
  362. package/dist/shims/font-utils.d.ts +51 -0
  363. package/dist/shims/font-utils.js +97 -0
  364. package/dist/shims/font-utils.js.map +1 -0
  365. package/dist/shims/form.js +13 -6
  366. package/dist/shims/form.js.map +1 -1
  367. package/dist/shims/hash-scroll.d.ts +7 -0
  368. package/dist/shims/hash-scroll.js +30 -0
  369. package/dist/shims/hash-scroll.js.map +1 -0
  370. package/dist/shims/headers.d.ts +8 -11
  371. package/dist/shims/headers.js +22 -2
  372. package/dist/shims/headers.js.map +1 -1
  373. package/dist/shims/image.d.ts +1 -0
  374. package/dist/shims/image.js +144 -78
  375. package/dist/shims/image.js.map +1 -1
  376. package/dist/shims/internal/app-router-context.d.ts +6 -6
  377. package/dist/shims/internal/app-router-context.js +17 -6
  378. package/dist/shims/internal/app-router-context.js.map +1 -1
  379. package/dist/shims/link-prefetch.d.ts +9 -1
  380. package/dist/shims/link-prefetch.js +11 -6
  381. package/dist/shims/link-prefetch.js.map +1 -1
  382. package/dist/shims/link.d.ts +33 -5
  383. package/dist/shims/link.js +205 -50
  384. package/dist/shims/link.js.map +1 -1
  385. package/dist/shims/metadata.d.ts +16 -30
  386. package/dist/shims/metadata.js +91 -32
  387. package/dist/shims/metadata.js.map +1 -1
  388. package/dist/shims/navigation.d.ts +164 -17
  389. package/dist/shims/navigation.js +355 -84
  390. package/dist/shims/navigation.js.map +1 -1
  391. package/dist/shims/navigation.react-server.d.ts +3 -2
  392. package/dist/shims/navigation.react-server.js +5 -2
  393. package/dist/shims/navigation.react-server.js.map +1 -1
  394. package/dist/shims/og.d.ts +18 -2
  395. package/dist/shims/og.js +49 -1
  396. package/dist/shims/og.js.map +1 -0
  397. package/dist/shims/pages-router-runtime.d.ts +7 -0
  398. package/dist/shims/pages-router-runtime.js +16 -0
  399. package/dist/shims/pages-router-runtime.js.map +1 -0
  400. package/dist/shims/request-state-types.d.ts +1 -1
  401. package/dist/shims/root-params.d.ts +3 -1
  402. package/dist/shims/root-params.js +11 -3
  403. package/dist/shims/root-params.js.map +1 -1
  404. package/dist/shims/router-state.d.ts +1 -0
  405. package/dist/shims/router-state.js.map +1 -1
  406. package/dist/shims/router.d.ts +40 -7
  407. package/dist/shims/router.js +355 -250
  408. package/dist/shims/router.js.map +1 -1
  409. package/dist/shims/script.js +110 -32
  410. package/dist/shims/script.js.map +1 -1
  411. package/dist/shims/server.d.ts +21 -4
  412. package/dist/shims/server.js +31 -10
  413. package/dist/shims/server.js.map +1 -1
  414. package/dist/shims/slot.d.ts +1 -0
  415. package/dist/shims/slot.js +45 -1
  416. package/dist/shims/slot.js.map +1 -1
  417. package/dist/shims/unified-request-context.d.ts +1 -1
  418. package/dist/shims/unified-request-context.js +2 -0
  419. package/dist/shims/unified-request-context.js.map +1 -1
  420. package/dist/shims/unrecognized-action-error.d.ts +35 -0
  421. package/dist/shims/unrecognized-action-error.js +41 -0
  422. package/dist/shims/unrecognized-action-error.js.map +1 -0
  423. package/dist/shims/url-safety.d.ts +23 -1
  424. package/dist/shims/url-safety.js +29 -2
  425. package/dist/shims/url-safety.js.map +1 -1
  426. package/dist/shims/url-utils.d.ts +21 -1
  427. package/dist/shims/url-utils.js +67 -3
  428. package/dist/shims/url-utils.js.map +1 -1
  429. package/dist/typegen.d.ts +10 -0
  430. package/dist/typegen.js +242 -0
  431. package/dist/typegen.js.map +1 -0
  432. package/dist/utils/asset-prefix.d.ts +97 -0
  433. package/dist/utils/asset-prefix.js +124 -0
  434. package/dist/utils/asset-prefix.js.map +1 -0
  435. package/dist/utils/base-path.d.ts +7 -1
  436. package/dist/utils/base-path.js +10 -1
  437. package/dist/utils/base-path.js.map +1 -1
  438. package/dist/utils/cache-control-metadata.d.ts +2 -1
  439. package/dist/utils/cache-control-metadata.js +1 -3
  440. package/dist/utils/cache-control-metadata.js.map +1 -1
  441. package/dist/utils/domain-locale.d.ts +2 -1
  442. package/dist/utils/domain-locale.js +9 -1
  443. package/dist/utils/domain-locale.js.map +1 -1
  444. package/dist/utils/lazy-chunks.d.ts +1 -1
  445. package/dist/utils/lazy-chunks.js +1 -1
  446. package/dist/utils/lazy-chunks.js.map +1 -1
  447. package/dist/utils/navigation-signal.d.ts +1 -2
  448. package/dist/utils/navigation-signal.js +1 -1
  449. package/dist/utils/navigation-signal.js.map +1 -1
  450. package/dist/utils/prerender-output-paths.d.ts +15 -0
  451. package/dist/utils/prerender-output-paths.js +24 -0
  452. package/dist/utils/prerender-output-paths.js.map +1 -0
  453. package/dist/utils/query.d.ts +17 -1
  454. package/dist/utils/query.js +36 -1
  455. package/dist/utils/query.js.map +1 -1
  456. package/dist/utils/record.d.ts +5 -0
  457. package/dist/utils/record.js +8 -0
  458. package/dist/utils/record.js.map +1 -0
  459. package/dist/utils/sorted-array.d.ts +9 -0
  460. package/dist/utils/sorted-array.js +22 -0
  461. package/dist/utils/sorted-array.js.map +1 -0
  462. package/package.json +13 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback-metrics-data.js","names":[],"sources":["../../../src/build/google-fonts/fallback-metrics-data.json"],"sourcesContent":[""],"mappings":""}
@@ -0,0 +1,13 @@
1
+ //#region src/build/google-fonts/fallback-metrics.d.ts
2
+ type AdjustFontFallback = {
3
+ fallbackFont: string;
4
+ ascentOverride: string;
5
+ descentOverride: string;
6
+ lineGapOverride: string;
7
+ sizeAdjust: string;
8
+ };
9
+ declare function getFallbackFontOverrideMetrics(fontFamily: string): AdjustFontFallback | undefined;
10
+ declare function buildFallbackFontFace(family: string, metrics: AdjustFontFallback): string;
11
+ //#endregion
12
+ export { buildFallbackFontFace, getFallbackFontOverrideMetrics };
13
+ //# sourceMappingURL=fallback-metrics.d.ts.map
@@ -0,0 +1,46 @@
1
+ import { escapeCSSString } from "../../shims/font-utils.js";
2
+ import fallback_metrics_data_default from "./fallback-metrics-data.js";
3
+ //#region src/build/google-fonts/fallback-metrics.ts
4
+ const EXPECTED_METRIC_LENGTH = 6;
5
+ const fallbackMetrics = fallback_metrics_data_default;
6
+ function formatName(value) {
7
+ return value.replace(/(?:^\w|[A-Z]|\b\w)/g, (word, index) => index === 0 ? word.toLowerCase() : word.toUpperCase()).replace(/\s+/g, "");
8
+ }
9
+ function formatOverrideValue(value) {
10
+ return Math.abs(value * 100).toFixed(2);
11
+ }
12
+ function getFallbackFontOverrideMetrics(fontFamily) {
13
+ const metric = fallbackMetrics[formatName(fontFamily)];
14
+ if (!metric || metric.length !== EXPECTED_METRIC_LENGTH) return void 0;
15
+ const [serifFlag, ascent, descent, lineGap, unitsPerEm, xWidthAvg] = metric;
16
+ if (unitsPerEm === 0) return void 0;
17
+ const fallbackFont = serifFlag === 1 ? "Times New Roman" : "Arial";
18
+ const fallbackMetric = fallbackMetrics[formatName(fallbackFont)];
19
+ if (!fallbackMetric || fallbackMetric.length !== EXPECTED_METRIC_LENGTH) return void 0;
20
+ const [, , , , fallbackUnitsPerEm, fallbackXWidthAvg] = fallbackMetric;
21
+ if (fallbackUnitsPerEm === 0) return void 0;
22
+ const mainFontAvgWidth = xWidthAvg / unitsPerEm;
23
+ const fallbackFontAvgWidth = fallbackXWidthAvg / fallbackUnitsPerEm;
24
+ const sizeAdjust = xWidthAvg && fallbackFontAvgWidth ? mainFontAvgWidth / fallbackFontAvgWidth : 1;
25
+ return {
26
+ fallbackFont,
27
+ ascentOverride: `${formatOverrideValue(ascent / (unitsPerEm * sizeAdjust))}%`,
28
+ descentOverride: `${formatOverrideValue(descent / (unitsPerEm * sizeAdjust))}%`,
29
+ lineGapOverride: `${formatOverrideValue(lineGap / (unitsPerEm * sizeAdjust))}%`,
30
+ sizeAdjust: `${formatOverrideValue(sizeAdjust)}%`
31
+ };
32
+ }
33
+ function buildFallbackFontFace(family, metrics) {
34
+ return `@font-face {
35
+ font-family: ${`'${escapeCSSString(family)} Fallback'`};
36
+ src: local("${escapeCSSString(metrics.fallbackFont)}");
37
+ ascent-override: ${metrics.ascentOverride};
38
+ descent-override: ${metrics.descentOverride};
39
+ line-gap-override: ${metrics.lineGapOverride};
40
+ size-adjust: ${metrics.sizeAdjust};
41
+ }\n`;
42
+ }
43
+ //#endregion
44
+ export { buildFallbackFontFace, getFallbackFontOverrideMetrics };
45
+
46
+ //# sourceMappingURL=fallback-metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback-metrics.js","names":["rawFallbackMetrics"],"sources":["../../../src/build/google-fonts/fallback-metrics.ts"],"sourcesContent":["// Compact fallback metrics derived from Next.js\n// `next/dist/server/capsize-font-metrics.json`.\n//\n// The tuple shape is:\n// [serifFlag, ascent, descent, lineGap, unitsPerEm, xWidthAvg]\n\nimport { escapeCSSString } from \"vinext/shims/font-utils\";\nimport rawFallbackMetrics from \"./fallback-metrics-data.json\" with { type: \"json\" };\n\ntype AdjustFontFallback = {\n fallbackFont: string;\n ascentOverride: string;\n descentOverride: string;\n lineGapOverride: string;\n sizeAdjust: string;\n};\n\nconst EXPECTED_METRIC_LENGTH = 6;\nconst fallbackMetrics: Record<string, number[]> = rawFallbackMetrics;\n\nfunction formatName(value: string): string {\n return value\n .replace(/(?:^\\w|[A-Z]|\\b\\w)/g, (word, index) =>\n index === 0 ? word.toLowerCase() : word.toUpperCase(),\n )\n .replace(/\\s+/g, \"\");\n}\n\nfunction formatOverrideValue(value: number): string {\n return Math.abs(value * 100).toFixed(2);\n}\n\nexport function getFallbackFontOverrideMetrics(fontFamily: string): AdjustFontFallback | undefined {\n const metric = fallbackMetrics[formatName(fontFamily)];\n if (!metric || metric.length !== EXPECTED_METRIC_LENGTH) return undefined;\n\n const [serifFlag, ascent, descent, lineGap, unitsPerEm, xWidthAvg] = metric;\n if (unitsPerEm === 0) return undefined;\n\n const fallbackFont = serifFlag === 1 ? \"Times New Roman\" : \"Arial\";\n const fallbackMetric = fallbackMetrics[formatName(fallbackFont)];\n if (!fallbackMetric || fallbackMetric.length !== EXPECTED_METRIC_LENGTH) return undefined;\n\n const [, , , , fallbackUnitsPerEm, fallbackXWidthAvg] = fallbackMetric;\n if (fallbackUnitsPerEm === 0) return undefined;\n\n const mainFontAvgWidth = xWidthAvg / unitsPerEm;\n const fallbackFontAvgWidth = fallbackXWidthAvg / fallbackUnitsPerEm;\n const sizeAdjust =\n xWidthAvg && fallbackFontAvgWidth ? mainFontAvgWidth / fallbackFontAvgWidth : 1;\n\n return {\n fallbackFont,\n ascentOverride: `${formatOverrideValue(ascent / (unitsPerEm * sizeAdjust))}%`,\n descentOverride: `${formatOverrideValue(descent / (unitsPerEm * sizeAdjust))}%`,\n lineGapOverride: `${formatOverrideValue(lineGap / (unitsPerEm * sizeAdjust))}%`,\n sizeAdjust: `${formatOverrideValue(sizeAdjust)}%`,\n };\n}\n\n// The fallback family name pattern '{family} Fallback' must match the name\n// constructed in createFontLoader() in shims/font-google-base.ts. Keep both\n// sites in sync to prevent silent fallback mismatches.\nexport function buildFallbackFontFace(family: string, metrics: AdjustFontFallback): string {\n const fallbackFamily = `'${escapeCSSString(family)} Fallback'`;\n return `@font-face {\n font-family: ${fallbackFamily};\n src: local(\"${escapeCSSString(metrics.fallbackFont)}\");\n ascent-override: ${metrics.ascentOverride};\n descent-override: ${metrics.descentOverride};\n line-gap-override: ${metrics.lineGapOverride};\n size-adjust: ${metrics.sizeAdjust};\n}\\n`;\n}\n"],"mappings":";;;AAiBA,MAAM,yBAAyB;AAC/B,MAAM,kBAA4CA;AAElD,SAAS,WAAW,OAAuB;CACzC,OAAO,MACJ,QAAQ,wBAAwB,MAAM,UACrC,UAAU,IAAI,KAAK,aAAa,GAAG,KAAK,aAAa,CACtD,CACA,QAAQ,QAAQ,GAAG;;AAGxB,SAAS,oBAAoB,OAAuB;CAClD,OAAO,KAAK,IAAI,QAAQ,IAAI,CAAC,QAAQ,EAAE;;AAGzC,SAAgB,+BAA+B,YAAoD;CACjG,MAAM,SAAS,gBAAgB,WAAW,WAAW;CACrD,IAAI,CAAC,UAAU,OAAO,WAAW,wBAAwB,OAAO,KAAA;CAEhE,MAAM,CAAC,WAAW,QAAQ,SAAS,SAAS,YAAY,aAAa;CACrE,IAAI,eAAe,GAAG,OAAO,KAAA;CAE7B,MAAM,eAAe,cAAc,IAAI,oBAAoB;CAC3D,MAAM,iBAAiB,gBAAgB,WAAW,aAAa;CAC/D,IAAI,CAAC,kBAAkB,eAAe,WAAW,wBAAwB,OAAO,KAAA;CAEhF,MAAM,SAAS,oBAAoB,qBAAqB;CACxD,IAAI,uBAAuB,GAAG,OAAO,KAAA;CAErC,MAAM,mBAAmB,YAAY;CACrC,MAAM,uBAAuB,oBAAoB;CACjD,MAAM,aACJ,aAAa,uBAAuB,mBAAmB,uBAAuB;CAEhF,OAAO;EACL;EACA,gBAAgB,GAAG,oBAAoB,UAAU,aAAa,YAAY,CAAC;EAC3E,iBAAiB,GAAG,oBAAoB,WAAW,aAAa,YAAY,CAAC;EAC7E,iBAAiB,GAAG,oBAAoB,WAAW,aAAa,YAAY,CAAC;EAC7E,YAAY,GAAG,oBAAoB,WAAW,CAAC;EAChD;;AAMH,SAAgB,sBAAsB,QAAgB,SAAqC;CAEzF,OAAO;iBACQ,IAFY,gBAAgB,OAAO,CAAC,YAErB;gBAChB,gBAAgB,QAAQ,aAAa,CAAC;qBACjC,QAAQ,eAAe;sBACtB,QAAQ,gBAAgB;uBACvB,QAAQ,gBAAgB;iBAC9B,QAAQ,WAAW"}
@@ -5,13 +5,24 @@ type PrecompressResult = {
5
5
  totalBrotliBytes: number;
6
6
  };
7
7
  /**
8
- * Precompress all compressible hashed assets under `clientDir/assets/`.
8
+ * Precompress all compressible hashed assets under `clientDir/<assetsDir>/`.
9
9
  *
10
10
  * Writes `.br`, `.gz`, and `.zst` files alongside each original.
11
11
  * Safe to re-run — overwrites existing compressed variants with identical
12
12
  * output, and never compresses `.br`, `.gz`, or `.zst` files themselves.
13
+ *
14
+ * `assetsDir` defaults to `"_next/static"` (Next.js's canonical convention,
15
+ * matching `resolveAssetsDir("")`). When `assetPrefix` is configured as a
16
+ * path prefix the build writes assets to a different directory (e.g.
17
+ * `"cdn/_next/static"`); callers should resolve that with
18
+ * `resolveAssetsDir(assetPrefix)` and thread it through. Without this,
19
+ * `assetPrefix` builds would walk an empty `_next/static/` directory and
20
+ * emit zero compressed variants.
13
21
  */
14
- declare function precompressAssets(clientDir: string, onProgress?: (completed: number, total: number, file: string) => void): Promise<PrecompressResult>;
22
+ declare function precompressAssets(clientDir: string, options?: {
23
+ /** Subdirectory under `clientDir` containing hashed assets. Defaults to `"_next/static"`. */assetsDir?: string;
24
+ onProgress?: (completed: number, total: number, file: string) => void;
25
+ }): Promise<PrecompressResult>;
15
26
  //#endregion
16
27
  export { precompressAssets };
17
28
  //# sourceMappingURL=precompress.d.ts.map
@@ -1,5 +1,6 @@
1
+ import { ASSET_PREFIX_URL_DIR } from "../utils/asset-prefix.js";
1
2
  import path from "node:path";
2
- import fsp from "node:fs/promises";
3
+ import fs from "node:fs/promises";
3
4
  import os from "node:os";
4
5
  import zlib from "node:zlib";
5
6
  import { promisify } from "node:util";
@@ -8,12 +9,12 @@ import { promisify } from "node:util";
8
9
  * Build-time precompression for hashed static assets.
9
10
  *
10
11
  * Generates .br (brotli q5), .gz (gzip l8), and .zst (zstd l8) files
11
- * alongside compressible assets in dist/client/assets/. Served directly by
12
- * the production server — no per-request compression needed for immutable
13
- * build output.
12
+ * alongside compressible assets in dist/client/_next/static/. Served
13
+ * directly by the production server — no per-request compression needed
14
+ * for immutable build output.
14
15
  *
15
- * Only targets assets/ (hashed, immutable) — public directory files use
16
- * on-the-fly compression since they may change between deploys.
16
+ * Only targets the hashed-asset directory (immutable) — public directory
17
+ * files use on-the-fly compression since they may change between deploys.
17
18
  */
18
19
  const brotliCompress = promisify(zlib.brotliCompress);
19
20
  const gzip = promisify(zlib.gzip);
@@ -45,7 +46,7 @@ const CONCURRENCY = Math.min(os.availableParallelism(), 8);
45
46
  async function* walkFiles(dir, base = dir) {
46
47
  let entries;
47
48
  try {
48
- entries = await fsp.readdir(dir, { withFileTypes: true });
49
+ entries = await fs.readdir(dir, { withFileTypes: true });
49
50
  } catch {
50
51
  return;
51
52
  }
@@ -56,14 +57,23 @@ async function* walkFiles(dir, base = dir) {
56
57
  }
57
58
  }
58
59
  /**
59
- * Precompress all compressible hashed assets under `clientDir/assets/`.
60
+ * Precompress all compressible hashed assets under `clientDir/<assetsDir>/`.
60
61
  *
61
62
  * Writes `.br`, `.gz`, and `.zst` files alongside each original.
62
63
  * Safe to re-run — overwrites existing compressed variants with identical
63
64
  * output, and never compresses `.br`, `.gz`, or `.zst` files themselves.
65
+ *
66
+ * `assetsDir` defaults to `"_next/static"` (Next.js's canonical convention,
67
+ * matching `resolveAssetsDir("")`). When `assetPrefix` is configured as a
68
+ * path prefix the build writes assets to a different directory (e.g.
69
+ * `"cdn/_next/static"`); callers should resolve that with
70
+ * `resolveAssetsDir(assetPrefix)` and thread it through. Without this,
71
+ * `assetPrefix` builds would walk an empty `_next/static/` directory and
72
+ * emit zero compressed variants.
64
73
  */
65
- async function precompressAssets(clientDir, onProgress) {
66
- const assetsDir = path.join(clientDir, "assets");
74
+ async function precompressAssets(clientDir, options = {}) {
75
+ const { assetsDir: assetsSubdir = ASSET_PREFIX_URL_DIR, onProgress } = options;
76
+ const assetsDir = path.join(clientDir, assetsSubdir);
67
77
  const result = {
68
78
  filesCompressed: 0,
69
79
  totalOriginalBytes: 0,
@@ -79,13 +89,13 @@ async function precompressAssets(clientDir, onProgress) {
79
89
  for (let i = 0; i < filePaths.length; i += CONCURRENCY) {
80
90
  const chunk = filePaths.slice(i, i + CONCURRENCY);
81
91
  await Promise.all(chunk.map(async (fullPath) => {
82
- const content = await fsp.readFile(fullPath);
92
+ const content = await fs.readFile(fullPath);
83
93
  if (content.length < MIN_SIZE) return;
84
94
  const compressions = [brotliCompress(content, { params: { [zlib.constants.BROTLI_PARAM_QUALITY]: 5 } }), gzip(content, { level: 8 })];
85
95
  if (zstdCompress) compressions.push(zstdCompress(content, { params: { [zlib.constants.ZSTD_c_compressionLevel]: 8 } }));
86
96
  const [brContent, gzContent, zstdContent] = await Promise.all(compressions);
87
- const writes = [fsp.writeFile(fullPath + ".br", brContent), fsp.writeFile(fullPath + ".gz", gzContent)];
88
- if (zstdContent) writes.push(fsp.writeFile(fullPath + ".zst", zstdContent));
97
+ const writes = [fs.writeFile(fullPath + ".br", brContent), fs.writeFile(fullPath + ".gz", gzContent)];
98
+ if (zstdContent) writes.push(fs.writeFile(fullPath + ".zst", zstdContent));
89
99
  await Promise.all(writes);
90
100
  result.filesCompressed++;
91
101
  result.totalOriginalBytes += content.length;
@@ -1 +1 @@
1
- {"version":3,"file":"precompress.js","names":[],"sources":["../../src/build/precompress.ts"],"sourcesContent":["/**\n * Build-time precompression for hashed static assets.\n *\n * Generates .br (brotli q5), .gz (gzip l8), and .zst (zstd l8) files\n * alongside compressible assets in dist/client/assets/. Served directly by\n * the production server — no per-request compression needed for immutable\n * build output.\n *\n * Only targets assets/ (hashed, immutable) — public directory files use\n * on-the-fly compression since they may change between deploys.\n */\nimport fsp from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport zlib from \"node:zlib\";\nimport { promisify } from \"node:util\";\n\nconst brotliCompress = promisify(zlib.brotliCompress);\nconst gzip = promisify(zlib.gzip);\nconst zstdCompress = typeof zlib.zstdCompress === \"function\" ? promisify(zlib.zstdCompress) : null;\n\n/** File extensions worth compressing (text-based, not already compressed). */\nconst COMPRESSIBLE_EXTENSIONS = new Set([\n \".js\",\n \".mjs\",\n \".css\",\n \".html\",\n \".json\",\n \".xml\",\n \".svg\",\n \".txt\",\n \".map\",\n \".wasm\",\n]);\n\n/** Below this size, compression overhead exceeds savings. */\nconst MIN_SIZE = 1024;\n\n/**\n * Past ~8 parallel files, mixed-size asset sets spend more time queueing zlib\n * work than making forward progress. Keep the batch size bounded even on\n * higher-core machines.\n */\nconst CONCURRENCY = Math.min(os.availableParallelism(), 8);\n\ntype PrecompressResult = {\n filesCompressed: number;\n totalOriginalBytes: number;\n /** Sum of brotli-compressed sizes (used for compression ratio reporting). */\n totalBrotliBytes: number;\n};\n\n/**\n * Walk a directory recursively, yielding relative paths for regular files.\n */\nasync function* walkFiles(dir: string, base: string = dir): AsyncGenerator<string> {\n let entries;\n try {\n entries = await fsp.readdir(dir, { withFileTypes: true });\n } catch {\n return; // directory doesn't exist\n }\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n yield* walkFiles(fullPath, base);\n } else if (entry.isFile()) {\n yield path.relative(base, fullPath);\n }\n }\n}\n\n/**\n * Precompress all compressible hashed assets under `clientDir/assets/`.\n *\n * Writes `.br`, `.gz`, and `.zst` files alongside each original.\n * Safe to re-run — overwrites existing compressed variants with identical\n * output, and never compresses `.br`, `.gz`, or `.zst` files themselves.\n */\nexport async function precompressAssets(\n clientDir: string,\n onProgress?: (completed: number, total: number, file: string) => void,\n): Promise<PrecompressResult> {\n const assetsDir = path.join(clientDir, \"assets\");\n const result: PrecompressResult = {\n filesCompressed: 0,\n totalOriginalBytes: 0,\n totalBrotliBytes: 0,\n };\n\n // Collect compressible file paths, then read + compress in bounded chunks\n // to keep peak memory at O(CONCURRENCY * max_file_size) instead of\n // O(total_assets).\n const filePaths: string[] = [];\n\n for await (const relativePath of walkFiles(assetsDir)) {\n const ext = path.extname(relativePath).toLowerCase();\n\n if (!COMPRESSIBLE_EXTENSIONS.has(ext)) continue;\n // .br/.gz/.zst are intentionally absent from COMPRESSIBLE_EXTENSIONS, so\n // precompressed variants generated by a previous run are never re-compressed.\n\n filePaths.push(path.join(assetsDir, relativePath));\n }\n\n let processed = 0;\n for (let i = 0; i < filePaths.length; i += CONCURRENCY) {\n const chunk = filePaths.slice(i, i + CONCURRENCY);\n await Promise.all(\n chunk.map(async (fullPath) => {\n const content = await fsp.readFile(fullPath);\n // readFile already done before this check — stat()-first would save\n // the read for tiny files but costs an extra syscall per file;\n // sub-1KB hashed assets are rare enough that read-first is cheaper.\n if (content.length < MIN_SIZE) return;\n\n // Compress all variants concurrently within each file\n const compressions: Promise<Buffer>[] = [\n brotliCompress(content, {\n params: { [zlib.constants.BROTLI_PARAM_QUALITY]: 5 },\n }),\n gzip(content, { level: 8 }),\n ];\n if (zstdCompress) {\n compressions.push(\n zstdCompress(content, {\n params: { [zlib.constants.ZSTD_c_compressionLevel]: 8 },\n }),\n );\n }\n\n const results = await Promise.all(compressions);\n const [brContent, gzContent, zstdContent] = results;\n\n const writes = [\n fsp.writeFile(fullPath + \".br\", brContent),\n fsp.writeFile(fullPath + \".gz\", gzContent),\n ];\n if (zstdContent) {\n writes.push(fsp.writeFile(fullPath + \".zst\", zstdContent));\n }\n await Promise.all(writes);\n\n // Increment counters only after all writes succeed, so partial\n // failures (e.g. ENOSPC mid-write) don't inflate the reported totals.\n result.filesCompressed++;\n result.totalOriginalBytes += content.length;\n result.totalBrotliBytes += brContent.length;\n }),\n );\n // Report progress once per chunk to avoid non-deterministic ordering\n // within Promise.all (smaller files complete before larger ones).\n // Progress tracks all files (including skipped ones below MIN_SIZE),\n // which differs from filesCompressed (only files actually compressed).\n processed += chunk.length;\n onProgress?.(processed, filePaths.length, path.basename(chunk[chunk.length - 1]));\n }\n\n return result;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAiBA,MAAM,iBAAiB,UAAU,KAAK,eAAe;AACrD,MAAM,OAAO,UAAU,KAAK,KAAK;AACjC,MAAM,eAAe,OAAO,KAAK,iBAAiB,aAAa,UAAU,KAAK,aAAa,GAAG;;AAG9F,MAAM,0BAA0B,IAAI,IAAI;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;;AAGF,MAAM,WAAW;;;;;;AAOjB,MAAM,cAAc,KAAK,IAAI,GAAG,sBAAsB,EAAE,EAAE;;;;AAY1D,gBAAgB,UAAU,KAAa,OAAe,KAA6B;CACjF,IAAI;CACJ,IAAI;EACF,UAAU,MAAM,IAAI,QAAQ,KAAK,EAAE,eAAe,MAAM,CAAC;SACnD;EACN;;CAEF,KAAK,MAAM,SAAS,SAAS;EAC3B,MAAM,WAAW,KAAK,KAAK,KAAK,MAAM,KAAK;EAC3C,IAAI,MAAM,aAAa,EACrB,OAAO,UAAU,UAAU,KAAK;OAC3B,IAAI,MAAM,QAAQ,EACvB,MAAM,KAAK,SAAS,MAAM,SAAS;;;;;;;;;;AAYzC,eAAsB,kBACpB,WACA,YAC4B;CAC5B,MAAM,YAAY,KAAK,KAAK,WAAW,SAAS;CAChD,MAAM,SAA4B;EAChC,iBAAiB;EACjB,oBAAoB;EACpB,kBAAkB;EACnB;CAKD,MAAM,YAAsB,EAAE;CAE9B,WAAW,MAAM,gBAAgB,UAAU,UAAU,EAAE;EACrD,MAAM,MAAM,KAAK,QAAQ,aAAa,CAAC,aAAa;EAEpD,IAAI,CAAC,wBAAwB,IAAI,IAAI,EAAE;EAIvC,UAAU,KAAK,KAAK,KAAK,WAAW,aAAa,CAAC;;CAGpD,IAAI,YAAY;CAChB,KAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK,aAAa;EACtD,MAAM,QAAQ,UAAU,MAAM,GAAG,IAAI,YAAY;EACjD,MAAM,QAAQ,IACZ,MAAM,IAAI,OAAO,aAAa;GAC5B,MAAM,UAAU,MAAM,IAAI,SAAS,SAAS;GAI5C,IAAI,QAAQ,SAAS,UAAU;GAG/B,MAAM,eAAkC,CACtC,eAAe,SAAS,EACtB,QAAQ,GAAG,KAAK,UAAU,uBAAuB,GAAG,EACrD,CAAC,EACF,KAAK,SAAS,EAAE,OAAO,GAAG,CAAC,CAC5B;GACD,IAAI,cACF,aAAa,KACX,aAAa,SAAS,EACpB,QAAQ,GAAG,KAAK,UAAU,0BAA0B,GAAG,EACxD,CAAC,CACH;GAIH,MAAM,CAAC,WAAW,WAAW,eAAe,MADtB,QAAQ,IAAI,aAAa;GAG/C,MAAM,SAAS,CACb,IAAI,UAAU,WAAW,OAAO,UAAU,EAC1C,IAAI,UAAU,WAAW,OAAO,UAAU,CAC3C;GACD,IAAI,aACF,OAAO,KAAK,IAAI,UAAU,WAAW,QAAQ,YAAY,CAAC;GAE5D,MAAM,QAAQ,IAAI,OAAO;GAIzB,OAAO;GACP,OAAO,sBAAsB,QAAQ;GACrC,OAAO,oBAAoB,UAAU;IACrC,CACH;EAKD,aAAa,MAAM;EACnB,aAAa,WAAW,UAAU,QAAQ,KAAK,SAAS,MAAM,MAAM,SAAS,GAAG,CAAC;;CAGnF,OAAO"}
1
+ {"version":3,"file":"precompress.js","names":["fsp"],"sources":["../../src/build/precompress.ts"],"sourcesContent":["/**\n * Build-time precompression for hashed static assets.\n *\n * Generates .br (brotli q5), .gz (gzip l8), and .zst (zstd l8) files\n * alongside compressible assets in dist/client/_next/static/. Served\n * directly by the production server — no per-request compression needed\n * for immutable build output.\n *\n * Only targets the hashed-asset directory (immutable) — public directory\n * files use on-the-fly compression since they may change between deploys.\n */\nimport fsp from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport zlib from \"node:zlib\";\nimport { promisify } from \"node:util\";\nimport { ASSET_PREFIX_URL_DIR } from \"../utils/asset-prefix.js\";\n\nconst brotliCompress = promisify(zlib.brotliCompress);\nconst gzip = promisify(zlib.gzip);\nconst zstdCompress = typeof zlib.zstdCompress === \"function\" ? promisify(zlib.zstdCompress) : null;\n\n/** File extensions worth compressing (text-based, not already compressed). */\nconst COMPRESSIBLE_EXTENSIONS = new Set([\n \".js\",\n \".mjs\",\n \".css\",\n \".html\",\n \".json\",\n \".xml\",\n \".svg\",\n \".txt\",\n \".map\",\n \".wasm\",\n]);\n\n/** Below this size, compression overhead exceeds savings. */\nconst MIN_SIZE = 1024;\n\n/**\n * Past ~8 parallel files, mixed-size asset sets spend more time queueing zlib\n * work than making forward progress. Keep the batch size bounded even on\n * higher-core machines.\n */\nconst CONCURRENCY = Math.min(os.availableParallelism(), 8);\n\ntype PrecompressResult = {\n filesCompressed: number;\n totalOriginalBytes: number;\n /** Sum of brotli-compressed sizes (used for compression ratio reporting). */\n totalBrotliBytes: number;\n};\n\n/**\n * Walk a directory recursively, yielding relative paths for regular files.\n */\nasync function* walkFiles(dir: string, base: string = dir): AsyncGenerator<string> {\n let entries;\n try {\n entries = await fsp.readdir(dir, { withFileTypes: true });\n } catch {\n return; // directory doesn't exist\n }\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n yield* walkFiles(fullPath, base);\n } else if (entry.isFile()) {\n yield path.relative(base, fullPath);\n }\n }\n}\n\n/**\n * Precompress all compressible hashed assets under `clientDir/<assetsDir>/`.\n *\n * Writes `.br`, `.gz`, and `.zst` files alongside each original.\n * Safe to re-run — overwrites existing compressed variants with identical\n * output, and never compresses `.br`, `.gz`, or `.zst` files themselves.\n *\n * `assetsDir` defaults to `\"_next/static\"` (Next.js's canonical convention,\n * matching `resolveAssetsDir(\"\")`). When `assetPrefix` is configured as a\n * path prefix the build writes assets to a different directory (e.g.\n * `\"cdn/_next/static\"`); callers should resolve that with\n * `resolveAssetsDir(assetPrefix)` and thread it through. Without this,\n * `assetPrefix` builds would walk an empty `_next/static/` directory and\n * emit zero compressed variants.\n */\nexport async function precompressAssets(\n clientDir: string,\n options: {\n /** Subdirectory under `clientDir` containing hashed assets. Defaults to `\"_next/static\"`. */\n assetsDir?: string;\n onProgress?: (completed: number, total: number, file: string) => void;\n } = {},\n): Promise<PrecompressResult> {\n const { assetsDir: assetsSubdir = ASSET_PREFIX_URL_DIR, onProgress } = options;\n const assetsDir = path.join(clientDir, assetsSubdir);\n const result: PrecompressResult = {\n filesCompressed: 0,\n totalOriginalBytes: 0,\n totalBrotliBytes: 0,\n };\n\n // Collect compressible file paths, then read + compress in bounded chunks\n // to keep peak memory at O(CONCURRENCY * max_file_size) instead of\n // O(total_assets).\n const filePaths: string[] = [];\n\n for await (const relativePath of walkFiles(assetsDir)) {\n const ext = path.extname(relativePath).toLowerCase();\n\n if (!COMPRESSIBLE_EXTENSIONS.has(ext)) continue;\n // .br/.gz/.zst are intentionally absent from COMPRESSIBLE_EXTENSIONS, so\n // precompressed variants generated by a previous run are never re-compressed.\n\n filePaths.push(path.join(assetsDir, relativePath));\n }\n\n let processed = 0;\n for (let i = 0; i < filePaths.length; i += CONCURRENCY) {\n const chunk = filePaths.slice(i, i + CONCURRENCY);\n await Promise.all(\n chunk.map(async (fullPath) => {\n const content = await fsp.readFile(fullPath);\n // readFile already done before this check — stat()-first would save\n // the read for tiny files but costs an extra syscall per file;\n // sub-1KB hashed assets are rare enough that read-first is cheaper.\n if (content.length < MIN_SIZE) return;\n\n // Compress all variants concurrently within each file\n const compressions: Promise<Buffer>[] = [\n brotliCompress(content, {\n params: { [zlib.constants.BROTLI_PARAM_QUALITY]: 5 },\n }),\n gzip(content, { level: 8 }),\n ];\n if (zstdCompress) {\n compressions.push(\n zstdCompress(content, {\n params: { [zlib.constants.ZSTD_c_compressionLevel]: 8 },\n }),\n );\n }\n\n const results = await Promise.all(compressions);\n const [brContent, gzContent, zstdContent] = results;\n\n const writes = [\n fsp.writeFile(fullPath + \".br\", brContent),\n fsp.writeFile(fullPath + \".gz\", gzContent),\n ];\n if (zstdContent) {\n writes.push(fsp.writeFile(fullPath + \".zst\", zstdContent));\n }\n await Promise.all(writes);\n\n // Increment counters only after all writes succeed, so partial\n // failures (e.g. ENOSPC mid-write) don't inflate the reported totals.\n result.filesCompressed++;\n result.totalOriginalBytes += content.length;\n result.totalBrotliBytes += brContent.length;\n }),\n );\n // Report progress once per chunk to avoid non-deterministic ordering\n // within Promise.all (smaller files complete before larger ones).\n // Progress tracks all files (including skipped ones below MIN_SIZE),\n // which differs from filesCompressed (only files actually compressed).\n processed += chunk.length;\n onProgress?.(processed, filePaths.length, path.basename(chunk[chunk.length - 1]));\n }\n\n return result;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkBA,MAAM,iBAAiB,UAAU,KAAK,eAAe;AACrD,MAAM,OAAO,UAAU,KAAK,KAAK;AACjC,MAAM,eAAe,OAAO,KAAK,iBAAiB,aAAa,UAAU,KAAK,aAAa,GAAG;;AAG9F,MAAM,0BAA0B,IAAI,IAAI;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;;AAGF,MAAM,WAAW;;;;;;AAOjB,MAAM,cAAc,KAAK,IAAI,GAAG,sBAAsB,EAAE,EAAE;;;;AAY1D,gBAAgB,UAAU,KAAa,OAAe,KAA6B;CACjF,IAAI;CACJ,IAAI;EACF,UAAU,MAAMA,GAAI,QAAQ,KAAK,EAAE,eAAe,MAAM,CAAC;SACnD;EACN;;CAEF,KAAK,MAAM,SAAS,SAAS;EAC3B,MAAM,WAAW,KAAK,KAAK,KAAK,MAAM,KAAK;EAC3C,IAAI,MAAM,aAAa,EACrB,OAAO,UAAU,UAAU,KAAK;OAC3B,IAAI,MAAM,QAAQ,EACvB,MAAM,KAAK,SAAS,MAAM,SAAS;;;;;;;;;;;;;;;;;;AAoBzC,eAAsB,kBACpB,WACA,UAII,EAAE,EACsB;CAC5B,MAAM,EAAE,WAAW,eAAe,sBAAsB,eAAe;CACvE,MAAM,YAAY,KAAK,KAAK,WAAW,aAAa;CACpD,MAAM,SAA4B;EAChC,iBAAiB;EACjB,oBAAoB;EACpB,kBAAkB;EACnB;CAKD,MAAM,YAAsB,EAAE;CAE9B,WAAW,MAAM,gBAAgB,UAAU,UAAU,EAAE;EACrD,MAAM,MAAM,KAAK,QAAQ,aAAa,CAAC,aAAa;EAEpD,IAAI,CAAC,wBAAwB,IAAI,IAAI,EAAE;EAIvC,UAAU,KAAK,KAAK,KAAK,WAAW,aAAa,CAAC;;CAGpD,IAAI,YAAY;CAChB,KAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK,aAAa;EACtD,MAAM,QAAQ,UAAU,MAAM,GAAG,IAAI,YAAY;EACjD,MAAM,QAAQ,IACZ,MAAM,IAAI,OAAO,aAAa;GAC5B,MAAM,UAAU,MAAMA,GAAI,SAAS,SAAS;GAI5C,IAAI,QAAQ,SAAS,UAAU;GAG/B,MAAM,eAAkC,CACtC,eAAe,SAAS,EACtB,QAAQ,GAAG,KAAK,UAAU,uBAAuB,GAAG,EACrD,CAAC,EACF,KAAK,SAAS,EAAE,OAAO,GAAG,CAAC,CAC5B;GACD,IAAI,cACF,aAAa,KACX,aAAa,SAAS,EACpB,QAAQ,GAAG,KAAK,UAAU,0BAA0B,GAAG,EACxD,CAAC,CACH;GAIH,MAAM,CAAC,WAAW,WAAW,eAAe,MADtB,QAAQ,IAAI,aAAa;GAG/C,MAAM,SAAS,CACbA,GAAI,UAAU,WAAW,OAAO,UAAU,EAC1CA,GAAI,UAAU,WAAW,OAAO,UAAU,CAC3C;GACD,IAAI,aACF,OAAO,KAAKA,GAAI,UAAU,WAAW,QAAQ,YAAY,CAAC;GAE5D,MAAM,QAAQ,IAAI,OAAO;GAIzB,OAAO;GACP,OAAO,sBAAsB,QAAQ;GACrC,OAAO,oBAAoB,UAAU;IACrC,CACH;EAKD,aAAa,MAAM;EACnB,aAAa,WAAW,UAAU,QAAQ,KAAK,SAAS,MAAM,MAAM,SAAS,GAAG,CAAC;;CAGnF,OAAO"}
@@ -122,16 +122,11 @@ type PrerenderAppOptionsInternal = PrerenderAppOptions & {
122
122
  * Safe regex usage: safeJsonStringify (used by createRscEmbedTransform) escapes
123
123
  * all '<' and '>' in the embedded JSON, preventing false </script> matches.
124
124
  */
125
- declare function extractRscPayloadFromPrerenderedHtml(html: string): string | null;
126
- /**
127
- * Determine the HTML output file path for a URL.
128
- * Respects trailingSlash config.
129
- */
130
- declare function getOutputPath(urlPath: string, trailingSlash: boolean): string;
125
+ declare function extractRscPayloadFromPrerenderedHtml(html: string): Uint8Array | null;
131
126
  /** Map of route patterns to generateStaticParams functions (or null/undefined). */
132
127
  type StaticParamsMap = Record<string, ((opts: {
133
128
  params: Record<string, string | string[]>;
134
- }) => Promise<Record<string, string | string[]>[]>) | null | undefined>;
129
+ }) => Promise<unknown>) | null | undefined>;
135
130
  /**
136
131
  * Resolve parent dynamic segment params for a route.
137
132
  * Handles top-down generateStaticParams resolution for nested dynamic routes.
@@ -139,7 +134,7 @@ type StaticParamsMap = Record<string, ((opts: {
139
134
  * Uses the `staticParamsMap` (pattern → generateStaticParams) exported from
140
135
  * the production bundle.
141
136
  */
142
- declare function resolveParentParams(childRoute: AppRoute, routeIndex: ReadonlyMap<string, AppRoute>, staticParamsMap: StaticParamsMap): Promise<Record<string, string | string[]>[]>;
137
+ declare function resolveParentParams(childRoute: AppRoute, staticParamsMap: StaticParamsMap): Promise<Record<string, string | string[]>[]>;
143
138
  /**
144
139
  * Run the prerender phase for Pages Router.
145
140
  *
@@ -187,12 +182,6 @@ declare function prerenderApp({
187
182
  rscBundlePath,
188
183
  ...options
189
184
  }: PrerenderAppOptionsInternal): Promise<PrerenderResult>;
190
- /**
191
- * Determine the RSC output file path for a URL.
192
- * "/blog/hello-world" → "blog/hello-world.rsc"
193
- * "/" → "index.rsc"
194
- */
195
- declare function getRscOutputPath(urlPath: string): string;
196
185
  /**
197
186
  * Write `vinext-prerender.json` to `outDir`.
198
187
  *
@@ -205,5 +194,5 @@ declare function writePrerenderIndex(routes: PrerenderRouteResult[], outDir: str
205
194
  trailingSlash?: boolean;
206
195
  }): void;
207
196
  //#endregion
208
- export { PrerenderResult, PrerenderRouteResult, StaticParamsMap, extractRscPayloadFromPrerenderedHtml, getOutputPath, getRscOutputPath, prerenderApp, prerenderPages, readPrerenderSecret, resolveParentParams, writePrerenderIndex };
197
+ export { PrerenderResult, PrerenderRouteResult, StaticParamsMap, extractRscPayloadFromPrerenderedHtml, prerenderApp, prerenderPages, readPrerenderSecret, resolveParentParams, writePrerenderIndex };
209
198
  //# sourceMappingURL=prerender.d.ts.map
@@ -1,9 +1,13 @@
1
1
  import { createValidFileMatcher, findFileWithExtensions } from "../routing/file-matcher.js";
2
2
  import { VINEXT_PRERENDER_SECRET_HEADER } from "../server/headers.js";
3
+ import { normalizeStaticPathsEntry } from "../routing/route-pattern.js";
3
4
  import { headersContextFromRequest, runWithHeadersContext } from "../shims/headers.js";
4
5
  import { NoOpCacheHandler, _consumeRequestScopedCacheLife, getCacheHandler, setCacheHandler } from "../shims/cache.js";
5
6
  import { classifyAppRoute, classifyPagesRoute, getAppRouteRenderEntryPath } from "./report.js";
7
+ import { concatUint8Arrays, decodeRscEmbeddedChunk } from "../server/app-rsc-embedded-chunks.js";
8
+ import { navigationRuntimeRscBootstrapExpression } from "../server/app-ssr-stream.js";
6
9
  import { readPrerenderSecret } from "./server-manifest.js";
10
+ import { getOutputPath, getRscOutputPath } from "../utils/prerender-output-paths.js";
7
11
  import { startProdServer } from "../server/prod-server.js";
8
12
  import fs from "node:fs";
9
13
  import path from "node:path";
@@ -32,9 +36,12 @@ function getErrorMessageWithStack(err) {
32
36
  /** Sentinel path used to trigger 404 rendering without a real route match. */
33
37
  const NOT_FOUND_SENTINEL_PATH = "/__vinext_nonexistent_for_404__";
34
38
  const DEFAULT_CONCURRENCY = Math.min(os.availableParallelism(), 8);
35
- const RSC_CHUNK_SCRIPT_PREFIX = "self.__VINEXT_RSC_CHUNKS__=self.__VINEXT_RSC_CHUNKS__||[];";
36
- const RSC_DONE_MARKER = "__VINEXT_RSC_DONE__=true";
37
- const RSC_CHUNK_FULL_PREFIX = `${RSC_CHUNK_SCRIPT_PREFIX}self.__VINEXT_RSC_CHUNKS__.push(`;
39
+ const RSC_LEGACY_CHUNK_SCRIPT_PREFIX = "self.__VINEXT_RSC_CHUNKS__=self.__VINEXT_RSC_CHUNKS__||[];";
40
+ const RSC_LEGACY_DONE_SCRIPT = "self.__VINEXT_RSC_DONE__=true";
41
+ const RSC_LEGACY_CHUNK_FULL_PREFIX = `${RSC_LEGACY_CHUNK_SCRIPT_PREFIX}self.__VINEXT_RSC_CHUNKS__.push(`;
42
+ const RSC_RUNTIME_BOOTSTRAP_EXPRESSION = navigationRuntimeRscBootstrapExpression();
43
+ const RSC_RUNTIME_CHUNK_FULL_PREFIX = `${RSC_RUNTIME_BOOTSTRAP_EXPRESSION}.rsc.push(`;
44
+ const RSC_RUNTIME_DONE_SCRIPT = `${RSC_RUNTIME_BOOTSTRAP_EXPRESSION}.done=true`;
38
45
  /**
39
46
  * Reconstruct the RSC payload from a prerender HTML response by parsing the
40
47
  * inline bootstrap chunk scripts emitted by createRscEmbedTransform.
@@ -57,35 +64,40 @@ function extractRscPayloadFromPrerenderedHtml(html) {
57
64
  let match;
58
65
  while ((match = scriptPattern.exec(html)) !== null) {
59
66
  const script = (match[1] ?? "").trim().replace(/;$/, "");
60
- if (script === `self.${RSC_DONE_MARKER}`) {
67
+ if (script === RSC_RUNTIME_DONE_SCRIPT || script === RSC_LEGACY_DONE_SCRIPT) {
61
68
  sawDone = true;
62
69
  continue;
63
70
  }
64
- if (script.startsWith(RSC_CHUNK_SCRIPT_PREFIX)) chunks.push(parseRscChunkPushArgument(script));
71
+ if (script.startsWith(RSC_RUNTIME_CHUNK_FULL_PREFIX)) {
72
+ chunks.push(decodeRscEmbeddedChunk(parseRscChunkPushArgument(script, RSC_RUNTIME_CHUNK_FULL_PREFIX)));
73
+ continue;
74
+ }
75
+ if (script.startsWith(RSC_LEGACY_CHUNK_SCRIPT_PREFIX)) chunks.push(decodeRscEmbeddedChunk(parseRscChunkPushArgument(script, RSC_LEGACY_CHUNK_FULL_PREFIX)));
65
76
  }
66
77
  if (chunks.length === 0 && !sawDone) return null;
67
78
  if (chunks.length === 0) throw new Error("[vinext] Malformed prerender RSC embed: done marker present without chunk scripts");
68
- if (!sawDone) throw new Error("[vinext] Malformed prerender RSC embed: missing __VINEXT_RSC_DONE__ marker");
69
- return chunks.join("");
79
+ if (!sawDone) throw new Error("[vinext] Malformed prerender RSC embed: missing RSC done marker");
80
+ return concatUint8Arrays(chunks);
70
81
  }
71
82
  /**
72
- * Parse the JSON-string argument of a single chunk-push script. The script
83
+ * Parse the JSON argument of a single chunk-push script. The script
73
84
  * shape is exactly `<prefix>(<safeJsonStringify(chunk)>)` because the writer
74
85
  * concatenates those literals — so the body always starts with the full
75
86
  * prefix and ends with `)`. JSON.parse on the slice catches any tampering or
76
87
  * trailing code.
77
88
  */
78
- function parseRscChunkPushArgument(script) {
79
- if (!script.startsWith(RSC_CHUNK_FULL_PREFIX) || !script.endsWith(")")) throw new Error("[vinext] Malformed prerender RSC embed: unexpected chunk script shape");
80
- const jsonSource = script.slice(RSC_CHUNK_FULL_PREFIX.length, -1);
89
+ function parseRscChunkPushArgument(script, chunkPrefix) {
90
+ if (!script.startsWith(chunkPrefix) || !script.endsWith(")")) throw new Error("[vinext] Malformed prerender RSC embed: unexpected chunk script shape");
91
+ const jsonSource = script.slice(chunkPrefix.length, -1);
81
92
  let parsed;
82
93
  try {
83
94
  parsed = JSON.parse(jsonSource);
84
95
  } catch {
85
96
  throw new Error("[vinext] Malformed prerender RSC embed: invalid chunk JSON");
86
97
  }
87
- if (typeof parsed !== "string") throw new Error("[vinext] Malformed prerender RSC embed: chunk payload is not a string");
88
- return parsed;
98
+ if (typeof parsed === "string") return parsed;
99
+ if (Array.isArray(parsed) && parsed.length === 2 && parsed[0] === 3 && typeof parsed[1] === "string") return [parsed[0], parsed[1]];
100
+ throw new Error("[vinext] Malformed prerender RSC embed: unsupported chunk payload");
89
101
  }
90
102
  /**
91
103
  * Run an array of async tasks with bounded concurrency.
@@ -109,8 +121,14 @@ async function runWithConcurrency(items, concurrency, fn) {
109
121
  * Build a URL path from a route pattern and params.
110
122
  * "/posts/:id" + { id: "42" } → "/posts/42"
111
123
  * "/docs/:slug+" + { slug: ["a", "b"] } → "/docs/a/b"
124
+ *
125
+ * Throws a descriptive error rather than a cryptic `Cannot read properties of
126
+ * undefined` if `params` itself is missing or required keys are absent — the
127
+ * caller (prerenderPages / prerenderApp) catches this and surfaces it as a
128
+ * per-route error result.
112
129
  */
113
130
  function buildUrlFromParams(pattern, params) {
131
+ if (params === void 0 || params === null) throw new Error(`[vinext] buildUrlFromParams: params is ${params === null ? "null" : "undefined"} for pattern "${pattern}". Check that getStaticPaths / generateStaticParams returned an object with a "params" key, or pass a string path (see https://nextjs.org/docs/pages/api-reference/functions/get-static-paths).`);
114
132
  const parts = pattern.split("/").filter(Boolean);
115
133
  const result = [];
116
134
  for (const part of parts) if (part.endsWith("+") || part.endsWith("*")) {
@@ -126,23 +144,13 @@ function buildUrlFromParams(pattern, params) {
126
144
  return "/" + result.join("/");
127
145
  }
128
146
  /**
129
- * Determine the HTML output file path for a URL.
130
- * Respects trailingSlash config.
131
- */
132
- function getOutputPath(urlPath, trailingSlash) {
133
- if (urlPath === "/") return "index.html";
134
- const clean = urlPath.replace(/^\//, "");
135
- if (trailingSlash) return `${clean}/index.html`;
136
- return `${clean}.html`;
137
- }
138
- /**
139
147
  * Resolve parent dynamic segment params for a route.
140
148
  * Handles top-down generateStaticParams resolution for nested dynamic routes.
141
149
  *
142
150
  * Uses the `staticParamsMap` (pattern → generateStaticParams) exported from
143
151
  * the production bundle.
144
152
  */
145
- async function resolveParentParams(childRoute, routeIndex, staticParamsMap) {
153
+ async function resolveParentParams(childRoute, staticParamsMap) {
146
154
  const { patternParts } = childRoute;
147
155
  let lastDynamicIdx = -1;
148
156
  for (let i = patternParts.length - 1; i >= 0; i--) if (patternParts[i].startsWith(":")) {
@@ -155,25 +163,29 @@ async function resolveParentParams(childRoute, routeIndex, staticParamsMap) {
155
163
  const part = patternParts[i];
156
164
  prefixPattern += "/" + part;
157
165
  if (!part.startsWith(":")) continue;
158
- if (routeIndex.get(prefixPattern)?.pagePath) {
159
- const fn = staticParamsMap[prefixPattern];
160
- if (typeof fn === "function") parentSegments.push(fn);
161
- }
166
+ const fn = staticParamsMap[prefixPattern];
167
+ if (typeof fn === "function") parentSegments.push(fn);
162
168
  }
163
169
  if (parentSegments.length === 0) return [];
164
170
  let currentParams = [{}];
171
+ let resolvedAnyParent = false;
165
172
  for (const generateStaticParams of parentSegments) {
166
173
  const nextParams = [];
174
+ let resolvedThisParent = false;
167
175
  for (const parentParams of currentParams) {
168
176
  const results = await generateStaticParams({ params: parentParams });
169
- if (Array.isArray(results)) for (const result of results) nextParams.push({
177
+ if (results === null) continue;
178
+ if (!Array.isArray(results)) return [];
179
+ resolvedThisParent = true;
180
+ resolvedAnyParent = true;
181
+ for (const result of results) nextParams.push({
170
182
  ...parentParams,
171
183
  ...result
172
184
  });
173
185
  }
174
- currentParams = nextParams;
186
+ if (resolvedThisParent) currentParams = nextParams;
175
187
  }
176
- return currentParams;
188
+ return resolvedAnyParent ? currentParams : [];
177
189
  }
178
190
  /**
179
191
  * Run the prerender phase for Pages Router.
@@ -300,14 +312,34 @@ async function prerenderPages({ routes, apiRoutes, pagesDir, outDir, config, mod
300
312
  continue;
301
313
  }
302
314
  const paths = pathsResult?.paths ?? [];
303
- for (const { params } of paths) {
304
- const urlPath = buildUrlFromParams(route.pattern, params);
305
- pagesToRender.push({
306
- route,
307
- urlPath,
308
- params,
309
- revalidate
315
+ let entryError = null;
316
+ for (const item of paths) {
317
+ const normalized = normalizeStaticPathsEntry(item, route.pattern);
318
+ if ("error" in normalized) {
319
+ entryError = normalized.error;
320
+ break;
321
+ }
322
+ const { params } = normalized;
323
+ try {
324
+ const urlPath = buildUrlFromParams(route.pattern, params);
325
+ pagesToRender.push({
326
+ route,
327
+ urlPath,
328
+ params,
329
+ revalidate
330
+ });
331
+ } catch (e) {
332
+ entryError = e.message;
333
+ break;
334
+ }
335
+ }
336
+ if (entryError) {
337
+ results.push({
338
+ route: route.pattern,
339
+ status: "error",
340
+ error: entryError
310
341
  });
342
+ continue;
311
343
  }
312
344
  } else pagesToRender.push({
313
345
  route,
@@ -476,7 +508,6 @@ async function prerenderApp({ routes, outDir, config, mode, rscBundlePath, ...op
476
508
  return false;
477
509
  }
478
510
  });
479
- const routeIndex = new Map(routes.map((r) => [r.pattern, r]));
480
511
  const urlsToRender = [];
481
512
  for (const route of routes) {
482
513
  const renderEntryPath = getAppRouteRenderEntryPath(route);
@@ -527,7 +558,7 @@ async function prerenderApp({ routes, outDir, config, mode, rscBundlePath, ...op
527
558
  });
528
559
  continue;
529
560
  }
530
- const parentParamSets = await resolveParentParams(route, routeIndex, staticParamsMap);
561
+ const parentParamSets = await resolveParentParams(route, staticParamsMap);
531
562
  let paramSets;
532
563
  if (parentParamSets.length > 0) {
533
564
  paramSets = [];
@@ -541,8 +572,15 @@ async function prerenderApp({ routes, outDir, config, mode, rscBundlePath, ...op
541
572
  ...parentParams,
542
573
  ...childParams
543
574
  });
575
+ else {
576
+ paramSets = [];
577
+ break;
578
+ }
544
579
  }
545
- } else paramSets = await generateStaticParamsFn({ params: {} });
580
+ } else {
581
+ const results = await generateStaticParamsFn({ params: {} });
582
+ paramSets = Array.isArray(results) || results === null ? results : [];
583
+ }
546
584
  if (paramSets === null) {
547
585
  if (mode === "export") results.push({
548
586
  route: route.pattern,
@@ -565,6 +603,7 @@ async function prerenderApp({ routes, outDir, config, mode, rscBundlePath, ...op
565
603
  continue;
566
604
  }
567
605
  for (const params of paramSets) {
606
+ if (params === null || params === void 0) throw new Error(`generateStaticParams() for ${route.pattern} returned an entry with no params object.`);
568
607
  const urlPath = buildUrlFromParams(route.pattern, params);
569
608
  urlsToRender.push({
570
609
  urlPath,
@@ -662,7 +701,7 @@ async function prerenderApp({ routes, outDir, config, mode, rscBundlePath, ...op
662
701
  await rscRes.body?.cancel();
663
702
  throw new Error(`[vinext] prerenderApp: RSC fallback returned ${rscRes.status} for ${urlPath}`);
664
703
  }
665
- rscData = await rscRes.text();
704
+ rscData = new Uint8Array(await rscRes.arrayBuffer());
666
705
  }
667
706
  const outputFiles = [];
668
707
  const htmlOutputPath = getOutputPath(urlPath, config.trailingSlash);
@@ -673,7 +712,7 @@ async function prerenderApp({ routes, outDir, config, mode, rscBundlePath, ...op
673
712
  const rscOutputPath = getRscOutputPath(urlPath);
674
713
  const rscFullPath = path.join(outDir, rscOutputPath);
675
714
  fs.mkdirSync(path.dirname(rscFullPath), { recursive: true });
676
- fs.writeFileSync(rscFullPath, rscData, "utf-8");
715
+ fs.writeFileSync(rscFullPath, rscData);
677
716
  outputFiles.push(rscOutputPath);
678
717
  const renderedCacheControl = resolveRenderedCacheControl(htmlRender.requestCacheLife ?? {}, htmlCacheControl, config.expireTime);
679
718
  const renderedRevalidate = typeof revalidate === "number" ? renderedCacheControl.revalidate === void 0 ? revalidate : Math.min(revalidate, renderedCacheControl.revalidate) : renderedCacheControl.revalidate ?? revalidate;
@@ -742,15 +781,6 @@ async function prerenderApp({ routes, outDir, config, mode, rscBundlePath, ...op
742
781
  if (ownedProdServerHandle) await new Promise((resolve) => ownedProdServerHandle.server.close(() => resolve()));
743
782
  }
744
783
  }
745
- /**
746
- * Determine the RSC output file path for a URL.
747
- * "/blog/hello-world" → "blog/hello-world.rsc"
748
- * "/" → "index.rsc"
749
- */
750
- function getRscOutputPath(urlPath) {
751
- if (urlPath === "/") return "index.rsc";
752
- return urlPath.replace(/^\//, "") + ".rsc";
753
- }
754
784
  function resolveRenderedCacheControl(requestCacheLife, cacheControl, fallbackExpireSeconds) {
755
785
  const sMaxage = parseCacheControlSeconds(cacheControl, "s-maxage");
756
786
  const staleWhileRevalidate = parseCacheControlSeconds(cacheControl, "stale-while-revalidate");
@@ -816,6 +846,6 @@ function writePrerenderIndex(routes, outDir, options) {
816
846
  fs.writeFileSync(path.join(outDir, "vinext-prerender.json"), JSON.stringify(index, null, 2), "utf-8");
817
847
  }
818
848
  //#endregion
819
- export { extractRscPayloadFromPrerenderedHtml, getOutputPath, getRscOutputPath, prerenderApp, prerenderPages, readPrerenderSecret, resolveParentParams, writePrerenderIndex };
849
+ export { extractRscPayloadFromPrerenderedHtml, prerenderApp, prerenderPages, readPrerenderSecret, resolveParentParams, writePrerenderIndex };
820
850
 
821
851
  //# sourceMappingURL=prerender.js.map