vinext 0.0.52 → 0.0.54

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 (330) hide show
  1. package/README.md +1 -1
  2. package/dist/build/clean-output.d.ts +14 -0
  3. package/dist/build/clean-output.js +36 -0
  4. package/dist/build/clean-output.js.map +1 -0
  5. package/dist/build/inline-css.d.ts +7 -0
  6. package/dist/build/inline-css.js +50 -0
  7. package/dist/build/inline-css.js.map +1 -0
  8. package/dist/build/prerender.d.ts +6 -2
  9. package/dist/build/prerender.js +51 -12
  10. package/dist/build/prerender.js.map +1 -1
  11. package/dist/build/run-prerender.js +10 -1
  12. package/dist/build/run-prerender.js.map +1 -1
  13. package/dist/build/static-export.d.ts +5 -0
  14. package/dist/build/static-export.js +8 -3
  15. package/dist/build/static-export.js.map +1 -1
  16. package/dist/check.js +4 -0
  17. package/dist/check.js.map +1 -1
  18. package/dist/cli.js +19 -4
  19. package/dist/cli.js.map +1 -1
  20. package/dist/client/instrumentation-client-inject.d.ts +34 -0
  21. package/dist/client/instrumentation-client-inject.js +57 -0
  22. package/dist/client/instrumentation-client-inject.js.map +1 -0
  23. package/dist/client/navigation-runtime.d.ts +16 -2
  24. package/dist/client/navigation-runtime.js +16 -1
  25. package/dist/client/navigation-runtime.js.map +1 -1
  26. package/dist/client/vinext-next-data.d.ts +2 -1
  27. package/dist/client/vinext-next-data.js.map +1 -1
  28. package/dist/client/window-next.d.ts +17 -2
  29. package/dist/client/window-next.js.map +1 -1
  30. package/dist/cloudflare/tpr.js +1 -1
  31. package/dist/cloudflare/tpr.js.map +1 -1
  32. package/dist/config/config-matchers.js +2 -1
  33. package/dist/config/config-matchers.js.map +1 -1
  34. package/dist/config/next-config.d.ts +95 -4
  35. package/dist/config/next-config.js +173 -14
  36. package/dist/config/next-config.js.map +1 -1
  37. package/dist/deploy.js +42 -7
  38. package/dist/deploy.js.map +1 -1
  39. package/dist/entries/app-browser-entry.d.ts +11 -1
  40. package/dist/entries/app-browser-entry.js +16 -6
  41. package/dist/entries/app-browser-entry.js.map +1 -1
  42. package/dist/entries/app-rsc-entry.d.ts +12 -3
  43. package/dist/entries/app-rsc-entry.js +41 -8
  44. package/dist/entries/app-rsc-entry.js.map +1 -1
  45. package/dist/entries/app-rsc-manifest.d.ts +21 -1
  46. package/dist/entries/app-rsc-manifest.js +6 -4
  47. package/dist/entries/app-rsc-manifest.js.map +1 -1
  48. package/dist/entries/pages-client-entry.d.ts +4 -1
  49. package/dist/entries/pages-client-entry.js +40 -3
  50. package/dist/entries/pages-client-entry.js.map +1 -1
  51. package/dist/entries/pages-server-entry.js +292 -34
  52. package/dist/entries/pages-server-entry.js.map +1 -1
  53. package/dist/entries/runtime-entry-module.d.ts +1 -10
  54. package/dist/entries/runtime-entry-module.js +2 -12
  55. package/dist/entries/runtime-entry-module.js.map +1 -1
  56. package/dist/index.js +91 -10
  57. package/dist/index.js.map +1 -1
  58. package/dist/plugins/fonts.js +25 -2
  59. package/dist/plugins/fonts.js.map +1 -1
  60. package/dist/plugins/remove-console.d.ts +16 -0
  61. package/dist/plugins/remove-console.js +176 -0
  62. package/dist/plugins/remove-console.js.map +1 -0
  63. package/dist/routing/app-route-graph.d.ts +24 -1
  64. package/dist/routing/app-route-graph.js +52 -4
  65. package/dist/routing/app-route-graph.js.map +1 -1
  66. package/dist/routing/app-router.d.ts +2 -2
  67. package/dist/routing/app-router.js +2 -2
  68. package/dist/routing/app-router.js.map +1 -1
  69. package/dist/routing/file-matcher.d.ts +21 -1
  70. package/dist/routing/file-matcher.js +39 -1
  71. package/dist/routing/file-matcher.js.map +1 -1
  72. package/dist/routing/pages-router.d.ts +1 -1
  73. package/dist/routing/pages-router.js +10 -3
  74. package/dist/routing/pages-router.js.map +1 -1
  75. package/dist/routing/route-trie.js +13 -18
  76. package/dist/routing/route-trie.js.map +1 -1
  77. package/dist/routing/utils.d.ts +11 -1
  78. package/dist/routing/utils.js +15 -1
  79. package/dist/routing/utils.js.map +1 -1
  80. package/dist/server/api-handler.js +19 -10
  81. package/dist/server/api-handler.js.map +1 -1
  82. package/dist/server/app-browser-action-result.d.ts +16 -1
  83. package/dist/server/app-browser-action-result.js +15 -1
  84. package/dist/server/app-browser-action-result.js.map +1 -1
  85. package/dist/server/app-browser-entry.js +47 -28
  86. package/dist/server/app-browser-entry.js.map +1 -1
  87. package/dist/server/app-browser-navigation-controller.d.ts +2 -0
  88. package/dist/server/app-browser-navigation-controller.js +4 -0
  89. package/dist/server/app-browser-navigation-controller.js.map +1 -1
  90. package/dist/server/app-elements-wire.d.ts +13 -4
  91. package/dist/server/app-elements-wire.js +10 -1
  92. package/dist/server/app-elements-wire.js.map +1 -1
  93. package/dist/server/app-elements.d.ts +2 -2
  94. package/dist/server/app-elements.js +2 -2
  95. package/dist/server/app-elements.js.map +1 -1
  96. package/dist/server/app-fallback-renderer.d.ts +27 -8
  97. package/dist/server/app-fallback-renderer.js +19 -8
  98. package/dist/server/app-fallback-renderer.js.map +1 -1
  99. package/dist/server/app-history-state.js +6 -2
  100. package/dist/server/app-history-state.js.map +1 -1
  101. package/dist/server/app-inline-css-client.d.ts +7 -0
  102. package/dist/server/app-inline-css-client.js +37 -0
  103. package/dist/server/app-inline-css-client.js.map +1 -0
  104. package/dist/server/app-interception-context-header.d.ts +33 -0
  105. package/dist/server/app-interception-context-header.js +44 -0
  106. package/dist/server/app-interception-context-header.js.map +1 -0
  107. package/dist/server/app-mounted-slots-header.d.ts +19 -0
  108. package/dist/server/app-mounted-slots-header.js +40 -1
  109. package/dist/server/app-mounted-slots-header.js.map +1 -1
  110. package/dist/server/app-optimistic-routing.js +26 -18
  111. package/dist/server/app-optimistic-routing.js.map +1 -1
  112. package/dist/server/app-page-boundary-render.d.ts +1 -0
  113. package/dist/server/app-page-boundary-render.js +2 -0
  114. package/dist/server/app-page-boundary-render.js.map +1 -1
  115. package/dist/server/app-page-boundary.d.ts +22 -1
  116. package/dist/server/app-page-boundary.js +30 -3
  117. package/dist/server/app-page-boundary.js.map +1 -1
  118. package/dist/server/app-page-cache.d.ts +9 -3
  119. package/dist/server/app-page-cache.js +14 -8
  120. package/dist/server/app-page-cache.js.map +1 -1
  121. package/dist/server/app-page-dispatch.d.ts +13 -1
  122. package/dist/server/app-page-dispatch.js +136 -82
  123. package/dist/server/app-page-dispatch.js.map +1 -1
  124. package/dist/server/app-page-element-builder.d.ts +2 -1
  125. package/dist/server/app-page-element-builder.js +17 -30
  126. package/dist/server/app-page-element-builder.js.map +1 -1
  127. package/dist/server/app-page-execution.d.ts +1 -0
  128. package/dist/server/app-page-execution.js +2 -0
  129. package/dist/server/app-page-execution.js.map +1 -1
  130. package/dist/server/app-page-head.d.ts +1 -0
  131. package/dist/server/app-page-head.js +8 -0
  132. package/dist/server/app-page-head.js.map +1 -1
  133. package/dist/server/app-page-render-identity.d.ts +22 -0
  134. package/dist/server/app-page-render-identity.js +42 -0
  135. package/dist/server/app-page-render-identity.js.map +1 -0
  136. package/dist/server/app-page-render-observation.js +1 -1
  137. package/dist/server/app-page-render.d.ts +9 -1
  138. package/dist/server/app-page-render.js +8 -2
  139. package/dist/server/app-page-render.js.map +1 -1
  140. package/dist/server/app-page-request.d.ts +6 -3
  141. package/dist/server/app-page-request.js +5 -2
  142. package/dist/server/app-page-request.js.map +1 -1
  143. package/dist/server/app-page-response.d.ts +11 -1
  144. package/dist/server/app-page-response.js +16 -4
  145. package/dist/server/app-page-response.js.map +1 -1
  146. package/dist/server/app-page-route-wiring.d.ts +16 -0
  147. package/dist/server/app-page-route-wiring.js +25 -10
  148. package/dist/server/app-page-route-wiring.js.map +1 -1
  149. package/dist/server/app-page-stream.d.ts +12 -0
  150. package/dist/server/app-page-stream.js +3 -0
  151. package/dist/server/app-page-stream.js.map +1 -1
  152. package/dist/server/app-route-handler-dispatch.d.ts +1 -0
  153. package/dist/server/app-route-handler-dispatch.js +3 -0
  154. package/dist/server/app-route-handler-dispatch.js.map +1 -1
  155. package/dist/server/app-route-handler-execution.d.ts +1 -0
  156. package/dist/server/app-route-handler-execution.js +1 -0
  157. package/dist/server/app-route-handler-execution.js.map +1 -1
  158. package/dist/server/app-route-handler-response.js +38 -6
  159. package/dist/server/app-route-handler-response.js.map +1 -1
  160. package/dist/server/app-rsc-handler.d.ts +16 -3
  161. package/dist/server/app-rsc-handler.js +60 -11
  162. package/dist/server/app-rsc-handler.js.map +1 -1
  163. package/dist/server/app-rsc-request-normalization.d.ts +2 -1
  164. package/dist/server/app-rsc-request-normalization.js +6 -4
  165. package/dist/server/app-rsc-request-normalization.js.map +1 -1
  166. package/dist/server/app-segment-config.d.ts +4 -1
  167. package/dist/server/app-segment-config.js +6 -1
  168. package/dist/server/app-segment-config.js.map +1 -1
  169. package/dist/server/app-server-action-execution.d.ts +22 -3
  170. package/dist/server/app-server-action-execution.js +46 -7
  171. package/dist/server/app-server-action-execution.js.map +1 -1
  172. package/dist/server/app-ssr-entry.d.ts +6 -0
  173. package/dist/server/app-ssr-entry.js +57 -6
  174. package/dist/server/app-ssr-entry.js.map +1 -1
  175. package/dist/server/app-ssr-error-meta.js +3 -3
  176. package/dist/server/app-ssr-error-meta.js.map +1 -1
  177. package/dist/server/app-ssr-stream.d.ts +25 -1
  178. package/dist/server/app-ssr-stream.js +237 -19
  179. package/dist/server/app-ssr-stream.js.map +1 -1
  180. package/dist/server/app-static-generation.d.ts +1 -0
  181. package/dist/server/app-static-generation.js +2 -1
  182. package/dist/server/app-static-generation.js.map +1 -1
  183. package/dist/server/client-trace-metadata.d.ts +31 -0
  184. package/dist/server/client-trace-metadata.js +83 -0
  185. package/dist/server/client-trace-metadata.js.map +1 -0
  186. package/dist/server/cookie-utils.d.ts +13 -0
  187. package/dist/server/cookie-utils.js +20 -0
  188. package/dist/server/cookie-utils.js.map +1 -0
  189. package/dist/server/default-not-found-module.d.ts +20 -0
  190. package/dist/server/default-not-found-module.js +20 -0
  191. package/dist/server/default-not-found-module.js.map +1 -0
  192. package/dist/server/dev-server.d.ts +8 -1
  193. package/dist/server/dev-server.js +56 -11
  194. package/dist/server/dev-server.js.map +1 -1
  195. package/dist/server/headers.d.ts +5 -1
  196. package/dist/server/headers.js +5 -1
  197. package/dist/server/headers.js.map +1 -1
  198. package/dist/server/html.d.ts +2 -1
  199. package/dist/server/html.js +6 -1
  200. package/dist/server/html.js.map +1 -1
  201. package/dist/server/image-optimization.d.ts +13 -4
  202. package/dist/server/image-optimization.js +15 -4
  203. package/dist/server/image-optimization.js.map +1 -1
  204. package/dist/server/isr-cache.d.ts +7 -5
  205. package/dist/server/isr-cache.js +17 -6
  206. package/dist/server/isr-cache.js.map +1 -1
  207. package/dist/server/middleware-runtime.js +1 -2
  208. package/dist/server/middleware-runtime.js.map +1 -1
  209. package/dist/server/middleware.js +1 -1
  210. package/dist/server/middleware.js.map +1 -1
  211. package/dist/server/pages-api-route.d.ts +18 -0
  212. package/dist/server/pages-api-route.js +3 -1
  213. package/dist/server/pages-api-route.js.map +1 -1
  214. package/dist/server/pages-body-parser-config.d.ts +60 -0
  215. package/dist/server/pages-body-parser-config.js +79 -0
  216. package/dist/server/pages-body-parser-config.js.map +1 -0
  217. package/dist/server/pages-data-route.js +1 -0
  218. package/dist/server/pages-data-route.js.map +1 -1
  219. package/dist/server/pages-default-404.d.ts +31 -0
  220. package/dist/server/pages-default-404.js +40 -0
  221. package/dist/server/pages-default-404.js.map +1 -0
  222. package/dist/server/pages-document-initial-props.d.ts +7 -0
  223. package/dist/server/pages-document-initial-props.js +14 -0
  224. package/dist/server/pages-document-initial-props.js.map +1 -0
  225. package/dist/server/pages-node-compat.d.ts +10 -0
  226. package/dist/server/pages-node-compat.js +12 -1
  227. package/dist/server/pages-node-compat.js.map +1 -1
  228. package/dist/server/pages-page-data.d.ts +40 -0
  229. package/dist/server/pages-page-data.js +19 -14
  230. package/dist/server/pages-page-data.js.map +1 -1
  231. package/dist/server/pages-page-method.d.ts +48 -0
  232. package/dist/server/pages-page-method.js +19 -0
  233. package/dist/server/pages-page-method.js.map +1 -0
  234. package/dist/server/pages-page-response.d.ts +8 -0
  235. package/dist/server/pages-page-response.js +21 -11
  236. package/dist/server/pages-page-response.js.map +1 -1
  237. package/dist/server/pages-serializable-props.d.ts +25 -0
  238. package/dist/server/pages-serializable-props.js +69 -0
  239. package/dist/server/pages-serializable-props.js.map +1 -0
  240. package/dist/server/prerender-route-params.d.ts +14 -0
  241. package/dist/server/prerender-route-params.js +94 -0
  242. package/dist/server/prerender-route-params.js.map +1 -0
  243. package/dist/server/prod-server.d.ts +3 -23
  244. package/dist/server/prod-server.js +43 -57
  245. package/dist/server/prod-server.js.map +1 -1
  246. package/dist/server/proxy-trust.d.ts +41 -0
  247. package/dist/server/proxy-trust.js +70 -0
  248. package/dist/server/proxy-trust.js.map +1 -0
  249. package/dist/server/request-pipeline.d.ts +3 -3
  250. package/dist/server/request-pipeline.js +5 -4
  251. package/dist/server/request-pipeline.js.map +1 -1
  252. package/dist/server/seed-cache.js +12 -6
  253. package/dist/server/seed-cache.js.map +1 -1
  254. package/dist/server/server-action-not-found.js +3 -2
  255. package/dist/server/server-action-not-found.js.map +1 -1
  256. package/dist/server/static-file-cache.js +2 -1
  257. package/dist/server/static-file-cache.js.map +1 -1
  258. package/dist/server/streaming-metadata.d.ts +5 -0
  259. package/dist/server/streaming-metadata.js +10 -0
  260. package/dist/server/streaming-metadata.js.map +1 -0
  261. package/dist/shims/app-router-scroll-state.d.ts +14 -0
  262. package/dist/shims/app-router-scroll-state.js +51 -0
  263. package/dist/shims/app-router-scroll-state.js.map +1 -0
  264. package/dist/shims/app-router-scroll.d.ts +28 -0
  265. package/dist/shims/app-router-scroll.js +115 -0
  266. package/dist/shims/app-router-scroll.js.map +1 -0
  267. package/dist/shims/before-interactive-context.d.ts +30 -0
  268. package/dist/shims/before-interactive-context.js +10 -0
  269. package/dist/shims/before-interactive-context.js.map +1 -0
  270. package/dist/shims/cache-runtime.d.ts +1 -1
  271. package/dist/shims/cache-runtime.js +14 -1
  272. package/dist/shims/cache-runtime.js.map +1 -1
  273. package/dist/shims/cache.d.ts +6 -0
  274. package/dist/shims/cache.js +7 -0
  275. package/dist/shims/cache.js.map +1 -1
  276. package/dist/shims/default-not-found.d.ts +12 -0
  277. package/dist/shims/default-not-found.js +61 -0
  278. package/dist/shims/default-not-found.js.map +1 -0
  279. package/dist/shims/error.js +3 -0
  280. package/dist/shims/error.js.map +1 -1
  281. package/dist/shims/font-local.d.ts +5 -0
  282. package/dist/shims/font-local.js +6 -2
  283. package/dist/shims/font-local.js.map +1 -1
  284. package/dist/shims/head.js +4 -4
  285. package/dist/shims/head.js.map +1 -1
  286. package/dist/shims/headers.d.ts +13 -2
  287. package/dist/shims/headers.js +73 -22
  288. package/dist/shims/headers.js.map +1 -1
  289. package/dist/shims/image.d.ts +1 -1
  290. package/dist/shims/image.js +4 -4
  291. package/dist/shims/image.js.map +1 -1
  292. package/dist/shims/internal/app-route-detection.d.ts +37 -0
  293. package/dist/shims/internal/app-route-detection.js +69 -0
  294. package/dist/shims/internal/app-route-detection.js.map +1 -0
  295. package/dist/shims/internal/pages-data-target.d.ts +58 -0
  296. package/dist/shims/internal/pages-data-target.js +91 -0
  297. package/dist/shims/internal/pages-data-target.js.map +1 -0
  298. package/dist/shims/internal/pages-data-url.d.ts +42 -0
  299. package/dist/shims/internal/pages-data-url.js +73 -0
  300. package/dist/shims/internal/pages-data-url.js.map +1 -0
  301. package/dist/shims/link.d.ts +18 -2
  302. package/dist/shims/link.js +129 -15
  303. package/dist/shims/link.js.map +1 -1
  304. package/dist/shims/metadata.d.ts +9 -7
  305. package/dist/shims/metadata.js +70 -7
  306. package/dist/shims/metadata.js.map +1 -1
  307. package/dist/shims/navigation.d.ts +1 -2
  308. package/dist/shims/navigation.js +94 -20
  309. package/dist/shims/navigation.js.map +1 -1
  310. package/dist/shims/router.d.ts +5 -0
  311. package/dist/shims/router.js +389 -80
  312. package/dist/shims/router.js.map +1 -1
  313. package/dist/shims/script.d.ts +11 -1
  314. package/dist/shims/script.js +158 -15
  315. package/dist/shims/script.js.map +1 -1
  316. package/dist/shims/server.js +1 -0
  317. package/dist/shims/server.js.map +1 -1
  318. package/dist/shims/url-utils.d.ts +2 -1
  319. package/dist/shims/url-utils.js +15 -4
  320. package/dist/shims/url-utils.js.map +1 -1
  321. package/dist/utils/html-limited-bots.d.ts +5 -0
  322. package/dist/utils/html-limited-bots.js +15 -0
  323. package/dist/utils/html-limited-bots.js.map +1 -0
  324. package/dist/utils/path.d.ts +13 -0
  325. package/dist/utils/path.js +16 -0
  326. package/dist/utils/path.js.map +1 -0
  327. package/dist/utils/query.d.ts +6 -0
  328. package/dist/utils/query.js +10 -1
  329. package/dist/utils/query.js.map +1 -1
  330. package/package.json +1 -1
