vinext 1.3.0 → 1.3.1

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 (391) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +1 -1
  2. package/dist/build/action-owner-manifest.d.ts +3 -2
  3. package/dist/build/action-owner-manifest.js +18 -2
  4. package/dist/build/app-page-static-eligibility.d.ts +17 -1
  5. package/dist/build/app-page-static-eligibility.js +80 -13
  6. package/dist/build/clean-output.d.ts +2 -1
  7. package/dist/build/client-build-config.d.ts +13 -3
  8. package/dist/build/client-build-config.js +46 -9
  9. package/dist/build/client-reference-async.d.ts +48 -0
  10. package/dist/build/client-reference-async.js +123 -0
  11. package/dist/build/client-reference-chunks.d.ts +32 -0
  12. package/dist/build/client-reference-chunks.js +111 -0
  13. package/dist/build/client-reference-groups.d.ts +9 -1
  14. package/dist/build/client-reference-groups.js +40 -2
  15. package/dist/build/css-url-assets.d.ts +2 -1
  16. package/dist/build/google-fonts/fallback-metrics.d.ts +2 -1
  17. package/dist/build/google-fonts/find-font-files-in-css.d.ts +1 -0
  18. package/dist/build/google-fonts/find-font-files-in-css.js +17 -4
  19. package/dist/build/google-fonts/font-metadata.d.ts +2 -1
  20. package/dist/build/google-fonts/validate.d.ts +2 -1
  21. package/dist/build/inline-css.d.ts +2 -1
  22. package/dist/build/layout-classification.d.ts +2 -1
  23. package/dist/build/module-dependency-cache.d.ts +2 -1
  24. package/dist/build/next-client-runtime-manifests.d.ts +2 -1
  25. package/dist/build/precompress.d.ts +2 -1
  26. package/dist/build/precompress.js +1 -1
  27. package/dist/build/prerender-paths.d.ts +2 -1
  28. package/dist/build/prerender-phase.d.ts +2 -1
  29. package/dist/build/prerender-server-pool.js +1 -1
  30. package/dist/build/prerender.d.ts +3 -2
  31. package/dist/build/prerender.js +5 -4
  32. package/dist/build/report.d.ts +2 -1
  33. package/dist/build/route-classification-injector.d.ts +2 -1
  34. package/dist/build/route-classification-manifest.d.ts +2 -1
  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 +4 -0
  43. package/dist/cli-args.d.ts +2 -1
  44. package/dist/cli.js +2 -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/index.js +1 -2
  51. package/dist/client/instrumentation-client-state.js +5 -5
  52. package/dist/client/navigation-runtime.d.ts +3 -1
  53. package/dist/client/navigation-runtime.js +1 -1
  54. package/dist/client/pages-router-link-navigation.d.ts +2 -1
  55. package/dist/client/vinext-next-data.d.ts +25 -1
  56. package/dist/client/window-next.d.ts +2 -1
  57. package/dist/config/config-matchers.d.ts +12 -1
  58. package/dist/config/config-matchers.js +111 -16
  59. package/dist/config/dotenv.d.ts +2 -1
  60. package/dist/config/next-config.d.ts +13 -1
  61. package/dist/config/next-config.js +29 -4
  62. package/dist/config/tsconfig-paths.d.ts +2 -1
  63. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/detector.js +23 -0
  64. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/index.js +2 -0
  65. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/lookup.js +25 -0
  66. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/bmp.js +11 -0
  67. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/cur.js +15 -0
  68. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/dds.js +11 -0
  69. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/gif.js +12 -0
  70. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/heif.js +55 -0
  71. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/icns.js +76 -0
  72. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/ico.js +39 -0
  73. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/index.js +46 -0
  74. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/j2c.js +11 -0
  75. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/jp2.js +21 -0
  76. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/jpg.js +71 -0
  77. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/jxl-stream.js +42 -0
  78. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/jxl.js +46 -0
  79. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/ktx.js +19 -0
  80. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/png.js +28 -0
  81. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/pnm.js +54 -0
  82. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/psd.js +11 -0
  83. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/svg.js +79 -0
  84. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/tga.js +15 -0
  85. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/tiff.js +96 -0
  86. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/utils.js +53 -0
  87. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/webp.js +45 -0
  88. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/utils/bit-reader.js +38 -0
  89. package/dist/deps/.pnpm/ua-parser-js@1.0.35/deps/ua-parser-js/src/ua-parser.js +2 -2
  90. package/dist/entries/app-browser-entry.d.ts +20 -5
  91. package/dist/entries/app-browser-entry.js +79 -6
  92. package/dist/entries/app-rsc-entry.d.ts +2 -1
  93. package/dist/entries/app-rsc-entry.js +42 -12
  94. package/dist/entries/app-rsc-manifest.d.ts +2 -1
  95. package/dist/entries/app-rsc-manifest.js +53 -0
  96. package/dist/entries/pages-entry-helpers.js +1 -2
  97. package/dist/entries/pages-server-entry.d.ts +2 -1
  98. package/dist/entries/pages-server-entry.js +1 -1
  99. package/dist/entries/runtime-entry-module.d.ts +1 -0
  100. package/dist/entries/runtime-entry-module.js +4 -1
  101. package/dist/image/image-adapters-virtual.d.ts +2 -1
  102. package/dist/index.js +102 -34
  103. package/dist/plugins/client-compile-hints.d.ts +30 -0
  104. package/dist/plugins/client-compile-hints.js +88 -0
  105. package/dist/plugins/client-reference-dedup.d.ts +2 -1
  106. package/dist/plugins/cloudflare-dev-module-urls.d.ts +2 -1
  107. package/dist/plugins/dynamic-preload-metadata.d.ts +3 -1
  108. package/dist/plugins/dynamic-preload-metadata.js +1 -1
  109. package/dist/plugins/environment.d.ts +2 -1
  110. package/dist/plugins/fonts.js +9 -12
  111. package/dist/plugins/ignore-dynamic-requests.d.ts +2 -1
  112. package/dist/plugins/import-meta-url.d.ts +2 -1
  113. package/dist/plugins/og-assets.d.ts +2 -1
  114. package/dist/plugins/og-assets.js +2 -3
  115. package/dist/plugins/optimize-imports.d.ts +2 -1
  116. package/dist/plugins/pages-node-externals.d.ts +2 -1
  117. package/dist/plugins/remove-console.d.ts +2 -1
  118. package/dist/plugins/require-condition-resolution.d.ts +2 -1
  119. package/dist/plugins/rsc-client-reference-loaders.d.ts +8 -0
  120. package/dist/plugins/rsc-client-reference-loaders.js +170 -68
  121. package/dist/plugins/rsc-client-shim-excludes.js +2 -0
  122. package/dist/plugins/sass.d.ts +2 -1
  123. package/dist/plugins/strip-server-exports.d.ts +2 -1
  124. package/dist/plugins/styled-jsx.d.ts +2 -1
  125. package/dist/plugins/transform-result.d.ts +2 -1
  126. package/dist/plugins/typeof-window.d.ts +2 -1
  127. package/dist/plugins/worker-image-imports.js +1 -1
  128. package/dist/plugins/worker-use-server.d.ts +2 -1
  129. package/dist/routing/app-route-graph.d.ts +40 -0
  130. package/dist/routing/app-route-graph.js +122 -50
  131. package/dist/routing/browser-route-manifest.d.ts +2 -1
  132. package/dist/routing/optimistic-route-trie.d.ts +2 -1
  133. package/dist/routing/route-matching.d.ts +2 -1
  134. package/dist/routing/route-pattern.d.ts +2 -1
  135. package/dist/server/accept-encoding.d.ts +2 -1
  136. package/dist/server/app-action-forwarding.d.ts +2 -1
  137. package/dist/server/app-bfcache-identity.d.ts +2 -1
  138. package/dist/server/app-browser-action-result.d.ts +2 -1
  139. package/dist/server/app-browser-client-reuse-manifest.d.ts +2 -1
  140. package/dist/server/app-browser-entry.js +30 -6
  141. package/dist/server/app-browser-error.d.ts +2 -1
  142. package/dist/server/app-browser-history-controller.d.ts +2 -1
  143. package/dist/server/app-browser-hydration.d.ts +2 -1
  144. package/dist/server/app-browser-interception-context.d.ts +2 -1
  145. package/dist/server/app-browser-navigation-controller.js +15 -10
  146. package/dist/server/app-browser-popstate.d.ts +2 -1
  147. package/dist/server/app-browser-rsc-redirect.d.ts +2 -1
  148. package/dist/server/app-browser-server-action-client.d.ts +2 -1
  149. package/dist/server/app-browser-state.js +1 -1
  150. package/dist/server/app-browser-stream.d.ts +2 -1
  151. package/dist/server/app-browser-visible-commit.d.ts +2 -1
  152. package/dist/server/app-client-reference-manifest.d.ts +31 -0
  153. package/dist/server/app-client-reference-manifest.js +46 -0
  154. package/dist/server/app-client-reference-preloader.d.ts +25 -5
  155. package/dist/server/app-client-reference-preloader.js +22 -7
  156. package/dist/server/app-elements-wire.d.ts +2 -1
  157. package/dist/server/app-elements.d.ts +2 -0
  158. package/dist/server/app-elements.js +3 -1
  159. package/dist/server/app-fallback-renderer.d.ts +9 -2
  160. package/dist/server/app-fallback-renderer.js +4 -1
  161. package/dist/server/app-history-state.d.ts +2 -1
  162. package/dist/server/app-inline-css-client.d.ts +2 -1
  163. package/dist/server/app-layout-param-observation.d.ts +2 -1
  164. package/dist/server/app-metadata-tracing.d.ts +2 -1
  165. package/dist/server/app-optimistic-routing.d.ts +18 -1
  166. package/dist/server/app-optimistic-routing.js +34 -1
  167. package/dist/server/app-page-boundary-render.d.ts +20 -2
  168. package/dist/server/app-page-boundary-render.js +221 -38
  169. package/dist/server/app-page-boundary.d.ts +34 -5
  170. package/dist/server/app-page-boundary.js +40 -7
  171. package/dist/server/app-page-cache-finalizer.d.ts +2 -1
  172. package/dist/server/app-page-cache-finalizer.js +1 -1
  173. package/dist/server/app-page-cache-render.d.ts +10 -2
  174. package/dist/server/app-page-cache-render.js +14 -2
  175. package/dist/server/app-page-cache.js +2 -2
  176. package/dist/server/app-page-dispatch.d.ts +34 -1
  177. package/dist/server/app-page-dispatch.js +163 -34
  178. package/dist/server/app-page-element-builder.d.ts +17 -1
  179. package/dist/server/app-page-element-builder.js +187 -66
  180. package/dist/server/app-page-execution.d.ts +28 -1
  181. package/dist/server/app-page-execution.js +114 -5
  182. package/dist/server/app-page-head.d.ts +95 -3
  183. package/dist/server/app-page-head.js +307 -152
  184. package/dist/server/app-page-http-access-fallback-metadata.d.ts +48 -2
  185. package/dist/server/app-page-http-access-fallback-metadata.js +76 -1
  186. package/dist/server/app-page-method.d.ts +2 -1
  187. package/dist/server/app-page-probe.d.ts +2 -1
  188. package/dist/server/app-page-render-identity.d.ts +2 -1
  189. package/dist/server/app-page-render.d.ts +7 -1
  190. package/dist/server/app-page-render.js +35 -10
  191. package/dist/server/app-page-request.d.ts +14 -1
  192. package/dist/server/app-page-request.js +1 -1
  193. package/dist/server/app-page-route-wiring.d.ts +52 -2
  194. package/dist/server/app-page-route-wiring.js +197 -47
  195. package/dist/server/app-page-rsc-render-status.d.ts +2 -1
  196. package/dist/server/app-page-search-params-observation.d.ts +7 -2
  197. package/dist/server/app-page-search-params-observation.js +8 -1
  198. package/dist/server/app-page-segment-plan.d.ts +2 -1
  199. package/dist/server/app-page-stream.d.ts +31 -1
  200. package/dist/server/app-page-stream.js +23 -4
  201. package/dist/server/app-pages-bridge.d.ts +2 -1
  202. package/dist/server/app-ppr-fallback-shell-render.d.ts +2 -1
  203. package/dist/server/app-ppr-fallback-shell.d.ts +2 -1
  204. package/dist/server/app-prerender-endpoints.d.ts +2 -1
  205. package/dist/server/app-prerender-static-params.d.ts +2 -1
  206. package/dist/server/app-render-dependency.d.ts +11 -1
  207. package/dist/server/app-render-dependency.js +26 -7
  208. package/dist/server/app-request-stage-independent-entry.d.ts +2 -1
  209. package/dist/server/app-response-stage-entry.d.ts +2 -1
  210. package/dist/server/app-route-handler-cache.d.ts +2 -1
  211. package/dist/server/app-route-handler-dispatch.d.ts +2 -1
  212. package/dist/server/app-route-handler-dispatch.js +1 -1
  213. package/dist/server/app-route-handler-execution.d.ts +2 -1
  214. package/dist/server/app-route-handler-response.d.ts +2 -1
  215. package/dist/server/app-route-handler-runtime.d.ts +2 -1
  216. package/dist/server/app-route-module-loader.d.ts +18 -1
  217. package/dist/server/app-route-module-loader.js +8 -0
  218. package/dist/server/app-route-tree-prefetch.d.ts +2 -1
  219. package/dist/server/app-rsc-error-handler.d.ts +2 -1
  220. package/dist/server/app-rsc-errors.d.ts +2 -1
  221. package/dist/server/app-rsc-handler.d.ts +2 -1
  222. package/dist/server/app-rsc-handler.js +6 -10
  223. package/dist/server/app-rsc-response-finalizer.d.ts +2 -1
  224. package/dist/server/app-rsc-route-matching.d.ts +38 -1
  225. package/dist/server/app-rsc-route-matching.js +24 -0
  226. package/dist/server/app-segment-config.d.ts +2 -1
  227. package/dist/server/app-segment-config.js +1 -14
  228. package/dist/server/app-server-action-execution.d.ts +2 -1
  229. package/dist/server/app-server-action-execution.js +3 -3
  230. package/dist/server/app-ssr-entry.d.ts +6 -0
  231. package/dist/server/app-ssr-entry.js +91 -44
  232. package/dist/server/app-ssr-error-meta.d.ts +2 -1
  233. package/dist/server/app-ssr-search-params-gate.d.ts +2 -1
  234. package/dist/server/app-ssr-stream.d.ts +22 -10
  235. package/dist/server/app-ssr-stream.js +299 -67
  236. package/dist/server/app-static-generation.d.ts +2 -1
  237. package/dist/server/app-streamed-client-references.d.ts +39 -0
  238. package/dist/server/app-streamed-client-references.js +156 -0
  239. package/dist/server/app-visited-response-cache.d.ts +2 -1
  240. package/dist/server/app-worker-stages.d.ts +2 -1
  241. package/dist/server/artifact-compatibility.d.ts +2 -1
  242. package/dist/server/bfcache-identity.d.ts +2 -1
  243. package/dist/server/cache-headers.d.ts +2 -1
  244. package/dist/server/cacheability-request.d.ts +2 -1
  245. package/dist/server/client-reuse-manifest.d.ts +2 -1
  246. package/dist/server/config-headers.d.ts +2 -1
  247. package/dist/server/csp.d.ts +2 -1
  248. package/dist/server/default-global-not-found-module.d.ts +2 -1
  249. package/dist/server/default-http-access-fallback-modules.d.ts +33 -0
  250. package/dist/server/default-http-access-fallback-modules.js +31 -0
  251. package/dist/server/defer-until-stream-consumed.d.ts +34 -0
  252. package/dist/server/defer-until-stream-consumed.js +154 -21
  253. package/dist/server/dev-lockfile.d.ts +32 -2
  254. package/dist/server/dev-lockfile.js +46 -2
  255. package/dist/server/dev-module-runner.d.ts +2 -1
  256. package/dist/server/dev-server.js +10 -3
  257. package/dist/server/fetch-handler.js +1 -2
  258. package/dist/server/file-based-metadata.d.ts +2 -1
  259. package/dist/server/framework-tracer.d.ts +2 -1
  260. package/dist/server/html.d.ts +1 -0
  261. package/dist/server/html.js +19 -1
  262. package/dist/server/http-conditional.d.ts +2 -1
  263. package/dist/server/http-error-responses.d.ts +2 -1
  264. package/dist/server/implicit-tags.d.ts +2 -1
  265. package/dist/server/metadata-route-build-data.d.ts +2 -1
  266. package/dist/server/metadata-route-build-data.js +1 -1
  267. package/dist/server/metadata-route-response.d.ts +2 -1
  268. package/dist/server/metadata-route-response.js +1 -1
  269. package/dist/server/metadata-routes.d.ts +2 -1
  270. package/dist/server/middleware-runtime.d.ts +2 -1
  271. package/dist/server/navigation-trace.d.ts +2 -1
  272. package/dist/server/next-error-digest.d.ts +2 -1
  273. package/dist/server/nitro-public-files-plugin.d.ts +2 -1
  274. package/dist/server/nitro-public-files.d.ts +2 -1
  275. package/dist/server/opentelemetry-api.d.ts +2 -1
  276. package/dist/server/operation-token.d.ts +2 -1
  277. package/dist/server/pages-api-route.d.ts +2 -1
  278. package/dist/server/pages-asset-tags.d.ts +2 -1
  279. package/dist/server/pages-body-parser-config.d.ts +2 -1
  280. package/dist/server/pages-client-assets.d.ts +4 -0
  281. package/dist/server/pages-data-route.d.ts +2 -1
  282. package/dist/server/pages-document-asset-props.d.ts +2 -1
  283. package/dist/server/pages-document-initial-props.d.ts +2 -1
  284. package/dist/server/pages-execution-tracing.d.ts +2 -1
  285. package/dist/server/pages-execution-tracing.js +1 -1
  286. package/dist/server/pages-get-initial-props.d.ts +2 -1
  287. package/dist/server/pages-page-data.d.ts +7 -1
  288. package/dist/server/pages-page-data.js +35 -12
  289. package/dist/server/pages-page-handler.d.ts +3 -2
  290. package/dist/server/pages-page-handler.js +16 -7
  291. package/dist/server/pages-page-method.d.ts +2 -1
  292. package/dist/server/pages-page-response.d.ts +2 -1
  293. package/dist/server/pages-preview.d.ts +2 -1
  294. package/dist/server/pages-readiness.d.ts +2 -1
  295. package/dist/server/pages-request-pipeline.d.ts +2 -1
  296. package/dist/server/pages-request-pipeline.js +4 -5
  297. package/dist/server/pages-request-stage-entry.d.ts +2 -1
  298. package/dist/server/pages-response-stage-entry.d.ts +2 -1
  299. package/dist/server/pages-route-data-kind.d.ts +2 -1
  300. package/dist/server/prerender-cache-life-header.d.ts +2 -1
  301. package/dist/server/prerender-route-params.d.ts +2 -1
  302. package/dist/server/prod-server.js +9 -3
  303. package/dist/server/request-log.d.ts +2 -1
  304. package/dist/server/request-tracing.d.ts +2 -1
  305. package/dist/server/request-tracing.js +1 -1
  306. package/dist/server/response-start-tracing.js +7 -29
  307. package/dist/server/rsc-render-stream.d.ts +4 -0
  308. package/dist/server/rsc-render-stream.js +25 -0
  309. package/dist/server/seed-cache.d.ts +2 -1
  310. package/dist/server/seed-cache.js +1 -1
  311. package/dist/server/static-file-cache.d.ts +2 -1
  312. package/dist/server/static-file-cache.js +1 -0
  313. package/dist/server/static-layout-client-reuse-proof.d.ts +2 -1
  314. package/dist/server/worker-revalidation-context.d.ts +2 -1
  315. package/dist/server/worker-stages.d.ts +2 -1
  316. package/dist/shims/app.d.ts +2 -1
  317. package/dist/shims/cache-callable-runtime.d.ts +2 -1
  318. package/dist/shims/cache-handler.d.ts +8 -3
  319. package/dist/shims/cache-handler.js +29 -9
  320. package/dist/shims/caught-not-found-boundaries.d.ts +15 -0
  321. package/dist/shims/caught-not-found-boundaries.js +48 -0
  322. package/dist/shims/cdn-purge-routes.d.ts +2 -1
  323. package/dist/shims/client-locale.js +2 -1
  324. package/dist/shims/client-page-root.d.ts +2 -1
  325. package/dist/shims/config.d.ts +2 -1
  326. package/dist/shims/default-forbidden.d.ts +4 -0
  327. package/dist/shims/default-forbidden.js +18 -0
  328. package/dist/shims/default-not-found.d.ts +0 -5
  329. package/dist/shims/default-not-found.js +5 -41
  330. package/dist/shims/default-unauthorized.d.ts +4 -0
  331. package/dist/shims/default-unauthorized.js +18 -0
  332. package/dist/shims/error-boundary.d.ts +39 -3
  333. package/dist/shims/error-boundary.js +31 -16
  334. package/dist/shims/font-google.js +1 -2
  335. package/dist/shims/font-utils.d.ts +3 -2
  336. package/dist/shims/font-utils.js +5 -3
  337. package/dist/shims/form.js +1 -1
  338. package/dist/shims/http-access-error-fallback.d.ts +7 -0
  339. package/dist/shims/http-access-error-fallback.js +47 -0
  340. package/dist/shims/image.d.ts +1 -22
  341. package/dist/shims/internal/app-prefetch-fetch-queue.d.ts +22 -2
  342. package/dist/shims/internal/app-prefetch-fetch-queue.js +71 -18
  343. package/dist/shims/internal/app-route-prefetch-policy.d.ts +14 -3
  344. package/dist/shims/internal/app-route-prefetch-policy.js +29 -4
  345. package/dist/shims/internal/cache-context-accessor.d.ts +2 -1
  346. package/dist/shims/internal/client-reference-loader.d.ts +7 -0
  347. package/dist/shims/internal/client-reference-loader.js +91 -0
  348. package/dist/shims/internal/cookie-serialize.d.ts +2 -1
  349. package/dist/shims/internal/cookies.js +1 -2
  350. package/dist/shims/internal/headers-state.d.ts +2 -0
  351. package/dist/shims/internal/headers-state.js +6 -1
  352. package/dist/shims/internal/hybrid-client-route-owner-direct.d.ts +2 -1
  353. package/dist/shims/internal/interpolate-as.d.ts +2 -1
  354. package/dist/shims/internal/pages-data-target.d.ts +2 -1
  355. package/dist/shims/internal/pages-data-url.d.ts +2 -1
  356. package/dist/shims/internal/thenable-well-known-properties.d.ts +2 -1
  357. package/dist/shims/link.js +195 -52
  358. package/dist/shims/metadata.d.ts +32 -11
  359. package/dist/shims/metadata.js +88 -26
  360. package/dist/shims/navigation-errors.d.ts +2 -1
  361. package/dist/shims/navigation.d.ts +22 -2
  362. package/dist/shims/navigation.js +74 -20
  363. package/dist/shims/pages-router-runtime.d.ts +2 -1
  364. package/dist/shims/ppr-fallback-shell.d.ts +2 -1
  365. package/dist/shims/router.js +14 -3
  366. package/dist/shims/unified-request-context.js +3 -3
  367. package/dist/typegen.d.ts +2 -1
  368. package/dist/utils/client-build-manifest.d.ts +4 -1
  369. package/dist/utils/client-build-manifest.js +9 -2
  370. package/dist/utils/client-entry-manifest.d.ts +13 -0
  371. package/dist/utils/client-entry-manifest.js +20 -1
  372. package/dist/utils/client-reference-chunks.d.ts +45 -0
  373. package/dist/utils/client-reference-chunks.js +30 -0
  374. package/dist/utils/client-runtime-metadata.d.ts +9 -1
  375. package/dist/utils/client-runtime-metadata.js +40 -9
  376. package/dist/utils/compare.d.ts +9 -0
  377. package/dist/utils/compare.js +15 -1
  378. package/dist/utils/lazy-chunks.d.ts +14 -0
  379. package/dist/utils/lazy-chunks.js +27 -1
  380. package/dist/utils/middleware-request-headers.d.ts +2 -1
  381. package/dist/utils/project.d.ts +2 -1
  382. package/dist/utils/project.js +9 -1
  383. package/dist/utils/query.d.ts +2 -1
  384. package/dist/utils/sorted-array.d.ts +2 -1
  385. package/dist/utils/vite-cli-invocation.d.ts +2 -1
  386. package/package.json +5 -5
  387. package/dist/deps/.pnpm/image-size@2.0.2/deps/image-size/dist/index.js +0 -808
  388. package/dist/server/default-not-found-module.d.ts +0 -19
  389. package/dist/server/default-not-found-module.js +0 -18
  390. package/dist/server/rsc-stream-hints.d.ts +0 -21
  391. package/dist/server/rsc-stream-hints.js +0 -227
