vinext 1.0.1 → 1.2.0

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 (334) hide show
  1. package/README.md +93 -10
  2. package/dist/build/app-page-static-eligibility.d.ts +15 -0
  3. package/dist/build/app-page-static-eligibility.js +82 -0
  4. package/dist/build/client-build-config.d.ts +10 -0
  5. package/dist/build/client-build-config.js +18 -2
  6. package/dist/build/pages-client-assets-module.d.ts +8 -0
  7. package/dist/build/pages-client-assets-module.js +21 -1
  8. package/dist/build/prerender-paths.js +8 -81
  9. package/dist/build/prerender.js +33 -8
  10. package/dist/build/run-prerender.js +1 -1
  11. package/dist/build/server-manifest.d.ts +7 -0
  12. package/dist/build/server-manifest.js +11 -1
  13. package/dist/build/ssr-manifest.d.ts +2 -0
  14. package/dist/build/ssr-manifest.js +6 -2
  15. package/dist/cache/cache-adapters-virtual.d.ts +7 -1
  16. package/dist/cache/cache-adapters-virtual.js +3 -3
  17. package/dist/check.js +7 -6
  18. package/dist/cli.js +2 -1
  19. package/dist/client/client-redirect-matcher.d.ts +14 -0
  20. package/dist/client/client-redirect-matcher.js +37 -0
  21. package/dist/client/client-redirects.d.ts +27 -0
  22. package/dist/client/client-redirects.js +28 -0
  23. package/dist/client/client-rewrites.d.ts +2 -1
  24. package/dist/client/client-rewrites.js +1 -1
  25. package/dist/client/navigation-runtime.d.ts +11 -0
  26. package/dist/client/navigation-runtime.js +1 -1
  27. package/dist/config/config-matchers.d.ts +26 -11
  28. package/dist/config/config-matchers.js +81 -82
  29. package/dist/config/destination-params.d.ts +47 -0
  30. package/dist/config/destination-params.js +116 -0
  31. package/dist/config/next-config.d.ts +14 -0
  32. package/dist/config/next-config.js +21 -3
  33. package/dist/entries/app-rsc-entry.d.ts +6 -0
  34. package/dist/entries/app-rsc-entry.js +84 -49
  35. package/dist/entries/pages-client-entry.js +3 -1
  36. package/dist/entries/pages-server-entry.js +13 -37
  37. package/dist/index.d.ts +7 -2
  38. package/dist/index.js +193 -73
  39. package/dist/init-cloudflare.d.ts +9 -0
  40. package/dist/init-cloudflare.js +107 -31
  41. package/dist/init-platform.d.ts +4 -0
  42. package/dist/init-platform.js +27 -2
  43. package/dist/init.d.ts +1 -0
  44. package/dist/init.js +67 -3
  45. package/dist/plugins/ast-scope.d.ts +7 -0
  46. package/dist/plugins/ast-scope.js +59 -3
  47. package/dist/plugins/cache-flight-codec.d.ts +19 -0
  48. package/dist/plugins/cache-flight-codec.js +68 -0
  49. package/dist/plugins/commonjs-esm-facade.d.ts +35 -0
  50. package/dist/plugins/commonjs-esm-facade.js +80 -0
  51. package/dist/plugins/dynamic-preload-metadata.d.ts +1 -1
  52. package/dist/plugins/dynamic-preload-metadata.js +9 -8
  53. package/dist/plugins/fonts.d.ts +8 -11
  54. package/dist/plugins/fonts.js +71 -34
  55. package/dist/plugins/ignore-dynamic-requests.d.ts +1 -1
  56. package/dist/plugins/ignore-dynamic-requests.js +3 -4
  57. package/dist/plugins/middleware-server-only.d.ts +5 -4
  58. package/dist/plugins/middleware-server-only.js +8 -5
  59. package/dist/plugins/pages-node-externals.js +1 -1
  60. package/dist/plugins/rsc-scan-glob-imports.d.ts +19 -0
  61. package/dist/plugins/rsc-scan-glob-imports.js +50 -0
  62. package/dist/plugins/strip-server-exports.js +262 -98
  63. package/dist/plugins/transform-result.d.ts +9 -5
  64. package/dist/plugins/transitive-externals.js +1 -1
  65. package/dist/plugins/typeof-window.d.ts +2 -2
  66. package/dist/plugins/use-cache-callable.js +8 -2
  67. package/dist/plugins/worker-server-only-imports.d.ts +20 -0
  68. package/dist/plugins/worker-server-only-imports.js +31 -0
  69. package/dist/plugins/worker-use-server.d.ts +25 -0
  70. package/dist/plugins/worker-use-server.js +129 -0
  71. package/dist/routing/file-matcher.d.ts +1 -0
  72. package/dist/routing/file-matcher.js +1 -1
  73. package/dist/server/api-handler.d.ts +1 -0
  74. package/dist/server/api-handler.js +19 -8
  75. package/dist/server/app-browser-action-result.d.ts +1 -1
  76. package/dist/server/app-browser-action-result.js +9 -2
  77. package/dist/server/app-browser-entry.js +11 -7
  78. package/dist/server/app-browser-history-controller.d.ts +2 -0
  79. package/dist/server/app-browser-history-controller.js +8 -0
  80. package/dist/server/app-browser-interception-context.js +26 -2
  81. package/dist/server/app-browser-navigation-controller.d.ts +7 -1
  82. package/dist/server/app-browser-navigation-controller.js +94 -11
  83. package/dist/server/app-browser-server-action-client.js +1 -1
  84. package/dist/server/app-fallback-renderer.d.ts +2 -0
  85. package/dist/server/app-fallback-renderer.js +1 -0
  86. package/dist/server/app-history-state.d.ts +3 -0
  87. package/dist/server/app-history-state.js +7 -0
  88. package/dist/server/app-middleware.d.ts +11 -0
  89. package/dist/server/app-middleware.js +19 -3
  90. package/dist/server/app-optimistic-routing.js +1 -1
  91. package/dist/server/app-page-boundary-render.d.ts +5 -0
  92. package/dist/server/app-page-boundary-render.js +6 -4
  93. package/dist/server/app-page-cache-finalizer.d.ts +11 -0
  94. package/dist/server/app-page-cache-finalizer.js +41 -7
  95. package/dist/server/app-page-cache-render.d.ts +18 -0
  96. package/dist/server/app-page-cache-render.js +63 -43
  97. package/dist/server/app-page-cache.d.ts +6 -1
  98. package/dist/server/app-page-cache.js +28 -8
  99. package/dist/server/app-page-dispatch.d.ts +12 -2
  100. package/dist/server/app-page-dispatch.js +51 -33
  101. package/dist/server/app-page-element-builder.d.ts +7 -0
  102. package/dist/server/app-page-element-builder.js +27 -42
  103. package/dist/server/app-page-execution.d.ts +15 -12
  104. package/dist/server/app-page-execution.js +30 -40
  105. package/dist/server/app-page-head.d.ts +5 -0
  106. package/dist/server/app-page-head.js +9 -3
  107. package/dist/server/app-page-ppr-runtime.js +1 -1
  108. package/dist/server/app-page-probe.d.ts +0 -109
  109. package/dist/server/app-page-probe.js +3 -136
  110. package/dist/server/app-page-render-identity.d.ts +0 -1
  111. package/dist/server/app-page-render-identity.js +1 -1
  112. package/dist/server/app-page-render-observation.js +3 -3
  113. package/dist/server/app-page-render.d.ts +13 -5
  114. package/dist/server/app-page-render.js +219 -119
  115. package/dist/server/app-page-request.d.ts +0 -1
  116. package/dist/server/app-page-request.js +54 -17
  117. package/dist/server/app-page-response.d.ts +4 -3
  118. package/dist/server/app-page-response.js +4 -3
  119. package/dist/server/app-page-route-wiring.d.ts +17 -5
  120. package/dist/server/app-page-route-wiring.js +57 -35
  121. package/dist/server/app-page-rsc-render-status.d.ts +48 -0
  122. package/dist/server/app-page-rsc-render-status.js +54 -0
  123. package/dist/server/app-page-stream.d.ts +15 -8
  124. package/dist/server/app-page-stream.js +6 -0
  125. package/dist/server/app-pages-bridge.d.ts +1 -1
  126. package/dist/server/app-pages-bridge.js +2 -3
  127. package/dist/server/app-prerender-endpoints.js +9 -6
  128. package/dist/server/app-request-stage-dispatch.js +7 -3
  129. package/dist/server/app-request-stage-independent-entry.js +29 -9
  130. package/dist/server/app-response-header-provenance.d.ts +2 -0
  131. package/dist/server/app-response-header-provenance.js +10 -4
  132. package/dist/server/app-response-stage-entry.js +10 -2
  133. package/dist/server/app-route-handler-cache.d.ts +1 -0
  134. package/dist/server/app-route-handler-cache.js +1 -0
  135. package/dist/server/app-route-handler-dispatch.d.ts +1 -0
  136. package/dist/server/app-route-handler-dispatch.js +6 -3
  137. package/dist/server/app-route-handler-execution.d.ts +1 -0
  138. package/dist/server/app-route-handler-execution.js +1 -0
  139. package/dist/server/app-route-handler-runtime.d.ts +4 -1
  140. package/dist/server/app-route-handler-runtime.js +45 -24
  141. package/dist/server/app-router-entry.js +27 -8
  142. package/dist/server/app-rsc-cache-busting.js +1 -1
  143. package/dist/server/app-rsc-errors.js +20 -16
  144. package/dist/server/app-rsc-handler.d.ts +11 -0
  145. package/dist/server/app-rsc-handler.js +291 -125
  146. package/dist/server/app-rsc-request-normalization.d.ts +3 -1
  147. package/dist/server/app-rsc-request-normalization.js +4 -2
  148. package/dist/server/app-rsc-response-stage.d.ts +1 -1
  149. package/dist/server/app-rsc-response-stage.js +10 -6
  150. package/dist/server/app-rsc-route-matching.d.ts +9 -1
  151. package/dist/server/app-rsc-route-matching.js +36 -19
  152. package/dist/server/app-segment-config.d.ts +2 -1
  153. package/dist/server/app-server-action-execution.d.ts +2 -1
  154. package/dist/server/app-server-action-execution.js +62 -23
  155. package/dist/server/app-ssr-entry.d.ts +3 -2
  156. package/dist/server/app-ssr-entry.js +8 -5
  157. package/dist/server/app-ssr-stream.d.ts +6 -1
  158. package/dist/server/app-ssr-stream.js +34 -15
  159. package/dist/server/app-worker-stages.d.ts +7 -2
  160. package/dist/server/app-worker-stages.js +4 -4
  161. package/dist/server/cacheability-request.js +11 -7
  162. package/dist/server/client-build-files.d.ts +16 -0
  163. package/dist/server/client-build-files.js +36 -0
  164. package/dist/server/client-reuse-manifest.js +1 -1
  165. package/dist/server/config-headers.js +2 -0
  166. package/dist/server/dev-server.js +50 -29
  167. package/dist/server/dev-stack-sourcemap.js +18 -23
  168. package/dist/server/document-initial-head.d.ts +0 -11
  169. package/dist/server/document-initial-head.js +1 -1
  170. package/dist/server/forwarded-middleware-context.d.ts +5 -0
  171. package/dist/server/forwarded-middleware-context.js +22 -0
  172. package/dist/server/headers.d.ts +18 -1
  173. package/dist/server/headers.js +19 -2
  174. package/dist/server/http-conditional.d.ts +11 -0
  175. package/dist/server/http-conditional.js +10 -1
  176. package/dist/server/http-error-responses.d.ts +1 -1
  177. package/dist/server/image-optimization.d.ts +54 -0
  178. package/dist/server/image-optimization.js +118 -9
  179. package/dist/server/isr-cache.d.ts +10 -0
  180. package/dist/server/isr-cache.js +43 -8
  181. package/dist/server/metadata-route-response.js +9 -8
  182. package/dist/server/middleware-matcher-pattern.js +8 -4
  183. package/dist/server/middleware-matcher.d.ts +2 -0
  184. package/dist/server/middleware-matcher.js +23 -2
  185. package/dist/server/middleware-response-headers.js +2 -0
  186. package/dist/server/middleware-runtime.d.ts +13 -0
  187. package/dist/server/middleware-runtime.js +33 -20
  188. package/dist/server/middleware.d.ts +1 -1
  189. package/dist/server/middleware.js +3 -1
  190. package/dist/server/multi-stage.d.ts +19 -0
  191. package/dist/server/navigation-planner.js +1 -1
  192. package/dist/server/node-response-signal.d.ts +16 -0
  193. package/dist/server/node-response-signal.js +26 -0
  194. package/dist/server/normalize-path.d.ts +0 -13
  195. package/dist/server/normalize-path.js +1 -34
  196. package/dist/server/open-redirect.d.ts +47 -0
  197. package/dist/server/open-redirect.js +74 -1
  198. package/dist/server/pages-api-route.d.ts +3 -2
  199. package/dist/server/pages-api-route.js +4 -3
  200. package/dist/server/pages-cache-tag.d.ts +12 -0
  201. package/dist/server/pages-cache-tag.js +19 -0
  202. package/dist/server/pages-client-assets.d.ts +2 -0
  203. package/dist/server/pages-data-route.d.ts +10 -0
  204. package/dist/server/pages-data-route.js +19 -2
  205. package/dist/server/pages-document-asset-props.d.ts +5 -1
  206. package/dist/server/pages-document-asset-props.js +13 -5
  207. package/dist/server/pages-document-splice.d.ts +19 -0
  208. package/dist/server/pages-document-splice.js +55 -0
  209. package/dist/server/pages-i18n.d.ts +12 -1
  210. package/dist/server/pages-i18n.js +18 -4
  211. package/dist/server/pages-node-compat.d.ts +16 -5
  212. package/dist/server/pages-node-compat.js +20 -12
  213. package/dist/server/pages-page-data.d.ts +32 -24
  214. package/dist/server/pages-page-data.js +50 -120
  215. package/dist/server/pages-page-handler.d.ts +0 -6
  216. package/dist/server/pages-page-handler.js +209 -130
  217. package/dist/server/pages-page-response.d.ts +12 -6
  218. package/dist/server/pages-page-response.js +41 -34
  219. package/dist/server/pages-request-pipeline.d.ts +10 -2
  220. package/dist/server/pages-request-pipeline.js +37 -18
  221. package/dist/server/pages-request-stage-entry.d.ts +6 -0
  222. package/dist/server/pages-request-stage-entry.js +79 -16
  223. package/dist/server/pages-response-stage-entry.js +4 -0
  224. package/dist/server/pages-revalidate.js +1 -1
  225. package/dist/server/pages-router-entry.js +4 -3
  226. package/dist/server/prerender-manifest.d.ts +3 -3
  227. package/dist/server/prerender-manifest.js +4 -3
  228. package/dist/server/prerender-work-unit-setup.js +4 -0
  229. package/dist/server/prod-server.d.ts +20 -7
  230. package/dist/server/prod-server.js +343 -129
  231. package/dist/server/proper-error.d.ts +4 -0
  232. package/dist/server/proper-error.js +31 -0
  233. package/dist/server/request-pipeline.d.ts +24 -9
  234. package/dist/server/request-pipeline.js +24 -9
  235. package/dist/server/response-compression.d.ts +43 -0
  236. package/dist/server/response-compression.js +111 -0
  237. package/dist/server/revalidation-request.d.ts +1 -0
  238. package/dist/server/revalidation-request.js +1 -1
  239. package/dist/server/rsc-stream-hints.js +31 -2
  240. package/dist/server/seed-cache.d.ts +1 -0
  241. package/dist/server/seed-cache.js +15 -11
  242. package/dist/server/server-reference-loader.d.ts +4 -0
  243. package/dist/server/server-reference-loader.js +29 -0
  244. package/dist/server/socket-error-backstop.d.ts +23 -1
  245. package/dist/server/socket-error-backstop.js +69 -17
  246. package/dist/server/static-file-signal.d.ts +15 -4
  247. package/dist/server/static-file-signal.js +46 -12
  248. package/dist/server/worker-image-optimization.d.ts +34 -0
  249. package/dist/server/worker-image-optimization.js +86 -0
  250. package/dist/server/worker-stages.d.ts +1 -1
  251. package/dist/server/worker-stages.js +2 -2
  252. package/dist/server/worker-utils.d.ts +8 -3
  253. package/dist/server/worker-utils.js +12 -7
  254. package/dist/shims/app-router-scroll.js +4 -1
  255. package/dist/shims/app-router-tree-context.d.ts +5 -0
  256. package/dist/shims/app-router-tree-context.js +27 -0
  257. package/dist/shims/cache-adapter-instantiate.d.ts +50 -0
  258. package/dist/shims/cache-adapter-instantiate.js +118 -0
  259. package/dist/shims/cache-callable-runtime.d.ts +6 -42
  260. package/dist/shims/cache-callable-runtime.js +65 -174
  261. package/dist/shims/cache-flight-arguments.d.ts +22 -0
  262. package/dist/shims/cache-flight-arguments.js +56 -0
  263. package/dist/shims/cache-handler.js +1 -9
  264. package/dist/shims/cache-request-state.d.ts +15 -0
  265. package/dist/shims/cache-request-state.js +31 -8
  266. package/dist/shims/cache-runtime.d.ts +12 -20
  267. package/dist/shims/cache-runtime.js +166 -225
  268. package/dist/shims/cache.d.ts +4 -4
  269. package/dist/shims/cache.js +44 -16
  270. package/dist/shims/cacheability-classification.d.ts +7 -0
  271. package/dist/shims/cdn-cache.d.ts +8 -0
  272. package/dist/shims/cdn-cache.js +17 -1
  273. package/dist/shims/disable-smooth-scroll.d.ts +3 -0
  274. package/dist/shims/disable-smooth-scroll.js +36 -0
  275. package/dist/shims/document-placeholders.d.ts +19 -0
  276. package/dist/shims/document-placeholders.js +45 -0
  277. package/dist/shims/document.js +21 -5
  278. package/dist/shims/dynamic-preload-chunks.d.ts +1 -0
  279. package/dist/shims/dynamic-preload-chunks.js +13 -9
  280. package/dist/shims/dynamic.d.ts +1 -1
  281. package/dist/shims/dynamic.js +60 -8
  282. package/dist/shims/error-boundary-navigation.d.ts +7 -0
  283. package/dist/shims/error-boundary-navigation.js +19 -1
  284. package/dist/shims/error-boundary.d.ts +10 -10
  285. package/dist/shims/error-boundary.js +26 -7
  286. package/dist/shims/fetch-cache-state.d.ts +66 -0
  287. package/dist/shims/fetch-cache-state.js +92 -0
  288. package/dist/shims/fetch-cache.d.ts +3 -61
  289. package/dist/shims/fetch-cache.js +161 -108
  290. package/dist/shims/form.js +1 -1
  291. package/dist/shims/head.d.ts +10 -6
  292. package/dist/shims/head.js +15 -13
  293. package/dist/shims/headers.d.ts +13 -0
  294. package/dist/shims/headers.js +47 -4
  295. package/dist/shims/image.js +2 -1
  296. package/dist/shims/internal/app-page-props-cache-key.d.ts +5 -2
  297. package/dist/shims/internal/app-page-props-cache-key.js +24 -15
  298. package/dist/shims/internal/headers-state.d.ts +0 -1
  299. package/dist/shims/internal/work-store-scope.d.ts +5 -0
  300. package/dist/shims/internal/work-store-scope.js +24 -0
  301. package/dist/shims/metadata.js +3 -3
  302. package/dist/shims/navigation-errors.d.ts +6 -0
  303. package/dist/shims/navigation-errors.js +11 -1
  304. package/dist/shims/navigation.d.ts +7 -0
  305. package/dist/shims/navigation.js +45 -9
  306. package/dist/shims/request-context.d.ts +11 -0
  307. package/dist/shims/request-state-types.d.ts +2 -1
  308. package/dist/shims/router.js +12 -20
  309. package/dist/shims/server.d.ts +16 -0
  310. package/dist/shims/server.js +24 -4
  311. package/dist/shims/thenable-params.d.ts +4 -0
  312. package/dist/shims/thenable-params.js +25 -3
  313. package/dist/shims/unified-request-context.d.ts +1 -1
  314. package/dist/shims/unified-request-context.js +1 -0
  315. package/dist/shims/url-utils.d.ts +2 -0
  316. package/dist/shims/url-utils.js +3 -1
  317. package/dist/utils/client-runtime-metadata.js +1 -1
  318. package/dist/utils/hash.d.ts +7 -0
  319. package/dist/utils/hash.js +11 -1
  320. package/dist/utils/mdx-scan.d.ts +5 -0
  321. package/dist/utils/mdx-scan.js +8 -1
  322. package/dist/utils/package-name.d.ts +6 -0
  323. package/dist/utils/package-name.js +12 -1
  324. package/dist/utils/plugin-rsc-version.d.ts +4 -0
  325. package/dist/utils/plugin-rsc-version.js +15 -0
  326. package/dist/utils/prerender-output-paths.js +15 -4
  327. package/dist/utils/public-file-path.d.ts +10 -2
  328. package/dist/utils/public-file-path.js +13 -9
  329. package/dist/utils/public-routes.js +2 -2
  330. package/dist/utils/react-version.d.ts +3 -0
  331. package/dist/utils/react-version.js +1 -1
  332. package/dist/utils/regex-safety.d.ts +10 -0
  333. package/dist/utils/regex-safety.js +70 -18
  334. package/package.json +9 -5
