vinext 1.3.0 → 1.4.0

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 (529) hide show
  1. package/README.md +5 -2
  2. package/THIRD_PARTY_LICENSES.md +47 -0
  3. package/dist/_virtual/_rolldown/runtime.js +4 -3
  4. package/dist/build/action-owner-manifest.d.ts +3 -2
  5. package/dist/build/action-owner-manifest.js +18 -2
  6. package/dist/build/app-page-static-eligibility.d.ts +17 -1
  7. package/dist/build/app-page-static-eligibility.js +80 -13
  8. package/dist/build/clean-output.d.ts +2 -1
  9. package/dist/build/client-build-config.d.ts +13 -3
  10. package/dist/build/client-build-config.js +46 -9
  11. package/dist/build/client-reference-async.d.ts +48 -0
  12. package/dist/build/client-reference-async.js +123 -0
  13. package/dist/build/client-reference-chunks.d.ts +32 -0
  14. package/dist/build/client-reference-chunks.js +111 -0
  15. package/dist/build/client-reference-groups.d.ts +9 -1
  16. package/dist/build/client-reference-groups.js +40 -2
  17. package/dist/build/css-url-assets.d.ts +2 -1
  18. package/dist/build/google-fonts/fallback-metrics.d.ts +2 -1
  19. package/dist/build/google-fonts/find-font-files-in-css.d.ts +1 -0
  20. package/dist/build/google-fonts/find-font-files-in-css.js +17 -4
  21. package/dist/build/google-fonts/font-metadata.d.ts +2 -1
  22. package/dist/build/google-fonts/validate.d.ts +2 -1
  23. package/dist/build/inline-css.d.ts +2 -1
  24. package/dist/build/module-dependency-cache.d.ts +2 -1
  25. package/dist/build/next-client-runtime-manifests.d.ts +2 -1
  26. package/dist/build/precompress.d.ts +2 -1
  27. package/dist/build/precompress.js +1 -1
  28. package/dist/build/prerender-paths.d.ts +2 -1
  29. package/dist/build/prerender-phase.d.ts +2 -1
  30. package/dist/build/prerender-server-pool.js +1 -1
  31. package/dist/build/prerender.d.ts +3 -2
  32. package/dist/build/prerender.js +6 -5
  33. package/dist/build/report.d.ts +2 -15
  34. package/dist/build/report.js +1 -51
  35. package/dist/build/run-prerender.d.ts +2 -1
  36. package/dist/build/server-actions-encryption-key.d.ts +2 -1
  37. package/dist/build/ssr-manifest.js +25 -2
  38. package/dist/build/standalone.d.ts +2 -1
  39. package/dist/cache/cache-adapters-virtual.d.ts +2 -1
  40. package/dist/cache.js +1 -2
  41. package/dist/check.d.ts +2 -1
  42. package/dist/check.js +5 -1
  43. package/dist/cli-args.d.ts +2 -1
  44. package/dist/cli.js +5 -0
  45. package/dist/client/client-redirect-matcher.js +2 -1
  46. package/dist/client/client-redirects.d.ts +4 -3
  47. package/dist/client/client-redirects.js +2 -1
  48. package/dist/client/client-rewrites.d.ts +2 -1
  49. package/dist/client/dev-error-overlay-store.d.ts +2 -1
  50. package/dist/client/dev-error-overlay.js +1 -1
  51. package/dist/client/index.js +1 -2
  52. package/dist/client/instrumentation-client-state.js +5 -5
  53. package/dist/client/navigation-runtime.d.ts +16 -2
  54. package/dist/client/navigation-runtime.js +2 -2
  55. package/dist/client/pages-router-link-navigation.d.ts +2 -1
  56. package/dist/client/vinext-next-data.d.ts +25 -1
  57. package/dist/client/window-next.d.ts +2 -1
  58. package/dist/config/config-matchers.d.ts +12 -1
  59. package/dist/config/config-matchers.js +111 -16
  60. package/dist/config/dotenv.d.ts +2 -1
  61. package/dist/config/next-config.d.ts +32 -1
  62. package/dist/config/next-config.js +93 -5
  63. package/dist/config/tsconfig-paths.d.ts +2 -1
  64. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/dbcs-codec.js +327 -0
  65. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/dbcs-data.js +123 -0
  66. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/index.js +29 -0
  67. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/internal.js +134 -0
  68. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/sbcs-codec.js +50 -0
  69. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/sbcs-data-generated.js +455 -0
  70. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/sbcs-data.js +147 -0
  71. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/tables/big5-added.json.js +169 -0
  72. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/tables/cp936.json.js +2584 -0
  73. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/tables/cp949.json.js +2220 -0
  74. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/tables/cp950.json.js +227 -0
  75. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/tables/eucjp.json.js +425 -0
  76. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/tables/gb18030-ranges.json.js +427 -0
  77. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/tables/gbk-added.json.js +229 -0
  78. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/tables/shiftjis.json.js +292 -0
  79. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/utf16.js +106 -0
  80. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/utf7.js +182 -0
  81. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/lib/bom-handling.js +42 -0
  82. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/lib/extend-node.js +147 -0
  83. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/lib/index.js +94 -0
  84. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/lib/streams.js +95 -0
  85. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/detector.js +23 -0
  86. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/index.js +2 -0
  87. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/lookup.js +25 -0
  88. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/bmp.js +11 -0
  89. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/cur.js +15 -0
  90. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/dds.js +11 -0
  91. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/gif.js +12 -0
  92. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/heif.js +55 -0
  93. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/icns.js +76 -0
  94. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/ico.js +39 -0
  95. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/index.js +46 -0
  96. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/j2c.js +11 -0
  97. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/jp2.js +21 -0
  98. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/jpg.js +71 -0
  99. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/jxl-stream.js +42 -0
  100. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/jxl.js +46 -0
  101. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/ktx.js +19 -0
  102. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/png.js +28 -0
  103. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/pnm.js +54 -0
  104. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/psd.js +11 -0
  105. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/svg.js +79 -0
  106. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/tga.js +15 -0
  107. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/tiff.js +96 -0
  108. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/utils.js +53 -0
  109. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/webp.js +45 -0
  110. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/utils/bit-reader.js +38 -0
  111. package/dist/deps/.pnpm/safer-buffer@2.1.2/deps/safer-buffer/safer.js +45 -0
  112. package/dist/deps/.pnpm/ua-parser-js@1.0.35/deps/ua-parser-js/src/ua-parser.js +2 -2
  113. package/dist/entries/app-browser-entry.d.ts +20 -5
  114. package/dist/entries/app-browser-entry.js +79 -6
  115. package/dist/entries/app-rsc-entry.d.ts +2 -1
  116. package/dist/entries/app-rsc-entry.js +59 -60
  117. package/dist/entries/app-rsc-manifest.d.ts +2 -1
  118. package/dist/entries/app-rsc-manifest.js +56 -4
  119. package/dist/entries/app-ssr-entry.js +1 -0
  120. package/dist/entries/pages-entry-helpers.js +1 -2
  121. package/dist/entries/pages-server-entry.d.ts +2 -1
  122. package/dist/entries/pages-server-entry.js +34 -9
  123. package/dist/entries/runtime-entry-module.d.ts +1 -0
  124. package/dist/entries/runtime-entry-module.js +4 -1
  125. package/dist/image/image-adapters-virtual.d.ts +2 -1
  126. package/dist/index.js +184 -103
  127. package/dist/init-cloudflare.d.ts +1 -3
  128. package/dist/init-cloudflare.js +10 -48
  129. package/dist/init-platform.d.ts +2 -0
  130. package/dist/init-platform.js +4 -0
  131. package/dist/plugins/client-compile-hints.d.ts +30 -0
  132. package/dist/plugins/client-compile-hints.js +88 -0
  133. package/dist/plugins/client-reference-dedup.d.ts +2 -1
  134. package/dist/plugins/cloudflare-dev-module-urls.d.ts +2 -1
  135. package/dist/plugins/dynamic-preload-metadata.d.ts +3 -1
  136. package/dist/plugins/dynamic-preload-metadata.js +1 -1
  137. package/dist/plugins/environment.d.ts +2 -1
  138. package/dist/plugins/extensionless-dynamic-import.js +6 -2
  139. package/dist/plugins/fonts.js +9 -12
  140. package/dist/plugins/ignore-dynamic-requests.d.ts +2 -1
  141. package/dist/plugins/import-meta-url.d.ts +2 -1
  142. package/dist/plugins/next-intl-catalog.d.ts +12 -0
  143. package/dist/plugins/next-intl-catalog.js +85 -0
  144. package/dist/plugins/og-assets.d.ts +2 -1
  145. package/dist/plugins/og-assets.js +2 -3
  146. package/dist/plugins/optimize-imports.d.ts +2 -1
  147. package/dist/plugins/pages-node-externals.d.ts +3 -1
  148. package/dist/plugins/pages-node-externals.js +1 -1
  149. package/dist/plugins/remove-console.d.ts +2 -1
  150. package/dist/plugins/require-condition-resolution.d.ts +2 -1
  151. package/dist/plugins/rsc-client-reference-loaders.d.ts +8 -0
  152. package/dist/plugins/rsc-client-reference-loaders.js +170 -68
  153. package/dist/plugins/rsc-client-shim-excludes.js +2 -0
  154. package/dist/plugins/sass.d.ts +2 -1
  155. package/dist/plugins/strip-server-exports.d.ts +2 -1
  156. package/dist/plugins/styled-jsx.d.ts +2 -1
  157. package/dist/plugins/transform-result.d.ts +2 -1
  158. package/dist/plugins/typeof-window.d.ts +2 -1
  159. package/dist/plugins/use-cache-callable.d.ts +1 -1
  160. package/dist/plugins/use-cache-callable.js +136 -94
  161. package/dist/plugins/worker-image-imports.js +1 -1
  162. package/dist/plugins/worker-use-server.d.ts +2 -1
  163. package/dist/routing/app-route-graph.d.ts +46 -0
  164. package/dist/routing/app-route-graph.js +131 -51
  165. package/dist/routing/browser-route-manifest.d.ts +2 -1
  166. package/dist/routing/optimistic-route-trie.d.ts +2 -1
  167. package/dist/routing/route-matching.d.ts +2 -1
  168. package/dist/routing/route-pattern.d.ts +2 -1
  169. package/dist/server/accept-encoding.d.ts +2 -1
  170. package/dist/server/api-handler.js +19 -4
  171. package/dist/server/app-action-forwarding.d.ts +2 -1
  172. package/dist/server/app-bfcache-identity.d.ts +2 -1
  173. package/dist/server/app-bfcache-identity.js +1 -1
  174. package/dist/server/app-browser-action-result.d.ts +2 -1
  175. package/dist/server/app-browser-entry.js +106 -66
  176. package/dist/server/app-browser-error.d.ts +2 -1
  177. package/dist/server/app-browser-history-controller.d.ts +7 -5
  178. package/dist/server/app-browser-history-controller.js +93 -15
  179. package/dist/server/app-browser-hydration.d.ts +2 -1
  180. package/dist/server/app-browser-interception-context.d.ts +2 -1
  181. package/dist/server/app-browser-navigation-controller.d.ts +2 -2
  182. package/dist/server/app-browser-navigation-controller.js +16 -12
  183. package/dist/server/app-browser-popstate.d.ts +2 -1
  184. package/dist/server/app-browser-rsc-redirect.d.ts +2 -1
  185. package/dist/server/app-browser-rsc-redirect.js +4 -4
  186. package/dist/server/app-browser-server-action-client.d.ts +4 -1
  187. package/dist/server/app-browser-server-action-client.js +4 -3
  188. package/dist/server/app-browser-state.d.ts +2 -4
  189. package/dist/server/app-browser-state.js +9 -4
  190. package/dist/server/app-browser-stream.d.ts +2 -1
  191. package/dist/server/app-browser-supplemental-refresh.js +16 -1
  192. package/dist/server/app-browser-visible-commit.d.ts +3 -2
  193. package/dist/server/app-browser-visible-commit.js +2 -12
  194. package/dist/server/app-client-reference-manifest.d.ts +31 -0
  195. package/dist/server/app-client-reference-manifest.js +46 -0
  196. package/dist/server/app-client-reference-preloader.d.ts +25 -5
  197. package/dist/server/app-client-reference-preloader.js +22 -7
  198. package/dist/server/app-elements-wire.d.ts +8 -39
  199. package/dist/server/app-elements-wire.js +4 -41
  200. package/dist/server/app-elements.d.ts +4 -2
  201. package/dist/server/app-elements.js +4 -2
  202. package/dist/server/app-fallback-renderer.d.ts +9 -2
  203. package/dist/server/app-fallback-renderer.js +4 -1
  204. package/dist/server/app-history-state.d.ts +4 -3
  205. package/dist/server/app-history-state.js +5 -2
  206. package/dist/server/app-inline-css-client.d.ts +2 -1
  207. package/dist/server/app-metadata-tracing.d.ts +2 -1
  208. package/dist/server/app-mounted-layouts.d.ts +21 -0
  209. package/dist/server/app-mounted-layouts.js +67 -0
  210. package/dist/server/app-optimistic-routing.d.ts +37 -2
  211. package/dist/server/app-optimistic-routing.js +75 -2
  212. package/dist/server/app-page-boundary-render.d.ts +20 -2
  213. package/dist/server/app-page-boundary-render.js +224 -40
  214. package/dist/server/app-page-boundary.d.ts +34 -5
  215. package/dist/server/app-page-boundary.js +41 -8
  216. package/dist/server/app-page-cache-finalizer.d.ts +14 -2
  217. package/dist/server/app-page-cache-finalizer.js +71 -30
  218. package/dist/server/app-page-cache-render.d.ts +10 -2
  219. package/dist/server/app-page-cache-render.js +14 -2
  220. package/dist/server/app-page-cache.d.ts +13 -1
  221. package/dist/server/app-page-cache.js +33 -11
  222. package/dist/server/app-page-dispatch.d.ts +39 -11
  223. package/dist/server/app-page-dispatch.js +236 -177
  224. package/dist/server/app-page-element-builder.d.ts +19 -3
  225. package/dist/server/app-page-element-builder.js +193 -71
  226. package/dist/server/app-page-execution.d.ts +43 -51
  227. package/dist/server/app-page-execution.js +205 -92
  228. package/dist/server/app-page-head.d.ts +108 -3
  229. package/dist/server/app-page-head.js +337 -154
  230. package/dist/server/app-page-http-access-fallback-metadata.d.ts +49 -2
  231. package/dist/server/app-page-http-access-fallback-metadata.js +77 -2
  232. package/dist/server/app-page-layout-gate.d.ts +35 -0
  233. package/dist/server/app-page-layout-gate.js +50 -0
  234. package/dist/server/app-page-method.d.ts +2 -1
  235. package/dist/server/app-page-params.d.ts +0 -1
  236. package/dist/server/app-page-params.js +1 -14
  237. package/dist/server/app-page-probe.d.ts +5 -22
  238. package/dist/server/app-page-probe.js +4 -37
  239. package/dist/server/app-page-render-identity.d.ts +2 -1
  240. package/dist/server/app-page-render.d.ts +9 -13
  241. package/dist/server/app-page-render.js +108 -214
  242. package/dist/server/app-page-request.d.ts +15 -4
  243. package/dist/server/app-page-request.js +2 -2
  244. package/dist/server/app-page-response.js +3 -3
  245. package/dist/server/app-page-route-wiring.d.ts +65 -8
  246. package/dist/server/app-page-route-wiring.js +259 -103
  247. package/dist/server/app-page-rsc-render-status.d.ts +29 -2
  248. package/dist/server/app-page-rsc-render-status.js +121 -13
  249. package/dist/server/app-page-search-params-observation.d.ts +7 -2
  250. package/dist/server/app-page-search-params-observation.js +8 -1
  251. package/dist/server/app-page-segment-plan.d.ts +2 -1
  252. package/dist/server/app-page-stream.d.ts +33 -1
  253. package/dist/server/app-page-stream.js +25 -6
  254. package/dist/server/app-pages-bridge.d.ts +6 -1
  255. package/dist/server/app-pages-bridge.js +7 -3
  256. package/dist/server/app-ppr-fallback-shell-render.d.ts +2 -1
  257. package/dist/server/app-ppr-fallback-shell.d.ts +2 -1
  258. package/dist/server/app-prerender-endpoints.d.ts +2 -1
  259. package/dist/server/app-prerender-static-params.d.ts +2 -1
  260. package/dist/server/app-render-dependency.d.ts +21 -4
  261. package/dist/server/app-render-dependency.js +100 -33
  262. package/dist/server/app-request-stage-dispatch.js +1 -1
  263. package/dist/server/app-request-stage-independent-entry.d.ts +2 -1
  264. package/dist/server/app-response-stage-entry.d.ts +2 -1
  265. package/dist/server/app-route-handler-cache.d.ts +2 -1
  266. package/dist/server/app-route-handler-cache.js +2 -2
  267. package/dist/server/app-route-handler-dispatch.d.ts +2 -1
  268. package/dist/server/app-route-handler-dispatch.js +15 -10
  269. package/dist/server/app-route-handler-execution.d.ts +2 -1
  270. package/dist/server/app-route-handler-execution.js +8 -3
  271. package/dist/server/app-route-handler-policy.d.ts +1 -1
  272. package/dist/server/app-route-handler-policy.js +3 -3
  273. package/dist/server/app-route-handler-response.d.ts +2 -1
  274. package/dist/server/app-route-handler-response.js +1 -1
  275. package/dist/server/app-route-handler-runtime.d.ts +2 -1
  276. package/dist/server/app-route-handler-runtime.js +17 -4
  277. package/dist/server/app-route-module-loader.d.ts +18 -1
  278. package/dist/server/app-route-module-loader.js +8 -0
  279. package/dist/server/app-route-tree-prefetch.d.ts +2 -1
  280. package/dist/server/app-rsc-cache-busting.d.ts +2 -2
  281. package/dist/server/app-rsc-cache-busting.js +4 -4
  282. package/dist/server/app-rsc-error-handler.d.ts +4 -2
  283. package/dist/server/app-rsc-error-handler.js +9 -1
  284. package/dist/server/app-rsc-errors.d.ts +10 -1
  285. package/dist/server/app-rsc-errors.js +8 -1
  286. package/dist/server/app-rsc-handler.d.ts +7 -6
  287. package/dist/server/app-rsc-handler.js +36 -34
  288. package/dist/server/app-rsc-request-normalization.d.ts +0 -4
  289. package/dist/server/app-rsc-request-normalization.js +1 -4
  290. package/dist/server/app-rsc-response-finalizer.d.ts +2 -1
  291. package/dist/server/app-rsc-response-finalizer.js +2 -2
  292. package/dist/server/app-rsc-response-stage.js +5 -3
  293. package/dist/server/app-rsc-route-matching.d.ts +38 -1
  294. package/dist/server/app-rsc-route-matching.js +24 -0
  295. package/dist/server/app-segment-config.d.ts +2 -1
  296. package/dist/server/app-segment-config.js +1 -14
  297. package/dist/server/app-server-action-execution.d.ts +5 -2
  298. package/dist/server/app-server-action-execution.js +10 -7
  299. package/dist/server/app-ssr-entry.d.ts +8 -0
  300. package/dist/server/app-ssr-entry.js +98 -50
  301. package/dist/server/app-ssr-error-meta.d.ts +2 -1
  302. package/dist/server/app-ssr-search-params-gate.d.ts +2 -1
  303. package/dist/server/app-ssr-stream.d.ts +22 -10
  304. package/dist/server/app-ssr-stream.js +300 -68
  305. package/dist/server/app-static-generation.d.ts +2 -1
  306. package/dist/server/app-streamed-client-references.d.ts +39 -0
  307. package/dist/server/app-streamed-client-references.js +156 -0
  308. package/dist/server/app-visited-response-cache.d.ts +38 -2
  309. package/dist/server/app-visited-response-cache.js +46 -5
  310. package/dist/server/app-worker-stages.d.ts +27 -4
  311. package/dist/server/app-worker-stages.js +45 -6
  312. package/dist/server/artifact-compatibility.d.ts +2 -2
  313. package/dist/server/artifact-compatibility.js +1 -10
  314. package/dist/server/bfcache-identity.d.ts +2 -1
  315. package/dist/server/cache-headers.d.ts +2 -1
  316. package/dist/server/cache-proof.d.ts +1 -115
  317. package/dist/server/cache-proof.js +1 -544
  318. package/dist/server/cacheability-request.d.ts +2 -1
  319. package/dist/server/cacheability-request.js +13 -8
  320. package/dist/server/config-headers.d.ts +2 -1
  321. package/dist/server/csp.d.ts +2 -1
  322. package/dist/server/default-global-not-found-module.d.ts +2 -1
  323. package/dist/server/default-http-access-fallback-modules.d.ts +33 -0
  324. package/dist/server/default-http-access-fallback-modules.js +31 -0
  325. package/dist/server/defer-until-stream-consumed.d.ts +34 -0
  326. package/dist/server/defer-until-stream-consumed.js +154 -21
  327. package/dist/server/dev-lockfile.d.ts +32 -2
  328. package/dist/server/dev-lockfile.js +46 -2
  329. package/dist/server/dev-module-runner.d.ts +2 -1
  330. package/dist/server/dev-server.js +14 -6
  331. package/dist/server/fetch-handler.js +1 -2
  332. package/dist/server/file-based-metadata.d.ts +2 -1
  333. package/dist/server/framework-tracer.d.ts +2 -1
  334. package/dist/server/headers.d.ts +6 -3
  335. package/dist/server/headers.js +9 -5
  336. package/dist/server/html.d.ts +1 -0
  337. package/dist/server/html.js +19 -1
  338. package/dist/server/http-conditional.d.ts +2 -1
  339. package/dist/server/http-error-responses.d.ts +2 -1
  340. package/dist/server/implicit-tags.d.ts +2 -1
  341. package/dist/server/isr-cache.d.ts +8 -2
  342. package/dist/server/isr-cache.js +26 -1
  343. package/dist/server/metadata-route-build-data.d.ts +2 -1
  344. package/dist/server/metadata-route-build-data.js +1 -1
  345. package/dist/server/metadata-route-response.d.ts +2 -1
  346. package/dist/server/metadata-route-response.js +32 -15
  347. package/dist/server/metadata-routes.d.ts +2 -1
  348. package/dist/server/middleware-runtime.d.ts +2 -1
  349. package/dist/server/multi-stage.d.ts +52 -11
  350. package/dist/server/multi-stage.js +13 -1
  351. package/dist/server/navigation-planner.js +1 -1
  352. package/dist/server/navigation-trace.d.ts +2 -1
  353. package/dist/server/next-error-digest.d.ts +2 -1
  354. package/dist/server/nitro-public-files-plugin.d.ts +2 -1
  355. package/dist/server/nitro-public-files.d.ts +2 -1
  356. package/dist/server/opentelemetry-api.d.ts +2 -1
  357. package/dist/server/operation-token.d.ts +2 -1
  358. package/dist/server/pages-api-route.d.ts +2 -1
  359. package/dist/server/pages-api-route.js +28 -19
  360. package/dist/server/pages-asset-tags.d.ts +2 -1
  361. package/dist/server/pages-body-parser-config.d.ts +2 -1
  362. package/dist/server/pages-client-assets.d.ts +4 -0
  363. package/dist/server/pages-data-route.d.ts +2 -1
  364. package/dist/server/pages-document-asset-props.d.ts +2 -1
  365. package/dist/server/pages-document-initial-props.d.ts +2 -1
  366. package/dist/server/pages-execution-tracing.d.ts +2 -1
  367. package/dist/server/pages-execution-tracing.js +1 -1
  368. package/dist/server/pages-get-initial-props.d.ts +2 -1
  369. package/dist/server/pages-media-type.d.ts +21 -1
  370. package/dist/server/pages-media-type.js +69 -5
  371. package/dist/server/pages-node-compat.js +52 -27
  372. package/dist/server/pages-page-data.d.ts +7 -1
  373. package/dist/server/pages-page-data.js +35 -12
  374. package/dist/server/pages-page-handler.d.ts +3 -2
  375. package/dist/server/pages-page-handler.js +27 -27
  376. package/dist/server/pages-page-method.d.ts +2 -1
  377. package/dist/server/pages-page-response.d.ts +2 -1
  378. package/dist/server/pages-preview.d.ts +2 -1
  379. package/dist/server/pages-readiness.d.ts +2 -1
  380. package/dist/server/pages-request-pipeline.d.ts +10 -1
  381. package/dist/server/pages-request-pipeline.js +6 -7
  382. package/dist/server/pages-request-stage-entry.d.ts +2 -1
  383. package/dist/server/pages-request-stage-entry.js +14 -12
  384. package/dist/server/pages-response-stage-entry.d.ts +2 -1
  385. package/dist/server/pages-response-stage-entry.js +9 -3
  386. package/dist/server/pages-route-data-kind.d.ts +2 -1
  387. package/dist/server/prerender-cache-life-header.d.ts +2 -1
  388. package/dist/server/prerender-route-params.d.ts +2 -1
  389. package/dist/server/prod-server.js +14 -4
  390. package/dist/server/request-log.d.ts +2 -1
  391. package/dist/server/request-pipeline.d.ts +6 -0
  392. package/dist/server/request-pipeline.js +21 -1
  393. package/dist/server/request-tracing.d.ts +2 -1
  394. package/dist/server/request-tracing.js +1 -1
  395. package/dist/server/response-start-tracing.js +7 -29
  396. package/dist/server/rsc-render-stream.d.ts +4 -0
  397. package/dist/server/rsc-render-stream.js +25 -0
  398. package/dist/server/seed-cache.d.ts +2 -1
  399. package/dist/server/seed-cache.js +1 -1
  400. package/dist/server/shared-cache-identity.d.ts +23 -0
  401. package/dist/server/shared-cache-identity.js +36 -0
  402. package/dist/server/static-file-cache.d.ts +2 -1
  403. package/dist/server/static-file-cache.js +1 -0
  404. package/dist/server/worker-revalidation-context.d.ts +2 -1
  405. package/dist/server/worker-stages.d.ts +18 -4
  406. package/dist/server/worker-stages.js +23 -4
  407. package/dist/shims/app.d.ts +2 -1
  408. package/dist/shims/cache-callable-runtime.d.ts +2 -1
  409. package/dist/shims/cache-handler.d.ts +8 -3
  410. package/dist/shims/cache-handler.js +31 -11
  411. package/dist/shims/cache-request-state.d.ts +17 -20
  412. package/dist/shims/cache-request-state.js +16 -21
  413. package/dist/shims/cache-runtime.js +27 -11
  414. package/dist/shims/cache.d.ts +8 -7
  415. package/dist/shims/cache.js +17 -19
  416. package/dist/shims/cacheability-classification.d.ts +2 -0
  417. package/dist/shims/caught-not-found-boundaries.d.ts +15 -0
  418. package/dist/shims/caught-not-found-boundaries.js +48 -0
  419. package/dist/shims/cdn-cache.d.ts +22 -5
  420. package/dist/shims/cdn-purge-routes.d.ts +2 -1
  421. package/dist/shims/client-locale.js +2 -1
  422. package/dist/shims/client-page-root.d.ts +2 -1
  423. package/dist/shims/client-page-root.js +2 -2
  424. package/dist/shims/config.d.ts +2 -1
  425. package/dist/shims/default-forbidden.d.ts +4 -0
  426. package/dist/shims/default-forbidden.js +18 -0
  427. package/dist/shims/default-not-found.d.ts +0 -5
  428. package/dist/shims/default-not-found.js +5 -41
  429. package/dist/shims/default-unauthorized.d.ts +4 -0
  430. package/dist/shims/default-unauthorized.js +18 -0
  431. package/dist/shims/dynamic.js +9 -6
  432. package/dist/shims/error-boundary.d.ts +39 -3
  433. package/dist/shims/error-boundary.js +33 -18
  434. package/dist/shims/fetch-cache-state.d.ts +5 -1
  435. package/dist/shims/fetch-cache-state.js +1 -3
  436. package/dist/shims/fetch-cache.d.ts +2 -1
  437. package/dist/shims/fetch-cache.js +34 -24
  438. package/dist/shims/font-google.js +1 -2
  439. package/dist/shims/font-utils.d.ts +3 -2
  440. package/dist/shims/font-utils.js +5 -3
  441. package/dist/shims/form.js +3 -3
  442. package/dist/shims/headers.d.ts +8 -23
  443. package/dist/shims/headers.js +17 -67
  444. package/dist/shims/http-access-error-fallback.d.ts +7 -0
  445. package/dist/shims/http-access-error-fallback.js +47 -0
  446. package/dist/shims/image.d.ts +1 -22
  447. package/dist/shims/internal/app-prefetch-fetch-queue.d.ts +22 -2
  448. package/dist/shims/internal/app-prefetch-fetch-queue.js +71 -18
  449. package/dist/shims/internal/app-route-prefetch-policy.d.ts +14 -3
  450. package/dist/shims/internal/app-route-prefetch-policy.js +29 -4
  451. package/dist/shims/internal/cache-context-accessor.d.ts +2 -1
  452. package/dist/shims/internal/client-reference-loader.d.ts +7 -0
  453. package/dist/shims/internal/client-reference-loader.js +91 -0
  454. package/dist/shims/internal/cookie-serialize.d.ts +2 -1
  455. package/dist/shims/internal/cookies.js +1 -2
  456. package/dist/shims/internal/headers-state.d.ts +2 -0
  457. package/dist/shims/internal/headers-state.js +6 -1
  458. package/dist/shims/internal/hybrid-client-route-owner-direct.d.ts +2 -1
  459. package/dist/shims/internal/interpolate-as.d.ts +2 -1
  460. package/dist/shims/internal/navigation-untracked.js +1 -1
  461. package/dist/shims/internal/pages-data-target.d.ts +2 -1
  462. package/dist/shims/internal/pages-data-url.d.ts +2 -1
  463. package/dist/shims/internal/thenable-well-known-properties.d.ts +2 -1
  464. package/dist/shims/link.js +197 -52
  465. package/dist/shims/metadata.d.ts +52 -29
  466. package/dist/shims/metadata.js +142 -42
  467. package/dist/shims/navigation-errors.d.ts +2 -1
  468. package/dist/shims/navigation-server.js +1 -1
  469. package/dist/shims/navigation.d.ts +95 -8
  470. package/dist/shims/navigation.js +255 -47
  471. package/dist/shims/navigation.react-server.js +2 -2
  472. package/dist/shims/pages-router-runtime.d.ts +2 -1
  473. package/dist/shims/ppr-fallback-shell.d.ts +2 -1
  474. package/dist/shims/request-state-types.d.ts +2 -2
  475. package/dist/shims/router.js +14 -3
  476. package/dist/shims/slot.d.ts +12 -0
  477. package/dist/shims/slot.js +37 -9
  478. package/dist/shims/unified-request-context.d.ts +1 -1
  479. package/dist/shims/unified-request-context.js +5 -6
  480. package/dist/typegen.d.ts +2 -1
  481. package/dist/utils/cache-control-metadata.d.ts +5 -0
  482. package/dist/utils/cache-control-metadata.js +9 -1
  483. package/dist/utils/client-build-manifest.d.ts +4 -1
  484. package/dist/utils/client-build-manifest.js +9 -2
  485. package/dist/utils/client-entry-manifest.d.ts +13 -0
  486. package/dist/utils/client-entry-manifest.js +20 -1
  487. package/dist/utils/client-reference-chunks.d.ts +45 -0
  488. package/dist/utils/client-reference-chunks.js +30 -0
  489. package/dist/utils/client-runtime-metadata.d.ts +9 -1
  490. package/dist/utils/client-runtime-metadata.js +40 -9
  491. package/dist/utils/compare.d.ts +9 -0
  492. package/dist/utils/compare.js +15 -1
  493. package/dist/utils/lazy-chunks.d.ts +14 -0
  494. package/dist/utils/lazy-chunks.js +27 -1
  495. package/dist/utils/middleware-request-headers.d.ts +2 -1
  496. package/dist/utils/project.d.ts +4 -3
  497. package/dist/utils/project.js +12 -17
  498. package/dist/utils/query.d.ts +2 -1
  499. package/dist/utils/regex.d.ts +5 -0
  500. package/dist/utils/regex.js +11 -1
  501. package/dist/utils/text-stream.d.ts +10 -5
  502. package/dist/utils/text-stream.js +6 -6
  503. package/dist/utils/vite-cli-invocation.d.ts +2 -1
  504. package/package.json +6 -5
  505. package/dist/build/layout-classification-types.d.ts +0 -60
  506. package/dist/build/layout-classification-types.js +0 -1
  507. package/dist/build/layout-classification.d.ts +0 -61
  508. package/dist/build/layout-classification.js +0 -98
  509. package/dist/build/route-classification-injector.d.ts +0 -32
  510. package/dist/build/route-classification-injector.js +0 -59
  511. package/dist/build/route-classification-manifest.d.ts +0 -53
  512. package/dist/build/route-classification-manifest.js +0 -143
  513. package/dist/deps/.pnpm/image-size@2.0.2/deps/image-size/dist/index.js +0 -808
  514. package/dist/server/app-browser-client-reuse-manifest.d.ts +0 -10
  515. package/dist/server/app-browser-client-reuse-manifest.js +0 -101
  516. package/dist/server/app-layout-param-observation.d.ts +0 -41
  517. package/dist/server/app-layout-param-observation.js +0 -168
  518. package/dist/server/client-reuse-manifest.d.ts +0 -102
  519. package/dist/server/client-reuse-manifest.js +0 -209
  520. package/dist/server/default-not-found-module.d.ts +0 -19
  521. package/dist/server/default-not-found-module.js +0 -18
  522. package/dist/server/rsc-stream-hints.d.ts +0 -21
  523. package/dist/server/rsc-stream-hints.js +0 -227
  524. package/dist/server/skip-cache-proof.d.ts +0 -60
  525. package/dist/server/skip-cache-proof.js +0 -168
  526. package/dist/server/static-layout-client-reuse-proof.d.ts +0 -13
  527. package/dist/server/static-layout-client-reuse-proof.js +0 -33
  528. package/dist/utils/sorted-array.d.ts +0 -7
  529. package/dist/utils/sorted-array.js +0 -20
