vinext 1.1.0 → 1.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 (288) hide show
  1. package/README.md +22 -10
  2. package/dist/build/client-build-config.d.ts +10 -0
  3. package/dist/build/client-build-config.js +18 -2
  4. package/dist/build/output-root-externals.d.ts +21 -0
  5. package/dist/build/output-root-externals.js +40 -0
  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 +6 -4
  9. package/dist/build/prerender.js +1 -1
  10. package/dist/build/run-prerender.js +1 -1
  11. package/dist/build/ssr-manifest.d.ts +2 -0
  12. package/dist/build/ssr-manifest.js +6 -2
  13. package/dist/check.js +12 -12
  14. package/dist/cli-dev-config.js +3 -3
  15. package/dist/cli.js +3 -2
  16. package/dist/client/client-redirect-matcher.d.ts +14 -0
  17. package/dist/client/client-redirect-matcher.js +37 -0
  18. package/dist/client/client-redirects.d.ts +27 -0
  19. package/dist/client/client-redirects.js +28 -0
  20. package/dist/client/client-rewrites.d.ts +2 -1
  21. package/dist/client/client-rewrites.js +1 -1
  22. package/dist/config/config-matchers.d.ts +26 -11
  23. package/dist/config/config-matchers.js +90 -88
  24. package/dist/config/destination-params.d.ts +47 -0
  25. package/dist/config/destination-params.js +116 -0
  26. package/dist/config/next-config.d.ts +7 -0
  27. package/dist/config/next-config.js +3 -0
  28. package/dist/entries/app-rsc-entry.d.ts +4 -0
  29. package/dist/entries/app-rsc-entry.js +20 -6
  30. package/dist/entries/pages-client-entry.js +3 -1
  31. package/dist/entries/pages-server-entry.js +13 -37
  32. package/dist/index.d.ts +3 -1
  33. package/dist/index.js +246 -136
  34. package/dist/init-cloudflare.d.ts +9 -0
  35. package/dist/init-cloudflare.js +107 -31
  36. package/dist/init-platform.d.ts +4 -0
  37. package/dist/init-platform.js +27 -2
  38. package/dist/init.d.ts +2 -1
  39. package/dist/init.js +153 -9
  40. package/dist/plugins/ast-scope.d.ts +7 -0
  41. package/dist/plugins/ast-scope.js +59 -3
  42. package/dist/plugins/ast-utils.d.ts +53 -2
  43. package/dist/plugins/ast-utils.js +90 -2
  44. package/dist/plugins/cloudflare-dev-module-urls.d.ts +41 -0
  45. package/dist/plugins/cloudflare-dev-module-urls.js +271 -0
  46. package/dist/plugins/commonjs-esm-facade.js +2 -2
  47. package/dist/plugins/css-module-imports.js +13 -20
  48. package/dist/plugins/dynamic-preload-metadata.d.ts +1 -1
  49. package/dist/plugins/dynamic-preload-metadata.js +11 -11
  50. package/dist/plugins/extensionless-dynamic-import.js +2 -3
  51. package/dist/plugins/fonts.d.ts +1 -1
  52. package/dist/plugins/fonts.js +3 -3
  53. package/dist/plugins/ignore-dynamic-requests.d.ts +1 -1
  54. package/dist/plugins/ignore-dynamic-requests.js +5 -7
  55. package/dist/plugins/import-meta-url.js +3 -4
  56. package/dist/plugins/instrumentation-client.js +3 -2
  57. package/dist/plugins/middleware-export-validation.js +2 -3
  58. package/dist/plugins/middleware-server-only.d.ts +5 -4
  59. package/dist/plugins/middleware-server-only.js +8 -5
  60. package/dist/plugins/og-harfbuzz.js +2 -3
  61. package/dist/plugins/optimize-imports.js +3 -4
  62. package/dist/plugins/pages-node-externals.js +3 -4
  63. package/dist/plugins/remove-console.js +2 -18
  64. package/dist/plugins/require-condition-resolution.js +3 -3
  65. package/dist/plugins/require-context.js +2 -3
  66. package/dist/plugins/rsc-scan-glob-imports.d.ts +19 -0
  67. package/dist/plugins/rsc-scan-glob-imports.js +50 -0
  68. package/dist/plugins/strip-server-exports.js +265 -102
  69. package/dist/plugins/styled-jsx.js +2 -3
  70. package/dist/plugins/transform-result.d.ts +9 -5
  71. package/dist/plugins/transitive-externals.js +1 -1
  72. package/dist/plugins/typeof-window.d.ts +2 -2
  73. package/dist/plugins/use-cache-callable.d.ts +21 -2
  74. package/dist/plugins/use-cache-callable.js +84 -35
  75. package/dist/plugins/worker-image-imports.js +30 -33
  76. package/dist/plugins/worker-server-only-imports.d.ts +20 -0
  77. package/dist/plugins/worker-server-only-imports.js +31 -0
  78. package/dist/plugins/worker-use-server.d.ts +25 -0
  79. package/dist/plugins/worker-use-server.js +153 -0
  80. package/dist/server/api-handler.d.ts +1 -0
  81. package/dist/server/api-handler.js +3 -2
  82. package/dist/server/app-action-forwarding.js +2 -2
  83. package/dist/server/app-browser-action-result.d.ts +1 -1
  84. package/dist/server/app-browser-action-result.js +9 -2
  85. package/dist/server/app-browser-entry.js +3 -3
  86. package/dist/server/app-browser-interception-context.js +1 -1
  87. package/dist/server/app-browser-navigation-controller.js +1 -1
  88. package/dist/server/app-browser-prefetch-response.js +2 -2
  89. package/dist/server/app-browser-server-action-client.js +1 -1
  90. package/dist/server/app-browser-state.js +1 -1
  91. package/dist/server/app-browser-supplemental-refresh.js +1 -1
  92. package/dist/server/app-middleware.d.ts +11 -0
  93. package/dist/server/app-middleware.js +17 -2
  94. package/dist/server/app-optimistic-routing.js +1 -1
  95. package/dist/server/app-page-cache.d.ts +1 -1
  96. package/dist/server/app-page-cache.js +1 -1
  97. package/dist/server/app-page-dispatch.d.ts +3 -1
  98. package/dist/server/app-page-dispatch.js +5 -4
  99. package/dist/server/app-page-ppr-runtime.js +1 -1
  100. package/dist/server/app-page-render-observation.js +1 -1
  101. package/dist/server/app-page-render.js +1 -1
  102. package/dist/server/app-page-request.js +53 -15
  103. package/dist/server/app-page-route-wiring.js +2 -2
  104. package/dist/server/app-pages-bridge.d.ts +1 -1
  105. package/dist/server/app-pages-bridge.js +3 -4
  106. package/dist/server/app-prerender-endpoints.js +9 -6
  107. package/dist/server/app-render-abort-error.d.ts +19 -0
  108. package/dist/server/app-render-abort-error.js +31 -1
  109. package/dist/server/app-request-stage-dispatch.js +6 -2
  110. package/dist/server/app-request-stage-independent-entry.js +29 -9
  111. package/dist/server/app-response-stage-entry.js +11 -3
  112. package/dist/server/app-route-handler-cache.d.ts +1 -0
  113. package/dist/server/app-route-handler-cache.js +1 -0
  114. package/dist/server/app-route-handler-dispatch.d.ts +1 -0
  115. package/dist/server/app-route-handler-dispatch.js +5 -2
  116. package/dist/server/app-route-handler-execution.d.ts +1 -0
  117. package/dist/server/app-route-handler-execution.js +1 -0
  118. package/dist/server/app-route-handler-runtime.d.ts +4 -1
  119. package/dist/server/app-route-handler-runtime.js +46 -25
  120. package/dist/server/app-router-entry.js +29 -10
  121. package/dist/server/app-rsc-cache-busting.d.ts +16 -0
  122. package/dist/server/app-rsc-cache-busting.js +30 -13
  123. package/dist/server/app-rsc-errors.js +20 -16
  124. package/dist/server/app-rsc-handler.d.ts +7 -0
  125. package/dist/server/app-rsc-handler.js +89 -39
  126. package/dist/server/app-rsc-request-normalization.js +3 -3
  127. package/dist/server/app-rsc-response-stage.js +5 -3
  128. package/dist/server/app-segment-config.d.ts +2 -1
  129. package/dist/server/app-server-action-execution.d.ts +2 -1
  130. package/dist/server/app-server-action-execution.js +62 -23
  131. package/dist/server/app-ssr-entry.js +7 -5
  132. package/dist/server/app-visited-response-cache.js +2 -2
  133. package/dist/server/app-worker-stages.d.ts +5 -0
  134. package/dist/server/app-worker-stages.js +1 -1
  135. package/dist/server/cacheability-request.js +2 -2
  136. package/dist/server/client-build-files.d.ts +16 -0
  137. package/dist/server/client-build-files.js +36 -0
  138. package/dist/server/client-reuse-manifest.js +1 -1
  139. package/dist/server/config-headers.js +1 -1
  140. package/dist/server/defer-until-stream-consumed.d.ts +2 -1
  141. package/dist/server/defer-until-stream-consumed.js +3 -1
  142. package/dist/server/dev-server.js +39 -28
  143. package/dist/server/dev-stack-sourcemap.js +18 -23
  144. package/dist/server/document-initial-head.d.ts +0 -11
  145. package/dist/server/document-initial-head.js +1 -1
  146. package/dist/server/forwarded-middleware-context.d.ts +5 -0
  147. package/dist/server/forwarded-middleware-context.js +22 -0
  148. package/dist/server/headers.d.ts +4 -1
  149. package/dist/server/headers.js +4 -1
  150. package/dist/server/http-conditional.d.ts +11 -0
  151. package/dist/server/http-conditional.js +10 -1
  152. package/dist/server/http-error-responses.d.ts +1 -1
  153. package/dist/server/image-optimization.d.ts +38 -0
  154. package/dist/server/image-optimization.js +94 -4
  155. package/dist/server/isr-cache.d.ts +10 -0
  156. package/dist/server/isr-cache.js +41 -6
  157. package/dist/server/metadata-route-response.js +11 -10
  158. package/dist/server/middleware-matcher.d.ts +2 -0
  159. package/dist/server/middleware-matcher.js +23 -2
  160. package/dist/server/middleware-path-to-regexp.js +1 -1
  161. package/dist/server/middleware-runtime.d.ts +13 -0
  162. package/dist/server/middleware-runtime.js +38 -25
  163. package/dist/server/middleware.d.ts +1 -1
  164. package/dist/server/middleware.js +3 -1
  165. package/dist/server/multi-stage.d.ts +11 -0
  166. package/dist/server/navigation-planner.js +1 -1
  167. package/dist/server/normalize-path.d.ts +0 -13
  168. package/dist/server/normalize-path.js +1 -34
  169. package/dist/server/open-redirect.d.ts +11 -4
  170. package/dist/server/open-redirect.js +11 -4
  171. package/dist/server/pages-api-route.d.ts +3 -2
  172. package/dist/server/pages-api-route.js +6 -5
  173. package/dist/server/pages-cache-tag.d.ts +12 -0
  174. package/dist/server/pages-cache-tag.js +19 -0
  175. package/dist/server/pages-client-assets.d.ts +2 -0
  176. package/dist/server/pages-data-route.d.ts +10 -0
  177. package/dist/server/pages-data-route.js +21 -3
  178. package/dist/server/pages-document-asset-props.d.ts +5 -1
  179. package/dist/server/pages-document-asset-props.js +13 -5
  180. package/dist/server/pages-document-splice.d.ts +19 -0
  181. package/dist/server/pages-document-splice.js +55 -0
  182. package/dist/server/pages-i18n.d.ts +12 -1
  183. package/dist/server/pages-i18n.js +18 -4
  184. package/dist/server/pages-node-compat.d.ts +16 -5
  185. package/dist/server/pages-node-compat.js +20 -12
  186. package/dist/server/pages-page-data.d.ts +32 -24
  187. package/dist/server/pages-page-data.js +51 -121
  188. package/dist/server/pages-page-handler.d.ts +0 -6
  189. package/dist/server/pages-page-handler.js +189 -127
  190. package/dist/server/pages-page-response.d.ts +12 -6
  191. package/dist/server/pages-page-response.js +42 -35
  192. package/dist/server/pages-request-pipeline.d.ts +10 -2
  193. package/dist/server/pages-request-pipeline.js +41 -22
  194. package/dist/server/pages-request-stage-entry.d.ts +6 -0
  195. package/dist/server/pages-request-stage-entry.js +75 -16
  196. package/dist/server/pages-response-stage-entry.js +4 -0
  197. package/dist/server/pages-revalidate.js +3 -3
  198. package/dist/server/pages-router-entry.js +5 -4
  199. package/dist/server/prerender-manifest.d.ts +3 -3
  200. package/dist/server/prerender-manifest.js +4 -3
  201. package/dist/server/prerender-work-unit-setup.js +4 -0
  202. package/dist/server/prod-server.d.ts +12 -0
  203. package/dist/server/prod-server.js +204 -74
  204. package/dist/server/proper-error.d.ts +4 -0
  205. package/dist/server/proper-error.js +31 -0
  206. package/dist/server/request-pipeline.d.ts +4 -1
  207. package/dist/server/request-pipeline.js +3 -2
  208. package/dist/server/revalidation-request.d.ts +1 -0
  209. package/dist/server/revalidation-request.js +1 -1
  210. package/dist/server/rsc-stream-hints.d.ts +1 -1
  211. package/dist/server/rsc-stream-hints.js +52 -5
  212. package/dist/server/seed-cache.d.ts +1 -0
  213. package/dist/server/seed-cache.js +5 -4
  214. package/dist/server/server-reference-loader.d.ts +4 -0
  215. package/dist/server/server-reference-loader.js +29 -0
  216. package/dist/server/socket-error-backstop.d.ts +9 -1
  217. package/dist/server/socket-error-backstop.js +46 -17
  218. package/dist/server/static-file-signal.d.ts +15 -4
  219. package/dist/server/static-file-signal.js +46 -12
  220. package/dist/server/worker-image-optimization.d.ts +34 -0
  221. package/dist/server/worker-image-optimization.js +99 -0
  222. package/dist/server/worker-stages.d.ts +1 -1
  223. package/dist/server/worker-stages.js +2 -2
  224. package/dist/server/worker-utils.d.ts +8 -3
  225. package/dist/server/worker-utils.js +12 -7
  226. package/dist/shims/app-router-scroll.js +4 -1
  227. package/dist/shims/app-router-tree-context.d.ts +5 -0
  228. package/dist/shims/app-router-tree-context.js +27 -0
  229. package/dist/shims/cache-callable-runtime.d.ts +4 -2
  230. package/dist/shims/cache-callable-runtime.js +21 -12
  231. package/dist/shims/cache-handler.js +1 -9
  232. package/dist/shims/cache-runtime.d.ts +6 -1
  233. package/dist/shims/cache-runtime.js +2 -1
  234. package/dist/shims/cache.d.ts +2 -2
  235. package/dist/shims/cache.js +40 -13
  236. package/dist/shims/cdn-cache.d.ts +8 -0
  237. package/dist/shims/cdn-cache.js +17 -1
  238. package/dist/shims/disable-smooth-scroll.d.ts +3 -0
  239. package/dist/shims/disable-smooth-scroll.js +36 -0
  240. package/dist/shims/document-placeholders.d.ts +19 -0
  241. package/dist/shims/document-placeholders.js +45 -0
  242. package/dist/shims/document.js +21 -5
  243. package/dist/shims/dynamic-preload-chunks.d.ts +1 -0
  244. package/dist/shims/dynamic-preload-chunks.js +13 -9
  245. package/dist/shims/dynamic.d.ts +1 -1
  246. package/dist/shims/dynamic.js +60 -8
  247. package/dist/shims/fetch-cache-state.d.ts +66 -0
  248. package/dist/shims/fetch-cache-state.js +92 -0
  249. package/dist/shims/fetch-cache.d.ts +3 -67
  250. package/dist/shims/fetch-cache.js +160 -125
  251. package/dist/shims/head.d.ts +10 -6
  252. package/dist/shims/head.js +16 -14
  253. package/dist/shims/headers.js +2 -2
  254. package/dist/shims/image.js +2 -1
  255. package/dist/shims/internal/hybrid-client-route-owner-direct.js +1 -1
  256. package/dist/shims/internal/hybrid-client-route-owner.js +1 -0
  257. package/dist/shims/internal/work-store-scope.d.ts +5 -0
  258. package/dist/shims/internal/work-store-scope.js +24 -0
  259. package/dist/shims/link-prefetch.js +5 -4
  260. package/dist/shims/link.js +2 -2
  261. package/dist/shims/navigation.js +34 -9
  262. package/dist/shims/request-context.d.ts +2 -0
  263. package/dist/shims/request-state-types.d.ts +2 -1
  264. package/dist/shims/router.js +21 -32
  265. package/dist/shims/server.d.ts +27 -4
  266. package/dist/shims/server.js +65 -9
  267. package/dist/shims/unified-request-context.d.ts +1 -1
  268. package/dist/shims/url-utils.d.ts +9 -0
  269. package/dist/shims/url-utils.js +15 -4
  270. package/dist/utils/client-runtime-metadata.js +1 -1
  271. package/dist/utils/domain-locale.js +1 -1
  272. package/dist/utils/hash.d.ts +7 -0
  273. package/dist/utils/hash.js +11 -1
  274. package/dist/utils/package-name.d.ts +6 -0
  275. package/dist/utils/package-name.js +12 -1
  276. package/dist/utils/plugin-rsc-version.d.ts +6 -0
  277. package/dist/utils/plugin-rsc-version.js +41 -0
  278. package/dist/utils/prerender-output-paths.js +15 -4
  279. package/dist/utils/public-file-path.d.ts +10 -2
  280. package/dist/utils/public-file-path.js +13 -9
  281. package/dist/utils/public-routes.js +2 -2
  282. package/dist/utils/react-version.d.ts +10 -0
  283. package/dist/utils/react-version.js +39 -16
  284. package/package.json +11 -7
  285. package/dist/build/nitro-route-rules.d.ts +0 -47
  286. package/dist/build/nitro-route-rules.js +0 -79
  287. package/dist/plugins/cache-flight-codec.d.ts +0 -19
  288. package/dist/plugins/cache-flight-codec.js +0 -68