@@ -1,18 +1,19 @@
1
1
  import { preserveFullyBufferedBodyMetadata } from "./fully-buffered-response.js";
2
2
  import { closeAfterResponse, closeAfterResponseWithBody, createRequestContext, runWithRequestContext } from "../shims/unified-request-context.js";
3
3
  import { PRERENDER_REVALIDATE_HEADER } from "../utils/protocol-headers.js";
4
+ import { normalizePathnameForRouteMatch } from "../routing/utils.js";
4
5
  import { patternToNextFormat } from "../routing/route-validation.js";
5
6
  import { getRequestExecutionContext } from "../shims/request-context.js";
6
7
  import { NEXTJS_CACHE_HEADER, NEXTJS_DEPLOYMENT_ID_HEADER, VINEXT_CACHE_HEADER, VINEXT_REVALIDATED_CACHE_TAG_HEADER } from "./headers.js";
7
8
  import { extractLocaleFromUrl, resolvePagesI18nRequest } from "./pages-i18n.js";
9
+ import { buildNextDataNotFoundResponse, buildNextDataPropsJsonResponse, normalizePagesDataRequest, parseNextDataPathname } from "./pages-data-route.js";
8
10
  import { reportRequestError } from "./instrumentation.js";
9
11
  import { getCdnCacheAdapter } from "../shims/cdn-cache.js";
