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
@@ -4,25 +4,72 @@ import { matchRoutePattern } from "../routing/route-pattern.js";
4
4
  import { createAppPageRenderDependency, invokeAppComponent, isAppClientReference, isAppRenderSuspension, isReactOwnedAppComponent, renderAfterAppDependencies } from "./app-render-dependency.js";
5
5
  import { AppElementsWire } from "./app-elements-wire.js";
6
6
  import "./app-elements.js";
7
+ import { ErrorBoundary, ForbiddenBoundary, NotFoundBoundary, UnauthorizedBoundary } from "../shims/error-boundary.js";
7
8
  import { withUseCacheLayoutMarker, withUseCachePageMarker } from "../shims/internal/app-page-props-cache-key.js";
8
9
  import { makeThenableParams } from "../shims/thenable-params.js";
9
- import { resolveAppPageBranchParams, resolveAppPageSegmentParams } from "./app-page-params.js";
10
- import { resolveAppPageSpecialError } from "./app-page-execution.js";
10
+ import { tagAppPagePageError, tagAppPageSlotError } from "./app-page-execution.js";
11
+ import { resolveAppPageBranchParams } from "./app-page-params.js";
11
12
  import { APP_PAGE_SEGMENT_KEY, isAppPageRouteGroupSegment, resolveAppPagePatternStateKey, resolveAppPageRouteStateKey } from "./app-page-segment-state.js";
12
13
  import { sanitizeErrorForClient } from "./app-rsc-errors.js";
13
14
  import { resolveAppPageModuleTraceSegment, traceCreateComponentTree, traceGetLayoutOrPageModule } from "./app-page-tracing.js";
14
15
  import { buildAppPageElements, createAppPageSourcePage, createAppPageTreePath, resolveAppPageLoadingModuleAtOrAbove } from "./app-page-route-wiring.js";
15
- import { collectAppPageSearchParams, hasAppPageDynamicMetadata, prepareAppPageHead, resolveActiveParallelRouteHeadInputs } from "./app-page-head.js";
16
- import { resolveHttpAccessFallbackMetadata, resolveHttpAccessFallbackViewport } from "./app-page-http-access-fallback-metadata.js";
16
+ import { createAppPageMetadataSearchParamsObserver, makeObservedAppPageSearchParamsThenable } from "./app-page-search-params-observation.js";
17
+ import { collectAppPageSearchParams, hasAppPageDynamicMetadata, prepareAppPageHead, resolveActiveParallelRouteHeadInputs, slotInterceptKeepsSourceHead } from "./app-page-head.js";
18
+ import { createRouteNotFoundHeadPlanOptions, recoverAppPageRouteHead } from "./app-page-http-access-fallback-metadata.js";
17
19
  import { ClientPageRoot } from "../shims/client-page-root.js";
18
20
  import "./app-rsc-route-matching.js";
19
- import { resolveAppPageParentHttpAccessBoundary } from "./app-page-boundary.js";
20
21
  import { DEFAULT_GLOBAL_ERROR_MODULE } from "./default-global-error-module.js";
21
22
  import { createAppPageRenderIdentity } from "./app-page-render-identity.js";
22
- import { createAppPageSearchParamsObserver, makeObservedAppPageSearchParamsThenable } from "./app-page-search-params-observation.js";
23
23
  import { shouldServeStreamingMetadata } from "./streaming-metadata.js";
24
- import { Suspense, cache, createElement } from "react";
24
+ import { Fragment, Suspense, cache, createElement } from "react";
25
25
  //#region src/server/app-page-element-builder.ts
26
+ /**
27
+ * A sibling intercepting page that renders beside its intercepting layouts,
28
+ * as Next.js renders each segment. The source route's layouts wait for the
29
+ * page, so `Starter` invokes it ahead of the layouts, even when one of them
30
+ * never renders its children, and `Outlet` renders its result where the
31
+ * innermost layout renders its children.
32
+ */
33
+ function createSiblingInterceptPageSlot(invokePage, releaseRenderDependency) {
34
+ let outcome = null;
35
+ function Starter() {
36
+ try {
37
+ const result = invokePage();
38
+ if (isPromiseLike(result)) Promise.resolve(result).catch(() => {});
39
+ outcome = { result };
40
+ } catch (error) {
41
+ if (!isAppRenderSuspension(error)) outcome = { error };
42
+ else {
43
+ Promise.resolve().then(releaseRenderDependency);
44
+ outcome = { suspended: true };
45
+ }
46
+ }
47
+ return null;
48
+ }
49
+ function readOutcome(current) {
50
+ if ("error" in current) throw current.error;
51
+ return "result" in current ? current.result : invokePage();
52
+ }
53
+ function Outlet() {
54
+ return outcome ? readOutcome(outcome) : invokePage();
55
+ }
56
+ return {
57
+ Outlet,
58
+ Starter
59
+ };
60
+ }
61
+ /** How many leading layouts two branches of one slot have in common. */
62
+ function countSharedLeadingLayouts(visibleLayouts, hiddenLayouts) {
63
+ const visible = visibleLayouts ?? [];
64
+ const hidden = hiddenLayouts ?? [];
65
+ let count = 0;
66
+ while (count < visible.length && count < hidden.length && visible[count] === hidden[count]) count++;
67
+ return count;
68
+ }
69
+ async function AppPageInterceptMetadataOutlet(props) {
70
+ return props.resolveHead().interceptOutlet;
71
+ }
72
+ AppPageInterceptMetadataOutlet.displayName = "Vinext.InterceptMetadataOutlet";
26
73
  function resolveInterceptLayoutParams(branchSegments, layoutSegments, params) {
27
74
  return resolveAppPageBranchParams(branchSegments, layoutSegments.length, params, layoutSegments);
28
75
  }
