vinext 1.0.0-beta.0 → 1.0.0-beta.2

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 (305) hide show
  1. package/README.md +21 -2
  2. package/dist/build/assets-ignore.js +1 -1
  3. package/dist/build/clean-output.js +1 -1
  4. package/dist/build/client-build-config.js +7 -4
  5. package/dist/build/css-url-assets.js +3 -3
  6. package/dist/build/google-fonts/fallback-metrics.js +1 -1
  7. package/dist/build/google-fonts/font-metadata.js +1 -1
  8. package/dist/build/inject-pregenerated-paths.js +1 -1
  9. package/dist/build/inline-css.js +2 -5
  10. package/dist/build/module-dependency-cache.d.ts +4 -0
  11. package/dist/build/module-dependency-cache.js +13 -0
  12. package/dist/build/next-client-runtime-manifests.js +1 -1
  13. package/dist/build/pages-client-assets-module.js +1 -1
  14. package/dist/build/precompress.js +7 -7
  15. package/dist/build/prerender-paths.d.ts +2 -2
  16. package/dist/build/prerender-paths.js +10 -15
  17. package/dist/build/prerender-server-pool.js +2 -2
  18. package/dist/build/prerender.js +1 -1
  19. package/dist/build/preview-credentials.d.ts +11 -0
  20. package/dist/build/preview-credentials.js +19 -0
  21. package/dist/build/report.d.ts +8 -4
  22. package/dist/build/report.js +14 -6
  23. package/dist/build/run-prerender.d.ts +2 -11
  24. package/dist/build/run-prerender.js +2 -10
  25. package/dist/build/server-manifest.js +1 -1
  26. package/dist/build/ssr-manifest.d.ts +4 -0
  27. package/dist/build/ssr-manifest.js +10 -6
  28. package/dist/build/standalone.js +37 -37
  29. package/dist/cache/cache-adapters-virtual.d.ts +1 -17
  30. package/dist/cache/cache-adapters-virtual.js +20 -11
  31. package/dist/check.d.ts +0 -16
  32. package/dist/check.js +27 -36
  33. package/dist/cli.js +61 -55
  34. package/dist/client/instrumentation-client-inject.js +1 -1
  35. package/dist/client/pages-router-link-navigation.js +1 -1
  36. package/dist/config/config-matchers.d.ts +13 -37
  37. package/dist/config/config-matchers.js +33 -123
  38. package/dist/config/dotenv.js +1 -1
  39. package/dist/config/next-config.d.ts +7 -3
  40. package/dist/config/next-config.js +84 -15
  41. package/dist/config/prerender.d.ts +2 -2
  42. package/dist/config/prerender.js +7 -15
  43. package/dist/config/request-context.d.ts +14 -0
  44. package/dist/config/request-context.js +26 -0
  45. package/dist/config/server-external-packages.js +1 -1
  46. package/dist/config/tsconfig-paths.js +2 -2
  47. package/dist/{node_modules/.pnpm/am-i-vibing@0.5.0/node_modules → deps/.pnpm/am-i-vibing@0.5.0/deps}/am-i-vibing/dist/detector-1yx2Hoe0.js +2 -2
  48. package/dist/deps/.pnpm/pathslash@0.1.0/deps/pathslash/dist/index.js +50 -0
  49. package/dist/entries/app-rsc-entry.js +39 -14
  50. package/dist/entries/app-rsc-manifest.js +21 -4
  51. package/dist/entries/pages-client-entry.js +6 -5
  52. package/dist/entries/pages-server-entry.js +18 -28
  53. package/dist/entries/runtime-entry-module.js +2 -2
  54. package/dist/index.js +314 -230
  55. package/dist/init-cloudflare.js +1 -1
  56. package/dist/init-platform.js +1 -1
  57. package/dist/init.d.ts +6 -4
  58. package/dist/init.js +25 -27
  59. package/dist/plugins/ast-utils.js +1 -1
  60. package/dist/plugins/dynamic-preload-metadata.js +7 -7
  61. package/dist/plugins/extensionless-dynamic-import.js +1 -1
  62. package/dist/plugins/fonts.js +3 -3
  63. package/dist/plugins/ignore-dynamic-requests.js +13 -8
  64. package/dist/plugins/import-meta-url.js +16 -17
  65. package/dist/plugins/middleware-export-validation.js +1 -1
  66. package/dist/plugins/middleware-server-only.js +2 -2
  67. package/dist/plugins/og-asset-ownership.js +7 -6
  68. package/dist/plugins/og-assets.js +5 -6
  69. package/dist/plugins/optimize-imports.js +12 -13
  70. package/dist/plugins/postcss.js +1 -1
  71. package/dist/plugins/remove-console.js +1 -1
  72. package/dist/plugins/require-context.js +1 -1
  73. package/dist/plugins/sass.js +2 -2
  74. package/dist/plugins/server-externals-manifest.js +1 -1
  75. package/dist/plugins/strip-server-exports.js +1 -1
  76. package/dist/plugins/styled-jsx.js +3 -2
  77. package/dist/plugins/typeof-window.js +1 -1
  78. package/dist/routing/app-route-graph.d.ts +16 -15
  79. package/dist/routing/app-route-graph.js +86 -88
  80. package/dist/routing/app-router.d.ts +0 -5
  81. package/dist/routing/app-router.js +12 -11
  82. package/dist/routing/file-matcher.d.ts +13 -28
  83. package/dist/routing/file-matcher.js +31 -44
  84. package/dist/routing/pages-router.js +26 -32
  85. package/dist/routing/route-matching.d.ts +14 -1
  86. package/dist/routing/route-matching.js +13 -1
  87. package/dist/routing/route-pattern.d.ts +2 -1
  88. package/dist/routing/route-pattern.js +7 -4
  89. package/dist/routing/route-trie.d.ts +5 -1
  90. package/dist/routing/route-trie.js +5 -2
  91. package/dist/server/api-handler.js +41 -33
  92. package/dist/server/app-browser-entry.js +18 -11
  93. package/dist/server/app-browser-history-controller.d.ts +1 -1
  94. package/dist/server/app-browser-history-controller.js +3 -3
  95. package/dist/server/app-browser-navigation-controller.js +4 -2
  96. package/dist/server/app-browser-server-action-client.js +1 -1
  97. package/dist/server/app-elements-wire.d.ts +2 -1
  98. package/dist/server/app-fallback-renderer.d.ts +11 -0
  99. package/dist/server/app-fallback-renderer.js +16 -2
  100. package/dist/server/app-middleware.js +2 -1
  101. package/dist/server/app-page-boundary-render.d.ts +26 -2
  102. package/dist/server/app-page-boundary-render.js +190 -55
  103. package/dist/server/app-page-cache-finalizer.d.ts +1 -1
  104. package/dist/server/app-page-cache.d.ts +1 -1
  105. package/dist/server/app-page-dispatch.d.ts +12 -2
  106. package/dist/server/app-page-dispatch.js +37 -51
  107. package/dist/server/app-page-element-builder.d.ts +8 -2
  108. package/dist/server/app-page-element-builder.js +112 -27
  109. package/dist/server/app-page-execution.d.ts +3 -1
  110. package/dist/server/app-page-execution.js +31 -39
  111. package/dist/server/app-page-head.d.ts +54 -2
  112. package/dist/server/app-page-head.js +164 -78
  113. package/dist/server/app-page-http-access-fallback-metadata.d.ts +29 -0
  114. package/dist/server/app-page-http-access-fallback-metadata.js +106 -0
  115. package/dist/server/app-page-render.d.ts +2 -2
  116. package/dist/server/app-page-render.js +1 -1
  117. package/dist/server/app-page-request.d.ts +12 -0
  118. package/dist/server/app-page-request.js +134 -14
  119. package/dist/server/app-page-route-wiring.d.ts +9 -0
  120. package/dist/server/app-page-route-wiring.js +44 -4
  121. package/dist/server/app-post-middleware-context.d.ts +1 -1
  122. package/dist/server/app-post-middleware-context.js +1 -1
  123. package/dist/server/app-route-handler-dispatch.js +31 -17
  124. package/dist/server/app-route-handler-execution.d.ts +6 -1
  125. package/dist/server/app-route-handler-execution.js +41 -15
  126. package/dist/server/app-route-handler-policy.d.ts +2 -0
  127. package/dist/server/app-route-handler-policy.js +3 -3
  128. package/dist/server/app-route-module-loader.d.ts +3 -1
  129. package/dist/server/app-route-module-loader.js +1 -0
  130. package/dist/server/app-route-tree-prefetch.js +1 -1
  131. package/dist/server/app-rsc-cache-busting.d.ts +1 -1
  132. package/dist/server/app-rsc-cache-busting.js +1 -1
  133. package/dist/server/app-rsc-errors.d.ts +1 -1
  134. package/dist/server/app-rsc-errors.js +12 -2
  135. package/dist/server/app-rsc-handler.d.ts +10 -5
  136. package/dist/server/app-rsc-handler.js +51 -23
  137. package/dist/server/app-rsc-redirect-flight.d.ts +66 -0
  138. package/dist/server/app-rsc-redirect-flight.js +71 -0
  139. package/dist/server/app-rsc-request-normalization.d.ts +3 -2
  140. package/dist/server/app-rsc-request-normalization.js +8 -2
  141. package/dist/server/app-rsc-response-finalizer.d.ts +2 -2
  142. package/dist/server/app-rsc-response-finalizer.js +5 -11
  143. package/dist/server/app-rsc-route-matching.d.ts +20 -0
  144. package/dist/server/app-rsc-route-matching.js +87 -11
  145. package/dist/server/app-segment-config.js +15 -5
  146. package/dist/server/app-server-action-execution.d.ts +3 -1
  147. package/dist/server/app-server-action-execution.js +8 -6
  148. package/dist/server/app-ssr-entry.js +4 -1
  149. package/dist/server/app-ssr-stream.d.ts +2 -7
  150. package/dist/server/app-ssr-stream.js +5 -10
  151. package/dist/server/cache-proof.js +1 -1
  152. package/dist/server/config-headers.d.ts +24 -0
  153. package/dist/server/config-headers.js +52 -0
  154. package/dist/server/default-global-error-module.d.ts +3 -1
  155. package/dist/server/default-not-found-module.d.ts +3 -1
  156. package/dist/server/dev-initial-server-error.d.ts +1 -1
  157. package/dist/server/dev-lockfile.js +2 -3
  158. package/dist/server/dev-route-files.js +1 -1
  159. package/dist/server/dev-server.js +281 -173
  160. package/dist/server/dev-stack-sourcemap.js +4 -3
  161. package/dist/server/headers.d.ts +3 -1
  162. package/dist/server/headers.js +3 -1
  163. package/dist/server/image-optimization.js +2 -2
  164. package/dist/server/implicit-tags.js +2 -1
  165. package/dist/server/instrumentation.js +2 -2
  166. package/dist/server/isr-cache.d.ts +1 -1
  167. package/dist/server/isr-cache.js +1 -1
  168. package/dist/server/metadata-routes.js +4 -4
  169. package/dist/server/middleware-matcher-pattern.d.ts +22 -0
  170. package/dist/server/middleware-matcher-pattern.js +219 -0
  171. package/dist/server/middleware-matcher.d.ts +2 -7
  172. package/dist/server/middleware-matcher.js +13 -60
  173. package/dist/server/middleware-path-to-regexp.d.ts +14 -0
  174. package/dist/server/middleware-path-to-regexp.js +228 -0
  175. package/dist/server/middleware-response-headers.js +1 -1
  176. package/dist/server/middleware-runtime.js +5 -4
  177. package/dist/server/middleware.d.ts +2 -1
  178. package/dist/server/middleware.js +3 -2
  179. package/dist/server/navigation-planner.d.ts +2 -0
  180. package/dist/server/navigation-planner.js +8 -2
  181. package/dist/server/next-error-digest.d.ts +9 -24
  182. package/dist/server/next-error-digest.js +23 -15
  183. package/dist/server/operation-token.js +1 -1
  184. package/dist/server/pages-body-parser-config.js +2 -1
  185. package/dist/server/pages-data-route.d.ts +11 -1
  186. package/dist/server/pages-data-route.js +16 -1
  187. package/dist/server/pages-dev-hydration.d.ts +14 -0
  188. package/dist/server/pages-dev-hydration.js +83 -0
  189. package/dist/server/pages-dev-module-url.js +2 -2
  190. package/dist/server/pages-get-initial-props.d.ts +15 -2
  191. package/dist/server/pages-get-initial-props.js +16 -6
  192. package/dist/server/pages-node-compat.d.ts +13 -6
  193. package/dist/server/pages-node-compat.js +44 -45
  194. package/dist/server/pages-page-data.d.ts +4 -2
  195. package/dist/server/pages-page-data.js +20 -10
  196. package/dist/server/pages-page-handler.d.ts +4 -2
  197. package/dist/server/pages-page-handler.js +74 -43
  198. package/dist/server/pages-page-response.d.ts +2 -2
  199. package/dist/server/pages-page-response.js +1 -1
  200. package/dist/server/pages-preview.d.ts +26 -0
  201. package/dist/server/pages-preview.js +165 -0
  202. package/dist/server/pages-readiness.d.ts +5 -4
  203. package/dist/server/pages-readiness.js +4 -2
  204. package/dist/server/pages-request-pipeline.d.ts +1 -0
  205. package/dist/server/pages-request-pipeline.js +25 -11
  206. package/dist/server/pages-router-entry.js +6 -0
  207. package/dist/server/prerender-route-params.js +2 -2
  208. package/dist/server/prod-server.d.ts +1 -4
  209. package/dist/server/prod-server.js +44 -30
  210. package/dist/server/request-pipeline.d.ts +15 -29
  211. package/dist/server/request-pipeline.js +25 -60
  212. package/dist/server/rsc-stream-hints.js +122 -18
  213. package/dist/server/seed-cache.js +1 -1
  214. package/dist/server/socket-error-backstop.js +1 -1
  215. package/dist/server/static-file-cache.js +7 -8
  216. package/dist/server/worker-utils.js +1 -1
  217. package/dist/shims/app.d.ts +1 -1
  218. package/dist/shims/cache-request-state.d.ts +27 -1
  219. package/dist/shims/cache-request-state.js +60 -1
  220. package/dist/shims/cache-runtime.d.ts +12 -1
  221. package/dist/shims/cache-runtime.js +22 -7
  222. package/dist/shims/cache.d.ts +5 -5
  223. package/dist/shims/cache.js +28 -11
  224. package/dist/shims/constants.js +1 -1
  225. package/dist/shims/document.d.ts +42 -83
  226. package/dist/shims/document.js +62 -53
  227. package/dist/shims/dynamic.d.ts +5 -25
  228. package/dist/shims/dynamic.js +29 -8
  229. package/dist/shims/error-boundary.d.ts +4 -4
  230. package/dist/shims/error.d.ts +22 -6
  231. package/dist/shims/error.js +53 -15
  232. package/dist/shims/fetch-cache.js +13 -4
  233. package/dist/shims/font-google-base.d.ts +11 -4
  234. package/dist/shims/font-local.d.ts +10 -3
  235. package/dist/shims/font-utils.js +1 -1
  236. package/dist/shims/form.d.ts +1 -1
  237. package/dist/shims/head.d.ts +13 -2
  238. package/dist/shims/head.js +6 -6
  239. package/dist/shims/headers.d.ts +28 -31
  240. package/dist/shims/headers.js +115 -53
  241. package/dist/shims/image.d.ts +27 -37
  242. package/dist/shims/image.js +21 -14
  243. package/dist/shims/internal/cookie-serialize.d.ts +3 -1
  244. package/dist/shims/internal/cookie-serialize.js +3 -1
  245. package/dist/shims/internal/hybrid-client-route-owner.js +3 -1
  246. package/dist/shims/internal/pages-data-fetch-dedup.js +5 -3
  247. package/dist/shims/internal/utils.d.ts +3 -3
  248. package/dist/shims/layout-segment-context.d.ts +1 -1
  249. package/dist/shims/legacy-image.d.ts +3 -37
  250. package/dist/shims/legacy-image.js +6 -16
  251. package/dist/shims/link.d.ts +16 -21
  252. package/dist/shims/link.js +25 -13
  253. package/dist/shims/navigation-context-state.d.ts +1 -1
  254. package/dist/shims/navigation-errors.d.ts +2 -1
  255. package/dist/shims/navigation-errors.js +9 -13
  256. package/dist/shims/navigation.d.ts +8 -4
  257. package/dist/shims/navigation.js +29 -18
  258. package/dist/shims/next-shims-augmentations.d.ts +1 -0
  259. package/dist/shims/next-shims-public.d.ts +1 -0
  260. package/dist/shims/public-shim-map.json.js +103 -0
  261. package/dist/shims/readonly-url-search-params.d.ts +3 -3
  262. package/dist/shims/readonly-url-search-params.js +3 -3
  263. package/dist/shims/request-state-types.d.ts +1 -1
  264. package/dist/shims/router-state.d.ts +1 -0
  265. package/dist/shims/router.d.ts +57 -22
  266. package/dist/shims/router.js +178 -46
  267. package/dist/shims/script.d.ts +6 -10
  268. package/dist/shims/script.js +7 -4
  269. package/dist/shims/server.d.ts +45 -22
  270. package/dist/shims/server.js +46 -7
  271. package/dist/shims/slot.d.ts +1 -1
  272. package/dist/shims/thenable-params.js +1 -1
  273. package/dist/shims/unified-request-context.d.ts +1 -1
  274. package/dist/shims/unified-request-context.js +2 -0
  275. package/dist/shims/url-safety.d.ts +1 -1
  276. package/dist/shims/url-safety.js +2 -2
  277. package/dist/typegen.d.ts +8 -2
  278. package/dist/typegen.js +84 -25
  279. package/dist/utils/client-build-manifest.js +2 -2
  280. package/dist/utils/client-entry-manifest.js +1 -1
  281. package/dist/utils/client-runtime-metadata.js +1 -1
  282. package/dist/utils/commonjs-loader.js +3 -3
  283. package/dist/utils/domain-locale.d.ts +2 -2
  284. package/dist/utils/external-url.d.ts +5 -0
  285. package/dist/utils/external-url.js +7 -0
  286. package/dist/utils/mdx-scan.js +1 -1
  287. package/dist/utils/path.d.ts +1 -13
  288. package/dist/utils/path.js +1 -15
  289. package/dist/utils/plugin-options.d.ts +4 -0
  290. package/dist/utils/plugin-options.js +8 -0
  291. package/dist/utils/project.d.ts +0 -6
  292. package/dist/utils/project.js +2 -8
  293. package/dist/utils/public-routes.js +2 -2
  294. package/dist/utils/react-version.js +1 -1
  295. package/dist/utils/redirect-digest.d.ts +9 -0
  296. package/dist/utils/redirect-digest.js +25 -0
  297. package/dist/utils/regex-safety.d.ts +8 -0
  298. package/dist/utils/regex-safety.js +737 -0
  299. package/dist/utils/vinext-root.js +1 -1
  300. package/dist/utils/vite-version.d.ts +5 -2
  301. package/dist/utils/vite-version.js +43 -17
  302. package/package.json +16 -4
  303. /package/dist/build/google-fonts/{fallback-metrics-data.js → fallback-metrics-data.json.js} +0 -0
  304. /package/dist/build/google-fonts/{font-data.js → font-data.json.js} +0 -0
  305. /package/dist/{node_modules/.pnpm/process-ancestry@0.1.0/node_modules → deps/.pnpm/process-ancestry@0.1.0/deps}/process-ancestry/dist/index.js +0 -0