10
- import { beginRouteCacheability, isRouteCacheabilityIdentityProbe, isRouteCacheabilityProbe, markRouteCacheabilityExplicitResponsePolicy, recordRouteCacheability } from "../shims/cacheability-classification.js";
12
+ import { beginRouteCacheability, isRouteCacheabilityIdentityProbe, isRouteCacheabilityProbe, markRouteCacheabilityExplicitResponsePolicy, markRouteCacheabilityFinalResponseUncacheable, recordRouteCacheability } from "../shims/cacheability-classification.js";
11
13
  import { BROWSER_REVALIDATE_CACHE_CONTROL, NEVER_CACHE_CONTROL, STATIC_CACHE_CONTROL, applyCdnResponseHeaders, hasCdnResponsePolicy, hasExplicitNonCacheableResponsePolicy, shouldUseNextDeployCacheControl } from "./cache-control.js";
12
14
  import { buildMissIsrCacheControl } from "./isr-decision.js";
13
15
  import { isOnDemandRevalidateRequest } from "./revalidation-request.js";
14
16
  import { coalesceOnDemandRevalidation, isrGet, isrSet, pagesIsrCacheKey, triggerBackgroundRegeneration } from "./isr-cache.js";
15
- import { encodeCacheTag } from "../utils/encode-cache-tag.js";
16
17
  import { ensureFetchPatch } from "../shims/fetch-cache.js";