@@ -1,21 +1,24 @@
1
1
  import { VINEXT_PRERENDER_SECRET_HEADER, VINEXT_REVALIDATE_HOST_HEADER } from "../utils/protocol-headers.js";
2
2
  import { requestContextFromRequest } from "../config/request-context.js";
3
- import { assetPrefixPathname, isNextStaticPath } from "../utils/asset-prefix.js";
4
- import { normalizePathnameForRouteMatchStrict } from "../routing/utils.js";
5
3
  import { hasBasePath, stripBasePath } from "../utils/base-path.js";
6
- import { runWithExecutionContext } from "../shims/request-context.js";
7
4
  import { VINEXT_CACHEABILITY_PROBE_QUERY_PARAM, VINEXT_EXPECTED_WORKER_VERSION_HEADER } from "./headers.js";
8
5
  import { notFoundStaticAssetResponse } from "./http-error-responses.js";
9
6
  import { attachRequestCfMetadata, cloneRequestWithHeaders, cloneRequestWithUrl, filterInternalHeaders, guardProtocolRelativeUrl } from "./request-pipeline.js";
7
+ import { assetPrefixPathname, isNextStaticPath } from "../utils/asset-prefix.js";
8
+ import { normalizePathnameForRouteMatchStrict } from "../routing/utils.js";
9
+ import { runWithExecutionContext } from "../shims/request-context.js";
10
10
  import { normalizeDefaultLocalePathname } from "./pages-i18n.js";
