vinext 1.2.1 → 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 (509) hide show
  1. package/README.md +12 -9
  2. package/dist/_virtual/_rolldown/runtime.js +1 -1
  3. package/dist/build/action-owner-manifest.d.ts +3 -2
  4. package/dist/build/action-owner-manifest.js +18 -2
  5. package/dist/build/app-page-static-eligibility.d.ts +17 -1
  6. package/dist/build/app-page-static-eligibility.js +80 -13
  7. package/dist/build/clean-output.d.ts +2 -1
  8. package/dist/build/client-build-config.d.ts +77 -6
  9. package/dist/build/client-build-config.js +176 -12
  10. package/dist/build/client-reference-async.d.ts +48 -0
  11. package/dist/build/client-reference-async.js +123 -0
  12. package/dist/build/client-reference-chunks.d.ts +32 -0
  13. package/dist/build/client-reference-chunks.js +111 -0
  14. package/dist/build/client-reference-groups.d.ts +171 -0
  15. package/dist/build/client-reference-groups.js +572 -0
  16. package/dist/build/css-url-assets.d.ts +2 -1
  17. package/dist/build/google-fonts/fallback-metrics.d.ts +2 -1
  18. package/dist/build/google-fonts/find-font-files-in-css.d.ts +1 -0
  19. package/dist/build/google-fonts/find-font-files-in-css.js +17 -4
  20. package/dist/build/google-fonts/font-metadata.d.ts +2 -1
  21. package/dist/build/google-fonts/validate.d.ts +2 -1
  22. package/dist/build/inline-css.d.ts +2 -1
  23. package/dist/build/layout-classification.d.ts +2 -1
  24. package/dist/build/module-dependency-cache.d.ts +33 -1
  25. package/dist/build/module-dependency-cache.js +51 -1
  26. package/dist/build/next-client-runtime-manifests.d.ts +12 -2
  27. package/dist/build/next-client-runtime-manifests.js +19 -4
  28. package/dist/build/nitro-public-files.d.ts +24 -0
  29. package/dist/build/nitro-public-files.js +60 -0
  30. package/dist/build/pages-client-assets-module.js +1 -1
  31. package/dist/build/precompress.d.ts +2 -1
  32. package/dist/build/precompress.js +1 -1
  33. package/dist/build/prerender-paths.d.ts +2 -1
  34. package/dist/build/prerender-paths.js +5 -2
  35. package/dist/build/prerender-phase.d.ts +2 -1
  36. package/dist/build/prerender-server-pool.js +1 -1
  37. package/dist/build/prerender.d.ts +3 -2
  38. package/dist/build/prerender.js +5 -4
  39. package/dist/build/report.d.ts +2 -1
  40. package/dist/build/route-classification-injector.d.ts +2 -1
  41. package/dist/build/route-classification-manifest.d.ts +2 -1
  42. package/dist/build/run-prerender.d.ts +2 -1
  43. package/dist/build/server-actions-encryption-key.d.ts +24 -0
  44. package/dist/build/server-actions-encryption-key.js +101 -0
  45. package/dist/build/ssr-manifest.d.ts +3 -0
  46. package/dist/build/ssr-manifest.js +34 -2
  47. package/dist/build/standalone.d.ts +2 -1
  48. package/dist/cache/cache-adapters-virtual.d.ts +2 -1
  49. package/dist/cache.js +1 -2
  50. package/dist/check.d.ts +2 -1
  51. package/dist/check.js +4 -0
  52. package/dist/cli-args.d.ts +2 -1
  53. package/dist/cli.js +2 -0
  54. package/dist/client/client-redirect-matcher.js +2 -1
  55. package/dist/client/client-redirects.d.ts +4 -3
  56. package/dist/client/client-redirects.js +2 -1
  57. package/dist/client/client-rewrite-params.d.ts +9 -0
  58. package/dist/client/client-rewrite-params.js +20 -0
  59. package/dist/client/client-rewrites.d.ts +2 -1
  60. package/dist/client/dev-error-overlay-store.d.ts +2 -1
  61. package/dist/client/dev-error-overlay.js +2 -1
  62. package/dist/client/index.js +1 -2
  63. package/dist/client/instrumentation-client-state.js +5 -5
  64. package/dist/client/navigation-runtime.d.ts +28 -3
  65. package/dist/client/navigation-runtime.js +42 -11
  66. package/dist/client/pages-router-link-navigation.d.ts +2 -1
  67. package/dist/client/vinext-next-data.d.ts +25 -2
  68. package/dist/client/window-next.d.ts +2 -1
  69. package/dist/config/config-matchers.d.ts +27 -41
  70. package/dist/config/config-matchers.js +293 -270
  71. package/dist/config/config-source.d.ts +34 -0
  72. package/dist/config/config-source.js +141 -0
  73. package/dist/config/dotenv.d.ts +2 -1
  74. package/dist/config/header-params.d.ts +29 -0
  75. package/dist/config/header-params.js +106 -0
  76. package/dist/config/next-config.d.ts +20 -6
  77. package/dist/config/next-config.js +149 -11
  78. package/dist/config/tsconfig-paths.d.ts +2 -1
  79. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/detector.js +23 -0
  80. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/index.js +2 -0
  81. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/lookup.js +25 -0
  82. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/bmp.js +11 -0
  83. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/cur.js +15 -0
  84. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/dds.js +11 -0
  85. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/gif.js +12 -0
  86. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/heif.js +55 -0
  87. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/icns.js +76 -0
  88. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/ico.js +39 -0
  89. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/index.js +46 -0
  90. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/j2c.js +11 -0
  91. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/jp2.js +21 -0
  92. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/jpg.js +71 -0
  93. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/jxl-stream.js +42 -0
  94. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/jxl.js +46 -0
  95. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/ktx.js +19 -0
  96. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/png.js +28 -0
  97. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/pnm.js +54 -0
  98. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/psd.js +11 -0
  99. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/svg.js +79 -0
  100. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/tga.js +15 -0
  101. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/tiff.js +96 -0
  102. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/utils.js +53 -0
  103. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/webp.js +45 -0
  104. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/utils/bit-reader.js +38 -0
  105. package/dist/deps/.pnpm/ua-parser-js@1.0.35/deps/ua-parser-js/src/ua-parser.js +2 -2
  106. package/dist/entries/app-browser-entry.d.ts +34 -6
  107. package/dist/entries/app-browser-entry.js +103 -40
  108. package/dist/entries/app-rsc-entry.d.ts +4 -1
  109. package/dist/entries/app-rsc-entry.js +131 -66
  110. package/dist/entries/app-rsc-manifest.d.ts +12 -1
  111. package/dist/entries/app-rsc-manifest.js +73 -1
  112. package/dist/entries/app-ssr-entry.d.ts +4 -1
  113. package/dist/entries/app-ssr-entry.js +9 -2
  114. package/dist/entries/pages-client-entry.d.ts +1 -0
  115. package/dist/entries/pages-client-entry.js +6 -6
  116. package/dist/entries/pages-entry-helpers.js +1 -2
  117. package/dist/entries/pages-server-entry.d.ts +2 -1
  118. package/dist/entries/pages-server-entry.js +18 -15
  119. package/dist/entries/runtime-entry-module.d.ts +1 -0
  120. package/dist/entries/runtime-entry-module.js +4 -1
  121. package/dist/image/image-adapters-virtual.d.ts +2 -1
  122. package/dist/index.d.ts +11 -0
  123. package/dist/index.js +340 -116
  124. package/dist/init.js +17 -0
  125. package/dist/plugins/client-compile-hints.d.ts +30 -0
  126. package/dist/plugins/client-compile-hints.js +88 -0
  127. package/dist/plugins/client-reference-dedup.d.ts +2 -1
  128. package/dist/plugins/cloudflare-dev-module-urls.d.ts +2 -1
  129. package/dist/plugins/dynamic-preload-metadata.d.ts +3 -1
  130. package/dist/plugins/dynamic-preload-metadata.js +1 -1
  131. package/dist/plugins/environment.d.ts +2 -1
  132. package/dist/plugins/fonts.js +9 -12
  133. package/dist/plugins/ignore-dynamic-requests.d.ts +2 -1
  134. package/dist/plugins/import-meta-url.d.ts +2 -1
  135. package/dist/plugins/og-assets.d.ts +2 -1
  136. package/dist/plugins/og-assets.js +2 -3
  137. package/dist/plugins/optimize-imports.d.ts +27 -3
  138. package/dist/plugins/optimize-imports.js +106 -20
  139. package/dist/plugins/pages-node-externals.d.ts +2 -1
  140. package/dist/plugins/remove-console.d.ts +2 -1
  141. package/dist/plugins/require-condition-resolution.d.ts +2 -1
  142. package/dist/plugins/rsc-client-reference-loaders.d.ts +53 -1
  143. package/dist/plugins/rsc-client-reference-loaders.js +447 -27
  144. package/dist/plugins/rsc-client-shim-excludes.js +2 -0
  145. package/dist/plugins/sass.d.ts +2 -1
  146. package/dist/plugins/strip-server-exports.d.ts +2 -1
  147. package/dist/plugins/styled-jsx.d.ts +2 -1
  148. package/dist/plugins/transform-result.d.ts +2 -1
  149. package/dist/plugins/typeof-window.d.ts +2 -1
  150. package/dist/plugins/use-cache-callable.d.ts +5 -0
  151. package/dist/plugins/use-cache-callable.js +30 -8
  152. package/dist/plugins/worker-image-imports.d.ts +1 -0
  153. package/dist/plugins/worker-image-imports.js +2 -2
  154. package/dist/plugins/worker-use-server.d.ts +2 -1
  155. package/dist/routing/app-route-graph.d.ts +41 -1
  156. package/dist/routing/app-route-graph.js +122 -50
  157. package/dist/routing/browser-route-manifest.d.ts +44 -0
  158. package/dist/routing/browser-route-manifest.js +195 -0
  159. package/dist/routing/hashed-route-patterns.d.ts +4 -0
  160. package/dist/routing/hashed-route-patterns.js +22 -0
  161. package/dist/routing/optimistic-route-trie.d.ts +28 -0
  162. package/dist/routing/optimistic-route-trie.js +102 -0
  163. package/dist/routing/route-matching.d.ts +2 -1
  164. package/dist/routing/route-pattern.d.ts +2 -1
  165. package/dist/routing/route-validation.d.ts +6 -1
  166. package/dist/routing/route-validation.js +26 -10
  167. package/dist/server/accept-encoding.d.ts +2 -1
  168. package/dist/server/app-action-forwarding.d.ts +10 -1
  169. package/dist/server/app-action-forwarding.js +15 -1
  170. package/dist/server/app-bfcache-identity.d.ts +2 -1
  171. package/dist/server/app-browser-action-result.d.ts +2 -1
  172. package/dist/server/app-browser-client-reuse-manifest.d.ts +2 -1
  173. package/dist/server/app-browser-entry.js +175 -64
  174. package/dist/server/app-browser-error.d.ts +5 -2
  175. package/dist/server/app-browser-error.js +7 -2
  176. package/dist/server/app-browser-history-controller.d.ts +2 -1
  177. package/dist/server/app-browser-hydration.d.ts +2 -1
  178. package/dist/server/app-browser-interception-context.d.ts +4 -3
  179. package/dist/server/app-browser-mpa-navigation.d.ts +1 -0
  180. package/dist/server/app-browser-mpa-navigation.js +6 -5
  181. package/dist/server/app-browser-navigation-controller.d.ts +17 -6
  182. package/dist/server/app-browser-navigation-controller.js +103 -36
  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-server-action-client.d.ts +2 -1
  186. package/dist/server/app-browser-state.d.ts +2 -2
  187. package/dist/server/app-browser-state.js +1 -1
  188. package/dist/server/app-browser-stream.d.ts +2 -1
  189. package/dist/server/app-browser-visible-commit.d.ts +6 -5
  190. package/dist/server/app-client-reference-manifest.d.ts +31 -0
  191. package/dist/server/app-client-reference-manifest.js +46 -0
  192. package/dist/server/app-client-reference-preloader.d.ts +45 -2
  193. package/dist/server/app-client-reference-preloader.js +48 -10
  194. package/dist/server/app-elements-wire.d.ts +2 -1
  195. package/dist/server/app-elements.d.ts +2 -0
  196. package/dist/server/app-elements.js +3 -1
  197. package/dist/server/app-fallback-renderer.d.ts +9 -2
  198. package/dist/server/app-fallback-renderer.js +6 -2
  199. package/dist/server/app-history-state.d.ts +2 -1
  200. package/dist/server/app-inline-css-client.d.ts +2 -1
  201. package/dist/server/app-layout-param-observation.d.ts +2 -1
  202. package/dist/server/app-metadata-tracing.d.ts +2 -1
  203. package/dist/server/app-middleware.d.ts +6 -0
  204. package/dist/server/app-middleware.js +8 -10
  205. package/dist/server/app-optimistic-routing.d.ts +26 -11
  206. package/dist/server/app-optimistic-routing.js +38 -96
  207. package/dist/server/app-page-boundary-render.d.ts +20 -2
  208. package/dist/server/app-page-boundary-render.js +229 -39
  209. package/dist/server/app-page-boundary.d.ts +34 -5
  210. package/dist/server/app-page-boundary.js +40 -7
  211. package/dist/server/app-page-cache-finalizer.d.ts +2 -1
  212. package/dist/server/app-page-cache-finalizer.js +1 -1
  213. package/dist/server/app-page-cache-render.d.ts +10 -2
  214. package/dist/server/app-page-cache-render.js +15 -2
  215. package/dist/server/app-page-cache.js +2 -2
  216. package/dist/server/app-page-dispatch.d.ts +34 -1
  217. package/dist/server/app-page-dispatch.js +165 -34
  218. package/dist/server/app-page-element-builder.d.ts +17 -1
  219. package/dist/server/app-page-element-builder.js +187 -66
  220. package/dist/server/app-page-execution.d.ts +28 -1
  221. package/dist/server/app-page-execution.js +114 -5
  222. package/dist/server/app-page-head.d.ts +95 -3
  223. package/dist/server/app-page-head.js +307 -152
  224. package/dist/server/app-page-http-access-fallback-metadata.d.ts +48 -2
  225. package/dist/server/app-page-http-access-fallback-metadata.js +76 -1
  226. package/dist/server/app-page-method.d.ts +2 -1
  227. package/dist/server/app-page-probe.d.ts +2 -1
  228. package/dist/server/app-page-render-identity.d.ts +2 -1
  229. package/dist/server/app-page-render.d.ts +7 -1
  230. package/dist/server/app-page-render.js +38 -11
  231. package/dist/server/app-page-request.d.ts +14 -1
  232. package/dist/server/app-page-request.js +1 -1
  233. package/dist/server/app-page-route-wiring.d.ts +52 -2
  234. package/dist/server/app-page-route-wiring.js +197 -47
  235. package/dist/server/app-page-rsc-render-status.d.ts +3 -1
  236. package/dist/server/app-page-rsc-render-status.js +1 -0
  237. package/dist/server/app-page-search-params-observation.d.ts +8 -6
  238. package/dist/server/app-page-search-params-observation.js +16 -11
  239. package/dist/server/app-page-segment-plan.d.ts +2 -1
  240. package/dist/server/app-page-stream.d.ts +38 -1
  241. package/dist/server/app-page-stream.js +24 -4
  242. package/dist/server/app-pages-bridge.d.ts +4 -2
  243. package/dist/server/app-pages-bridge.js +11 -7
  244. package/dist/server/app-ppr-fallback-shell-render.d.ts +2 -1
  245. package/dist/server/app-ppr-fallback-shell.d.ts +2 -1
  246. package/dist/server/app-prerender-endpoints.d.ts +2 -1
  247. package/dist/server/app-prerender-static-params.d.ts +2 -1
  248. package/dist/server/app-prerender-static-params.js +3 -2
  249. package/dist/server/app-render-dependency.d.ts +11 -1
  250. package/dist/server/app-render-dependency.js +65 -6
  251. package/dist/server/app-request-stage-independent-entry.d.ts +2 -1
  252. package/dist/server/app-request-stage-independent-entry.js +2 -2
  253. package/dist/server/app-response-stage-entry.d.ts +2 -1
  254. package/dist/server/app-response-stage-entry.js +3 -3
  255. package/dist/server/app-route-handler-cache.d.ts +2 -1
  256. package/dist/server/app-route-handler-dispatch.d.ts +2 -1
  257. package/dist/server/app-route-handler-dispatch.js +4 -2
  258. package/dist/server/app-route-handler-execution.d.ts +4 -1
  259. package/dist/server/app-route-handler-execution.js +9 -2
  260. package/dist/server/app-route-handler-middleware-context.d.ts +2 -1
  261. package/dist/server/app-route-handler-middleware-context.js +3 -3
  262. package/dist/server/app-route-handler-response.d.ts +4 -2
  263. package/dist/server/app-route-handler-response.js +2 -2
  264. package/dist/server/app-route-handler-runtime.d.ts +4 -1
  265. package/dist/server/app-route-handler-runtime.js +20 -3
  266. package/dist/server/app-route-module-loader.d.ts +18 -1
  267. package/dist/server/app-route-module-loader.js +15 -6
  268. package/dist/server/app-route-tree-prefetch.d.ts +2 -1
  269. package/dist/server/app-route-tree.d.ts +20 -0
  270. package/dist/server/app-route-tree.js +18 -0
  271. package/dist/server/app-router-entry.js +2 -2
  272. package/dist/server/app-rsc-combined-handler.js +8 -1
  273. package/dist/server/app-rsc-error-handler.d.ts +2 -1
  274. package/dist/server/app-rsc-errors.d.ts +9 -1
  275. package/dist/server/app-rsc-errors.js +9 -2
  276. package/dist/server/app-rsc-handler.d.ts +6 -2
  277. package/dist/server/app-rsc-handler.js +152 -140
  278. package/dist/server/app-rsc-response-finalizer.d.ts +7 -1
  279. package/dist/server/app-rsc-response-finalizer.js +4 -1
  280. package/dist/server/app-rsc-response-stage.js +3 -1
  281. package/dist/server/app-rsc-route-matching.d.ts +39 -1
  282. package/dist/server/app-rsc-route-matching.js +25 -1
  283. package/dist/server/app-segment-config.d.ts +2 -1
  284. package/dist/server/app-segment-config.js +1 -14
  285. package/dist/server/app-server-action-execution.d.ts +25 -7
  286. package/dist/server/app-server-action-execution.js +53 -59
  287. package/dist/server/app-ssr-entry.d.ts +12 -0
  288. package/dist/server/app-ssr-entry.js +104 -48
  289. package/dist/server/app-ssr-error-meta.d.ts +2 -1
  290. package/dist/server/app-ssr-search-params-gate.d.ts +2 -1
  291. package/dist/server/app-ssr-stream.d.ts +29 -10
  292. package/dist/server/app-ssr-stream.js +311 -67
  293. package/dist/server/app-static-generation.d.ts +2 -1
  294. package/dist/server/app-streamed-client-references.d.ts +39 -0
  295. package/dist/server/app-streamed-client-references.js +156 -0
  296. package/dist/server/app-visited-response-cache.d.ts +2 -1
  297. package/dist/server/app-worker-stages.d.ts +2 -1
  298. package/dist/server/artifact-compatibility.d.ts +2 -1
  299. package/dist/server/bfcache-identity.d.ts +2 -1
  300. package/dist/server/cache-headers.d.ts +2 -1
  301. package/dist/server/cacheability-request.d.ts +2 -1
  302. package/dist/server/client-reuse-manifest.d.ts +2 -1
  303. package/dist/server/config-headers.d.ts +2 -1
  304. package/dist/server/config-headers.js +12 -3
  305. package/dist/server/csp.d.ts +2 -1
  306. package/dist/server/default-global-not-found-module.d.ts +2 -1
  307. package/dist/server/default-http-access-fallback-modules.d.ts +33 -0
  308. package/dist/server/default-http-access-fallback-modules.js +31 -0
  309. package/dist/server/defer-until-stream-consumed.d.ts +34 -0
  310. package/dist/server/defer-until-stream-consumed.js +154 -21
  311. package/dist/server/dev-lockfile.d.ts +32 -2
  312. package/dist/server/dev-lockfile.js +46 -2
  313. package/dist/server/dev-module-runner.d.ts +2 -1
  314. package/dist/server/dev-server.js +10 -3
  315. package/dist/server/fetch-handler.js +1 -2
  316. package/dist/server/file-based-metadata.d.ts +2 -1
  317. package/dist/server/framework-tracer.d.ts +2 -1
  318. package/dist/server/html.d.ts +1 -0
  319. package/dist/server/html.js +19 -1
  320. package/dist/server/http-conditional.d.ts +2 -1
  321. package/dist/server/http-error-responses.d.ts +2 -1
  322. package/dist/server/implicit-tags.d.ts +2 -1
  323. package/dist/server/isolate-shared-promise.d.ts +10 -0
  324. package/dist/server/isolate-shared-promise.js +33 -0
  325. package/dist/server/isr-cache.js +3 -2
  326. package/dist/server/metadata-route-build-data.d.ts +2 -1
  327. package/dist/server/metadata-route-build-data.js +1 -1
  328. package/dist/server/metadata-route-response.d.ts +2 -1
  329. package/dist/server/metadata-route-response.js +1 -1
  330. package/dist/server/metadata-routes.d.ts +2 -1
  331. package/dist/server/middleware-matcher-pattern.d.ts +0 -1
  332. package/dist/server/middleware-matcher-pattern.js +11 -140
  333. package/dist/server/middleware-matcher.js +5 -6
  334. package/dist/server/middleware-response-headers.d.ts +31 -0
  335. package/dist/server/middleware-response-headers.js +57 -1
  336. package/dist/server/middleware-runtime.d.ts +2 -1
  337. package/dist/server/middleware-runtime.js +26 -13
  338. package/dist/server/navigation-planner.d.ts +2 -2
  339. package/dist/server/navigation-trace.d.ts +2 -1
  340. package/dist/server/next-error-digest.d.ts +2 -1
  341. package/dist/server/nitro-public-files-plugin.d.ts +39 -0
  342. package/dist/server/nitro-public-files-plugin.js +106 -0
  343. package/dist/server/nitro-public-files.d.ts +22 -0
  344. package/dist/server/nitro-public-files.js +39 -0
  345. package/dist/server/opentelemetry-api.d.ts +2 -1
  346. package/dist/server/operation-token.d.ts +2 -1
  347. package/dist/server/pages-api-route.d.ts +2 -1
  348. package/dist/server/pages-asset-tags.d.ts +7 -1
  349. package/dist/server/pages-asset-tags.js +9 -2
  350. package/dist/server/pages-body-parser-config.d.ts +2 -1
  351. package/dist/server/pages-client-assets.d.ts +8 -1
  352. package/dist/server/pages-data-route.d.ts +2 -1
  353. package/dist/server/pages-document-asset-props.d.ts +2 -1
  354. package/dist/server/pages-document-initial-props.d.ts +2 -1
  355. package/dist/server/pages-execution-tracing.d.ts +2 -1
  356. package/dist/server/pages-execution-tracing.js +1 -1
  357. package/dist/server/pages-get-initial-props.d.ts +2 -1
  358. package/dist/server/pages-i18n.d.ts +18 -0
  359. package/dist/server/pages-i18n.js +18 -2
  360. package/dist/server/pages-node-compat.d.ts +5 -3
  361. package/dist/server/pages-node-compat.js +35 -16
  362. package/dist/server/pages-page-data.d.ts +7 -1
  363. package/dist/server/pages-page-data.js +35 -12
  364. package/dist/server/pages-page-handler.d.ts +3 -2
  365. package/dist/server/pages-page-handler.js +16 -7
  366. package/dist/server/pages-page-method.d.ts +2 -1
  367. package/dist/server/pages-page-response.d.ts +2 -1
  368. package/dist/server/pages-preview.d.ts +2 -1
  369. package/dist/server/pages-readiness.d.ts +2 -1
  370. package/dist/server/pages-request-pipeline.d.ts +8 -2
  371. package/dist/server/pages-request-pipeline.js +35 -40
  372. package/dist/server/pages-request-stage-entry.d.ts +2 -1
  373. package/dist/server/pages-request-stage-entry.js +16 -6
  374. package/dist/server/pages-response-stage-entry.d.ts +2 -1
  375. package/dist/server/pages-response-stage-entry.js +1 -1
  376. package/dist/server/pages-revalidate.js +1 -0
  377. package/dist/server/pages-route-data-kind.d.ts +2 -1
  378. package/dist/server/pages-router-entry.js +1 -1
  379. package/dist/server/prerender-cache-life-header.d.ts +2 -1
  380. package/dist/server/prerender-route-params.d.ts +2 -1
  381. package/dist/server/prod-server.d.ts +2 -2
  382. package/dist/server/prod-server.js +80 -36
  383. package/dist/server/proxy-trust.d.ts +6 -0
  384. package/dist/server/proxy-trust.js +12 -6
  385. package/dist/server/request-log.d.ts +2 -1
  386. package/dist/server/request-pipeline.d.ts +5 -0
  387. package/dist/server/request-pipeline.js +12 -1
  388. package/dist/server/request-tracing.d.ts +2 -1
  389. package/dist/server/request-tracing.js +1 -1
  390. package/dist/server/response-start-tracing.js +7 -29
  391. package/dist/server/rsc-render-stream.d.ts +4 -0
  392. package/dist/server/rsc-render-stream.js +25 -0
  393. package/dist/server/seed-cache.d.ts +2 -1
  394. package/dist/server/seed-cache.js +1 -1
  395. package/dist/server/server-reference-loader.js +10 -1
  396. package/dist/server/static-file-cache.d.ts +2 -1
  397. package/dist/server/static-file-cache.js +16 -3
  398. package/dist/server/static-layout-client-reuse-proof.d.ts +2 -1
  399. package/dist/server/worker-revalidation-context.d.ts +2 -1
  400. package/dist/server/worker-stages.d.ts +2 -1
  401. package/dist/server/worker-utils.js +1 -1
  402. package/dist/shims/app.d.ts +2 -1
  403. package/dist/shims/cache-callable-runtime.d.ts +2 -1
  404. package/dist/shims/cache-handler.d.ts +8 -3
  405. package/dist/shims/cache-handler.js +32 -11
  406. package/dist/shims/cache-request-state.d.ts +40 -3
  407. package/dist/shims/cache-request-state.js +70 -5
  408. package/dist/shims/cache-runtime.js +47 -19
  409. package/dist/shims/cache.d.ts +2 -2
  410. package/dist/shims/cache.js +17 -8
  411. package/dist/shims/caught-not-found-boundaries.d.ts +15 -0
  412. package/dist/shims/caught-not-found-boundaries.js +48 -0
  413. package/dist/shims/cdn-purge-routes.d.ts +25 -0
  414. package/dist/shims/cdn-purge-routes.js +77 -0
  415. package/dist/shims/client-locale.js +2 -1
  416. package/dist/shims/client-page-root.d.ts +2 -1
  417. package/dist/shims/config.d.ts +2 -1
  418. package/dist/shims/default-forbidden.d.ts +4 -0
  419. package/dist/shims/default-forbidden.js +18 -0
  420. package/dist/shims/default-not-found.d.ts +0 -5
  421. package/dist/shims/default-not-found.js +5 -41
  422. package/dist/shims/default-unauthorized.d.ts +4 -0
  423. package/dist/shims/default-unauthorized.js +18 -0
  424. package/dist/shims/dynamic.js +17 -4
  425. package/dist/shims/error-boundary.d.ts +39 -3
  426. package/dist/shims/error-boundary.js +31 -16
  427. package/dist/shims/font-google.js +1 -2
  428. package/dist/shims/font-utils.d.ts +3 -2
  429. package/dist/shims/font-utils.js +5 -3
  430. package/dist/shims/form.js +9 -4
  431. package/dist/shims/http-access-error-fallback.d.ts +7 -0
  432. package/dist/shims/http-access-error-fallback.js +47 -0
  433. package/dist/shims/image-props.d.ts +93 -0
  434. package/dist/shims/image-props.js +323 -0
  435. package/dist/shims/image.d.ts +4 -39
  436. package/dist/shims/image.js +4 -319
  437. package/dist/shims/internal/app-prefetch-fetch-queue.d.ts +22 -2
  438. package/dist/shims/internal/app-prefetch-fetch-queue.js +71 -18
  439. package/dist/shims/internal/app-route-prefetch-policy.d.ts +14 -3
  440. package/dist/shims/internal/app-route-prefetch-policy.js +29 -4
  441. package/dist/shims/internal/cache-context-accessor.d.ts +2 -1
  442. package/dist/shims/internal/client-reference-loader.d.ts +7 -0
  443. package/dist/shims/internal/client-reference-loader.js +91 -0
  444. package/dist/shims/internal/cookie-serialize.d.ts +2 -1
  445. package/dist/shims/internal/cookies.js +1 -2
  446. package/dist/shims/internal/headers-state.d.ts +9 -0
  447. package/dist/shims/internal/headers-state.js +19 -2
  448. package/dist/shims/internal/hybrid-client-route-owner-direct.d.ts +6 -2
  449. package/dist/shims/internal/hybrid-client-route-owner-direct.js +31 -14
  450. package/dist/shims/internal/hybrid-client-route-owner.js +8 -8
  451. package/dist/shims/internal/interpolate-as.d.ts +2 -1
  452. package/dist/shims/internal/pages-data-target.d.ts +2 -1
  453. package/dist/shims/internal/pages-data-url.d.ts +2 -1
  454. package/dist/shims/internal/thenable-well-known-properties.d.ts +2 -1
  455. package/dist/shims/link.js +198 -53
  456. package/dist/shims/metadata.d.ts +32 -11
  457. package/dist/shims/metadata.js +88 -26
  458. package/dist/shims/navigation-errors.d.ts +2 -1
  459. package/dist/shims/navigation.d.ts +23 -3
  460. package/dist/shims/navigation.js +91 -25
  461. package/dist/shims/og.js +35 -10
  462. package/dist/shims/pages-router-runtime.d.ts +2 -1
  463. package/dist/shims/ppr-fallback-shell.d.ts +2 -1
  464. package/dist/shims/request-context.d.ts +13 -0
  465. package/dist/shims/router.js +33 -43
  466. package/dist/shims/server.d.ts +31 -4
  467. package/dist/shims/server.js +58 -10
  468. package/dist/shims/thenable-params.d.ts +6 -1
  469. package/dist/shims/thenable-params.js +11 -2
  470. package/dist/shims/unified-request-context.d.ts +5 -0
  471. package/dist/shims/unified-request-context.js +5 -3
  472. package/dist/typegen.d.ts +2 -1
  473. package/dist/utils/asset-prefix.d.ts +7 -0
  474. package/dist/utils/asset-prefix.js +10 -1
  475. package/dist/utils/client-build-manifest.d.ts +4 -1
  476. package/dist/utils/client-build-manifest.js +20 -6
  477. package/dist/utils/client-entry-manifest.d.ts +13 -0
  478. package/dist/utils/client-entry-manifest.js +20 -1
  479. package/dist/utils/client-reference-chunks.d.ts +45 -0
  480. package/dist/utils/client-reference-chunks.js +30 -0
  481. package/dist/utils/client-runtime-metadata.d.ts +10 -1
  482. package/dist/utils/client-runtime-metadata.js +53 -9
  483. package/dist/utils/compare.d.ts +9 -0
  484. package/dist/utils/compare.js +15 -1
  485. package/dist/utils/lazy-chunks.d.ts +18 -0
  486. package/dist/utils/lazy-chunks.js +27 -1
  487. package/dist/utils/manifest-paths.d.ts +14 -0
  488. package/dist/utils/manifest-paths.js +22 -1
  489. package/dist/utils/middleware-request-headers.d.ts +2 -1
  490. package/dist/utils/path-to-regexp.d.ts +21 -0
  491. package/dist/{server/middleware-path-to-regexp.js → utils/path-to-regexp.js} +14 -11
  492. package/dist/utils/plugin-react-version.d.ts +15 -0
  493. package/dist/utils/plugin-react-version.js +64 -0
  494. package/dist/utils/project.d.ts +2 -1
  495. package/dist/utils/project.js +9 -1
  496. package/dist/utils/public-routes.d.ts +2 -0
  497. package/dist/utils/public-routes.js +18 -7
  498. package/dist/utils/query.d.ts +2 -1
  499. package/dist/utils/sorted-array.d.ts +2 -1
  500. package/dist/utils/vite-cli-invocation.d.ts +2 -1
  501. package/package.json +5 -5
  502. package/dist/deps/.pnpm/image-size@2.0.2/deps/image-size/dist/index.js +0 -808
  503. package/dist/server/default-not-found-module.d.ts +0 -19
  504. package/dist/server/default-not-found-module.js +0 -18
  505. package/dist/server/middleware-path-to-regexp.d.ts +0 -13
  506. package/dist/server/rsc-stream-hints.d.ts +0 -21
  507. package/dist/server/rsc-stream-hints.js +0 -227
  508. package/dist/utils/regex-safety.d.ts +0 -17
  509. package/dist/utils/regex-safety.js +0 -789