@@ -1,3 +1,4 @@
1
+ import { stripBasePath } from "../utils/base-path.js";
1
2
  import { NEVER_CACHE_CONTROL } from "./cache-control.js";
2
3
  import { AppElementsWire } from "./app-elements-wire.js";
3
4
  import "./app-elements.js";
@@ -6,18 +7,34 @@ import { isNavigationSignalError } from "../utils/navigation-signal.js";
6
7
  import { ErrorBoundary, GlobalErrorBoundary, SerializedErrorBoundary } from "../shims/error-boundary.js";
7
8
  import { LayoutSegmentProvider } from "../shims/layout-segment-context.js";
8
9
  import { MetadataHead, ViewportHead } from "../shims/metadata.js";
9
- import { resolveAppPageSpecialError } from "./app-page-execution.js";
10
- import { resolveAppPageHead } from "./app-page-head.js";
10
+ import { resolveAppPageBranchParams, resolveAppPageSegmentParams } from "./app-page-params.js";
11
+ import { stripRscSuffix } from "./app-rsc-cache-busting.js";
12
+ import { buildRscRedirectFlightStream } from "./app-rsc-redirect-flight.js";
13
+ import { bufferAppPageBinaryStream, buildAppPageSpecialErrorResponse, resolveAppPageSpecialError } from "./app-page-execution.js";
14
+ import { resolveActiveParallelRouteHeadInputs, resolveAppPageHead } from "./app-page-head.js";
11
15
  import { createAppPageLayoutEntries, createAppPageSourcePage } from "./app-page-route-wiring.js";