@@ -1,9 +1,10 @@
1
- import { createInlineScriptTag, escapeHtmlAttr, htmlTokenListContains, safeJsonStringify } from "./html.js";
2
- import { getVinextRscCompatibilityId } from "./app-rsc-cache-busting.js";
1
+ import { createNonceAttribute, escapeHtmlAttr, htmlTokenListContains, safeJsonStringify, scriptSafeJsonStringify } from "./html.js";
3
2
  import { bytesToBase64, concatUint8Arrays } from "./app-rsc-embedded-chunks.js";
4
3
  import { NAVIGATION_RUNTIME_SYMBOL_DESCRIPTION } from "../client/browser-globals.js";
4
+ import { getVinextRscCompatibilityId } from "./app-rsc-cache-busting.js";
5
+ import { Buffer, isUtf8 } from "node:buffer";
5
6
  //#region src/server/app-ssr-stream.ts
6
- const RSC_EMBED_TEXT_BATCH_MAX_LENGTH = 65536;
7
+ const RSC_EMBED_TEXT_BATCH_MAX_BYTES = 65536;
7
8
  function waitAtLeastOneReactRenderTask() {
8
9
  return new Promise((resolve) => setTimeout(resolve, 0));
9
10
  }
@@ -33,7 +34,30 @@ function createNavigationRuntimeRenderedSearchScript(search) {
33
34
  return "Object.assign(" + navigationRuntimeRscBootstrapExpression() + ",{renderedSearch:" + safeJsonStringify(search) + "})";
34
35
  }