@@ -1,6 +1,8 @@
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";
5
+ import { createArtifactCompatibilityEnvelope } from "./artifact-compatibility.js";
4
6
  import { AppElementsWire } from "./app-elements-wire.js";
5
7
  import "./app-elements.js";
6
8
  import DefaultGlobalError from "../shims/default-global-error.js";
@@ -8,20 +10,52 @@ import { ErrorBoundary, GlobalErrorBoundary, SerializedErrorBoundary } from "../
8
10
  import { LayoutSegmentProvider } from "../shims/layout-segment-context.js";
9
11
  import { withUseCacheLayoutMarker } from "../shims/internal/app-page-props-cache-key.js";
10
12
  import { MetadataHead, ViewportHead } from "../shims/metadata.js";
11
- import { resolveAppPageBranchParams, resolveAppPageSegmentParams } from "./app-page-params.js";
12
13
  import { stripRscSuffix } from "./app-rsc-cache-busting.js";
14
+ import { copyLinkHeaderProvenance } from "./app-response-header-provenance.js";
13
15
  import { buildRscRedirectFlightStream } from "./app-rsc-redirect-flight.js";
14
16
  import { bufferAppPageBinaryStream, buildAppPageSpecialErrorResponse, resolveAppPageSpecialError } from "./app-page-execution.js";