@@ -51,24 +51,34 @@ type AppPageDispatchRoute = {
51
51
  __buildTimeReasons?: LayoutClassificationOptions["buildTimeReasons"];
52
52
  error?: AppPageModule | null;
53
53
  errors?: readonly (AppPageModule | null | undefined)[];
54
+ forbidden?: AppPageModule | null;
54
55
  forbiddens?: readonly (AppPageModule | null | undefined)[];
55
56
  isDynamic: boolean;
56
57
  layouts: readonly AppPageModule[];
57
58
  layoutTreePositions?: readonly number[];
58
59
  loading?: AppPageModule | null;
60
+ notFound?: AppPageModule | null;
59
61
  notFounds?: readonly (AppPageModule | null | undefined)[];
60
62
  params: readonly string[];
61
63
  pattern: string;
62
64
  routeSegments: readonly string[];
65
+ unauthorized?: AppPageModule | null;
63
66
  unauthorizeds?: readonly (AppPageModule | null | undefined)[];
64
67
  };
65
68
  type DispatchAppPageOptions<TRoute extends AppPageDispatchRoute> = {
66
69
  /** Configured basePath (e.g. "/blog"). Used to prefix redirect Locations. */basePath?: string;
70
+ /**
71
+ * Allow-list of OpenTelemetry propagation keys (from
72
+ * `experimental.clientTraceMetadata`) to surface as `<meta>` tags in the
73
+ * SSR head. Undefined or empty disables emission entirely.
74
+ */
75
+ clientTraceMetadata?: readonly string[];
67
76
  buildPageElement: (route: TRoute, params: AppPageParams, opts: AppPageDispatchInterceptOptions | undefined, searchParams: URLSearchParams) => Promise<AppPageElement>;
68
77
  cleanPathname: string;
69
78
  clearRequestContext: () => void;
70
79
  createRscOnErrorHandler: (pathname: string, routePath: string) => AppPageBoundaryOnError;
71
80
  debugClassification?: (layoutId: string, reason: ClassificationReason) => void;
81
+ draftModeSecret: string;
72
82
  dynamicConfig?: string;
73
83
  dynamicParamsConfig?: boolean;
74
84
  fetchCache?: FetchCacheMode | null;
@@ -87,18 +97,20 @@ type DispatchAppPageOptions<TRoute extends AppPageDispatchRoute> = {
87
97
  hasPageModule: boolean;
88
98
  handlerStart: number;
89
99
  interceptionContext: string | null;
100
+ isEdgeRuntime?: boolean;
90
101
  isProgressiveActionRender?: boolean;
91
102
  isProduction: boolean;
92
103
  isRscRequest: boolean;
93
104
  isrDebug?: AppPageDebugLogger;
94
105
  isrGet: AppPageCacheGetter;
95
106
  isrHtmlKey: (pathname: string) => string;
96
- isrRscKey: (pathname: string, mountedSlotsHeader?: string | null, renderMode?: AppRscRenderMode) => string;
107
+ isrRscKey: (pathname: string, mountedSlotsHeader?: string | null, renderMode?: AppRscRenderMode, interceptionContext?: string | null) => string;
97
108
  isrSet: AppPageCacheSetter;
98
109
  loadSsrHandler: () => Promise<AppPageSsrHandler>;
99
110
  middlewareContext: AppPageMiddlewareContext;
100
111
  mountedSlotsHeader?: string | null;
101
112
  params: AppPageParams;
113
+ staticParamsValidationParams?: AppPageParams;
102
114
  rootParams?: RootParams;
103
115
  probeLayoutAt: (layoutIndex: number) => unknown;
104
116
  probePage: () => unknown;
@@ -2,26 +2,32 @@ import { createRequestContext, runWithRequestContext } from "../shims/unified-re
2
2
  import { getRequestExecutionContext } from "../shims/request-context.js";
3
3
  import { consumeDynamicUsage, consumeInvalidDynamicUsageError, consumeRenderRequestApiUsage, getAndClearPendingCookies, getDraftModeCookieHeader, isDraftModeRequest, markDynamicUsage, peekRenderRequestApiUsage, setHeadersContext } from "../shims/headers.js";
4
4
  import { _consumeRequestScopedCacheLife, _peekRequestScopedCacheLife } from "../shims/cache.js";
5
- import { shouldSuppressLoadingBoundaries } from "./app-rsc-render-mode.js";
6
- import { consumeDynamicFetchObservations, ensureFetchPatch, getCollectedFetchTags, peekDynamicFetchObservations, runWithFetchDedupe, setCurrentFetchCacheMode, setCurrentFetchSoftTags } from "../shims/fetch-cache.js";
7
5
  import { AppElementsWire } from "./app-elements-wire.js";
6
+ import { shouldSuppressLoadingBoundaries } from "./app-rsc-render-mode.js";
8
7
  import "./app-elements.js";
8
+ import { consumeDynamicFetchObservations, ensureFetchPatch, getCollectedFetchTags, peekDynamicFetchObservations, runWithFetchDedupe, setCurrentFetchCacheMode, setCurrentFetchSoftTags } from "../shims/fetch-cache.js";
9
9
  import { VINEXT_RSC_CONTENT_TYPE, VINEXT_RSC_VARY_HEADER, applyRscCompatibilityIdHeader } from "./app-rsc-cache-busting.js";
10
10
  import { createAppPageTreePath } from "./app-page-route-wiring.js";
11
+ import { readStreamAsText } from "../utils/text-stream.js";
11
12
  import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
13
+ import "./app-page-response.js";
12
14
  import { buildAppPageSpecialErrorResponse, resolveAppPageSpecialError, teeAppPageRscStreamForCapture } from "./app-page-execution.js";
13
- import { resolveAppPageParentHttpAccessBoundaryModule } from "./app-page-boundary.js";
14
- import { readStreamAsText } from "../utils/text-stream.js";
15
+ import { resolveAppPageParentHttpAccessBoundary, resolveAppPageParentHttpAccessBoundaryModule } from "./app-page-boundary.js";
15
16
  import { createAppPageHtmlOutputScope, createAppPageRenderObservation, createAppPageRscOutputScope } from "./app-page-render-observation.js";
16
17
  import { readAppPageCacheResponse } from "./app-page-cache.js";
17
18
  import { resolveAppPageMethodResponse } from "./app-page-method.js";
18
- import { buildAppPageElement, resolveAppPageIntercept, validateAppPageDynamicParams } from "./app-page-request.js";
19
- import "./app-page-response.js";
19
+ import { buildAppPageElement, resolveAppPageIntercept, resolveAppPageInterceptionRerenderTarget, validateAppPageDynamicParams } from "./app-page-request.js";
20
20
  import { renderAppPageLifecycle } from "./app-page-render.js";
21
21
  import { createStaticGenerationHeadersContext } from "./app-static-generation.js";
22
22
  import { buildPageCacheTags } from "./implicit-tags.js";
23
23
  import React from "react";
24
24
  //#region src/server/app-page-dispatch.ts
25
+ function resolveAppPageRouteBoundaryModule(route, statusCode) {
26
+ if (statusCode === 403) return route.forbidden ?? null;
27
+ if (statusCode === 401) return route.unauthorized ?? null;
28
+ if (statusCode === 404) return route.notFound ?? null;
29
+ return null;
30
+ }
25
31
  function shouldReadAppPageCache(options) {
26
32
  return options.isProduction && !options.isProgressiveActionRender && !options.isDraftMode && !options.isForceDynamic && (options.isRscRequest || !options.scriptNonce) && (options.revalidateSeconds === null || options.revalidateSeconds > 0);
27
33
  }
@@ -31,6 +37,7 @@ function buildAppPageTags(cleanPathname, extraTags, routeSegments) {
31
37
  async function runAppPageRevalidationContext(options, renderFn) {
32
38
  return runWithRequestContext(createRequestContext({
33
39
  headersContext: createStaticGenerationHeadersContext({
40
+ draftModeSecret: options.draftModeSecret,
34
41
  dynamicConfig: options.dynamicConfig,
35
42
  routeKind: "page",
36
43
  routePattern: options.routePattern
@@ -74,7 +81,7 @@ async function dispatchAppPageInner(options) {
74
81
  const isForceStatic = dynamicConfig === "force-static";
75
82
  const isDynamicError = dynamicConfig === "error";
76
83
  const isForceDynamic = dynamicConfig === "force-dynamic";
77
- const isDraftMode = isDraftModeRequest(options.request);
84
+ const isDraftMode = isDraftModeRequest(options.request, options.draftModeSecret);
78
85
  setCurrentFetchSoftTags(buildAppPageTags(options.cleanPathname, [], route.routeSegments));
79
86
  setCurrentFetchCacheMode(options.fetchCache ?? null);
80
87
  if (options.hasPageModule && !options.hasPageDefaultExport) {
@@ -95,6 +102,7 @@ async function dispatchAppPageInner(options) {
95
102
  }
96
103
  if ((isForceStatic || isDynamicError) && !isDraftMode) {
97
104
  setHeadersContext(createStaticGenerationHeadersContext({
105
+ draftModeSecret: options.draftModeSecret,
98
106
  dynamicConfig,
99
107
  routeKind: "page",
100
108
  routePattern: route.pattern
@@ -117,93 +125,115 @@ async function dispatchAppPageInner(options) {
117
125
  const cachedPageResponse = await readAppPageCacheResponse({
118
126
  cleanPathname: options.cleanPathname,
119
127
  clearRequestContext: options.clearRequestContext,
128
+ isEdgeRuntime: options.isEdgeRuntime,
120
129
  isRscRequest: options.isRscRequest,
121
130
  isrDebug: options.isrDebug,
122
131
  isrGet: options.isrGet,
123
132
  isrHtmlKey: options.isrHtmlKey,
124
133
  isrRscKey: options.isrRscKey,
125
134
  isrSet: options.isrSet,
135
+ interceptionContext: options.interceptionContext,
126
136
  middlewareHeaders: options.middlewareContext.headers,
127
137
  middlewareStatus: options.middlewareContext.status,
128
138
  mountedSlotsHeader: options.mountedSlotsHeader,
129
139
  renderMode: options.renderMode,
130
140
  expireSeconds: options.expireSeconds,
131
141
  revalidateSeconds: currentRevalidateSeconds ?? 0,
132
- renderFreshPageForCache: async () => runAppPageRevalidationContext({
133
- cleanPathname: options.cleanPathname,
134
- currentFetchCacheMode: options.fetchCache ?? null,
135
- dynamicConfig,
136
- params: options.params,
137
- routePattern: route.pattern,
138
- routeSegments: route.routeSegments,
139
- setNavigationContext: options.setNavigationContext
140
- }, async () => {
141
- const revalidatedElement = await options.buildPageElement(route, options.params, void 0, new URLSearchParams());
142
- const revalidatedOnError = options.createRscOnErrorHandler(options.cleanPathname, route.pattern);
143
- const revalidatedRscCapture = teeAppPageRscStreamForCapture(options.renderToReadableStream(revalidatedElement, { onError: revalidatedOnError }), true);
144
- const revalidatedSsrEntry = await options.loadSsrHandler();
145
- const revalidatedCapturedRscRef = { value: null };
146
- const html = await readStreamAsText(await revalidatedSsrEntry.handleSsr(revalidatedRscCapture.ssrStream, options.getNavigationContext(), {
147
- links: options.getFontLinks(),
148
- styles: options.getFontStyles(),
149
- preloads: options.getFontPreloads()
150
- }, {
151
- basePath: options.basePath,
152
- rootParams: options.rootParams,
153
- ...revalidatedRscCapture.sideStream ? {
154
- sideStream: revalidatedRscCapture.sideStream,
155
- capturedRscDataRef: revalidatedCapturedRscRef
156
- } : {}
157
- }));
158
- const rscData = await getCapturedRscDataPromise(revalidatedCapturedRscRef.value);
159
- const cacheLife = _consumeRequestScopedCacheLife();
160
- options.clearRequestContext();
161
- const tags = buildAppPageTags(options.cleanPathname, getCollectedFetchTags(), route.routeSegments);
162
- const observationState = {
163
- dynamicFetches: consumeDynamicFetchObservations(),
164
- requestApis: consumeRenderRequestApiUsage()
165
- };
166
- return {
167
- html,
168
- htmlRenderObservation: createAppPageRenderObservation({
169
- boundaryOutcome: { kind: "success" },
170
- cacheability: "public",
171
- cacheTags: tags,
172
- cleanPathname: options.cleanPathname,
173
- completeness: "complete",
174
- output: createAppPageHtmlOutputScope({
175
- element: revalidatedElement,
176
- renderEpoch: null,
177
- rootBoundaryId: null,
178
- routePattern: route.pattern
142
+ renderFreshPageForCache: async () => {
143
+ const revalidationTarget = resolveAppPageInterceptionRerenderTarget({
144
+ cleanPathname: options.cleanPathname,
145
+ currentParams: options.params,
146
+ currentRoute: route,
147
+ findIntercept: options.findIntercept,
148
+ getRouteParamNames(sourceRoute) {
149
+ return sourceRoute.params;
150
+ },
151
+ getSourceRoute(sourceRouteIndex) {
152
+ return options.getSourceRoute(sourceRouteIndex);
153
+ },
154
+ isRscRequest: options.isRscRequest,
155
+ toInterceptOpts(intercept) {
156
+ return toInterceptOptions(options.interceptionContext, intercept);
157
+ }
158
+ });
159
+ return runAppPageRevalidationContext({
160
+ cleanPathname: options.cleanPathname,
161
+ currentFetchCacheMode: options.resolveRouteFetchCacheMode?.(revalidationTarget.route) ?? (revalidationTarget.route === route ? options.fetchCache ?? null : null),
162
+ draftModeSecret: options.draftModeSecret,
163
+ dynamicConfig,
164
+ params: revalidationTarget.navigationParams,
165
+ routePattern: revalidationTarget.route.pattern,
166
+ routeSegments: revalidationTarget.route.routeSegments,
167
+ setNavigationContext: options.setNavigationContext
168
+ }, async () => {
169
+ const revalidatedElement = await options.buildPageElement(revalidationTarget.route, revalidationTarget.params, revalidationTarget.interceptOpts, new URLSearchParams());
170
+ const revalidatedOnError = options.createRscOnErrorHandler(options.cleanPathname, revalidationTarget.route.pattern);
171
+ const revalidatedRscCapture = teeAppPageRscStreamForCapture(options.renderToReadableStream(revalidatedElement, { onError: revalidatedOnError }), true);
172
+ const revalidatedSsrEntry = await options.loadSsrHandler();
173
+ const revalidatedCapturedRscRef = { value: null };
174
+ const html = await readStreamAsText(await revalidatedSsrEntry.handleSsr(revalidatedRscCapture.ssrStream, options.getNavigationContext(), {
175
+ links: options.getFontLinks(),
176
+ styles: options.getFontStyles(),
177
+ preloads: options.getFontPreloads()
178
+ }, {
179
+ basePath: options.basePath,
180
+ clientTraceMetadata: options.clientTraceMetadata,
181
+ rootParams: options.rootParams,
182
+ ...revalidatedRscCapture.sideStream ? {
183
+ sideStream: revalidatedRscCapture.sideStream,
184
+ capturedRscDataRef: revalidatedCapturedRscRef
185
+ } : {}
186
+ }));
187
+ const rscData = await getCapturedRscDataPromise(revalidatedCapturedRscRef.value);
188
+ const cacheLife = _consumeRequestScopedCacheLife();
189
+ options.clearRequestContext();
190
+ const tags = buildAppPageTags(options.cleanPathname, getCollectedFetchTags(), revalidationTarget.route.routeSegments);
191
+ const observationState = {
192
+ dynamicFetches: consumeDynamicFetchObservations(),
193
+ requestApis: consumeRenderRequestApiUsage()
194
+ };
195
+ return {
196
+ html,
197
+ htmlRenderObservation: createAppPageRenderObservation({
198
+ boundaryOutcome: { kind: "success" },
199
+ cacheability: "public",
200
+ cacheTags: tags,
201
+ cleanPathname: options.cleanPathname,
202
+ completeness: "complete",
203
+ output: createAppPageHtmlOutputScope({
204
+ element: revalidatedElement,
205
+ renderEpoch: null,
206
+ rootBoundaryId: null,
207
+ routePattern: revalidationTarget.route.pattern
208
+ }),
209
+ params: revalidationTarget.navigationParams,
210
+ state: observationState
179
211
  }),
180
- params: options.params,
181
- state: observationState
182
- }),
183
- rscData,
184
- rscRenderObservation: createAppPageRenderObservation({
185
- boundaryOutcome: { kind: "success" },
186
- cacheability: "public",
187
- cacheTags: tags,
188
- cleanPathname: options.cleanPathname,
189
- completeness: "complete",
190
- output: createAppPageRscOutputScope({
191
- element: revalidatedElement,
192
- mountedSlotsHeader: options.mountedSlotsHeader,
193
- renderEpoch: null,
194
- rootBoundaryId: null,
195
- routePattern: route.pattern
212
+ rscData,
213
+ rscRenderObservation: createAppPageRenderObservation({
214
+ boundaryOutcome: { kind: "success" },
215
+ cacheability: "public",
216
+ cacheTags: tags,
217
+ cleanPathname: options.cleanPathname,
218
+ completeness: "complete",
219
+ output: createAppPageRscOutputScope({
220
+ element: revalidatedElement,
221
+ mountedSlotsHeader: options.mountedSlotsHeader,
222
+ renderEpoch: null,
223
+ rootBoundaryId: null,
224
+ routePattern: revalidationTarget.route.pattern
225
+ }),
226
+ params: revalidationTarget.navigationParams,
227
+ state: observationState
196
228
  }),
197
- params: options.params,
198
- state: observationState
199
- }),
200
- tags,
201
- cacheControl: typeof cacheLife?.revalidate === "number" ? {
202
- revalidate: cacheLife.revalidate,
203
- expire: cacheLife.expire
204
- } : void 0
205
- };
206
- }),
229
+ tags,
230
+ cacheControl: typeof cacheLife?.revalidate === "number" ? {
231
+ revalidate: cacheLife.revalidate,
232
+ expire: cacheLife.expire
233
+ } : void 0
234
+ };
235
+ });
236
+ },
207
237
  scheduleBackgroundRegeneration(key, renderFn) {
208
238
  options.scheduleBackgroundRegeneration(key, renderFn, {
209
239
  routerKind: "App Router",
@@ -219,7 +249,7 @@ async function dispatchAppPageInner(options) {
219
249
  enforceStaticParamsOnly: options.dynamicParamsConfig === false,
220
250
  generateStaticParams: options.generateStaticParams,
221
251
  isDynamicRoute: route.isDynamic,
222
- params: options.params
252
+ params: options.staticParamsValidationParams ?? options.params
223
253
  });
224
254
  if (dynamicParamsResponse) return dynamicParamsResponse;
225
255
  const interceptResult = await resolveAppPageIntercept({
@@ -276,6 +306,7 @@ async function dispatchAppPageInner(options) {
276
306
  if (pageBuildResult.response) return pageBuildResult.response;
277
307
  return renderAppPageLifecycle({
278
308
  basePath: options.basePath,
309
+ clientTraceMetadata: options.clientTraceMetadata,
279
310
  cleanPathname: options.cleanPathname,
280
311
  clearRequestContext: options.clearRequestContext,
281
312
  consumeDynamicUsage,
@@ -312,6 +343,7 @@ async function dispatchAppPageInner(options) {
312
343
  isDraftMode,
313
344
  isForceDynamic,
314
345
  isForceStatic,
346
+ isEdgeRuntime: options.isEdgeRuntime === true,
315
347
  isPrerender: process.env.VINEXT_PRERENDER === "1",
316
348
  isProduction: options.isProduction,
317
349
  isRscRequest: options.isRscRequest,
@@ -319,6 +351,7 @@ async function dispatchAppPageInner(options) {
319
351
  isrHtmlKey: options.isrHtmlKey,
320
352
  isrRscKey: options.isrRscKey,
321
353
  isrSet: options.isrSet,
354
+ interceptionContext: options.interceptionContext,
322
355
  expireSeconds: options.expireSeconds,
323
356
  layoutCount: route.layouts.length,
324
357
  loadSsrHandler: options.loadSsrHandler,
@@ -410,6 +443,7 @@ async function renderLayoutSpecialError(options, specialError, layoutIndex) {
410
443
  buildRscRedirectFlightStream: (rscOptions) => buildRscRedirectFlightStream(options, rscOptions.digest),
411
444
  clearRequestContext: options.clearRequestContext,
412
445
  getAndClearPendingCookies,
446
+ isEdgeRuntime: options.isEdgeRuntime,
413
447
  isRscRequest: options.isRscRequest,
414
448
  middlewareContext: options.middlewareContext,
415
449
  renderFallbackPage(statusCode) {
@@ -439,10 +473,30 @@ async function renderPageSpecialError(options, specialError) {
439
473
  buildRscRedirectFlightStream: (rscOptions) => buildRscRedirectFlightStream(options, rscOptions.digest),
440
474
  clearRequestContext: options.clearRequestContext,
441
475
  getAndClearPendingCookies,
476
+ isEdgeRuntime: options.isEdgeRuntime,
442
477
  isRscRequest: options.isRscRequest,
443
478
  middlewareContext: options.middlewareContext,
444
479
  renderFallbackPage(statusCode) {
445
- return options.renderHttpAccessFallbackPage(statusCode, { matchedParams: options.params }, null);
480
+ const routeBoundaryModule = resolveAppPageRouteBoundaryModule(options.route, statusCode);
481
+ const layoutCount = options.route.layouts.length;
482
+ const { module: parentBoundaryModule, layoutIndex: boundaryLayoutIndex } = resolveAppPageParentHttpAccessBoundary({
483
+ layoutIndex: layoutCount,
484
+ rootForbiddenModule: options.rootForbiddenModule,
485
+ rootNotFoundModule: options.rootNotFoundModule,
486
+ rootUnauthorizedModule: options.rootUnauthorizedModule,
487
+ routeForbiddenModules: options.route.forbiddens,
488
+ routeNotFoundModules: options.route.notFounds,
489
+ routeUnauthorizedModules: options.route.unauthorizeds,
490
+ statusCode
491
+ });
492
+ const useLayoutAlignedBoundary = boundaryLayoutIndex !== null && (routeBoundaryModule === null || routeBoundaryModule === parentBoundaryModule);
493
+ const boundaryComponent = useLayoutAlignedBoundary ? parentBoundaryModule?.default ?? void 0 : void 0;
494
+ const layoutsForBoundary = useLayoutAlignedBoundary && boundaryLayoutIndex !== null ? options.route.layouts.slice(0, boundaryLayoutIndex + 1) : void 0;
495
+ return options.renderHttpAccessFallbackPage(statusCode, {
496
+ boundaryComponent,
497
+ layouts: layoutsForBoundary,
498
+ matchedParams: options.params
499
+ }, null);
446
500
  },
447
501
  request: options.request,
448
502
  specialError
@@ -1 +1 @@
1
- {"version":3,"file":"app-page-dispatch.js","names":[],"sources":["../../src/server/app-page-dispatch.ts"],"sourcesContent":["import React, { type ReactNode } from \"react\";\nimport type { ReactFormState } from \"react-dom/client\";\nimport type { ClassificationReason } from \"../build/layout-classification-types.js\";\nimport {\n _consumeRequestScopedCacheLife,\n _peekRequestScopedCacheLife,\n type CachedAppPageValue,\n} from \"vinext/shims/cache\";\nimport type { RootParams } from \"vinext/shims/root-params\";\nimport {\n consumeDynamicUsage,\n consumeInvalidDynamicUsageError,\n consumeRenderRequestApiUsage,\n getAndClearPendingCookies,\n getDraftModeCookieHeader,\n isDraftModeRequest,\n markDynamicUsage,\n peekRenderRequestApiUsage,\n setHeadersContext,\n} from \"vinext/shims/headers\";\nimport { getRequestExecutionContext } from \"vinext/shims/request-context\";\nimport { createRequestContext, runWithRequestContext } from \"vinext/shims/unified-request-context\";\nimport {\n ensureFetchPatch,\n consumeDynamicFetchObservations,\n type FetchCacheMode,\n getCollectedFetchTags,\n peekDynamicFetchObservations,\n runWithFetchDedupe,\n setCurrentFetchCacheMode,\n setCurrentFetchSoftTags,\n} from \"vinext/shims/fetch-cache\";\nimport { AppElementsWire, type AppOutgoingElements } from \"./app-elements.js\";\nimport { readAppPageCacheResponse } from \"./app-page-cache.js\";\nimport { resolveAppPageParentHttpAccessBoundaryModule } from \"./app-page-boundary.js\";\nimport { readStreamAsText } from \"../utils/text-stream.js\";\nimport {\n buildAppPageSpecialErrorResponse,\n resolveAppPageSpecialError,\n teeAppPageRscStreamForCapture,\n type AppPageFontPreload,\n type AppPageSpecialError,\n type LayoutClassificationOptions,\n} from \"./app-page-execution.js\";\nimport { resolveAppPageMethodResponse } from \"./app-page-method.js\";\nimport {\n buildAppPageElement,\n resolveAppPageIntercept,\n validateAppPageDynamicParams,\n type ValidateAppPageDynamicParamsOptions,\n} from \"./app-page-request.js\";\nimport { renderAppPageLifecycle } from \"./app-page-render.js\";\nimport {\n createAppPageHtmlOutputScope,\n createAppPageRenderObservation,\n createAppPageRscOutputScope,\n} from \"./app-page-render-observation.js\";\nimport {\n mergeMiddlewareResponseHeaders,\n type AppPageMiddlewareContext,\n} from \"./app-page-response.js\";\nimport {\n VINEXT_RSC_CONTENT_TYPE,\n VINEXT_RSC_VARY_HEADER,\n applyRscCompatibilityIdHeader,\n} from \"./app-rsc-cache-busting.js\";\nimport {\n APP_RSC_RENDER_MODE_NAVIGATION,\n shouldSuppressLoadingBoundaries,\n type AppRscRenderMode,\n} from \"./app-rsc-render-mode.js\";\nimport { createAppPageTreePath } from \"./app-page-route-wiring.js\";\nimport type { AppPageSsrHandler } from \"./app-page-stream.js\";\nimport { createStaticGenerationHeadersContext } from \"./app-static-generation.js\";\nimport { buildPageCacheTags } from \"./implicit-tags.js\";\nimport type { ISRCacheEntry } from \"./isr-cache.js\";\n\ntype AppPageParams = Record<string, string | string[]>;\ntype AppPageElement = ReactNode | Readonly<Record<string, ReactNode>>;\ntype AppPageRenderableElement = ReactNode | AppOutgoingElements;\ntype AppPageBoundaryOnError = (\n error: unknown,\n requestInfo: unknown,\n errorContext: unknown,\n) => unknown;\ntype AppPageDebugLogger = (event: string, detail: string) => void;\ntype AppPageCacheSetter = (\n key: string,\n data: CachedAppPageValue,\n revalidateSeconds: number,\n tags: string[],\n expireSeconds?: number,\n) => Promise<void>;\ntype AppPageCacheGetter = (key: string) => Promise<ISRCacheEntry | null>;\ntype AppPageBackgroundRegenerationErrorContext = {\n routerKind: \"App Router\";\n routePath: string;\n routeType: \"render\";\n};\ntype AppPageBackgroundRegenerator = (\n key: string,\n renderFn: () => Promise<void>,\n errorContext?: AppPageBackgroundRegenerationErrorContext,\n) => void;\n\ntype AppPageDispatchIntercept<TPage = unknown> = {\n interceptLayouts?: readonly AppPageModule[] | null;\n matchedParams: AppPageParams;\n page: TPage;\n slotId?: string | null;\n slotKey: string;\n sourceRouteIndex: number;\n};\n\ntype AppPageDispatchInterceptOptions<TPage = unknown> = {\n interceptionContext: string | null;\n interceptLayouts?: readonly AppPageModule[] | null;\n interceptPage: TPage;\n interceptParams: AppPageParams;\n interceptSlotId?: string | null;\n interceptSlotKey: string;\n interceptSourceMatchedUrl?: string | null;\n};\n\ntype AppPageModule = {\n default?: unknown;\n};\n\ntype AppPageDispatchRoute = {\n __buildTimeClassifications?: LayoutClassificationOptions[\"buildTimeClassifications\"];\n __buildTimeReasons?: LayoutClassificationOptions[\"buildTimeReasons\"];\n error?: AppPageModule | null;\n errors?: readonly (AppPageModule | null | undefined)[];\n forbiddens?: readonly (AppPageModule | null | undefined)[];\n isDynamic: boolean;\n layouts: readonly AppPageModule[];\n layoutTreePositions?: readonly number[];\n loading?: AppPageModule | null;\n notFounds?: readonly (AppPageModule | null | undefined)[];\n params: readonly string[];\n pattern: string;\n routeSegments: readonly string[];\n unauthorizeds?: readonly (AppPageModule | null | undefined)[];\n};\n\ntype DispatchAppPageOptions<TRoute extends AppPageDispatchRoute> = {\n /** Configured basePath (e.g. \"/blog\"). Used to prefix redirect Locations. */\n basePath?: string;\n buildPageElement: (\n route: TRoute,\n params: AppPageParams,\n opts: AppPageDispatchInterceptOptions | undefined,\n searchParams: URLSearchParams,\n ) => Promise<AppPageElement>;\n cleanPathname: string;\n clearRequestContext: () => void;\n createRscOnErrorHandler: (pathname: string, routePath: string) => AppPageBoundaryOnError;\n debugClassification?: (layoutId: string, reason: ClassificationReason) => void;\n dynamicConfig?: string;\n dynamicParamsConfig?: boolean;\n fetchCache?: FetchCacheMode | null;\n findIntercept: (pathname: string) => AppPageDispatchIntercept | null;\n formState?: ReactFormState | null;\n actionError?: unknown;\n actionFailed?: boolean;\n generateStaticParams?: ValidateAppPageDynamicParamsOptions[\"generateStaticParams\"];\n getFontLinks: () => string[];\n getFontPreloads: () => AppPageFontPreload[];\n getFontStyles: () => string[];\n getNavigationContext: () => unknown;\n getSourceRoute: (sourceRouteIndex: number) => TRoute | undefined;\n hasGenerateStaticParams: boolean;\n hasPageDefaultExport: boolean;\n hasPageModule: boolean;\n handlerStart: number;\n interceptionContext: string | null;\n isProgressiveActionRender?: boolean;\n isProduction: boolean;\n isRscRequest: boolean;\n isrDebug?: AppPageDebugLogger;\n isrGet: AppPageCacheGetter;\n isrHtmlKey: (pathname: string) => string;\n isrRscKey: (\n pathname: string,\n mountedSlotsHeader?: string | null,\n renderMode?: AppRscRenderMode,\n ) => string;\n isrSet: AppPageCacheSetter;\n loadSsrHandler: () => Promise<AppPageSsrHandler>;\n middlewareContext: AppPageMiddlewareContext;\n mountedSlotsHeader?: string | null;\n params: AppPageParams;\n rootParams?: RootParams;\n probeLayoutAt: (layoutIndex: number) => unknown;\n probePage: () => unknown;\n expireSeconds?: number;\n renderErrorBoundaryPage: (error: unknown) => Promise<Response | null>;\n renderHttpAccessFallbackPage: (\n statusCode: number,\n opts: {\n boundaryComponent?: unknown;\n layouts?: readonly AppPageModule[];\n matchedParams: AppPageParams;\n },\n middlewareContext: AppPageMiddlewareContext | null,\n ) => Promise<Response | null>;\n renderToReadableStream: (\n element: AppPageRenderableElement,\n options: { onError: AppPageBoundaryOnError },\n ) => ReadableStream<Uint8Array>;\n request: Request;\n revalidateSeconds: number | null;\n resolveRouteFetchCacheMode?: (route: TRoute) => FetchCacheMode | null;\n rootForbiddenModule?: AppPageModule | null;\n rootNotFoundModule?: AppPageModule | null;\n rootUnauthorizedModule?: AppPageModule | null;\n route: TRoute;\n runWithSuppressedHookWarning<T>(probe: () => Promise<T>): Promise<T>;\n scheduleBackgroundRegeneration: AppPageBackgroundRegenerator;\n scriptNonce?: string;\n searchParams: URLSearchParams;\n setNavigationContext: (context: {\n params: AppPageParams;\n pathname: string;\n searchParams: URLSearchParams;\n }) => void;\n renderMode?: AppRscRenderMode;\n};\n\nfunction shouldReadAppPageCache(options: {\n isProgressiveActionRender: boolean;\n isDraftMode: boolean;\n isForceDynamic: boolean;\n isProduction: boolean;\n isRscRequest: boolean;\n revalidateSeconds: number | null;\n scriptNonce?: string;\n}): boolean {\n return (\n options.isProduction &&\n !options.isProgressiveActionRender &&\n !options.isDraftMode &&\n !options.isForceDynamic &&\n (options.isRscRequest || !options.scriptNonce) &&\n (options.revalidateSeconds === null || options.revalidateSeconds > 0)\n );\n}\n\nfunction buildAppPageTags(\n cleanPathname: string,\n extraTags: string[],\n routeSegments: readonly string[],\n): string[] {\n return buildPageCacheTags(cleanPathname, extraTags, [...routeSegments], \"page\");\n}\n\nasync function runAppPageRevalidationContext<\n TResult extends {\n html: string;\n rscData: ArrayBuffer;\n tags: string[];\n },\n>(\n options: {\n cleanPathname: string;\n currentFetchCacheMode?: FetchCacheMode | null;\n dynamicConfig?: string;\n params: AppPageParams;\n routePattern: string;\n routeSegments: readonly string[];\n setNavigationContext: DispatchAppPageOptions<AppPageDispatchRoute>[\"setNavigationContext\"];\n },\n renderFn: () => Promise<TResult>,\n): Promise<TResult> {\n const headersContext = createStaticGenerationHeadersContext({\n dynamicConfig: options.dynamicConfig,\n routeKind: \"page\",\n routePattern: options.routePattern,\n });\n const requestContext = createRequestContext({\n headersContext,\n currentFetchCacheMode: options.currentFetchCacheMode ?? null,\n executionContext: getRequestExecutionContext(),\n unstableCacheRevalidation: \"foreground\",\n });\n\n return runWithRequestContext(requestContext, async () => {\n ensureFetchPatch();\n setCurrentFetchSoftTags(buildAppPageTags(options.cleanPathname, [], options.routeSegments));\n options.setNavigationContext({\n pathname: options.cleanPathname,\n searchParams: new URLSearchParams(),\n params: options.params,\n });\n return await runWithFetchDedupe(renderFn);\n });\n}\n\nfunction getCapturedRscDataPromise(\n capturedRscDataPromise: Promise<ArrayBuffer> | null,\n): Promise<ArrayBuffer> {\n if (!capturedRscDataPromise) {\n throw new Error(\n \"[vinext] Expected captured RSC data while regenerating an app page cache entry\",\n );\n }\n\n return capturedRscDataPromise;\n}\n\nfunction toInterceptOptions(\n interceptionContext: string | null,\n intercept: AppPageDispatchIntercept,\n): AppPageDispatchInterceptOptions {\n return {\n interceptionContext,\n interceptLayouts: intercept.interceptLayouts,\n interceptPage: intercept.page,\n interceptParams: intercept.matchedParams,\n interceptSlotId: intercept.slotId ?? null,\n interceptSlotKey: intercept.slotKey,\n interceptSourceMatchedUrl: interceptionContext,\n };\n}\n\nexport async function dispatchAppPage<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n): Promise<Response> {\n return await runWithFetchDedupe(() => dispatchAppPageInner(options));\n}\n\nasync function dispatchAppPageInner<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n): Promise<Response> {\n const route = options.route;\n const dynamicConfig = options.dynamicConfig;\n const currentRevalidateSeconds = options.revalidateSeconds;\n const isForceStatic = dynamicConfig === \"force-static\";\n const isDynamicError = dynamicConfig === \"error\";\n const isForceDynamic = dynamicConfig === \"force-dynamic\";\n const isDraftMode = isDraftModeRequest(options.request);\n\n setCurrentFetchSoftTags(buildAppPageTags(options.cleanPathname, [], route.routeSegments));\n setCurrentFetchCacheMode(options.fetchCache ?? null);\n\n if (options.hasPageModule && !options.hasPageDefaultExport) {\n options.clearRequestContext();\n return new Response(\"Page has no default export\", { status: 500 });\n }\n\n const methodResponse = resolveAppPageMethodResponse({\n dynamicConfig,\n hasGenerateStaticParams: options.hasGenerateStaticParams,\n isDynamicRoute: route.isDynamic,\n middlewareHeaders: options.middlewareContext.headers,\n request: options.request,\n revalidateSeconds: currentRevalidateSeconds,\n });\n if (methodResponse) {\n options.clearRequestContext();\n return methodResponse;\n }\n\n if ((isForceStatic || isDynamicError) && !isDraftMode) {\n setHeadersContext(\n createStaticGenerationHeadersContext({\n dynamicConfig,\n routeKind: \"page\",\n routePattern: route.pattern,\n }),\n );\n options.setNavigationContext({\n pathname: options.cleanPathname,\n searchParams: new URLSearchParams(),\n params: options.params,\n });\n }\n\n if (\n shouldReadAppPageCache({\n isDraftMode,\n isForceDynamic,\n isProgressiveActionRender: options.isProgressiveActionRender === true,\n isProduction: options.isProduction,\n isRscRequest: options.isRscRequest,\n revalidateSeconds: currentRevalidateSeconds,\n scriptNonce: options.scriptNonce,\n })\n ) {\n const cachedPageResponse = await readAppPageCacheResponse({\n cleanPathname: options.cleanPathname,\n clearRequestContext: options.clearRequestContext,\n isRscRequest: options.isRscRequest,\n isrDebug: options.isrDebug,\n isrGet: options.isrGet,\n isrHtmlKey: options.isrHtmlKey,\n isrRscKey: options.isrRscKey,\n isrSet: options.isrSet,\n middlewareHeaders: options.middlewareContext.headers,\n middlewareStatus: options.middlewareContext.status,\n mountedSlotsHeader: options.mountedSlotsHeader,\n renderMode: options.renderMode,\n expireSeconds: options.expireSeconds,\n // cacheLife-only routes discover their actual revalidate during the\n // fresh render; this seed only gets them into the cache read path.\n revalidateSeconds: currentRevalidateSeconds ?? 0,\n renderFreshPageForCache: async () =>\n runAppPageRevalidationContext(\n {\n cleanPathname: options.cleanPathname,\n currentFetchCacheMode: options.fetchCache ?? null,\n dynamicConfig,\n params: options.params,\n routePattern: route.pattern,\n routeSegments: route.routeSegments,\n setNavigationContext: options.setNavigationContext,\n },\n async () => {\n const revalidatedElement = await options.buildPageElement(\n route,\n options.params,\n undefined,\n new URLSearchParams(),\n );\n const revalidatedOnError = options.createRscOnErrorHandler(\n options.cleanPathname,\n route.pattern,\n );\n // No inner runWithFetchDedupe here: this renderFn is already\n // wrapped in runWithFetchDedupe by runAppPageRevalidationContext.\n const revalidatedRscStream = options.renderToReadableStream(revalidatedElement, {\n onError: revalidatedOnError,\n });\n const revalidatedRscCapture = teeAppPageRscStreamForCapture(revalidatedRscStream, true);\n const revalidatedSsrEntry = await options.loadSsrHandler();\n const revalidatedCapturedRscRef: { value: Promise<ArrayBuffer> | null } = {\n value: null,\n };\n const revalidatedHtmlStream = await revalidatedSsrEntry.handleSsr(\n revalidatedRscCapture.ssrStream,\n options.getNavigationContext(),\n {\n links: options.getFontLinks(),\n styles: options.getFontStyles(),\n preloads: options.getFontPreloads(),\n },\n {\n basePath: options.basePath,\n rootParams: options.rootParams,\n ...(revalidatedRscCapture.sideStream\n ? {\n sideStream: revalidatedRscCapture.sideStream,\n capturedRscDataRef: revalidatedCapturedRscRef,\n }\n : {}),\n },\n );\n const html = await readStreamAsText(revalidatedHtmlStream);\n const rscData = await getCapturedRscDataPromise(revalidatedCapturedRscRef.value);\n const cacheLife = _consumeRequestScopedCacheLife();\n options.clearRequestContext();\n const tags = buildAppPageTags(\n options.cleanPathname,\n getCollectedFetchTags(),\n route.routeSegments,\n );\n // Consume once: HTML and RSC artifacts are produced by the same\n // regeneration render and should carry the same observation set.\n const observationState = {\n dynamicFetches: consumeDynamicFetchObservations(),\n requestApis: consumeRenderRequestApiUsage(),\n };\n return {\n html,\n htmlRenderObservation: createAppPageRenderObservation({\n boundaryOutcome: { kind: \"success\" },\n cacheability: \"public\",\n cacheTags: tags,\n cleanPathname: options.cleanPathname,\n completeness: \"complete\",\n output: createAppPageHtmlOutputScope({\n element: revalidatedElement,\n renderEpoch: null,\n rootBoundaryId: null,\n routePattern: route.pattern,\n }),\n params: options.params,\n state: observationState,\n }),\n rscData,\n rscRenderObservation: createAppPageRenderObservation({\n boundaryOutcome: { kind: \"success\" },\n cacheability: \"public\",\n cacheTags: tags,\n cleanPathname: options.cleanPathname,\n completeness: \"complete\",\n output: createAppPageRscOutputScope({\n element: revalidatedElement,\n mountedSlotsHeader: options.mountedSlotsHeader,\n renderEpoch: null,\n rootBoundaryId: null,\n routePattern: route.pattern,\n }),\n params: options.params,\n state: observationState,\n }),\n tags,\n cacheControl:\n typeof cacheLife?.revalidate === \"number\"\n ? { revalidate: cacheLife.revalidate, expire: cacheLife.expire }\n : undefined,\n };\n },\n ),\n scheduleBackgroundRegeneration(key, renderFn) {\n options.scheduleBackgroundRegeneration(key, renderFn, {\n routerKind: \"App Router\",\n routePath: route.pattern,\n routeType: \"render\",\n });\n },\n });\n if (cachedPageResponse) {\n return cachedPageResponse;\n }\n }\n\n const dynamicParamsResponse = await validateAppPageDynamicParams({\n clearRequestContext: options.clearRequestContext,\n enforceStaticParamsOnly: options.dynamicParamsConfig === false,\n generateStaticParams: options.generateStaticParams,\n isDynamicRoute: route.isDynamic,\n params: options.params,\n });\n if (dynamicParamsResponse) {\n return dynamicParamsResponse;\n }\n\n const interceptResult = await resolveAppPageIntercept<\n TRoute,\n unknown,\n AppPageDispatchInterceptOptions,\n AppPageElement\n >({\n buildPageElement(interceptRoute, interceptParams, interceptOpts, interceptSearchParams) {\n setCurrentFetchCacheMode(options.resolveRouteFetchCacheMode?.(interceptRoute) ?? null);\n return options.buildPageElement(\n interceptRoute,\n interceptParams,\n interceptOpts,\n interceptSearchParams,\n );\n },\n cleanPathname: options.cleanPathname,\n currentRoute: route,\n findIntercept(pathname) {\n return options.findIntercept(pathname);\n },\n getRouteParamNames(sourceRoute) {\n return sourceRoute.params;\n },\n getSourceRoute(sourceRouteIndex) {\n return options.getSourceRoute(sourceRouteIndex);\n },\n isRscRequest: options.isRscRequest,\n renderInterceptResponse(sourceRoute, interceptElement) {\n const interceptOnError = options.createRscOnErrorHandler(\n options.cleanPathname,\n sourceRoute.pattern,\n );\n // No inner runWithFetchDedupe here: dispatchAppPage already activated\n // dedupe at line 294, and this callback runs inside dispatchAppPageInner.\n const interceptStream = options.renderToReadableStream(interceptElement, {\n onError: interceptOnError,\n });\n const interceptHeaders = new Headers({\n \"Content-Type\": VINEXT_RSC_CONTENT_TYPE,\n Vary: VINEXT_RSC_VARY_HEADER,\n });\n mergeMiddlewareResponseHeaders(interceptHeaders, options.middlewareContext.headers);\n applyRscCompatibilityIdHeader(interceptHeaders);\n return new Response(interceptStream, {\n status: options.middlewareContext.status ?? 200,\n headers: interceptHeaders,\n });\n },\n searchParams: options.searchParams,\n setNavigationContext: options.setNavigationContext,\n toInterceptOpts(intercept) {\n return toInterceptOptions(options.interceptionContext, intercept);\n },\n });\n if (interceptResult.response) {\n return interceptResult.response;\n }\n\n const pageBuildResult = await buildAppPageElement({\n buildPageElement() {\n if (options.actionFailed) {\n throw options.actionError;\n }\n return options.buildPageElement(\n route,\n options.params,\n interceptResult.interceptOpts,\n options.searchParams,\n );\n },\n renderErrorBoundaryPage(buildError) {\n return options.renderErrorBoundaryPage(buildError);\n },\n renderSpecialError(specialError) {\n return renderPageSpecialError(options, specialError);\n },\n resolveSpecialError: resolveAppPageSpecialError,\n });\n if (pageBuildResult.response) {\n return pageBuildResult.response;\n }\n\n return renderAppPageLifecycle({\n basePath: options.basePath,\n cleanPathname: options.cleanPathname,\n clearRequestContext: options.clearRequestContext,\n consumeDynamicUsage,\n consumeInvalidDynamicUsageError,\n consumeRenderObservationState() {\n return {\n dynamicFetches: consumeDynamicFetchObservations(),\n requestApis: consumeRenderRequestApiUsage(),\n };\n },\n createRscOnErrorHandler(pathname, routePath) {\n return options.createRscOnErrorHandler(pathname, routePath);\n },\n element: pageBuildResult.element,\n getDraftModeCookieHeader,\n getFontLinks: options.getFontLinks,\n getFontPreloads: options.getFontPreloads,\n getFontStyles: options.getFontStyles,\n getNavigationContext: options.getNavigationContext,\n getPageTags() {\n return buildAppPageTags(options.cleanPathname, getCollectedFetchTags(), route.routeSegments);\n },\n getRequestCacheLife() {\n return _consumeRequestScopedCacheLife();\n },\n peekRequestCacheLife() {\n return _peekRequestScopedCacheLife();\n },\n handlerStart: options.handlerStart,\n hasLoadingBoundary: shouldSuppressLoadingBoundaries(\n options.renderMode ?? APP_RSC_RENDER_MODE_NAVIGATION,\n )\n ? false\n : Boolean(route.loading?.default),\n formState: options.formState ?? null,\n isProgressiveActionRender: options.isProgressiveActionRender === true,\n isDynamicError,\n isDraftMode,\n isForceDynamic,\n isForceStatic,\n isPrerender: process.env.VINEXT_PRERENDER === \"1\",\n isProduction: options.isProduction,\n isRscRequest: options.isRscRequest,\n isrDebug: options.isrDebug,\n isrHtmlKey: options.isrHtmlKey,\n isrRscKey: options.isrRscKey,\n isrSet: options.isrSet,\n expireSeconds: options.expireSeconds,\n layoutCount: route.layouts.length,\n loadSsrHandler: options.loadSsrHandler,\n middlewareContext: options.middlewareContext,\n params: options.params,\n rootParams: options.rootParams,\n peekRenderObservationState() {\n return {\n dynamicFetches: peekDynamicFetchObservations(),\n requestApis: peekRenderRequestApiUsage(),\n };\n },\n probeLayoutAt(layoutIndex) {\n return options.probeLayoutAt(layoutIndex);\n },\n probePage() {\n return options.probePage();\n },\n classification: {\n getLayoutId(index) {\n const treePosition = route.layoutTreePositions?.[index] ?? 0;\n return AppElementsWire.encodeLayoutId(\n createAppPageTreePath([...route.routeSegments], treePosition),\n );\n },\n buildTimeClassifications: route.__buildTimeClassifications,\n buildTimeReasons: route.__buildTimeReasons,\n debugClassification: options.debugClassification,\n async runWithIsolatedDynamicScope(fn) {\n const priorDynamic = consumeDynamicUsage();\n try {\n const result = await fn();\n const dynamicDetected = consumeDynamicUsage();\n return { result, dynamicDetected };\n } finally {\n consumeDynamicUsage();\n if (priorDynamic) markDynamicUsage();\n }\n },\n },\n revalidateSeconds: currentRevalidateSeconds,\n mountedSlotsHeader: options.mountedSlotsHeader,\n renderMode: options.renderMode ?? APP_RSC_RENDER_MODE_NAVIGATION,\n renderErrorBoundaryResponse(renderError) {\n return options.renderErrorBoundaryPage(renderError);\n },\n renderLayoutSpecialError(specialError, layoutIndex) {\n return renderLayoutSpecialError(options, specialError, layoutIndex);\n },\n renderPageSpecialError(specialError) {\n return renderPageSpecialError(options, specialError);\n },\n renderToReadableStream: options.renderToReadableStream,\n routeHasLocalBoundary: Boolean(\n route.error?.default || route.errors?.some((errorModule) => errorModule?.default),\n ),\n routePattern: route.pattern,\n runWithSuppressedHookWarning(probe) {\n return options.runWithSuppressedHookWarning(probe);\n },\n scriptNonce: options.scriptNonce,\n waitUntil(cachePromise) {\n getRequestExecutionContext()?.waitUntil(cachePromise);\n },\n });\n}\n\n/**\n * Builds an RSC flight payload that encodes a redirect as a React error chunk.\n * We render a tiny element that immediately throws an `Error` whose `digest`\n * is the canonical `NEXT_REDIRECT;...` string. `renderToReadableStream`'s\n * `onError` returns that digest, react-server-dom-webpack serializes the\n * error into the stream, and the client's `RedirectErrorBoundary` decodes it\n * via `getURLFromRedirectError` / `getRedirectTypeFromError`.\n *\n * The thrown error's digest matches Next.js's well-known router error format,\n * so neither vinext's RSC error handler nor Next.js's reporter logs it as a\n * \"real\" server error. Mirrors `app-render.tsx generateDynamicFlightRenderResult`\n * where a redirect thrown during RSC rendering propagates through\n * `renderToFlightStream`'s `onError` callback into the flight payload.\n */\nfunction buildRscRedirectFlightStream<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n digest: string,\n): ReadableStream<Uint8Array> {\n const throwingElement = React.createElement(function NextRedirectFlightThrower() {\n const err = new Error(\"NEXT_REDIRECT\") as Error & { digest: string };\n err.digest = digest;\n throw err;\n });\n\n return options.renderToReadableStream(throwingElement, {\n onError: () => digest,\n });\n}\n\nasync function renderLayoutSpecialError<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n specialError: AppPageSpecialError,\n layoutIndex: number,\n): Promise<Response> {\n return buildAppPageSpecialErrorResponse({\n basePath: options.basePath,\n buildRscRedirectFlightStream: (rscOptions) =>\n buildRscRedirectFlightStream(options, rscOptions.digest),\n clearRequestContext: options.clearRequestContext,\n getAndClearPendingCookies,\n isRscRequest: options.isRscRequest,\n middlewareContext: options.middlewareContext,\n renderFallbackPage(statusCode) {\n const parentBoundary = resolveAppPageParentHttpAccessBoundaryModule({\n layoutIndex,\n rootForbiddenModule: options.rootForbiddenModule,\n rootNotFoundModule: options.rootNotFoundModule,\n rootUnauthorizedModule: options.rootUnauthorizedModule,\n routeForbiddenModules: options.route.forbiddens,\n routeNotFoundModules: options.route.notFounds,\n routeUnauthorizedModules: options.route.unauthorizeds,\n statusCode,\n })?.default;\n return options.renderHttpAccessFallbackPage(\n statusCode,\n {\n boundaryComponent: parentBoundary,\n layouts: options.route.layouts.slice(0, layoutIndex),\n matchedParams: options.params,\n },\n null,\n );\n },\n request: options.request,\n specialError,\n });\n}\n\nasync function renderPageSpecialError<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n specialError: AppPageSpecialError,\n): Promise<Response> {\n return buildAppPageSpecialErrorResponse({\n basePath: options.basePath,\n buildRscRedirectFlightStream: (rscOptions) =>\n buildRscRedirectFlightStream(options, rscOptions.digest),\n clearRequestContext: options.clearRequestContext,\n getAndClearPendingCookies,\n isRscRequest: options.isRscRequest,\n middlewareContext: options.middlewareContext,\n renderFallbackPage(statusCode) {\n return options.renderHttpAccessFallbackPage(\n statusCode,\n { matchedParams: options.params },\n null,\n );\n },\n request: options.request,\n specialError,\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"app-page-dispatch.js","names":[],"sources":["../../src/server/app-page-dispatch.ts"],"sourcesContent":["import React, { type ReactNode } from \"react\";\nimport type { ReactFormState } from \"react-dom/client\";\nimport type { ClassificationReason } from \"../build/layout-classification-types.js\";\nimport {\n _consumeRequestScopedCacheLife,\n _peekRequestScopedCacheLife,\n type CachedAppPageValue,\n} from \"vinext/shims/cache\";\nimport type { RootParams } from \"vinext/shims/root-params\";\nimport {\n consumeDynamicUsage,\n consumeInvalidDynamicUsageError,\n consumeRenderRequestApiUsage,\n getAndClearPendingCookies,\n getDraftModeCookieHeader,\n isDraftModeRequest,\n markDynamicUsage,\n peekRenderRequestApiUsage,\n setHeadersContext,\n} from \"vinext/shims/headers\";\nimport { getRequestExecutionContext } from \"vinext/shims/request-context\";\nimport { createRequestContext, runWithRequestContext } from \"vinext/shims/unified-request-context\";\nimport {\n ensureFetchPatch,\n consumeDynamicFetchObservations,\n type FetchCacheMode,\n getCollectedFetchTags,\n peekDynamicFetchObservations,\n runWithFetchDedupe,\n setCurrentFetchCacheMode,\n setCurrentFetchSoftTags,\n} from \"vinext/shims/fetch-cache\";\nimport { AppElementsWire, type AppOutgoingElements } from \"./app-elements.js\";\nimport { readAppPageCacheResponse } from \"./app-page-cache.js\";\nimport {\n resolveAppPageParentHttpAccessBoundary,\n resolveAppPageParentHttpAccessBoundaryModule,\n} from \"./app-page-boundary.js\";\nimport { readStreamAsText } from \"../utils/text-stream.js\";\nimport {\n buildAppPageSpecialErrorResponse,\n resolveAppPageSpecialError,\n teeAppPageRscStreamForCapture,\n type AppPageFontPreload,\n type AppPageSpecialError,\n type LayoutClassificationOptions,\n} from \"./app-page-execution.js\";\nimport { resolveAppPageMethodResponse } from \"./app-page-method.js\";\nimport {\n buildAppPageElement,\n resolveAppPageInterceptionRerenderTarget,\n resolveAppPageIntercept,\n validateAppPageDynamicParams,\n type ValidateAppPageDynamicParamsOptions,\n} from \"./app-page-request.js\";\nimport { renderAppPageLifecycle } from \"./app-page-render.js\";\nimport {\n createAppPageHtmlOutputScope,\n createAppPageRenderObservation,\n createAppPageRscOutputScope,\n} from \"./app-page-render-observation.js\";\nimport {\n mergeMiddlewareResponseHeaders,\n type AppPageMiddlewareContext,\n} from \"./app-page-response.js\";\nimport {\n VINEXT_RSC_CONTENT_TYPE,\n VINEXT_RSC_VARY_HEADER,\n applyRscCompatibilityIdHeader,\n} from \"./app-rsc-cache-busting.js\";\nimport {\n APP_RSC_RENDER_MODE_NAVIGATION,\n shouldSuppressLoadingBoundaries,\n type AppRscRenderMode,\n} from \"./app-rsc-render-mode.js\";\nimport { createAppPageTreePath } from \"./app-page-route-wiring.js\";\nimport type { AppPageSsrHandler } from \"./app-page-stream.js\";\nimport { createStaticGenerationHeadersContext } from \"./app-static-generation.js\";\nimport { buildPageCacheTags } from \"./implicit-tags.js\";\nimport type { ISRCacheEntry } from \"./isr-cache.js\";\n\ntype AppPageParams = Record<string, string | string[]>;\ntype AppPageElement = ReactNode | Readonly<Record<string, ReactNode>>;\ntype AppPageRenderableElement = ReactNode | AppOutgoingElements;\ntype AppPageBoundaryOnError = (\n error: unknown,\n requestInfo: unknown,\n errorContext: unknown,\n) => unknown;\ntype AppPageDebugLogger = (event: string, detail: string) => void;\ntype AppPageCacheSetter = (\n key: string,\n data: CachedAppPageValue,\n revalidateSeconds: number,\n tags: string[],\n expireSeconds?: number,\n) => Promise<void>;\ntype AppPageCacheGetter = (key: string) => Promise<ISRCacheEntry | null>;\ntype AppPageBackgroundRegenerationErrorContext = {\n routerKind: \"App Router\";\n routePath: string;\n routeType: \"render\";\n};\ntype AppPageBackgroundRegenerator = (\n key: string,\n renderFn: () => Promise<void>,\n errorContext?: AppPageBackgroundRegenerationErrorContext,\n) => void;\n\ntype AppPageDispatchIntercept<TPage = unknown> = {\n interceptLayouts?: readonly AppPageModule[] | null;\n matchedParams: AppPageParams;\n page: TPage;\n slotId?: string | null;\n slotKey: string;\n sourceRouteIndex: number;\n};\n\ntype AppPageDispatchInterceptOptions<TPage = unknown> = {\n interceptionContext: string | null;\n interceptLayouts?: readonly AppPageModule[] | null;\n interceptPage: TPage;\n interceptParams: AppPageParams;\n interceptSlotId?: string | null;\n interceptSlotKey: string;\n interceptSourceMatchedUrl?: string | null;\n};\n\ntype AppPageModule = {\n default?: unknown;\n};\n\ntype AppPageDispatchRoute = {\n __buildTimeClassifications?: LayoutClassificationOptions[\"buildTimeClassifications\"];\n __buildTimeReasons?: LayoutClassificationOptions[\"buildTimeReasons\"];\n error?: AppPageModule | null;\n errors?: readonly (AppPageModule | null | undefined)[];\n forbidden?: AppPageModule | null;\n forbiddens?: readonly (AppPageModule | null | undefined)[];\n isDynamic: boolean;\n layouts: readonly AppPageModule[];\n layoutTreePositions?: readonly number[];\n loading?: AppPageModule | null;\n notFound?: AppPageModule | null;\n notFounds?: readonly (AppPageModule | null | undefined)[];\n params: readonly string[];\n pattern: string;\n routeSegments: readonly string[];\n unauthorized?: AppPageModule | null;\n unauthorizeds?: readonly (AppPageModule | null | undefined)[];\n};\n\nfunction resolveAppPageRouteBoundaryModule(\n route: AppPageDispatchRoute,\n statusCode: number,\n): AppPageModule | null {\n if (statusCode === 403) return route.forbidden ?? null;\n if (statusCode === 401) return route.unauthorized ?? null;\n if (statusCode === 404) return route.notFound ?? null;\n return null;\n}\n\ntype DispatchAppPageOptions<TRoute extends AppPageDispatchRoute> = {\n /** Configured basePath (e.g. \"/blog\"). Used to prefix redirect Locations. */\n basePath?: string;\n /**\n * Allow-list of OpenTelemetry propagation keys (from\n * `experimental.clientTraceMetadata`) to surface as `<meta>` tags in the\n * SSR head. Undefined or empty disables emission entirely.\n */\n clientTraceMetadata?: readonly string[];\n buildPageElement: (\n route: TRoute,\n params: AppPageParams,\n opts: AppPageDispatchInterceptOptions | undefined,\n searchParams: URLSearchParams,\n ) => Promise<AppPageElement>;\n cleanPathname: string;\n clearRequestContext: () => void;\n createRscOnErrorHandler: (pathname: string, routePath: string) => AppPageBoundaryOnError;\n debugClassification?: (layoutId: string, reason: ClassificationReason) => void;\n draftModeSecret: string;\n dynamicConfig?: string;\n dynamicParamsConfig?: boolean;\n fetchCache?: FetchCacheMode | null;\n findIntercept: (pathname: string) => AppPageDispatchIntercept | null;\n formState?: ReactFormState | null;\n actionError?: unknown;\n actionFailed?: boolean;\n generateStaticParams?: ValidateAppPageDynamicParamsOptions[\"generateStaticParams\"];\n getFontLinks: () => string[];\n getFontPreloads: () => AppPageFontPreload[];\n getFontStyles: () => string[];\n getNavigationContext: () => unknown;\n getSourceRoute: (sourceRouteIndex: number) => TRoute | undefined;\n hasGenerateStaticParams: boolean;\n hasPageDefaultExport: boolean;\n hasPageModule: boolean;\n handlerStart: number;\n interceptionContext: string | null;\n isEdgeRuntime?: boolean;\n isProgressiveActionRender?: boolean;\n isProduction: boolean;\n isRscRequest: boolean;\n isrDebug?: AppPageDebugLogger;\n isrGet: AppPageCacheGetter;\n isrHtmlKey: (pathname: string) => string;\n isrRscKey: (\n pathname: string,\n mountedSlotsHeader?: string | null,\n renderMode?: AppRscRenderMode,\n interceptionContext?: string | null,\n ) => string;\n isrSet: AppPageCacheSetter;\n loadSsrHandler: () => Promise<AppPageSsrHandler>;\n middlewareContext: AppPageMiddlewareContext;\n mountedSlotsHeader?: string | null;\n params: AppPageParams;\n staticParamsValidationParams?: AppPageParams;\n rootParams?: RootParams;\n probeLayoutAt: (layoutIndex: number) => unknown;\n probePage: () => unknown;\n expireSeconds?: number;\n renderErrorBoundaryPage: (error: unknown) => Promise<Response | null>;\n renderHttpAccessFallbackPage: (\n statusCode: number,\n opts: {\n boundaryComponent?: unknown;\n layouts?: readonly AppPageModule[];\n matchedParams: AppPageParams;\n },\n middlewareContext: AppPageMiddlewareContext | null,\n ) => Promise<Response | null>;\n renderToReadableStream: (\n element: AppPageRenderableElement,\n options: { onError: AppPageBoundaryOnError },\n ) => ReadableStream<Uint8Array>;\n request: Request;\n revalidateSeconds: number | null;\n resolveRouteFetchCacheMode?: (route: TRoute) => FetchCacheMode | null;\n rootForbiddenModule?: AppPageModule | null;\n rootNotFoundModule?: AppPageModule | null;\n rootUnauthorizedModule?: AppPageModule | null;\n route: TRoute;\n runWithSuppressedHookWarning<T>(probe: () => Promise<T>): Promise<T>;\n scheduleBackgroundRegeneration: AppPageBackgroundRegenerator;\n scriptNonce?: string;\n searchParams: URLSearchParams;\n setNavigationContext: (context: {\n params: AppPageParams;\n pathname: string;\n searchParams: URLSearchParams;\n }) => void;\n renderMode?: AppRscRenderMode;\n};\n\nfunction shouldReadAppPageCache(options: {\n isProgressiveActionRender: boolean;\n isDraftMode: boolean;\n isForceDynamic: boolean;\n isProduction: boolean;\n isRscRequest: boolean;\n revalidateSeconds: number | null;\n scriptNonce?: string;\n}): boolean {\n return (\n options.isProduction &&\n !options.isProgressiveActionRender &&\n !options.isDraftMode &&\n !options.isForceDynamic &&\n (options.isRscRequest || !options.scriptNonce) &&\n (options.revalidateSeconds === null || options.revalidateSeconds > 0)\n );\n}\n\nfunction buildAppPageTags(\n cleanPathname: string,\n extraTags: string[],\n routeSegments: readonly string[],\n): string[] {\n return buildPageCacheTags(cleanPathname, extraTags, [...routeSegments], \"page\");\n}\n\nasync function runAppPageRevalidationContext<\n TResult extends {\n html: string;\n rscData: ArrayBuffer;\n tags: string[];\n },\n>(\n options: {\n cleanPathname: string;\n currentFetchCacheMode?: FetchCacheMode | null;\n draftModeSecret: string;\n dynamicConfig?: string;\n params: AppPageParams;\n routePattern: string;\n routeSegments: readonly string[];\n setNavigationContext: DispatchAppPageOptions<AppPageDispatchRoute>[\"setNavigationContext\"];\n },\n renderFn: () => Promise<TResult>,\n): Promise<TResult> {\n const headersContext = createStaticGenerationHeadersContext({\n draftModeSecret: options.draftModeSecret,\n dynamicConfig: options.dynamicConfig,\n routeKind: \"page\",\n routePattern: options.routePattern,\n });\n const requestContext = createRequestContext({\n headersContext,\n currentFetchCacheMode: options.currentFetchCacheMode ?? null,\n executionContext: getRequestExecutionContext(),\n unstableCacheRevalidation: \"foreground\",\n });\n\n return runWithRequestContext(requestContext, async () => {\n ensureFetchPatch();\n setCurrentFetchSoftTags(buildAppPageTags(options.cleanPathname, [], options.routeSegments));\n options.setNavigationContext({\n pathname: options.cleanPathname,\n searchParams: new URLSearchParams(),\n params: options.params,\n });\n return await runWithFetchDedupe(renderFn);\n });\n}\n\nfunction getCapturedRscDataPromise(\n capturedRscDataPromise: Promise<ArrayBuffer> | null,\n): Promise<ArrayBuffer> {\n if (!capturedRscDataPromise) {\n throw new Error(\n \"[vinext] Expected captured RSC data while regenerating an app page cache entry\",\n );\n }\n\n return capturedRscDataPromise;\n}\n\nfunction toInterceptOptions(\n interceptionContext: string | null,\n intercept: AppPageDispatchIntercept,\n): AppPageDispatchInterceptOptions {\n return {\n interceptionContext,\n interceptLayouts: intercept.interceptLayouts,\n interceptPage: intercept.page,\n interceptParams: intercept.matchedParams,\n interceptSlotId: intercept.slotId ?? null,\n interceptSlotKey: intercept.slotKey,\n interceptSourceMatchedUrl: interceptionContext,\n };\n}\n\nexport async function dispatchAppPage<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n): Promise<Response> {\n return await runWithFetchDedupe(() => dispatchAppPageInner(options));\n}\n\nasync function dispatchAppPageInner<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n): Promise<Response> {\n const route = options.route;\n const dynamicConfig = options.dynamicConfig;\n const currentRevalidateSeconds = options.revalidateSeconds;\n const isForceStatic = dynamicConfig === \"force-static\";\n const isDynamicError = dynamicConfig === \"error\";\n const isForceDynamic = dynamicConfig === \"force-dynamic\";\n const isDraftMode = isDraftModeRequest(options.request, options.draftModeSecret);\n\n setCurrentFetchSoftTags(buildAppPageTags(options.cleanPathname, [], route.routeSegments));\n setCurrentFetchCacheMode(options.fetchCache ?? null);\n\n if (options.hasPageModule && !options.hasPageDefaultExport) {\n options.clearRequestContext();\n return new Response(\"Page has no default export\", { status: 500 });\n }\n\n const methodResponse = resolveAppPageMethodResponse({\n dynamicConfig,\n hasGenerateStaticParams: options.hasGenerateStaticParams,\n isDynamicRoute: route.isDynamic,\n middlewareHeaders: options.middlewareContext.headers,\n request: options.request,\n revalidateSeconds: currentRevalidateSeconds,\n });\n if (methodResponse) {\n options.clearRequestContext();\n return methodResponse;\n }\n\n if ((isForceStatic || isDynamicError) && !isDraftMode) {\n setHeadersContext(\n createStaticGenerationHeadersContext({\n draftModeSecret: options.draftModeSecret,\n dynamicConfig,\n routeKind: \"page\",\n routePattern: route.pattern,\n }),\n );\n options.setNavigationContext({\n pathname: options.cleanPathname,\n searchParams: new URLSearchParams(),\n params: options.params,\n });\n }\n\n if (\n shouldReadAppPageCache({\n isDraftMode,\n isForceDynamic,\n isProgressiveActionRender: options.isProgressiveActionRender === true,\n isProduction: options.isProduction,\n isRscRequest: options.isRscRequest,\n revalidateSeconds: currentRevalidateSeconds,\n scriptNonce: options.scriptNonce,\n })\n ) {\n const cachedPageResponse = await readAppPageCacheResponse({\n cleanPathname: options.cleanPathname,\n clearRequestContext: options.clearRequestContext,\n isEdgeRuntime: options.isEdgeRuntime,\n isRscRequest: options.isRscRequest,\n isrDebug: options.isrDebug,\n isrGet: options.isrGet,\n isrHtmlKey: options.isrHtmlKey,\n isrRscKey: options.isrRscKey,\n isrSet: options.isrSet,\n interceptionContext: options.interceptionContext,\n middlewareHeaders: options.middlewareContext.headers,\n middlewareStatus: options.middlewareContext.status,\n mountedSlotsHeader: options.mountedSlotsHeader,\n renderMode: options.renderMode,\n expireSeconds: options.expireSeconds,\n // cacheLife-only routes discover their actual revalidate during the\n // fresh render; this seed only gets them into the cache read path.\n revalidateSeconds: currentRevalidateSeconds ?? 0,\n renderFreshPageForCache: async () => {\n const revalidationTarget = resolveAppPageInterceptionRerenderTarget({\n cleanPathname: options.cleanPathname,\n currentParams: options.params,\n currentRoute: route,\n findIntercept: options.findIntercept,\n getRouteParamNames(sourceRoute) {\n return sourceRoute.params;\n },\n getSourceRoute(sourceRouteIndex) {\n return options.getSourceRoute(sourceRouteIndex);\n },\n isRscRequest: options.isRscRequest,\n toInterceptOpts(intercept) {\n return toInterceptOptions(options.interceptionContext, intercept);\n },\n });\n\n return runAppPageRevalidationContext(\n {\n cleanPathname: options.cleanPathname,\n currentFetchCacheMode:\n options.resolveRouteFetchCacheMode?.(revalidationTarget.route) ??\n (revalidationTarget.route === route ? (options.fetchCache ?? null) : null),\n draftModeSecret: options.draftModeSecret,\n dynamicConfig,\n params: revalidationTarget.navigationParams,\n routePattern: revalidationTarget.route.pattern,\n routeSegments: revalidationTarget.route.routeSegments,\n setNavigationContext: options.setNavigationContext,\n },\n async () => {\n const revalidatedElement = await options.buildPageElement(\n revalidationTarget.route,\n revalidationTarget.params,\n revalidationTarget.interceptOpts,\n new URLSearchParams(),\n );\n const revalidatedOnError = options.createRscOnErrorHandler(\n options.cleanPathname,\n revalidationTarget.route.pattern,\n );\n // No inner runWithFetchDedupe here: this renderFn is already\n // wrapped in runWithFetchDedupe by runAppPageRevalidationContext.\n const revalidatedRscStream = options.renderToReadableStream(revalidatedElement, {\n onError: revalidatedOnError,\n });\n const revalidatedRscCapture = teeAppPageRscStreamForCapture(revalidatedRscStream, true);\n const revalidatedSsrEntry = await options.loadSsrHandler();\n const revalidatedCapturedRscRef: { value: Promise<ArrayBuffer> | null } = {\n value: null,\n };\n const revalidatedHtmlStream = await revalidatedSsrEntry.handleSsr(\n revalidatedRscCapture.ssrStream,\n options.getNavigationContext(),\n {\n links: options.getFontLinks(),\n styles: options.getFontStyles(),\n preloads: options.getFontPreloads(),\n },\n {\n basePath: options.basePath,\n clientTraceMetadata: options.clientTraceMetadata,\n rootParams: options.rootParams,\n ...(revalidatedRscCapture.sideStream\n ? {\n sideStream: revalidatedRscCapture.sideStream,\n capturedRscDataRef: revalidatedCapturedRscRef,\n }\n : {}),\n },\n );\n const html = await readStreamAsText(revalidatedHtmlStream);\n const rscData = await getCapturedRscDataPromise(revalidatedCapturedRscRef.value);\n const cacheLife = _consumeRequestScopedCacheLife();\n options.clearRequestContext();\n const tags = buildAppPageTags(\n options.cleanPathname,\n getCollectedFetchTags(),\n revalidationTarget.route.routeSegments,\n );\n // Consume once: HTML and RSC artifacts are produced by the same\n // regeneration render and should carry the same observation set.\n const observationState = {\n dynamicFetches: consumeDynamicFetchObservations(),\n requestApis: consumeRenderRequestApiUsage(),\n };\n return {\n html,\n htmlRenderObservation: createAppPageRenderObservation({\n boundaryOutcome: { kind: \"success\" },\n cacheability: \"public\",\n cacheTags: tags,\n cleanPathname: options.cleanPathname,\n completeness: \"complete\",\n output: createAppPageHtmlOutputScope({\n element: revalidatedElement,\n renderEpoch: null,\n rootBoundaryId: null,\n routePattern: revalidationTarget.route.pattern,\n }),\n params: revalidationTarget.navigationParams,\n state: observationState,\n }),\n rscData,\n rscRenderObservation: createAppPageRenderObservation({\n boundaryOutcome: { kind: \"success\" },\n cacheability: \"public\",\n cacheTags: tags,\n cleanPathname: options.cleanPathname,\n completeness: \"complete\",\n output: createAppPageRscOutputScope({\n element: revalidatedElement,\n mountedSlotsHeader: options.mountedSlotsHeader,\n renderEpoch: null,\n rootBoundaryId: null,\n routePattern: revalidationTarget.route.pattern,\n }),\n params: revalidationTarget.navigationParams,\n state: observationState,\n }),\n tags,\n cacheControl:\n typeof cacheLife?.revalidate === \"number\"\n ? { revalidate: cacheLife.revalidate, expire: cacheLife.expire }\n : undefined,\n };\n },\n );\n },\n scheduleBackgroundRegeneration(key, renderFn) {\n options.scheduleBackgroundRegeneration(key, renderFn, {\n routerKind: \"App Router\",\n routePath: route.pattern,\n routeType: \"render\",\n });\n },\n });\n if (cachedPageResponse) {\n return cachedPageResponse;\n }\n }\n\n const dynamicParamsResponse = await validateAppPageDynamicParams({\n clearRequestContext: options.clearRequestContext,\n enforceStaticParamsOnly: options.dynamicParamsConfig === false,\n generateStaticParams: options.generateStaticParams,\n isDynamicRoute: route.isDynamic,\n params: options.staticParamsValidationParams ?? options.params,\n });\n if (dynamicParamsResponse) {\n return dynamicParamsResponse;\n }\n\n const interceptResult = await resolveAppPageIntercept<\n TRoute,\n unknown,\n AppPageDispatchInterceptOptions,\n AppPageElement\n >({\n buildPageElement(interceptRoute, interceptParams, interceptOpts, interceptSearchParams) {\n setCurrentFetchCacheMode(options.resolveRouteFetchCacheMode?.(interceptRoute) ?? null);\n return options.buildPageElement(\n interceptRoute,\n interceptParams,\n interceptOpts,\n interceptSearchParams,\n );\n },\n cleanPathname: options.cleanPathname,\n currentRoute: route,\n findIntercept(pathname) {\n return options.findIntercept(pathname);\n },\n getRouteParamNames(sourceRoute) {\n return sourceRoute.params;\n },\n getSourceRoute(sourceRouteIndex) {\n return options.getSourceRoute(sourceRouteIndex);\n },\n isRscRequest: options.isRscRequest,\n renderInterceptResponse(sourceRoute, interceptElement) {\n const interceptOnError = options.createRscOnErrorHandler(\n options.cleanPathname,\n sourceRoute.pattern,\n );\n // No inner runWithFetchDedupe here: dispatchAppPage already activated\n // dedupe at line 294, and this callback runs inside dispatchAppPageInner.\n const interceptStream = options.renderToReadableStream(interceptElement, {\n onError: interceptOnError,\n });\n const interceptHeaders = new Headers({\n \"Content-Type\": VINEXT_RSC_CONTENT_TYPE,\n Vary: VINEXT_RSC_VARY_HEADER,\n });\n mergeMiddlewareResponseHeaders(interceptHeaders, options.middlewareContext.headers);\n applyRscCompatibilityIdHeader(interceptHeaders);\n return new Response(interceptStream, {\n status: options.middlewareContext.status ?? 200,\n headers: interceptHeaders,\n });\n },\n searchParams: options.searchParams,\n setNavigationContext: options.setNavigationContext,\n toInterceptOpts(intercept) {\n return toInterceptOptions(options.interceptionContext, intercept);\n },\n });\n if (interceptResult.response) {\n return interceptResult.response;\n }\n\n const pageBuildResult = await buildAppPageElement({\n buildPageElement() {\n if (options.actionFailed) {\n throw options.actionError;\n }\n return options.buildPageElement(\n route,\n options.params,\n interceptResult.interceptOpts,\n options.searchParams,\n );\n },\n renderErrorBoundaryPage(buildError) {\n return options.renderErrorBoundaryPage(buildError);\n },\n renderSpecialError(specialError) {\n return renderPageSpecialError(options, specialError);\n },\n resolveSpecialError: resolveAppPageSpecialError,\n });\n if (pageBuildResult.response) {\n return pageBuildResult.response;\n }\n\n return renderAppPageLifecycle({\n basePath: options.basePath,\n clientTraceMetadata: options.clientTraceMetadata,\n cleanPathname: options.cleanPathname,\n clearRequestContext: options.clearRequestContext,\n consumeDynamicUsage,\n consumeInvalidDynamicUsageError,\n consumeRenderObservationState() {\n return {\n dynamicFetches: consumeDynamicFetchObservations(),\n requestApis: consumeRenderRequestApiUsage(),\n };\n },\n createRscOnErrorHandler(pathname, routePath) {\n return options.createRscOnErrorHandler(pathname, routePath);\n },\n element: pageBuildResult.element,\n getDraftModeCookieHeader,\n getFontLinks: options.getFontLinks,\n getFontPreloads: options.getFontPreloads,\n getFontStyles: options.getFontStyles,\n getNavigationContext: options.getNavigationContext,\n getPageTags() {\n return buildAppPageTags(options.cleanPathname, getCollectedFetchTags(), route.routeSegments);\n },\n getRequestCacheLife() {\n return _consumeRequestScopedCacheLife();\n },\n peekRequestCacheLife() {\n return _peekRequestScopedCacheLife();\n },\n handlerStart: options.handlerStart,\n hasLoadingBoundary: shouldSuppressLoadingBoundaries(\n options.renderMode ?? APP_RSC_RENDER_MODE_NAVIGATION,\n )\n ? false\n : Boolean(route.loading?.default),\n formState: options.formState ?? null,\n isProgressiveActionRender: options.isProgressiveActionRender === true,\n isDynamicError,\n isDraftMode,\n isForceDynamic,\n isForceStatic,\n isEdgeRuntime: options.isEdgeRuntime === true,\n isPrerender: process.env.VINEXT_PRERENDER === \"1\",\n isProduction: options.isProduction,\n isRscRequest: options.isRscRequest,\n isrDebug: options.isrDebug,\n isrHtmlKey: options.isrHtmlKey,\n isrRscKey: options.isrRscKey,\n isrSet: options.isrSet,\n interceptionContext: options.interceptionContext,\n expireSeconds: options.expireSeconds,\n layoutCount: route.layouts.length,\n loadSsrHandler: options.loadSsrHandler,\n middlewareContext: options.middlewareContext,\n params: options.params,\n rootParams: options.rootParams,\n peekRenderObservationState() {\n return {\n dynamicFetches: peekDynamicFetchObservations(),\n requestApis: peekRenderRequestApiUsage(),\n };\n },\n probeLayoutAt(layoutIndex) {\n return options.probeLayoutAt(layoutIndex);\n },\n probePage() {\n return options.probePage();\n },\n classification: {\n getLayoutId(index) {\n const treePosition = route.layoutTreePositions?.[index] ?? 0;\n return AppElementsWire.encodeLayoutId(\n createAppPageTreePath([...route.routeSegments], treePosition),\n );\n },\n buildTimeClassifications: route.__buildTimeClassifications,\n buildTimeReasons: route.__buildTimeReasons,\n debugClassification: options.debugClassification,\n async runWithIsolatedDynamicScope(fn) {\n const priorDynamic = consumeDynamicUsage();\n try {\n const result = await fn();\n const dynamicDetected = consumeDynamicUsage();\n return { result, dynamicDetected };\n } finally {\n consumeDynamicUsage();\n if (priorDynamic) markDynamicUsage();\n }\n },\n },\n revalidateSeconds: currentRevalidateSeconds,\n mountedSlotsHeader: options.mountedSlotsHeader,\n renderMode: options.renderMode ?? APP_RSC_RENDER_MODE_NAVIGATION,\n renderErrorBoundaryResponse(renderError) {\n return options.renderErrorBoundaryPage(renderError);\n },\n renderLayoutSpecialError(specialError, layoutIndex) {\n return renderLayoutSpecialError(options, specialError, layoutIndex);\n },\n renderPageSpecialError(specialError) {\n return renderPageSpecialError(options, specialError);\n },\n renderToReadableStream: options.renderToReadableStream,\n routeHasLocalBoundary: Boolean(\n route.error?.default || route.errors?.some((errorModule) => errorModule?.default),\n ),\n routePattern: route.pattern,\n runWithSuppressedHookWarning(probe) {\n return options.runWithSuppressedHookWarning(probe);\n },\n scriptNonce: options.scriptNonce,\n waitUntil(cachePromise) {\n getRequestExecutionContext()?.waitUntil(cachePromise);\n },\n });\n}\n\n/**\n * Builds an RSC flight payload that encodes a redirect as a React error chunk.\n * We render a tiny element that immediately throws an `Error` whose `digest`\n * is the canonical `NEXT_REDIRECT;...` string. `renderToReadableStream`'s\n * `onError` returns that digest, react-server-dom-webpack serializes the\n * error into the stream, and the client's `RedirectErrorBoundary` decodes it\n * via `getURLFromRedirectError` / `getRedirectTypeFromError`.\n *\n * The thrown error's digest matches Next.js's well-known router error format,\n * so neither vinext's RSC error handler nor Next.js's reporter logs it as a\n * \"real\" server error. Mirrors `app-render.tsx generateDynamicFlightRenderResult`\n * where a redirect thrown during RSC rendering propagates through\n * `renderToFlightStream`'s `onError` callback into the flight payload.\n */\nfunction buildRscRedirectFlightStream<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n digest: string,\n): ReadableStream<Uint8Array> {\n const throwingElement = React.createElement(function NextRedirectFlightThrower() {\n const err = new Error(\"NEXT_REDIRECT\") as Error & { digest: string };\n err.digest = digest;\n throw err;\n });\n\n return options.renderToReadableStream(throwingElement, {\n onError: () => digest,\n });\n}\n\nasync function renderLayoutSpecialError<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n specialError: AppPageSpecialError,\n layoutIndex: number,\n): Promise<Response> {\n return buildAppPageSpecialErrorResponse({\n basePath: options.basePath,\n buildRscRedirectFlightStream: (rscOptions) =>\n buildRscRedirectFlightStream(options, rscOptions.digest),\n clearRequestContext: options.clearRequestContext,\n getAndClearPendingCookies,\n isEdgeRuntime: options.isEdgeRuntime,\n isRscRequest: options.isRscRequest,\n middlewareContext: options.middlewareContext,\n renderFallbackPage(statusCode) {\n const parentBoundary = resolveAppPageParentHttpAccessBoundaryModule({\n layoutIndex,\n rootForbiddenModule: options.rootForbiddenModule,\n rootNotFoundModule: options.rootNotFoundModule,\n rootUnauthorizedModule: options.rootUnauthorizedModule,\n routeForbiddenModules: options.route.forbiddens,\n routeNotFoundModules: options.route.notFounds,\n routeUnauthorizedModules: options.route.unauthorizeds,\n statusCode,\n })?.default;\n return options.renderHttpAccessFallbackPage(\n statusCode,\n {\n boundaryComponent: parentBoundary,\n layouts: options.route.layouts.slice(0, layoutIndex),\n matchedParams: options.params,\n },\n null,\n );\n },\n request: options.request,\n specialError,\n });\n}\n\nasync function renderPageSpecialError<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n specialError: AppPageSpecialError,\n): Promise<Response> {\n return buildAppPageSpecialErrorResponse({\n basePath: options.basePath,\n buildRscRedirectFlightStream: (rscOptions) =>\n buildRscRedirectFlightStream(options, rscOptions.digest),\n clearRequestContext: options.clearRequestContext,\n getAndClearPendingCookies,\n isEdgeRuntime: options.isEdgeRuntime,\n isRscRequest: options.isRscRequest,\n middlewareContext: options.middlewareContext,\n renderFallbackPage(statusCode) {\n // `forbidden()` / `unauthorized()` / `notFound()` should be caught by the\n // nearest ancestor boundary. When the page (the deepest segment) calls\n // one of these and an intermediate layout has no matching boundary file,\n // resolve to the closest ancestor layout's boundary and slice off any\n // layouts beneath it so their UI does not render alongside the fallback.\n // Mirrors Next.js's per-segment boundary nesting in\n // `create-component-tree.tsx` (issue #1547).\n //\n // We only narrow layouts when the resolved boundary file lives at a\n // layout's own directory. A `forbidden.tsx` sibling to the route's\n // `page.tsx` (no layout there) wraps just the page subtree in Next.js,\n // so all of the route's layouts must still render.\n const routeBoundaryModule = resolveAppPageRouteBoundaryModule(options.route, statusCode);\n const layoutCount = options.route.layouts.length;\n const { module: parentBoundaryModule, layoutIndex: boundaryLayoutIndex } =\n resolveAppPageParentHttpAccessBoundary({\n layoutIndex: layoutCount,\n rootForbiddenModule: options.rootForbiddenModule,\n rootNotFoundModule: options.rootNotFoundModule,\n rootUnauthorizedModule: options.rootUnauthorizedModule,\n routeForbiddenModules: options.route.forbiddens,\n routeNotFoundModules: options.route.notFounds,\n routeUnauthorizedModules: options.route.unauthorizeds,\n statusCode,\n });\n // If the route-level boundary (closest walking up from page-dir) differs\n // from the per-layout resolution, a non-layout-aligned boundary sits\n // below the deepest layout — keep all layouts and let the existing route\n // boundary handling render it.\n const useLayoutAlignedBoundary =\n boundaryLayoutIndex !== null &&\n (routeBoundaryModule === null || routeBoundaryModule === parentBoundaryModule);\n const boundaryComponent = useLayoutAlignedBoundary\n ? ((parentBoundaryModule as { default?: unknown } | null)?.default ?? undefined)\n : undefined;\n const layoutsForBoundary =\n useLayoutAlignedBoundary && boundaryLayoutIndex !== null\n ? options.route.layouts.slice(0, boundaryLayoutIndex + 1)\n : undefined;\n return options.renderHttpAccessFallbackPage(\n statusCode,\n {\n boundaryComponent,\n layouts: layoutsForBoundary,\n matchedParams: options.params,\n },\n null,\n );\n },\n request: options.request,\n specialError,\n });\n}\n"],"mappings":"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"}
@@ -46,7 +46,8 @@ type BuildPageElementsOptions<TModule extends AppPageModule = AppPageModule, TEr
46
46
  * Configured next.config `basePath`. Threaded through `resolveAppPageHead`
47
47
  * so file-based metadata route URLs emitted in <head> are prefixed.
48
48
  */
49
- basePath?: string;
49
+ basePath?: string; /** Serialized next.config `htmlLimitedBots` regexp source. */
50
+ htmlLimitedBots?: string;
50
51
  };
51
52
  /**
52
53
  * Build the App Router element tree for a matched route.