35
36
  function createNavigationRuntimeRscChunkScript(chunk) {
36
- return navigationRuntimeRscBootstrapExpression() + ".rsc.push(" + safeJsonStringify(chunk) + ")";
37
+ return navigationRuntimeRscBootstrapExpression() + ".rsc.push(" + scriptSafeJsonStringify(chunk) + ")";
38
+ }
39
+ const SCRIPT_UNSAFE_BYTE_STRING_RE = /<(?=!--|\/?[Ss][Cc][Rr][Ii][Pp][Tt])|\u00e2\u0080[\u00a8\u00a9]/g;
40
+ function escapeScriptUnsafeByteString(match) {
41
+ if (match === "<") return "\\u003c";
42
+ return match.charCodeAt(2) === 168 ? "\\u2028" : "\\u2029";
43
+ }
44
+ function bytesToByteString(bytes) {
45
+ return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength).toString("latin1");
46
+ }
47
+ const NON_ASCII_RE = /[\u0080-\uffff]/;
48
+ function textToByteString(text) {
49
+ return NON_ASCII_RE.test(text) ? Buffer.from(text, "utf8").toString("latin1") : text;
50
+ }
51
+ function byteStringToBytes(byteString) {
52
+ const bytes = Buffer.allocUnsafeSlow(byteString.length);
53
+ bytes.write(byteString, "latin1");
54
+ return bytes;
55
+ }
56
+ const NAVIGATION_RUNTIME_RSC_PUSH_PREFIX = textToByteString(navigationRuntimeRscBootstrapExpression() + ".rsc.push(");
57
+ /** createNavigationRuntimeRscChunkScript for valid UTF-8 text, as a byte string. */
58
+ function createNavigationRuntimeRscTextChunkByteScript(text) {
59
+ const json = JSON.stringify(bytesToByteString(text)).replace(SCRIPT_UNSAFE_BYTE_STRING_RE, escapeScriptUnsafeByteString);
60
+ return NAVIGATION_RUNTIME_RSC_PUSH_PREFIX + json + ")";
37
61
  }
