vinext 0.1.8 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/README.md +51 -30
  2. package/dist/build/css-url-assets.d.ts +3 -1
  3. package/dist/build/css-url-assets.js +18 -1
  4. package/dist/build/inject-pregenerated-paths.d.ts +7 -0
  5. package/dist/build/inject-pregenerated-paths.js +21 -0
  6. package/dist/build/layout-classification.js +1 -1
  7. package/dist/build/nitro-route-rules.js +1 -1
  8. package/dist/build/pages-client-assets-module.d.ts +11 -0
  9. package/dist/build/pages-client-assets-module.js +27 -0
  10. package/dist/build/prerender-server-entry.d.ts +1 -0
  11. package/dist/build/prerender-server-entry.js +49 -0
  12. package/dist/build/prerender-server-pool.d.ts +44 -0
  13. package/dist/build/prerender-server-pool.js +194 -0
  14. package/dist/build/prerender.d.ts +2 -1
  15. package/dist/build/prerender.js +98 -27
  16. package/dist/build/report.d.ts +13 -2
  17. package/dist/build/report.js +99 -2
  18. package/dist/build/run-prerender.d.ts +7 -0
  19. package/dist/build/run-prerender.js +12 -2
  20. package/dist/build/standalone.js +2 -0
  21. package/dist/cache/cache-adapters-virtual.js +3 -3
  22. package/dist/check.d.ts +4 -6
  23. package/dist/check.js +48 -11
  24. package/dist/cli-args.d.ts +1 -2
  25. package/dist/cli-args.js +1 -1
  26. package/dist/cli-dev-config.d.ts +12 -0
  27. package/dist/cli-dev-config.js +23 -0
  28. package/dist/cli.js +112 -96
  29. package/dist/{server → client}/dev-error-overlay-store.d.ts +1 -1
  30. package/dist/{server → client}/dev-error-overlay-store.js +1 -1
  31. package/dist/{server → client}/dev-error-overlay.d.ts +1 -1
  32. package/dist/{server → client}/dev-error-overlay.js +2 -2
  33. package/dist/client/navigation-runtime.d.ts +2 -0
  34. package/dist/client/navigation-runtime.js +3 -1
  35. package/dist/client/vinext-next-data.d.ts +4 -1
  36. package/dist/client/window-next.d.ts +2 -1
  37. package/dist/cloudflare/index.d.ts +2 -2
  38. package/dist/cloudflare/index.js +2 -2
  39. package/dist/config/config-matchers.js +45 -19
  40. package/dist/config/next-config.d.ts +41 -9
  41. package/dist/config/next-config.js +60 -3
  42. package/dist/config/prerender.d.ts +34 -0
  43. package/dist/config/prerender.js +55 -0
  44. package/dist/entries/app-browser-entry.js +5 -1
  45. package/dist/entries/app-rsc-entry.d.ts +5 -3
  46. package/dist/entries/app-rsc-entry.js +44 -10
  47. package/dist/entries/app-rsc-manifest.js +2 -0
  48. package/dist/entries/pages-client-entry.d.ts +3 -0
  49. package/dist/entries/pages-client-entry.js +28 -3
  50. package/dist/entries/pages-server-entry.js +23 -6
  51. package/dist/image/image-adapters-virtual.d.ts +59 -0
  52. package/dist/image/image-adapters-virtual.js +59 -0
  53. package/dist/index.d.ts +33 -0
  54. package/dist/index.js +482 -120
  55. package/dist/init-cloudflare.d.ts +43 -0
  56. package/dist/init-cloudflare.js +839 -0
  57. package/dist/init-platform.d.ts +40 -0
  58. package/dist/init-platform.js +195 -0
  59. package/dist/init.d.ts +16 -38
  60. package/dist/init.js +209 -99
  61. package/dist/node_modules/.pnpm/am-i-vibing@0.5.0/node_modules/am-i-vibing/dist/detector-1yx2Hoe0.js +294 -0
  62. package/dist/node_modules/.pnpm/process-ancestry@0.1.0/node_modules/process-ancestry/dist/index.js +94 -0
  63. package/dist/{cloudflare → packages/cloudflare}/src/cache/cdn-adapter.runtime.js +1 -1
  64. package/dist/{cloudflare → packages/cloudflare}/src/cache/kv-data-adapter.runtime.d.ts +2 -2
  65. package/dist/{cloudflare → packages/cloudflare}/src/cache/kv-data-adapter.runtime.js +9 -2
  66. package/dist/packages/cloudflare/src/deploy-config.js +150 -0
  67. package/dist/packages/cloudflare/src/deploy-help.js +55 -0
  68. package/dist/packages/cloudflare/src/deploy.js +272 -0
  69. package/dist/{cloudflare → packages/cloudflare/src}/tpr.d.ts +4 -41
  70. package/dist/{cloudflare → packages/cloudflare/src}/tpr.js +44 -20
  71. package/dist/plugins/ast-scope.d.ts +16 -0
  72. package/dist/plugins/ast-scope.js +62 -0
  73. package/dist/plugins/ast-utils.d.ts +27 -1
  74. package/dist/plugins/ast-utils.js +32 -1
  75. package/dist/plugins/css-module-imports.d.ts +14 -0
  76. package/dist/plugins/css-module-imports.js +59 -0
  77. package/dist/plugins/extensionless-dynamic-import.js +2 -2
  78. package/dist/plugins/fonts.js +1 -1
  79. package/dist/plugins/ignore-dynamic-requests.d.ts +11 -0
  80. package/dist/plugins/ignore-dynamic-requests.js +530 -0
  81. package/dist/plugins/og-assets.js +2 -1
  82. package/dist/plugins/optimize-imports.js +1 -1
  83. package/dist/plugins/rsc-reference-validation-normalizer.d.ts +12 -0
  84. package/dist/plugins/rsc-reference-validation-normalizer.js +48 -0
  85. package/dist/plugins/sass.d.ts +17 -1
  86. package/dist/plugins/sass.js +74 -1
  87. package/dist/plugins/styled-jsx.d.ts +16 -0
  88. package/dist/plugins/styled-jsx.js +149 -0
  89. package/dist/plugins/typeof-window.d.ts +1 -1
  90. package/dist/plugins/typeof-window.js +28 -56
  91. package/dist/routing/app-route-graph.d.ts +23 -2
  92. package/dist/routing/app-route-graph.js +138 -38
  93. package/dist/routing/file-matcher.d.ts +11 -1
  94. package/dist/routing/file-matcher.js +18 -3
  95. package/dist/routing/pages-router.js +2 -2
  96. package/dist/server/api-handler.js +9 -14
  97. package/dist/server/app-browser-action-result.d.ts +4 -1
  98. package/dist/server/app-browser-action-result.js +8 -1
  99. package/dist/server/app-browser-entry.js +198 -57
  100. package/dist/server/app-browser-interception-context.d.ts +1 -0
  101. package/dist/server/app-browser-interception-context.js +4 -2
  102. package/dist/server/app-browser-navigation-controller.d.ts +2 -0
  103. package/dist/server/app-browser-navigation-controller.js +60 -31
  104. package/dist/server/app-browser-server-action-client.d.ts +1 -1
  105. package/dist/server/app-browser-server-action-client.js +8 -7
  106. package/dist/server/app-browser-state.d.ts +12 -1
  107. package/dist/server/app-browser-state.js +25 -8
  108. package/dist/server/app-browser-visible-commit.d.ts +6 -1
  109. package/dist/server/app-browser-visible-commit.js +42 -24
  110. package/dist/server/app-elements-wire.d.ts +9 -2
  111. package/dist/server/app-elements-wire.js +8 -1
  112. package/dist/server/app-elements.d.ts +2 -2
  113. package/dist/server/app-elements.js +4 -3
  114. package/dist/server/app-fallback-renderer.d.ts +2 -1
  115. package/dist/server/app-fallback-renderer.js +10 -6
  116. package/dist/server/app-hydration-cache-publication.d.ts +11 -0
  117. package/dist/server/app-hydration-cache-publication.js +43 -0
  118. package/dist/server/app-middleware.d.ts +4 -3
  119. package/dist/server/app-middleware.js +8 -3
  120. package/dist/server/app-optimistic-routing.js +11 -4
  121. package/dist/server/app-page-boundary.js +2 -1
  122. package/dist/server/app-page-cache-finalizer.d.ts +1 -0
  123. package/dist/server/app-page-cache-finalizer.js +5 -4
  124. package/dist/server/app-page-cache-render.d.ts +1 -0
  125. package/dist/server/app-page-cache-render.js +8 -4
  126. package/dist/server/app-page-cache.d.ts +1 -0
  127. package/dist/server/app-page-cache.js +27 -7
  128. package/dist/server/app-page-dispatch.d.ts +1 -0
  129. package/dist/server/app-page-dispatch.js +26 -8
  130. package/dist/server/app-page-element-builder.d.ts +2 -1
  131. package/dist/server/app-page-element-builder.js +59 -4
  132. package/dist/server/app-page-execution.js +2 -1
  133. package/dist/server/app-page-probe.js +5 -0
  134. package/dist/server/app-page-render-identity.d.ts +2 -0
  135. package/dist/server/app-page-render-identity.js +3 -2
  136. package/dist/server/app-page-render.d.ts +2 -0
  137. package/dist/server/app-page-render.js +85 -16
  138. package/dist/server/app-page-request.d.ts +14 -0
  139. package/dist/server/app-page-request.js +69 -4
  140. package/dist/server/app-page-response.d.ts +7 -0
  141. package/dist/server/app-page-response.js +16 -4
  142. package/dist/server/app-page-route-wiring.d.ts +8 -1
  143. package/dist/server/app-page-route-wiring.js +32 -18
  144. package/dist/server/app-page-segment-state.d.ts +2 -1
  145. package/dist/server/app-page-segment-state.js +3 -1
  146. package/dist/server/app-page-stream.d.ts +7 -1
  147. package/dist/server/app-page-stream.js +3 -1
  148. package/dist/server/app-route-handler-execution.js +5 -1
  149. package/dist/server/app-route-handler-response.js +1 -0
  150. package/dist/server/app-route-handler-runtime.js +1 -1
  151. package/dist/server/app-route-tree-prefetch.d.ts +43 -0
  152. package/dist/server/app-route-tree-prefetch.js +187 -0
  153. package/dist/server/app-router-entry.js +9 -2
  154. package/dist/server/app-rsc-cache-busting.d.ts +2 -1
  155. package/dist/server/app-rsc-cache-busting.js +9 -4
  156. package/dist/server/app-rsc-handler.d.ts +7 -0
  157. package/dist/server/app-rsc-handler.js +148 -39
  158. package/dist/server/app-rsc-render-mode.d.ts +3 -2
  159. package/dist/server/app-rsc-render-mode.js +4 -1
  160. package/dist/server/app-rsc-request-normalization.d.ts +6 -6
  161. package/dist/server/app-rsc-request-normalization.js +10 -8
  162. package/dist/server/app-segment-config.d.ts +11 -0
  163. package/dist/server/app-segment-config.js +62 -6
  164. package/dist/server/app-server-action-execution.d.ts +1 -0
  165. package/dist/server/app-server-action-execution.js +61 -30
  166. package/dist/server/app-ssr-entry.d.ts +3 -0
  167. package/dist/server/app-ssr-entry.js +13 -5
  168. package/dist/server/app-ssr-stream.d.ts +7 -3
  169. package/dist/server/app-ssr-stream.js +10 -6
  170. package/dist/server/app-visited-response-cache.d.ts +6 -0
  171. package/dist/server/app-visited-response-cache.js +3 -1
  172. package/dist/server/cache-control.d.ts +3 -1
  173. package/dist/server/cache-control.js +13 -1
  174. package/dist/server/client-trace-metadata.js +26 -0
  175. package/dist/server/default-global-not-found-module.d.ts +14 -0
  176. package/dist/server/default-global-not-found-module.js +14 -0
  177. package/dist/server/dev-route-files.js +4 -0
  178. package/dist/server/dev-server.d.ts +11 -1
  179. package/dist/server/dev-server.js +94 -35
  180. package/dist/server/dev-stack-sourcemap.d.ts +1 -1
  181. package/dist/server/dev-stack-sourcemap.js +1 -1
  182. package/dist/server/fetch-handler.d.ts +2 -0
  183. package/dist/server/fetch-handler.js +18 -0
  184. package/dist/server/headers.d.ts +7 -15
  185. package/dist/server/headers.js +11 -18
  186. package/dist/server/image-optimization.d.ts +51 -1
  187. package/dist/server/image-optimization.js +52 -2
  188. package/dist/server/implicit-tags.js +1 -1
  189. package/dist/server/isr-cache.d.ts +3 -2
  190. package/dist/server/isr-cache.js +9 -5
  191. package/dist/server/metadata-routes.d.ts +3 -1
  192. package/dist/server/metadata-routes.js +12 -2
  193. package/dist/server/middleware-runtime.js +6 -1
  194. package/dist/server/navigation-planner.d.ts +1 -0
  195. package/dist/server/navigation-planner.js +14 -3
  196. package/dist/server/pages-api-route.js +2 -2
  197. package/dist/server/pages-asset-tags.d.ts +4 -6
  198. package/dist/server/pages-asset-tags.js +12 -12
  199. package/dist/server/pages-client-assets.d.ts +12 -0
  200. package/dist/server/pages-client-assets.js +10 -0
  201. package/dist/server/pages-data-route.d.ts +4 -2
  202. package/dist/server/pages-data-route.js +18 -4
  203. package/dist/server/pages-dev-module-url.d.ts +2 -1
  204. package/dist/server/pages-dev-module-url.js +6 -3
  205. package/dist/server/pages-node-compat.d.ts +19 -1
  206. package/dist/server/pages-node-compat.js +81 -4
  207. package/dist/server/pages-page-data.d.ts +33 -1
  208. package/dist/server/pages-page-data.js +62 -33
  209. package/dist/server/pages-page-handler.d.ts +2 -1
  210. package/dist/server/pages-page-handler.js +38 -19
  211. package/dist/server/pages-page-response.d.ts +8 -0
  212. package/dist/server/pages-page-response.js +7 -3
  213. package/dist/server/pages-request-pipeline.d.ts +9 -5
  214. package/dist/server/pages-request-pipeline.js +55 -7
  215. package/dist/server/pages-router-entry.d.ts +30 -0
  216. package/dist/server/pages-router-entry.js +108 -0
  217. package/dist/server/prerender-manifest.d.ts +3 -1
  218. package/dist/server/prerender-route-params.js +1 -1
  219. package/dist/server/prod-server.d.ts +5 -3
  220. package/dist/server/prod-server.js +68 -39
  221. package/dist/server/request-pipeline.js +2 -1
  222. package/dist/server/seed-cache.js +4 -4
  223. package/dist/shims/app-router-scroll-state.d.ts +1 -0
  224. package/dist/shims/app-router-scroll-state.js +1 -0
  225. package/dist/shims/app-router-scroll.js +2 -1
  226. package/dist/shims/cache-handler.js +8 -1
  227. package/dist/shims/cache.js +22 -15
  228. package/dist/shims/cdn-cache.js +1 -1
  229. package/dist/shims/dynamic-preload-chunks.js +2 -1
  230. package/dist/shims/fetch-cache.d.ts +3 -1
  231. package/dist/shims/fetch-cache.js +77 -52
  232. package/dist/shims/form.d.ts +4 -2
  233. package/dist/shims/form.js +37 -43
  234. package/dist/shims/headers.d.ts +7 -1
  235. package/dist/shims/headers.js +17 -3
  236. package/dist/shims/image.js +75 -14
  237. package/dist/shims/internal/app-prefetch-fetch-queue.d.ts +10 -0
  238. package/dist/shims/internal/app-prefetch-fetch-queue.js +61 -0
  239. package/dist/shims/internal/app-route-detection.d.ts +2 -17
  240. package/dist/shims/internal/app-route-detection.js +4 -17
  241. package/dist/shims/internal/hybrid-client-route-owner-direct.d.ts +23 -0
  242. package/dist/shims/internal/hybrid-client-route-owner-direct.js +51 -0
  243. package/dist/shims/internal/hybrid-client-route-owner.d.ts +3 -15
  244. package/dist/shims/internal/hybrid-client-route-owner.js +40 -58
  245. package/dist/shims/internal/pages-data-fetch-dedup.d.ts +10 -5
  246. package/dist/shims/internal/pages-data-fetch-dedup.js +84 -14
  247. package/dist/shims/internal/pages-data-target.d.ts +18 -12
  248. package/dist/shims/internal/pages-data-target.js +97 -13
  249. package/dist/shims/internal/pages-router-components.d.ts +7 -0
  250. package/dist/shims/internal/pages-router-components.js +13 -0
  251. package/dist/shims/layout-segment-context.d.ts +4 -1
  252. package/dist/shims/layout-segment-context.js +18 -4
  253. package/dist/shims/link.d.ts +1 -1
  254. package/dist/shims/link.js +224 -58
  255. package/dist/shims/navigation.d.ts +19 -3
  256. package/dist/shims/navigation.js +245 -47
  257. package/dist/shims/request-context.js +18 -0
  258. package/dist/shims/root-params.d.ts +15 -1
  259. package/dist/shims/root-params.js +21 -1
  260. package/dist/shims/router.d.ts +5 -7
  261. package/dist/shims/router.js +387 -102
  262. package/dist/shims/server.js +3 -2
  263. package/dist/shims/slot.js +3 -6
  264. package/dist/shims/unified-request-context.js +1 -0
  265. package/dist/typegen.js +1 -1
  266. package/dist/utils/client-runtime-metadata.d.ts +2 -18
  267. package/dist/utils/client-runtime-metadata.js +31 -22
  268. package/dist/utils/dev-stack-sourcemap-endpoint.d.ts +4 -0
  269. package/dist/{server → utils}/dev-stack-sourcemap-endpoint.js +1 -1
  270. package/dist/utils/domain-locale.d.ts +6 -3
  271. package/dist/{server → utils}/middleware-request-headers.d.ts +1 -1
  272. package/dist/{server → utils}/middleware-request-headers.js +3 -3
  273. package/dist/utils/project.d.ts +48 -2
  274. package/dist/utils/project.js +225 -4
  275. package/dist/utils/protocol-headers.d.ts +23 -0
  276. package/dist/utils/protocol-headers.js +23 -0
  277. package/dist/utils/react-version.d.ts +4 -0
  278. package/dist/utils/react-version.js +44 -0
  279. package/dist/utils/vite-version.d.ts +2 -0
  280. package/dist/utils/vite-version.js +11 -1
  281. package/package.json +47 -2
  282. package/dist/deploy.d.ts +0 -197
  283. package/dist/deploy.js +0 -1040
  284. package/dist/server/dev-stack-sourcemap-endpoint.d.ts +0 -4
  285. /package/dist/{cloudflare → packages/cloudflare}/src/utils/cache-control-metadata.js +0 -0