11
+ import { isNextDataPathname } from "./pages-data-route.js";
11
12
  import { getExplicitCdnCacheAdapter } from "../shims/cdn-cache-state.js";
12
13
  import { CACHEABILITY_REQUEST_STATE } from "../shims/cacheability-classification.js";
13
14
  import { applyCdnResponseIdentityHeaders, captureCdnResponsePolicyOverrides, reconcileCdnResponseHeadersAfterOuterPolicy, validateCdnRequest } from "./cache-control.js";
14
15
  import { registerLazyDataCacheHandler } from "../shims/cache-handler.js";
15
- import { DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES, handleConfiguredImageOptimization, isImageOptimizationPath } from "./image-optimization.js";
16
+ import { DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES, handleConfiguredImageOptimization, isImageOptimizationPath, isImageSourceBodyStatus } from "./image-optimization.js";
16
17
  import { traceFrameworkRequest } from "./request-tracing.js";
17
18
  import { resolveResponseStageCachePolicy } from "./config-headers.js";
19
+ import { createStaticAssetRequest } from "./worker-utils.js";
18
20
  import { fetchWorkerFilesystemRoute, runPagesRequest, wrapMiddlewareWithBasePath } from "./pages-request-pipeline.js";
21
+ import { resolveClientBuildFile } from "./client-build-files.js";
19
22
  import { createWorkerRevalidationContext } from "./worker-revalidation-context.js";