@@ -1,6 +1,7 @@
1
1
  import { stripBasePath } from "../utils/base-path.js";
2
2
  import { isNavigationSignalError } from "../utils/navigation-signal.js";
3
3
  import { NEVER_CACHE_CONTROL, applyCdnResponseHeaders } from "./cache-control.js";
4
+ import { isRenderDynamicLatched, isStaticGenerationAccessError } from "../shims/internal/headers-state.js";
4
5
  import { createArtifactCompatibilityEnvelope } from "./artifact-compatibility.js";
5
6
  import { AppElementsWire } from "./app-elements-wire.js";
6
7
  import "./app-elements.js";
@@ -9,20 +10,52 @@ import { ErrorBoundary, GlobalErrorBoundary, SerializedErrorBoundary } from "../
9
10
  import { LayoutSegmentProvider } from "../shims/layout-segment-context.js";
10
11
  import { withUseCacheLayoutMarker } from "../shims/internal/app-page-props-cache-key.js";
11
12
  import { MetadataHead, ViewportHead } from "../shims/metadata.js";
12
- import { resolveAppPageBranchParams, resolveAppPageSegmentParams } from "./app-page-params.js";
13
13
  import { stripRscSuffix } from "./app-rsc-cache-busting.js";
14
+ import { copyLinkHeaderProvenance } from "./app-response-header-provenance.js";
14
15
  import { buildRscRedirectFlightStream } from "./app-rsc-redirect-flight.js";