@@ -1,12 +1,13 @@
1
1
  import { createRequestContext, runWithRequestContext } from "../shims/unified-request-context.js";
2
2
  import { getRequestExecutionContext } from "../shims/request-context.js";
3
+ import "../utils/protocol-headers.js";
3
4
  import { AppElementsWire } from "./app-elements-wire.js";
4
- import { shouldSuppressLoadingBoundaries } from "./app-rsc-render-mode.js";
5
+ import { APP_RSC_RENDER_MODE_PREFETCH_DYNAMIC_SHELL, shouldSuppressLoadingBoundaries } from "./app-rsc-render-mode.js";
5
6
  import "./app-elements.js";
6
7
  import { consumeDynamicUsage, consumeInvalidDynamicUsageError, getAndClearPendingCookies, getDraftModeCookieHeader, getHeadersContext, isDraftModeRequest, markDynamicUsage, peekDynamicUsage, peekRenderRequestApiUsage, setHeadersContext } from "../shims/headers.js";
7
8
  import { _consumeRequestScopedCacheLife, _peekRequestScopedCacheLife } from "../shims/cache-request-state.js";
8
- import { ensureFetchPatch, getCollectedFetchTags, peekDynamicFetchObservations, runWithFetchDedupe, setCurrentFetchCacheMode, setCurrentFetchSoftTags, setCurrentForceDynamicFetchDefault } from "../shims/fetch-cache.js";
9
- import { VINEXT_RSC_CONTENT_TYPE, VINEXT_RSC_VARY_HEADER, applyRscCompatibilityIdHeader } from "./app-rsc-cache-busting.js";
9
+ import { ensureFetchPatch, getCollectedFetchTags, peekDynamicFetchObservations, runWithFetchDedupe, setCurrentFetchCacheMode, setCurrentFetchSoftTags, setCurrentForceDynamicFetchDefault, setRefreshStaleFetchesInForeground } from "../shims/fetch-cache.js";
10
+ import { VINEXT_RSC_CONTENT_TYPE, VINEXT_RSC_VARY_HEADER, applyRscCompatibilityIdHeader, applyRscDeploymentIdHeader } from "./app-rsc-cache-busting.js";
10
11
  import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
