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
@@ -7,6 +7,7 @@ import { NavigationContext } from "../shims/navigation-context-state.js";
7
7
  import "../shims/navigation.js";
8
8
  import { AppPageFontPreload, LayoutClassificationOptions } from "./app-page-execution.js";
9
9
  import { AppPageMiddlewareContext } from "./app-page-response.js";
10
+ import { AppPageFallbackRouteHead, AppPagePreparedRouteHead } from "./app-page-head.js";
10
11
  import { AppLayoutParamAccessTracker } from "./app-layout-param-observation.js";
11
12
  import { RootParams } from "../shims/root-params.js";
12
13
  import { AppPageSsrHandler } from "./app-page-stream.js";
@@ -43,8 +44,16 @@ type AppPageDispatchIntercept<TPage = unknown> = {
43
44
  interceptLoadings?: readonly unknown[] | null;
44
45
  interceptLoadingTreePositions?: readonly number[] | null;
45
46
  interceptNotFoundBranchSegments?: readonly string[] | null;
47
+ interceptNotFounds?: readonly unknown[] | null;
48
+ interceptNotFoundTreePositions?: readonly number[] | null;
46
49
  notFound?: unknown;
47
50
  notFoundTreePosition?: number | null;
51
+ interceptForbiddens?: readonly unknown[] | null;
52
+ interceptForbiddenTreePositions?: readonly number[] | null;
53
+ interceptUnauthorizeds?: readonly unknown[] | null;
54
+ interceptUnauthorizedTreePositions?: readonly number[] | null;
55
+ interceptErrors?: readonly unknown[] | null;
56
+ interceptErrorTreePositions?: readonly number[] | null;
48
57
  matchedParams: AppPageParams;
49
58
  sourceMatchedParams?: AppPageParams;
50
59
  page: TPage;
@@ -67,6 +76,14 @@ type AppPageDispatchInterceptOptions<TPage = unknown> = {
67
76
  interceptNotFoundBranchSegments?: readonly string[] | null;
68
77
  interceptNotFound?: unknown;
69
78
  interceptNotFoundTreePosition?: number | null;
79
+ interceptForbiddens?: readonly unknown[] | null;
80
+ interceptForbiddenTreePositions?: readonly number[] | null;
81
+ interceptUnauthorizeds?: readonly unknown[] | null;
82
+ interceptUnauthorizedTreePositions?: readonly number[] | null;
83
+ interceptErrors?: readonly unknown[] | null;
84
+ interceptErrorTreePositions?: readonly number[] | null;
85
+ interceptNotFounds?: readonly unknown[] | null;
86
+ interceptNotFoundTreePositions?: readonly number[] | null;
70
87
  interceptPage: TPage;
71
88
  interceptParams: AppPageParams;
72
89
  interceptSlotId?: string | null;
@@ -108,6 +125,12 @@ export type AppPageDispatchRoute = {
108
125
  params: readonly string[];
109
126
  pattern: string;
110
127
  routeSegments: readonly string[];
128
+ segmentForbiddens?: readonly (AppPageModule | null | undefined)[];
129
+ segmentForbiddenTreePositions?: readonly number[];
130
+ segmentNotFounds?: readonly (AppPageModule | null | undefined)[];
131
+ segmentNotFoundTreePositions?: readonly number[];
132
+ segmentUnauthorizeds?: readonly (AppPageModule | null | undefined)[];
133
+ segmentUnauthorizedTreePositions?: readonly number[];
111
134
  slots?: Readonly<Record<string, AppPageDispatchSlot>>;
112
135
  unauthorized?: AppPageModule | null;
113
136
  unauthorizedTreePosition?: number | null;
@@ -140,10 +163,13 @@ export type DispatchAppPageOptions<TRoute extends AppPageDispatchRoute> = {
140
163
  reactMaxHeadersLength?: number;
141
164
  buildPageElement: (route: TRoute, params: AppPageParams, opts: AppPageDispatchInterceptOptions | undefined, searchParams: URLSearchParams, layoutParamAccess?: AppLayoutParamAccessTracker, options?: {
142
165
  isForceStatic?: boolean;
166
+ isUncacheableRender?: boolean;
143
167
  observeMetadataSearchParamsAccess?: boolean;
144
168
  observePageSearchParamsAccess?: boolean;
145
169
  serveStreamingMetadata?: boolean;
146
170
  placeStreamedMetadataInHead?: boolean;
171
+ /** Receives the route's head once the render starts resolving it. */
172
+ onHeadPrepared?: (head: AppPagePreparedRouteHead) => void;
147
173
  }) => Promise<AppPageElement>;
148
174
  clientReuseManifest?: ClientReuseManifestParseResult;
149
175
  cleanPathname: string;
@@ -229,11 +255,17 @@ export type DispatchAppPageOptions<TRoute extends AppPageDispatchRoute> = {
229
255
  renderHttpAccessFallbackPage: (statusCode: number, opts: {
230
256
  boundaryComponent?: unknown;
231
257
  boundaryModule?: AppPageModule | null;
258
+ /** Boundary whose metadata the head uses, when not `boundaryModule`. */
259
+ headBoundaryModule?: AppPageModule | null;
260
+ /** Layouts whose metadata the head uses, when more than `layouts`. */
261
+ headLayouts?: readonly AppPageModule[];
232
262
  intercept?: AppPageDispatchInterceptOptions | null;
233
263
  /** The document may be stored, so it must not carry the request's query. */
234
264
  isCacheCandidate?: boolean;
235
265
  layouts?: readonly AppPageModule[];
236
266
  matchedParams: AppPageParams;
267
+ /** The route's render threw the signal, so the document keeps the route's head. */
268
+ routeHead?: AppPageFallbackRouteHead;
237
269
  }, middlewareContext: AppPageMiddlewareContext | null) => Promise<Response | null>;
238
270
  renderToReadableStream: (element: AppPageRenderableElement, options: {
239
271
  onError: AppPageBoundaryOnError;
@@ -290,4 +322,5 @@ export declare function shouldReadAppPageCache(options: {
290
322
  }): boolean;
291
323
  export declare function hasSearchParams(searchParams: URLSearchParams | null | undefined): boolean;
292
324
  export declare function dispatchAppPage<TRoute extends AppPageDispatchRoute>(options: DispatchAppPageOptions<TRoute>): Promise<Response>;
293
- //#endregion
325
+ //#endregion
326
+ export {};
@@ -11,6 +11,7 @@ import { _captureRequestScopedCacheLifeAccessors } from "../shims/cache-request-
11
11
  import { ensureFetchPatch, getCollectedFetchTags, peekDynamicFetchObservations, runWithFetchDedupe, setCurrentFetchCacheMode, setCurrentFetchRevalidate, setCurrentFetchSoftTags, setCurrentForceDynamicFetchDefault, setRefreshStaleFetchesInForeground } from "../shims/fetch-cache.js";
12
12
  import { cacheabilityManifestPageState } from "./cacheability-manifest.js";
13
13
  import { isAppPageStaticEligible } from "./app-segment-config.js";
14
+ import { isAppClientReference } from "./app-render-dependency.js";
14
15
  import { AppElementsWire } from "./app-elements-wire.js";
15
16
  import "./app-elements.js";
16
17
  import { VINEXT_RSC_CONTENT_TYPE, applyRscCompatibilityIdHeader, applyRscDeploymentIdHeader } from "./app-rsc-cache-busting.js";
@@ -18,17 +19,18 @@ import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js
18
19
  import { getFrameworkLinkHeader } from "./app-response-header-provenance.js";
19
20
  import { resolveUncacheableCacheControl } from "./app-page-response.js";
20
21
  import { buildRscRedirectFlightStream } from "./app-rsc-redirect-flight.js";
21
- import { buildAppPageSpecialErrorResponse, resolveAppPageShellSpecialError, resolveAppPageSpecialError, resolveAppPageSpecialErrorStoredHeaders } from "./app-page-execution.js";
22
+ import { buildAppPageSpecialErrorResponse, resolveAppPageCaughtNotFoundBoundaries, resolveAppPageShellSpecialError, resolveAppPageSpecialError, resolveAppPageSpecialErrorStoredHeaders } from "./app-page-execution.js";
22
23
  import { resolveAppPageTraceOperation } from "./app-page-tracing.js";
23
24
  import { createAppPageTreePath } from "./app-page-route-wiring.js";
24
25
  import { traceResponseStart } from "./response-start-tracing.js";
25
- import { buildAppPageTags } from "./implicit-tags.js";
26
- import { consumeAppPageRenderObservationState, discardAppPageRenderState } from "./app-page-render-observation.js";
27
- import { createAppPageRscErrorTracker } from "./app-page-stream.js";
28
- import { resolveAppPageParentHttpAccessBoundary, resolveAppPageParentHttpAccessBoundaryModule } from "./app-page-boundary.js";
26
+ import { resolveAppPageLayoutHttpAccessBoundary, resolveAppPageParentHttpAccessBoundary, resolveAppPageRootHttpAccessBoundaryTreePosition } from "./app-page-boundary.js";
29
27
  import { shouldServeStreamingMetadata } from "./streaming-metadata.js";
30
28
  import { resolveAppPageNavigationParams } from "./app-page-element-builder.js";
29
+ import { createAppPageRscErrorTracker } from "./app-page-stream.js";
30
+ import { getDefaultHttpAccessFallbackModule } from "./default-http-access-fallback-modules.js";
31
31
  import { createAppLayoutParamAccessTracker, isAppLayoutObservationUnsafeForStaticReuse } from "./app-layout-param-observation.js";
32
+ import { consumeAppPageRenderObservationState, discardAppPageRenderState } from "./app-page-render-observation.js";
33
+ import { buildAppPageTags } from "./implicit-tags.js";
32
34
  import { resolveAppPageMethodResponse } from "./app-page-method.js";
33
35
  import { buildAppPageElement, resolveAppPageIntercept, resolveAppPageInterceptionRerenderTarget, validateAppPageDynamicParams } from "./app-page-request.js";
34
36
  import { applyIneligibleRouteCachePolicy, renderAppPageLifecycle } from "./app-page-render.js";
@@ -182,6 +184,14 @@ function toInterceptOptions(interceptionContext, intercept) {
182
184
  interceptNotFoundBranchSegments: intercept.interceptNotFoundBranchSegments,
183
185
  interceptNotFound: intercept.notFound,
184
186
  interceptNotFoundTreePosition: intercept.notFoundTreePosition,
187
+ interceptForbiddens: intercept.interceptForbiddens,
188
+ interceptForbiddenTreePositions: intercept.interceptForbiddenTreePositions,
189
+ interceptUnauthorizeds: intercept.interceptUnauthorizeds,
190
+ interceptUnauthorizedTreePositions: intercept.interceptUnauthorizedTreePositions,
191
+ interceptErrors: intercept.interceptErrors,
192
+ interceptErrorTreePositions: intercept.interceptErrorTreePositions,
193
+ interceptNotFounds: intercept.interceptNotFounds,
194
+ interceptNotFoundTreePositions: intercept.interceptNotFoundTreePositions,
185
195
  interceptPage: intercept.page,
186
196
  interceptParams: intercept.matchedParams,
187
197
  interceptSlotId: intercept.slotId ?? null,
@@ -316,6 +326,7 @@ async function dispatchAppPageInner(options) {
316
326
  const isNeverStoredPath = options.pprRuntime === void 0 && hasNoManifestAdmissionState(route.pattern);
317
327
  const shouldReadCache = !isRouteCacheabilityProbe() && isCacheEligibleRender && !isNeverStoredPath;
318
328
  const isCacheCandidate = isCacheEligibleRender && isStaticEligible && options.pprFallbackShell === void 0 && !isNeverStoredPath;
329
+ const isUncacheableRender = !(isCacheEligibleRender && isStaticEligible) && options.pprFallbackShell === void 0 && (options.pprRuntime === void 0 || !options.isProduction);
319
330
  if (shouldReadCache && isStaticEligible) {
320
331
  traceOperation = resolveAppPageTraceOperation({
321
332
  hasRequestSearchParams,
@@ -381,6 +392,12 @@ async function dispatchAppPageInner(options) {
381
392
  const revalidationDynamicConfig = options.resolveRouteDynamicConfig?.(revalidationTarget.route) ?? (revalidationTarget.route === route ? dynamicConfig : void 0);
382
393
  const revalidationConfigRevalidateSeconds = options.resolveRouteRevalidateSeconds?.(revalidationTarget.route) ?? (revalidationTarget.route === route ? currentRevalidateSeconds : null);
383
394
  const revalidationRouteRevalidateSeconds = revalidationTarget.route === route ? void 0 : revalidationConfigRevalidateSeconds ?? (revalidationDynamicConfig === "force-static" || revalidationDynamicConfig === "error" || options.isProduction && options.pprRuntime === void 0 && options.resolveRouteStaticEligible(revalidationTarget.route) ? Infinity : null);
395
+ const revalidationRouteHead = {
396
+ observeSearchParams: revalidationDynamicConfig !== "force-static",
397
+ searchParams: new URLSearchParams(),
398
+ streamMetadata: false,
399
+ value: null
400
+ };
384
401
  return runAppPageRevalidationContext({
385
402
  cleanPathname: options.cleanPathname,
386
403
  displayPathname: options.displayPathname,
@@ -400,7 +417,10 @@ async function dispatchAppPageInner(options) {
400
417
  observeMetadataSearchParamsAccess: revalidationDynamicConfig !== "force-static",
401
418
  observePageSearchParamsAccess: revalidationDynamicConfig !== "force-static",
402
419
  serveStreamingMetadata: placeGeneratedMetadataInBody,
403
- placeStreamedMetadataInHead: true
420
+ placeStreamedMetadataInHead: true,
421
+ onHeadPrepared(head) {
422
+ revalidationRouteHead.value = head;
423
+ }
404
424
  });
405
425
  const baseRevalidatedOnError = options.createRscOnErrorHandler(options.cleanPathname, revalidationTarget.route.pattern, { revalidateReason: "stale" });
406
426
  const baseRevalidatedOnSsrError = options.createRscOnErrorHandler(options.cleanPathname, revalidationTarget.route.pattern, {
@@ -430,7 +450,8 @@ async function dispatchAppPageInner(options) {
430
450
  return baseRevalidatedOnSsrError(error, void 0, void 0);
431
451
  },
432
452
  reactMaxHeadersLength: options.reactMaxHeadersLength,
433
- async renderShellSpecialError(error) {
453
+ resolveCaughtNotFoundBoundaries: options.isRscRequest ? void 0 : (error) => resolveAppPageCaughtNotFoundBoundaries(error, rscErrorTracker.getCapturedSpecialErrors(error)),
454
+ async renderShellSpecialError(error, caughtDocument) {
434
455
  const specialError = resolveAppPageShellSpecialError(error, rscErrorTracker.getCapturedSpecialErrors(error));
435
456
  if (!specialError) return null;
436
457
  if (options.isRscRequest) {
@@ -441,8 +462,14 @@ async function dispatchAppPageInner(options) {
441
462
  status: specialError.statusCode
442
463
  };
443
464
  }
465
+ if (caughtDocument) return {
466
+ headers: resolveAppPageSpecialErrorStoredHeaders(specialError, options.basePath),
467
+ html: caughtDocument.html,
468
+ linkHeader: caughtDocument.linkHeader,
469
+ status: specialError.statusCode
470
+ };
444
471
  if (revalidationTarget.route !== route) return null;
445
- const document = await renderPageSpecialError(options, specialError, false, revalidationTarget.interceptOpts, true);
472
+ const document = await renderPageSpecialError(options, specialError, false, revalidationTarget.interceptOpts, true, void 0, revalidationRouteHead);
446
473
  if (document.status !== specialError.statusCode) return null;
447
474
  return {
448
475
  headers: resolveAppPageSpecialErrorStoredHeaders(specialError, options.basePath),
@@ -518,6 +545,15 @@ async function dispatchAppPageInner(options) {
518
545
  let interceptDynamicConfig;
519
546
  let interceptDynamicConfigResolved = false;
520
547
  let isInterceptSourceKnownDynamic = false;
548
+ const renderedRouteHead = {
549
+ observeSearchParams: !isForceStatic,
550
+ searchParams: pageSearchParams,
551
+ streamMetadata: placeGeneratedMetadataInBody && options.renderWholeDocument !== true,
552
+ value: null
553
+ };
554
+ const onHeadPrepared = (head) => {
555
+ renderedRouteHead.value = head;
556
+ };
521
557
  const interceptResult = await resolveAppPageIntercept({
522
558
  async buildPageElement(interceptRoute, interceptParams, interceptOpts, interceptSearchParams, interceptLayoutParamAccess) {
523
559
  const sourceDynamicConfig = interceptDynamicConfigResolved ? interceptDynamicConfig : options.resolveRouteDynamicConfig?.(interceptRoute);
@@ -540,8 +576,10 @@ async function dispatchAppPageInner(options) {
540
576
  isForceStatic: sourceDynamicConfig === "force-static",
541
577
  observeMetadataSearchParamsAccess: sourceDynamicConfig !== "force-static",
542
578
  observePageSearchParamsAccess: sourceDynamicConfig !== "force-static",
579
+ isUncacheableRender,
543
580
  serveStreamingMetadata: placeGeneratedMetadataInBody,
544
- placeStreamedMetadataInHead: options.renderWholeDocument === true
581
+ placeStreamedMetadataInHead: options.renderWholeDocument === true,
582
+ onHeadPrepared
545
583
  });
546
584
  },
547
585
  cleanPathname: options.cleanPathname,
@@ -591,20 +629,23 @@ async function dispatchAppPageInner(options) {
591
629
  if (interceptResult.response) return interceptResult.response;
592
630
  const buildCurrentPageElement = () => buildAppPageElement({
593
631
  buildPageElement() {
632
+ renderedRouteHead.value = null;
594
633
  if (options.actionFailed) throw options.actionError;
595
634
  return options.buildPageElement(route, options.params, interceptResult.interceptOpts, pageSearchParams, layoutParamAccess, {
596
635
  isForceStatic,
597
636
  observeMetadataSearchParamsAccess: !isForceStatic,
598
637
  observePageSearchParamsAccess: !isForceStatic,
638
+ isUncacheableRender,
599
639
  serveStreamingMetadata: placeGeneratedMetadataInBody,
600
- placeStreamedMetadataInHead: options.renderWholeDocument === true
640
+ placeStreamedMetadataInHead: options.renderWholeDocument === true,
641
+ onHeadPrepared
601
642
  });
602
643
  },
603
644
  renderErrorBoundaryPage(buildError) {
604
645
  return options.renderErrorBoundaryPage(buildError);
605
646
  },
606
647
  renderSpecialError(specialError) {
607
- return renderPageSpecialError(options, specialError, serveStreamingMetadata, interceptResult.interceptOpts);
648
+ return renderPageSpecialError(options, specialError, serveStreamingMetadata, interceptResult.interceptOpts, false, void 0, renderedRouteHead);
608
649
  },
609
650
  resolveSpecialError: resolveAppPageSpecialError
610
651
  });
@@ -736,10 +777,10 @@ async function dispatchAppPageInner(options) {
736
777
  return options.renderErrorBoundaryPage(renderError, errorOrigin);
737
778
  },
738
779
  renderLayoutSpecialError(specialError, layoutIndex) {
739
- return renderLayoutSpecialError(options, specialError, layoutIndex, serveStreamingMetadata);
780
+ return renderLayoutSpecialError(options, specialError, layoutIndex, serveStreamingMetadata, renderedRouteHead);
740
781
  },
741
782
  renderPageSpecialError(specialError, renderOptions) {
742
- return renderPageSpecialError(options, specialError, serveStreamingMetadata, interceptResult.interceptOpts, renderOptions?.isCacheCandidate === true);
783
+ return renderPageSpecialError(options, specialError, serveStreamingMetadata, interceptResult.interceptOpts, renderOptions?.isCacheCandidate === true, renderOptions?.caughtDocument, renderedRouteHead);
743
784
  },
744
785
  renderToReadableStream: options.renderToReadableStream,
745
786
  hasCustomGlobalError: options.hasCustomGlobalError,
@@ -754,7 +795,22 @@ async function dispatchAppPageInner(options) {
754
795
  }
755
796
  });
756
797
  }
757
- async function renderLayoutSpecialError(options, specialError, layoutIndex, serveStreamingMetadata) {
798
+ /**
799
+ * A signal the route's own render threw keeps the route's head, reusing the
800
+ * one that render prepared. A progressive server action's signal doesn't:
801
+ * Next.js answers it with a not-found tree in place of the page
802
+ * (`createNotFoundLoaderTree`), so the page's metadata never applies.
803
+ * https://github.com/vercel/next.js/blob/canary/packages/next/src/server/app-render/app-render.tsx
804
+ */
805
+ function resolveFallbackRouteHead(options, renderedRouteHead) {
806
+ if (options.actionFailed || !renderedRouteHead) return null;
807
+ const { value, ...render } = renderedRouteHead;
808
+ return {
809
+ ...render,
810
+ prepared: value
811
+ };
812
+ }
813
+ async function renderLayoutSpecialError(options, specialError, layoutIndex, serveStreamingMetadata, renderedRouteHead) {
758
814
  return buildAppPageSpecialErrorResponse({
759
815
  basePath: options.basePath,
760
816
  buildRscRedirectFlightStream: (rscOptions) => buildRscRedirectFlightStream({
@@ -768,31 +824,93 @@ async function renderLayoutSpecialError(options, specialError, layoutIndex, serv
768
824
  isRscRequest: options.isRscRequest,
769
825
  middlewareContext: options.middlewareContext,
770
826
  renderFallbackPage(statusCode) {
771
- const parentBoundaryModule = resolveAppPageParentHttpAccessBoundaryModule({
772
- layoutIndex,
773
- rootForbiddenModule: options.rootForbiddenModule,
774
- rootNotFoundModule: options.rootNotFoundModule,
775
- rootUnauthorizedModule: options.rootUnauthorizedModule,
776
- routeForbiddenModules: options.route.forbiddens,
777
- routeNotFoundModules: options.route.notFounds,
778
- routeUnauthorizedModules: options.route.unauthorizeds,
779
- statusCode
827
+ return renderLayoutBoundaryFallback(options, statusCode, layoutIndex, {
828
+ headLayouts: options.route.layouts.slice(0, layoutIndex),
829
+ routeHead: resolveFallbackRouteHead(options, renderedRouteHead)
780
830
  });
781
- const fallbackOptions = {
782
- layouts: options.route.layouts.slice(0, layoutIndex),
783
- matchedParams: options.params
784
- };
785
- if (parentBoundaryModule) {
786
- fallbackOptions.boundaryComponent = parentBoundaryModule.default;
787
- fallbackOptions.boundaryModule = parentBoundaryModule;
788
- }
789
- return options.renderHttpAccessFallbackPage(statusCode, fallbackOptions, null);
790
831
  },
791
832
  request: options.request,
792
833
  specialError
793
834
  });
794
835
  }
795
- async function renderPageSpecialError(options, specialError, serveStreamingMetadata, intercept, isCacheCandidate = false) {
836
+ /**
837
+ * The fallback for a special error a layout threw, or a parallel slot that
838
+ * layout renders: the boundary above the layout catches it. With
839
+ * `insideLayout`, the layout re-renders around its own segment's boundary
840
+ * instead. Without a segment boundary, Next.js' built-in not-found,
841
+ * forbidden or unauthorized page renders inside the root layout, or without
842
+ * it when the root layout, or a slot beside it outside `insideLayout`, threw.
843
+ */
844
+ function renderLayoutBoundaryFallback(options, statusCode, layoutIndex, fallbackOptions) {
845
+ const { route } = options;
846
+ const layoutTreePositions = route.layoutTreePositions ?? [];
847
+ const boundaryModules = statusCode === 403 ? route.segmentForbiddens : statusCode === 401 ? route.segmentUnauthorizeds : route.segmentNotFounds;
848
+ const boundaryTreePositions = statusCode === 403 ? route.segmentForbiddenTreePositions : statusCode === 401 ? route.segmentUnauthorizedTreePositions : route.segmentNotFoundTreePositions;
849
+ const insideLayout = fallbackOptions.insideLayout === true;
850
+ const ownLayoutTreePosition = layoutTreePositions[layoutIndex];
851
+ const layoutTreePosition = ownLayoutTreePosition === void 0 || !insideLayout ? ownLayoutTreePosition : ownLayoutTreePosition + 1;
852
+ const renderedLayoutCount = insideLayout ? layoutIndex + 1 : layoutIndex;
853
+ const boundary = layoutTreePosition === void 0 ? null : resolveAppPageLayoutHttpAccessBoundary({
854
+ boundaryModules: boundaryModules ?? [],
855
+ boundaryTreePositions: boundaryTreePositions ?? [],
856
+ layoutTreePosition
857
+ });
858
+ const boundaryModule = boundary?.module ?? getDefaultHttpAccessFallbackModule(statusCode);
859
+ if (!boundaryModule) return Promise.resolve(null);
860
+ const boundaryTreePosition = Math.max(boundary?.treePosition ?? 0, resolveAppPageRootHttpAccessBoundaryTreePosition(route.routeSegments, layoutTreePositions, layoutTreePosition));
861
+ const headBoundary = resolveAppPageLayoutHttpAccessBoundary({
862
+ boundaryModules: boundaryModules ?? [],
863
+ boundaryTreePositions: boundaryTreePositions ?? [],
864
+ layoutTreePosition: Number.POSITIVE_INFINITY
865
+ });
866
+ return options.renderHttpAccessFallbackPage(statusCode, {
867
+ boundaryComponent: boundaryModule.default,
868
+ boundaryModule,
869
+ headBoundaryModule: headBoundary?.module ?? boundaryModule,
870
+ headLayouts: fallbackOptions.headLayouts,
871
+ ...fallbackOptions.intercept ? { intercept: fallbackOptions.intercept } : {},
872
+ ...fallbackOptions.isCacheCandidate ? { isCacheCandidate: true } : {},
873
+ layouts: route.layouts.filter((_, index) => index < renderedLayoutCount && (layoutTreePositions[index] ?? 0) <= boundaryTreePosition),
874
+ matchedParams: options.params,
875
+ ...fallbackOptions.routeHead ? { routeHead: fallbackOptions.routeHead } : {}
876
+ }, null);
877
+ }
878
+ /**
879
+ * The fallback for a page's `notFound()` / `forbidden()` / `unauthorized()`.
880
+ * Next.js wraps each segment's children in its boundaries, with or without a
881
+ * layout, so the route's deepest boundary catches the signal and replaces
882
+ * every layout below its segment. Without one, the built-in not-found,
883
+ * forbidden or unauthorized page renders inside the root layout. Returns
884
+ * `null` for routes without segment data.
885
+ * https://github.com/vercel/next.js/blob/canary/packages/next/src/server/app-render/create-component-tree.tsx
886
+ */
887
+ function renderPageSegmentBoundaryFallback(options, statusCode, intercept, isCacheCandidate, routeHead) {
888
+ const { route } = options;
889
+ const boundaryModules = statusCode === 403 ? route.segmentForbiddens : statusCode === 401 ? route.segmentUnauthorizeds : route.segmentNotFounds;
890
+ const boundaryTreePositions = statusCode === 403 ? route.segmentForbiddenTreePositions : statusCode === 401 ? route.segmentUnauthorizedTreePositions : route.segmentNotFoundTreePositions;
891
+ if (!boundaryTreePositions) return null;
892
+ const boundary = resolveAppPageLayoutHttpAccessBoundary({
893
+ boundaryModules: boundaryModules ?? [],
894
+ boundaryTreePositions,
895
+ layoutTreePosition: Number.POSITIVE_INFINITY
896
+ });
897
+ const boundaryModule = boundary?.module ?? getDefaultHttpAccessFallbackModule(statusCode);
898
+ if (!boundaryModule) return Promise.resolve(null);
899
+ const layoutTreePositions = route.layoutTreePositions ?? [];
900
+ const boundaryTreePosition = Math.max(boundary?.treePosition ?? 0, resolveAppPageRootHttpAccessBoundaryTreePosition(route.routeSegments, layoutTreePositions, Number.POSITIVE_INFINITY));
901
+ return options.renderHttpAccessFallbackPage(statusCode, {
902
+ boundaryComponent: boundaryModule.default,
903
+ boundaryModule,
904
+ headLayouts: route.layouts,
905
+ intercept,
906
+ ...isCacheCandidate ? { isCacheCandidate } : {},
907
+ layouts: route.layouts.filter((_, index) => (layoutTreePositions[index] ?? 0) <= boundaryTreePosition),
908
+ matchedParams: options.params,
909
+ ...routeHead ? { routeHead } : {}
910
+ }, null);
911
+ }
912
+ async function renderPageSpecialError(options, specialError, serveStreamingMetadata, intercept, isCacheCandidate = false, caughtDocument, renderedRouteHead = null) {
913
+ const routeHead = resolveFallbackRouteHead(options, renderedRouteHead);
796
914
  return buildAppPageSpecialErrorResponse({
797
915
  basePath: options.basePath,
798
916
  buildRscRedirectFlightStream: (rscOptions) => buildRscRedirectFlightStream({
@@ -806,6 +924,16 @@ async function renderPageSpecialError(options, specialError, serveStreamingMetad
806
924
  isRscRequest: options.isRscRequest,
807
925
  middlewareContext: options.middlewareContext,
808
926
  renderFallbackPage(statusCode) {
927
+ if (caughtDocument) return Promise.resolve(caughtDocument);
928
+ if (specialError.kind === "http-access-fallback" && specialError.slotLayoutIndex !== void 0) return renderLayoutBoundaryFallback(options, statusCode, specialError.slotLayoutIndex, {
929
+ headLayouts: options.route.layouts,
930
+ insideLayout: specialError.slotLayoutIndex === 0 && (statusCode === 404 || isAppClientReference(options.route.layouts[0]?.default)),
931
+ intercept,
932
+ isCacheCandidate,
933
+ routeHead
934
+ });
935
+ const pageBoundaryFallback = renderPageSegmentBoundaryFallback(options, statusCode, intercept, isCacheCandidate, routeHead);
936
+ if (pageBoundaryFallback) return pageBoundaryFallback;
809
937
  const routeBoundaryModule = resolveAppPageRouteBoundaryModule(options.route, statusCode);
810
938
  const layoutCount = options.route.layouts.length;
811
939
  const { module: parentBoundaryModule, layoutIndex: boundaryLayoutIndex } = resolveAppPageParentHttpAccessBoundary({
@@ -822,7 +950,8 @@ async function renderPageSpecialError(options, specialError, serveStreamingMetad
822
950
  const fallbackOptions = {
823
951
  intercept,
824
952
  ...isCacheCandidate ? { isCacheCandidate } : {},
825
- matchedParams: options.params
953
+ matchedParams: options.params,
954
+ ...routeHead ? { routeHead } : {}
826
955
  };
827
956
  if (useLayoutAlignedBoundary && boundaryLayoutIndex !== null) {
828
957
  fallbackOptions.layouts = options.route.layouts.slice(0, boundaryLayoutIndex + 1);
@@ -3,7 +3,7 @@ import { AppElements } from "./app-elements-wire.js";
3
3
  import "./app-elements.js";
4
4
  import { AppRscRenderMode } from "./app-rsc-render-mode.js";
5
5
  import { AppPageParams } from "./app-page-boundary.js";
6
- import { ApplyAppPageFileBasedMetadata } from "./app-page-head.js";
6
+ import { AppPagePreparedRouteHead, ApplyAppPageFileBasedMetadata } from "./app-page-head.js";
7
7
  import { AppLayoutParamAccessTracker } from "./app-layout-param-observation.js";
8
8
  import { AppPageSemanticSegment } from "./app-page-segment-state.js";
9
9
  import { AppPageErrorModule, AppPageModule, AppPageRouteWiringRoute } from "./app-page-route-wiring.js";
@@ -31,6 +31,14 @@ export type AppPageInterceptOptions<TModule extends AppPageModule = AppPageModul
31
31
  interceptNotFoundBranchSegments?: readonly string[] | null;
32
32
  interceptNotFound?: TModule | null;
33
33
  interceptNotFoundTreePosition?: number | null;
34
+ interceptForbiddens?: readonly (TModule | null | undefined)[] | null;
35
+ interceptForbiddenTreePositions?: readonly number[] | null;
36
+ interceptUnauthorizeds?: readonly (TModule | null | undefined)[] | null;
37
+ interceptUnauthorizedTreePositions?: readonly number[] | null;
38
+ interceptErrors?: readonly (AppPageErrorModule | null | undefined)[] | null;
39
+ interceptErrorTreePositions?: readonly number[] | null;
40
+ interceptNotFounds?: readonly (TModule | null | undefined)[] | null;
41
+ interceptNotFoundTreePositions?: readonly number[] | null;
34
42
  interceptPage?: TModule | null;
35
43
  interceptParams?: AppPageParams | null;
36
44
  interceptSlotId?: string | null;
@@ -57,6 +65,8 @@ export type AppPagePageRequest<TModule extends AppPageModule = AppPageModule> =
57
65
  observePageSearchParamsAccess?: boolean;
58
66
  /** The route is `dynamic = "force-static"`, so pages read an empty query. */
59
67
  isForceStatic?: boolean;
68
+ /** The render can never be stored (see buildAppPageElements). */
69
+ isUncacheableRender?: boolean;
60
70
  /** Observe page metadata `searchParams` access for cache-safety classification. */
61
71
  observeMetadataSearchParamsAccess?: boolean;
62
72
  /** Whether generated metadata may stream into the response body. */
@@ -70,6 +80,12 @@ export type AppPagePageRequest<TModule extends AppPageModule = AppPageModule> =
70
80
  placeStreamedMetadataInHead?: boolean;
71
81
  /** Whether streamed render errors must be sanitized for client transport. */
72
82
  isProduction?: boolean;
83
+ /**
84
+ * Receives the route's head once this render starts resolving it, so a
85
+ * special-error fallback after the render can reuse it rather than calling
86
+ * generateMetadata() again.
87
+ */
88
+ onHeadPrepared?: (head: AppPagePreparedRouteHead) => void;
73
89
  };
74
90
  export type BuildPageElementsOptions<TModule extends AppPageModule = AppPageModule, TErrorModule extends AppPageErrorModule = AppPageErrorModule> = {
75
91
  applyFileBasedMetadata?: ApplyAppPageFileBasedMetadata;