15
16
  import { bufferAppPageBinaryStream, buildAppPageSpecialErrorResponse, resolveAppPageSpecialError } from "./app-page-execution.js";
16
- import { createAppPageLayoutEntries, createAppPageSourcePage } from "./app-page-route-wiring.js";
17
- import { createAppPageFontData, createAppPageRscErrorTracker, createAppPageSsrErrorHandler, renderAppPageHtmlResponse } from "./app-page-stream.js";
17
+ import { resolveAppPageBranchParams, resolveAppPageSegmentParams } from "./app-page-params.js";
18
+ import { createAppPageLayoutEntries, createAppPageRouteBodyMetadata, createAppPageSourcePage } from "./app-page-route-wiring.js";
18
19
  import { buildClientHookErrorMessage } from "../shims/client-hook-error.js";
19
- import { resolveActiveParallelRouteHeadInputs, resolveAppPageHead } from "./app-page-head.js";
20
- import { resolveHttpAccessFallbackMetadata, resolveHttpAccessFallbackViewport } from "./app-page-http-access-fallback-metadata.js";
21
- import "./app-rsc-route-matching.js";
20
+ import { createAppPageMetadataSearchParamsObserver } from "./app-page-search-params-observation.js";
21
+ import { hasAppPageDynamicMetadata, prepareAppPageHead, resolveActiveParallelRouteHeadInputs, resolveAppPageHead, slotInterceptKeepsSourceHead } from "./app-page-head.js";
22
22
  import { renderAppPageBoundaryResponse, resolveAppPageErrorBoundary, resolveAppPageHttpAccessBoundaryModule, wrapAppPageBoundaryElement } from "./app-page-boundary.js";