20
23
  import { createWorkerPrerenderDiscoveryContext, createWorkerPrerenderReadinessResponse, isWorkerPrerenderDiscoveryPath } from "./worker-prerender-discovery.js";
21
24
  import { getPagesResponseStageCacheDisposition } from "./pages-response-stage.js";
@@ -39,12 +42,13 @@ function haveSameHeaders(first, second) {
39
42
  function captureOuterResponsePolicyHeaders(stagedHeaders, transportedPolicyHeaders) {
40
43
  return captureCdnResponsePolicyOverrides(stagedHeaders, new Headers(transportedPolicyHeaders ?? []));
41
44
  }
42
- const { authorizeOnDemandRevalidate, hasMiddleware, hasRequestAwareDocument, matchApiRoute, matchPageRoute, normalizeDataRequest, publicFiles, runMiddleware, vinextConfig } = pagesEntry;
45
+ const { authorizeOnDemandRevalidate, hasMiddleware, hasRequestAwareDocument, matchApiRoute, matchPageRoute, normalizeDataRequest, publicFiles, clientBuildFiles, runMiddleware, vinextConfig } = pagesEntry;
43
46
  const pagesRequestStageBuildId = pagesEntry.buildId ?? null;
44
47
  const pagesRequestStagePrerenderSecret = pagesEntry.prerenderSecret ?? null;
45
48
  const basePath = vinextConfig?.basePath ?? "";
46
49
  const assetPathPrefix = assetPrefixPathname(vinextConfig?.assetPrefix ?? "");
47
50
  const trailingSlash = vinextConfig?.trailingSlash ?? false;
51
+ const skipTrailingSlashRedirect = vinextConfig?.skipTrailingSlashRedirect ?? false;
48
52
  const i18nConfig = vinextConfig?.i18n ?? null;
49
53
  const configRedirects = vinextConfig?.redirects ?? [];
50
54
  const configRewrites = vinextConfig?.rewrites ?? {
@@ -60,6 +64,17 @@ const imageConfig = vinextConfig?.images ? {
60
64
  contentDispositionType: vinextConfig.images.contentDispositionType,
61
65
  contentSecurityPolicy: vinextConfig.images.contentSecurityPolicy
62
66
  } : void 0;
67
+ /**
68
+ * Whether the request stage serves this request as a client build file
69
+ * outside `_next/static`. Such responses resolve no route, so the Worker
70
+ * keeps their ASSETS cache policy out of route cacheability admission.
71
+ */
72
+ function isPagesClientBuildFileRequest(request, env, ctx) {
73
+ return (request.method === "GET" || request.method === "HEAD") && resolveAssetFetcher(ctx?.assets, env, "worker") !== void 0 && resolveClientBuildFile(new URL(request.url).pathname, basePath, clientBuildFiles) !== null;
74
+ }
75
+ function resolveAssetFetcher(assets, env, defaultHostRuntime) {
76
+ return assets ?? getExplicitCdnCacheAdapter()?.assets ?? (defaultHostRuntime === "worker" ? env?.ASSETS : void 0);
77
+ }
63
78
  /** Run the request-time stage with a host-owned response dispatcher. */
64
79
  function handleRequestStage(request, env, ctx, dispatchResponseStage) {
65
80
  const originalRequest = request;
@@ -89,7 +104,7 @@ async function handleRequestImpl(request, env, platformCtx, dispatchResponseStag
89
104
  let sharedOuterPolicyHeaders = null;
90
105
  let ctx = createWorkerRevalidationContext(platformCtx, (internalRequest, internalCtx) => handleRequest(internalRequest, env, internalCtx, dispatchResponseStage, forceCacheBypass, defaultHostRuntime, assets), defaultHostRuntime);
91
106
  configuredCdnCacheAdapters.registerConfiguredCacheAdapters(env);
92
- assets ??= getExplicitCdnCacheAdapter()?.assets ?? (defaultHostRuntime === "worker" ? env?.ASSETS : void 0);
107
+ assets = resolveAssetFetcher(assets, env, defaultHostRuntime);
93
108
  if (configuredCdnCacheAdapters.hasConfiguredDataCache) registerLazyDataCacheHandler(async () => {
94
109
  (await import("virtual:vinext-cache-adapters")).registerConfiguredCacheAdapters(env);
95
110
  });
@@ -113,7 +128,7 @@ async function handleRequestImpl(request, env, platformCtx, dispatchResponseStag
113
128
  probeRoute = readWorkerCacheabilityProbeRoute(request);
114
129
  const probeUrl = new URL(request.url);
115
130
  probeUrl.searchParams.delete(VINEXT_CACHEABILITY_PROBE_QUERY_PARAM);
116
- request = new Request(probeUrl, request);
131
+ request = cloneRequestWithUrl(request, probeUrl.href);
117
132
  }
118
133
  }
119
134
  let responseStageDispatched = false;
@@ -143,7 +158,7 @@ async function handleRequestImpl(request, env, platformCtx, dispatchResponseStag
143
158
  resolvedRoutePathname: pathname
144
159
  },
145
160
  kind: "pages-prerender-discovery",
146
- protocolVersion: 4,
161
+ protocolVersion: 5,
147
162
  requestHost: url.host,
148
163
  stagedHeaders: null
149
164
  }, { cache: "bypass" }, env, ctx);
@@ -154,6 +169,10 @@ async function handleRequestImpl(request, env, platformCtx, dispatchResponseStag
154
169
  } catch {
155
170
  return new Response("Bad Request", { status: 400 });
156
171
  }
172
+ if (assets && (request.method === "GET" || request.method === "HEAD")) {
173
+ const clientBuildFile = resolveClientBuildFile(pathname, basePath, clientBuildFiles);
174
+ if (clientBuildFile) return await assets.fetch(createStaticAssetRequest(clientBuildFile, request));
175
+ }
157
176
  const missingBuildAsset = isNextStaticPath(pathname, basePath, assetPathPrefix);
158
177
  const hadBasePath = !basePath || hasBasePath(pathname, basePath);
159
178
  {
@@ -189,6 +208,7 @@ async function handleRequestImpl(request, env, platformCtx, dispatchResponseStag
189
208
  assetPrefix: vinextConfig?.assetPrefix,
190
209
  basePath,
191
210
  trailingSlash,
211
+ skipTrailingSlashRedirect,
192
212
  i18nConfig,
193
213
  configRedirects,
194
214
  configRewrites,
@@ -228,7 +248,7 @@ async function handleRequestImpl(request, env, platformCtx, dispatchResponseStag
228
248
  resolvedRoutePathname: new URL(resolvedUrl, req.url).pathname
229
249
  },
230
250
  kind: "pages-page",
231
- protocolVersion: 4,
251
+ protocolVersion: 5,
232
252
  requestHost: new URL(req.url).host,
233
253
  renderOptions: isDataReq ? {
234
254
  ...options,
@@ -268,7 +288,7 @@ async function handleRequestImpl(request, env, platformCtx, dispatchResponseStag
268
288
  resolvedRoutePathname: new URL(apiUrl, req.url).pathname
269
289
  },
270
290
  kind: "pages-api",
271
- protocolVersion: 4,
291
+ protocolVersion: 5,
272
292
  requestHost: new URL(req.url).host,
273
293
  stagedHeaders: [...stagedHeaders]
274
294
  });
@@ -285,17 +305,56 @@ async function handleRequestImpl(request, env, platformCtx, dispatchResponseStag
285
305
  return response;
286
306
  }) : dispatched;
287
307
  },
