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
@@ -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";
@@ -149,6 +151,7 @@ async function runAppPageRevalidationContext(options, renderFn) {
149
151
  currentFetchRevalidate: options.currentFetchRevalidate ?? null,
150
152
  currentForceDynamicFetchDefault: options.dynamicConfig === "force-dynamic",
151
153
  executionContext: getRequestExecutionContext(),
154
+ rootParams: options.rootParams ?? null,
152
155
  unstableCacheRevalidation: "foreground"
153
156
  });
154
157
  const revalidation = runWithRequestContext(requestContext, () => runInWorkStoreScope(async () => {
@@ -181,6 +184,14 @@ function toInterceptOptions(interceptionContext, intercept) {
181
184
  interceptNotFoundBranchSegments: intercept.interceptNotFoundBranchSegments,
182
185
  interceptNotFound: intercept.notFound,
183
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,
184
195
  interceptPage: intercept.page,
185
196
  interceptParams: intercept.matchedParams,
186
197
  interceptSlotId: intercept.slotId ?? null,
@@ -315,6 +326,7 @@ async function dispatchAppPageInner(options) {
315
326
  const isNeverStoredPath = options.pprRuntime === void 0 && hasNoManifestAdmissionState(route.pattern);
316
327
  const shouldReadCache = !isRouteCacheabilityProbe() && isCacheEligibleRender && !isNeverStoredPath;
317
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);
318
330
  if (shouldReadCache && isStaticEligible) {
319
331
  traceOperation = resolveAppPageTraceOperation({
320
332
  hasRequestSearchParams,
@@ -380,6 +392,12 @@ async function dispatchAppPageInner(options) {
380
392
  const revalidationDynamicConfig = options.resolveRouteDynamicConfig?.(revalidationTarget.route) ?? (revalidationTarget.route === route ? dynamicConfig : void 0);
381
393
  const revalidationConfigRevalidateSeconds = options.resolveRouteRevalidateSeconds?.(revalidationTarget.route) ?? (revalidationTarget.route === route ? currentRevalidateSeconds : null);
382
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
+ };
383
401
  return runAppPageRevalidationContext({
384
402
  cleanPathname: options.cleanPathname,
385
403
  displayPathname: options.displayPathname,
@@ -388,6 +406,7 @@ async function dispatchAppPageInner(options) {
388
406
  draftModeSecret: options.draftModeSecret,
389
407
  dynamicConfig: revalidationDynamicConfig,
390
408
  params: revalidationTarget.navigationParams,
409
+ rootParams: options.rootParams,
391
410
  routePattern: revalidationTarget.route.pattern,
392
411
  routeSegments: revalidationTarget.route.routeSegments,
393
412
  setNavigationContext: options.setNavigationContext
@@ -398,7 +417,10 @@ async function dispatchAppPageInner(options) {
398
417
  observeMetadataSearchParamsAccess: revalidationDynamicConfig !== "force-static",
399
418
  observePageSearchParamsAccess: revalidationDynamicConfig !== "force-static",
400
419
  serveStreamingMetadata: placeGeneratedMetadataInBody,
401
- placeStreamedMetadataInHead: true
420
+ placeStreamedMetadataInHead: true,
421
+ onHeadPrepared(head) {
422
+ revalidationRouteHead.value = head;
423
+ }
402
424
  });
403
425
  const baseRevalidatedOnError = options.createRscOnErrorHandler(options.cleanPathname, revalidationTarget.route.pattern, { revalidateReason: "stale" });
404
426
  const baseRevalidatedOnSsrError = options.createRscOnErrorHandler(options.cleanPathname, revalidationTarget.route.pattern, {
@@ -428,7 +450,8 @@ async function dispatchAppPageInner(options) {
428
450
  return baseRevalidatedOnSsrError(error, void 0, void 0);
429
451
  },
430
452
  reactMaxHeadersLength: options.reactMaxHeadersLength,
431
- async renderShellSpecialError(error) {
453
+ resolveCaughtNotFoundBoundaries: options.isRscRequest ? void 0 : (error) => resolveAppPageCaughtNotFoundBoundaries(error, rscErrorTracker.getCapturedSpecialErrors(error)),
454
+ async renderShellSpecialError(error, caughtDocument) {
432
455
  const specialError = resolveAppPageShellSpecialError(error, rscErrorTracker.getCapturedSpecialErrors(error));
433
456
  if (!specialError) return null;
434
457
  if (options.isRscRequest) {
@@ -439,8 +462,14 @@ async function dispatchAppPageInner(options) {
439
462
  status: specialError.statusCode
440
463
  };
441
464
  }
465
+ if (caughtDocument) return {
466
+ headers: resolveAppPageSpecialErrorStoredHeaders(specialError, options.basePath),
467
+ html: caughtDocument.html,
468
+ linkHeader: caughtDocument.linkHeader,
469
+ status: specialError.statusCode
470
+ };
442
471
  if (revalidationTarget.route !== route) return null;
443
- const document = await renderPageSpecialError(options, specialError, false, revalidationTarget.interceptOpts, true);
472
+ const document = await renderPageSpecialError(options, specialError, false, revalidationTarget.interceptOpts, true, void 0, revalidationRouteHead);
444
473
  if (document.status !== specialError.statusCode) return null;
445
474
  return {
446
475
  headers: resolveAppPageSpecialErrorStoredHeaders(specialError, options.basePath),
@@ -516,6 +545,15 @@ async function dispatchAppPageInner(options) {
516
545
  let interceptDynamicConfig;
517
546
  let interceptDynamicConfigResolved = false;
518
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
+ };
519
557
  const interceptResult = await resolveAppPageIntercept({
520
558
  async buildPageElement(interceptRoute, interceptParams, interceptOpts, interceptSearchParams, interceptLayoutParamAccess) {
521
559
  const sourceDynamicConfig = interceptDynamicConfigResolved ? interceptDynamicConfig : options.resolveRouteDynamicConfig?.(interceptRoute);
@@ -538,8 +576,10 @@ async function dispatchAppPageInner(options) {
538
576
  isForceStatic: sourceDynamicConfig === "force-static",
539
577
  observeMetadataSearchParamsAccess: sourceDynamicConfig !== "force-static",
540
578
  observePageSearchParamsAccess: sourceDynamicConfig !== "force-static",
579
+ isUncacheableRender,
541
580
  serveStreamingMetadata: placeGeneratedMetadataInBody,
542
- placeStreamedMetadataInHead: options.renderWholeDocument === true
581
+ placeStreamedMetadataInHead: options.renderWholeDocument === true,
582
+ onHeadPrepared
543
583
  });
544
584
  },
545
585
  cleanPathname: options.cleanPathname,
@@ -589,20 +629,23 @@ async function dispatchAppPageInner(options) {
589
629
  if (interceptResult.response) return interceptResult.response;
590
630
  const buildCurrentPageElement = () => buildAppPageElement({
591
631
  buildPageElement() {
632
+ renderedRouteHead.value = null;
592
633
  if (options.actionFailed) throw options.actionError;
593
634
  return options.buildPageElement(route, options.params, interceptResult.interceptOpts, pageSearchParams, layoutParamAccess, {
594
635
  isForceStatic,
595
636
  observeMetadataSearchParamsAccess: !isForceStatic,
596
637
  observePageSearchParamsAccess: !isForceStatic,
638
+ isUncacheableRender,
597
639
  serveStreamingMetadata: placeGeneratedMetadataInBody,
598
- placeStreamedMetadataInHead: options.renderWholeDocument === true
640
+ placeStreamedMetadataInHead: options.renderWholeDocument === true,
641
+ onHeadPrepared
599
642
  });
600
643
  },
601
644
  renderErrorBoundaryPage(buildError) {
602
645
  return options.renderErrorBoundaryPage(buildError);
603
646
  },
604
647
  renderSpecialError(specialError) {
605
- return renderPageSpecialError(options, specialError, serveStreamingMetadata, interceptResult.interceptOpts);
648
+ return renderPageSpecialError(options, specialError, serveStreamingMetadata, interceptResult.interceptOpts, false, void 0, renderedRouteHead);
606
649
  },
607
650
  resolveSpecialError: resolveAppPageSpecialError
608
651
  });
@@ -734,10 +777,10 @@ async function dispatchAppPageInner(options) {
734
777
  return options.renderErrorBoundaryPage(renderError, errorOrigin);
735
778
  },
736
779
  renderLayoutSpecialError(specialError, layoutIndex) {
737
- return renderLayoutSpecialError(options, specialError, layoutIndex, serveStreamingMetadata);
780
+ return renderLayoutSpecialError(options, specialError, layoutIndex, serveStreamingMetadata, renderedRouteHead);
738
781
  },
739
782
  renderPageSpecialError(specialError, renderOptions) {
740
- return renderPageSpecialError(options, specialError, serveStreamingMetadata, interceptResult.interceptOpts, renderOptions?.isCacheCandidate === true);
783
+ return renderPageSpecialError(options, specialError, serveStreamingMetadata, interceptResult.interceptOpts, renderOptions?.isCacheCandidate === true, renderOptions?.caughtDocument, renderedRouteHead);
741
784
  },
742
785
  renderToReadableStream: options.renderToReadableStream,
743
786
  hasCustomGlobalError: options.hasCustomGlobalError,
@@ -752,7 +795,22 @@ async function dispatchAppPageInner(options) {
752
795
  }
753
796
  });
754
797
  }
755
- 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) {
756
814
  return buildAppPageSpecialErrorResponse({
757
815
  basePath: options.basePath,
758
816
  buildRscRedirectFlightStream: (rscOptions) => buildRscRedirectFlightStream({
@@ -766,31 +824,93 @@ async function renderLayoutSpecialError(options, specialError, layoutIndex, serv
766
824
  isRscRequest: options.isRscRequest,
767
825
  middlewareContext: options.middlewareContext,
768
826
  renderFallbackPage(statusCode) {
769
- const parentBoundaryModule = resolveAppPageParentHttpAccessBoundaryModule({
770
- layoutIndex,
771
- rootForbiddenModule: options.rootForbiddenModule,
772
- rootNotFoundModule: options.rootNotFoundModule,
773
- rootUnauthorizedModule: options.rootUnauthorizedModule,
774
- routeForbiddenModules: options.route.forbiddens,
775
- routeNotFoundModules: options.route.notFounds,
776
- routeUnauthorizedModules: options.route.unauthorizeds,
777
- statusCode
827
+ return renderLayoutBoundaryFallback(options, statusCode, layoutIndex, {
828
+ headLayouts: options.route.layouts.slice(0, layoutIndex),
829
+ routeHead: resolveFallbackRouteHead(options, renderedRouteHead)
778
830
  });
779
- const fallbackOptions = {
780
- layouts: options.route.layouts.slice(0, layoutIndex),
781
- matchedParams: options.params
782
- };
783
- if (parentBoundaryModule) {
784
- fallbackOptions.boundaryComponent = parentBoundaryModule.default;
785
- fallbackOptions.boundaryModule = parentBoundaryModule;
786
- }
787
- return options.renderHttpAccessFallbackPage(statusCode, fallbackOptions, null);
788
831
  },
789
832
  request: options.request,
790
833
  specialError
791
834
  });
792
835
  }
793
- 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);
794
914
  return buildAppPageSpecialErrorResponse({
795
915
  basePath: options.basePath,
796
916
  buildRscRedirectFlightStream: (rscOptions) => buildRscRedirectFlightStream({
@@ -804,6 +924,16 @@ async function renderPageSpecialError(options, specialError, serveStreamingMetad
804
924
  isRscRequest: options.isRscRequest,
805
925
  middlewareContext: options.middlewareContext,
806
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;
807
937
  const routeBoundaryModule = resolveAppPageRouteBoundaryModule(options.route, statusCode);
808
938
  const layoutCount = options.route.layouts.length;
809
939
  const { module: parentBoundaryModule, layoutIndex: boundaryLayoutIndex } = resolveAppPageParentHttpAccessBoundary({
@@ -820,7 +950,8 @@ async function renderPageSpecialError(options, specialError, serveStreamingMetad
820
950
  const fallbackOptions = {
821
951
  intercept,
822
952
  ...isCacheCandidate ? { isCacheCandidate } : {},
823
- matchedParams: options.params
953
+ matchedParams: options.params,
954
+ ...routeHead ? { routeHead } : {}
824
955
  };
825
956
  if (useLayoutAlignedBoundary && boundaryLayoutIndex !== null) {
826
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;