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,4 +1,4 @@
1
- import { VINEXT_CLIENT_REUSE_MANIFEST_HEADER, VINEXT_PARAMS_HEADER, VINEXT_RSC_REDIRECT_HEADER } from "./headers.js";
1
+ import { VINEXT_CLIENT_REUSE_MANIFEST_HEADER, VINEXT_PARAMS_HEADER, VINEXT_RSC_REDIRECT_HEADER, VINEXT_RSC_REDIRECT_TYPE_HEADER } from "./headers.js";
2
2
  import { AppElementsWire } from "./app-elements-wire.js";
3
3
  import { getMountedSlotIdsHeader, resolveVisitedResponseInterceptionContext } from "./app-elements.js";
4
4
  import { AppRouterContext } from "../shims/internal/app-router-context.js";
@@ -24,8 +24,7 @@ import { readHistoryStatePreviousNextUrl } from "./app-history-state.js";
24
24
  import { AppBrowserMpaNavigationScheduler } from "./app-browser-mpa-navigation.js";
25
25
  import { blockDangerousStreamedRscRedirect } from "./app-browser-rsc-redirect.js";
26
26
  import { navigationPlanner } from "./navigation-planner.js";
27
- import { resolveHybridClientRewriteHref } from "../shims/internal/hybrid-client-route-owner.js";
28
- import { DYNAMIC_NAVIGATION_CACHE_TTL, PREFETCH_CACHE_TTL, __basePath, appRouterInstance, commitClientNavigationState, consumePrefetchResponseForNavigation, createCachedRscResponseSnapshot, createClientNavigationRenderSnapshot, createSnapshotPathAndSearch, deletePrefetchResponseSnapshot, getClientNavigationRenderContext, getMountedSlotsHeader, getPrefetchCache, hasPrefetchCacheEntryForNavigation, invalidatePrefetchCache, pushHistoryStateWithoutNotify, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, resolvePrefetchCacheEntryMountedSlotsHeader, restoreRscResponse, saveScrollPosition, seedPrefetchResponseSnapshot, setClientParams, setMountedSlotsHeader, setPendingPathname, useRouter } from "../shims/navigation.js";
27
+ import { DYNAMIC_NAVIGATION_CACHE_TTL, PREFETCH_CACHE_TTL, __basePath, appRouterInstance, commitClientNavigationState, consumePrefetchResponseForNavigation, createCachedRscResponseSnapshot, createClientNavigationRenderSnapshot, createSnapshotPathAndSearch, deletePrefetchResponseSnapshot, getClientNavigationRenderContext, getMountedSlotsHeader, getPrefetchCache, hasPrefetchCacheEntryForNavigation, invalidatePrefetchCache, preloadHybridClientRouteOwner, pushHistoryStateWithoutNotify, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, resolveLoadedHybridClientRewriteHref, resolvePrefetchCacheEntryMountedSlotsHeader, restoreRscResponse, saveScrollPosition, seedPrefetchResponseSnapshot, setClientParams, setMountedSlotsHeader, setPendingPathname, useRouter } from "../shims/navigation.js";
29
28
  import { chunksToReadableStream, createProgressiveRscStream, getVinextBrowserGlobal } from "./app-browser-stream.js";
30
29
  import { COMMITTED_CACHE_APP_NAVIGATION_PAYLOAD_ORIGIN, FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN, VISITED_CACHE_APP_NAVIGATION_PAYLOAD_ORIGIN, isCacheRestorableAppPayloadMetadata, isCompleteAppPayloadMetadata, resolveInterceptionContextFromPreviousNextUrl } from "./app-browser-state.js";
31
30
  import { clearHardNavigationLoopGuard, createAppBrowserNavigationController, createBasePathStrippedPathAndSearch } from "./app-browser-navigation-controller.js";
@@ -43,6 +42,7 @@ import { createRoot, hydrateRoot } from "react-dom/client";
43
42
  import { createFromFetch, createFromReadableStream, setServerCallback } from "@vitejs/plugin-rsc/browser";
44
43
  import { hasServerActions, loadServerActionClient } from "virtual:vinext-app-capabilities";
45
44
  //#region src/server/app-browser-entry.ts
45
+ const HAS_CLIENT_REWRITES = process.env.__VINEXT_HAS_CLIENT_REWRITES !== "false";
46
46
  function toActionType(kind) {
47
47
  return kind === "traverse" ? "traverse" : "navigate";
48
48
  }