23
+ import { createRouteNotFoundHeadPlanOptions, recoverAppPageRouteHead, resolveHttpAccessFallbackMetadata, resolveHttpAccessFallbackViewport } from "./app-page-http-access-fallback-metadata.js";
24
+ import "./app-rsc-route-matching.js";
23
25
  import { resolveSlotParamOverrides } from "./app-page-element-builder.js";
24
- import { Fragment, createElement } from "react";
26
+ import { createAppPageFontData, createAppPageRscErrorTracker, createAppPageSsrErrorHandler, renderAppPageHtmlResponse } from "./app-page-stream.js";
27
+ import { Fragment, Suspense, createElement } from "react";
25
28
  //#region src/server/app-page-boundary-render.ts
29
+ async function AppPageBoundaryStreamedMetadata(props) {
30
+ return createAppPageRouteBodyMetadata(await props.metadata, props.pathname, "body", props.trailingSlash, props.scriptNonce);
31
+ }
32
+ AppPageBoundaryStreamedMetadata.displayName = "Vinext.StreamingMetadata";
33
+ /** Holds the response open until a head it doesn't render settles, as Next.js streams it. */
34
+ async function AppPageBoundarySettledHead(props) {
35
+ await props.head;
36
+ return null;
37
+ }
38
+ AppPageBoundarySettledHead.displayName = "Vinext.ErrorShellMetadata";
39
+ /**
40
+ * Fail a fallback document once its body has streamed if a head it streamed
41
+ * behind Suspense hit a `dynamic = "error"` access error. Inside a Suspense
42
+ * boundary, React would only report it and finish the document, so the 404
43
+ * could be served, and stored, where Next.js fails the render. An errored body
44
+ * reaches the client truncated and is never written to the cache.
45
+ */
46
+ function failOnLateAccessError(response, accessErrors) {
47
+ if (accessErrors.length === 0 || !response.body) return response;
48
+ const body = response.body.pipeThrough(new TransformStream({ async flush() {
49
+ for (const accessError of await Promise.all(accessErrors)) if (accessError) throw accessError;
50
+ } }));
51
+ const wrapped = new Response(body, {
52
+ headers: response.headers,
53
+ status: response.status,
54
+ statusText: response.statusText
55
+ });
56
+ copyLinkHeaderProvenance(response.headers, wrapped.headers);
57
+ return wrapped;
58
+ }
26
59
  const DEFAULT_GLOBAL_ERROR_COMPONENT = DefaultGlobalError;