38
62
  function createNavigationRuntimeRscDoneScript(metadata) {
39
63
  const bootstrap = navigationRuntimeRscBootstrapExpression();
@@ -52,6 +76,18 @@ function createNextFlightChunkScript(chunk) {
52
76
  function createNextFlightCleanupScript() {
53
77
  return "self.addEventListener(\"DOMContentLoaded\",()=>{if(self.__next_f?.push===Array.prototype.push)self.__next_f.length=0},{once:true})";
54
78
  }
79
+ function utf8CharacterLength(byte) {
80
+ return byte >= 248 ? 1 : byte >= 240 ? 4 : byte >= 224 ? 3 : byte >= 192 ? 2 : 1;
81
+ }
82
+ function utf8CompleteEnd(bytes) {
83
+ const length = bytes.byteLength;
84
+ for (let index = length - 1; index >= 0 && index >= length - 3; index--) {
85
+ const byte = bytes[index];
86
+ if ((byte & 192) === 128) continue;
87
+ return index + utf8CharacterLength(byte) > length ? index : length;
88
+ }
89
+ return length;
90
+ }
55
91
  /**
56
92
  * Create a helper that progressively embeds RSC chunks as inline <script> tags.
57
93
  * The browser entry turns the embedded chunks back into Uint8Array data.
@@ -60,34 +96,115 @@ function createRscEmbedTransform(embedStream, optionsOrNonce = {}) {
60
96
  const options = typeof optionsOrNonce === "string" ? { scriptNonce: optionsOrNonce } : optionsOrNonce;
61
97
  const reader = embedStream.getReader();
62
98
  let pendingChunks = [];
99
+ let pendingRawChunkCount = 0;
63
100
  const rawChunks = [];
64
101
  let embeddedRawChunkCount = 0;
65
102
  let rawBufferTaken = false;
103
+ let rawChunksReleased = false;
66
104
  let finalized = false;
67
105
  let reading = false;
106
+ let readDone = false;
107
+ let readError = null;
108
+ const replays = [];
68
109
  let mirroredNextFlightBootstrap = false;
69
- const textDecoder = new TextDecoder("utf-8", {
70
- fatal: true,
71
- ignoreBOM: true
72
- });
73
- function decodeChunk(bytes) {
74
- try {
75
- return textDecoder.decode(bytes);
76
- } catch {
77
- return [3, bytesToBase64(bytes)];
110
+ const textDecoder = new TextDecoder("utf-8", { ignoreBOM: true });
111
+ const nonceAttribute = textToByteString(createNonceAttribute(options.scriptNonce));
112
+ function toBinaryChunk(bytes) {
113
+ return [3, bytesToBase64(bytes)];
114
+ }
115
+ function splitChunk(bytes, chunks) {
116
+ if (isUtf8(bytes)) {
117
+ chunks.push(bytes);
118
+ return;
78
119
  }
120
+ const pushRange = (start, end, text) => {
121
+ const range = bytes.subarray(start, end);
122
+ chunks.push(text ? range : toBinaryChunk(range));
123
+ };
124
+ let rangeStart = 0;
125
+ let rangeIsText = false;
126
+ let start = 0;
127
+ while (start < bytes.byteLength) {
128
+ const newline = bytes.indexOf(10, start);
129
+ const end = newline === -1 ? bytes.byteLength : newline + 1;
130
+ const isText = isUtf8(bytes.subarray(start, end));
131
+ if (start > rangeStart && isText !== rangeIsText) {
132
+ pushRange(rangeStart, start, rangeIsText);
133
+ rangeStart = start;
134
+ }
135
+ rangeIsText = isText;
136
+ start = end;
137
+ }
138
+ pushRange(rangeStart, bytes.byteLength, rangeIsText);
139
+ }
140
+ /**
141
+ * React cuts its output into fixed-size chunks wherever they fall, even
142
+ * inside a character, so a chunk's last incomplete character is decoded with
143
+ * the next chunk, which React writes in the same flush. Bytes are never held
144
+ * past an embed flush, though: they may be the end of a binary row, which the
145
+ * browser needs before React writes anything else. They're embedded as
146
+ * binary then, and so are the bytes that complete them.
147
+ */
148
+ function createChunkDecoder() {
149
+ let carry = null;
150
+ let missing = 0;
151
+ return {
152
+ decode(raw, chunks) {
153
+ let bytes = raw;
154
+ if (missing > 0) {
155
+ let count = 0;
156
+ while (count < missing && count < bytes.byteLength && (bytes[count] & 192) === 128) count++;
157
+ missing = 0;
158
+ if (count > 0) {
159
+ chunks.push(toBinaryChunk(bytes.subarray(0, count)));
160
+ bytes = bytes.subarray(count);
161
+ }
162
+ }
163
+ if (carry) {
164
+ bytes = concatUint8Arrays([carry, bytes]);
165
+ carry = null;
166
+ }
167
+ const end = utf8CompleteEnd(bytes);
168
+ if (end < bytes.byteLength) {
169
+ carry = bytes.slice(end);
170
+ bytes = bytes.subarray(0, end);
171
+ }
172
+ if (bytes.byteLength > 0) splitChunk(bytes, chunks);
173
+ },
174
+ flush(chunks) {
175
+ if (!carry) return;
176
+ chunks.push(toBinaryChunk(carry));
177
+ missing = utf8CharacterLength(carry[0]) - carry.byteLength;
178
+ carry = null;
179
+ }
180
+ };
181
+ }
182
+ const chunkDecoder = createChunkDecoder();
183
+ function inlineScript(byteScript) {
184
+ return "<script" + nonceAttribute + ">" + byteScript + "<\/script>";
79
185
  }
80
186
  function releaseRawChunks() {
81
187
  const mayStartMirror = typeof options.mirrorNextFlight === "function" && !mirroredNextFlightBootstrap && !finalized;
82
- if (rawBufferTaken && !mayStartMirror) rawChunks.length = 0;
188
+ if (rawBufferTaken && !mayStartMirror) {
189
+ rawChunks.length = 0;
190
+ rawChunksReleased = true;
191
+ }
83
192
  }
193
+ /** The mirror's opening scripts, as a byte string. */
84
194
  function startNextFlightMirror() {
85
195
  if (mirroredNextFlightBootstrap) return "";
86
196
  const mirror = options.mirrorNextFlight;
87
197
  if (mirror !== true && (typeof mirror !== "function" || !mirror())) return "";
88
198
  mirroredNextFlightBootstrap = true;
89
- let scripts = createInlineScriptTag(createNextFlightBootstrapScript(), options.scriptNonce) + createInlineScriptTag(createNextFlightCleanupScript(), options.scriptNonce);
90
- for (let index = 0; index < embeddedRawChunkCount; index++) scripts += createInlineScriptTag(createNextFlightChunkScript(decodeChunk(rawChunks[index])), options.scriptNonce);
199
+ let scripts = inlineScript(createNextFlightBootstrapScript()) + inlineScript(createNextFlightCleanupScript());
200
+ const embeddedChunks = [];
201
+ const replayDecoder = createChunkDecoder();
202
+ for (let index = 0; index < embeddedRawChunkCount; index++) replayDecoder.decode(rawChunks[index], embeddedChunks);
203
+ replayDecoder.flush(embeddedChunks);
204
+ for (const chunk of embeddedChunks) {
205
+ const nextChunk = chunk instanceof Uint8Array ? textDecoder.decode(chunk) : chunk;
206
+ scripts += inlineScript(textToByteString(createNextFlightChunkScript(nextChunk)));
207
+ }
91
208
  releaseRawChunks();
92
209
  return scripts;
93
210
  }
@@ -99,56 +216,67 @@ function createRscEmbedTransform(embedStream, optionsOrNonce = {}) {
99
216
  const result = await reader.read();
100
217
  if (result.done) break;
101
218
  rawChunks.push(result.value);
102
- pendingChunks.push(decodeChunk(result.value));
219
+ for (const replay of replays) replay.controller.enqueue(result.value);
220
+ chunkDecoder.decode(result.value, pendingChunks);
221
+ pendingRawChunkCount++;
103
222
  }
223
+ readDone = true;
224
+ for (const replay of replays.splice(0)) if (!replay.keepOpen) replay.controller.close();
104
225
  } catch (error) {
105
226
  if (process.env.NODE_ENV !== "production") console.warn("[vinext] RSC embed stream read error:", error);
227
+ readError = { error };
228
+ for (const replay of replays.splice(0)) replay.controller.error(error);
106
229
  throw error;
107
230
  } finally {
108
231
  reading = false;
109
232
  }
110
233
  }