17
18
  import { mergeRouteParamsIntoQuery, parseQueryString } from "../utils/query.js";
18
19
  import { getScriptNonceFromHeaderSources } from "./csp.js";
@@ -20,12 +21,11 @@ import { buildDefaultPagesNotFoundResponse } from "./pages-default-404.js";
20
21
  import { buildPagesReadinessNextData } from "./pages-readiness.js";
21
22
  import { resolvePagesPageMethodResponse } from "./pages-page-method.js";
22
23
  import { setCacheStateHeaders } from "./cache-headers.js";
23
- import { hasUserDocumentGetInitialProps } from "./document-initial-head.js";
24
+ import { pagesPathCacheTag } from "./pages-cache-tag.js";
24
25
  import { renderPagesPageResponse } from "./pages-page-response.js";
25
26
  import { hasPagesGetInitialProps } from "./pages-get-initial-props.js";
26
- import { buildNextDataNotFoundResponse, buildNextDataPropsJsonResponse, normalizePagesDataRequest, parseNextDataPathname } from "./pages-data-route.js";
27
27
  import { traceFindPageComponents, tracePagesDocumentStream } from "./pages-execution-tracing.js";
28
- import { mergePagesNotFoundSourceHeaders, resolvePagesPageData } from "./pages-page-data.js";
28
+ import { mergePagesNotFoundSourceHeaders, resolvePagesPageData, resolvePagesStatusPageRenderPath } from "./pages-page-data.js";
29
29
  import { collectAssetTags, resolveClientModuleUrl } from "./pages-asset-tags.js";
30
30
  import { PAGES_PREVIEW_CACHE_CONTROL, appendPagesPreviewClearCookies, getPagesPreviewState } from "./pages-preview.js";
31
31
  import { createPagesReqRes } from "./pages-node-compat.js";