@@ -597,9 +597,10 @@ function BrowserRoot({ hydrationCachePublication, initialElements, initialNaviga
597
597
  resetKey: treeState.renderId,
598
598
  onCatch: handleDevRecoveryBoundaryCatch
599
599
  }, innerTree) : innerTree;
600
+ const scrollScopedTree = createElement(AppRouterScrollCommitProvider, { commitId: treeState.renderId }, committedTree);
600
601
  const rootErrorTree = createElement(GlobalErrorBoundary, {
601
602
  fallback: DEFAULT_GLOBAL_ERROR_COMPONENT,
602
- children: createElement(AppRouterScrollCommitProvider, { commitId: treeState.renderId }, committedTree)
603
+ children: scrollScopedTree
603
604
  });
604
605
  const ClientNavigationRenderContext = getClientNavigationRenderContext();
605
606
  if (!ClientNavigationRenderContext) return rootErrorTree;
@@ -737,6 +738,7 @@ async function main() {
737
738
  if (!claimInitialAppRouterBootstrap()) return;
738
739
  if (hasServerActions) registerServerActionCallback();
739
740
  installAppNavigationFailureListeners();
741
+ if (HAS_CLIENT_REWRITES) await preloadHybridClientRouteOwner();
740
742
  let devErrorOverlay = null;
741
743
  if (import.meta.env.DEV) {
742
744
  devErrorOverlay = await import("../client/dev-error-overlay.js");
@@ -763,7 +765,8 @@ function bootstrapHydration(rscStream, devErrorOverlay, initialRscBootstrap) {
763
765
  const metadata = AppElementsWire.readMetadata(elements);
764
766
  if (!isCompleteAppPayloadMetadata(metadata)) return;
765
767
  const mountedSlotsHeader = getMountedSlotIdsHeader(elements);
766
- const rscUrl = await createRscRequestUrl(initialPathAndSearch, createRscRequestHeaders({ mountedSlotsHeader }));
768
+ const headers = createRscRequestHeaders({ mountedSlotsHeader });
769
+ const rscUrl = await createRscRequestUrl(initialPathAndSearch, headers);
767
770
  if (cacheGeneration !== clientNavigationCacheGeneration) return;
768
771
  const snapshot = {
769
772
  compatibilityIdHeader: CLIENT_RSC_COMPATIBILITY_ID,
@@ -851,9 +854,9 @@ function bootstrapHydration(rscStream, devErrorOverlay, initialRscBootstrap) {
851
854
  let redirectCount = redirectDepth;
852
855
  let detachedNavigationCommits = false;
853
856
  const activeTraversalIntent = navigationKind === "traverse" ? traversalIntent ?? historyController.resolveTraversalIntent(window.history.state) : null;
854
- const performHardNavigationForScrollIntent = (targetHref) => {
857
+ const performHardNavigationForScrollIntent = (targetHref, mode) => {
855
858
  consumeAppRouterScrollIntent(scrollIntent ?? null);
856
- const didNavigate = browserNavigationController.performHardNavigation(targetHref);
859
+ const didNavigate = browserNavigationController.performHardNavigation(targetHref, mode);
857
860
  if (!didNavigate) clearAppNavigationFailureTarget(targetHref);
858
861
  return didNavigate;
859
862
  };
@@ -890,7 +893,7 @@ function bootstrapHydration(rscStream, devErrorOverlay, initialRscBootstrap) {
890
893
  mountedSlotsHeader
891
894
  });
892
895
  const rscUrl = await createRscRequestUrl(url.pathname + url.search, requestHeaders);
893
- const rewrittenNavigationHref = navigationKind === "navigate" ? resolveHybridClientRewriteHref(currentHref, __basePath) : null;
896
+ const rewrittenNavigationHref = navigationKind === "navigate" && HAS_CLIENT_REWRITES ? resolveLoadedHybridClientRewriteHref(currentHref, __basePath) : null;
894
897
  const additionalPrefetchRscUrls = rewrittenNavigationHref && rewrittenNavigationHref !== currentHref ? [await createRscRequestUrl(rewrittenNavigationHref, requestHeaders)] : [];
895
898
  const visitedResponseCandidate = shouldBypassNavigationCache ? {
896
899
  cacheKey: AppElementsWire.encodeCacheKey(rscUrl, requestInterceptionContext),
@@ -1033,6 +1036,8 @@ function bootstrapHydration(rscStream, devErrorOverlay, initialRscBootstrap) {
1033
1036
  if (!browserNavigationController.isCurrentNavigation(navId)) return;
1034
1037
  const navContentType = navResponse.headers.get("content-type") ?? "";
1035
1038
  const streamedRedirectTarget = navResponse.headers.get(VINEXT_RSC_REDIRECT_HEADER);
1039
+ const streamedRedirectTypeHeader = navResponse.headers.get(VINEXT_RSC_REDIRECT_TYPE_HEADER);
1040
+ const streamedRedirectType = streamedRedirectTypeHeader === "push" || streamedRedirectTypeHeader === "replace" ? streamedRedirectTypeHeader : null;
1036
1041
  if (blockDangerousStreamedRscRedirect(navResponse, streamedRedirectTarget)) return;
1037
1042
  const liveFetchDecision = navigationPlanner.classifyRscFetchResult({
1038
1043
  clientCompatibilityId: CLIENT_RSC_COMPATIBILITY_ID,
@@ -1047,13 +1052,14 @@ function bootstrapHydration(rscStream, devErrorOverlay, initialRscBootstrap) {
1047
1052
  responseOk: navResponse.ok,
1048
1053
  responseUrl: navResponseUrl ?? navResponse.url,
1049
1054
  source: "live",
1050
- streamedRedirectTarget
1055
+ streamedRedirectTarget,
1056
+ streamedRedirectType
1051
1057
  });
1052
1058
  if (liveFetchDecision.kind === "hardNavigate") {
1053
1059
  if (liveFetchDecision.discardBody) navResponse.body?.cancel().catch(() => {});
1054
1060
  if (liveFetchDecision.reason === "redirectDepthExhausted") console.error("[vinext] Too many RSC redirects — aborting navigation to prevent infinite loop.");
1055
1061
  if (liveFetchDecision.reason === "streamedRedirectLoop") console.error("[vinext] RSC streamed redirect resolved to the current URL — aborting navigation to prevent infinite loop.");
1056
- performHardNavigationForScrollIntent(liveFetchDecision.url);
1062
+ performHardNavigationForScrollIntent(liveFetchDecision.url, liveFetchDecision.hardNavigationMode);
1057
1063
  return;
1058
1064
  }
1059
1065
  if (liveFetchDecision.kind === "followRedirect") {
@@ -1204,7 +1210,8 @@ function bootstrapHydration(rscStream, devErrorOverlay, initialRscBootstrap) {
1204
1210
  }
1205
1211
  };
1206
1212
  import.meta.hot.on("rsc:update", () => {
1207
- handleRscUpdate(++latestRscHmrUpdateId);
1213
+ const updateId = ++latestRscHmrUpdateId;
1214
+ handleRscUpdate(updateId);
1208
1215
  });
1209
1216
  }
1210
1217
  }
@@ -18,7 +18,7 @@ type AppBrowserHistoryControllerDeps = {
18
18
  readHistoryState: () => unknown; /** Reads `window.location.href`. Injected so the controller stays unit-testable. */
19
19
  readCurrentHref: () => string; /** Wraps `pushHistoryStateWithoutNotify(state, "", href)`. */
20
20
  pushHistoryState: (state: unknown, href: string) => void; /** Wraps `replaceHistoryStateWithoutNotify(state, "", href)`. */
21
- replaceHistoryState: (state: unknown, href: string) => void;
21
+ replaceHistoryState: (state: unknown, href?: string) => void;
22
22
  readVisibleNavigationMetadata: () => VisibleNavigationMetadata | null;
23
23
  };
24
24
  /**
@@ -158,9 +158,9 @@ var AppBrowserHistoryController = class {
158
158
  bfcacheVersion: bfcacheIds === void 0 ? void 0 : this.#restorableClientState.currentBfcacheVersion,
159
159
  previousNextUrl
160
160
  });
161
- this.#replaceHistoryState(nextHistoryState, this.#readCurrentHref());
161
+ this.#replaceHistoryState(nextHistoryState);
162
162
  if (this.#isHistoryStateNavigationMetadataInSync(this.#readHistoryState(), previousNextUrl, bfcacheIds)) return;
163
- this.#replaceHistoryState(nextHistoryState, this.#readCurrentHref());
163
+ this.#replaceHistoryState(nextHistoryState);
164
164
  }
165
165
  #isHistoryStateNavigationMetadataInSync(state, previousNextUrl, bfcacheIds) {
166
166
  return readHistoryStatePreviousNextUrl(state) === previousNextUrl && (bfcacheIds === void 0 || areBfcacheIdMapsEqual(readHistoryStateBfcacheIds(state), bfcacheIds) && this.#restorableClientState.isCurrentBfcacheVersion(state));
@@ -179,7 +179,7 @@ var AppBrowserHistoryController = class {
179
179
  bfcacheVersion: this.#restorableClientState.currentBfcacheVersion,
180
180
  previousNextUrl: options.previousNextUrl,
181
181
  traversalIndex: this.#currentHistoryTraversalIndex
182
- }), this.#readCurrentHref());
182
+ }));
183
183
  }
184
184
  /**
185
185
  * Resolves a restorable snapshot candidate for the given history entry and
@@ -259,12 +259,14 @@ function createAppBrowserNavigationController(deps = {}) {
259
259
  }
260
260
  if (visibleCommitMode === "synchronous") {
261
261
  flushSync(() => {
262
- setter(captureCandidateState(applyApprovedVisibleCommit(getBrowserRouterState(), commit)));
262
+ const committedState = captureCandidateState(applyApprovedVisibleCommit(getBrowserRouterState(), commit));
263
+ setter(committedState);
263
264
  });
264
265
  return;
265
266
  }
266
267
  startTransition(() => {
267
- setter(captureCandidateState(applyApprovedVisibleCommit(getBrowserRouterState(), commit)));
268
+ const committedState = captureCandidateState(applyApprovedVisibleCommit(getBrowserRouterState(), commit));
269
+ setter(committedState);
268
270
  });
269
271
  }
270
272
  function dispatchSynchronousVisibleCommit(commit) {
@@ -49,7 +49,7 @@ var ServerActionRedirectError = class extends Error {
49
49
  const redirectUrl = new URL(target.href, window.location.href);
50
50
  const redirectHref = redirectUrl.pathname + redirectUrl.search + redirectUrl.hash;
51
51
  const redirectType = target.type === "push" ? "push" : "replace";
52
- this.digest = `NEXT_REDIRECT;${redirectType};${encodeURIComponent(redirectHref)};${target.status};`;
52
+ this.digest = `NEXT_REDIRECT;${redirectType};${redirectHref};${target.status};`;
53
53
  }
54
54
  };
55
55
  async function invokeClientServerAction(id, args, actionInitiation, deps) {
@@ -1,6 +1,7 @@
1
1
  import { ArtifactCompatibilityEnvelope } from "./artifact-compatibility.js";
2
2
  import { CacheEntryReuseProof, RenderObservation } from "./cache-proof.js";
3
3
  import { ClientReuseManifestSkipDisposition } from "./client-reuse-manifest.js";
4
+ import { compareStrings } from "../utils/compare.js";
4
5
  import { ReactNode } from "react";
5
6
 
6
7
  //#region src/server/app-elements-wire.d.ts
@@ -42,7 +43,7 @@ type AppElementsInterception = Readonly<{
42
43
  targetMatchedUrl: string;
43
44
  targetRouteId: string;
44
45
  }>;
45
- declare const compareAppElementsSlotIds: (left: string, right: string) => number;
46
+ declare const compareAppElementsSlotIds: typeof compareStrings;
46
47
  declare function normalizeAppElementsSlotBindings(slotBindings: readonly AppElementsSlotBinding[], options?: {
47
48
  layoutIds?: readonly string[];
48
49
  }): readonly AppElementsSlotBinding[];
@@ -5,6 +5,7 @@ import { AppPageParams } from "./app-page-boundary.js";
5
5
  import { AppPageFontPreload } from "./app-page-execution.js";
6
6
  import { AppPageMiddlewareContext } from "./app-page-response.js";
7
7
  import { ApplyAppPageFileBasedMetadata } from "./app-page-head.js";
8
+ import { AppPageInterceptOptions } from "./app-page-element-builder.js";
8
9
  import { AppPageSsrHandler } from "./app-page-stream.js";
9
10
  import { AppPageBoundaryRoute } from "./app-page-boundary-render.js";
10
11
  import { ReactNode } from "react";
@@ -32,6 +33,7 @@ type AppFallbackRendererOptions<TModule extends AppPageModule = AppPageModule> =
32
33
  clearRequestContext: () => void;
33
34
  createRscOnErrorHandler: (request: Request, pathname: string, routePath: string) => AppPageBoundaryOnError;
34
35
  fontProviders: AppFallbackRendererFontProviders;
36
+ getAndClearPendingCookies?: () => string[];
35
37
  getNavigationContext: () => NavigationContext | null;
36
38
  globalErrorModule?: TModule | null; /** Whether experimental.globalNotFound is enabled for route-miss 404s. */
37
39
  globalNotFoundEnabled?: boolean;
@@ -57,6 +59,13 @@ type AppFallbackRendererOptions<TModule extends AppPageModule = AppPageModule> =
57
59
  metadataRoutes: MetadataFileRoute[]; /** Configured next.config `basePath`, threaded into file-based metadata href emission. */
58
60
  basePath?: string; /** Configured next.config `trailingSlash`, threaded into canonical URL rendering. */
59
61
  trailingSlash?: boolean;
62
+ /**
63
+ * Serialized next.config `htmlLimitedBots` regexp source. Used to decide, per
64
+ * request user-agent, whether a `generateMetadata()` redirect thrown from a
65
+ * fallback boundary should stream (200) or block (307) — matching the
66
+ * matched-page dispatch path via `shouldServeStreamingMetadata`.
67
+ */
68
+ htmlLimitedBots?: string;
60
69
  resolveChildSegments: (routeSegments: readonly string[], treePosition: number, params: AppPageParams) => string[];
61
70
  rootBoundaries: AppFallbackRendererRootBoundaries<TModule>;
62
71
  rscRenderer: (element: ReactNode | AppElements, options: {
@@ -73,6 +82,7 @@ type AppFallbackRendererCallContext = {
73
82
  * render path. Defaults to `false` when no route is matched.
74
83
  */
75
84
  isEdgeRuntime?: boolean;
85
+ routePathname?: string;
76
86
  sourcePageSegments?: readonly string[] | null;
77
87
  };
78
88
  type AppFallbackRenderer<TModule extends AppPageModule = AppPageModule> = {
@@ -80,6 +90,7 @@ type AppFallbackRenderer<TModule extends AppPageModule = AppPageModule> = {
80
90
  renderHttpAccessFallback: (route: AppPageBoundaryRoute<TModule> | null, statusCode: number, isRscRequest: boolean, request: Request, opts: {
81
91
  boundaryComponent?: AppPageComponent | null;
82
92
  boundaryModule?: TModule | null;
93
+ intercept?: AppPageInterceptOptions<TModule> | null;
83
94
  layouts?: readonly (TModule | null | undefined)[] | null;
84
95
  matchedParams?: AppPageParams;
85
96
  }, scriptNonce: string | undefined, middlewareContext: AppPageMiddlewareContext, callContext?: AppFallbackRendererCallContext) => Promise<Response | null>;
@@ -1,5 +1,6 @@
1
- import { renderAppPageErrorBoundary, renderAppPageHttpAccessFallback } from "./app-page-boundary-render.js";
2
1
  import { DEFAULT_GLOBAL_ERROR_MODULE } from "./default-global-error-module.js";
2
+ import { shouldServeStreamingMetadata } from "./streaming-metadata.js";
3
+ import { renderAppPageErrorBoundary, renderAppPageHttpAccessFallback } from "./app-page-boundary-render.js";
3
4
  import { DEFAULT_GLOBAL_NOT_FOUND_MODULE } from "./default-global-not-found-module.js";
4
5
  import { DEFAULT_NOT_FOUND_MODULE } from "./default-not-found-module.js";
5
6
  //#region src/server/app-fallback-renderer.ts
@@ -8,7 +9,7 @@ const EMPTY_MW_CTX = {
8
9
  status: null
9
10
  };
10
11
  function createAppFallbackRenderer(options) {
11
- const { applyFileBasedMetadata, basePath = "", clearRequestContext, createRscOnErrorHandler: buildRscOnErrorHandler, fontProviders, getNavigationContext, globalErrorModule, globalNotFoundEnabled = false, loadGlobalNotFoundModule, makeThenableParams, metadataRoutes, resolveChildSegments, rootBoundaries, rscRenderer, sanitizer, ssrLoader, trailingSlash } = options;
12
+ const { applyFileBasedMetadata, basePath = "", htmlLimitedBots, clearRequestContext, createRscOnErrorHandler: buildRscOnErrorHandler, fontProviders, getAndClearPendingCookies, getNavigationContext, globalErrorModule, globalNotFoundEnabled = false, loadGlobalNotFoundModule, makeThenableParams, metadataRoutes, resolveChildSegments, rootBoundaries, rscRenderer, sanitizer, ssrLoader, trailingSlash } = options;
12
13
  const { rootForbiddenModule, rootLayouts, rootNotFoundModule, rootUnauthorizedModule } = rootBoundaries;
13
14
  const effectiveGlobalErrorModule = globalErrorModule ?? DEFAULT_GLOBAL_ERROR_MODULE;
14
15
  const effectiveRootNotFoundModule = rootNotFoundModule ?? DEFAULT_NOT_FOUND_MODULE;
@@ -20,12 +21,15 @@ function createAppFallbackRenderer(options) {
20
21
  }
21
22
  return {
22
23
  async renderHttpAccessFallback(route, statusCode, isRscRequest, request, opts, scriptNonce, middlewareContext, callContext) {
24
+ const serveStreamingMetadata = shouldServeStreamingMetadata(request.headers.get("user-agent") ?? "", htmlLimitedBots);
23
25
  const useGlobalNotFound = statusCode === 404 && globalNotFoundEnabled && !route && !opts?.boundaryComponent;
24
26
  if (useGlobalNotFound && loadGlobalNotFoundModule) {
25
27
  const globalNotFoundModule = await resolveGlobalNotFoundModule();
26
28
  const globalNotFoundComponent = globalNotFoundModule?.default ?? null;
27
29
  if (globalNotFoundComponent) return renderAppPageHttpAccessFallback({
28
30
  applyFileBasedMetadata,
31
+ basePath,
32
+ trailingSlash,
29
33
  boundaryComponent: globalNotFoundComponent,
30
34
  boundaryModule: globalNotFoundModule ?? null,
31
35
  buildFontLinkHeader: fontProviders.buildFontLinkHeader,
@@ -36,6 +40,7 @@ function createAppFallbackRenderer(options) {
36
40
  getFontLinks: fontProviders.getFontLinks,
37
41
  getFontPreloads: fontProviders.getFontPreloads,
38
42
  getFontStyles: fontProviders.getFontStyles,
43
+ getAndClearPendingCookies,
39
44
  getNavigationContext,
40
45
  globalErrorModule: effectiveGlobalErrorModule,
41
46
  isEdgeRuntime: callContext?.isEdgeRuntime,
@@ -46,6 +51,7 @@ function createAppFallbackRenderer(options) {
46
51
  matchedParams: opts?.matchedParams ?? {},
47
52
  middlewareContext: middlewareContext ?? EMPTY_MW_CTX,
48
53
  metadataRoutes,
54
+ request,
49
55
  requestUrl: request.url,
50
56
  resolveChildSegments,
51
57
  rootForbiddenModule: null,
@@ -55,6 +61,7 @@ function createAppFallbackRenderer(options) {
55
61
  route: null,
56
62
  renderToReadableStream: rscRenderer,
57
63
  scriptNonce,
64
+ serveStreamingMetadata,
58
65
  skipLayoutWrapping: true,
59
66
  statusCode
60
67
  });
@@ -74,8 +81,10 @@ function createAppFallbackRenderer(options) {
74
81
  getFontLinks: fontProviders.getFontLinks,
75
82
  getFontPreloads: fontProviders.getFontPreloads,
76
83
  getFontStyles: fontProviders.getFontStyles,
84
+ getAndClearPendingCookies,
77
85
  getNavigationContext,
78
86
  globalErrorModule: effectiveGlobalErrorModule,
87
+ intercept: opts?.intercept ?? null,
79
88
  isEdgeRuntime: callContext?.isEdgeRuntime,
80
89
  isRscRequest,
81
90
  layoutModules: useGlobalNotFound ? [] : opts?.layouts ?? null,
@@ -84,6 +93,7 @@ function createAppFallbackRenderer(options) {
84
93
  matchedParams: opts?.matchedParams ?? route?.params ?? {},
85
94
  middlewareContext: middlewareContext ?? EMPTY_MW_CTX,
86
95
  metadataRoutes,
96
+ request,
87
97
  requestUrl: request.url,
88
98
  resolveChildSegments,
89
99
  rootForbiddenModule,
@@ -91,8 +101,10 @@ function createAppFallbackRenderer(options) {
91
101
  rootNotFoundModule: routeMissRootNotFoundModule,
92
102
  rootUnauthorizedModule,
93
103
  route: useGlobalNotFound ? null : route,
104
+ routePathname: callContext?.routePathname,
94
105
  renderToReadableStream: rscRenderer,
95
106
  scriptNonce,
107
+ serveStreamingMetadata,
96
108
  skipLayoutWrapping: useGlobalNotFound,
97
109
  sourcePageSegments: callContext?.sourcePageSegments,
98
110
  statusCode
@@ -116,6 +128,7 @@ function createAppFallbackRenderer(options) {
116
128
  getFontLinks: fontProviders.getFontLinks,
117
129
  getFontPreloads: fontProviders.getFontPreloads,
118
130
  getFontStyles: fontProviders.getFontStyles,
131
+ getAndClearPendingCookies,
119
132
  getNavigationContext,
120
133
  globalErrorModule: effectiveGlobalErrorModule,
121
134
  isEdgeRuntime: callContext?.isEdgeRuntime,
@@ -125,6 +138,7 @@ function createAppFallbackRenderer(options) {
125
138
  matchedParams: matchedParams ?? route?.params ?? {},
126
139
  middlewareContext: middlewareContext ?? EMPTY_MW_CTX,
127
140
  metadataRoutes,
141
+ request,
128
142
  requestUrl: request.url,
129
143
  resolveChildSegments,
130
144
  rootLayouts,
@@ -1,7 +1,7 @@
1
1
  import { VINEXT_MW_CTX_HEADER } from "../utils/protocol-headers.js";
2
2
  import { FLIGHT_HEADERS } from "./headers.js";
3
3
  import { buildRequestHeadersFromMiddlewareResponse } from "../utils/middleware-request-headers.js";
4
- import { isExternalUrl, proxyExternalRequest } from "../config/config-matchers.js";
4
+ import { isExternalUrl } from "../utils/external-url.js";
5
5
  import { internalServerErrorResponse } from "./http-error-responses.js";
6
6
  import { cloneRequestWithHeaders, processMiddlewareHeaders } from "./request-pipeline.js";
7
7
  import { executeMiddleware } from "./middleware-runtime.js";
@@ -58,6 +58,7 @@ async function proxyExternalMiddlewareRewrite(request, rewriteUrl, context) {
58
58
  const proxyRequest = requestWithMiddlewareRequestHeaders(request, context.requestHeaders ?? context.headers);
59
59
  setHeadersContext(null);
60
60
  setNavigationContext(null);
61
+ const { proxyExternalRequest } = await import("../config/config-matchers.js");
61
62
  const proxyResponse = await proxyExternalRequest(proxyRequest, rewriteUrl);
62
63
  const headers = new Headers(proxyResponse.headers);
63
64
  processMiddlewareHeaders(headers);
@@ -5,6 +5,8 @@ import { AppPageParams } from "./app-page-boundary.js";
5
5
  import { AppPageFontPreload } from "./app-page-execution.js";
6
6
  import { AppPageMiddlewareContext } from "./app-page-response.js";
7
7
  import { ApplyAppPageFileBasedMetadata } from "./app-page-head.js";
8
+ import { AppPageRouteWiringRoute } from "./app-page-route-wiring.js";
9
+ import { AppPageInterceptOptions } from "./app-page-element-builder.js";
8
10
  import { AppPageSsrHandler } from "./app-page-stream.js";
9
11
  import { ComponentType, ReactNode } from "react";
10
12
 
@@ -19,19 +21,27 @@ type AppPageBoundaryRoute<TModule extends AppPageModule = AppPageModule> = {
19
21
  errorPaths?: readonly TModule[] | null;
20
22
  errors?: readonly (TModule | null | undefined)[] | null;
21
23
  forbidden?: TModule | null;
24
+ forbiddenTreePosition?: number | null;
25
+ forbiddens?: readonly (TModule | null | undefined)[] | null;
22
26
  layoutTreePositions?: readonly number[] | null;
23
27
  layouts?: readonly (TModule | null | undefined)[];
24
28
  notFound?: TModule | null;
29
+ notFounds?: readonly (TModule | null | undefined)[] | null;
30
+ notFoundTreePosition?: number | null;
25
31
  params?: AppPageParams;
26
32
  pattern?: string;
27
33
  routeSegments?: readonly string[];
34
+ slots?: AppPageRouteWiringRoute<TModule>["slots"];
28
35
  unauthorized?: TModule | null;
36
+ unauthorizedTreePosition?: number | null;
37
+ unauthorizeds?: readonly (TModule | null | undefined)[] | null;
29
38
  };
30
39
  type AppPageBoundaryRenderCommonOptions<TModule extends AppPageModule = AppPageModule> = {
31
40
  applyFileBasedMetadata?: ApplyAppPageFileBasedMetadata;
32
41
  buildFontLinkHeader: (preloads: readonly AppPageFontPreload[] | null | undefined) => string;
33
42
  clearRequestContext: () => void;
34
43
  createRscOnErrorHandler: (pathname: string, routePath: string) => AppPageBoundaryOnError;
44
+ getAndClearPendingCookies?: () => string[];
35
45
  getFontLinks: () => string[];
36
46
  getFontPreloads: () => AppPageFontPreload[];
37
47
  getFontStyles: () => string[];
@@ -42,12 +52,24 @@ type AppPageBoundaryRenderCommonOptions<TModule extends AppPageModule = AppPageM
42
52
  loadSsrHandler: () => Promise<AppPageSsrHandler>;
43
53
  makeThenableParams: (params: AppPageParams) => unknown;
44
54
  middlewareContext: AppPageMiddlewareContext;
45
- metadataRoutes: MetadataFileRoute[]; /** Configured next.config `basePath`, threaded into file-based metadata href emission. */
55
+ metadataRoutes: MetadataFileRoute[];
56
+ /**
57
+ * Whether metadata-origin redirects should ride as a 200 streaming response
58
+ * (HTML meta-refresh / RSC flight) rather than a blocking 307. Mirrors the
59
+ * matched-page dispatch decision `shouldServeStreamingMetadata(userAgent,
60
+ * htmlLimitedBots)`: html-limited bots get the blocking 307, so a
61
+ * `generateMetadata()` redirect thrown from a fallback boundary matches the
62
+ * matched-page path instead of always defaulting to streaming. Undefined
63
+ * means "not computed" and is treated as streaming, preserving prior behavior
64
+ * for callers that never hit metadata redirects.
65
+ */
66
+ serveStreamingMetadata?: boolean; /** Configured next.config `basePath`, threaded into file-based metadata href emission. */
46
67
  basePath?: string; /** Configured next.config `trailingSlash`, threaded into canonical URL rendering. */
47
68
  trailingSlash?: boolean;
48
69
  renderToReadableStream: (element: ReactNode | AppElements, options: {
49
70
  onError: AppPageBoundaryOnError;
50
71
  }) => ReadableStream<Uint8Array>;
72
+ request: Request;
51
73
  requestUrl: string;
52
74
  resolveChildSegments: (routeSegments: readonly string[], treePosition: number, params: AppPageParams) => string[];
53
75
  rootLayouts: readonly (TModule | null | undefined)[];
@@ -57,11 +79,13 @@ type AppPageBoundaryRenderCommonOptions<TModule extends AppPageModule = AppPageM
57
79
  type RenderAppPageHttpAccessFallbackOptions<TModule extends AppPageModule = AppPageModule> = {
58
80
  boundaryComponent?: AppPageComponent | null;
59
81
  boundaryModule?: TModule | null;
82
+ intercept?: AppPageInterceptOptions<TModule> | null;
60
83
  layoutModules?: readonly (TModule | null | undefined)[] | null;
61
84
  matchedParams: AppPageParams;
62
85
  rootForbiddenModule?: TModule | null;
63
86
  rootNotFoundModule?: TModule | null;
64
- rootUnauthorizedModule?: TModule | null;
87
+ rootUnauthorizedModule?: TModule | null; /** Normalized, basePath-free application pathname used for route matching. */
88
+ routePathname?: string;
65
89
  route?: AppPageBoundaryRoute<TModule> | null;
66
90
  /**
67
91
  * When true, the resolved boundary is rendered without wrapping it in the