111
234
  const pumpPromise = pumpReader();
235
+ /** Scripts for the chunks read since the last flush, as a byte string. */
236
+ function flushByteScripts() {
237
+ chunkDecoder.flush(pendingChunks);
238
+ if (pendingChunks.length === 0) return "";
239
+ const mirrorScripts = startNextFlightMirror();
240
+ const chunks = pendingChunks;
241
+ pendingChunks = [];
242
+ embeddedRawChunkCount += pendingRawChunkCount;
243
+ pendingRawChunkCount = 0;
244
+ let scripts = mirrorScripts;
245
+ let textChunks = [];
246
+ let textBytes = 0;
247
+ const flushTextChunks = () => {
248
+ if (textChunks.length === 0) return;
249
+ const text = textChunks.length === 1 ? textChunks[0] : concatUint8Arrays(textChunks);
250
+ textChunks = [];
251
+ textBytes = 0;
252
+ scripts += inlineScript(createNavigationRuntimeRscTextChunkByteScript(text));
253
+ if (mirroredNextFlightBootstrap) scripts += inlineScript(textToByteString(createNextFlightChunkScript(textDecoder.decode(text))));
254
+ };
255
+ for (const chunk of chunks) if (chunk instanceof Uint8Array) {
256
+ if (textBytes > 0 && textBytes + chunk.byteLength > RSC_EMBED_TEXT_BATCH_MAX_BYTES) flushTextChunks();
257
+ textChunks.push(chunk);
258
+ textBytes += chunk.byteLength;
259
+ } else {
260
+ flushTextChunks();
261
+ scripts += inlineScript(textToByteString(createNavigationRuntimeRscChunkScript(chunk)));
262
+ if (mirroredNextFlightBootstrap) scripts += inlineScript(textToByteString(createNextFlightChunkScript(chunk)));
263
+ }
264
+ flushTextChunks();
265
+ return scripts;
266
+ }
112
267
  return {
113
268
  flush() {
114
- if (pendingChunks.length === 0) return "";
115
- const mirrorScripts = startNextFlightMirror();
116
- const chunks = pendingChunks;
117
- pendingChunks = [];
118
- embeddedRawChunkCount += chunks.length;
119
- const embeddedChunks = [];
120
- let textChunks = [];
121
- let textLength = 0;
122
- const flushTextChunks = () => {
123
- if (textChunks.length === 0) return;
124
- embeddedChunks.push(textChunks.join(""));
125
- textChunks = [];
126
- textLength = 0;
127
- };
128
- for (const chunk of chunks) if (typeof chunk === "string") {
129
- if (textLength > 0 && textLength + chunk.length > RSC_EMBED_TEXT_BATCH_MAX_LENGTH) flushTextChunks();
130
- textChunks.push(chunk);
131
- textLength += chunk.length;
132
- } else {
133
- flushTextChunks();
134
- embeddedChunks.push(chunk);
135
- }
136
- flushTextChunks();
137
- let scripts = mirrorScripts;
138
- for (const chunk of embeddedChunks) {
139
- scripts += createInlineScriptTag(createNavigationRuntimeRscChunkScript(chunk), options.scriptNonce);
140
- if (mirroredNextFlightBootstrap) scripts += createInlineScriptTag(createNextFlightChunkScript(chunk), options.scriptNonce);
141
- }
142
- return scripts;
269
+ const scripts = flushByteScripts();
270
+ return scripts ? byteStringToBytes(scripts) : null;
143
271
  },
144
272
  async finalize() {
145
273
  await pumpPromise;
146
- let scripts = this.flush();
274
+ let scripts = flushByteScripts();
147
275
  scripts += startNextFlightMirror();
148
276
  finalized = true;
149
277
  releaseRawChunks();
150
- scripts += createInlineScriptTag(createNavigationRuntimeRscDoneScript(options.getInitialNavigationCacheMetadata?.()), options.scriptNonce);
151
- return scripts;
278
+ scripts += inlineScript(textToByteString(createNavigationRuntimeRscDoneScript(options.getInitialNavigationCacheMetadata?.())));
279
+ return byteStringToBytes(scripts);
152
280
  },
153
281
  async getRawBuffer() {
154
282
  await pumpPromise;
@@ -156,17 +284,33 @@ function createRscEmbedTransform(embedStream, optionsOrNonce = {}) {
156
284
  rawBufferTaken = true;
157
285
  releaseRawChunks();
158
286
  return buffer.buffer;
287
+ },
288
+ replay(replayOptions) {
289
+ if (rawChunksReleased) return null;
290
+ const keepOpen = replayOptions?.keepOpen === true;
291
+ let replay;
292
+ return new ReadableStream({
293
+ start(controller) {
294
+ for (const chunk of rawChunks) controller.enqueue(chunk);
295
+ if (readError) controller.error(readError.error);
296
+ else if (readDone) {
297
+ if (!keepOpen) controller.close();
298
+ } else {
299
+ replay = {
300
+ controller,
301
+ keepOpen
302
+ };
303
+ replays.push(replay);
304
+ }
305
+ },
306
+ cancel() {
307
+ const index = replay ? replays.indexOf(replay) : -1;
308
+ if (index !== -1) replays.splice(index, 1);
309
+ }
310
+ });
159
311
  }
160
312
  };
161
313
  }