@@ -68,10 +68,7 @@ function withPagesCacheState(response, state, revalidatedPathname) {
68
68
  if (state === "REVALIDATED") {
69
69
  headers.set(NEXTJS_CACHE_HEADER, state);
70
70
  headers.delete(VINEXT_CACHE_HEADER);
71
- if (revalidatedPathname !== void 0) {
72
- const stem = revalidatedPathname.length > 1 && revalidatedPathname.endsWith("/") ? revalidatedPathname.slice(0, -1) : revalidatedPathname;
73
- headers.set(VINEXT_REVALIDATED_CACHE_TAG_HEADER, encodeCacheTag(`_N_T_${stem || "/"}`));
74
- }
71
+ if (revalidatedPathname !== void 0) headers.set(VINEXT_REVALIDATED_CACHE_TAG_HEADER, encodeURIComponent(pagesPathCacheTag(revalidatedPathname)));
75
72
  } else setCacheStateHeaders(headers, state);
76
73
  return new Response(response.body, {
77
74
  headers,
@@ -98,13 +95,10 @@ function applyPagesErrorCachePolicy(response, revalidateSeconds, expireSeconds,
98
95
  });
99
96
  if (hasExplicitNonCacheableResponsePolicy(headers)) return response;
100
97
  if (revalidateSeconds === void 0) applyCdnResponseHeaders(headers, { cacheControl: NEVER_CACHE_CONTROL });
101
- else {
102
- const stem = cacheTagPathname.endsWith("/") ? cacheTagPathname.slice(0, -1) : cacheTagPathname;
103
- applyCdnResponseHeaders(headers, {
104
- cacheControl: buildMissIsrCacheControl(revalidateSeconds, expireSeconds),
105
- tags: [encodeCacheTag(`_N_T_${stem || "/"}`)]
106
- });
107
- }
98
+ else applyCdnResponseHeaders(headers, {
99
+ cacheControl: buildMissIsrCacheControl(revalidateSeconds, expireSeconds),
100
+ tags: [pagesPathCacheTag(cacheTagPathname)]
101
+ });
108
102
  return new Response(response.body, {
109
103
  headers,
110
104
  status: response.status,
@@ -131,7 +125,7 @@ function buildI18nRenderContext(i18nConfig, locale, currentDefaultLocale, domain
131
125
  * accepts the same options shape the generated entry always passed inline.
132
126
  */
133
127
  function createPagesPageHandler(opts) {
134
- const { pageRoutes, errorPageRoute, matchRoute, i18nConfig, vinextConfig, buildId, hasMiddleware, appAssetPath, hasRewrites, setSSRContext, getPagesNavigationIsReadyFromSerializedState, setI18nContext, wrapWithRouterContext, router, resetSSRHead, getSSRHeadHTML, setDocumentInitialHead, flushPreloads, getFontLinks, getFontStyles, getFontPreloads, renderToReadableStream, renderIsrPassToStringAsync, safeJsonStringify, sanitizeDestination, createPageElement, enhancePageElement, AppComponent, DocumentComponent } = opts;
128
+ const { pageRoutes, errorPageRoute, matchRoute, i18nConfig, vinextConfig, buildId, hasMiddleware, appAssetPath, hasRewrites, setSSRContext, getPagesNavigationIsReadyFromSerializedState, setI18nContext, wrapWithRouterContext, router, resetSSRHead, getSSRHeadHTML, setDocumentInitialHead, flushPreloads, getFontLinks, getFontStyles, getFontPreloads, renderToReadableStream, safeJsonStringify, sanitizeDestination, createPageElement, enhancePageElement, AppComponent, DocumentComponent } = opts;
135
129
  function renderToStringAsync(element) {
136
130
  return renderToReadableStream(element).then((stream) => new Response(stream).text());
137
131
  }
@@ -187,7 +181,7 @@ function createPagesPageHandler(opts) {
187
181
  redirectUrl: void 0
188
182
  };
189
183
  const locale = localeInfo.locale;
190
- const routeUrl = localeInfo.url;
184
+ let routeUrl = localeInfo.url;
191
185
  const currentDefaultLocale = i18nConfig ? localeInfo.domainLocale ? localeInfo.domainLocale.defaultLocale : i18nConfig.defaultLocale : void 0;
192
186
  const domainLocales = i18nConfig ? i18nConfig.domains : void 0;
193
187
  const pageIsrCacheKey = isrCacheKeyForRequest(i18nConfig ? localeInfo.domainLocale ? JSON.stringify([String(localeInfo.domainLocale.domain).toLowerCase(), locale]) : "locale:" + String(locale) : null);
@@ -216,6 +210,22 @@ function createPagesPageHandler(opts) {
216
210
  renderAsPath = routeUrl;
217
211
  } else return buildDefaultPagesNotFoundResponse();
218
212
  }
213
+ const routePathname = routeUrl.split("?")[0];
214
+ const cachePathname = normalizePathnameForRouteMatch(routePathname);
215
+ let cacheIdentityDiverges = false;
216
+ if (!isRouteMissErrorRender && options?.__forcedRoute === void 0 && cachePathname !== routePathname) {
217
+ const cachePathRoute = matchRoute(cachePathname, pageRoutes)?.route;
218
+ if (cachePathRoute !== match.route) {
219
+ const cachePathModule = cachePathRoute?.module;
220
+ if (match.route.isDynamic && typeof match.route.module.getStaticProps === "function" && cachePathRoute && !cachePathRoute.isDynamic && typeof cachePathModule?.getStaticProps === "function" && typeof cachePathModule.getServerSideProps !== "function" && getPagesPreviewState(request.headers.get("cookie"), { isOnDemandRevalidate: isOnDemandRevalidateRequest(request.headers.get("x-prerender-revalidate")) }).data === false) {
221
+ match = {
222
+ route: cachePathRoute,
223
+ params: {}
224
+ };
225
+ routeUrl = cachePathname + routeUrl.slice(routePathname.length);
226
+ } else cacheIdentityDiverges = true;
227
+ }
228
+ }
219
229
  const { route, params } = match;
220
230
  const pageModule = traceFindPageComponents(route.pattern, () => route.module);
221
231
  const isStaticPropsRoute = typeof pageModule.getStaticProps === "function";
@@ -234,10 +244,10 @@ function createPagesPageHandler(opts) {
234
244
  });
235
245
  else recordRouteCacheability({ cacheable: false });
236
246
  }
237
- const routeIsrGet = isCacheabilityProbe ? async () => null : isrGet;
238
- const routeIsrSet = isCacheabilityProbe ? async () => {} : isrSet;
247
+ const routeIsrGet = isCacheabilityProbe || cacheIdentityDiverges ? async () => null : isrGet;
248
+ const routeIsrSet = isCacheabilityProbe || cacheIdentityDiverges ? async () => {} : isrSet;
239
249
  const isStaticPropsRender = isStaticPropsRoute && typeof pageModule.getServerSideProps !== "function";
240
- if (!options?.__skipOnDemandCoalesce && !options?.__forcedRoute && isStaticPropsRoute && isOnDemandRevalidateRequest(request.headers.get("x-prerender-revalidate"))) {
250
+ if (!options?.__skipOnDemandCoalesce && !options?.__forcedRoute && !cacheIdentityDiverges && isStaticPropsRoute && isOnDemandRevalidateRequest(request.headers.get("x-prerender-revalidate"))) {
241
251
  const cacheKey = pageIsrCacheKey("pages", routeUrl.split("?")[0]);
242
252
  const snapshot = await coalesceOnDemandRevalidation(cacheKey, async () => {
243
253
  const response = await renderPage(request, url, manifest, middlewareHeaders, {
@@ -257,17 +267,39 @@ function createPagesPageHandler(opts) {
257
267
  statusText: snapshot.statusText
258
268
  });
259
269
  }
260
- const renderRouteUrl = isStaticPropsRender ? routeUrl.split("?")[0] : routeUrl;
270
+ const routePattern = patternToNextFormat(route.pattern);
271
+ const renderStatusCode = renderStatusCodeOverride ?? (routePattern === "/404" ? 404 : void 0);
272
+ const isStatusPageIdentity = (isStaticPropsRender || pagesReadiness.autoExport) && (routePattern === "/404" || routePattern === "/500" || routePattern === "/_error");
273
+ const statusPagePathname = routePattern === "/_error" && renderStatusCode === 404 ? "/404" : routePattern;
274
+ const renderRouteUrl = isStaticPropsRender && isStatusPageIdentity ? resolvePagesStatusPageRenderPath(statusPagePathname, vinextConfig.trailingSlash, originalRequestUrl.pathname) : isStaticPropsRender ? routeUrl.split("?")[0] : routeUrl;
261
275
  const routerAsPathSource = isStaticPropsRender ? renderRouteUrl : renderAsPath ?? renderRouteUrl;
262
276
  const routerAsPath = i18nConfig ? extractLocaleFromUrl(routerAsPathSource, i18nConfig, locale).url : routerAsPathSource;
263
277
  const uCtx = createRequestContext({ executionContext: getRequestExecutionContext() });
264
- const response = await runWithRequestContext(uCtx, async () => {
278
+ let pageReqRes = null;
279
+ const pageResponseSent = () => pageReqRes?.res.headersSent === true;
280
+ const sendsEarly = isStaticPropsRoute && !isOnDemandRevalidateRequest(request.headers.get("x-prerender-revalidate"));
281
+ let resolveSentResponse = () => {};
282
+ const sentResponse = new Promise((resolve) => {
283
+ resolveSentResponse = resolve;
284
+ });
285
+ const reportSsrError = async (e) => {
286
+ console.error("[vinext] SSR error:", e);
287
+ await reportRequestError(e, {
288
+ path: url,
289
+ method: request.method,
290
+ headers: Object.fromEntries(request.headers.entries())
291
+ }, {
292
+ routerKind: "Pages Router",
293
+ routePath: route.pattern,
294
+ routeType: "render",
295
+ revalidateReason: isOnDemandRevalidateRequest(request.headers.get("x-prerender-revalidate")) ? "on-demand" : typeof pageModule.getStaticProps === "function" ? "stale" : void 0
296
+ });
297
+ };
298
+ const rendering = runWithRequestContext(uCtx, async () => {
265
299
  ensureFetchPatch();
266
300
  try {
267
- const routePattern = patternToNextFormat(route.pattern);
268
301
  setFrameworkRequestRoute(routePattern);
269
- const renderStatusCode = renderStatusCodeOverride ?? (routePattern === "/404" ? 404 : void 0);
270
- const isrCachePathname = (isStaticPropsRender || pagesReadiness.autoExport) && (routePattern === "/404" || routePattern === "/500" || routePattern === "/_error") ? routePattern === "/_error" && renderStatusCode === 404 ? "/404" : routePattern : renderRouteUrl.split("?")[0];
302
+ const isrCachePathname = isStatusPageIdentity ? statusPagePathname : renderRouteUrl.split("?")[0];
271
303
  const isNotFoundErrorRender = routePattern === "/404" || routePattern === "/_error" && renderStatusCode === 404;
272
304
  const isStatusErrorRender = isNotFoundErrorRender || routePattern === "/500" || routePattern === "/_error" && renderStatusCode === 500;
273
305
  const errorPageRevalidateSeconds = isNotFoundErrorRender ? options?.__notFoundRevalidateSeconds : void 0;
@@ -357,15 +389,109 @@ function createPagesPageHandler(opts) {
357
389
  if (options?.__notFoundSourceHeaders) for (const [name, value] of Object.entries(options.__notFoundSourceHeaders)) reqRes.res.setHeader(name, value);
358
390
  return reqRes;
359
391
  };
392
+ const createForegroundReqRes = () => {
393
+ const reqRes = createPageReqRes();
394
+ pageReqRes = reqRes;
395
+ if (sendsEarly) reqRes.responsePromise.then(resolveSentResponse);
396
+ return reqRes;
397
+ };
398
+ const buildPageResponseOptions = (render) => {
399
+ const pageModuleIds = [];
400
+ if (appAssetPath) pageModuleIds.push(appAssetPath);
401
+ if (route.filePath) pageModuleIds.push(route.filePath);
402
+ const initialStylesheetHrefs = /* @__PURE__ */ new Set();
403
+ return {
404
+ assetTags: collectAssetTags({
405
+ manifest,
406
+ moduleIds: pageModuleIds,
407
+ scriptNonce,
408
+ disableOptimizedLoading: vinextConfig.disableOptimizedLoading,
409
+ basePath: vinextConfig.basePath,
410
+ assetPrefix: vinextConfig.assetPrefix,
411
+ deploymentId: process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID,
412
+ crossOrigin: vinextConfig.crossOrigin,
413
+ initialStylesheetHrefs
414
+ }),
415
+ buildId,
416
+ clearSsrContext() {
417
+ if (typeof setSSRContext === "function") setSSRContext(null);
418
+ },
419
+ createPageElement(currentProps) {
420
+ const el = createPageElement(PageComponent, AppComponent, currentProps);
421
+ return typeof wrapWithRouterContext === "function" ? wrapWithRouterContext(el) : el;
422
+ },
423
+ enhancePageElement(renderPageOpts) {
424
+ const el = enhancePageElement(PageComponent, AppComponent, render.renderProps, renderPageOpts);
425
+ return typeof wrapWithRouterContext === "function" ? wrapWithRouterContext(el) : el;
426
+ },
427
+ DocumentComponent,
428
+ err: err instanceof Error ? err : void 0,
429
+ flushPreloads: typeof flushPreloads === "function" ? flushPreloads : void 0,
430
+ fontLinkHeader,
431
+ fontPreloads: allFontPreloads,
432
+ getFontLinks,
433
+ getFontStyles,
434
+ getSSRHeadHTML: typeof getSSRHeadHTML === "function" ? getSSRHeadHTML : void 0,
435
+ clientTraceMetadata: shouldEmitPagesClientTraceMetadata(pageModule, AppComponent) ? vinextConfig.clientTraceMetadata : void 0,
436
+ documentReqRes: render.documentReqRes,
437
+ gsspRes: render.gsspRes,
438
+ isrCacheKey: pageIsrCacheKey,
439
+ isrCachePathname,
440
+ expireSeconds: render.expireSeconds,
441
+ isrRevalidateSeconds: render.isrRevalidateSeconds,
442
+ isStaticPropsRoute,
443
+ isrSet: routeIsrSet,
444
+ i18n: buildI18nRenderContext(i18nConfig, locale, currentDefaultLocale, domainLocales),
445
+ isFallback: render.isFallback,
446
+ pageProps: render.pageProps,
447
+ props: render.renderProps,
448
+ params,
449
+ query,
450
+ renderDocumentToString(element) {
451
+ return renderToStringAsync(element);
452
+ },
453
+ renderToReadableStream,
454
+ resetSSRHead: typeof resetSSRHead === "function" ? resetSSRHead : void 0,
455
+ setDocumentInitialHead: typeof setDocumentInitialHead === "function" ? setDocumentInitialHead : void 0,
456
+ routePattern,
457
+ routeUrl: renderRouteUrl,
458
+ safeJsonStringify,
459
+ scriptNonce,
460
+ initialStylesheetHrefs,
461
+ crossOrigin: vinextConfig.crossOrigin,
462
+ disableOptimizedLoading: vinextConfig.disableOptimizedLoading,
463
+ statusCode: renderStatusCode,
464
+ nextData: serializedPagesNextData
465
+ };
466
+ };
467
+ const withErrorStatusCode = (pageProps, renderProps) => {
468
+ if (routePattern === "/_error" && typeof renderStatusCode === "number" && renderProps.pageProps !== void 0) {
469
+ const statusPageProps = {
470
+ ...pageProps,
471
+ statusCode: renderStatusCode
472
+ };
473
+ return {
474
+ pageProps: statusPageProps,
475
+ renderProps: {
476
+ ...renderProps,
477
+ pageProps: statusPageProps
478
+ }
479
+ };
480
+ }
481
+ return {
482
+ pageProps,
483
+ renderProps
484
+ };
485
+ };
360
486
  const pageDataResult = await resolvePagesPageData({
361
487
  isDataReq,
362
488
  err: err instanceof Error ? err : void 0,
363
489
  applyRequestContexts: applySSRContext,
364
490
  basePath: vinextConfig.basePath,
365
- buildId,
366
491
  deploymentId: process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID,
367
492
  htmlLimitedBots: vinextConfig.htmlLimitedBots,
368
- createGsspReqRes: createPageReqRes,
493
+ createGsspReqRes: createForegroundReqRes,
494
+ createRegenerationReqRes: createPageReqRes,
369
495
  createAppTree(appTreeProps) {
370
496
  const el = createPageElement(PageComponent, AppComponent, appTreeProps);
371
497
  return typeof wrapWithRouterContext === "function" ? wrapWithRouterContext(el) : el;
@@ -386,6 +512,7 @@ function createPagesPageHandler(opts) {
386
512
  validatePropsSerialization: process.env.NODE_ENV !== "production" || process.env.VINEXT_PRERENDER === "1",
387
513
  isOnDemandRevalidate,
388
514
  revalidateOnlyGenerated,
515
+ regeneratesStoredEntry: getRequestExecutionContext()?.isStoredEntryRegeneration === true,
389
516
  previewData,
390
517
  pageModule,
391
518
  AppComponent,
@@ -394,8 +521,26 @@ function createPagesPageHandler(opts) {
394
521
  query,
395
522
  asPath: routerAsPath,
396
523
  resolvedUrl: pagesResolvedUrl,
397
- renderIsrPassToStringAsync,
398
- collectIsrHeadHTML: getSSRHeadHTML && !hasUserDocumentGetInitialProps(DocumentComponent) ? getSSRHeadHTML : void 0,
524
+ async renderIsrDocument(regeneration) {
525
+ const renderAllReady = async (element) => {
526
+ const stream = await renderToReadableStream(element);
527
+ await stream.allReady;
528
+ return stream;
529
+ };
530
+ await (await renderPagesPageResponse({
531
+ ...buildPageResponseOptions({
532
+ documentReqRes: regeneration.documentReqRes,
533
+ expireSeconds: regeneration.expireSeconds,
534
+ gsspRes: null,
535
+ isFallback: false,
536
+ isrRevalidateSeconds: regeneration.revalidateSeconds,
537
+ ...withErrorStatusCode(regeneration.pageProps, regeneration.props)
538
+ }),
539
+ isStaleRegeneration: true,
540
+ renderDocumentToString: (element) => renderAllReady(element).then((stream) => new Response(stream).text()),
541
+ renderToReadableStream: renderAllReady
542
+ })).body?.cancel();
543
+ },
399
544
  route: { isDynamic: route.isDynamic },
400
545
  routePattern,
401
546
  routeUrl: renderRouteUrl,
@@ -417,10 +562,10 @@ function createPagesPageHandler(opts) {
417
562
  statusCode: renderStatusCode,
418
563
  notFoundSourceHeaders: options?.__notFoundSourceHeaders,
419
564
  triggerBackgroundRegeneration,
420
- vinext: serializedPagesNextData.__vinext,
421
565
  nextData: serializedPagesNextData,
422
566
  userAgent: request.headers.get("user-agent") ?? void 0,
423
567
  ifNoneMatch: request.headers.get("if-none-match") ?? void 0,
568
+ ifModifiedSince: request.headers.get("if-modified-since") ?? void 0,
424
569
  requestCacheControl: request.headers.get("cache-control") ?? void 0
425
570
  });
426
571
  if (pageDataResult.kind === "notFound") {
@@ -443,28 +588,17 @@ function createPagesPageHandler(opts) {
443
588
  return finalizePagesPreviewResponse(withBrowserPolicy(notFoundResponse), preview);
444
589
  }
445
590
  if (pageDataResult.kind === "response") {
591
+ if (sendsEarly && pageResponseSent()) return pageDataResult.response;
446
592
  let response = isOnDemandRevalidate && pageDataResult.onDemandRevalidateSuccess !== false ? withPagesCacheState(pageDataResult.response, "REVALIDATED", isrCachePathname) : pageDataResult.response;
447
593
  if (shouldApplyErrorResponsePolicy) response = applyPagesErrorCachePolicy(response, errorPageRevalidateSeconds, errorPageExpireSeconds, errorResponseCachePathname);
448
594
  return finalizePagesPreviewResponse(withBrowserPolicy(response), preview);
449
595
  }
450
- let pageProps = pageDataResult.pageProps;
451
- let renderProps = pageDataResult.props;
452
- if (previewData !== false) renderProps = {
453
- ...renderProps,
596
+ const { pageProps, renderProps } = withErrorStatusCode(pageDataResult.pageProps, previewData !== false ? {
597
+ ...pageDataResult.props,
454
598
  __N_PREVIEW: true
455
- };
456
- if (routePattern === "/_error" && typeof renderStatusCode === "number" && renderProps.pageProps !== void 0) {
457
- pageProps = {
458
- ...pageProps,
459
- statusCode: renderStatusCode
460
- };
461
- renderProps = {
462
- ...renderProps,
463
- pageProps
464
- };
465
- }
599
+ } : pageDataResult.props);
466
600
  const gsspRes = pageDataResult.gsspRes;
467
- const documentReqRes = serializedPagesNextData.autoExport === true && !options?.__notFoundSourceHeaders ? null : pageDataResult.documentReqRes ?? createPageReqRes();
601
+ const documentReqRes = serializedPagesNextData.autoExport === true && !options?.__notFoundSourceHeaders ? null : pageDataResult.documentReqRes ?? createForegroundReqRes();
468
602
  const isrRevalidateSeconds = pageDataResult.isrRevalidateSeconds;
469
603
  if (isStaticPropsRoute && preview.data === false && !preview.shouldClear && isrRevalidateSeconds !== null) recordRouteCacheability({
470
604
  cacheable: isrRevalidateSeconds !== 0,
@@ -493,13 +627,11 @@ function createPagesPageHandler(opts) {
493
627
  if (gsspRes) {
494
628
  if (!headers.has("Cache-Control")) headers.set("Cache-Control", NEVER_CACHE_CONTROL);
495
629
  } else if (isStaticPropsRoute) {
496
- if (isrRevalidateSeconds !== null) {
497
- const stem = isrCachePathname.endsWith("/") ? isrCachePathname.slice(0, -1) : isrCachePathname;
498
- applyCdnResponseHeaders(headers, {
499
- cacheControl: buildMissIsrCacheControl(isrRevalidateSeconds, vinextConfig.expireTime),
500
- tags: [encodeCacheTag(`_N_T_${stem || "/"}`)]
501
- });
502
- } else if (shouldUseNextDeployCacheControl()) headers.set("Cache-Control", BROWSER_REVALIDATE_CACHE_CONTROL);
630
+ if (isrRevalidateSeconds !== null) applyCdnResponseHeaders(headers, {
631
+ cacheControl: buildMissIsrCacheControl(isrRevalidateSeconds, vinextConfig.expireTime),
632
+ tags: [pagesPathCacheTag(isrCachePathname)]
633
+ });
634
+ else if (shouldUseNextDeployCacheControl()) headers.set("Cache-Control", BROWSER_REVALIDATE_CACHE_CONTROL);
503
635
  }
504
636
  if (routePattern !== "/_error" && routePattern !== "/500") {
505
637
  const deploymentId = process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID;
@@ -507,91 +639,28 @@ function createPagesPageHandler(opts) {
507
639
  }
508
640
  return finalizePagesPreviewResponse(withBrowserPolicy(buildNextDataPropsJsonResponse(renderProps, safeJsonStringify, { headers })), preview);
509
641
  }
510
- const pageModuleIds = [];
511
- if (appAssetPath) pageModuleIds.push(appAssetPath);
512
- if (route.filePath) pageModuleIds.push(route.filePath);
513
- const initialStylesheetHrefs = /* @__PURE__ */ new Set();
514
642
  let pageResponse = await renderTracedPagesPageResponse({
515
- assetTags: collectAssetTags({
516
- manifest,
517
- moduleIds: pageModuleIds,
518
- scriptNonce,
519
- disableOptimizedLoading: vinextConfig.disableOptimizedLoading,
520
- basePath: vinextConfig.basePath,
521
- assetPrefix: vinextConfig.assetPrefix,
522
- deploymentId: process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID,
523
- crossOrigin: vinextConfig.crossOrigin,
524
- initialStylesheetHrefs
643
+ ...buildPageResponseOptions({
644
+ documentReqRes,
645
+ expireSeconds: isrExpireSeconds,
646
+ gsspRes,
647
+ isFallback: isFallbackRender,
648
+ isrRevalidateSeconds,
649
+ pageProps,
650
+ renderProps
525
651
  }),
526
- buildId,
527
- clearSsrContext() {
528
- if (typeof setSSRContext === "function") setSSRContext(null);
529
- },
530
- createPageElement(currentProps) {
531
- const el = createPageElement(PageComponent, AppComponent, currentProps);
532
- return typeof wrapWithRouterContext === "function" ? wrapWithRouterContext(el) : el;
533
- },
534
- enhancePageElement(renderPageOpts) {
535
- const el = enhancePageElement(PageComponent, AppComponent, renderProps, renderPageOpts);
536
- return typeof wrapWithRouterContext === "function" ? wrapWithRouterContext(el) : el;
537
- },
538
- DocumentComponent,
539
- err: err instanceof Error ? err : void 0,
540
- flushPreloads: typeof flushPreloads === "function" ? flushPreloads : void 0,
541
- fontLinkHeader,
542
- fontPreloads: allFontPreloads,
543
- getFontLinks,
544
- getFontStyles,
545
- getSSRHeadHTML: typeof getSSRHeadHTML === "function" ? getSSRHeadHTML : void 0,
546
- clientTraceMetadata: shouldEmitPagesClientTraceMetadata(pageModule, AppComponent) ? vinextConfig.clientTraceMetadata : void 0,
547
- documentReqRes,
548
- gsspRes,
549
- isrCacheKey: pageIsrCacheKey,
550
- isrCachePathname,
551
- expireSeconds: isrExpireSeconds,
552
- isrRevalidateSeconds,
553
652
  isOnDemandRevalidate,
554
- isStaticPropsRoute,
555
- isrSet: routeIsrSet,
556
- i18n: buildI18nRenderContext(i18nConfig, locale, currentDefaultLocale, domainLocales),
557
- isFallback: isFallbackRender,
558
- pageProps,
559
- props: renderProps,
560
- params,
561
- query,
562
- renderDocumentToString(element) {
563
- return renderToStringAsync(element);
564
- },
565
- renderToReadableStream,
566
- resetSSRHead: typeof resetSSRHead === "function" ? resetSSRHead : void 0,
567
- setDocumentInitialHead: typeof setDocumentInitialHead === "function" ? setDocumentInitialHead : void 0,
568
- routePattern,
569
- routeUrl: renderRouteUrl,
570
- safeJsonStringify,
571
- scriptNonce,
572
- initialStylesheetHrefs,
573
- crossOrigin: vinextConfig.crossOrigin,
574
- disableOptimizedLoading: vinextConfig.disableOptimizedLoading,
575
- statusCode: renderStatusCode,
576
- nextData: serializedPagesNextData,
577
653
  userAgent: request.headers.get("user-agent") ?? void 0,
578
654
  ifNoneMatch: request.headers.get("if-none-match") ?? void 0,
655
+ ifModifiedSince: request.headers.get("if-modified-since") ?? void 0,
579
656
  requestCacheControl: request.headers.get("cache-control") ?? void 0
580
657
  });
658
+ if (sendsEarly && pageResponseSent()) return pageResponse;
581
659
  if (shouldApplyErrorResponsePolicy) pageResponse = applyPagesErrorCachePolicy(pageResponse, errorPageRevalidateSeconds, errorPageExpireSeconds, errorResponseCachePathname);
582
660
  return finalizePagesPreviewResponse(withBrowserPolicy(pageResponse), preview);
583
661
  } catch (e) {
584
- console.error("[vinext] SSR error:", e);
585
- await reportRequestError(e, {
586
- path: url,
587
- method: request.method,
588
- headers: Object.fromEntries(request.headers.entries())
589
- }, {
590
- routerKind: "Pages Router",
591
- routePath: route.pattern,
592
- routeType: "render",
593
- revalidateReason: isOnDemandRevalidateRequest(request.headers.get("x-prerender-revalidate")) ? "on-demand" : typeof pageModule.getStaticProps === "function" ? "stale" : void 0
594
- });
662
+ await reportSsrError(e);
663
+ if (sendsEarly && pageResponseSent()) return sentResponse;
595
664
  if (!isInternalErrorRender && !isDataReq) {
596
665
  let errorRoute = null;
597
666
  for (let i = 0; i < pageRoutes.length; i++) if (pageRoutes[i].pattern === "/500") {
@@ -618,7 +687,17 @@ function createPagesPageHandler(opts) {
618
687
  return new Response("Internal Server Error", { status: 500 });
619
688
  }
620
689
  });
621
- return closeAfterResponseWithBody(response, uCtx);
690
+ if (!sendsEarly) return closeAfterResponseWithBody(await rendering, uCtx);
691
+ const settled = await Promise.race([rendering.then((response) => ({
692
+ response,
693
+ rendered: true
694
+ })), sentResponse.then((response) => ({
695
+ response,
696
+ rendered: false
697
+ }))]);
698
+ if (pageResponseSent()) markRouteCacheabilityFinalResponseUncacheable("_app or _document sent the response of a getStaticProps page");
699
+ if (!settled.rendered) getRequestExecutionContext()?.waitUntil(rendering.then(() => void 0, () => void 0));
700
+ return closeAfterResponseWithBody(settled.response, uCtx);
622
701
  }
623
702
  return renderPage;
624
703
  }
@@ -11,13 +11,12 @@ import { ComponentType, ReactNode } from "react";
11
11
  export declare function isPagesStreamingBot(userAgent: string): boolean;
12
12
  export declare function generatePagesETag(payload: string): string;
13
13
  /**
14
- * Returns true when a request `Cache-Control` header asks to bypass the 304
15
- * short-circuit. Mirrors the `fresh` package's check used by Next.js's
16
- * `sendEtagResponse` (`/(?:^|,)\s*?no-cache\s*?(?:,|$)/`). Shared by the
17
- * fresh-MISS bot path here and the ISR HIT/STALE paths in
18
- * `pages-page-data.ts` so the two cannot drift.
14
+ * Whether a render answers a matching If-None-Match with a 304. Next.js stores
15
+ * the page before it evaluates the ETag, so when the CDN adapter stores the
16
+ * completed response, the render returns the page and the adapter sends the 304.
17
+ * A page whose status carries no body has nothing to store.
19
18
  */
20
- export declare function requestsNoCache(cacheControl: string | undefined): boolean;
19
+ export declare function rendersPagesNotModified(status: number): boolean;
21
20
  type PagesFontPreload = {
22
21
  href: string;
23
22
  type: string;
@@ -87,6 +86,8 @@ type RenderPagesPageResponseOptions = {
87
86
  isrRevalidateSeconds: number | false | null;
88
87
  /** Synchronous `res.revalidate()` render; cache persistence must finish before returning. */
89
88
  isOnDemandRevalidate?: boolean;
89
+ /** Background ISR regeneration; the cache write must finish before returning. */
90
+ isStaleRegeneration?: boolean;
90
91
  isStaticPropsRoute?: boolean;
91
92
  isrSet: (key: string, data: CachedPagesValue, policy: IsrWritePolicy) => Promise<void>;
92
93
  i18n: PagesI18nRenderContext;
@@ -133,6 +134,11 @@ type RenderPagesPageResponseOptions = {
133
134
  * Only evaluated on bot/buffered responses that carry an ETag.
134
135
  */
135
136
  ifNoneMatch?: string;
137
+ /**
138
+ * The incoming request's `If-Modified-Since` header value. As in Next.js,
139
+ * which gives a page no Last-Modified, a request with it gets the page.
140
+ */
141
+ ifModifiedSince?: string;
136
142
  /**
137
143
  * The incoming request's `Cache-Control` header value. When the value
138
144
  * contains `no-cache`, the 304 short-circuit is skipped and a full 200