11
12
  import "./app-page-response.js";
12
13
  import { buildAppPageSpecialErrorResponse, probeAppPageThrownError, resolveAppPageSpecialError } from "./app-page-execution.js";
@@ -100,6 +101,10 @@ function getEffectiveLayoutClassifications(route, debugClassification) {
100
101
  function shouldReadAppPageCache(options) {
101
102
  return options.isProduction && !options.isProgressiveActionRender && !options.isDraftMode && !options.isForceDynamic && (options.isRscRequest || !options.scriptNonce) && (options.revalidateSeconds === null || options.revalidateSeconds > 0);
102
103
  }
104
+ function resolveAppPageCacheReadRevalidateSeconds(options) {
105
+ if (options.revalidateSeconds === null && (options.isForceStatic || options.isDynamicError)) return Infinity;
106
+ return options.revalidateSeconds ?? 0;
107
+ }
103
108
  function hasSearchParams(searchParams) {
104
109
  return searchParams !== null && searchParams !== void 0 && searchParams.size > 0;
105
110
  }
@@ -119,6 +124,7 @@ async function runAppPageRevalidationContext(options, renderFn) {
119
124
  unstableCacheRevalidation: "foreground"
120
125
  }), async () => {
121
126
  ensureFetchPatch();
127
+ setRefreshStaleFetchesInForeground(process.env.VINEXT_PRERENDER === "1");
122
128
  setCurrentFetchSoftTags(buildAppPageTags(options.cleanPathname, [], options.routeSegments));
123
129
  options.setNavigationContext({
124
130
  pathname: options.displayPathname ?? options.cleanPathname,
@@ -154,10 +160,12 @@ async function dispatchAppPageInner(options) {
154
160
  const isForceStatic = dynamicConfig === "force-static";
155
161
  const isDynamicError = dynamicConfig === "error";
156
162
  const isForceDynamic = dynamicConfig === "force-dynamic";
163
+ const isPrefetchDynamicShell = options.renderMode === APP_RSC_RENDER_MODE_PREFETCH_DYNAMIC_SHELL;
157
164
  const isDraftMode = isDraftModeRequest(options.request, options.draftModeSecret);
158
165
  const requestHeadersContext = getHeadersContext();
159
- const hasRequestSearchParams = !isForceStatic && hasSearchParams(options.searchParams);
160
- const pageSearchParams = isForceStatic ? new URLSearchParams() : options.searchParams;
166
+ const shouldUseEmptySearchParams = isForceStatic || isPrefetchDynamicShell;
167
+ const hasRequestSearchParams = !shouldUseEmptySearchParams && hasSearchParams(options.searchParams);
168
+ const pageSearchParams = shouldUseEmptySearchParams ? new URLSearchParams() : options.searchParams;
161
169
  const layoutParamAccess = createAppLayoutParamAccessTracker();
162
170
  const hasActiveLoadingBoundary = shouldSuppressLoadingBoundaries(options.renderMode ?? "navigation") ? false : Boolean(route.loading?.default);
163
171
  setCurrentFetchSoftTags(buildAppPageTags(options.cleanPathname, [], route.routeSegments));
@@ -222,7 +230,11 @@ async function dispatchAppPageInner(options) {
222
230
  mountedSlotsHeader: options.mountedSlotsHeader,
223
231
  renderMode: options.renderMode,
224
232
  expireSeconds: options.expireSeconds,
225
- revalidateSeconds: currentRevalidateSeconds ?? 0,
233
+ revalidateSeconds: resolveAppPageCacheReadRevalidateSeconds({
234
+ isDynamicError,
235
+ isForceStatic,
236
+ revalidateSeconds: currentRevalidateSeconds
237
+ }),
226
238
  renderFreshPageForCache: async () => {
227
239
  const revalidationTarget = await resolveAppPageInterceptionRerenderTarget({
228
240
  cleanPathname: options.cleanPathname,
@@ -284,6 +296,7 @@ async function dispatchAppPageInner(options) {
284
296
  return {
285
297
  html: rendered.html,
286
298
  htmlRenderObservation: rendered.htmlRenderObservation,
299
+ linkHeader: rendered.linkHeader,
287
300
  rscData: rendered.rscData,
288
301
  rscRenderObservation: rendered.rscRenderObservation,
289
302
  tags: rendered.tags,
@@ -360,6 +373,7 @@ async function dispatchAppPageInner(options) {
360
373
  });
361
374
  mergeMiddlewareResponseHeaders(interceptHeaders, options.middlewareContext.headers);
362
375
  applyRscCompatibilityIdHeader(interceptHeaders);
376
+ applyRscDeploymentIdHeader(interceptHeaders);
363
377
  return new Response(interceptStream, {
364
378
  status: options.middlewareContext.status ?? 200,
365
379
  headers: interceptHeaders
@@ -427,6 +441,8 @@ async function dispatchAppPageInner(options) {
427
441
  const activeFallbackShellState = options.pprRuntime?.getState() ?? null;
428
442
  const pprFallbackShellSignal = activeFallbackShellState?.abortController.signal;
429
443
  const pprFallbackShellReactSignal = activeFallbackShellState?.reactAbortController.signal;
444
+ const isPrerender = process.env.VINEXT_PRERENDER === "1";
445
+ const isSpeculativePrerender = isPrerender && options.request.headers.get("x-vinext-prerender-speculative") === "1";
430
446
  return renderAppPageLifecycle({
431
447
  basePath: options.basePath,
432
448
  clientTraceMetadata: options.clientTraceMetadata,
@@ -458,7 +474,7 @@ async function dispatchAppPageInner(options) {
458
474
  },
459
475
  handlerStart: options.handlerStart,
460
476
  hasLoadingBoundary: hasActiveLoadingBoundary,
461
- omitPendingDynamicCacheState: !options.isRscRequest && hasRequestSearchParams,
477
+ omitPendingDynamicCacheState: hasRequestSearchParams,
462
478
  formState: options.formState ?? null,
463
479
  isProgressiveActionRender: options.isProgressiveActionRender === true,
464
480
  isDynamicError,
@@ -466,7 +482,8 @@ async function dispatchAppPageInner(options) {
466
482
  isForceDynamic,
467
483
  isForceStatic,
468
484
  isEdgeRuntime: options.isEdgeRuntime === true,
469
- isPrerender: process.env.VINEXT_PRERENDER === "1",
485
+ isPrerender,
486
+ isSpeculativePrerender,
470
487
  isProduction: options.isProduction,
471
488
  isRscRequest: options.isRscRequest,
472
489
  isrDebug: options.isrDebug,
@@ -482,6 +499,7 @@ async function dispatchAppPageInner(options) {
482
499
  params: options.params,
483
500
  pprFallbackShellSignal,
484
501
  pprFallbackShellReactSignal,
502
+ renderedPathAndSearch: options.renderedPathAndSearch,
485
503
  abortPprFallbackShell: activeFallbackShellState ? () => {
486
504
  options.pprRuntime.beginFinalRender(activeFallbackShellState);
487
505
  } : void 0,
@@ -95,6 +95,7 @@ type AppPageNavigationParamInterceptOptions = {
95
95
  * {@link https://github.com/vercel/next.js/blob/canary/packages/next/src/server/app-render/create-metadata.tsx|create-metadata.tsx}.
96
96
  */
97
97
  declare function buildPageElements<TModule extends AppPageModule = AppPageModule, TErrorModule extends AppPageErrorModule = AppPageErrorModule>(options: BuildPageElementsOptions<TModule, TErrorModule>): Promise<AppElements>;
98
+ declare function resolveInterceptedSlotSegments(sourcePageSegments: readonly string[] | null | undefined, slotKey: string): readonly string[] | null;
98
99
  declare function resolveAppPageNavigationParams(route: AppPageNavigationParamRoute, routeParams: AppPageParams, routePath: string, opts?: AppPageNavigationParamInterceptOptions | null): AppPageParams;
99
100
  //#endregion
100
- export { AppPageBuildRoute, type AppPageErrorModule, AppPageInterceptOptions, AppPagePageRequest, type AppPageRouteWiringRoute, BuildPageElementsOptions, buildPageElements, resolveAppPageNavigationParams };
101
+ export { AppPageBuildRoute, type AppPageErrorModule, AppPageInterceptOptions, AppPagePageRequest, type AppPageRouteWiringRoute, BuildPageElementsOptions, buildPageElements, resolveAppPageNavigationParams, resolveInterceptedSlotSegments };
@@ -1,8 +1,8 @@
1
- import { matchRoutePattern } from "../routing/route-pattern.js";
2
1
  import { AppElementsWire } from "./app-elements-wire.js";
3
2
  import { APP_RSC_RENDER_MODE_NAVIGATION } from "./app-rsc-render-mode.js";
4
3
  import "./app-elements.js";
5
4
  import { createAppPageRenderIdentity } from "./app-page-render-identity.js";
5
+ import { matchRoutePattern } from "../routing/route-pattern.js";
6
6
  import { makeThenableParams } from "../shims/thenable-params.js";
7
7
  import { resolveAppPageBranchParams } from "./app-page-params.js";
8
8
  import { resolveActiveParallelRouteHeadInputs, resolveAppPageHead } from "./app-page-head.js";
@@ -51,6 +51,8 @@ async function buildPageElements(options) {
51
51
  const hasPageModule = !!pageModule;
52
52
  const renderIdentity = createAppPageRenderIdentity({
53
53
  displayPathname,
54
+ matchedRoutePathname: routePath,
55
+ targetMatchedPathname: routePath,
54
56
  interceptionContext: opts?.interceptionContext ?? null,
55
57
  interceptSourceMatchedUrl: opts?.interceptSourceMatchedUrl ?? null,
56
58
  interceptSlotId: isSiblingIntercept ? null : opts?.interceptSlotId ?? null
@@ -181,18 +183,71 @@ function buildSlotOverrides(route, routeParams, routePath, opts) {
181
183
  layoutModules: opts.interceptLayouts || null,
182
184
  layoutSegments: opts.interceptLayoutSegments ?? null,
183
185
  pageModule: opts.interceptPage,
184
- params: opts.interceptParams || routeParams
186
+ params: opts.interceptParams || routeParams,
187
+ routeSegments: resolveInterceptedSlotSegments(opts.interceptSourcePageSegments, opts.interceptSlotKey)
185
188
  };
186
189
  const slotParamOverrides = resolveSlotParamOverrides(route, routePath);
187
190
  for (const [slotKey, params] of Object.entries(slotParamOverrides ?? {})) {
188
191
  const existing = overrides[slotKey];
189
192
  overrides[slotKey] = existing ? {
190
193
  ...existing,
191
- params
194
+ params: existing.params ?? params
192
195
  } : { params };
193
196
  }
194
197
  return Object.keys(overrides).length > 0 ? overrides : null;
195
198
  }
199
+ function resolveInterceptedSlotSegments(sourcePageSegments, slotKey) {
200
+ if (!sourcePageSegments) return null;
201
+ const markerTraversals = [
202
+ {
203
+ prefix: "(...)",
204
+ levels: Number.POSITIVE_INFINITY
205
+ },
206
+ {
207
+ prefix: "(..)(..)",
208
+ levels: 2
209
+ },
210
+ {
211
+ prefix: "(..)",
212
+ levels: 1
213
+ },
214
+ {
215
+ prefix: "(.)",
216
+ levels: 0
217
+ }
218
+ ];
219
+ const markerIndex = sourcePageSegments.findIndex((segment) => markerTraversals.some(({ prefix }) => segment.startsWith(prefix)));
220
+ if (markerIndex < 0) return null;
221
+ const slotPathSeparator = slotKey.indexOf("@");
222
+ const ownerSegments = (slotPathSeparator >= 0 ? slotKey.slice(slotPathSeparator + 1) : "").split("/").filter(Boolean);
223
+ let segmentStart = ownerSegments.length;
224
+ if (segmentStart === 0 || segmentStart > markerIndex || !ownerSegments.every((segment, index) => sourcePageSegments[index] === segment)) {
225
+ let slotName = null;
226
+ for (let index = ownerSegments.length - 1; index >= 0; index--) if (ownerSegments[index].startsWith("@")) {
227
+ slotName = ownerSegments[index];
228
+ break;
229
+ }
230
+ let slotIndex = -1;
231
+ if (slotName) {
232
+ for (let index = markerIndex - 1; index >= 0; index--) if (sourcePageSegments[index] === slotName) {
233
+ slotIndex = index;
234
+ break;
235
+ }
236
+ }
237
+ if (slotIndex < 0) return null;
238
+ segmentStart = slotIndex + 1;
239
+ }
240
+ const routeSegments = sourcePageSegments.slice(segmentStart, markerIndex).filter((segment) => !segment.startsWith("@") && !(segment.startsWith("(") && segment.endsWith(")")));
241
+ const markerSegment = sourcePageSegments[markerIndex];
242
+ const marker = markerTraversals.find(({ prefix }) => markerSegment.startsWith(prefix));
243
+ if (!marker) return null;
244
+ if (Number.isFinite(marker.levels)) routeSegments.splice(Math.max(0, routeSegments.length - marker.levels), marker.levels);
245
+ else routeSegments.length = 0;
246
+ const targetSegment = markerSegment.slice(marker.prefix.length);
247
+ if (targetSegment) routeSegments.push(targetSegment);
248
+ routeSegments.push(...sourcePageSegments.slice(markerIndex + 1).filter((segment) => !segment.startsWith("@") && !(segment.startsWith("(") && segment.endsWith(")"))));
249
+ return routeSegments;
250
+ }
196
251
  function resolveSlotParamOverrides(route, routePath) {
197
252
  const overrides = {};
198
253
  const slots = route.slots;
@@ -238,4 +293,4 @@ function collectParamNameSet(params) {
238
293
  return set;
239
294
  }
240
295
  //#endregion
241
- export { buildPageElements, resolveAppPageNavigationParams };
296
+ export { buildPageElements, resolveAppPageNavigationParams, resolveInterceptedSlotSegments };
@@ -1,7 +1,7 @@
1
1
  import { addBasePathToPathname } from "../utils/base-path.js";
2
2
  import { VINEXT_RSC_REDIRECT_HEADER } from "./headers.js";
3
3
  import { runWithConnectionProbe } from "../shims/headers.js";
4
- import { VINEXT_RSC_CONTENT_TYPE, applyRscCompatibilityIdHeader, createRscRedirectLocation } from "./app-rsc-cache-busting.js";
4
+ import { VINEXT_RSC_CONTENT_TYPE, applyRscCompatibilityIdHeader, applyRscDeploymentIdHeader, createRscRedirectLocation } from "./app-rsc-cache-busting.js";
5
5
  import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
6
6
  import { applyEdgeRuntimeHeader } from "./app-page-response.js";
7
7
  import { parseNextHttpErrorDigest, parseNextRedirectDigest } from "./next-error-digest.js";
@@ -161,6 +161,7 @@ async function buildAppPageSpecialErrorResponse(options) {
161
161
  });
162
162
  applyEdgeRuntimeHeader(headers, options.isEdgeRuntime);
163
163
  applyRscCompatibilityIdHeader(headers);
164
+ applyRscDeploymentIdHeader(headers);
164
165
  mergeMiddlewareResponseHeaders(headers, options.middlewareContext?.headers ?? null);
165
166
  const pendingCookies = options.getAndClearPendingCookies?.() ?? [];
166
167
  for (const cookie of pendingCookies) headers.append("Set-Cookie", cookie);
@@ -12,6 +12,7 @@ const DEFAULT_SUBTREE_PROBE_MAX_NODES = 1e3;
12
12
  const REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref");
13
13
  const REACT_LAZY_TYPE = Symbol.for("react.lazy");
14
14
  const REACT_MEMO_TYPE = Symbol.for("react.memo");
15
+ const REACT_CLIENT_REFERENCE_TYPE = Symbol.for("react.client.reference");
15
16
  var AppPageSubtreeProbeLimitError = class extends Error {
16
17
  constructor(message) {
17
18
  super(message);
@@ -36,6 +37,9 @@ function isObjectLike(value) {
36
37
  function isUnknownFunction(value) {
37
38
  return typeof value === "function";
38
39
  }
40
+ function isReactClientReference(value) {
41
+ return isObjectLike(value) && Reflect.get(value, "$$typeof") === REACT_CLIENT_REFERENCE_TYPE;
42
+ }
39
43
  function readReactMemoType(value) {
40
44
  if (!isObjectLike(value) || Reflect.get(value, "$$typeof") !== REACT_MEMO_TYPE) return null;
41
45
  return { innerType: Reflect.get(value, "type") };
@@ -80,6 +84,7 @@ async function probeReactServerSubtree(node, options = {}) {
80
84
  };
81
85
  const renderElementType = async (type, props, depth, wrapperDepth = 0) => {
82
86
  if (wrapperDepth > maxDepth) throw new AppPageSubtreeProbeLimitError("App page layout subtree probe exceeded max depth");
87
+ if (isReactClientReference(type)) return false;
83
88
  if (isUnknownFunction(type)) {
84
89
  await visit(type(props), depth + 1);
85
90
  return true;
@@ -2,6 +2,8 @@ import { AppElementsInterception } from "./app-elements-wire.js";
2
2
  //#region src/server/app-page-render-identity.d.ts
3
3
  type AppPageRenderIdentityInput = {
4
4
  displayPathname: string;
5
+ matchedRoutePathname?: string;
6
+ targetMatchedPathname?: string;
5
7
  interceptionContext?: string | null;
6
8
  interceptSourceMatchedUrl?: string | null;
7
9
  interceptSlotId?: string | null;
@@ -13,10 +13,11 @@ function normalizeAppPageInterceptionProofPathname(pathname) {
13
13
  }
14
14
  function createAppPageRenderIdentity(input) {
15
15
  const interceptionContext = input.interceptionContext ?? null;
16
- const targetMatchedPathname = normalizeAppPageRenderMatchedPathname(input.displayPathname);
16
+ const targetMatchedPathname = normalizeAppPageRenderMatchedPathname(input.targetMatchedPathname ?? input.displayPathname);
17
+ const requestedMatchedRoutePathname = normalizeAppPageRenderMatchedPathname(input.matchedRoutePathname ?? input.targetMatchedPathname ?? input.displayPathname);
17
18
  const sourceMatchedPathname = normalizeAppPageInterceptionProofPathname(input.interceptSourceMatchedUrl ?? null);
18
19
  const slotId = input.interceptSlotId ?? null;
19
- const matchedRoutePathname = sourceMatchedPathname ?? targetMatchedPathname;
20
+ const matchedRoutePathname = sourceMatchedPathname ?? requestedMatchedRoutePathname;
20
21
  const routeId = AppElementsWire.encodeRouteId(matchedRoutePathname, null);
21
22
  const pageId = AppElementsWire.encodePageId(matchedRoutePathname, null);
22
23
  const interception = sourceMatchedPathname === null || slotId === null ? null : {
@@ -60,6 +60,7 @@ type RenderAppPageLifecycleOptions = {
60
60
  isForceStatic: boolean;
61
61
  isProgressiveActionRender?: boolean;
62
62
  isPrerender?: boolean;
63
+ isSpeculativePrerender?: boolean;
63
64
  isProduction: boolean;
64
65
  probePageBeforeRender?: boolean;
65
66
  omitPendingDynamicCacheState?: boolean;
@@ -103,6 +104,7 @@ type RenderAppPageLifecycleOptions = {
103
104
  clientReuseManifest?: ClientReuseManifestParseResult;
104
105
  skipDisposition?: ClientReuseManifestSkipDisposition;
105
106
  mountedSlotsHeader?: string | null;
107
+ renderedPathAndSearch?: string | null;
106
108
  renderMode?: AppRscRenderMode;
107
109
  waitUntil?: (promise: Promise<void>) => void;
108
110
  layoutParamAccess?: AppLayoutParamAccessTracker;
@@ -2,6 +2,7 @@ import { NEVER_CACHE_CONTROL, NO_STORE_CACHE_CONTROL, applyCdnResponseHeaders }
2
2
  import { createArtifactCompatibilityEnvelope, createArtifactCompatibilityGraphVersion } from "./artifact-compatibility.js";
3
3
  import { AppElementsWire, isAppElementsRecord } from "./app-elements-wire.js";
4
4
  import "./app-elements.js";
5
+ import { peekDynamicUsage } from "../shims/headers.js";
5
6
  import { runWithFetchDedupe } from "../shims/fetch-cache.js";
6
7
  import { buildAppPageHtmlResponse, buildAppPageRscResponse, resolveAppPageHtmlResponsePolicy, resolveAppPageRscResponsePolicy } from "./app-page-response.js";
7
8
  import { buildAppPageFontLinkHeader, readAppPageBinaryStream, resolveAppPageSpecialError, teeAppPageRscStreamForCapture } from "./app-page-execution.js";
@@ -26,8 +27,14 @@ function buildResponseTiming(options) {
26
27
  };
27
28
  }
28
29
  function readRequestCacheLifeForPrerender(options) {
30
+ if (options.isEdgeRuntime && options.revalidateSeconds === null) return (options.peekRequestCacheLife?.() ?? options.getRequestCacheLife())?.revalidate !== void 0 ? { revalidate: 0 } : null;
29
31
  return options.peekRequestCacheLife?.() ?? options.getRequestCacheLife();
30
32
  }
33
+ function readRequestCacheLifeForCachePolicy(options) {
34
+ const requestCacheLife = options.getRequestCacheLife();
35
+ if (options.isEdgeRuntime && options.revalidateSeconds === null) return null;
36
+ return requestCacheLife;
37
+ }
31
38
  function applyRequestCacheLife(options) {
32
39
  let revalidateSeconds = options.revalidateSeconds;
33
40
  let expireSeconds = options.expireSeconds;
@@ -39,6 +46,10 @@ function applyRequestCacheLife(options) {
39
46
  revalidateSeconds
40
47
  };
41
48
  }
49
+ function resolveAppPageCacheWriteRevalidateSeconds(options) {
50
+ if (options.revalidateSeconds === null && (options.isForceStatic || options.isDynamicError)) return Infinity;
51
+ return options.revalidateSeconds;
52
+ }
42
53
  function readRootBoundaryId(element) {
43
54
  const rootLayoutTreePath = element[AppElementsWire.keys.rootLayout];
44
55
  return typeof rootLayoutTreePath === "string" ? rootLayoutTreePath : null;
@@ -314,6 +325,7 @@ async function renderAppPageLifecycle(options) {
314
325
  const outgoingElement = AppElementsWire.encodeOutgoingPayload({
315
326
  element: options.element,
316
327
  layoutFlags,
328
+ ...options.dynamicStaleTimeSeconds !== void 0 && options.isPrerender !== true && !options.isForceStatic ? { dynamicStaleTimeSeconds: options.dynamicStaleTimeSeconds } : {},
317
329
  ...artifactCompatibility ? { artifactCompatibility } : {},
318
330
  renderObservation: payloadRenderObservation,
319
331
  skipDisposition: options.isRscRequest ? skipDisposition : void 0
@@ -336,6 +348,8 @@ async function renderAppPageLifecycle(options) {
336
348
  if (options.pprFallbackShellSignal) pprFallbackShellRsc = new Uint8Array(await readAppPageBinaryStream(rscStream));
337
349
  let revalidateSeconds = options.revalidateSeconds;
338
350
  let expireSeconds = options.expireSeconds;
351
+ const shouldWaitForAllReady = options.isPrerender === true && options.isSpeculativePrerender !== true;
352
+ const shouldReadRequestCacheLifeForPrerender = options.isPrerender === true;
339
353
  const shouldCaptureRscForCacheMetadata = options.isProgressiveActionRender !== true && (options.isProduction || options.isPrerender === true) && (revalidateSeconds === null || revalidateSeconds > 0 && revalidateSeconds !== Infinity) && !options.isDraftMode && !options.isForceDynamic && !shouldBypassRscCacheForSkipTransport;
340
354
  const createBufferedRscStream = (close) => new ReadableStream({ start(controller) {
341
355
  if (pprFallbackShellRsc) controller.enqueue(pprFallbackShellRsc);
@@ -349,11 +363,13 @@ async function renderAppPageLifecycle(options) {
349
363
  const capturedRscDataRef = { value: null };
350
364
  if (rscCapture.sideStream && options.isRscRequest) capturedRscDataRef.value = readAppPageBinaryStream(rscCapture.sideStream);
351
365
  if (options.isRscRequest) {
352
- if (options.isPrerender === true) {
353
- await settleCapturedRscRenderForCacheMetadata(capturedRscDataRef.value);
366
+ let requestCacheLifeForPrerender = null;
367
+ if (shouldWaitForAllReady) await settleCapturedRscRenderForCacheMetadata(capturedRscDataRef.value);
368
+ if (shouldReadRequestCacheLifeForPrerender) {
369
+ requestCacheLifeForPrerender = readRequestCacheLifeForPrerender(options);
354
370
  ({expireSeconds, revalidateSeconds} = applyRequestCacheLife({
355
371
  expireSeconds,
356
- requestCacheLife: readRequestCacheLifeForPrerender(options),
372
+ requestCacheLife: requestCacheLifeForPrerender,
357
373
  revalidateSeconds
358
374
  }));
359
375
  }
@@ -376,6 +392,8 @@ async function renderAppPageLifecycle(options) {
376
392
  mountedSlotsHeader: options.mountedSlotsHeader,
377
393
  params: options.navigationParams,
378
394
  policy: rscResponsePolicy,
395
+ renderedPathAndSearch: options.renderedPathAndSearch,
396
+ requestCacheLife: requestCacheLifeForPrerender,
379
397
  timing: buildResponseTiming({
380
398
  compileEnd,
381
399
  handlerStart: options.handlerStart,
@@ -405,17 +423,22 @@ async function renderAppPageLifecycle(options) {
405
423
  return options.getPageTags();
406
424
  },
407
425
  getRequestCacheLife() {
408
- return options.getRequestCacheLife();
426
+ return readRequestCacheLifeForCachePolicy(options);
409
427
  },
410
428
  isrDebug: options.isrDebug,
411
429
  isrRscKey: options.isrRscKey,
412
430
  isrSet: options.isrSet,
413
431
  interceptionContext: options.interceptionContext,
414
432
  mountedSlotsHeader: options.mountedSlotsHeader,
433
+ omitPendingDynamicCacheState: options.omitPendingDynamicCacheState,
415
434
  renderMode: options.renderMode,
416
435
  preserveClientResponseHeaders: rscResponsePolicy.cacheState !== "MISS",
417
436
  expireSeconds,
418
- revalidateSeconds,
437
+ revalidateSeconds: resolveAppPageCacheWriteRevalidateSeconds({
438
+ isDynamicError: options.isDynamicError,
439
+ isForceStatic: options.isForceStatic,
440
+ revalidateSeconds
441
+ }),
419
442
  waitUntil(promise) {
420
443
  options.waitUntil?.(promise);
421
444
  }
@@ -427,6 +450,7 @@ async function renderAppPageLifecycle(options) {
427
450
  getStyles: options.getFontStyles
428
451
  });
429
452
  const fontLinkHeader = buildAppPageFontLinkHeader(fontData.preloads);
453
+ let dynamicUsedDuringHtmlRender = false;
430
454
  let renderEnd;
431
455
  const htmlRender = await renderAppPageHtmlStreamWithRecovery({
432
456
  onShellRendered() {
@@ -440,6 +464,19 @@ async function renderAppPageLifecycle(options) {
440
464
  const ssrHandler = await options.loadSsrHandler();
441
465
  return renderAppPageHtmlStream({
442
466
  capturedRscDataRef,
467
+ getInitialNavigationCacheMetadata: () => {
468
+ let kind;
469
+ if (options.isForceStatic) kind = "static";
470
+ else if (options.isForceDynamic || dynamicUsedDuringHtmlRender || peekDynamicUsage()) kind = "dynamic";
471
+ else {
472
+ const observation = options.peekRenderObservationState?.();
473
+ kind = observation && (observation.dynamicFetches.length > 0 || observation.requestApis.length > 0) ? "dynamic" : "static";
474
+ }
475
+ return {
476
+ kind,
477
+ ...kind === "dynamic" && options.dynamicStaleTimeSeconds !== void 0 && options.isPrerender !== true && !shouldCaptureRscForCacheMetadata ? { dynamicStaleTimeSeconds: options.dynamicStaleTimeSeconds } : {}
478
+ };
479
+ },
443
480
  fontData,
444
481
  hasCustomGlobalError: options.hasCustomGlobalError,
445
482
  navigationContext: options.getNavigationContext(),
@@ -453,7 +490,8 @@ async function renderAppPageLifecycle(options) {
453
490
  scriptNonce: options.scriptNonce,
454
491
  sideStream: rscCapture.sideStream,
455
492
  ssrHandler,
456
- waitForAllReady: options.isPrerender === true
493
+ fallbackToErrorDocumentOnShellError: options.isPrerender === true && options.isSpeculativePrerender === true ? false : void 0,
494
+ waitForAllReady: shouldWaitForAllReady
457
495
  });
458
496
  },
459
497
  renderSpecialErrorResponse(specialError) {
@@ -476,19 +514,33 @@ async function renderAppPageLifecycle(options) {
476
514
  }
477
515
  }
478
516
  }
479
- if (options.isPrerender === true) {
480
- await settleCapturedRscRenderForCacheMetadata(htmlRender.capturedRscData);
517
+ let requestCacheLifeForPrerender = null;
518
+ let dynamicUsedDuringRender = options.consumeDynamicUsage();
519
+ dynamicUsedDuringHtmlRender = dynamicUsedDuringRender;
520
+ const stopSpeculativeMetadataWaitOnDynamicUsage = options.isSpeculativePrerender === true && shouldReadRequestCacheLifeForPrerender ? () => {
521
+ if (dynamicUsedDuringRender || (options.peekDynamicUsage?.() ?? peekDynamicUsage())) {
522
+ dynamicUsedDuringRender = true;
523
+ dynamicUsedDuringHtmlRender = true;
524
+ return true;
525
+ }
526
+ return false;
527
+ } : void 0;
528
+ if (shouldWaitForAllReady || shouldReadRequestCacheLifeForPrerender) await settleCapturedRscRenderForCacheMetadata(htmlRender.capturedRscData, stopSpeculativeMetadataWaitOnDynamicUsage);
529
+ if (shouldReadRequestCacheLifeForPrerender) {
530
+ requestCacheLifeForPrerender = readRequestCacheLifeForPrerender(options);
481
531
  ({expireSeconds, revalidateSeconds} = applyRequestCacheLife({
482
532
  expireSeconds,
483
- requestCacheLife: readRequestCacheLifeForPrerender(options),
533
+ requestCacheLife: requestCacheLifeForPrerender,
484
534
  revalidateSeconds
485
535
  }));
486
536
  }
487
- let dynamicUsedDuringRender = options.consumeDynamicUsage();
537
+ dynamicUsedDuringRender = dynamicUsedDuringRender || options.consumeDynamicUsage();
538
+ dynamicUsedDuringHtmlRender = dynamicUsedDuringRender;
488
539
  const draftCookie = options.getDraftModeCookieHeader();
489
540
  let dynamicUsedBeforeContextCleanup = dynamicUsedDuringRender;
490
541
  const safeHtmlStream = deferUntilStreamConsumed(htmlStream, () => {
491
542
  dynamicUsedBeforeContextCleanup = dynamicUsedBeforeContextCleanup || options.consumeDynamicUsage();
543
+ dynamicUsedDuringHtmlRender = dynamicUsedBeforeContextCleanup;
492
544
  options.clearRequestContext();
493
545
  });
494
546
  const htmlResponsePolicy = resolveAppPageHtmlResponsePolicy({
@@ -520,12 +572,13 @@ async function renderAppPageLifecycle(options) {
520
572
  status: 500
521
573
  },
522
574
  policy: { cacheControl: NEVER_CACHE_CONTROL },
575
+ requestCacheLife: requestCacheLifeForPrerender,
523
576
  timing: htmlResponseTiming
524
577
  });
525
578
  applyCdnResponseHeaders(response.headers, { cacheControl: NEVER_CACHE_CONTROL });
526
579
  return response;
527
580
  }
528
- const shouldSpeculativelyWriteCache = options.isProduction && shouldCaptureRscForCacheMetadata && revalidateSeconds === null && !options.isDynamicError && !options.isForceStatic && !options.scriptNonce && options.isProgressiveActionRender !== true && !dynamicUsedDuringRender;
581
+ const shouldSpeculativelyWriteCache = options.isProduction && shouldCaptureRscForCacheMetadata && !options.isEdgeRuntime && revalidateSeconds === null && !options.isDynamicError && !options.isForceStatic && !options.scriptNonce && options.isProgressiveActionRender !== true && !dynamicUsedDuringRender;
529
582
  if (htmlResponsePolicy.shouldWriteToCache || shouldSpeculativelyWriteCache) {
530
583
  const isrResponse = buildAppPageHtmlResponse(safeHtmlStream, {
531
584
  draftCookie,
@@ -533,6 +586,7 @@ async function renderAppPageLifecycle(options) {
533
586
  isEdgeRuntime: options.isEdgeRuntime,
534
587
  middlewareContext: options.middlewareContext,
535
588
  policy: htmlResponsePolicy,
589
+ requestCacheLife: requestCacheLifeForPrerender,
536
590
  timing: htmlResponseTiming
537
591
  });
538
592
  if (options.isPrerender === true) return isrResponse;
@@ -572,7 +626,7 @@ async function renderAppPageLifecycle(options) {
572
626
  return options.getPageTags();
573
627
  },
574
628
  getRequestCacheLife() {
575
- return options.getRequestCacheLife();
629
+ return readRequestCacheLifeForCachePolicy(options);
576
630
  },
577
631
  isrDebug: options.isrDebug,
578
632
  isrHtmlKey: options.isrHtmlKey,
@@ -582,7 +636,11 @@ async function renderAppPageLifecycle(options) {
582
636
  omitPendingDynamicCacheState: options.omitPendingDynamicCacheState,
583
637
  preserveClientResponseHeaders: !htmlResponsePolicy.shouldWriteToCache,
584
638
  expireSeconds,
585
- revalidateSeconds,
639
+ revalidateSeconds: resolveAppPageCacheWriteRevalidateSeconds({
640
+ isDynamicError: options.isDynamicError,
641
+ isForceStatic: options.isForceStatic,
642
+ revalidateSeconds
643
+ }),
586
644
  waitUntil(cachePromise) {
587
645
  options.waitUntil?.(cachePromise);
588
646
  }
@@ -594,14 +652,25 @@ async function renderAppPageLifecycle(options) {
594
652
  isEdgeRuntime: options.isEdgeRuntime,
595
653
  middlewareContext: options.middlewareContext,
596
654
  policy: htmlResponsePolicy,
655
+ requestCacheLife: requestCacheLifeForPrerender,
597
656
  timing: htmlResponseTiming
598
657
  });
599
658
  }
600
- async function settleCapturedRscRenderForCacheMetadata(capturedRscDataPromise) {
659
+ async function settleCapturedRscRenderForCacheMetadata(capturedRscDataPromise, shouldStopWaiting) {
601
660
  if (!capturedRscDataPromise) return;
661
+ if (!shouldStopWaiting) {
662
+ try {
663
+ await capturedRscDataPromise;
664
+ } catch {}
665
+ return;
666
+ }
667
+ let settled = false;
668
+ const settledPromise = capturedRscDataPromise.catch(() => {}).then(() => {
669
+ settled = true;
670
+ });
602
671
  try {
603
- await capturedRscDataPromise;
604
- } catch {}
672
+ while (!settled && !shouldStopWaiting()) await Promise.race([settledPromise, new Promise((resolve) => setTimeout(resolve, 0))]);
673
+ } finally {}
605
674
  }
606
675
  //#endregion
607
676
  export { renderAppPageLifecycle };
@@ -12,8 +12,20 @@ type GenerateStaticParamsModule = {
12
12
  };
13
13
  type GenerateStaticParamsSource = {
14
14
  generateStaticParams: GenerateStaticParams;
15
+ paramAliases?: Readonly<Record<string, string>>;
16
+ paramPatternParts?: readonly string[];
17
+ routePatternParts?: readonly string[];
15
18
  parentParamNames: readonly string[];
16
19
  };
20
+ type ParallelGenerateStaticParamsBranch = {
21
+ configLayouts?: readonly (GenerateStaticParamsModule | null | undefined)[] | null;
22
+ configLayoutTreePositions?: readonly number[] | null;
23
+ layout?: GenerateStaticParamsModule | null;
24
+ page?: GenerateStaticParamsModule | null;
25
+ paramNames?: readonly string[] | null;
26
+ patternParts?: readonly string[] | null;
27
+ routeSegments?: readonly string[] | null;
28
+ };
17
29
  type ValidateAppPageDynamicParamsOptions = {
18
30
  clearRequestContext: () => void;
19
31
  enforceStaticParamsOnly: boolean;
@@ -25,6 +37,8 @@ type ResolveAppPageGenerateStaticParamsSourcesOptions = {
25
37
  layouts?: readonly (GenerateStaticParamsModule | null | undefined)[];
26
38
  layoutTreePositions?: readonly number[];
27
39
  page?: GenerateStaticParamsModule | null;
40
+ parallelBranches?: readonly (ParallelGenerateStaticParamsBranch | null | undefined)[];
41
+ routePatternParts?: readonly string[];
28
42
  routeSegments: readonly string[];
29
43
  };
30
44
  type BuildAppPageElementOptions<TElement> = {