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
@@ -4,12 +4,16 @@ import "./app-elements.js";
4
4
  import { createAppPageRenderIdentity } from "./app-page-render-identity.js";
5
5
  import { matchRoutePattern } from "../routing/route-pattern.js";
6
6
  import { makeThenableParams } from "../shims/thenable-params.js";
7
- import { resolveAppPageBranchParams } from "./app-page-params.js";
8
- import { resolveActiveParallelRouteHeadInputs, resolveAppPageHead } from "./app-page-head.js";
7
+ import { resolveAppPageBranchParams, resolveAppPageSegmentParams } from "./app-page-params.js";
8
+ import { resolveAppPageSpecialError } from "./app-page-execution.js";
9
+ import { prepareAppPageHead, resolveActiveParallelRouteHeadInputs } from "./app-page-head.js";
9
10
  import { createAppPageSearchParamsObserver, makeObservedAppPageSearchParamsThenable } from "./app-page-search-params-observation.js";
10
11
  import { buildAppPageElements, createAppPageSourcePage, createAppPageTreePath } from "./app-page-route-wiring.js";
11
- import { DEFAULT_GLOBAL_ERROR_MODULE } from "./default-global-error-module.js";
12
+ import { resolveHttpAccessFallbackMetadata, resolveHttpAccessFallbackViewport } from "./app-page-http-access-fallback-metadata.js";
12
13
  import "./app-rsc-route-matching.js";
14
+ import { resolveAppPageParentHttpAccessBoundary } from "./app-page-boundary.js";
15
+ import { sanitizeErrorForClient } from "./app-rsc-errors.js";
16
+ import { DEFAULT_GLOBAL_ERROR_MODULE } from "./default-global-error-module.js";
13
17
  import { shouldServeStreamingMetadata } from "./streaming-metadata.js";
14
18
  import { createElement } from "react";
15
19
  //#region src/server/app-page-element-builder.ts