162
- /**
163
- * Fix invalid preload "as" values in server-rendered HTML.
164
- * React Fizz emits <link rel="preload" as="stylesheet"> for CSS, but the
165
- * HTML spec requires as="style" for <link rel="preload">.
166
- */
167
- function fixPreloadAs(html) {
168
- return html.replace(/<link(?=[^>]*\srel="preload")[^>]*>/g, (tag) => tag.replace(" as=\"stylesheet\"", " as=\"style\""));
169
- }
170
314
  const LINK_TAG_RE = /<link\b[^>]*>/gi;
171
315
  const HTML_REWRITE_EXCLUDED_REGION_RE = /<!--[\s\S]*?-->|<(script|style|textarea|title)\b[^>]*>[\s\S]*?<\/\1\s*>/gi;
172
316
  const HTML_REWRITE_EXCLUDED_REGION_START_RE = /<!--|<(script|style|textarea|title)\b[^>]*>/gi;
@@ -318,6 +462,42 @@ const HEAD_OPEN_RE = /<head\b[^>]*>/;
318
462
  * (see `createMoveSuffixStream` and `CLOSE_TAG`)
319
463
  */
320
464
  const DOCUMENT_CLOSE_SUFFIX = "</body></html>";
465
+ const DOCUMENT_CLOSE_SUFFIX_BYTES = new TextEncoder().encode(DOCUMENT_CLOSE_SUFFIX);
466
+ const HEAD_CLOSE_BYTES = new TextEncoder().encode("</head>");
467
+ /**
468
+ * Whether `chunks` end partway through a UTF-8 character, i.e. whether a
469
+ * streaming TextDecoder may still be holding back their last bytes. Errs
470
+ * towards true: when the batch has too few bytes to tell, the previous
471
+ * batch's answer carries over.
472
+ */
473
+ function endsWithIncompleteUtf8Character(chunks, previousBatchEndedIncomplete) {
474
+ let continuationBytes = 0;
475
+ for (let chunkIndex = chunks.length - 1; chunkIndex >= 0; chunkIndex--) {
476
+ const chunk = chunks[chunkIndex];
477
+ for (let index = chunk.byteLength - 1; index >= 0; index--) {
478
+ const byte = chunk[index];
479
+ if ((byte & 192) !== 128) {
480
+ const length = byte >= 240 ? 4 : byte >= 224 ? 3 : byte >= 192 ? 2 : 1;
481
+ return continuationBytes + 1 < length;
482
+ }
483
+ if (++continuationBytes === 3) return false;
484
+ }
485
+ }
486
+ return previousBatchEndedIncomplete;
487
+ }
488
+ /**
489
+ * Find an ASCII `pattern` in UTF-8 `bytes`, starting at `from`. ASCII bytes
490
+ * never occur inside a multi-byte character, so every byte match is a match
491
+ * in the decoded text too.
492
+ */
493
+ function indexOfAsciiBytes(bytes, pattern, from) {
494
+ const last = bytes.byteLength - pattern.byteLength;
495
+ search: for (let index = from; index <= last; index++) {
496
+ for (let offset = 0; offset < pattern.byteLength; offset++) if (bytes[index + offset] !== pattern[offset]) continue search;
497
+ return index;
498
+ }
499
+ return -1;
500
+ }
321
501
  /**
322
502
  * Create the tick-buffered HTML transform that injects RSC scripts between
323
503
  * React Fizz flush cycles without corrupting split HTML chunks.
@@ -353,10 +533,44 @@ function createTickBufferedTransform(rscEmbed, injectHTML = "", injectAfterHeadO
353
533
  let preHeadInjected = false;
354
534
  let suffixStripped = false;
355
535
  let buffered = [];
536
+ let bufferedBytes = [];
537
+ let decoderMayHoldBytes = false;
356
538
  let pendingHtml = "";
357
539
  let timeoutId = null;
358
540
  const hasInlineCssManifest = inlineCssManifest !== void 0 && Object.keys(inlineCssManifest).length > 0;
359
541
  /**
542
+ * Return this batch's bytes when they are exactly the UTF-8 encoding of its
543
+ * decoded text, so they can stand in for re-encoding that text. That needs
544
+ * the batch to start and end on character boundaries (the decoder holds no
545
+ * bytes across it) and to contain no invalid UTF-8, which the decoder would
546
+ * have replaced with U+FFFD.
547
+ */
548
+ const takeBufferedBytes = (html) => {
549
+ if (hasInlineCssManifest) return null;
550
+ const chunks = bufferedBytes;
551
+ bufferedBytes = [];
552
+ const startsMidCharacter = decoderMayHoldBytes;
553
+ decoderMayHoldBytes = endsWithIncompleteUtf8Character(chunks, decoderMayHoldBytes);
554
+ if (startsMidCharacter || decoderMayHoldBytes || html.includes("�")) return null;
555
+ return chunks.length === 1 ? chunks[0] : concatUint8Arrays(chunks);
556
+ };
557
+ /**
558
+ * Byte form of `stripDocumentCloseSuffix(html.slice(htmlStart))` for a batch
559
+ * whose bytes encode `html`: returns the bytes from `byteStart` (the byte
560
+ * offset of `htmlStart`) with the first suffix removed.
561
+ */
562
+ const stripDocumentCloseSuffixBytes = (bytes, byteStart, html, htmlStart) => {
563
+ const rest = bytes.subarray(byteStart);
564
+ if (suffixStripped) return rest;
565
+ const index = html.indexOf(DOCUMENT_CLOSE_SUFFIX, htmlStart);
566
+ if (index === -1) return rest;
567
+ suffixStripped = true;
568
+ const byteIndex = indexOfAsciiBytes(bytes, DOCUMENT_CLOSE_SUFFIX_BYTES, byteStart + index - htmlStart);
569
+ const before = bytes.subarray(byteStart, byteIndex);
570
+ const after = bytes.subarray(byteIndex + DOCUMENT_CLOSE_SUFFIX_BYTES.byteLength);
571
+ return after.byteLength === 0 ? before : concatUint8Arrays([before, after]);
572
+ };
573
+ /**
360
574
  * Strip the first occurrence of `</body></html>` from `chunk` so it can be
361
575
  * re-emitted at the very end of the stream. Returns the rewritten chunk and
362
576
  * a flag indicating whether a suffix was found. If `suffixStripped` is
@@ -397,22 +611,26 @@ function createTickBufferedTransform(rscEmbed, injectHTML = "", injectAfterHeadO
397
611
  const spliceAfterHeadOpen = (chunk) => {
398
612
  if (preHeadInjected) return {
399
613
  chunk,
400
- spliced: false
614
+ spliced: false,
615
+ insertionEnd: 0
401
616
  };
402
617
  const insertion = readPreHeadInsertion();
403
618
  if (!insertion) return {
404
619
  chunk,
405
- spliced: false
620
+ spliced: false,
621
+ insertionEnd: 0
406
622
  };
407
623
  const match = HEAD_OPEN_RE.exec(chunk);
408
624
  if (!match) return {
409
625
  chunk,
410
- spliced: false
626
+ spliced: false,
627
+ insertionEnd: 0
411
628
  };
412
629
  const insertAt = match.index + match[0].length;
413
630
  return {
414
631
  chunk: chunk.slice(0, insertAt) + insertion + chunk.slice(insertAt),
415
- spliced: true
632
+ spliced: true,
633
+ insertionEnd: insertAt + insertion.length
416
634
  };
417
635
  };
418
636
  const flushBuffered = (controller, final = false) => {
@@ -420,6 +638,7 @@ function createTickBufferedTransform(rscEmbed, injectHTML = "", injectAfterHeadO
420
638
  const rawHtml = pendingHtml + buffered.join("");
421
639
  buffered = [];
422
640
  pendingHtml = "";
641
+ const rawBytes = takeBufferedBytes(rawHtml);
423
642
  const split = final || !hasInlineCssManifest ? {
424
643
  complete: rawHtml,
425
644
  trailing: ""
@@ -427,29 +646,42 @@ function createTickBufferedTransform(rscEmbed, injectHTML = "", injectAfterHeadO
427
646
  if (split.trailing) pendingHtml = split.trailing;
428
647
  if (!split.complete) return;
429
648
  if (injected && insertsPerFlush) emitInsertion(controller);
430
- const preparedHtml = fixPreloadAs(split.complete);
431
- const inlineCssResult = hasInlineCssManifest ? rewriteInlineCssStylesheetLinks(preparedHtml, inlineCssManifest, inlineCssPrependCss, inlineCssScriptNonce) : {
432
- html: preparedHtml,
649
+ const inlineCssResult = hasInlineCssManifest ? rewriteInlineCssStylesheetLinks(split.complete, inlineCssManifest, inlineCssPrependCss, inlineCssScriptNonce) : {
650
+ html: split.complete,
433
651
  consumedPrependCss: false
434
652
  };
435
653
  if (inlineCssResult.consumedPrependCss) inlineCssPrependCss = "";
436
654
  let working = inlineCssResult.html;
655
+ const unchangedBytes = working === rawHtml ? rawBytes : null;
656
+ let rawTextStart = 0;
437
657
  if (!preHeadInjected) {
438
658
  const result = spliceAfterHeadOpen(working);
439
659
  if (result.spliced) {
440
660
  working = result.chunk;
441
661
  preHeadInjected = true;
662
+ rawTextStart = result.insertionEnd;
442
663
  }
443
664
  }
444
665
  if (!injected) {
445
666
  const headEnd = working.indexOf("</head>");
446
667
  if (headEnd !== -1) {
447
668
  const before = working.slice(0, headEnd);
669
+ if (unchangedBytes && headEnd >= rawTextStart) {
670
+ const rawHeadEnd = headEnd - (working.length - rawHtml.length);
671
+ const byteHeadEnd = indexOfAsciiBytes(unchangedBytes, HEAD_CLOSE_BYTES, rawHeadEnd);
672
+ controller.enqueue(encoder.encode(before + readInlineCssPrependFallback() + readInsertion()));
673
+ controller.enqueue(stripDocumentCloseSuffixBytes(unchangedBytes, byteHeadEnd, rawHtml, rawHeadEnd));
674
+ injected = true;
675
+ return;
676
+ }
448
677
  const after = stripDocumentCloseSuffix(working.slice(headEnd));
449
678
  controller.enqueue(encoder.encode(before + readInlineCssPrependFallback() + readInsertion() + after));
450
679
  injected = true;
451
680
  return;
452
681
  }
682
+ } else if (unchangedBytes && rawTextStart === 0) {
683
+ controller.enqueue(stripDocumentCloseSuffixBytes(unchangedBytes, 0, rawHtml, 0));
684
+ return;
453
685
  }
454
686
  working = stripDocumentCloseSuffix(working);
455
687
  controller.enqueue(encoder.encode(working));
@@ -457,12 +689,13 @@ function createTickBufferedTransform(rscEmbed, injectHTML = "", injectAfterHeadO
457
689
  return new TransformStream({
458
690
  transform(chunk, controller) {
459
691
  buffered.push(decoder.decode(chunk, { stream: true }));
692
+ if (!hasInlineCssManifest) bufferedBytes.push(chunk);
460
693
  if (timeoutId !== null) return;
461
694
  timeoutId = setTimeout(() => {
462
695
  try {
463
696
  flushBuffered(controller);
464
697
  const rscScripts = rscEmbed.flush();
465
- if (rscScripts) controller.enqueue(encoder.encode(rscScripts));
698
+ if (rscScripts) controller.enqueue(rscScripts);
466
699
  } catch {}
467
700
  timeoutId = null;
468
701
  }, 0);
@@ -479,11 +712,10 @@ function createTickBufferedTransform(rscEmbed, injectHTML = "", injectAfterHeadO
479
712
  emitInsertion(controller);
480
713
  injected = true;
481
714
  } else if (insertsPerFlush) emitInsertion(controller);
482
- const finalScripts = await rscEmbed.finalize();
483
- if (finalScripts) controller.enqueue(encoder.encode(finalScripts));
715
+ controller.enqueue(await rscEmbed.finalize());
484
716
  controller.enqueue(encoder.encode(DOCUMENT_CLOSE_SUFFIX));
485
717
  }
486
718
  });
487
719
  }
488
720
  //#endregion
489
- export { createNavigationRuntimeRenderedSearchScript, createNavigationRuntimeRscCompatibilityScript, createNavigationRuntimeRscMetadataScript, createRscEmbedTransform, createTickBufferedTransform, fixPreloadAs, navigationRuntimeRscBootstrapExpression, waitAtLeastOneReactRenderTask };
721
+ export { createNavigationRuntimeRenderedSearchScript, createNavigationRuntimeRscCompatibilityScript, createNavigationRuntimeRscMetadataScript, createRscEmbedTransform, createTickBufferedTransform, navigationRuntimeRscBootstrapExpression, rewriteInlineCssStylesheetLinks, waitAtLeastOneReactRenderTask };
@@ -11,4 +11,5 @@ type CreateStaticGenerationHeadersContextOptions = {
11
11
  export declare function getAppPageStaticGenerationErrorMessage(): string;
12
12
  export declare function getAppRouteStaticGenerationErrorMessage(routePattern?: string, expression?: string): string;
13
13
  export declare function createStaticGenerationHeadersContext(options: CreateStaticGenerationHeadersContextOptions): HeadersContext;
14
- //#endregion
14
+ //#endregion
15
+ export {};
@@ -0,0 +1,39 @@
1
+ import { AssetCrossOrigin } from "./pages-client-assets.js";
2
+ import { RouteClientReferenceSet } from "./app-client-reference-preloader.js";
3
+ //#region src/server/app-streamed-client-references.d.ts
4
+ type ClientReferenceLoader = () => Promise<unknown>;
5
+ /** A render's streamed references, and the stylesheets the render linked. */
6
+ export type StreamedClientReferences = {
7
+ /** The render's CSP nonce for the scripts it hints. */
8
+ nonce: string | undefined;
9
+ /** next.config's crossOrigin for the assets it links; "" when unset. */
10
+ crossOrigin: AssetCrossOrigin;
11
+ streamed: ReadonlySet<string>;
12
+ /** Each of the route's references' position in import order. */
13
+ positions: ReadonlyMap<string, number>;
14
+ /** Streamed references whose stylesheets aren't linked yet, in import order. */
15
+ unlinked: string[];
16
+ linkedStylesheets: Set<string>;
17
+ };
18
+ /**
19
+ * Wrap plugin-rsc's client-reference loader before any client reference
20
+ * loads; a production build calls this as its SSR entry starts. `asyncIds` are
21
+ * the references any route may stream, and `getLoader` returns a reference's
22
+ * own loader from the client-references module.
23
+ */
24
+ export declare function wrapClientReferenceRequire(asyncIds: ReadonlySet<string>, getLoader: (id: string) => ClientReferenceLoader | undefined): void;
25
+ export declare function createStreamedClientReferences(route: RouteClientReferenceSet | undefined, nonce: string | undefined, crossOrigin: AssetCrossOrigin): StreamedClientReferences;
26
+ /**
27
+ * Forget the stylesheets a discarded render linked, so the render that
28
+ * replaces it links them again.
29
+ */
30
+ export declare function resetStreamedClientReferences(render: StreamedClientReferences | null, route: RouteClientReferenceSet | undefined): void;
31
+ /** Run a render, and the Flight stream it reads, with its streamed references. */
32
+ export declare function runWithStreamedClientReferences<R>(render: StreamedClientReferences, fn: () => R): R;
33
+ /**
34
+ * The `<head>` links of the streamed stylesheets a render's shell left
35
+ * unlinked, those of streamed references after every reference it rendered.
36
+ */
37
+ export declare function renderStreamedStylesheets(render: StreamedClientReferences): string;
38
+ //#endregion
39
+ export {};