@@ -60,7 +107,7 @@ function traceAppPageInterceptLayoutModules(modules, branchSegments, layoutSegme
60
107
  async function buildPageElements(options) {
61
108
  const { route, params, routePath, displayPathname = routePath, pageRequest, globalErrorModule, rootNotFoundModule, rootForbiddenModule, rootUnauthorizedModule, metadataRoutes } = options;
62
109
  const slotParamOverrides = resolveSlotParamOverrides(route, routePath);
63
- const { opts, searchParams, isRscRequest, mountedSlotsHeader, renderMode = APP_RSC_RENDER_MODE_NAVIGATION, observeMetadataSearchParamsAccess = false, observePageSearchParamsAccess = false, isForceStatic = false, serveStreamingMetadata, placeStreamedMetadataInHead = false, isProduction = process.env.NODE_ENV === "production" } = pageRequest;
110
+ const { opts, searchParams, isRscRequest, mountedSlotsHeader, renderMode = APP_RSC_RENDER_MODE_NAVIGATION, observeMetadataSearchParamsAccess = false, observePageSearchParamsAccess = false, isForceStatic = false, isUncacheableRender = false, serveStreamingMetadata, placeStreamedMetadataInHead = false, isProduction = process.env.NODE_ENV === "production", onHeadPrepared } = pageRequest;
64
111
  const pageModule = route.page;
65
112
  const isSiblingIntercept = opts?.interceptSlotKey === "__vinext_page_intercept" && !!opts?.interceptPage;
66
113
  const effectivePageModule = isSiblingIntercept ? opts.interceptPage : pageModule;
@@ -138,14 +185,39 @@ async function buildPageElements(options) {
138
185
  } : {},
139
186
  ownerTreePosition: route.routeSegments?.length ?? 0
140
187
  } : null;
141
- const parallelRoutes = [...primaryParallelRouteHeadInput ? [primaryParallelRouteHeadInput.head] : [], ...activeParallelRouteHeadInputs.map((input) => input.head)];
142
- const metadataSearchParamsObserver = observeMetadataSearchParamsAccess ? createAppPageSearchParamsObserver() : void 0;
188
+ const interceptSlotKey = opts?.interceptPage != null && !isSiblingIntercept ? opts?.interceptSlotKey ?? null : null;
189
+ const sourceParallelRouteInputs = interceptSlotKey ? resolveActiveParallelRouteHeadInputs({
190
+ layoutTreePositions: route.layoutTreePositions,
191
+ params,
192
+ routeSegments: route.routeSegments ?? [],
193
+ slotParams: slotParamOverrides,
194
+ slots: route.slots ?? null
195
+ }) : null;
196
+ const keepsSourceHead = interceptSlotKey !== null && sourceParallelRouteInputs !== null && slotInterceptKeepsSourceHead({
197
+ interceptSlotKey,
198
+ route,
199
+ sourceParallelRoutes: sourceParallelRouteInputs
200
+ });
201
+ const headParallelRouteInputs = keepsSourceHead && sourceParallelRouteInputs ? sourceParallelRouteInputs : activeParallelRouteHeadInputs;
202
+ const parallelRoutes = [...primaryParallelRouteHeadInput ? [primaryParallelRouteHeadInput.head] : [], ...headParallelRouteInputs.map((input) => input.head)];
203
+ const interceptHeadInput = keepsSourceHead && interceptSlotKey ? activeParallelRouteHeadInputs.find((input) => input.slotKey === interceptSlotKey) : void 0;
204
+ const interceptSlotIndex = interceptHeadInput ? headParallelRouteInputs.findIndex((input) => input.slotKey === interceptSlotKey) : -1;
205
+ const hiddenParallelRoutes = interceptHeadInput ? [{
206
+ parallelRouteIndex: interceptSlotIndex === -1 ? -1 : interceptSlotIndex + (primaryParallelRouteHeadInput ? 1 : 0),
207
+ route: interceptHeadInput.head,
208
+ sharedLayoutCount: interceptSlotIndex === -1 ? 0 : countSharedLeadingLayouts(headParallelRouteInputs[interceptSlotIndex].head.layoutModules, interceptHeadInput.head.layoutModules)
209
+ }] : null;
210
+ const outletSlotIndex = interceptSlotKey !== null && !keepsSourceHead ? headParallelRouteInputs.findIndex((input) => input.slotKey === interceptSlotKey) : -1;
211
+ const outletParallelRouteIndex = outletSlotIndex === -1 ? null : outletSlotIndex + (primaryParallelRouteHeadInput ? 1 : 0);
212
+ const metadataSearchParamsObserver = createAppPageMetadataSearchParamsObserver(observeMetadataSearchParamsAccess);
143
213
  const headOptions = {
144
214
  applyFileBasedMetadata: options.applyFileBasedMetadata,
145
215
  basePath: options.basePath ?? "",
216
+ hiddenParallelRoutes,
146
217
  layoutModules: route.layouts,
147
218
  layoutTreePositions: route.layoutTreePositions,
148
219
  metadataRoutes,
220
+ outletParallelRouteIndex,
149
221
  pageModule: isSiblingIntercept ? null : effectivePageModule ?? null,
150
222
  parallelRoutes,
151
223
  params: effectiveParams,
@@ -158,54 +230,38 @@ async function buildPageElements(options) {
158
230
  const { pageSearchParams } = collectAppPageSearchParams(searchParams);
159
231
  const streamGeneratedHead = serveStreamingMetadata ?? shouldServeStreamingMetadata(pageRequest.request.headers.get("user-agent") ?? "", options.htmlLimitedBots);
160
232
  const metadataPlacement = hasDynamicMetadata && streamGeneratedHead && !placeStreamedMetadataInHead ? "body" : "head";
161
- const resolveNotFoundFallbackPlanOptions = () => {
162
- const routeBoundaryModule = route.notFound;
163
- const parentBoundary = resolveAppPageParentHttpAccessBoundary({
164
- layoutIndex: route.layouts.length,
165
- rootForbiddenModule,
166
- rootNotFoundModule,
167
- rootUnauthorizedModule,
168
- routeForbiddenModules: route.forbiddens,
169
- routeNotFoundModules: route.notFounds,
170
- routeUnauthorizedModules: route.unauthorizeds,
171
- statusCode: 404
172
- });
173
- const boundaryModule = routeBoundaryModule ?? parentBoundary.module;
174
- const boundaryTreePosition = routeBoundaryModule ? route.notFoundTreePosition : parentBoundary.layoutIndex === null ? null : route.layoutTreePositions?.[parentBoundary.layoutIndex];
175
- return {
176
- boundaryModule,
177
- boundaryParams: boundaryModule && boundaryTreePosition != null ? resolveAppPageSegmentParams(route.routeSegments ?? [], boundaryTreePosition, effectiveParams) : {},
178
- boundaryRouteSegments: (route.routeSegments ?? []).slice(0, boundaryTreePosition ?? 0),
179
- errorConvention: "not-found",
180
- layoutModules: route.layouts,
181
- layoutTreePositions: route.layoutTreePositions,
182
- parallelBranches: activeParallelRouteHeadInputs,
183
- params: effectiveParams,
184
- primaryParallelBranch: primaryParallelRouteHeadInput,
185
- routeSegments: route.routeSegments ?? null
186
- };
187
- };
188
- const resolveMetadataErrorTags = async (error) => {
189
- if (resolveAppPageSpecialError(error)?.kind !== "http-access-fallback") return null;
190
- return resolveHttpAccessFallbackMetadata({
233
+ const toClientError = (error) => isProduction ? sanitizeErrorForClient(error, "production") : error;
234
+ const resolveHead = cache(() => {
235
+ const preparedHead = prepareAppPageHead(headOptions);
236
+ const recoveredHead = recoverAppPageRouteHead(preparedHead, {
191
237
  applyFileBasedMetadata: options.applyFileBasedMetadata,
192
238
  basePath: options.basePath ?? "",
193
- ...resolveNotFoundFallbackPlanOptions(),
194
239
  metadataRoutes,
240
+ resolvePlanOptions: () => createRouteNotFoundHeadPlanOptions({
241
+ parallelBranches: headParallelRouteInputs,
242
+ params: effectiveParams,
243
+ primaryParallelBranch: primaryParallelRouteHeadInput,
244
+ rootNotFoundModule,
245
+ route
246
+ }),
195
247
  routePath: route.pattern
196
- }).catch(() => null);
197
- };
198
- const toClientError = (error) => isProduction ? sanitizeErrorForClient(error, "production") : error;
199
- const resolveHead = cache(() => {
200
- const preparedHead = prepareAppPageHead(headOptions);
201
- const outlet = Promise.all([preparedHead.metadata, preparedHead.viewport]).then(() => null, (error) => {
248
+ });
249
+ onHeadPrepared?.({
250
+ ...recoveredHead,
251
+ metadataPlacement
252
+ });
253
+ const outlet = preparedHead.routeErrors.then(null, (error) => {
202
254
  throw toClientError(error);
203
255
  });
204
256
  outlet.catch(() => null);
257
+ const interceptOutlet = preparedHead.hiddenErrors.then(null, (error) => {
258
+ throw toClientError(error);
259
+ });
260
+ interceptOutlet.catch(() => null);
205
261
  return {
206
- metadata: preparedHead.metadata.catch(resolveMetadataErrorTags),
207
- outlet,
208
- viewport: preparedHead.viewport.catch((error) => resolveAppPageSpecialError(error)?.kind === "http-access-fallback" ? resolveHttpAccessFallbackViewport(resolveNotFoundFallbackPlanOptions()).catch(() => ({})) : {})
262
+ ...recoveredHead,
263
+ interceptOutlet,
264
+ outlet
209
265
  };
210
266
  });
211
267
  const pageProps = { params: makeThenableParams(effectiveParams) };
@@ -217,7 +273,7 @@ async function buildPageElements(options) {
217
273
  }, pageTreePosition) !== null;
218
274
  const hasEmptyClientPageSearchParams = isForceStatic || isProduction && process.env.__NEXT_CONFIG_OUTPUT === "export";
219
275
  const pageRenderDependency = EffectivePageComponent && !isReactOwnedAppComponent(EffectivePageComponent) ? createAppPageRenderDependency() : null;
220
- const createPageElement = (PageComponent, props, renderDependency) => {
276
+ const createPageElement = (PageComponent, props, renderDependency, tagError) => {
221
277
  if (searchParams && isAppClientReference(PageComponent)) {
222
278
  const { searchParams: _slotSearchParams, ...pageProps } = props;
223
279
  return createElement(ClientPageRoot, {
@@ -231,14 +287,19 @@ async function buildPageElements(options) {
231
287
  if (searchParams) invocationProps.searchParams = observePageSearchParamsAccess ? makeObservedAppPageSearchParamsThenable(pageSearchParams) : makeThenableParams(pageSearchParams);
232
288
  return createElement(PageComponent, withUseCachePageMarker(PageComponent, invocationProps));
233
289
  }
290
+ return createElement(createPageInvoker(PageComponent, props, renderDependency, tagError));
291
+ };
292
+ const createPageInvoker = (PageComponent, props, renderDependency, tagError) => {
234
293
  const PageInvoker = () => {
235
294
  const invocationProps = { ...props };
236
295
  if (searchParams) invocationProps.searchParams = observePageSearchParamsAccess ? makeObservedAppPageSearchParamsThenable(pageSearchParams) : makeThenableParams(pageSearchParams);
237
296
  try {
238
- const result = invokeAppComponent(PageComponent, withUseCachePageMarker(PageComponent, invocationProps));
297
+ const result = invokeAppComponent(PageComponent, withUseCachePageMarker(PageComponent, invocationProps), tagError);
239
298
  if (isPromiseLike(result)) {
240
299
  if (renderDependency) Promise.resolve().then(() => renderDependency.release());
241
- return Promise.resolve(result).then((resolvedResult) => renderDependency ? renderAfterAppDependencies(resolvedResult, renderDependency.resultDependencies) : resolvedResult);
300
+ return Promise.resolve(result).then((resolvedResult) => renderDependency ? renderAfterAppDependencies(resolvedResult, renderDependency.resultDependencies) : resolvedResult, tagError === void 0 ? void 0 : (error) => {
301
+ throw tagError(error);
302
+ });
242
303
  }
243
304
  renderDependency?.release();
244
305
  return renderDependency ? renderAfterAppDependencies(result, renderDependency.resultDependencies) : result;
@@ -248,17 +309,21 @@ async function buildPageElements(options) {
248
309
  throw error;
249
310
  }
250
311
  renderDependency?.release();
251
- throw error;
312
+ throw tagError === void 0 ? error : tagError(error);
252
313
  }
253
314
  };
254
- return createElement(PageInvoker);
315
+ return PageInvoker;
255
316
  };
256
317
  const pageSearchParamsThenable = searchParams ? makeThenableParams(pageSearchParams) : void 0;
257
318
  const mountedSlotIds = mountedSlotsHeader ? new Set(mountedSlotsHeader.split(" ")) : null;
258
- const slotOverrides = buildSlotOverrides(route, params, routePath, opts);
259
- const createSiblingInterceptElement = () => {
260
- let element = isSiblingIntercept && EffectivePageComponent ? createPageElement(EffectivePageComponent, pageProps, pageRenderDependency) : null;
261
- if (!isSiblingIntercept || element === null) return element;
319
+ const slotOverrides = buildSlotOverrides(route, params, routePath, opts, hiddenParallelRoutes || outletParallelRouteIndex !== null ? (() => {
320
+ const outlet = createElement(AppPageInterceptMetadataOutlet, { resolveHead });
321
+ return streamGeneratedHead ? createElement(Suspense, { fallback: null }, outlet) : outlet;
322
+ })() : null);
323
+ const createSiblingInterceptElement = (metadataOutlet) => {
324
+ if (!isSiblingIntercept || !EffectivePageComponent) return null;
325
+ const pageSlot = pageRenderDependency && opts?.interceptLayouts?.some((layoutModule) => layoutModule?.default) ? createSiblingInterceptPageSlot(createPageInvoker(EffectivePageComponent, pageProps, pageRenderDependency), pageRenderDependency.release) : null;
326
+ let element = createElement(Fragment, null, pageSlot ? createElement(pageSlot.Outlet) : createPageElement(EffectivePageComponent, pageProps, pageRenderDependency), metadataOutlet);
262
327
  const layoutIndexesByTreePosition = /* @__PURE__ */ new Map();
263
328
  for (const [index, layoutModule] of (opts?.interceptLayouts ?? []).entries()) {
264
329
  if (!layoutModule) continue;
@@ -273,12 +338,56 @@ async function buildPageElements(options) {
273
338
  const treePosition = opts?.interceptLoadingTreePositions?.[index];
274
339
  if (treePosition !== void 0) loadingIndexesByTreePosition.set(treePosition, index);
275
340
  }
276
- const treePositions = Array.from(/* @__PURE__ */ new Set([...layoutIndexesByTreePosition.keys(), ...loadingIndexesByTreePosition.keys()])).sort((left, right) => left - right);
341
+ const notFoundsByTreePosition = /* @__PURE__ */ new Map();
342
+ for (const [index, notFoundModule] of (opts?.interceptNotFounds ?? []).entries()) {
343
+ const treePosition = opts?.interceptNotFoundTreePositions?.[index];
344
+ if (notFoundModule?.default && treePosition !== void 0) notFoundsByTreePosition.set(treePosition, notFoundModule.default);
345
+ }
346
+ const accessBoundaries = [...(opts?.interceptForbiddens ?? []).map((module, index) => [
347
+ module,
348
+ opts?.interceptForbiddenTreePositions?.[index],
349
+ ForbiddenBoundary
350
+ ]), ...(opts?.interceptUnauthorizeds ?? []).map((module, index) => [
351
+ module,
352
+ opts?.interceptUnauthorizedTreePositions?.[index],
353
+ UnauthorizedBoundary
354
+ ])];
355
+ const accessBoundaryTreePositions = accessBoundaries.flatMap(([module, treePosition]) => module?.default && treePosition != null ? [treePosition] : []);
356
+ const errorsByTreePosition = /* @__PURE__ */ new Map();
357
+ for (const [index, errorModule] of (opts?.interceptErrors ?? []).entries()) {
358
+ const treePosition = opts?.interceptErrorTreePositions?.[index];
359
+ if (errorModule?.default && treePosition !== void 0) errorsByTreePosition.set(treePosition, errorModule.default);
360
+ }
361
+ const treePositions = Array.from(/* @__PURE__ */ new Set([
362
+ ...layoutIndexesByTreePosition.keys(),
363
+ ...loadingIndexesByTreePosition.keys(),
364
+ ...accessBoundaryTreePositions,
365
+ ...notFoundsByTreePosition.keys(),
366
+ ...errorsByTreePosition.keys()
367
+ ])).sort((left, right) => left - right);
277
368
  for (let index = treePositions.length - 1; index >= 0; index--) {
278
369
  const treePosition = treePositions[index];
279
370
  const loadingIndex = loadingIndexesByTreePosition.get(treePosition);
280
371
  const LoadingComponent = loadingIndex === void 0 ? null : opts?.interceptLoadings?.[loadingIndex]?.default;
281
372
  if (LoadingComponent) element = createElement(Suspense, { fallback: createElement(LoadingComponent) }, element);
373
+ const NotFoundComponent = notFoundsByTreePosition.get(treePosition);
374
+ if (NotFoundComponent) element = createElement(NotFoundBoundary, {
375
+ fallback: createElement(NotFoundComponent),
376
+ children: element
377
+ });
378
+ for (const [module, boundaryTreePosition, AccessBoundary] of accessBoundaries) {
379
+ const FallbackComponent = module?.default;
380
+ if (!FallbackComponent || boundaryTreePosition !== treePosition) continue;
381
+ element = createElement(AccessBoundary, {
382
+ fallback: createElement(FallbackComponent),
383
+ children: element
384
+ });
385
+ }
386
+ const ErrorComponent = errorsByTreePosition.get(treePosition);
387
+ if (ErrorComponent) element = createElement(ErrorBoundary, {
388
+ fallback: ErrorComponent,
389
+ children: element
390
+ });
282
391
  const layoutIndexes = layoutIndexesByTreePosition.get(treePosition) ?? [];
283
392
  for (let layoutOffset = layoutIndexes.length - 1; layoutOffset >= 0; layoutOffset--) {
284
393
  const layoutIndex = layoutIndexes[layoutOffset];
@@ -291,16 +400,19 @@ async function buildPageElements(options) {
291
400
  element = createElement(LayoutComponent, withUseCacheLayoutMarker(LayoutComponent, { params: makeThenableParams(interceptLayoutParams) }), element);
292
401
  }
293
402
  }
294
- return element;
403
+ return pageSlot ? createElement(Fragment, null, createElement(pageSlot.Starter), element) : element;
295
404
  };
296
405
  return traceCreateComponentTree(() => {
297
406
  if (effectivePageModule) traceGetLayoutOrPageModule(APP_PAGE_SEGMENT_KEY, () => effectivePageModule);
298
- const siblingInterceptElement = createSiblingInterceptElement();
299
407
  return buildAppPageElements({
300
- element: isSiblingIntercept ? siblingInterceptElement : EffectivePageComponent ? createPageElement(EffectivePageComponent, pageProps, pageRenderDependency) : null,
301
- createPageElement,
408
+ element: !isSiblingIntercept && EffectivePageComponent ? createPageElement(EffectivePageComponent, pageProps, pageRenderDependency, tagAppPagePageError) : null,
409
+ renderElementWithMetadataOutlet: isSiblingIntercept && EffectivePageComponent ? createSiblingInterceptElement : null,
410
+ createPageElement(component, props, slotLayoutIndex, slotNotFoundBoundary) {
411
+ return createPageElement(component, props, null, slotLayoutIndex === void 0 ? void 0 : (error) => tagAppPageSlotError(error, slotLayoutIndex, slotNotFoundBoundary));
412
+ },
302
413
  globalErrorModule: globalErrorModule ?? DEFAULT_GLOBAL_ERROR_MODULE,
303
414
  isRscRequest,
415
+ isUncacheableRender,
304
416
  interceptionId: opts?.interceptionId ?? null,
305
417
  layoutParamAccess: options.layoutParamAccess,
306
418
  mountedSlotIds,
@@ -342,18 +454,27 @@ async function buildPageElements(options) {
342
454
  * RSC suffix removed). Re-parsing `request.url` here would re-introduce the
343
455
  * basePath and silently break the match for any app that configures one.
344
456
  */
345
- function buildSlotOverrides(route, routeParams, routePath, opts) {
457
+ function buildSlotOverrides(route, routeParams, routePath, opts, interceptMetadataOutlet) {
346
458
  const overrides = {};
347
459
  if (opts && opts.interceptSlotKey && opts.interceptPage && opts.interceptSlotKey !== "__vinext_page_intercept") overrides[opts.interceptSlotKey] = {
348
460
  branchSegments: opts.interceptBranchSegments ?? null,
349
461
  identitySegments: resolveInterceptedSlotIdentitySegments(opts.interceptSourcePageSegments, opts.interceptSlotKey),
462
+ forbiddenModules: opts.interceptForbiddens ?? null,
463
+ forbiddenTreePositions: opts.interceptForbiddenTreePositions ?? null,
350
464
  layoutModules: opts.interceptLayouts || null,
351
465
  layoutSegments: opts.interceptLayoutSegments ?? null,
352
466
  loadingModules: opts.interceptLoadings || null,
353
467
  loadingTreePositions: opts.interceptLoadingTreePositions ?? null,
468
+ metadataOutlet: interceptMetadataOutlet ?? null,
469
+ notFoundModules: opts.interceptNotFounds ?? null,
470
+ notFoundTreePositions: opts.interceptNotFoundTreePositions ?? null,
354
471
  pageModule: opts.interceptPage,
355
472
  params: opts.interceptParams || routeParams,
356
- routeSegments: resolveInterceptedSlotSegments(opts.interceptSourcePageSegments, opts.interceptSlotKey)
473
+ routeSegments: resolveInterceptedSlotSegments(opts.interceptSourcePageSegments, opts.interceptSlotKey),
474
+ unauthorizedModules: opts.interceptUnauthorizeds ?? null,
475
+ unauthorizedTreePositions: opts.interceptUnauthorizedTreePositions ?? null,
476
+ errorModules: opts.interceptErrors ?? null,
477
+ errorTreePositions: opts.interceptErrorTreePositions ?? null
357
478
  };
358
479
  const slotParamOverrides = resolveSlotParamOverrides(route, routePath);
359
480
  for (const [slotKey, params] of Object.entries(slotParamOverrides ?? {})) {
@@ -3,6 +3,13 @@ import { LayoutFlags } from "./app-elements-wire.js";
3
3
  import "./app-elements.js";
4
4
  //#region src/server/app-page-execution.d.ts
5
5
  export declare function tagAppPageMetadataError<T>(error: T): T;
6
+ export declare function tagAppPageSlotError<T>(error: T, layoutIndex: number, notFoundBoundary?: string): T;
7
+ export declare function tagAppPagePageError<T>(error: T): T;
8
+ /**
9
+ * The id of the not-found boundary that catches the route page's notFound():
10
+ * the page-level boundary, or the segment one it passes the signal up to.
11
+ */
12
+ export declare const APP_PAGE_NOT_FOUND_BOUNDARY_ID = "page";
6
13
  export type AppPageSpecialError = {
7
14
  kind: "redirect";
8
15
  location: string;
@@ -13,6 +20,8 @@ export type AppPageSpecialError = {
13
20
  kind: "http-access-fallback";
14
21
  statusCode: number;
15
22
  fromMetadata?: boolean;
23
+ /** Set when a parallel slot threw it: the layout rendering the outermost such slot. */
24
+ slotLayoutIndex?: number;
16
25
  };
17
26
  export type AppPageFontPreload = {
18
27
  href: string;
@@ -130,9 +139,27 @@ export declare function resolveAppPageSpecialError(error: unknown): AppPageSpeci
130
139
  * generateMetadata() threw it comes from the errors the RSC render threw with
131
140
  * that digest. When the page threw one too, the page's decides. An error a
132
141
  * client component threw during SSR is the page's, since generateMetadata()
133
- * runs only in the RSC render.
142
+ * runs only in the RSC render. A notFound() / forbidden() / unauthorized()
143
+ * a parallel slot's page threw is caught above the layout rendering it,
144
+ * unless the slot's own not-found catches its notFound() and every other copy
145
+ * is the page's or another slot's. A copy neither threw, such as a template's,
146
+ * keeps the fallback above that layout.
134
147
  */
135
148
  export declare function resolveAppPageShellSpecialError(error: unknown, renderedSpecialErrors: readonly unknown[]): AppPageSpecialError | null;
149
+ /**
150
+ * The parallel slot not-found boundaries that catch the `notFound()` that
151
+ * rejected an SSR shell, or null when any copy the RSC render threw isn't
152
+ * caught inside its slot. On the client, each slot's own not-found boundary
153
+ * catches its signal while the rest of the route renders, as in Next.js,
154
+ * which sends an empty error shell and renders them in the browser. A copy
155
+ * no slot threw is caught by the page's boundary beside them when the page
156
+ * threw it, including from a component the page renders, which nothing tags.
157
+ * One a layout or a template threw renders outside the caught boundaries, so
158
+ * the document's render from the same payload throws it again and takes the
159
+ * fallback, which keeps it above the slot's layout (see
160
+ * `resolveAppPageShellSpecialError`). Without a slot's, that fallback renders.
161
+ */
162
+ export declare function resolveAppPageCaughtNotFoundBoundaries(error: unknown, renderedSpecialErrors: readonly unknown[]): readonly string[] | null;
136
163
  /**
137
164
  * The response headers stored with a page's special-error entries: a
138
165
  * redirect's own `location`, not the response's, which middleware may have
@@ -1,7 +1,7 @@
1
1
  import { VINEXT_RSC_REDIRECT_HEADER, VINEXT_RSC_REDIRECT_TYPE_HEADER } from "./headers.js";
2
2
  import { isPromiseLike } from "../utils/promise.js";
3
3
  import { runWithConnectionProbe } from "../shims/headers.js";
4
- import { isThrownNavigationError } from "../shims/navigation-errors.js";
4
+ import { isHTTPAccessFallbackError, isThrownNavigationError } from "../shims/navigation-errors.js";
5
5
  import { VINEXT_RSC_CONTENT_TYPE, applyRscCompatibilityIdHeader, applyRscDeploymentIdHeader, createRscRedirectLocation } from "./app-rsc-cache-busting.js";
6
6
  import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
7
7
  import { copyLinkHeaderProvenance, getFrameworkLinkHeader, markFrameworkLinkHeaders } from "./app-response-header-provenance.js";
@@ -40,6 +40,69 @@ function tagAppPageMetadataError(error) {
40
40
  } catch {}
41
41
  return error;
42
42
  }
43
+ /**
44
+ * Marker we tag onto an error a parallel slot's page or default component
45
+ * threw, holding the index of the layout that renders the slot. Next.js
46
+ * attaches HTTP access fallback boundaries only to each segment's `children`,
47
+ * so a slot's `notFound()` is caught by the boundary above that layout, not
48
+ * by the route's deepest boundary as the page's is.
49
+ * https://github.com/vercel/next.js/blob/canary/packages/next/src/server/app-render/create-component-tree.tsx
50
+ */
51
+ const APP_PAGE_SLOT_ERROR_LAYOUT_INDEX = Symbol.for("vinext.appPage.slotErrorLayoutIndex");
52
+ /**
53
+ * Marker holding the id of the slot's own not-found boundary that catches the
54
+ * slot's `notFound()` on the client, when one does. The document then renders
55
+ * that boundary caught (see `resolveAppPageCaughtNotFoundBoundaries`).
56
+ */
57
+ const APP_PAGE_SLOT_ERROR_NOT_FOUND_BOUNDARY = Symbol.for("vinext.appPage.slotErrorNotFoundBoundary");
58
+ /**
59
+ * Marker we tag onto an error the route's page component threw, so that the
60
+ * document's fallback can tell it from one a layout or a template threw,
61
+ * which no slot tag marks either.
62
+ */
63
+ const APP_PAGE_PAGE_ERROR = Symbol.for("vinext.appPage.pageError");
64
+ function tagAppPageHttpAccessFallbackError(error, tags) {
65
+ if (!isHTTPAccessFallbackError(error)) return error;
66
+ const source = error;
67
+ const tagged = Object.setPrototypeOf(new Error(String(Reflect.get(source, "message"))), Object.getPrototypeOf(source));
68
+ Object.defineProperties(tagged, {
69
+ ...Object.getOwnPropertyDescriptors(source),
70
+ stack: {
71
+ value: Reflect.get(source, "stack"),
72
+ configurable: true,
73
+ writable: true
74
+ },
75
+ ...tags
76
+ });
77
+ return tagged;
78
+ }
79
+ function tagAppPageSlotError(error, layoutIndex, notFoundBoundary) {
80
+ return tagAppPageHttpAccessFallbackError(error, {
81
+ [APP_PAGE_SLOT_ERROR_LAYOUT_INDEX]: { value: layoutIndex },
82
+ [APP_PAGE_SLOT_ERROR_NOT_FOUND_BOUNDARY]: { value: notFoundBoundary }
83
+ });
84
+ }
85
+ function tagAppPagePageError(error) {
86
+ return tagAppPageHttpAccessFallbackError(error, { [APP_PAGE_PAGE_ERROR]: { value: true } });
87
+ }
88
+ function isAppPagePageError(error) {
89
+ return !!error && typeof error === "object" && Reflect.get(error, APP_PAGE_PAGE_ERROR) === true;
90
+ }
91
+ function getAppPageSlotErrorLayoutIndex(error) {
92
+ if (!error || typeof error !== "object") return null;
93
+ const layoutIndex = Reflect.get(error, APP_PAGE_SLOT_ERROR_LAYOUT_INDEX);
94
+ return typeof layoutIndex === "number" ? layoutIndex : null;
95
+ }
96
+ /**
97
+ * The id of the not-found boundary that catches the route page's notFound():
98
+ * the page-level boundary, or the segment one it passes the signal up to.
99
+ */
100
+ const APP_PAGE_NOT_FOUND_BOUNDARY_ID = "page";
101
+ function getAppPageSlotErrorNotFoundBoundary(error) {
102
+ if (!error || typeof error !== "object") return null;
103
+ const boundary = Reflect.get(error, APP_PAGE_SLOT_ERROR_NOT_FOUND_BOUNDARY);
104
+ return typeof boundary === "string" ? boundary : null;
105
+ }
43
106
  function getAppPageStatusText(statusCode) {
44
107
  return statusCode === 403 ? "Forbidden" : statusCode === 401 ? "Unauthorized" : "Not Found";
45
108
  }
@@ -83,16 +146,62 @@ function resolveAppPageSpecialError(error) {
83
146
  * generateMetadata() threw it comes from the errors the RSC render threw with
84
147
  * that digest. When the page threw one too, the page's decides. An error a
85
148
  * client component threw during SSR is the page's, since generateMetadata()
86
- * runs only in the RSC render.
149
+ * runs only in the RSC render. A notFound() / forbidden() / unauthorized()
150
+ * a parallel slot's page threw is caught above the layout rendering it,
151
+ * unless the slot's own not-found catches its notFound() and every other copy
152
+ * is the page's or another slot's. A copy neither threw, such as a template's,
153
+ * keeps the fallback above that layout.
87
154
  */
88
155
  function resolveAppPageShellSpecialError(error, renderedSpecialErrors) {
89
156
  const specialError = resolveAppPageSpecialError(error);
90
157
  if (!specialError || specialError.fromMetadata === true) return specialError;
91
158
  if (isThrownNavigationError(error)) return specialError;
92
- return renderedSpecialErrors.length > 0 && renderedSpecialErrors.every((rendered) => resolveAppPageSpecialError(rendered)?.fromMetadata === true) ? {
159
+ if (renderedSpecialErrors.length > 0 && renderedSpecialErrors.every((rendered) => resolveAppPageSpecialError(rendered)?.fromMetadata === true)) return {
93
160
  ...specialError,
94
161
  fromMetadata: true
95
- } : specialError;
162
+ };
163
+ if (specialError.kind !== "http-access-fallback") return specialError;
164
+ const skipsSlotCaughtNotFound = specialError.statusCode === 404 && renderedSpecialErrors.every((rendered) => isAppPagePageError(rendered) || getAppPageSlotErrorLayoutIndex(rendered) !== null);
165
+ let slotLayoutIndex = null;
166
+ for (const rendered of renderedSpecialErrors) {
167
+ if (skipsSlotCaughtNotFound && getAppPageSlotErrorNotFoundBoundary(rendered) !== null) continue;
168
+ const layoutIndex = getAppPageSlotErrorLayoutIndex(rendered);
169
+ if (layoutIndex !== null && (slotLayoutIndex === null || layoutIndex < slotLayoutIndex)) slotLayoutIndex = layoutIndex;
170
+ }
171
+ return slotLayoutIndex === null ? specialError : {
172
+ ...specialError,
173
+ slotLayoutIndex
174
+ };
175
+ }
176
+ /**
177
+ * The parallel slot not-found boundaries that catch the `notFound()` that
178
+ * rejected an SSR shell, or null when any copy the RSC render threw isn't
179
+ * caught inside its slot. On the client, each slot's own not-found boundary
180
+ * catches its signal while the rest of the route renders, as in Next.js,
181
+ * which sends an empty error shell and renders them in the browser. A copy
182
+ * no slot threw is caught by the page's boundary beside them when the page
183
+ * threw it, including from a component the page renders, which nothing tags.
184
+ * One a layout or a template threw renders outside the caught boundaries, so
185
+ * the document's render from the same payload throws it again and takes the
186
+ * fallback, which keeps it above the slot's layout (see
187
+ * `resolveAppPageShellSpecialError`). Without a slot's, that fallback renders.
188
+ */
189
+ function resolveAppPageCaughtNotFoundBoundaries(error, renderedSpecialErrors) {
190
+ const specialError = resolveAppPageSpecialError(error);
191
+ if (specialError?.kind !== "http-access-fallback" || specialError.statusCode !== 404) return null;
192
+ if (isThrownNavigationError(error) || renderedSpecialErrors.length === 0) return null;
193
+ const boundaries = /* @__PURE__ */ new Set();
194
+ let caughtInSlot = false;
195
+ for (const rendered of renderedSpecialErrors) {
196
+ if (resolveAppPageSpecialError(rendered)?.fromMetadata === true) return null;
197
+ const boundary = getAppPageSlotErrorNotFoundBoundary(rendered);
198
+ if (boundary !== null) {
199
+ caughtInSlot = true;
200
+ boundaries.add(boundary);
201
+ } else if (getAppPageSlotErrorLayoutIndex(rendered) === null) boundaries.add(APP_PAGE_NOT_FOUND_BOUNDARY_ID);
202
+ else return null;
203
+ }
204
+ return caughtInSlot ? Array.from(boundaries) : null;
96
205
  }
97
206
  /**
98
207
  * Resolves a redirect() target against the request URL and prepends the
@@ -325,4 +434,4 @@ function buildAppPageFontLinkHeader(preloads) {
325
434
  return preloads.map((preload) => `<${preload.href}>; rel=preload; as=font; type=${preload.type}; crossorigin`).join(", ");
326
435
  }
327
436
  //#endregion
328
- export { bufferAppPageBinaryStream, buildAppPageFontLinkHeader, buildAppPageSpecialErrorResponse, probeAppPageLayouts, readAppPageBinaryStream, resolveAppPageShellSpecialError, resolveAppPageSpecialError, resolveAppPageSpecialErrorStoredHeaders, tagAppPageMetadataError, teeAppPageRscStreamForCapture };
437
+ export { APP_PAGE_NOT_FOUND_BOUNDARY_ID, bufferAppPageBinaryStream, buildAppPageFontLinkHeader, buildAppPageSpecialErrorResponse, probeAppPageLayouts, readAppPageBinaryStream, resolveAppPageCaughtNotFoundBoundaries, resolveAppPageShellSpecialError, resolveAppPageSpecialError, resolveAppPageSpecialErrorStoredHeaders, tagAppPageMetadataError, tagAppPagePageError, tagAppPageSlotError, teeAppPageRscStreamForCapture };