12
16
  import { buildClientHookErrorMessage } from "../shims/client-hook-error.js";
17
+ import { resolveHttpAccessFallbackMetadata, resolveHttpAccessFallbackViewport } from "./app-page-http-access-fallback-metadata.js";
18
+ import "./app-rsc-route-matching.js";
13
19
  import { renderAppPageBoundaryResponse, resolveAppPageErrorBoundary, resolveAppPageHttpAccessBoundaryModule, wrapAppPageBoundaryElement } from "./app-page-boundary.js";
14
- import { createAppPageFontData, renderAppPageHtmlResponse } from "./app-page-stream.js";
20
+ import { resolveSlotParamOverrides } from "./app-page-element-builder.js";
21
+ import { createAppPageFontData, createAppPageRscErrorTracker, renderAppPageHtmlResponse } from "./app-page-stream.js";
15
22
  import { Fragment, createElement } from "react";
16
23
  //#region src/server/app-page-boundary-render.ts
17
24
  const DEFAULT_GLOBAL_ERROR_COMPONENT = DefaultGlobalError;
18
25
  function getDefaultExport(module) {
19
26
  return module?.default ?? null;
20
27
  }
28
+ function resolveHttpAccessBoundaryTreePosition(route, boundaryModule, statusCode) {
29
+ if (!route || !boundaryModule) return null;
30
+ const routeBoundary = statusCode === 403 ? route.forbidden : statusCode === 401 ? route.unauthorized : route.notFound;
31
+ const layoutBoundaries = statusCode === 403 ? route.forbiddens : statusCode === 401 ? route.unauthorizeds : route.notFounds;
32
+ if (boundaryModule === routeBoundary && statusCode === 404) return route.notFoundTreePosition ?? null;
33
+ if (boundaryModule === routeBoundary && statusCode === 403) return route.forbiddenTreePosition ?? null;
34
+ if (boundaryModule === routeBoundary && statusCode === 401) return route.unauthorizedTreePosition ?? null;
35
+ for (let index = (layoutBoundaries?.length ?? 0) - 1; index >= 0; index--) if (layoutBoundaries?.[index] === boundaryModule) return route.layoutTreePositions?.[index] ?? null;
36
+ return null;
37
+ }
21
38
  function wrapRenderedBoundaryElement(options) {
22
39
  return wrapAppPageBoundaryElement({
23
40
  element: options.element,
@@ -89,52 +106,95 @@ function createAppPageBoundaryRscPayload(options) {
89
106
  [routeId]: options.element
90
107
  };
91
108
  }
92
- async function renderAppPageBoundaryElementResponse(options) {
93
- const requestUrl = new URL(options.requestUrl);
94
- const pathname = requestUrl.pathname;
95
- return renderAppPageBoundaryResponse({
96
- async createHtmlResponse(rscStream, responseStatus) {
97
- const fontData = createAppPageFontData({
98
- getLinks: options.getFontLinks,
99
- getPreloads: options.getFontPreloads,
100
- getStyles: options.getFontStyles
101
- });
102
- const ssrHandler = await options.loadSsrHandler();
103
- return renderAppPageHtmlResponse({
104
- clearRequestContext: options.clearRequestContext,
105
- fontData,
106
- fontLinkHeader: options.buildFontLinkHeader(fontData.preloads),
107
- isEdgeRuntime: options.isEdgeRuntime,
108
- middlewareHeaders: options.middlewareContext.headers,
109
- navigationContext: options.getNavigationContext() ?? {
110
- pathname,
111
- searchParams: requestUrl.searchParams,
112
- params: options.navigationParams ?? options.route?.params ?? {}
113
- },
114
- rscStream,
115
- scriptNonce: options.scriptNonce,
116
- ssrHandler,
117
- status: responseStatus,
118
- initialDevServerError: options.initialDevServerError
119
- });
120
- },
121
- createRscOnErrorHandler() {
122
- return options.createRscOnErrorHandler(pathname, options.routePattern ?? pathname);
123
- },
124
- element: createAppPageBoundaryRscPayload({
125
- element: options.element,
126
- layoutModules: options.layoutModules,
127
- pathname,
128
- route: options.route,
129
- sourcePageSegments: options.sourcePageSegments
109
+ function renderBoundarySpecialErrorResponse(options, specialError) {
110
+ return buildAppPageSpecialErrorResponse({
111
+ basePath: options.basePath,
112
+ buildRscRedirectFlightStream: (rscOptions) => buildRscRedirectFlightStream({
113
+ renderToReadableStream: options.renderToReadableStream,
114
+ digest: rscOptions.digest
130
115
  }),
116
+ clearRequestContext: options.clearRequestContext,
117
+ getAndClearPendingCookies: options.getAndClearPendingCookies,
131
118
  isEdgeRuntime: options.isEdgeRuntime,
132
119
  isRscRequest: options.isRscRequest,
133
- middlewareHeaders: options.middlewareContext.headers,
134
- renderToReadableStream: options.renderToReadableStream,
135
- status: options.status
120
+ middlewareContext: options.middlewareContext,
121
+ serveStreamingMetadata: options.serveStreamingMetadata,
122
+ request: options.request,
123
+ specialError
136
124
  });
137
125
  }
126
+ async function renderAppPageBoundaryElementResponse(options) {
127
+ const requestUrl = new URL(options.requestUrl);
128
+ const pathname = requestUrl.pathname;
129
+ const payload = createAppPageBoundaryRscPayload({
130
+ element: options.element,
131
+ layoutModules: options.layoutModules,
132
+ pathname,
133
+ route: options.route,
134
+ sourcePageSegments: options.sourcePageSegments
135
+ });
136
+ const rscErrorTracker = createAppPageRscErrorTracker(options.createRscOnErrorHandler(pathname, options.routePattern ?? pathname));
137
+ const resolveCapturedSpecialError = (error) => resolveAppPageSpecialError(error) ?? resolveAppPageSpecialError(rscErrorTracker.getCapturedSpecialError());
138
+ const renderSpecialErrorResponse = (specialError) => renderBoundarySpecialErrorResponse(options, specialError);
139
+ const handleSpecialErrors = options.handleSpecialErrors === true;
140
+ let response;
141
+ try {
142
+ response = await renderAppPageBoundaryResponse({
143
+ async createHtmlResponse(rscStream, responseStatus) {
144
+ const fontData = createAppPageFontData({
145
+ getLinks: options.getFontLinks,
146
+ getPreloads: options.getFontPreloads,
147
+ getStyles: options.getFontStyles
148
+ });
149
+ const ssrHandler = await options.loadSsrHandler();
150
+ return renderAppPageHtmlResponse({
151
+ clearRequestContext: options.clearRequestContext,
152
+ fontData,
153
+ fontLinkHeader: options.buildFontLinkHeader(fontData.preloads),
154
+ isEdgeRuntime: options.isEdgeRuntime,
155
+ middlewareHeaders: options.middlewareContext.headers,
156
+ navigationContext: options.getNavigationContext() ?? {
157
+ pathname,
158
+ searchParams: requestUrl.searchParams,
159
+ params: options.navigationParams ?? options.route?.params ?? {}
160
+ },
161
+ rscStream,
162
+ scriptNonce: options.scriptNonce,
163
+ ssrHandler,
164
+ status: responseStatus,
165
+ initialDevServerError: options.initialDevServerError
166
+ });
167
+ },
168
+ createRscOnErrorHandler() {
169
+ return rscErrorTracker.onRenderError;
170
+ },
171
+ element: payload,
172
+ isEdgeRuntime: options.isEdgeRuntime,
173
+ isRscRequest: options.isRscRequest,
174
+ middlewareHeaders: options.middlewareContext.headers,
175
+ renderToReadableStream: options.renderToReadableStream,
176
+ status: options.status
177
+ });
178
+ } catch (error) {
179
+ const specialError = handleSpecialErrors ? resolveCapturedSpecialError(error) : null;
180
+ if (specialError !== null) return renderSpecialErrorResponse(specialError);
181
+ throw error;
182
+ }
183
+ if (!handleSpecialErrors) return response;
184
+ if (options.isRscRequest && response.body) {
185
+ const bufferedStream = await bufferAppPageBinaryStream(response.body);
186
+ response = new Response(bufferedStream, {
187
+ status: response.status,
188
+ headers: response.headers
189
+ });
190
+ }
191
+ const specialError = resolveCapturedSpecialError();
192
+ if (!specialError) return response;
193
+ if (response.body) try {
194
+ await response.body.cancel();
195
+ } catch {}
196
+ return renderSpecialErrorResponse(specialError);
197
+ }
138
198
  async function renderAppPageHttpAccessFallback(options) {
139
199
  const resolvedBoundaryModule = resolveAppPageHttpAccessBoundaryModule({
140
200
  rootForbiddenModule: options.rootForbiddenModule,
@@ -150,18 +210,92 @@ async function renderAppPageHttpAccessFallback(options) {
150
210
  if (!boundaryComponent) return null;
151
211
  const layoutModules = options.layoutModules ?? options.route?.layouts ?? options.rootLayouts;
152
212
  const pathname = new URL(options.requestUrl).pathname;
213
+ const routePathname = options.routePathname ?? stripRscSuffix(stripBasePath(pathname, options.basePath ?? ""));
153
214
  const routeSegments = resolveHttpAccessFallbackHeadRouteSegments(options.route, layoutModules);
154
- const { metadata, viewport } = await resolveAppPageHead({
155
- applyFileBasedMetadata: options.applyFileBasedMetadata,
156
- basePath: options.basePath ?? "",
157
- layoutModules,
158
- layoutTreePositions: resolveHttpAccessFallbackHeadLayoutTreePositions(options.route, layoutModules),
159
- metadataRoutes: options.metadataRoutes,
160
- pageModule: boundaryModule,
161
- params: options.matchedParams,
162
- routePath: options.route?.pattern ?? pathname,
163
- routeSegments
164
- });
215
+ const fallbackRouteSegments = routeSegments ?? [];
216
+ let head;
217
+ try {
218
+ if ([
219
+ 401,
220
+ 403,
221
+ 404
222
+ ].includes(options.statusCode)) {
223
+ const boundaryTreePosition = resolveHttpAccessBoundaryTreePosition(options.route, boundaryModule, options.statusCode);
224
+ const boundaryParams = boundaryTreePosition == null ? {} : resolveAppPageSegmentParams(fallbackRouteSegments, boundaryTreePosition, options.matchedParams);
225
+ const intercept = options.intercept;
226
+ const isSiblingIntercept = intercept?.interceptSlotKey === "__vinext_page_intercept" && intercept.interceptPage != null;
227
+ const effectiveParams = isSiblingIntercept ? intercept.interceptParams ?? options.matchedParams : options.matchedParams;
228
+ const slotParams = resolveSlotParamOverrides({ slots: options.route?.slots ?? null }, routePathname);
229
+ const parallelBranches = resolveActiveParallelRouteHeadInputs({
230
+ interceptBranchSegments: intercept?.interceptBranchSegments ?? null,
231
+ interceptLayouts: intercept?.interceptLayouts ?? null,
232
+ interceptLayoutSegments: intercept?.interceptLayoutSegments ?? null,
233
+ interceptNotFoundBranchSegments: intercept?.interceptNotFoundBranchSegments ?? null,
234
+ interceptNotFound: intercept?.interceptNotFound ?? null,
235
+ interceptNotFoundTreePosition: intercept?.interceptNotFoundTreePosition ?? null,
236
+ interceptPage: intercept?.interceptPage ?? null,
237
+ interceptParams: intercept?.interceptParams ?? null,
238
+ interceptSlotKey: intercept?.interceptSlotKey ?? null,
239
+ interceptSourcePageSegments: intercept?.interceptSourcePageSegments ?? null,
240
+ layoutTreePositions: options.route?.layoutTreePositions,
241
+ params: options.matchedParams,
242
+ routeSegments: fallbackRouteSegments,
243
+ slotParams,
244
+ slots: options.route?.slots ?? null
245
+ });
246
+ const primaryParallelBranch = isSiblingIntercept ? {
247
+ head: {
248
+ layoutModules: intercept?.interceptLayouts ?? [],
249
+ layoutParams: (intercept?.interceptLayoutSegments ?? []).map((segments) => resolveAppPageBranchParams(intercept?.interceptBranchSegments ?? segments, segments.length, effectiveParams, segments)),
250
+ pageModule: intercept?.interceptPage ?? null,
251
+ params: effectiveParams,
252
+ routeSegments: intercept?.interceptSourcePageSegments ?? fallbackRouteSegments
253
+ },
254
+ ...intercept?.interceptNotFound ? {
255
+ notFoundModule: intercept.interceptNotFound,
256
+ notFoundParams: resolveAppPageBranchParams(intercept.interceptNotFoundBranchSegments ?? intercept.interceptBranchSegments ?? fallbackRouteSegments, intercept.interceptNotFoundTreePosition ?? 0, effectiveParams)
257
+ } : {},
258
+ ownerTreePosition: fallbackRouteSegments.length
259
+ } : null;
260
+ const fallbackHeadOptions = {
261
+ boundaryModule,
262
+ boundaryParams,
263
+ branchNotFoundConventions: options.statusCode === 404,
264
+ layoutModules,
265
+ layoutTreePositions: resolveHttpAccessFallbackHeadLayoutTreePositions(options.route, layoutModules),
266
+ parallelBranches,
267
+ params: options.matchedParams,
268
+ primaryParallelBranch,
269
+ routeSegments
270
+ };
271
+ const [metadata, viewport] = await Promise.all([resolveHttpAccessFallbackMetadata({
272
+ applyFileBasedMetadata: options.applyFileBasedMetadata,
273
+ basePath: options.basePath ?? "",
274
+ ...fallbackHeadOptions,
275
+ metadataRoutes: options.metadataRoutes,
276
+ routePath: options.route?.pattern ?? pathname
277
+ }), resolveHttpAccessFallbackViewport(fallbackHeadOptions)]);
278
+ head = {
279
+ metadata,
280
+ viewport
281
+ };
282
+ } else head = await resolveAppPageHead({
283
+ applyFileBasedMetadata: options.applyFileBasedMetadata,
284
+ basePath: options.basePath ?? "",
285
+ layoutModules,
286
+ layoutTreePositions: resolveHttpAccessFallbackHeadLayoutTreePositions(options.route, layoutModules),
287
+ metadataRoutes: options.metadataRoutes,
288
+ pageModule: boundaryModule,
289
+ params: options.matchedParams,
290
+ routePath: options.route?.pattern ?? pathname,
291
+ routeSegments
292
+ });
293
+ } catch (error) {
294
+ const specialError = resolveAppPageSpecialError(error);
295
+ if (specialError) return renderBoundarySpecialErrorResponse(options, specialError);
296
+ throw error;
297
+ }
298
+ const { metadata, viewport } = head;
165
299
  const headElements = [createElement("meta", {
166
300
  charSet: "utf-8",
167
301
  key: "charset"
@@ -197,6 +331,7 @@ async function renderAppPageHttpAccessFallback(options) {
197
331
  return renderAppPageBoundaryElementResponse({
198
332
  ...options,
199
333
  element,
334
+ handleSpecialErrors: true,
200
335
  layoutModules: skipLayoutWrapping ? [] : layoutModules,
201
336
  navigationParams: options.matchedParams,
202
337
  route: skipLayoutWrapping ? null : options.route,
@@ -1,6 +1,6 @@
1
1
  import { RenderObservation } from "./cache-proof.js";
2
- import { CachedAppPageValue } from "../shims/cache-handler.js";
3
2
  import { AppRscRenderMode } from "./app-rsc-render-mode.js";
3
+ import { CachedAppPageValue } from "../shims/cache-handler.js";
4
4
  import { AppPageRenderObservationState } from "./app-page-render-observation.js";
5
5
 
6
6
  //#region src/server/app-page-cache-finalizer.d.ts
@@ -1,6 +1,6 @@
1
1
  import { RenderObservation } from "./cache-proof.js";
2
- import { CacheControlMetadata, CachedAppPageValue } from "../shims/cache-handler.js";
3
2
  import { AppRscRenderMode } from "./app-rsc-render-mode.js";
3
+ import { CacheControlMetadata, CachedAppPageValue } from "../shims/cache-handler.js";
4
4
  import { finalizeAppPageHtmlCacheResponse, finalizeAppPageRscCacheResponse, scheduleAppPageRscCacheWrite } from "./app-page-cache-finalizer.js";
5
5
  import { ISRCacheEntry } from "./isr-cache.js";
6
6
 
@@ -4,11 +4,11 @@ import { AppOutgoingElements } from "./app-elements-wire.js";
4
4
  import { NavigationContext } from "../shims/navigation-context-state.js";
5
5
  import { AppPageFontPreload, LayoutClassificationOptions } from "./app-page-execution.js";
6
6
  import { AppPageMiddlewareContext } from "./app-page-response.js";
7
+ import { AppLayoutParamAccessTracker } from "./app-layout-param-observation.js";
8
+ import { AppRscRenderMode } from "./app-rsc-render-mode.js";
7
9
  import { RootParams } from "../shims/root-params.js";
8
10
  import { AppPageSsrHandler } from "./app-page-stream.js";
9
- import { AppLayoutParamAccessTracker } from "./app-layout-param-observation.js";
10
11
  import { CachedAppPageValue } from "../shims/cache-handler.js";
11
- import { AppRscRenderMode } from "./app-rsc-render-mode.js";
12
12
  import { ISRCacheEntry } from "./isr-cache.js";
13
13
  import { PprFallbackShellState } from "../shims/ppr-fallback-shell.js";
14
14
  import { FetchCacheMode } from "../shims/fetch-cache.js";
@@ -36,6 +36,9 @@ type AppPageDispatchIntercept<TPage = unknown> = {
36
36
  interceptLayouts?: readonly unknown[] | null;
37
37
  interceptLayoutSegments?: readonly (readonly string[])[] | null;
38
38
  interceptBranchSegments?: readonly string[] | null;
39
+ interceptNotFoundBranchSegments?: readonly string[] | null;
40
+ notFound?: unknown;
41
+ notFoundTreePosition?: number | null;
39
42
  matchedParams: AppPageParams;
40
43
  sourceMatchedParams?: AppPageParams;
41
44
  page: TPage;
@@ -49,6 +52,9 @@ type AppPageDispatchInterceptOptions<TPage = unknown> = {
49
52
  interceptLayouts?: readonly unknown[] | null;
50
53
  interceptLayoutSegments?: readonly (readonly string[])[] | null;
51
54
  interceptBranchSegments?: readonly string[] | null;
55
+ interceptNotFoundBranchSegments?: readonly string[] | null;
56
+ interceptNotFound?: unknown;
57
+ interceptNotFoundTreePosition?: number | null;
52
58
  interceptPage: TPage;
53
59
  interceptParams: AppPageParams;
54
60
  interceptSlotId?: string | null;
@@ -73,6 +79,7 @@ type AppPageDispatchRoute = {
73
79
  error?: AppPageModule | null;
74
80
  errors?: readonly (AppPageModule | null | undefined)[];
75
81
  forbidden?: AppPageModule | null;
82
+ forbiddenTreePosition?: number | null;
76
83
  forbiddens?: readonly (AppPageModule | null | undefined)[];
77
84
  isDynamic: boolean;
78
85
  layouts: readonly AppPageModule[];
@@ -85,6 +92,7 @@ type AppPageDispatchRoute = {
85
92
  routeSegments: readonly string[];
86
93
  slots?: Readonly<Record<string, AppPageDispatchSlot>>;
87
94
  unauthorized?: AppPageModule | null;
95
+ unauthorizedTreePosition?: number | null;
88
96
  unauthorizeds?: readonly (AppPageModule | null | undefined)[];
89
97
  };
90
98
  type AppPagePprRuntime<TRoute extends AppPageDispatchRoute> = {
@@ -112,6 +120,7 @@ type DispatchAppPageOptions<TRoute extends AppPageDispatchRoute> = {
112
120
  buildPageElement: (route: TRoute, params: AppPageParams, opts: AppPageDispatchInterceptOptions | undefined, searchParams: URLSearchParams, layoutParamAccess?: AppLayoutParamAccessTracker, options?: {
113
121
  observeMetadataSearchParamsAccess?: boolean;
114
122
  observePageSearchParamsAccess?: boolean;
123
+ serveStreamingMetadata?: boolean;
115
124
  }) => Promise<AppPageElement>;
116
125
  clientReuseManifest?: ClientReuseManifestParseResult;
117
126
  cleanPathname: string;
@@ -184,6 +193,7 @@ type DispatchAppPageOptions<TRoute extends AppPageDispatchRoute> = {
184
193
  renderHttpAccessFallbackPage: (statusCode: number, opts: {
185
194
  boundaryComponent?: unknown;
186
195
  boundaryModule?: AppPageModule | null;
196
+ intercept?: AppPageDispatchInterceptOptions | null;
187
197
  layouts?: readonly AppPageModule[];
188
198
  matchedParams: AppPageParams;
189
199
  }, middlewareContext: AppPageMiddlewareContext | null) => Promise<Response | null>;
@@ -4,24 +4,24 @@ import "../utils/protocol-headers.js";
4
4
  import { AppElementsWire } from "./app-elements-wire.js";
5
5
  import { APP_RSC_RENDER_MODE_PREFETCH_DYNAMIC_SHELL } from "./app-rsc-render-mode.js";
6
6
  import "./app-elements.js";
7
- import { consumeDynamicUsage, consumeInvalidDynamicUsageError, getAndClearPendingCookies, getDraftModeCookieHeader, getHeadersContext, isDraftModeRequest, markDynamicUsage, peekDynamicUsage, peekRenderRequestApiUsage, setHeadersContext } from "../shims/headers.js";
7
+ import { consumeDynamicUsage, consumeInvalidDynamicUsageError, getAndClearPendingCookies, getDraftModeCookieHeader, getHeadersContext, isDraftModeRequest, peekDynamicUsage, peekRenderRequestApiUsage, runWithIsolatedDynamicUsage, setHeadersContext } from "../shims/headers.js";
8
8
  import { _consumeRequestScopedCacheLife, _peekRequestScopedCacheLife } from "../shims/cache-request-state.js";
9
9
  import { ensureFetchPatch, getCollectedFetchTags, peekDynamicFetchObservations, runWithFetchDedupe, setCurrentFetchCacheMode, setCurrentFetchSoftTags, setCurrentForceDynamicFetchDefault, setRefreshStaleFetchesInForeground } from "../shims/fetch-cache.js";
10
10
  import { VINEXT_RSC_CONTENT_TYPE, VINEXT_RSC_VARY_HEADER, applyRscCompatibilityIdHeader, applyRscDeploymentIdHeader } from "./app-rsc-cache-busting.js";
11
11
  import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
12
12
  import "./app-page-response.js";
13
+ import { buildRscRedirectFlightStream } from "./app-rsc-redirect-flight.js";
13
14
  import { buildAppPageSpecialErrorResponse, probeAppPageThrownError, resolveAppPageSpecialError } from "./app-page-execution.js";
14
15
  import { createAppPageTreePath } from "./app-page-route-wiring.js";
15
16
  import { consumeAppPageRenderObservationState, discardAppPageRenderState } from "./app-page-render-observation.js";
16
17
  import { resolveAppPageParentHttpAccessBoundary, resolveAppPageParentHttpAccessBoundaryModule } from "./app-page-boundary.js";
18
+ import { shouldServeStreamingMetadata } from "./streaming-metadata.js";
19
+ import { resolveAppPageNavigationParams } from "./app-page-element-builder.js";
17
20
  import { createAppLayoutParamAccessTracker, isAppLayoutObservationUnsafeForStaticReuse } from "./app-layout-param-observation.js";
18
21
  import { buildAppPageTags } from "./implicit-tags.js";
19
22
  import { resolveAppPageMethodResponse } from "./app-page-method.js";
20
- import { shouldServeStreamingMetadata } from "./streaming-metadata.js";
21
- import { resolveAppPageNavigationParams } from "./app-page-element-builder.js";
22
23
  import { buildAppPageElement, resolveAppPageIntercept, resolveAppPageInterceptionRerenderTarget, validateAppPageDynamicParams } from "./app-page-request.js";
23
24
  import { renderAppPageLifecycle } from "./app-page-render.js";
24
- import React from "react";
25
25
  //#region src/server/app-page-dispatch.ts
26
26
  function resolveAppPageRouteBoundaryModule(route, statusCode) {
27
27
  if (statusCode === 403) return route.forbidden ?? null;
@@ -140,6 +140,9 @@ function toInterceptOptions(interceptionContext, intercept) {
140
140
  interceptLayouts: intercept.interceptLayouts,
141
141
  interceptLayoutSegments: intercept.interceptLayoutSegments,
142
142
  interceptBranchSegments: intercept.interceptBranchSegments,
143
+ interceptNotFoundBranchSegments: intercept.interceptNotFoundBranchSegments,
144
+ interceptNotFound: intercept.notFound,
145
+ interceptNotFoundTreePosition: intercept.notFoundTreePosition,
143
146
  interceptPage: intercept.page,
144
147
  interceptParams: intercept.matchedParams,
145
148
  interceptSlotId: intercept.slotId ?? null,
@@ -160,6 +163,9 @@ async function dispatchAppPageInner(options) {
160
163
  const isForceStatic = dynamicConfig === "force-static";
161
164
  const isDynamicError = dynamicConfig === "error";
162
165
  const isForceDynamic = dynamicConfig === "force-dynamic";
166
+ const isPrerender = process.env.VINEXT_PRERENDER === "1";
167
+ const serveStreamingMetadata = shouldServeStreamingMetadata(options.request.headers.get("user-agent") ?? "", options.htmlLimitedBots);
168
+ const placeGeneratedMetadataInBody = (!isPrerender || options.pprFallbackShell !== void 0) && serveStreamingMetadata;
163
169
  const isPrefetchDynamicShell = options.renderMode === APP_RSC_RENDER_MODE_PREFETCH_DYNAMIC_SHELL;
164
170
  const isDraftMode = isDraftModeRequest(options.request, options.draftModeSecret);
165
171
  const requestHeadersContext = getHeadersContext();
@@ -269,7 +275,8 @@ async function dispatchAppPageInner(options) {
269
275
  const { renderAppPageCacheArtifacts } = await import("./app-page-cache-render.js");
270
276
  const revalidatedElement = await options.buildPageElement(revalidationTarget.route, revalidationTarget.params, revalidationTarget.interceptOpts, new URLSearchParams(), void 0, {
271
277
  observeMetadataSearchParamsAccess: revalidationDynamicConfig !== "force-static",
272
- observePageSearchParamsAccess: revalidationDynamicConfig !== "force-static"
278
+ observePageSearchParamsAccess: revalidationDynamicConfig !== "force-static",
279
+ serveStreamingMetadata: false
273
280
  });
274
281
  const revalidatedOnError = options.createRscOnErrorHandler(options.cleanPathname, revalidationTarget.route.pattern);
275
282
  const rendered = await renderAppPageCacheArtifacts({
@@ -314,7 +321,7 @@ async function dispatchAppPageInner(options) {
314
321
  });
315
322
  if (cachedPageResponse) return cachedPageResponse;
316
323
  }
317
- if (options.skipStaticParamsValidation !== true) {
324
+ if (options.skipStaticParamsValidation !== true && !(options.isProduction && isForceDynamic)) {
318
325
  const dynamicParamsResponse = await validateAppPageDynamicParams({
319
326
  clearRequestContext: options.clearRequestContext,
320
327
  enforceStaticParamsOnly: options.dynamicParamsConfig === false,
@@ -345,7 +352,8 @@ async function dispatchAppPageInner(options) {
345
352
  setCurrentForceDynamicFetchDefault(sourceDynamicConfig === "force-dynamic");
346
353
  return options.buildPageElement(interceptRoute, interceptParams, interceptOpts, interceptSearchParams, interceptLayoutParamAccess, {
347
354
  observeMetadataSearchParamsAccess: sourceDynamicConfig !== "force-static",
348
- observePageSearchParamsAccess: sourceDynamicConfig !== "force-static"
355
+ observePageSearchParamsAccess: sourceDynamicConfig !== "force-static",
356
+ serveStreamingMetadata: placeGeneratedMetadataInBody
349
357
  });
350
358
  },
351
359
  cleanPathname: options.cleanPathname,
@@ -397,7 +405,8 @@ async function dispatchAppPageInner(options) {
397
405
  if (options.actionFailed) throw options.actionError;
398
406
  return options.buildPageElement(route, options.params, interceptResult.interceptOpts, pageSearchParams, layoutParamAccess, {
399
407
  observeMetadataSearchParamsAccess: !isForceStatic,
400
- observePageSearchParamsAccess: !isForceStatic
408
+ observePageSearchParamsAccess: !isForceStatic,
409
+ serveStreamingMetadata: placeGeneratedMetadataInBody
401
410
  });
402
411
  },
403
412
  async probePageSpecialError() {
@@ -413,7 +422,7 @@ async function dispatchAppPageInner(options) {
413
422
  return options.renderErrorBoundaryPage(buildError);
414
423
  },
415
424
  renderSpecialError(specialError) {
416
- return renderPageSpecialError(options, specialError);
425
+ return renderPageSpecialError(options, specialError, serveStreamingMetadata, interceptResult.interceptOpts);
417
426
  },
418
427
  resolveSpecialError: resolveAppPageSpecialError
419
428
  });
@@ -441,7 +450,6 @@ async function dispatchAppPageInner(options) {
441
450
  const activeFallbackShellState = options.pprRuntime?.getState() ?? null;
442
451
  const pprFallbackShellSignal = activeFallbackShellState?.abortController.signal;
443
452
  const pprFallbackShellReactSignal = activeFallbackShellState?.reactAbortController.signal;
444
- const isPrerender = process.env.VINEXT_PRERENDER === "1";
445
453
  const isSpeculativePrerender = isPrerender && options.request.headers.get("x-vinext-prerender-speculative") === "1";
446
454
  return renderAppPageLifecycle({
447
455
  basePath: options.basePath,
@@ -530,16 +538,7 @@ async function dispatchAppPageInner(options) {
530
538
  return isAppLayoutObservationUnsafeForStaticReuse(layoutParamAccess.getLayoutObservation(layoutId));
531
539
  },
532
540
  async runWithIsolatedDynamicScope(fn) {
533
- const priorDynamic = consumeDynamicUsage();
534
- try {
535
- return {
536
- result: await fn(),
537
- dynamicDetected: consumeDynamicUsage()
538
- };
539
- } finally {
540
- consumeDynamicUsage();
541
- if (priorDynamic) markDynamicUsage();
542
- }
541
+ return runWithIsolatedDynamicUsage(fn);
543
542
  }
544
543
  },
545
544
  dynamicStaleTimeSeconds: options.dynamicStaleTimeSeconds,
@@ -550,10 +549,10 @@ async function dispatchAppPageInner(options) {
550
549
  return options.renderErrorBoundaryPage(renderError, errorOrigin);
551
550
  },
552
551
  renderLayoutSpecialError(specialError, layoutIndex) {
553
- return renderLayoutSpecialError(options, specialError, layoutIndex);
552
+ return renderLayoutSpecialError(options, specialError, layoutIndex, serveStreamingMetadata);
554
553
  },
555
554
  renderPageSpecialError(specialError) {
556
- return renderPageSpecialError(options, specialError);
555
+ return renderPageSpecialError(options, specialError, serveStreamingMetadata, interceptResult.interceptOpts);
557
556
  },
558
557
  renderToReadableStream: options.renderToReadableStream,
559
558
  hasCustomGlobalError: options.hasCustomGlobalError,
@@ -568,35 +567,16 @@ async function dispatchAppPageInner(options) {
568
567
  }
569
568
  });
570
569
  }
571
- /**
572
- * Builds an RSC flight payload that encodes a redirect as a React error chunk.
573
- * We render a tiny element that immediately throws an `Error` whose `digest`
574
- * is the canonical `NEXT_REDIRECT;...` string. `renderToReadableStream`'s
575
- * `onError` returns that digest, react-server-dom-webpack serializes the
576
- * error into the stream, and the client's `RedirectErrorBoundary` decodes it
577
- * via `getURLFromRedirectError` / `getRedirectTypeFromError`.
578
- *
579
- * The thrown error's digest matches Next.js's well-known router error format,
580
- * so neither vinext's RSC error handler nor Next.js's reporter logs it as a
581
- * "real" server error. Mirrors `app-render.tsx generateDynamicFlightRenderResult`
582
- * where a redirect thrown during RSC rendering propagates through
583
- * `renderToFlightStream`'s `onError` callback into the flight payload.
584
- */
585
- function buildRscRedirectFlightStream(options, digest) {
586
- const throwingElement = React.createElement(function NextRedirectFlightThrower() {
587
- const err = /* @__PURE__ */ new Error("NEXT_REDIRECT");
588
- err.digest = digest;
589
- throw err;
590
- });
591
- return options.renderToReadableStream(throwingElement, { onError: () => digest });
592
- }
593
- async function renderLayoutSpecialError(options, specialError, layoutIndex) {
570
+ async function renderLayoutSpecialError(options, specialError, layoutIndex, serveStreamingMetadata) {
594
571
  return buildAppPageSpecialErrorResponse({
595
572
  basePath: options.basePath,
596
- buildRscRedirectFlightStream: (rscOptions) => buildRscRedirectFlightStream(options, rscOptions.digest),
573
+ buildRscRedirectFlightStream: (rscOptions) => buildRscRedirectFlightStream({
574
+ renderToReadableStream: options.renderToReadableStream,
575
+ digest: rscOptions.digest
576
+ }),
597
577
  clearRequestContext: options.clearRequestContext,
598
578
  getAndClearPendingCookies,
599
- serveStreamingMetadata: shouldServeStreamingMetadata(options.request.headers.get("user-agent") ?? "", options.htmlLimitedBots),
579
+ serveStreamingMetadata,
600
580
  isEdgeRuntime: options.isEdgeRuntime,
601
581
  isRscRequest: options.isRscRequest,
602
582
  middlewareContext: options.middlewareContext,
@@ -625,13 +605,16 @@ async function renderLayoutSpecialError(options, specialError, layoutIndex) {
625
605
  specialError
626
606
  });
627
607
  }
628
- async function renderPageSpecialError(options, specialError) {
608
+ async function renderPageSpecialError(options, specialError, serveStreamingMetadata, intercept) {
629
609
  return buildAppPageSpecialErrorResponse({
630
610
  basePath: options.basePath,
631
- buildRscRedirectFlightStream: (rscOptions) => buildRscRedirectFlightStream(options, rscOptions.digest),
611
+ buildRscRedirectFlightStream: (rscOptions) => buildRscRedirectFlightStream({
612
+ renderToReadableStream: options.renderToReadableStream,
613
+ digest: rscOptions.digest
614
+ }),
632
615
  clearRequestContext: options.clearRequestContext,
633
616
  getAndClearPendingCookies,
634
- serveStreamingMetadata: shouldServeStreamingMetadata(options.request.headers.get("user-agent") ?? "", options.htmlLimitedBots),
617
+ serveStreamingMetadata,
635
618
  isEdgeRuntime: options.isEdgeRuntime,
636
619
  isRscRequest: options.isRscRequest,
637
620
  middlewareContext: options.middlewareContext,
@@ -649,7 +632,10 @@ async function renderPageSpecialError(options, specialError) {
649
632
  statusCode
650
633
  });
651
634
  const useLayoutAlignedBoundary = boundaryLayoutIndex !== null && (routeBoundaryModule === null || routeBoundaryModule === parentBoundaryModule);
652
- const fallbackOptions = { matchedParams: options.params };
635
+ const fallbackOptions = {
636
+ intercept,
637
+ matchedParams: options.params
638
+ };
653
639
  if (useLayoutAlignedBoundary && boundaryLayoutIndex !== null) {
654
640
  fallbackOptions.layouts = options.route.layouts.slice(0, boundaryLayoutIndex + 1);
655
641
  if (parentBoundaryModule) {
@@ -22,6 +22,9 @@ type AppPageInterceptOptions<TModule extends AppPageModule = AppPageModule> = {
22
22
  interceptLayouts?: readonly (TModule | null | undefined)[] | null;
23
23
  interceptLayoutSegments?: readonly (readonly string[])[] | null;
24
24
  interceptBranchSegments?: readonly string[] | null;
25
+ interceptNotFoundBranchSegments?: readonly string[] | null;
26
+ interceptNotFound?: TModule | null;
27
+ interceptNotFoundTreePosition?: number | null;
25
28
  interceptPage?: TModule | null;
26
29
  interceptParams?: AppPageParams | null;
27
30
  interceptSlotId?: string | null;
@@ -37,7 +40,9 @@ type AppPagePageRequest<TModule extends AppPageModule = AppPageModule> = {
37
40
  mountedSlotsHeader: string | null; /** Semantic RSC payload mode for this page render. */
38
41
  renderMode?: AppRscRenderMode; /** Observe page `searchParams` access for cache-safety classification. */
39
42
  observePageSearchParamsAccess?: boolean; /** Observe page metadata `searchParams` access for cache-safety classification. */
40
- observeMetadataSearchParamsAccess?: boolean;
43
+ observeMetadataSearchParamsAccess?: boolean; /** Whether generated metadata may stream into the response body. */
44
+ serveStreamingMetadata?: boolean; /** Whether streamed render errors must be sanitized for client transport. */
45
+ isProduction?: boolean;
41
46
  };
42
47
  type BuildPageElementsOptions<TModule extends AppPageModule = AppPageModule, TErrorModule extends AppPageErrorModule = AppPageErrorModule> = {
43
48
  applyFileBasedMetadata?: ApplyAppPageFileBasedMetadata;
@@ -96,6 +101,7 @@ type AppPageNavigationParamInterceptOptions = {
96
101
  */
97
102
  declare function buildPageElements<TModule extends AppPageModule = AppPageModule, TErrorModule extends AppPageErrorModule = AppPageErrorModule>(options: BuildPageElementsOptions<TModule, TErrorModule>): Promise<AppElements>;
98
103
  declare function resolveInterceptedSlotSegments(sourcePageSegments: readonly string[] | null | undefined, slotKey: string): readonly string[] | null;
104
+ declare function resolveSlotParamOverrides(route: AppPageNavigationParamRoute, routePath: string): Readonly<Record<string, AppPageParams>> | null;
99
105
  declare function resolveAppPageNavigationParams(route: AppPageNavigationParamRoute, routeParams: AppPageParams, routePath: string, opts?: AppPageNavigationParamInterceptOptions | null): AppPageParams;
100
106
  //#endregion
101
- export { AppPageBuildRoute, type AppPageErrorModule, AppPageInterceptOptions, AppPagePageRequest, type AppPageRouteWiringRoute, BuildPageElementsOptions, buildPageElements, resolveAppPageNavigationParams, resolveInterceptedSlotSegments };
107
+ export { AppPageBuildRoute, type AppPageErrorModule, AppPageInterceptOptions, AppPagePageRequest, type AppPageRouteWiringRoute, BuildPageElementsOptions, buildPageElements, resolveAppPageNavigationParams, resolveInterceptedSlotSegments, resolveSlotParamOverrides };