288
- serveFilesystemRoute: async (requestPathname, _stagedHeaders, phase, resolvedUrl) => {
308
+ serveFilesystemRoute: async (requestPathname, _stagedHeaders, phase, resolvedUrl, filesystemRequest, resolvedPathnameHasBasePath) => {
289
309
  if (!assets) return false;
290
- if (isImageOptimizationPath(requestPathname)) {
310
+ if (resolvedPathnameHasBasePath && isImageOptimizationPath(requestPathname)) {
291
311
  const imageUrl = new URL(resolvedUrl, request.url);
292
- const imageRequest = new Request(imageUrl, request);
312
+ const imageRequest = cloneRequestWithUrl(request, imageUrl.href);
293
313
  const allowedWidths = [...vinextConfig?.images?.deviceSizes ?? DEFAULT_DEVICE_SIZES, ...vinextConfig?.images?.imageSizes ?? DEFAULT_IMAGE_SIZES];
294
- return handleConfiguredImageOptimization(imageRequest, (assetPath) => Promise.resolve(assets.fetch(new Request(new URL(assetPath, request.url)))), allowedWidths, imageConfig);
314
+ const { fetchWorkerImageSource } = await import("./worker-image-optimization.js");
315
+ return handleConfiguredImageOptimization(imageRequest, (sourceUrl, sourceImageRequest) => fetchWorkerImageSource(sourceUrl, sourceImageRequest, {
316
+ assets,
317
+ basePath,
318
+ assetPathPrefix,
319
+ clientBuildFiles,
320
+ fetchPublicFile: (sourceRequest) => resolvePublicImageSource(sourceRequest, assets)
321
+ }), allowedWidths, imageConfig);
295
322
  }
296
- return fetchWorkerFilesystemRoute(request, requestPathname, phase, (assetRequest) => Promise.resolve(assets.fetch(assetRequest)), publicFiles, basePath, assetPathPrefix);
323
+ return fetchWorkerFilesystemRoute(filesystemRequest, requestPathname, phase, (assetRequest) => Promise.resolve(assets.fetch(assetRequest)), publicFiles, basePath, assetPathPrefix, hadBasePath);
297
324
  }
298
325
  };
326
+ const resolvePublicImageSource = async (sourceRequest, sourceAssets) => {
327
+ const sourceUrl = new URL(sourceRequest.url);
328
+ if (guardProtocolRelativeUrl(sourceUrl.pathname, sourceUrl.search)) return null;
329
+ const sourceHadBasePath = !basePath || hasBasePath(sourceUrl.pathname, basePath);
330
+ const sourcePathname = stripBasePath(sourceUrl.pathname, basePath);
331
+ if (isNextDataPathname(sourcePathname)) return null;
332
+ let sourceAsset = null;
333
+ const sourceResult = await runPagesRequest(attachRequestCfMetadata(new Request(new URL(sourcePathname + sourceUrl.search, sourceUrl), { signal: sourceRequest.signal }), sourceRequest), {
334
+ ...deps,
335
+ hadBasePath: sourceHadBasePath,
336
+ isDataReq: false,
337
+ isDataRequest: false,
338
+ middlewareRequest: void 0,
339
+ dataNotFoundResponse: null,
340
+ recordCacheability: false,
341
+ runMiddleware: typeof runMiddleware === "function" ? wrapMiddlewareWithBasePath(runMiddleware, basePath, sourceHadBasePath) : null,
342
+ renderPage: null,
343
+ handleApi: null,
344
+ serveFilesystemRoute: async (candidate, _stagedHeaders, phase, _resolvedUrl, filesystemRequest) => {
345
+ if (isImageOptimizationPath(candidate)) return false;
346
+ const asset = await fetchWorkerFilesystemRoute(filesystemRequest, candidate, phase, (assetRequest) => Promise.resolve(sourceAssets.fetch(assetRequest)), publicFiles, basePath, assetPathPrefix, sourceHadBasePath);
347
+ if (asset === false) return false;
348
+ sourceAsset = asset;
349
+ return new Response(null);
350
+ }
351
+ });
352
+ if (sourceResult.type !== "response") return null;
353
+ await sourceResult.response.body?.cancel().catch(() => {});
354
+ if (isImageSourceBodyStatus(sourceResult.response.status)) return sourceAsset;
355
+ await sourceAsset?.body?.cancel().catch(() => {});
356
+ return null;
357
+ };
299
358
  const result = await runPagesRequest(request, deps);
300
359
  if (result.type === "response") {
301
360
  let response = result.response;
@@ -317,4 +376,4 @@ async function handleRequestImpl(request, env, platformCtx, dispatchResponseStag
317
376
  }
318
377
  }
319
378
  //#endregion
320
- export { handleRequestStage, handleRequestStageLocally, pagesRequestStageBuildId, pagesRequestStagePrerenderSecret };
379
+ export { handleRequestStage, handleRequestStageLocally, isPagesClientBuildFileRequest, pagesRequestStageBuildId, pagesRequestStagePrerenderSecret };
@@ -53,6 +53,10 @@ async function renderPagesResponse(request, env, platformCtx, props, stagedHeade
53
53
  ...ctx,
54
54
  isPrerenderPathDiscovery: true
55
55
  };
56
+ else if (props.kind === "pages-page" && dispatchOptions.regeneratesStoredEntry === true) ctx = {
57
+ ...ctx,
58
+ isStoredEntryRegeneration: true
59
+ };
56
60
  const render = async (cacheabilityContext) => {
57
61
  if (props.kind === "pages-prerender-discovery") {
58
62
  const readinessResponse = createWorkerPrerenderReadinessResponse(cacheabilityContext, request);
@@ -1,11 +1,11 @@
1
1
  import { PRERENDER_REVALIDATE_HEADER, PRERENDER_REVALIDATE_ONLY_GENERATED_HEADER, VINEXT_REVALIDATE_HOST_HEADER } from "../utils/protocol-headers.js";
2
- import { getRequestExecutionContext } from "../shims/request-context.js";
3
2
  import { VINEXT_REVALIDATED_CACHE_TAG_HEADER } from "./headers.js";
3
+ import { getRequestExecutionContext } from "../shims/request-context.js";
4
+ import { resolveRequestHost, resolveRequestProtocol } from "./proxy-trust.js";
4
5
  import { normalizeDomainHostname } from "../utils/domain-locale.js";
5
6
  import { getCdnCacheAdapter } from "../shims/cdn-cache.js";
6
7
  import { getRevalidateSecret, isOnDemandRevalidateRequest } from "./revalidation-request.js";
7
8
  import "./isr-cache.js";
8
- import { resolveRequestHost, resolveRequestProtocol } from "./proxy-trust.js";
9
9
  //#region src/server/pages-revalidate.ts
10
10
  async function performOnDemandRevalidate(source, urlPath, opts = {}, trustedOrigin, allowedRevalidateHeaderKeys = [], dev = false) {
11
11
  if (typeof urlPath !== "string" || !urlPath.startsWith("/")) throw new Error(`Invalid urlPath provided to revalidate(), must be a path e.g. /blog/post-1, received ${urlPath}`);
@@ -29,7 +29,7 @@ async function performOnDemandRevalidate(source, urlPath, opts = {}, trustedOrig
29
29
  const res = await fetchRevalidateTarget(target, headers, dispatchRevalidate);
30
30
  if (!((res.headers.get("x-vercel-cache") ?? res.headers.get("x-nextjs-cache"))?.toUpperCase() === "REVALIDATED" || res.status === 200 || res.status === 404 && opts.unstable_onlyGenerated === true)) throw new Error(`Failed to revalidate ${urlPath}: ${res.status}`);
31
31
  const regeneratedTag = res.headers.get(VINEXT_REVALIDATED_CACHE_TAG_HEADER);
32
- if (regeneratedTag) await getCdnCacheAdapter().revalidateTag(regeneratedTag);
32
+ if (regeneratedTag) await getCdnCacheAdapter().revalidateTag(decodeURIComponent(regeneratedTag));
33
33
  }
34
34
  function readSourceHeader(source, key) {
35
35
  if (isWebHeaders(source)) return source.get(key) ?? void 0;
@@ -1,11 +1,11 @@
1
- import { runWithExecutionContext } from "../shims/request-context.js";
2
1
  import { VINEXT_CACHEABILITY_PROBE_HEADER, VINEXT_CACHEABILITY_PROBE_QUERY_PARAM } from "./headers.js";
3
2
  import { cloneRequestWithHeaders, cloneRequestWithUrl } from "./request-pipeline.js";
3
+ import { runWithExecutionContext } from "../shims/request-context.js";
4
4
  import { getCdnCacheAdapter } from "../shims/cdn-cache.js";
5
5
  import { validateCdnRequest } from "./cache-control.js";
6
6
  import { createWorkerRevalidationContext } from "./worker-revalidation-context.js";
7
7
  import { createWorkerPrerenderDiscoveryContext, createWorkerPrerenderReadinessResponse } from "./worker-prerender-discovery.js";
8
- import { handleRequestStageLocally, pagesRequestStageBuildId, pagesRequestStagePrerenderSecret } from "./pages-request-stage-entry.js";
8
+ import { handleRequestStageLocally, isPagesClientBuildFileRequest, pagesRequestStageBuildId, pagesRequestStagePrerenderSecret } from "./pages-request-stage-entry.js";
9
9
  import { renderPagesResponse } from "./pages-response-stage-entry.js";
10
10
  import { registerConfiguredCacheAdapters } from "virtual:vinext-cache-adapters";
11
11
  import { __ensureInstrumentation } from "virtual:vinext-pages-request-entry";
@@ -23,8 +23,9 @@ async function handleSingleStageRequest(request, env, platformCtx) {
23
23
  if (readinessResponse.status === 204) await Promise.all([__ensureInstrumentation(), __ensureInstrumentation$1()]);
24
24
  return await validateCdnRequest(request) ?? readinessResponse;
25
25
  }
26
+ const isClientBuildFile = isPagesClientBuildFileRequest(request, env, ctx);
26
27
  let finalize;
27
- if (request.headers.has("X-Vinext-Cacheability-Probe")) {
28
+ if (!isClientBuildFile && request.headers.has("X-Vinext-Cacheability-Probe")) {
28
29
  const cacheability = await import("./cacheability-request.js");
29
30
  const probeContext = cacheability.createWorkerCacheabilityContext(ctx, request, pagesRequestStagePrerenderSecret, adapter.responseVary);
30
31
  if (probeContext !== ctx) {
@@ -39,7 +40,7 @@ async function handleSingleStageRequest(request, env, platformCtx) {
39
40
  }
40
41
  }
41
42
  const requiresCompletedResponseAdmission = adapter.requiresCompletedResponseAdmission === true;
42
- if (!finalize && (__cacheabilityManifest || requiresCompletedResponseAdmission)) {
43
+ if (!finalize && !isClientBuildFile && (__cacheabilityManifest || requiresCompletedResponseAdmission)) {
43
44
  const cacheability = await import("./cacheability-request.js");
44
45
  const admissionContext = cacheability.createWorkerCacheabilityAdmissionContext(ctx, request, __cacheabilityManifest, pagesRequestStageBuildId, requiresCompletedResponseAdmission, adapter.responseVary);
45
46
  if (admissionContext !== ctx) {
@@ -32,7 +32,6 @@ export type PrerenderManifest = {
32
32
  pregeneratedConcretePaths?: Array<[string, string[]]>;
33
33
  };
34
34
  export type PrerenderedPathSelectionOptions = {
35
- includeFallbackShells?: boolean;
36
35
  includeErrorDocuments?: boolean;
37
36
  };
38
37
  export declare function readPrerenderManifest(manifestPath: string): PrerenderManifest | null;
@@ -58,8 +57,9 @@ export declare function buildPregeneratedConcretePathTable(manifest: PrerenderMa
58
57
  * This intentionally includes both App Router and Pages Router entries because
59
58
  * deploy-time cache warmup should exercise the same URLs the prerender phase
60
59
  * proved are statically renderable. PPR fallback-shell placeholder artifacts
61
- * and known error documents are excluded by default so warmup does not request
62
- * synthetic bracket paths or treat a healthy 404 response as a failed warmup.
60
+ * are always excluded, and known error documents by default, so warmup does not
61
+ * request synthetic bracket paths or treat a healthy 404 response as a failed
62
+ * warmup.
63
63
  */
64
64
  export declare function getPrerenderedConcretePaths(manifest: PrerenderManifest, options?: PrerenderedPathSelectionOptions): string[];
65
65
  //#endregion
@@ -65,8 +65,9 @@ function buildPregeneratedConcretePathTable(manifest) {
65
65
  * This intentionally includes both App Router and Pages Router entries because
66
66
  * deploy-time cache warmup should exercise the same URLs the prerender phase
67
67
  * proved are statically renderable. PPR fallback-shell placeholder artifacts
68
- * and known error documents are excluded by default so warmup does not request
69
- * synthetic bracket paths or treat a healthy 404 response as a failed warmup.
68
+ * are always excluded, and known error documents by default, so warmup does not
69
+ * request synthetic bracket paths or treat a healthy 404 response as a failed
70
+ * warmup.
70
71
  */
71
72
  function getPrerenderedConcretePaths(manifest, options) {
72
73
  const routes = manifest.routes;
@@ -76,7 +77,7 @@ function getPrerenderedConcretePaths(manifest, options) {
76
77
  for (const route of routes) {
77
78
  if (route.status !== "rendered" || route.notFound) continue;
78
79
  const pathname = route.path ?? route.route;
79
- if (!options?.includeFallbackShells && isFallbackShellArtifactPath(pathname, route)) continue;
80
+ if (isFallbackShellArtifactPath(pathname, route)) continue;
80
81
  if (!options?.includeErrorDocuments && isErrorDocumentRoute(pathname, route)) continue;
81
82
  if (seen.has(pathname)) continue;
82
83
  seen.add(pathname);
@@ -1,3 +1,4 @@
1
+ import { runInWorkStoreScope } from "../shims/internal/work-store-scope.js";
1
2
  import { workUnitAsyncStorage } from "../shims/internal/work-unit-async-storage.js";
2
3
  import { isRouteCacheabilityProbe } from "../shims/cacheability-classification.js";
3
4
  import { NO_STORE_CACHE_CONTROL } from "./cache-control.js";
@@ -15,6 +16,9 @@ import { NO_STORE_CACHE_CONTROL } from "./cache-control.js";
15
16
  *
16
17
  */
17
18
  function runWithPrerenderWorkUnit(fn, options) {
19
+ return runInWorkStoreScope(() => runWithWorkUnit(fn, options));
20
+ }
21
+ function runWithWorkUnit(fn, options) {
18
22
  if (process.env.VINEXT_PRERENDER === "1" || isRouteCacheabilityProbe()) {
19
23
  if (options?.cacheComponents !== true) return workUnitAsyncStorage.run({ type: "prerender-legacy" }, fn);
20
24
  return runWithPrerenderWorkUnitOwner(fn, options);
@@ -155,5 +155,17 @@ export declare function resolveAppRouterPrerenderSeeder(entryModule: unknown): A
155
155
  * route through; the on-disk path is just `_next/static/...`.
156
156
  */
157
157
  export declare function resolveAppRouterAssetPath(pathname: string, assetPathPrefix: string, assetPrefix: string): string | null;
158
+ /**
159
+ * Create the Pages Router request handler for `vite preview`. Vite's preview
160
+ * middleware (proxy, compression, `base`, static files) runs first, so this
161
+ * handles only the requests Vite doesn't serve and leaves compression to Vite.
162
+ * Resolves to null when the build has no Pages Router server entry.
163
+ */
164
+ export declare function createPagesPreviewHandler(options: {
165
+ clientDir: string;
166
+ serverDir: string;
167
+ host: string;
168
+ port: number;
169
+ }): Promise<((req: IncomingMessage, res: ServerResponse) => void) | null>;
158
170
  //#endregion
159
171
  export { COMPRESS_THRESHOLD, isCompressibleContentType, mergeResponseHeaders, mergeWebResponse, negotiateEncoding, nodeToWebRequest, resolveRequestHost as resolveHost, sendCompressed, sendWebResponse, trustProxy, trustedHosts, tryServeStatic, waitForNodeResponseCompletion };