15
- import { createAppPageLayoutEntries, createAppPageSourcePage } from "./app-page-route-wiring.js";
16
- 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";
17
19
  import { buildClientHookErrorMessage } from "../shims/client-hook-error.js";
18
- import { resolveActiveParallelRouteHeadInputs, resolveAppPageHead } from "./app-page-head.js";
19
- import { resolveHttpAccessFallbackMetadata, resolveHttpAccessFallbackViewport } from "./app-page-http-access-fallback-metadata.js";
20
- 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";
21
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";
22
25
  import { resolveSlotParamOverrides } from "./app-page-element-builder.js";
23
- import { Fragment, createElement } from "react";
26
+ import { createAppPageFontData, createAppPageRscErrorTracker, createAppPageSsrErrorHandler, renderAppPageHtmlResponse } from "./app-page-stream.js";
27
+ import { Fragment, Suspense, createElement } from "react";
24
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
+ }
25
59
  const DEFAULT_GLOBAL_ERROR_COMPONENT = DefaultGlobalError;
26
60
  function getDefaultExport(module) {
27
61
  return module?.default ?? null;
@@ -34,6 +68,8 @@ function resolveHttpAccessBoundaryTreePosition(route, boundaryModule, statusCode
34
68
  if (boundaryModule === routeBoundary && statusCode === 403) return route.forbiddenTreePosition ?? null;
35
69
  if (boundaryModule === routeBoundary && statusCode === 401) return route.unauthorizedTreePosition ?? null;
36
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;
37
73
  return null;
38
74
  }
39
75
  function wrapRenderedBoundaryElement(options) {
@@ -96,14 +132,19 @@ function createAppPageBoundaryRscPayload(options) {
96
132
  const routeId = AppElementsWire.encodeRouteId(options.pathname, null);
97
133
  const layoutEntries = createAppPageBoundaryLayoutEntries(options.route, options.layoutModules);
98
134
  const sourcePageSegments = options.sourcePageSegments ?? options.route?.routeSegments;
135
+ const rootLayoutTreePath = layoutEntries[0]?.treePath ?? null;
99
136
  return {
100
137
  ...AppElementsWire.createMetadataEntries({
101
138
  interceptionContext: null,
102
139
  layoutIds: layoutEntries.map((entry) => entry.id),
103
- rootLayoutTreePath: layoutEntries[0]?.treePath ?? null,
140
+ rootLayoutTreePath,
104
141
  routeId,
105
142
  sourcePage: sourcePageSegments ? createAppPageSourcePage(sourcePageSegments) : null
106
143
  }),
144
+ [AppElementsWire.keys.artifactCompatibility]: createArtifactCompatibilityEnvelope({
145
+ deploymentVersion: process.env.__VINEXT_BUILD_ID ?? null,
146
+ rootBoundaryId: rootLayoutTreePath
147
+ }),
107
148
  [routeId]: options.element
108
149
  };
109
150
  }
@@ -157,6 +198,7 @@ async function renderAppPageBoundaryElementResponse(options) {
157
198
  isCacheCandidate: options.isCacheCandidate,
158
199
  isEdgeRuntime: options.isEdgeRuntime,
159
200
  middlewareHeaders: options.middlewareContext.headers,
201
+ preloadRoutePattern: options.route ? options.route.pattern : null,
160
202
  navigationContext: options.getNavigationContext() ?? {
161
203
  pathname,
162
204
  searchParams: requestUrl.searchParams,
@@ -217,17 +259,23 @@ async function renderAppPageHttpAccessFallback(options) {
217
259
  const layoutModules = options.layoutModules ?? options.route?.layouts ?? options.rootLayouts;
218
260
  const pathname = new URL(options.requestUrl).pathname;
219
261
  const routePathname = options.routePathname ?? stripRscSuffix(stripBasePath(pathname, options.basePath ?? ""));
220
- 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);
221
265
  const fallbackRouteSegments = routeSegments ?? [];
222
266
  let head;
267
+ let streamedRouteMetadata = null;
268
+ let streamedConventionHead = null;
269
+ const lateAccessErrors = [];
223
270
  try {
224
271
  if ([
225
272
  401,
226
273
  403,
227
274
  404
228
275
  ].includes(options.statusCode)) {
229
- const boundaryTreePosition = resolveHttpAccessBoundaryTreePosition(options.route, boundaryModule, options.statusCode);
230
- 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);
231
279
  const intercept = options.intercept;
232
280
  const isSiblingIntercept = intercept?.interceptSlotKey === "__vinext_page_intercept" && intercept.interceptPage != null;
233
281
  const effectiveParams = isSiblingIntercept ? intercept.interceptParams ?? options.matchedParams : options.matchedParams;
@@ -249,52 +297,180 @@ async function renderAppPageHttpAccessFallback(options) {
249
297
  slotParams,
250
298
  slots: options.route?.slots ?? null
251
299
  });
252
- const primaryParallelBranch = isSiblingIntercept ? {
300
+ const resolvePrimaryParallelBranch = (segments) => isSiblingIntercept ? {
253
301
  head: {
254
302
  layoutModules: intercept?.interceptLayouts ?? [],
255
- 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)),
256
304
  pageModule: intercept?.interceptPage ?? null,
257
305
  params: effectiveParams,
258
- routeSegments: intercept?.interceptSourcePageSegments ?? fallbackRouteSegments
306
+ routeSegments: intercept?.interceptSourcePageSegments ?? segments
259
307
  },
260
308
  ...intercept?.interceptNotFound ? {
261
309
  notFoundModule: intercept.interceptNotFound,
262
- notFoundModuleRouteSegments: (intercept.interceptNotFoundBranchSegments ?? intercept.interceptSourcePageSegments ?? fallbackRouteSegments).slice(0, intercept.interceptNotFoundTreePosition ?? 0),
263
- 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)
264
312
  } : {},
265
- ownerTreePosition: fallbackRouteSegments.length
313
+ ownerTreePosition: segments.length
266
314
  } : null;
315
+ const primaryParallelBranch = resolvePrimaryParallelBranch(fallbackRouteSegments);
267
316
  const fallbackHeadOptions = {
268
- boundaryModule,
317
+ boundaryModule: headBoundaryModule,
269
318
  boundaryParams,
270
- boundaryRouteSegments: fallbackRouteSegments.slice(0, boundaryTreePosition ?? 0),
319
+ boundaryRouteSegments,
271
320
  branchNotFoundConventions: options.statusCode === 404,
272
321
  errorConvention: options.statusCode === 403 ? "forbidden" : options.statusCode === 401 ? "unauthorized" : "not-found",
273
- layoutModules,
274
- layoutTreePositions: resolveHttpAccessFallbackHeadLayoutTreePositions(options.route, layoutModules),
322
+ layoutModules: headLayoutModules,
323
+ layoutTreePositions: resolveHttpAccessFallbackHeadLayoutTreePositions(options.route, headLayoutModules),
275
324
  parallelBranches,
276
325
  params: options.matchedParams,
277
326
  primaryParallelBranch,
278
327
  routeSegments
279
328
  };
280
- const [metadata, viewport] = await Promise.all([resolveHttpAccessFallbackMetadata({
281
- applyFileBasedMetadata: options.applyFileBasedMetadata,
282
- basePath: options.basePath ?? "",
283
- ...fallbackHeadOptions,
284
- metadataRoutes: options.metadataRoutes,
285
- routePath: options.route?.pattern ?? pathname
286
- }), resolveHttpAccessFallbackViewport(fallbackHeadOptions)]);
287
- head = {
288
- metadata,
289
- 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
+ };
290
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();
291
467
  } else head = await resolveAppPageHead({
292
468
  applyFileBasedMetadata: options.applyFileBasedMetadata,
293
469
  basePath: options.basePath ?? "",
294
- layoutModules,
295
- layoutTreePositions: resolveHttpAccessFallbackHeadLayoutTreePositions(options.route, layoutModules),
470
+ layoutModules: headLayoutModules,
471
+ layoutTreePositions: resolveHttpAccessFallbackHeadLayoutTreePositions(options.route, headLayoutModules),
296
472
  metadataRoutes: options.metadataRoutes,
297
- pageModule: boundaryModule,
473
+ pageModule: headBoundaryModule,
298
474
  params: options.matchedParams,
299
475
  routePath: options.route?.pattern ?? pathname,
300
476
  routeSegments
@@ -316,16 +492,30 @@ async function renderAppPageHttpAccessFallback(options) {
316
492
  if (metadata) headElements.push(createElement(MetadataHead, {
317
493
  key: "metadata",
318
494
  metadata,
319
- pathname,
495
+ pathname: routePathname,
320
496
  trailingSlash: options.trailingSlash
321
497
  }));
322
- headElements.push(createElement(ViewportHead, {
498
+ if (viewport) headElements.push(createElement(ViewportHead, {
323
499
  key: "viewport",
324
500
  viewport
325
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 }))));
326
516
  const skipLayoutWrapping = options.skipLayoutWrapping ?? false;
327
517
  const element = wrapRenderedBoundaryElement({
328
- element: createElement(Fragment, null, ...headElements, createElement(boundaryComponent)),
518
+ element: createElement(Fragment, null, ...headElements, createElement(boundaryComponent), ...bodyElements),
329
519
  globalErrorModule: options.globalErrorModule,
330
520
  includeGlobalErrorBoundary: true,
331
521
  isRscRequest: options.isRscRequest,
@@ -337,7 +527,7 @@ async function renderAppPageHttpAccessFallback(options) {
337
527
  routeSegments: options.route?.routeSegments,
338
528
  skipLayoutWrapping
339
529
  });
340
- return renderAppPageBoundaryElementResponse({
530
+ return failOnLateAccessError(await renderAppPageBoundaryElementResponse({
341
531
  ...options,
342
532
  element,
343
533
  handleSpecialErrors: true,
@@ -347,7 +537,7 @@ async function renderAppPageHttpAccessFallback(options) {
347
537
  route: skipLayoutWrapping ? null : options.route,
348
538
  routePattern: options.route?.pattern,
349
539
  status: options.statusCode
350
- });
540
+ }), lateAccessErrors);
351
541
  }
352
542
  async function renderAppPageErrorBoundary(options) {
353
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
@@ -43,6 +43,8 @@ async function renderAppPageCacheArtifactsImpl(options, renderSpan) {
43
43
  mirrorNextFlight: options.mirrorNextFlight,
44
44
  isStaticGeneration: true,
45
45
  isForceStatic: options.isForceStatic,
46
+ preloadRoutePattern: options.route.pattern,
47
+ resolveCaughtNotFoundBoundaries: options.resolveCaughtNotFoundBoundaries,
46
48
  onSsrError: options.onSsrError && options.isCapturedRscError ? createAppPageSsrErrorHandler((error) => {
47
49
  recordAppPageRenderError(renderSpan, error);
48
50
  return options.onSsrError?.(error);
@@ -68,6 +70,17 @@ async function renderAppPageCacheArtifactsImpl(options, renderSpan) {
68
70
  const reactLinkHeader = isAppSsrRenderResult(htmlResult) ? htmlResult.linkHeader : void 0;
69
71
  linkHeader = buildAppPageLinkHeader(reactLinkHeader, buildAppPageFontLinkHeader(fontPreloads), options.reactMaxHeadersLength);
70
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
+ }
71
84
  }
72
85
  let rscData;
73
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 {