27
60
  function getDefaultExport(module) {
28
61
  return module?.default ?? null;
@@ -35,6 +68,8 @@ function resolveHttpAccessBoundaryTreePosition(route, boundaryModule, statusCode
35
68
  if (boundaryModule === routeBoundary && statusCode === 403) return route.forbiddenTreePosition ?? null;
36
69
  if (boundaryModule === routeBoundary && statusCode === 401) return route.unauthorizedTreePosition ?? null;
37
70
  for (let index = (layoutBoundaries?.length ?? 0) - 1; index >= 0; index--) if (layoutBoundaries?.[index] === boundaryModule) return route.layoutTreePositions?.[index] ?? null;
71
+ const segmentIndex = (statusCode === 403 ? route.segmentForbiddens : statusCode === 401 ? route.segmentUnauthorizeds : route.segmentNotFounds)?.lastIndexOf(boundaryModule) ?? -1;
72
+ if (segmentIndex !== -1) return (statusCode === 403 ? route.segmentForbiddenTreePositions : statusCode === 401 ? route.segmentUnauthorizedTreePositions : route.segmentNotFoundTreePositions)?.[segmentIndex] ?? null;
38
73
  return null;
39
74
  }
40
75
  function wrapRenderedBoundaryElement(options) {
@@ -224,17 +259,23 @@ async function renderAppPageHttpAccessFallback(options) {
224
259
  const layoutModules = options.layoutModules ?? options.route?.layouts ?? options.rootLayouts;
225
260
  const pathname = new URL(options.requestUrl).pathname;
226
261
  const routePathname = options.routePathname ?? stripRscSuffix(stripBasePath(pathname, options.basePath ?? ""));
227
- const routeSegments = resolveHttpAccessFallbackHeadRouteSegments(options.route, layoutModules);
262
+ const headBoundaryModule = options.headBoundaryModule ?? boundaryModule;
263
+ const headLayoutModules = options.headLayoutModules ?? layoutModules;
264
+ const routeSegments = resolveHttpAccessFallbackHeadRouteSegments(options.route, headLayoutModules);
228
265
  const fallbackRouteSegments = routeSegments ?? [];
229
266
  let head;
267
+ let streamedRouteMetadata = null;
268
+ let streamedConventionHead = null;
269
+ const lateAccessErrors = [];
230
270
  try {
231
271
  if ([
232
272
  401,
233
273
  403,
234
274
  404
235
275
  ].includes(options.statusCode)) {
236
- const boundaryTreePosition = resolveHttpAccessBoundaryTreePosition(options.route, boundaryModule, options.statusCode);
237
- const boundaryParams = boundaryTreePosition == null ? {} : resolveAppPageSegmentParams(fallbackRouteSegments, boundaryTreePosition, options.matchedParams);
276
+ const boundaryTreePosition = resolveHttpAccessBoundaryTreePosition(options.route, headBoundaryModule, options.statusCode);
277
+ const boundaryRouteSegments = (options.route?.routeSegments ?? fallbackRouteSegments).slice(0, boundaryTreePosition ?? 0);
278
+ const boundaryParams = boundaryTreePosition == null ? {} : resolveAppPageSegmentParams(boundaryRouteSegments, boundaryTreePosition, options.matchedParams);
238
279
  const intercept = options.intercept;
239
280
  const isSiblingIntercept = intercept?.interceptSlotKey === "__vinext_page_intercept" && intercept.interceptPage != null;
240
281
  const effectiveParams = isSiblingIntercept ? intercept.interceptParams ?? options.matchedParams : options.matchedParams;
@@ -256,52 +297,180 @@ async function renderAppPageHttpAccessFallback(options) {
256
297
  slotParams,
257
298
  slots: options.route?.slots ?? null
258
299
  });
259
- const primaryParallelBranch = isSiblingIntercept ? {
300
+ const resolvePrimaryParallelBranch = (segments) => isSiblingIntercept ? {
260
301
  head: {
261
302
  layoutModules: intercept?.interceptLayouts ?? [],
262
- layoutParams: (intercept?.interceptLayoutSegments ?? []).map((segments) => resolveAppPageBranchParams(intercept?.interceptBranchSegments ?? segments, segments.length, effectiveParams, segments)),
303
+ layoutParams: (intercept?.interceptLayoutSegments ?? []).map((layoutSegments) => resolveAppPageBranchParams(intercept?.interceptBranchSegments ?? layoutSegments, layoutSegments.length, effectiveParams, layoutSegments)),
263
304
  pageModule: intercept?.interceptPage ?? null,
264
305
  params: effectiveParams,
265
- routeSegments: intercept?.interceptSourcePageSegments ?? fallbackRouteSegments
306
+ routeSegments: intercept?.interceptSourcePageSegments ?? segments
266
307
  },
267
308
  ...intercept?.interceptNotFound ? {
268
309
  notFoundModule: intercept.interceptNotFound,
269
- notFoundModuleRouteSegments: (intercept.interceptNotFoundBranchSegments ?? intercept.interceptSourcePageSegments ?? fallbackRouteSegments).slice(0, intercept.interceptNotFoundTreePosition ?? 0),
270
- notFoundParams: resolveAppPageBranchParams(intercept.interceptNotFoundBranchSegments ?? intercept.interceptBranchSegments ?? fallbackRouteSegments, intercept.interceptNotFoundTreePosition ?? 0, effectiveParams)
310
+ notFoundModuleRouteSegments: (intercept.interceptNotFoundBranchSegments ?? intercept.interceptSourcePageSegments ?? segments).slice(0, intercept.interceptNotFoundTreePosition ?? 0),
311
+ notFoundParams: resolveAppPageBranchParams(intercept.interceptNotFoundBranchSegments ?? intercept.interceptBranchSegments ?? segments, intercept.interceptNotFoundTreePosition ?? 0, effectiveParams)
271
312
  } : {},
272
- ownerTreePosition: fallbackRouteSegments.length
313
+ ownerTreePosition: segments.length
273
314
  } : null;
315
+ const primaryParallelBranch = resolvePrimaryParallelBranch(fallbackRouteSegments);
274
316
  const fallbackHeadOptions = {
275
- boundaryModule,
317
+ boundaryModule: headBoundaryModule,
276
318
  boundaryParams,
277
- boundaryRouteSegments: fallbackRouteSegments.slice(0, boundaryTreePosition ?? 0),
319
+ boundaryRouteSegments,
278
320
  branchNotFoundConventions: options.statusCode === 404,
279
321
  errorConvention: options.statusCode === 403 ? "forbidden" : options.statusCode === 401 ? "unauthorized" : "not-found",
280
- layoutModules,
281
- layoutTreePositions: resolveHttpAccessFallbackHeadLayoutTreePositions(options.route, layoutModules),
322
+ layoutModules: headLayoutModules,
323
+ layoutTreePositions: resolveHttpAccessFallbackHeadLayoutTreePositions(options.route, headLayoutModules),
282
324
  parallelBranches,
283
325
  params: options.matchedParams,
284
326
  primaryParallelBranch,
285
327
  routeSegments
286
328
  };
287
- const [metadata, viewport] = await Promise.all([resolveHttpAccessFallbackMetadata({
288
- applyFileBasedMetadata: options.applyFileBasedMetadata,
289
- basePath: options.basePath ?? "",
290
- ...fallbackHeadOptions,
291
- metadataRoutes: options.metadataRoutes,
292
- routePath: options.route?.pattern ?? pathname
293
- }), resolveHttpAccessFallbackViewport(fallbackHeadOptions)]);
294
- head = {
295
- metadata,
296
- viewport
329
+ const startConventionHead = ({ errorShell = false } = {}) => {
330
+ const settle = (branch) => errorShell ? branch.catch((error) => {
331
+ if (isStaticGenerationAccessError(error)) throw error;
332
+ return null;
333
+ }) : branch;
334
+ const metadata = settle(resolveHttpAccessFallbackMetadata({
335
+ applyFileBasedMetadata: options.applyFileBasedMetadata,
336
+ basePath: options.basePath ?? "",
337
+ ...fallbackHeadOptions,
338
+ metadataRoutes: options.metadataRoutes,
339
+ routePath: options.route?.pattern ?? pathname
340
+ }));
341
+ const viewport = settle(resolveHttpAccessFallbackViewport(fallbackHeadOptions));
342
+ metadata.catch(() => null);
343
+ viewport.catch(() => null);
344
+ return {
345
+ metadata,
346
+ viewport
347
+ };
348
+ };
349
+ const resolveConventionHead = async (settings) => {
350
+ const conventionHead = startConventionHead(settings);
351
+ const [metadata, viewport] = await Promise.all([conventionHead.metadata, conventionHead.viewport]);
352
+ return {
353
+ metadata,
354
+ viewport
355
+ };
297
356
  };
357
+ const route = options.route;
358
+ const routeHead = options.routeHead;
359
+ if (routeHead && route) {
360
+ const prepareRouteHead = () => {
361
+ if (routeHead.prepared) return routeHead.prepared;
362
+ const fullRouteSegments = route.routeSegments ?? [];
363
+ const routePrimaryParallelBranch = resolvePrimaryParallelBranch(fullRouteSegments);
364
+ const sourceParallelBranches = resolveActiveParallelRouteHeadInputs({
365
+ layoutTreePositions: route.layoutTreePositions,
366
+ params: options.matchedParams,
367
+ routeSegments: fullRouteSegments,
368
+ slotParams,
369
+ slots: route.slots ?? null
370
+ });
371
+ const interceptSlotKey = intercept?.interceptPage != null && !isSiblingIntercept ? intercept.interceptSlotKey ?? null : null;
372
+ const routeParallelBranches = interceptSlotKey === null || slotInterceptKeepsSourceHead({
373
+ interceptSlotKey,
374
+ route,
375
+ sourceParallelRoutes: sourceParallelBranches
376
+ }) ? sourceParallelBranches : resolveActiveParallelRouteHeadInputs({
377
+ interceptBranchSegments: intercept?.interceptBranchSegments ?? null,
378
+ interceptLayouts: intercept?.interceptLayouts ?? null,
379
+ interceptLayoutSegments: intercept?.interceptLayoutSegments ?? null,
380
+ interceptNotFoundBranchSegments: intercept?.interceptNotFoundBranchSegments ?? null,
381
+ interceptNotFound: intercept?.interceptNotFound ?? null,
382
+ interceptNotFoundTreePosition: intercept?.interceptNotFoundTreePosition ?? null,
383
+ interceptPage: intercept?.interceptPage ?? null,
384
+ interceptParams: intercept?.interceptParams ?? null,
385
+ interceptSlotKey,
386
+ interceptSourcePageSegments: intercept?.interceptSourcePageSegments ?? null,
387
+ layoutTreePositions: route.layoutTreePositions,
388
+ params: options.matchedParams,
389
+ routeSegments: fullRouteSegments,
390
+ slotParams,
391
+ slots: route.slots ?? null
392
+ });
393
+ const routeLayoutModules = route.layouts ?? options.rootLayouts;
394
+ const headOptions = {
395
+ applyFileBasedMetadata: options.applyFileBasedMetadata,
396
+ basePath: options.basePath ?? "",
397
+ layoutModules: routeLayoutModules,
398
+ layoutTreePositions: route.layoutTreePositions,
399
+ metadataRoutes: options.metadataRoutes,
400
+ pageModule: isSiblingIntercept ? null : route.page ?? null,
401
+ parallelRoutes: [...routePrimaryParallelBranch ? [routePrimaryParallelBranch.head] : [], ...routeParallelBranches.map((branch) => branch.head)],
402
+ params: effectiveParams,
403
+ routePath: route.pattern ?? pathname,
404
+ routeSegments: route.routeSegments ?? null,
405
+ searchParams: routeHead.searchParams,
406
+ searchParamsObserver: createAppPageMetadataSearchParamsObserver(routeHead.observeSearchParams)
407
+ };
408
+ return {
409
+ ...recoverAppPageRouteHead(prepareAppPageHead(headOptions), {
410
+ applyFileBasedMetadata: options.applyFileBasedMetadata,
411
+ basePath: options.basePath ?? "",
412
+ metadataRoutes: options.metadataRoutes,
413
+ resolvePlanOptions: () => createRouteNotFoundHeadPlanOptions({
414
+ parallelBranches: routeParallelBranches,
415
+ params: effectiveParams,
416
+ primaryParallelBranch: routePrimaryParallelBranch,
417
+ rootNotFoundModule: options.rootNotFoundModule,
418
+ route: {
419
+ ...route,
420
+ layouts: routeLayoutModules
421
+ }
422
+ }),
423
+ routePath: route.pattern ?? pathname
424
+ }),
425
+ metadataPlacement: routeHead.streamMetadata && hasAppPageDynamicMetadata(headOptions) ? "body" : "head"
426
+ };
427
+ };
428
+ const routeHeadResult = prepareRouteHead();
429
+ const throwIfAccessError = async () => {
430
+ const accessError = await routeHeadResult.accessError;
431
+ if (accessError) throw accessError;
432
+ };
433
+ const conventionHeadBranches = options.isRscRequest ? null : startConventionHead({ errorShell: true });
434
+ const isHtmlLimitedBot = options.serveStreamingMetadata === false;
435
+ let conventionHead = null;
436
+ if (conventionHeadBranches && isHtmlLimitedBot) {
437
+ const [metadata, viewport] = await Promise.all([conventionHeadBranches.metadata, conventionHeadBranches.viewport]);
438
+ conventionHead = {
439
+ metadata,
440
+ viewport
441
+ };
442
+ } else if (conventionHeadBranches) {
443
+ await conventionHeadBranches.viewport;
444
+ streamedConventionHead = conventionHeadBranches.metadata.catch(() => null);
445
+ lateAccessErrors.push(conventionHeadBranches.metadata.then(() => null, (error) => isStaticGenerationAccessError(error) ? error : null));
446
+ }
447
+ if (!options.isRscRequest && routeHeadResult.metadataPlacement === "body") {
448
+ streamedRouteMetadata = routeHeadResult.metadata;
449
+ lateAccessErrors.push(routeHeadResult.accessError);
450
+ head = {
451
+ metadata: null,
452
+ viewport: await routeHeadResult.viewport
453
+ };
454
+ } else {
455
+ const [metadata, viewport] = await Promise.all([
456
+ routeHeadResult.metadata,
457
+ routeHeadResult.viewport,
458
+ throwIfAccessError()
459
+ ]);
460
+ head = {
461
+ metadata,
462
+ viewport
463
+ };
464
+ }
465
+ if (conventionHead && !streamedRouteMetadata && isHtmlLimitedBot && (!options.isCacheCandidate || isRenderDynamicLatched())) head = conventionHead;
466
+ } else head = await resolveConventionHead();
298
467
  } else head = await resolveAppPageHead({
299
468
  applyFileBasedMetadata: options.applyFileBasedMetadata,
300
469
  basePath: options.basePath ?? "",
301
- layoutModules,
302
- layoutTreePositions: resolveHttpAccessFallbackHeadLayoutTreePositions(options.route, layoutModules),
470
+ layoutModules: headLayoutModules,
471
+ layoutTreePositions: resolveHttpAccessFallbackHeadLayoutTreePositions(options.route, headLayoutModules),
303
472
  metadataRoutes: options.metadataRoutes,
304
- pageModule: boundaryModule,
473
+ pageModule: headBoundaryModule,
305
474
  params: options.matchedParams,
306
475
  routePath: options.route?.pattern ?? pathname,
307
476
  routeSegments
@@ -323,16 +492,30 @@ async function renderAppPageHttpAccessFallback(options) {
323
492
  if (metadata) headElements.push(createElement(MetadataHead, {
324
493
  key: "metadata",
325
494
  metadata,
326
- pathname,
495
+ pathname: routePathname,
327
496
  trailingSlash: options.trailingSlash
328
497
  }));
329
- headElements.push(createElement(ViewportHead, {
498
+ if (viewport) headElements.push(createElement(ViewportHead, {
330
499
  key: "viewport",
331
500
  viewport
332
501
  }));
502
+ const bodyElements = [];
503
+ if (streamedRouteMetadata) bodyElements.push(createElement("div", {
504
+ hidden: true,
505
+ key: "streamed-metadata"
506
+ }, createElement(Suspense, { fallback: null }, createElement(AppPageBoundaryStreamedMetadata, {
507
+ metadata: streamedRouteMetadata,
508
+ pathname: routePathname,
509
+ scriptNonce: options.scriptNonce,
510
+ trailingSlash: options.trailingSlash
511
+ }))));
512
+ if (streamedConventionHead) bodyElements.push(createElement("div", {
513
+ hidden: true,
514
+ key: "error-shell-metadata"
515
+ }, createElement(Suspense, { fallback: null }, createElement(AppPageBoundarySettledHead, { head: streamedConventionHead }))));
333
516
  const skipLayoutWrapping = options.skipLayoutWrapping ?? false;
334
517
  const element = wrapRenderedBoundaryElement({
335
- element: createElement(Fragment, null, ...headElements, createElement(boundaryComponent)),
518
+ element: createElement(Fragment, null, ...headElements, createElement(boundaryComponent), ...bodyElements),
336
519
  globalErrorModule: options.globalErrorModule,
337
520
  includeGlobalErrorBoundary: true,
338
521
  isRscRequest: options.isRscRequest,
@@ -344,7 +527,7 @@ async function renderAppPageHttpAccessFallback(options) {
344
527
  routeSegments: options.route?.routeSegments,
345
528
  skipLayoutWrapping
346
529
  });
347
- return renderAppPageBoundaryElementResponse({
530
+ return failOnLateAccessError(await renderAppPageBoundaryElementResponse({
348
531
  ...options,
349
532
  element,
350
533
  handleSpecialErrors: true,
@@ -354,7 +537,7 @@ async function renderAppPageHttpAccessFallback(options) {
354
537
  route: skipLayoutWrapping ? null : options.route,
355
538
  routePattern: options.route?.pattern,
356
539
  status: options.statusCode
357
- });
540
+ }), lateAccessErrors);
358
541
  }
359
542
  async function renderAppPageErrorBoundary(options) {
360
543
  const errorBoundary = resolveAppPageErrorBoundary({
@@ -29,6 +29,13 @@ type ResolveAppPageParentHttpAccessBoundaryModuleOptions<TModule> = {
29
29
  routeUnauthorizedModules?: readonly (TModule | null | undefined)[] | null;
30
30
  statusCode: number;
31
31
  };
32
+ type ResolveAppPageLayoutHttpAccessBoundaryOptions<TModule> = {
33
+ /** Segment boundaries for the status, root first, aligned with the positions. */
34
+ boundaryModules: readonly (TModule | null | undefined)[];
35
+ boundaryTreePositions: readonly number[];
36
+ /** Tree position of the layout that threw. */
37
+ layoutTreePosition: number;
38
+ };
32
39
  type ResolveAppPageErrorBoundaryOptions<TModule, TComponent> = {
33
40
  getDefaultExport: (module: TModule | null | undefined) => TComponent | null | undefined;
34
41
  globalErrorModule?: TModule | null;
@@ -74,11 +81,32 @@ type RenderAppPageBoundaryResponseOptions<TElement> = {
74
81
  };
75
82
  export declare function resolveAppPageHttpAccessBoundaryComponent<TModule, TComponent>(options: ResolveAppPageHttpAccessBoundaryComponentOptions<TModule, TComponent>): TComponent | null;
76
83
  export declare function resolveAppPageHttpAccessBoundaryModule<TModule>(options: ResolveAppPageHttpAccessBoundaryModuleOptions<TModule>): TModule | null;
77
- export declare function resolveAppPageParentHttpAccessBoundaryModule<TModule>(options: ResolveAppPageParentHttpAccessBoundaryModuleOptions<TModule>): TModule | null;
78
84
  /**
79
- * Like {@link resolveAppPageParentHttpAccessBoundaryModule}, but also returns
80
- * the layout index that owns the resolved boundary so callers can slice the
81
- * layouts array to skip rendering layouts below the boundary owner.
85
+ * The boundary that catches `notFound()` / `forbidden()` / `unauthorized()`
86
+ * thrown by a layout: the deepest segment boundary above the layout's own
87
+ * segment. A segment's boundary wraps its children inside its layout, so the
88
+ * layout's own boundary, and any below it, cannot catch the layout's error.
89
+ * Returns `null` when no segment above the layout has one (issue #4045).
90
+ */
91
+ export declare function resolveAppPageLayoutHttpAccessBoundary<TModule>(options: ResolveAppPageLayoutHttpAccessBoundaryOptions<TModule>): {
92
+ module: TModule;
93
+ treePosition: number;
94
+ } | null;
95
+ /**
96
+ * Tree position at which the root segment's boundary catches a layout's error.
97
+ * Next.js gives a first-layer route group the root segment's boundary (the
98
+ * custom file or the built-in page) when the group has none of its
99
+ * own, so the boundary renders inside the group's layout, which is often the
100
+ * root layout. Without `app/layout`, the root layout sits deeper (for example
101
+ * `app/[lang]/layout`), and the boundary renders inside it so the page keeps
102
+ * its `<html>` and `<body>`. A boundary file above that root layout renders
103
+ * there too.
104
+ */
105
+ export declare function resolveAppPageRootHttpAccessBoundaryTreePosition(routeSegments: readonly string[], layoutTreePositions: readonly number[], layoutTreePosition: number | undefined): number;
106
+ /**
107
+ * Resolves the nearest layout-aligned boundary before `layoutIndex`, falling
108
+ * back to the root module, and returns the layout index that owns it so
109
+ * callers can slice the layouts array to skip layouts below the boundary owner.
82
110
  *
83
111
  * `layoutIndex` is the per-layout index where the boundary lives, or `null` if
84
112
  * the resolved boundary is the root module (which conceptually sits above all
@@ -98,4 +126,5 @@ export declare function resolveAppPageParentHttpAccessBoundary<TModule>(options:
98
126
  export declare function resolveAppPageErrorBoundary<TModule, TComponent>(options: ResolveAppPageErrorBoundaryOptions<TModule, TComponent>): ResolveAppPageErrorBoundaryResult<TComponent>;
99
127
  export declare function wrapAppPageBoundaryElement<TElement, TLayoutModule, TLayoutComponent, TChildSegments, TGlobalErrorComponent>(options: WrapAppPageBoundaryElementOptions<TElement, TLayoutModule, TLayoutComponent, TChildSegments, TGlobalErrorComponent>): TElement;
100
128
  export declare function renderAppPageBoundaryResponse<TElement>(options: RenderAppPageBoundaryResponseOptions<TElement>): Promise<Response>;
101
- //#endregion
129
+ //#endregion
130
+ export {};
@@ -1,9 +1,10 @@
1
1
  import { VINEXT_RSC_VARY_HEADER } from "./app-rsc-vary.js";
2
2
  import { runWithFetchDedupe } from "../shims/fetch-cache.js";
3
- import { resolveAppPageSegmentParams } from "./app-page-params.js";
4
3
  import { VINEXT_RSC_CONTENT_TYPE, applyRscCompatibilityIdHeader, applyRscDeploymentIdHeader } from "./app-rsc-cache-busting.js";
5
4
  import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
6
5
  import { applyEdgeRuntimeHeader } from "./app-page-response.js";
6
+ import { resolveAppPageSegmentParams } from "./app-page-params.js";
7
+ import { isAppPageRouteGroupSegment } from "./app-page-segment-state.js";
7
8
  //#region src/server/app-page-boundary.ts
8
9
  function resolveAppPageHttpAccessBoundaryComponent(options) {
9
10
  return options.getDefaultExport(resolveAppPageHttpAccessBoundaryModule({
@@ -23,13 +24,45 @@ function resolveAppPageHttpAccessBoundaryModule(options) {
23
24
  else boundaryModule = options.routeNotFoundModule ?? options.rootNotFoundModule;
24
25
  return boundaryModule ?? null;
25
26
  }
26
- function resolveAppPageParentHttpAccessBoundaryModule(options) {
27
- return resolveAppPageParentHttpAccessBoundary(options).module;
27
+ /**
28
+ * The boundary that catches `notFound()` / `forbidden()` / `unauthorized()`
29
+ * thrown by a layout: the deepest segment boundary above the layout's own
30
+ * segment. A segment's boundary wraps its children inside its layout, so the
31
+ * layout's own boundary, and any below it, cannot catch the layout's error.
32
+ * Returns `null` when no segment above the layout has one (issue #4045).
33
+ */
34
+ function resolveAppPageLayoutHttpAccessBoundary(options) {
35
+ for (let index = options.boundaryTreePositions.length - 1; index >= 0; index--) {
36
+ const treePosition = options.boundaryTreePositions[index];
37
+ const module = options.boundaryModules[index];
38
+ if (module && treePosition < options.layoutTreePosition) return {
39
+ module,
40
+ treePosition
41
+ };
42
+ }
43
+ return null;
44
+ }
45
+ /**
46
+ * Tree position at which the root segment's boundary catches a layout's error.
47
+ * Next.js gives a first-layer route group the root segment's boundary (the
48
+ * custom file or the built-in page) when the group has none of its
49
+ * own, so the boundary renders inside the group's layout, which is often the
50
+ * root layout. Without `app/layout`, the root layout sits deeper (for example
51
+ * `app/[lang]/layout`), and the boundary renders inside it so the page keeps
52
+ * its `<html>` and `<body>`. A boundary file above that root layout renders
53
+ * there too.
54
+ */
55
+ function resolveAppPageRootHttpAccessBoundaryTreePosition(routeSegments, layoutTreePositions, layoutTreePosition) {
56
+ if (layoutTreePosition === void 0) return 0;
57
+ const firstSegment = routeSegments[0];
58
+ const groupTreePosition = layoutTreePosition > 1 && firstSegment !== void 0 && isAppPageRouteGroupSegment(firstSegment) ? 1 : 0;
59
+ const rootLayoutTreePosition = layoutTreePositions[0] ?? 0;
60
+ return rootLayoutTreePosition < layoutTreePosition ? Math.max(groupTreePosition, rootLayoutTreePosition) : groupTreePosition;
28
61
  }
29
62
  /**
30
- * Like {@link resolveAppPageParentHttpAccessBoundaryModule}, but also returns
31
- * the layout index that owns the resolved boundary so callers can slice the
32
- * layouts array to skip rendering layouts below the boundary owner.
63
+ * Resolves the nearest layout-aligned boundary before `layoutIndex`, falling
64
+ * back to the root module, and returns the layout index that owns it so
65
+ * callers can slice the layouts array to skip layouts below the boundary owner.
33
66
  *
34
67
  * `layoutIndex` is the per-layout index where the boundary lives, or `null` if
35
68
  * the resolved boundary is the root module (which conceptually sits above all
@@ -119,4 +152,4 @@ async function renderAppPageBoundaryResponse(options) {
119
152
  return options.createHtmlResponse(rscStream, options.status);
120
153
  }
121
154
  //#endregion
122
- export { renderAppPageBoundaryResponse, resolveAppPageErrorBoundary, resolveAppPageHttpAccessBoundaryComponent, resolveAppPageHttpAccessBoundaryModule, resolveAppPageParentHttpAccessBoundary, resolveAppPageParentHttpAccessBoundaryModule, wrapAppPageBoundaryElement };
155
+ export { renderAppPageBoundaryResponse, resolveAppPageErrorBoundary, resolveAppPageHttpAccessBoundaryComponent, resolveAppPageHttpAccessBoundaryModule, resolveAppPageLayoutHttpAccessBoundary, resolveAppPageParentHttpAccessBoundary, resolveAppPageRootHttpAccessBoundaryTreePosition, wrapAppPageBoundaryElement };
@@ -98,4 +98,5 @@ export declare function finalizeAppPageCacheabilityEvaluationResponse(response:
98
98
  export declare function finalizeAppPageHtmlCacheResponse(response: Response, options: FinalizeAppPageHtmlCacheResponseOptions): Response;
99
99
  export declare function finalizeAppPageRscCacheResponse(response: Response, options: ScheduleAppPageRscCacheWriteOptions): Response;
100
100
  export declare function scheduleAppPageRscCacheWrite(options: ScheduleAppPageRscCacheWriteOptions): boolean;
101
- //#endregion
101
+ //#endregion
102
+ export {};
@@ -1,3 +1,4 @@
1
+ import { deferUntilStreamConsumed } from "./defer-until-stream-consumed.js";
1
2
  import { NEXTJS_CACHE_HEADER, VINEXT_CACHE_HEADER } from "./headers.js";
2
3
  import { getCdnCacheAdapter } from "../shims/cdn-cache.js";
3
4
  import { captureRouteCacheabilityResponsePolicy, deferRouteCacheability, isRouteCacheabilityEvaluation } from "../shims/cacheability-classification.js";
@@ -6,7 +7,6 @@ import { buildAppPageCacheValue, isrCacheControl, resolveRouteExpireSeconds } fr
6
7
  import { resolveClientStaleTimeSeconds } from "../utils/cache-control-metadata.js";
7
8
  import { setCacheStateHeaders } from "./cache-headers.js";
8
9
  import { readStreamAsText } from "../utils/text-stream.js";
9
- import { deferUntilStreamConsumed } from "./defer-until-stream-consumed.js";
10
10
  import { markFrameworkLinkHeaders } from "./app-response-header-provenance.js";
11
11
  import { hasQueryInvariantRenderProof } from "./cache-proof.js";
12
12
  import { createEmptyAppPageRenderObservationState } from "./app-page-render-observation.js";
@@ -35,7 +35,14 @@ export type RenderAppPageCacheArtifactsOptions = {
35
35
  * Render the document of a special error that rejected the shell, or return
36
36
  * null to fail the render with it.
37
37
  */
38
- renderShellSpecialError?: (error: unknown) => Promise<AppPageCacheSpecialErrorDocument | null>;
38
+ renderShellSpecialError?: (error: unknown,
39
+ /** The page's own document, in which parallel slot boundaries caught it. */
40
+ caughtDocument?: {
41
+ html: string;
42
+ linkHeader?: string;
43
+ }) => Promise<AppPageCacheSpecialErrorDocument | null>;
44
+ /** The parallel slot not-found boundaries that catch a shell error. See handleSsr. */
45
+ resolveCaughtNotFoundBoundaries?: (error: unknown) => readonly string[] | null;
39
46
  renderToReadableStream: (element: AppPageRenderableElement, options: {
40
47
  onError: (error: unknown, requestInfo: unknown, errorContext: unknown) => unknown;
41
48
  }) => ReadableStream<Uint8Array>;
@@ -73,4 +80,5 @@ export type RenderAppPageCacheArtifactsResult = {
73
80
  * shell regeneration.
74
81
  */
75
82
  export declare function renderAppPageCacheArtifacts(options: RenderAppPageCacheArtifactsOptions): Promise<RenderAppPageCacheArtifactsResult>;
76
- //#endregion
83
+ //#endregion
84
+ export {};
@@ -5,9 +5,9 @@ import { getCollectedFetchTags } from "../shims/fetch-cache.js";
5
5
  import { readStreamAsText } from "../utils/text-stream.js";
6
6
  import { buildAppPageFontLinkHeader, teeAppPageRscStreamForCapture } from "./app-page-execution.js";
7
7
  import { recordAppPageRenderError, traceAppPageRender } from "./app-page-tracing.js";
8
- import { buildAppPageTags } from "./implicit-tags.js";
9
- import { consumeAppPageRenderObservationState, createAppPageHtmlOutputScope, createAppPageRenderObservation, createAppPageRscOutputScope } from "./app-page-render-observation.js";
10
8
  import { buildAppPageLinkHeader, createAppPageSsrErrorHandler, isAppSsrRenderResult } from "./app-page-stream.js";
9
+ import { consumeAppPageRenderObservationState, createAppPageHtmlOutputScope, createAppPageRenderObservation, createAppPageRscOutputScope } from "./app-page-render-observation.js";
10
+ import { buildAppPageTags } from "./implicit-tags.js";
11
11
  //#region src/server/app-page-cache-render.ts
12
12
  /**
13
13
  * Render an App page element to HTML (and optionally its RSC payload) for cache
@@ -44,6 +44,7 @@ async function renderAppPageCacheArtifactsImpl(options, renderSpan) {
44
44
  isStaticGeneration: true,
45
45
  isForceStatic: options.isForceStatic,
46
46
  preloadRoutePattern: options.route.pattern,
47
+ resolveCaughtNotFoundBoundaries: options.resolveCaughtNotFoundBoundaries,
47
48
  onSsrError: options.onSsrError && options.isCapturedRscError ? createAppPageSsrErrorHandler((error) => {
48
49
  recordAppPageRenderError(renderSpan, error);
49
50
  return options.onSsrError?.(error);
@@ -69,6 +70,17 @@ async function renderAppPageCacheArtifactsImpl(options, renderSpan) {
69
70
  const reactLinkHeader = isAppSsrRenderResult(htmlResult) ? htmlResult.linkHeader : void 0;
70
71
  linkHeader = buildAppPageLinkHeader(reactLinkHeader, buildAppPageFontLinkHeader(fontPreloads), options.reactMaxHeadersLength);
71
72
  html = await readStreamAsText(htmlStream);
73
+ const caughtShellError = isAppSsrRenderResult(htmlResult) ? htmlResult.caughtShellError : void 0;
74
+ if (caughtShellError !== void 0) {
75
+ await capturedRscDataRef.value?.catch(() => {});
76
+ specialErrorDocument = await options.renderShellSpecialError?.(caughtShellError, {
77
+ html,
78
+ linkHeader
79
+ }) ?? null;
80
+ if (!specialErrorDocument) throw caughtShellError;
81
+ html = specialErrorDocument.html;
82
+ linkHeader = specialErrorDocument.linkHeader;
83
+ }
72
84
  }
73
85
  let rscData;
74
86
  if (options.captureRscData) {
@@ -10,10 +10,10 @@ import { VINEXT_RSC_CONTENT_TYPE, applyRscCompatibilityIdHeader, applyRscDeploym
10
10
  import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
11
11
  import { markFrameworkLinkHeaders } from "./app-response-header-provenance.js";
12
12
  import { applyClientStaleTimeHeader, applyEdgeRuntimeHeader } from "./app-page-response.js";
13
- import { hasQueryInvariantRenderProof } from "./cache-proof.js";
14
13
  import { isAppPprDynamicFallbackShellHtml } from "./app-ppr-fallback-shell.js";
15
- import { buildPageCacheTags } from "./implicit-tags.js";
14
+ import { hasQueryInvariantRenderProof } from "./cache-proof.js";
16
15
  import { finalizeAppPageHtmlCacheResponse, finalizeAppPageRscCacheResponse, scheduleAppPageRscCacheWrite } from "./app-page-cache-finalizer.js";
16
+ import { buildPageCacheTags } from "./implicit-tags.js";
17
17
  //#region src/server/app-page-cache.ts
18
18
  function recordAppPageCacheOutcome(recordCacheOutcome, input) {
19
19
  try {