@@ -41,7 +45,7 @@ function isReactOwnedPageComponent(component) {
41
45
  async function buildPageElements(options) {
42
46
  const { route, params, routePath, displayPathname = routePath, pageRequest, globalErrorModule, rootNotFoundModule, rootForbiddenModule, rootUnauthorizedModule, metadataRoutes } = options;
43
47
  const slotParamOverrides = resolveSlotParamOverrides(route, routePath);
44
- const { opts, searchParams, isRscRequest, mountedSlotsHeader, renderMode = APP_RSC_RENDER_MODE_NAVIGATION, observeMetadataSearchParamsAccess = false, observePageSearchParamsAccess = false } = pageRequest;
48
+ const { opts, searchParams, isRscRequest, mountedSlotsHeader, renderMode = APP_RSC_RENDER_MODE_NAVIGATION, observeMetadataSearchParamsAccess = false, observePageSearchParamsAccess = false, serveStreamingMetadata, isProduction = process.env.NODE_ENV === "production" } = pageRequest;
45
49
  const pageModule = route.page;
46
50
  const isSiblingIntercept = opts?.interceptSlotKey === "__vinext_page_intercept" && !!opts?.interceptPage;
47
51
  const effectivePageModule = isSiblingIntercept ? opts.interceptPage : pageModule;
@@ -76,38 +80,116 @@ async function buildPageElements(options) {
76
80
  [renderIdentity.routeId]: createElement("div", null, "Page has no default export")
77
81
  };
78
82
  }
79
- const { hasDynamicMetadata, metadata: resolvedMetadata, pageSearchParams, viewport: resolvedViewport } = await resolveAppPageHead({
80
- applyFileBasedMetadata: options.applyFileBasedMetadata,
81
- basePath: options.basePath ?? "",
82
- layoutModules: route.layouts,
83
+ const activeParallelRouteHeadInputs = resolveActiveParallelRouteHeadInputs({
84
+ interceptBranchSegments: opts?.interceptBranchSegments ?? null,
85
+ interceptLayouts: opts?.interceptLayouts ?? null,
86
+ interceptLayoutSegments: opts?.interceptLayoutSegments ?? null,
87
+ interceptNotFoundBranchSegments: opts?.interceptNotFoundBranchSegments ?? null,
88
+ interceptNotFound: opts?.interceptNotFound ?? null,
89
+ interceptNotFoundTreePosition: opts?.interceptNotFoundTreePosition ?? null,
90
+ interceptPage: opts?.interceptPage ?? null,
91
+ interceptParams: opts?.interceptParams ?? null,
92
+ interceptSlotKey: opts?.interceptSlotKey ?? null,
93
+ interceptSourcePageSegments: opts?.interceptSourcePageSegments ?? null,
83
94
  layoutTreePositions: route.layoutTreePositions,
84
- metadataRoutes,
85
- pageModule: isSiblingIntercept ? null : effectivePageModule ?? null,
86
- parallelRoutes: [...resolveActiveParallelRouteHeadInputs({
87
- interceptBranchSegments: opts?.interceptBranchSegments ?? null,
88
- interceptLayouts: opts?.interceptLayouts ?? null,
89
- interceptLayoutSegments: opts?.interceptLayoutSegments ?? null,
90
- interceptPage: opts?.interceptPage ?? null,
91
- interceptParams: opts?.interceptParams ?? null,
92
- interceptSlotKey: opts?.interceptSlotKey ?? null,
93
- layoutTreePositions: route.layoutTreePositions,
94
- params,
95
- routeSegments: route.routeSegments ?? [],
96
- slotParams: slotParamOverrides,
97
- slots: route.slots ?? null
98
- }), ...isSiblingIntercept ? [{
95
+ params,
96
+ routeSegments: route.routeSegments ?? [],
97
+ slotParams: slotParamOverrides,
98
+ slots: route.slots ?? null
99
+ });
100
+ const primaryParallelRouteHeadInput = isSiblingIntercept ? {
101
+ head: {
99
102
  layoutModules: opts?.interceptLayouts ?? [],
100
103
  layoutParams: (opts?.interceptLayoutSegments ?? []).map((segments) => resolveInterceptLayoutParams(opts?.interceptBranchSegments ?? segments, segments, effectiveParams)),
101
104
  pageModule: effectivePageModule ?? null,
102
105
  params: effectiveParams,
103
106
  routeSegments: opts?.interceptSourcePageSegments ?? route.routeSegments ?? []
104
- }] : []],
107
+ },
108
+ ...opts?.interceptNotFound ? {
109
+ notFoundModule: opts.interceptNotFound,
110
+ notFoundParams: resolveAppPageBranchParams(opts.interceptNotFoundBranchSegments ?? opts.interceptBranchSegments ?? route.routeSegments ?? [], opts.interceptNotFoundTreePosition ?? 0, effectiveParams)
111
+ } : {},
112
+ ownerTreePosition: route.routeSegments?.length ?? 0
113
+ } : null;
114
+ const parallelRoutes = [...activeParallelRouteHeadInputs.map((input) => input.head), ...primaryParallelRouteHeadInput ? [primaryParallelRouteHeadInput.head] : []];
115
+ const metadataSearchParamsObserver = observeMetadataSearchParamsAccess ? createAppPageSearchParamsObserver() : void 0;
116
+ const preparedHead = prepareAppPageHead({
117
+ applyFileBasedMetadata: options.applyFileBasedMetadata,
118
+ basePath: options.basePath ?? "",
119
+ layoutModules: route.layouts,
120
+ layoutTreePositions: route.layoutTreePositions,
121
+ metadataRoutes,
122
+ pageModule: isSiblingIntercept ? null : effectivePageModule ?? null,
123
+ parallelRoutes,
105
124
  params: effectiveParams,
106
125
  routePath: route.pattern,
107
126
  routeSegments: route.routeSegments ?? null,
108
127
  searchParams,
109
- searchParamsObserver: observeMetadataSearchParamsAccess ? createAppPageSearchParamsObserver() : void 0
128
+ searchParamsObserver: metadataSearchParamsObserver
110
129
  });
130
+ const { hasDynamicMetadata, pageSearchParams } = preparedHead;
131
+ const streamGeneratedHead = serveStreamingMetadata ?? shouldServeStreamingMetadata(pageRequest.request.headers.get("user-agent") ?? "", options.htmlLimitedBots);
132
+ const metadataPlacement = hasDynamicMetadata && streamGeneratedHead ? "body" : "head";
133
+ const shouldDeferMetadata = metadataPlacement === "body";
134
+ const streamingMetadata = shouldDeferMetadata ? isProduction ? preparedHead.metadata.catch((error) => {
135
+ throw sanitizeErrorForClient(error, "production");
136
+ }) : preparedHead.metadata : null;
137
+ streamingMetadata?.catch(() => null);
138
+ const resolveNotFoundFallbackPlanOptions = () => {
139
+ const routeBoundaryModule = route.notFound;
140
+ const parentBoundary = resolveAppPageParentHttpAccessBoundary({
141
+ layoutIndex: route.layouts.length,
142
+ rootForbiddenModule,
143
+ rootNotFoundModule,
144
+ rootUnauthorizedModule,
145
+ routeForbiddenModules: route.forbiddens,
146
+ routeNotFoundModules: route.notFounds,
147
+ routeUnauthorizedModules: route.unauthorizeds,
148
+ statusCode: 404
149
+ });
150
+ const boundaryModule = routeBoundaryModule ?? parentBoundary.module;
151
+ const boundaryTreePosition = routeBoundaryModule ? route.notFoundTreePosition : parentBoundary.layoutIndex === null ? null : route.layoutTreePositions?.[parentBoundary.layoutIndex];
152
+ return {
153
+ boundaryModule,
154
+ boundaryParams: boundaryModule && boundaryTreePosition != null ? resolveAppPageSegmentParams(route.routeSegments ?? [], boundaryTreePosition, effectiveParams) : {},
155
+ layoutModules: route.layouts,
156
+ layoutTreePositions: route.layoutTreePositions,
157
+ parallelBranches: activeParallelRouteHeadInputs,
158
+ params: effectiveParams,
159
+ primaryParallelBranch: primaryParallelRouteHeadInput,
160
+ routeSegments: route.routeSegments ?? null
161
+ };
162
+ };
163
+ let viewportErrorOutlet = null;
164
+ let metadataErrorOutlet = null;
165
+ const resolveMetadataErrorTags = async (error) => {
166
+ if (resolveAppPageSpecialError(error)?.kind !== "http-access-fallback") return null;
167
+ return resolveHttpAccessFallbackMetadata({
168
+ applyFileBasedMetadata: options.applyFileBasedMetadata,
169
+ basePath: options.basePath ?? "",
170
+ ...resolveNotFoundFallbackPlanOptions(),
171
+ metadataRoutes,
172
+ routePath: route.pattern
173
+ }).catch(() => null);
174
+ };
175
+ const [resolvedMetadata, resolvedViewport] = await Promise.all([shouldDeferMetadata ? Promise.resolve(null) : preparedHead.metadata.catch((error) => {
176
+ metadataErrorOutlet = Promise.reject(isProduction ? sanitizeErrorForClient(error, "production") : error);
177
+ metadataErrorOutlet.catch(() => null);
178
+ return resolveMetadataErrorTags(error);
179
+ }), preparedHead.viewport.catch(async (error) => {
180
+ const specialError = resolveAppPageSpecialError(error);
181
+ viewportErrorOutlet = Promise.reject(isProduction ? sanitizeErrorForClient(error, "production") : error);
182
+ viewportErrorOutlet.catch(() => null);
183
+ return specialError?.kind === "http-access-fallback" ? resolveHttpAccessFallbackViewport(resolveNotFoundFallbackPlanOptions()).catch(() => ({})) : {};
184
+ })]);
185
+ const streamingMetadataTags = shouldDeferMetadata ? preparedHead.metadata.catch(resolveMetadataErrorTags) : null;
186
+ const streamingMetadataOutletInputs = [
187
+ streamingMetadata,
188
+ metadataErrorOutlet,
189
+ viewportErrorOutlet
190
+ ].filter((promise) => promise !== null).map((promise) => Promise.resolve(promise));
191
+ const streamingMetadataOutlet = streamingMetadataOutletInputs.length > 0 ? Promise.all(streamingMetadataOutletInputs).then(() => null) : null;
192
+ streamingMetadataOutlet?.catch(() => null);
111
193
  const pageProps = { params: makeThenableParams(effectiveParams) };
112
194
  const hasRequestSearchParams = Object.keys(pageSearchParams).length > 0;
113
195
  const createPageElement = (PageComponent, props) => {
@@ -127,7 +209,6 @@ async function buildPageElements(options) {
127
209
  const pageSearchParamsThenable = searchParams ? makeThenableParams(pageSearchParams) : void 0;
128
210
  const mountedSlotIds = mountedSlotsHeader ? new Set(mountedSlotsHeader.split(" ")) : null;
129
211
  const slotOverrides = buildSlotOverrides(route, params, routePath, opts);
130
- const metadataPlacement = hasDynamicMetadata && shouldServeStreamingMetadata(pageRequest.request.headers.get("user-agent") ?? "", options.htmlLimitedBots) ? "body" : "head";
131
212
  let siblingInterceptElement = isSiblingIntercept && EffectivePageComponent ? createPageElement(EffectivePageComponent, pageProps) : null;
132
213
  if (isSiblingIntercept && siblingInterceptElement !== null && opts?.interceptLayouts?.length) for (let i = opts.interceptLayouts.length - 1; i >= 0; i--) {
133
214
  const LayoutComponent = opts.interceptLayouts[i]?.default;
@@ -149,6 +230,10 @@ async function buildPageElements(options) {
149
230
  resolvedMetadata,
150
231
  resolvedMetadataPathname: routePath,
151
232
  resolvedViewport,
233
+ streamingMetadata,
234
+ streamingMetadataOutlet,
235
+ streamingMetadataOutletSuspended: streamGeneratedHead,
236
+ streamingMetadataTags,
152
237
  renderIdentity,
153
238
  routePath,
154
239
  sourcePageSegments,
@@ -293,4 +378,4 @@ function collectParamNameSet(params) {
293
378
  return set;
294
379
  }
295
380
  //#endregion
296
- export { buildPageElements, resolveAppPageNavigationParams, resolveInterceptedSlotSegments };
381
+ export { buildPageElements, resolveAppPageNavigationParams, resolveInterceptedSlotSegments, resolveSlotParamOverrides };
@@ -6,6 +6,7 @@ type AppPageSpecialError = {
6
6
  kind: "redirect";
7
7
  location: string;
8
8
  statusCode: number;
9
+ type?: "push" | "replace";
9
10
  fromMetadata?: boolean;
10
11
  } | {
11
12
  kind: "http-access-fallback";
@@ -132,7 +133,8 @@ declare function probeAppPageLayouts(options: ProbeAppPageLayoutsOptions): Promi
132
133
  declare function probeAppPageComponent(options: ProbeAppPageComponentOptions): Promise<Response | null>;
133
134
  declare function probeAppPageThrownError(options: ProbeAppPageThrownErrorOptions): Promise<unknown>;
134
135
  declare function readAppPageBinaryStream(stream: ReadableStream<Uint8Array>): Promise<ArrayBuffer>;
136
+ declare function bufferAppPageBinaryStream(stream: ReadableStream<Uint8Array>): Promise<ReadableStream<Uint8Array>>;
135
137
  declare function teeAppPageRscStreamForCapture(stream: ReadableStream<Uint8Array>, shouldCapture: boolean): AppPageRscStreamCapture;
136
138
  declare function buildAppPageFontLinkHeader(preloads: readonly AppPageFontPreload[] | null | undefined): string;
137
139
  //#endregion
138
- export { AppPageFontPreload, AppPageSpecialError, LayoutClassificationOptions, type LayoutFlags, buildAppPageFontLinkHeader, buildAppPageSpecialErrorResponse, probeAppPageComponent, probeAppPageLayouts, probeAppPageThrownError, readAppPageBinaryStream, resolveAppPageSpecialError, tagAppPageMetadataError, teeAppPageRscStreamForCapture };
140
+ export { AppPageFontPreload, AppPageSpecialError, LayoutClassificationOptions, type LayoutFlags, bufferAppPageBinaryStream, buildAppPageFontLinkHeader, buildAppPageSpecialErrorResponse, probeAppPageComponent, probeAppPageLayouts, probeAppPageThrownError, readAppPageBinaryStream, resolveAppPageSpecialError, tagAppPageMetadataError, teeAppPageRscStreamForCapture };
@@ -1,5 +1,4 @@
1
- import { addBasePathToPathname } from "../utils/base-path.js";
2
- import { VINEXT_RSC_REDIRECT_HEADER } from "./headers.js";
1
+ import { VINEXT_RSC_REDIRECT_HEADER, VINEXT_RSC_REDIRECT_TYPE_HEADER } from "./headers.js";
3
2
  import { runWithConnectionProbe } from "../shims/headers.js";
4
3
  import { VINEXT_RSC_CONTENT_TYPE, applyRscCompatibilityIdHeader, applyRscDeploymentIdHeader, createRscRedirectLocation } from "./app-rsc-cache-busting.js";
5
4
  import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
@@ -7,28 +6,9 @@ import { applyEdgeRuntimeHeader } from "./app-page-response.js";
7
6
  import { parseNextHttpErrorDigest, parseNextRedirectDigest } from "./next-error-digest.js";
8
7
  import { renderSsrErrorMetaTags } from "./app-ssr-error-meta.js";
9
8
  import { isPromiseLike } from "../utils/promise.js";
9
+ import { formatNextRedirectDigest } from "./app-rsc-redirect-flight.js";
10
10
  //#region src/server/app-page-execution.ts
11
11
  /**
12
- * Builds the canonical `NEXT_REDIRECT;<type>;<url>;<status>;` digest that
13
- * Next.js encodes on `redirect()` / `permanentRedirect()` throws. Used when
14
- * we synthesize a flight payload for an RSC navigation: the digest must
15
- * round-trip through the client's `RedirectErrorBoundary` so the same
16
- * `getURLFromRedirectError` / `getRedirectTypeFromError` helpers decode it.
17
- *
18
- * The URL is included verbatim, not encoded — Next.js's `getRedirectError`
19
- * sets `digest = ${CODE};${type};${url};${status};` with the raw URL, and the
20
- * client decodes via `error.digest.split(';').slice(2, -2).join(';')`. We
21
- * default `type=replace` because `redirect()` is replace-style outside of
22
- * server actions, matching Next.js's `getRedirectError` default.
23
- *
24
- * Reference:
25
- * `.nextjs-ref/packages/next/src/client/components/redirect.ts:20-23`
26
- * `.nextjs-ref/packages/next/src/client/components/redirect-error.ts`
27
- */
28
- function formatNextRedirectDigest(options) {
29
- return `NEXT_REDIRECT;replace;${options.url};${options.statusCode};`;
30
- }
31
- /**
32
12
  * Marker we tag onto a thrown redirect/notFound error when it originates from
33
13
  * `generateMetadata()` (vs. a server component itself). Metadata resolution is
34
14
  * suspended/streamed in Next.js, so a redirect from metadata is not emitted as
@@ -73,12 +53,13 @@ function mergeAppPageSpecialErrorHeaders(response, middlewareContext) {
73
53
  function resolveAppPageSpecialError(error) {
74
54
  if (!(error && typeof error === "object" && "digest" in error)) return null;
75
55
  const digest = String(error.digest);
76
- const fromMetadata = error[APP_PAGE_METADATA_ERROR_MARKER] === true;
56
+ const fromMetadata = Reflect.get(error, APP_PAGE_METADATA_ERROR_MARKER) === true;
77
57
  const redirect = parseNextRedirectDigest(digest);
78
58
  if (redirect) return {
79
59
  kind: "redirect",
80
60
  location: redirect.url,
81
61
  statusCode: redirect.status,
62
+ type: redirect.type === "push" ? "push" : "replace",
82
63
  ...fromMetadata ? { fromMetadata: true } : {}
83
64
  };
84
65
  const httpError = parseNextHttpErrorDigest(digest);
@@ -97,17 +78,15 @@ function resolveAppPageSpecialError(error) {
97
78
  * in `app-render.tsx`: a `redirect("/about")` call from a page mounted at
98
79
  * `/blog` (basePath) produces `Location: /blog/about`.
99
80
  *
100
- * Skips prefixing when:
101
- * - basePath is unset / empty
102
- * - the target is a full URL pointing at a different origin (external redirect)
103
- * - the target already starts with the basePath (caller did the work themselves)
81
+ * Skips prefixing only when basePath is unset or the raw target does not start
82
+ * with `/`, matching Next.js's literal `addPathPrefix()` contract.
104
83
  */
105
- function applyAppPageRedirectBasePath(location, requestUrl, basePath) {
106
- const resolved = new URL(location, requestUrl);
107
- const requestOrigin = new URL(requestUrl).origin;
108
- if (!basePath || resolved.origin !== requestOrigin) return resolved.toString();
109
- resolved.pathname = addBasePathToPathname(resolved.pathname, basePath);
110
- return resolved.toString();
84
+ function applyAppPageRedirectBasePath(location, basePath) {
85
+ if (!basePath || !location.startsWith("/")) return location;
86
+ const queryIndex = location.indexOf("?");
87
+ const hashIndex = location.indexOf("#");
88
+ const suffixIndex = queryIndex === -1 ? hashIndex : hashIndex === -1 ? queryIndex : Math.min(queryIndex, hashIndex);
89
+ return `${basePath}${suffixIndex === -1 ? location : location.slice(0, suffixIndex)}${suffixIndex === -1 ? "" : location.slice(suffixIndex)}`;
111
90
  }
112
91
  /**
113
92
  * Returns a path-relative form (`/foo?bar`) of an absolute URL when it shares
@@ -141,9 +120,10 @@ function buildMetadataRedirectHtmlResponse(options) {
141
120
  async function buildAppPageSpecialErrorResponse(options) {
142
121
  if (options.specialError.kind === "redirect") {
143
122
  options.clearRequestContext();
144
- const prefixedLocation = applyAppPageRedirectBasePath(options.specialError.location, options.request.url, options.basePath);
123
+ const prefixedLocation = applyAppPageRedirectBasePath(options.specialError.location, options.basePath);
145
124
  const digestUrl = sameOriginPathOrAbsolute(prefixedLocation, options.request.url);
146
125
  const digest = formatNextRedirectDigest({
126
+ type: options.specialError.type ?? "replace",
147
127
  url: digestUrl,
148
128
  statusCode: options.specialError.statusCode
149
129
  });
@@ -155,14 +135,13 @@ async function buildAppPageSpecialErrorResponse(options) {
155
135
  });
156
136
  if (Boolean(options.buildRscRedirectFlightStream) && options.isRscRequest && options.buildRscRedirectFlightStream) {
157
137
  const stream = options.buildRscRedirectFlightStream({ digest });
158
- const headers = new Headers({
159
- "Content-Type": VINEXT_RSC_CONTENT_TYPE,
160
- [VINEXT_RSC_REDIRECT_HEADER]: digestUrl
161
- });
138
+ const headers = new Headers({ "Content-Type": VINEXT_RSC_CONTENT_TYPE });
162
139
  applyEdgeRuntimeHeader(headers, options.isEdgeRuntime);
163
140
  applyRscCompatibilityIdHeader(headers);
164
141
  applyRscDeploymentIdHeader(headers);
165
142
  mergeMiddlewareResponseHeaders(headers, options.middlewareContext?.headers ?? null);
143
+ headers.set(VINEXT_RSC_REDIRECT_HEADER, digestUrl);
144
+ headers.set(VINEXT_RSC_REDIRECT_TYPE_HEADER, options.specialError.type ?? "replace");
166
145
  const pendingCookies = options.getAndClearPendingCookies?.() ?? [];
167
146
  for (const cookie of pendingCookies) headers.append("Set-Cookie", cookie);
168
147
  return new Response(stream, {
@@ -313,6 +292,19 @@ async function readAppPageBinaryStream(stream) {
313
292
  }
314
293
  return buffer.buffer;
315
294
  }
295
+ async function bufferAppPageBinaryStream(stream) {
296
+ const reader = stream.getReader();
297
+ const chunks = [];
298
+ for (;;) {
299
+ const { done, value } = await reader.read();
300
+ if (done) break;
301
+ chunks.push(value);
302
+ }
303
+ return new ReadableStream({ start(controller) {
304
+ for (const chunk of chunks) controller.enqueue(chunk);
305
+ controller.close();
306
+ } });
307
+ }
316
308
  function teeAppPageRscStreamForCapture(stream, shouldCapture) {
317
309
  if (!shouldCapture) return { ssrStream: stream };
318
310
  const [ssrStream, sideStream] = stream.tee();
@@ -326,4 +318,4 @@ function buildAppPageFontLinkHeader(preloads) {
326
318
  return preloads.map((preload) => `<${preload.href}>; rel=preload; as=font; type=${preload.type}; crossorigin`).join(", ");
327
319
  }
328
320
  //#endregion
329
- export { buildAppPageFontLinkHeader, buildAppPageSpecialErrorResponse, probeAppPageComponent, probeAppPageLayouts, probeAppPageThrownError, readAppPageBinaryStream, resolveAppPageSpecialError, tagAppPageMetadataError, teeAppPageRscStreamForCapture };
321
+ export { bufferAppPageBinaryStream, buildAppPageFontLinkHeader, buildAppPageSpecialErrorResponse, probeAppPageComponent, probeAppPageLayouts, probeAppPageThrownError, readAppPageBinaryStream, resolveAppPageSpecialError, tagAppPageMetadataError, teeAppPageRscStreamForCapture };
@@ -8,6 +8,14 @@ import { applyFileBasedMetadata } from "./file-based-metadata.js";
8
8
  type AppPageSearchParams = Record<string, string | string[]>;
9
9
  type AppPageHeadModule = Record<string, unknown>;
10
10
  type ApplyAppPageFileBasedMetadata = typeof applyFileBasedMetadata;
11
+ type OrderedAppPageMetadataSource<TModule extends AppPageHeadModule = AppPageHeadModule> = {
12
+ /** Preserve an empty result as the most specific file-metadata source. */includeWhenEmpty?: boolean;
13
+ module: TModule;
14
+ params: AppPageParams;
15
+ routeSegments: readonly string[];
16
+ searchParams?: AppPageSearchParams;
17
+ searchParamsObserver?: ThenableParamsObserver;
18
+ };
11
19
  type AppPageHeadParallelRoute<TModule extends AppPageHeadModule = AppPageHeadModule> = {
12
20
  layoutParams?: readonly AppPageParams[] | null;
13
21
  layoutModule?: TModule | null;
@@ -17,11 +25,19 @@ type AppPageHeadParallelRoute<TModule extends AppPageHeadModule = AppPageHeadMod
17
25
  params?: AppPageParams | null;
18
26
  routeSegments?: readonly string[] | null;
19
27
  };
28
+ type ActiveParallelRouteHeadInput<TModule extends AppPageHeadModule = AppPageHeadModule> = {
29
+ head: AppPageHeadParallelRoute<TModule>;
30
+ notFoundModule?: TModule | null;
31
+ notFoundParams?: AppPageParams | null;
32
+ ownerTreePosition: number;
33
+ };
20
34
  type AppPageHeadSlot<TModule extends AppPageHeadModule = AppPageHeadModule> = {
21
35
  configLayouts?: readonly (TModule | null | undefined)[] | null;
22
36
  configLayoutTreePositions?: readonly number[] | null;
23
37
  layout?: TModule | null;
24
38
  layoutIndex?: number;
39
+ notFound?: TModule | null;
40
+ notFoundTreePosition?: number | null;
25
41
  page?: TModule | null;
26
42
  routeSegments?: readonly string[] | null;
27
43
  };
@@ -30,8 +46,12 @@ type ResolveActiveParallelRouteHeadInputsOptions<TModule extends AppPageHeadModu
30
46
  interceptBranchSegments?: readonly string[] | null;
31
47
  interceptLayoutSegments?: readonly (readonly string[])[] | null;
32
48
  interceptPage?: TModule | null;
49
+ interceptNotFoundBranchSegments?: readonly string[] | null;
50
+ interceptNotFound?: TModule | null;
51
+ interceptNotFoundTreePosition?: number | null;
33
52
  interceptParams?: AppPageParams | null;
34
53
  interceptSlotKey?: string | null;
54
+ interceptSourcePageSegments?: readonly string[] | null;
35
55
  layoutTreePositions?: readonly number[] | null;
36
56
  params: AppPageParams;
37
57
  routeSegments: readonly string[];
@@ -59,6 +79,18 @@ type ResolveAppPageHeadOptions<TModule extends AppPageHeadModule = AppPageHeadMo
59
79
  searchParams?: URLSearchParams | null;
60
80
  searchParamsObserver?: ThenableParamsObserver;
61
81
  };
82
+ type AppPageMetadataOutputOptions = {
83
+ applyFileBasedMetadata?: ApplyAppPageFileBasedMetadata;
84
+ basePath?: string;
85
+ fallbackOnFileMetadataError?: boolean;
86
+ metadataRoutes: readonly MetadataFileRoute[];
87
+ params: AppPageParams;
88
+ routePath: string;
89
+ routeSegments?: readonly string[] | null;
90
+ };
91
+ type ResolveOrderedAppPageMetadataOptions<TModule extends AppPageHeadModule = AppPageHeadModule> = AppPageMetadataOutputOptions & {
92
+ sources: readonly OrderedAppPageMetadataSource<TModule>[];
93
+ };
62
94
  type ResolveAppPageHeadResult = {
63
95
  hasDynamicMetadata: boolean;
64
96
  hasSearchParams: boolean;
@@ -66,12 +98,32 @@ type ResolveAppPageHeadResult = {
66
98
  pageSearchParams: AppPageSearchParams;
67
99
  viewport: Viewport;
68
100
  };
101
+ type PreparedAppPageHead = Omit<ResolveAppPageHeadResult, "metadata" | "viewport"> & {
102
+ metadata: Promise<Metadata | null>;
103
+ viewport: Promise<Viewport>;
104
+ };
69
105
  type AppPageSearchParamsCollection = {
70
106
  hasSearchParams: boolean;
71
107
  pageSearchParams: AppPageSearchParams;
72
108
  };
73
- declare function resolveActiveParallelRouteHeadInputs<TModule extends AppPageHeadModule>(options: ResolveActiveParallelRouteHeadInputsOptions<TModule>): AppPageHeadParallelRoute<TModule>[];
109
+ declare function resolveActiveParallelRouteHeadInputs<TModule extends AppPageHeadModule>(options: ResolveActiveParallelRouteHeadInputsOptions<TModule>): ActiveParallelRouteHeadInput<TModule>[];
74
110
  declare function collectAppPageSearchParams(searchParams: URLSearchParams | null | undefined): AppPageSearchParamsCollection;
111
+ /**
112
+ * Resolve an explicit metadata-source sequence.
113
+ *
114
+ * Route-specific conventions own source selection and ordering. This resolver
115
+ * only supplies each source with its accumulated parent, merges the results,
116
+ * and applies file-based metadata at the end.
117
+ */
118
+ declare function resolveOrderedAppPageMetadata<TModule extends AppPageHeadModule>(options: ResolveOrderedAppPageMetadataOptions<TModule>): Promise<Metadata | null>;
75
119
  declare function resolveAppPageHead<TModule extends AppPageHeadModule>(options: ResolveAppPageHeadOptions<TModule>): Promise<ResolveAppPageHeadResult>;
120
+ /**
121
+ * Start metadata and viewport resolution without coupling their completion.
122
+ *
123
+ * Live document renders can place the metadata promise behind Suspense while
124
+ * still waiting for viewport tags before the shell is emitted. Blocking
125
+ * callers use {@link resolveAppPageHead} and observe the same result as before.
126
+ */
127
+ declare function prepareAppPageHead<TModule extends AppPageHeadModule>(options: ResolveAppPageHeadOptions<TModule>): PreparedAppPageHead;
76
128
  //#endregion
77
- export { AppPageSearchParams, ApplyAppPageFileBasedMetadata, collectAppPageSearchParams, resolveActiveParallelRouteHeadInputs, resolveAppPageHead };
129
+ export { ActiveParallelRouteHeadInput, AppPageHeadModule, AppPageHeadParallelRoute, AppPageSearchParams, ApplyAppPageFileBasedMetadata, OrderedAppPageMetadataSource, PreparedAppPageHead, ResolveAppPageHeadResult, ResolveOrderedAppPageMetadataOptions, collectAppPageSearchParams, prepareAppPageHead, resolveActiveParallelRouteHeadInputs, resolveAppPageHead, resolveOrderedAppPageMetadata };