vinext 1.0.0 → 1.1.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 (263) hide show
  1. package/README.md +72 -1
  2. package/THIRD_PARTY_LICENSES.md +26 -0
  3. package/dist/build/app-page-static-eligibility.d.ts +15 -0
  4. package/dist/build/app-page-static-eligibility.js +82 -0
  5. package/dist/build/lifecycle.js +10 -10
  6. package/dist/build/pages-client-assets-module.js +6 -1
  7. package/dist/build/precompress.js +1 -1
  8. package/dist/build/prerender-paths.js +6 -85
  9. package/dist/build/prerender.d.ts +8 -1
  10. package/dist/build/prerender.js +167 -46
  11. package/dist/build/run-prerender.js +4 -3
  12. package/dist/build/server-entry.d.ts +2 -0
  13. package/dist/build/server-entry.js +7 -1
  14. package/dist/build/server-manifest.d.ts +7 -0
  15. package/dist/build/server-manifest.js +11 -1
  16. package/dist/cache/cache-adapters-virtual.d.ts +7 -1
  17. package/dist/cache/cache-adapters-virtual.js +3 -3
  18. package/dist/client/browser-globals.d.ts +4 -0
  19. package/dist/client/browser-globals.js +5 -0
  20. package/dist/client/navigation-runtime.d.ts +11 -1
  21. package/dist/client/navigation-runtime.js +3 -3
  22. package/dist/config/config-matchers.js +3 -1
  23. package/dist/config/dotenv.js +14 -3
  24. package/dist/config/next-config.d.ts +7 -0
  25. package/dist/config/next-config.js +18 -3
  26. package/dist/entries/app-rsc-entry.d.ts +2 -0
  27. package/dist/entries/app-rsc-entry.js +67 -45
  28. package/dist/index.d.ts +4 -1
  29. package/dist/index.js +200 -100
  30. package/dist/init-cloudflare.d.ts +1 -1
  31. package/dist/init-cloudflare.js +6 -6
  32. package/dist/init-platform.js +1 -1
  33. package/dist/init.js +4 -2
  34. package/dist/plugins/cache-flight-codec.d.ts +19 -0
  35. package/dist/plugins/cache-flight-codec.js +68 -0
  36. package/dist/plugins/commonjs-esm-facade.d.ts +35 -0
  37. package/dist/plugins/commonjs-esm-facade.js +80 -0
  38. package/dist/plugins/commonjs-syntax.d.ts +16 -0
  39. package/dist/plugins/commonjs-syntax.js +22 -0
  40. package/dist/plugins/fonts.d.ts +8 -11
  41. package/dist/plugins/fonts.js +71 -34
  42. package/dist/plugins/ignore-dynamic-requests.d.ts +11 -0
  43. package/dist/plugins/ignore-dynamic-requests.js +54 -3
  44. package/dist/plugins/import-meta-url.js +6 -6
  45. package/dist/plugins/og-asset-ownership.d.ts +2 -0
  46. package/dist/plugins/og-asset-ownership.js +24 -13
  47. package/dist/plugins/og-assets.d.ts +18 -0
  48. package/dist/plugins/og-assets.js +50 -8
  49. package/dist/plugins/og-harfbuzz.js +38 -27
  50. package/dist/plugins/optimize-imports.js +2 -1
  51. package/dist/plugins/require-context.d.ts +1 -0
  52. package/dist/plugins/require-context.js +28 -1
  53. package/dist/plugins/scan-build-css.d.ts +12 -0
  54. package/dist/plugins/scan-build-css.js +39 -0
  55. package/dist/plugins/strip-server-exports.d.ts +2 -0
  56. package/dist/plugins/strip-server-exports.js +3 -1
  57. package/dist/plugins/transform-result.d.ts +18 -0
  58. package/dist/plugins/transform-result.js +23 -2
  59. package/dist/plugins/typeof-window.d.ts +10 -0
  60. package/dist/plugins/typeof-window.js +33 -9
  61. package/dist/routing/app-route-graph.d.ts +0 -1
  62. package/dist/routing/app-route-graph.js +2 -4
  63. package/dist/routing/app-route-ids.d.ts +3 -0
  64. package/dist/routing/app-route-ids.js +6 -0
  65. package/dist/routing/file-matcher.d.ts +1 -0
  66. package/dist/routing/file-matcher.js +1 -1
  67. package/dist/server/api-handler.js +17 -7
  68. package/dist/server/app-bfcache-id.d.ts +1 -0
  69. package/dist/server/app-bfcache-id.js +7 -1
  70. package/dist/server/app-bfcache-identity.js +1 -2
  71. package/dist/server/app-browser-entry.js +15 -9
  72. package/dist/server/app-browser-history-controller.d.ts +2 -0
  73. package/dist/server/app-browser-history-controller.js +8 -0
  74. package/dist/server/app-browser-hydration.d.ts +1 -1
  75. package/dist/server/app-browser-hydration.js +2 -2
  76. package/dist/server/app-browser-interception-context.js +26 -2
  77. package/dist/server/app-browser-navigation-controller.d.ts +7 -1
  78. package/dist/server/app-browser-navigation-controller.js +94 -11
  79. package/dist/server/app-browser-state.js +1 -1
  80. package/dist/server/app-browser-stream.d.ts +1 -1
  81. package/dist/server/app-fallback-renderer.d.ts +2 -0
  82. package/dist/server/app-fallback-renderer.js +1 -0
  83. package/dist/server/app-history-state.d.ts +3 -1
  84. package/dist/server/app-history-state.js +9 -5
  85. package/dist/server/app-middleware.js +2 -1
  86. package/dist/server/app-optimistic-routing.js +1 -1
  87. package/dist/server/app-page-boundary-render.d.ts +5 -0
  88. package/dist/server/app-page-boundary-render.js +6 -4
  89. package/dist/server/app-page-cache-finalizer.d.ts +11 -0
  90. package/dist/server/app-page-cache-finalizer.js +41 -7
  91. package/dist/server/app-page-cache-render.d.ts +18 -0
  92. package/dist/server/app-page-cache-render.js +65 -44
  93. package/dist/server/app-page-cache.d.ts +5 -0
  94. package/dist/server/app-page-cache.js +27 -7
  95. package/dist/server/app-page-dispatch.d.ts +9 -1
  96. package/dist/server/app-page-dispatch.js +47 -30
  97. package/dist/server/app-page-element-builder.d.ts +7 -0
  98. package/dist/server/app-page-element-builder.js +27 -42
  99. package/dist/server/app-page-execution.d.ts +15 -12
  100. package/dist/server/app-page-execution.js +30 -40
  101. package/dist/server/app-page-head.d.ts +5 -0
  102. package/dist/server/app-page-head.js +9 -3
  103. package/dist/server/app-page-probe.d.ts +0 -109
  104. package/dist/server/app-page-probe.js +3 -136
  105. package/dist/server/app-page-render-identity.d.ts +0 -1
  106. package/dist/server/app-page-render-identity.js +1 -1
  107. package/dist/server/app-page-render-observation.js +2 -2
  108. package/dist/server/app-page-render.d.ts +13 -5
  109. package/dist/server/app-page-render.js +219 -118
  110. package/dist/server/app-page-request.d.ts +0 -1
  111. package/dist/server/app-page-request.js +1 -2
  112. package/dist/server/app-page-response.d.ts +4 -3
  113. package/dist/server/app-page-response.js +4 -3
  114. package/dist/server/app-page-route-wiring.d.ts +17 -5
  115. package/dist/server/app-page-route-wiring.js +55 -33
  116. package/dist/server/app-page-rsc-render-status.d.ts +48 -0
  117. package/dist/server/app-page-rsc-render-status.js +54 -0
  118. package/dist/server/app-page-search-params-observation.js +1 -1
  119. package/dist/server/app-page-stream.d.ts +15 -8
  120. package/dist/server/app-page-stream.js +7 -1
  121. package/dist/server/app-page-tracing.js +2 -1
  122. package/dist/server/app-pages-bridge.js +3 -2
  123. package/dist/server/app-render-abort-error.d.ts +3 -0
  124. package/dist/server/app-render-abort-error.js +8 -0
  125. package/dist/server/app-request-stage-dispatch.js +1 -1
  126. package/dist/server/app-request-stage-independent-entry.js +8 -11
  127. package/dist/server/app-response-header-provenance.d.ts +2 -0
  128. package/dist/server/app-response-header-provenance.js +10 -4
  129. package/dist/server/app-route-handler-cache.d.ts +2 -1
  130. package/dist/server/app-route-handler-cache.js +11 -7
  131. package/dist/server/app-route-handler-dispatch.js +11 -4
  132. package/dist/server/app-route-handler-execution.d.ts +9 -1
  133. package/dist/server/app-route-handler-execution.js +28 -13
  134. package/dist/server/app-route-handler-policy.js +2 -2
  135. package/dist/server/app-route-handler-response.d.ts +1 -1
  136. package/dist/server/app-route-handler-response.js +14 -5
  137. package/dist/server/app-router-entry.d.ts +2 -1
  138. package/dist/server/app-router-entry.js +8 -12
  139. package/dist/server/app-rsc-errors.d.ts +0 -1
  140. package/dist/server/app-rsc-errors.js +2 -6
  141. package/dist/server/app-rsc-handler.d.ts +5 -0
  142. package/dist/server/app-rsc-handler.js +229 -102
  143. package/dist/server/app-rsc-request-normalization.d.ts +4 -2
  144. package/dist/server/app-rsc-request-normalization.js +7 -4
  145. package/dist/server/app-rsc-response-finalizer.js +4 -1
  146. package/dist/server/app-rsc-response-stage.d.ts +1 -1
  147. package/dist/server/app-rsc-response-stage.js +6 -4
  148. package/dist/server/app-rsc-route-matching.d.ts +9 -1
  149. package/dist/server/app-rsc-route-matching.js +37 -20
  150. package/dist/server/app-server-action-execution.d.ts +2 -1
  151. package/dist/server/app-server-action-execution.js +1 -1
  152. package/dist/server/app-ssr-entry.d.ts +3 -2
  153. package/dist/server/app-ssr-entry.js +9 -7
  154. package/dist/server/app-ssr-search-params-gate.js +1 -1
  155. package/dist/server/app-ssr-stream.d.ts +6 -1
  156. package/dist/server/app-ssr-stream.js +35 -16
  157. package/dist/server/app-worker-stages.d.ts +2 -2
  158. package/dist/server/app-worker-stages.js +3 -3
  159. package/dist/server/cache-control.js +3 -11
  160. package/dist/server/cacheability-request.js +56 -52
  161. package/dist/server/config-headers.js +3 -1
  162. package/dist/server/dev-server.js +23 -5
  163. package/dist/server/headers.d.ts +16 -0
  164. package/dist/server/headers.js +19 -1
  165. package/dist/server/http-error-responses.js +1 -0
  166. package/dist/server/image-optimization.d.ts +16 -0
  167. package/dist/server/image-optimization.js +26 -6
  168. package/dist/server/isr-cache.d.ts +2 -0
  169. package/dist/server/isr-cache.js +8 -3
  170. package/dist/server/metadata-route-response.js +94 -37
  171. package/dist/server/middleware-matcher-pattern.js +8 -4
  172. package/dist/server/middleware-response-headers.js +2 -0
  173. package/dist/server/multi-stage.d.ts +8 -0
  174. package/dist/server/navigation-planner.js +1 -1
  175. package/dist/server/node-response-signal.d.ts +16 -0
  176. package/dist/server/node-response-signal.js +26 -0
  177. package/dist/server/open-redirect.d.ts +47 -0
  178. package/dist/server/open-redirect.js +74 -1
  179. package/dist/server/pages-api-route.js +8 -2
  180. package/dist/server/pages-asset-tags.d.ts +1 -0
  181. package/dist/server/pages-asset-tags.js +73 -22
  182. package/dist/server/pages-client-assets.d.ts +2 -0
  183. package/dist/server/pages-page-data.d.ts +6 -1
  184. package/dist/server/pages-page-data.js +71 -65
  185. package/dist/server/pages-page-handler.js +50 -15
  186. package/dist/server/pages-page-response.js +3 -1
  187. package/dist/server/pages-request-pipeline.d.ts +2 -1
  188. package/dist/server/pages-request-pipeline.js +20 -5
  189. package/dist/server/pages-request-stage-entry.js +14 -8
  190. package/dist/server/prerender-manifest.d.ts +6 -0
  191. package/dist/server/prerender-manifest.js +1 -1
  192. package/dist/server/prod-server.d.ts +8 -7
  193. package/dist/server/prod-server.js +152 -78
  194. package/dist/server/request-pipeline.d.ts +20 -8
  195. package/dist/server/request-pipeline.js +21 -7
  196. package/dist/server/response-compression.d.ts +43 -0
  197. package/dist/server/response-compression.js +111 -0
  198. package/dist/server/response-stage-cacheability.js +1 -1
  199. package/dist/server/seed-cache.js +10 -7
  200. package/dist/server/socket-error-backstop.d.ts +14 -0
  201. package/dist/server/socket-error-backstop.js +27 -4
  202. package/dist/server/worker-revalidation-context.d.ts +2 -1
  203. package/dist/server/worker-revalidation-context.js +1 -0
  204. package/dist/server/workers-tracing.d.ts +17 -0
  205. package/dist/server/workers-tracing.js +48 -8
  206. package/dist/shims/cache-adapter-instantiate.d.ts +50 -0
  207. package/dist/shims/cache-adapter-instantiate.js +118 -0
  208. package/dist/shims/cache-callable-runtime.d.ts +2 -40
  209. package/dist/shims/cache-callable-runtime.js +50 -168
  210. package/dist/shims/cache-flight-arguments.d.ts +22 -0
  211. package/dist/shims/cache-flight-arguments.js +56 -0
  212. package/dist/shims/cache-request-state.d.ts +18 -14
  213. package/dist/shims/cache-request-state.js +33 -21
  214. package/dist/shims/cache-runtime.d.ts +6 -19
  215. package/dist/shims/cache-runtime.js +168 -226
  216. package/dist/shims/cache.d.ts +3 -2
  217. package/dist/shims/cache.js +8 -5
  218. package/dist/shims/cacheability-classification.d.ts +8 -1
  219. package/dist/shims/cacheability-classification.js +2 -2
  220. package/dist/shims/cdn-cache.d.ts +10 -1
  221. package/dist/shims/cdn-cache.js +16 -9
  222. package/dist/shims/error-boundary-navigation.d.ts +7 -0
  223. package/dist/shims/error-boundary-navigation.js +19 -1
  224. package/dist/shims/error-boundary.d.ts +10 -10
  225. package/dist/shims/error-boundary.js +26 -7
  226. package/dist/shims/error.d.ts +4 -18
  227. package/dist/shims/error.js +17 -10
  228. package/dist/shims/error.react-server.d.ts +4 -6
  229. package/dist/shims/error.react-server.js +4 -1
  230. package/dist/shims/fetch-cache.d.ts +6 -0
  231. package/dist/shims/fetch-cache.js +23 -4
  232. package/dist/shims/form.js +1 -1
  233. package/dist/shims/headers.d.ts +19 -69
  234. package/dist/shims/headers.js +82 -183
  235. package/dist/shims/internal/app-page-props-cache-key.d.ts +5 -2
  236. package/dist/shims/internal/app-page-props-cache-key.js +24 -15
  237. package/dist/shims/internal/cache-context-accessor.d.ts +16 -0
  238. package/dist/shims/internal/cache-context-accessor.js +15 -0
  239. package/dist/shims/internal/headers-state.d.ts +73 -0
  240. package/dist/shims/internal/headers-state.js +157 -0
  241. package/dist/shims/metadata.js +3 -3
  242. package/dist/shims/navigation-errors.d.ts +6 -0
  243. package/dist/shims/navigation-errors.js +11 -1
  244. package/dist/shims/navigation.d.ts +7 -0
  245. package/dist/shims/navigation.js +16 -6
  246. package/dist/shims/request-context.d.ts +9 -0
  247. package/dist/shims/request-state-types.d.ts +2 -1
  248. package/dist/shims/root-params.js +1 -1
  249. package/dist/shims/server.js +52 -2
  250. package/dist/shims/thenable-params.d.ts +4 -0
  251. package/dist/shims/thenable-params.js +25 -3
  252. package/dist/shims/unified-request-context.d.ts +1 -1
  253. package/dist/shims/unified-request-context.js +1 -0
  254. package/dist/utils/encode-cache-tag.d.ts +1 -0
  255. package/dist/utils/encode-cache-tag.js +11 -1
  256. package/dist/utils/mdx-scan.d.ts +5 -0
  257. package/dist/utils/mdx-scan.js +8 -1
  258. package/dist/utils/regex-safety.d.ts +10 -0
  259. package/dist/utils/regex-safety.js +70 -18
  260. package/dist/utils/vite-cli-invocation.js +8 -1
  261. package/package.json +8 -4
  262. package/dist/server/metadata-route-cache-policy.d.ts +0 -5
  263. package/dist/server/metadata-route-cache-policy.js +0 -6
@@ -2,9 +2,11 @@ import { PRERENDER_REVALIDATE_HEADER } from "../utils/protocol-headers.js";
2
2
  import { requestContextFromRequest } from "../config/request-context.js";
3
3
  import { isExternalUrl } from "../utils/external-url.js";
4
4
  import { applyMiddlewareRequestHeaders, matchRedirect, matchRewrite, preserveRedirectDestinationQuery, proxyExternalRequest, sanitizeDestination } from "../config/config-matchers.js";
5
+ import { assetPrefixPathname, isNextStaticPath } from "../utils/asset-prefix.js";
5
6
  import { addBasePathToPathname, hasBasePath } from "../utils/base-path.js";
6
7
  import { patternToNextFormat } from "../routing/route-validation.js";
7
- import { methodNotAllowedResponse, sanitizeMethodNotAllowedHeaders } from "./http-error-responses.js";
8
+ import { VINEXT_PRERENDER_REWRITTEN_HEADER } from "./headers.js";
9
+ import { methodNotAllowedResponse, notFoundStaticAssetResponse, sanitizeMethodNotAllowedHeaders } from "./http-error-responses.js";
8
10
  import { cloneRequestWithUrl, normalizeTrailingSlash } from "./request-pipeline.js";
9
11
  import { normalizeDefaultLocalePathname, stripI18nLocaleForApiRoute } from "./pages-i18n.js";
10
12
  import { markRouteCacheabilityDynamic } from "../shims/cacheability-classification.js";
@@ -13,7 +15,7 @@ import { mergeRewriteQuery } from "../utils/query.js";
13
15
  import { buildMiddlewarePrefetchSkipResponse } from "./pages-data-route.js";
14
16
  import { setFrameworkRequestRoute } from "./request-tracing.js";
15
17
  import { applyConfigHeadersToHeaderRecord } from "./config-headers.js";
16
- import { mergeHeaders } from "./worker-utils.js";
18
+ import { finalizeMissingStaticAssetResponse, mergeHeaders } from "./worker-utils.js";
17
19
  //#region src/server/pages-request-pipeline.ts
18
20
  function ruleUsesUnkeyedRequestCondition(rule) {
19
21
  return [...rule.has ?? [], ...rule.missing ?? []].some((condition) => condition.type === "header" || condition.type === "cookie" || condition.type === "host");
@@ -30,12 +32,19 @@ function headersFromRecord(record) {
30
32
  else headers.set(name, value);
31
33
  return headers;
32
34
  }
33
- async function fetchWorkerFilesystemRoute(request, requestPathname, phase, fetchAsset, publicFiles, isDirectBuildAsset = false) {
35
+ async function fetchWorkerFilesystemRoute(request, requestPathname, phase, fetchAsset, publicFiles, basePath = "", assetPathPrefix = "") {
34
36
  const isRetrievalMethod = request.method === "GET" || request.method === "HEAD";
35
- if (phase === "direct" && isRetrievalMethod || phase === "direct" && publicFiles !== void 0 && !isDirectBuildAsset && !publicFiles.has(requestPathname) || requestPathname === "/api" || requestPathname.startsWith("/api/")) return false;
37
+ if (phase === "direct" && isRetrievalMethod || requestPathname === "/api" || requestPathname.startsWith("/api/")) return false;
36
38
  const assetUrl = new URL(request.url);
37
39
  assetUrl.pathname = requestPathname;
38
40
  assetUrl.search = "";
41
+ const decodedAssetUrl = new URL(assetUrl);
42
+ try {
43
+ decodedAssetUrl.pathname = decodeURIComponent(assetUrl.pathname);
44
+ } catch {
45
+ return false;
46
+ }
47
+ if (!publicFiles.has(assetUrl.pathname) && !publicFiles.has(decodedAssetUrl.pathname) && !isNextStaticPath(decodedAssetUrl.pathname, basePath, assetPathPrefix)) return false;
39
48
  const response = await fetchAsset(isRetrievalMethod ? new Request(assetUrl, request) : new Request(assetUrl, {
40
49
  method: "HEAD",
41
50
  headers: request.headers
@@ -254,10 +263,11 @@ async function runPagesRequest(request, deps) {
254
263
  }
255
264
  const initialFilesystemResult = await serveFilesystemRoute(resolvedPathname, resolvedPathnameIsRequestPathname ? "direct" : "beforeFiles");
256
265
  if (initialFilesystemResult) return initialFilesystemResult;
266
+ const isMissingBuildAsset = () => isNextStaticPath(resolvedPathname, "", assetPrefixPathname(deps.assetPrefix ?? ""));
257
267
  const isOutsideBasePathUnclaimed = () => basePath && !hadBasePath && !configRewriteFired;
258
268
  const outOfBasePathNotFound = () => ({
259
269
  type: "response",
260
- response: new Response("This page could not be found", {
270
+ response: isMissingBuildAsset() ? notFoundStaticAssetResponse(headersFromRecord(middlewareHeaders)) : new Response("This page could not be found", {
261
271
  status: 404,
262
272
  headers: { "Content-Type": "text/html; charset=utf-8" }
263
273
  })
@@ -375,6 +385,10 @@ async function runPagesRequest(request, deps) {
375
385
  matchedFallbackRewrite = true;
376
386
  if (response.status !== 404) break;
377
387
  }
388
+ if (!renderPageMatch && response.status === 404 && isMissingBuildAsset()) return {
389
+ type: "response",
390
+ response: finalizeMissingStaticAssetResponse(mergeHeaders(response, middlewareHeaders, middlewareStatus), true)
391
+ };
378
392
  if (response.status === 404 && shouldDeferErrorPageOnMiss && !matchedFallbackRewrite) response = await deps.renderPage(request, resolvedUrl, void 0, stagedHeaders);
379
393
  const matchedPathHeaders = { ...middlewareHeaders };
380
394
  if ((isDataReq || isDataRequest) && deps.hasMiddleware && !renderPageMatch && response.status === 404 && (middlewareStatus === void 0 || middlewareStatus === 200 || middlewareStatus === 404)) {
@@ -392,6 +406,7 @@ async function runPagesRequest(request, deps) {
392
406
  };
393
407
  }
394
408
  if ((isDataReq || isDataRequest) && renderPageMatch && (middlewareStatus ?? response.status) === 200) matchedPathHeaders["x-nextjs-matched-path"] = matchedPathnameForRoute(renderPageMatch?.route.pattern);
409
+ if (typeof process !== "undefined" && process.env?.VINEXT_PRERENDER === "1") matchedPathHeaders[VINEXT_PRERENDER_REWRITTEN_HEADER] = resolvedUrl === originalResolvedUrl ? "0" : "1";
395
410
  const merged = mergeHeaders(response, matchedPathHeaders, middlewareStatus);
396
411
  if (merged !== response) merged.__vinextStreamedHtmlResponse = response.__vinextStreamedHtmlResponse;
397
412
  return {
@@ -6,16 +6,15 @@ import { hasBasePath, stripBasePath } from "../utils/base-path.js";
6
6
  import { runWithExecutionContext } from "../shims/request-context.js";
7
7
  import { VINEXT_CACHEABILITY_PROBE_QUERY_PARAM, VINEXT_EXPECTED_WORKER_VERSION_HEADER } from "./headers.js";
8
8
  import { notFoundStaticAssetResponse } from "./http-error-responses.js";
9
- import { isOpenRedirectShaped } from "./open-redirect.js";
10
- import { attachRequestCfMetadata, cloneRequestWithHeaders, cloneRequestWithUrl, filterInternalHeaders } from "./request-pipeline.js";
9
+ import { attachRequestCfMetadata, cloneRequestWithHeaders, cloneRequestWithUrl, filterInternalHeaders, guardProtocolRelativeUrl } from "./request-pipeline.js";
11
10
  import { normalizeDefaultLocalePathname } from "./pages-i18n.js";
11
+ import { getExplicitCdnCacheAdapter } from "../shims/cdn-cache-state.js";
12
12
  import { CACHEABILITY_REQUEST_STATE } from "../shims/cacheability-classification.js";
13
13
  import { applyCdnResponseIdentityHeaders, captureCdnResponsePolicyOverrides, reconcileCdnResponseHeadersAfterOuterPolicy, validateCdnRequest } from "./cache-control.js";
14
14
  import { registerLazyDataCacheHandler } from "../shims/cache-handler.js";
15
15
  import { DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES, handleConfiguredImageOptimization, isImageOptimizationPath } from "./image-optimization.js";
16
16
  import { traceFrameworkRequest } from "./request-tracing.js";
17
17
  import { resolveResponseStageCachePolicy } from "./config-headers.js";
18
- import { finalizeMissingStaticAssetResponse } from "./worker-utils.js";
19
18
  import { fetchWorkerFilesystemRoute, runPagesRequest, wrapMiddlewareWithBasePath } from "./pages-request-pipeline.js";
20
19
  import { createWorkerRevalidationContext } from "./worker-revalidation-context.js";
21
20
  import { createWorkerPrerenderDiscoveryContext, createWorkerPrerenderReadinessResponse, isWorkerPrerenderDiscoveryPath } from "./worker-prerender-discovery.js";
@@ -69,7 +68,7 @@ function handleRequestStage(request, env, ctx, dispatchResponseStage) {
69
68
  /** Preserve the direct single-entry Worker path without retaining it in request-only builds. */
70
69
  function handleRequestStageLocally(request, env, ctx, dispatchResponseStage) {
71
70
  const originalRequest = request;
72
- return handleRequest(request, env, ctx, (stageRequest, props, _options, stageEnv, stageCtx) => dispatchResponseStage(stageRequest, stageEnv, stageCtx, props), true, "worker", env?.ASSETS).then((response) => applyCdnResponseIdentityHeaders(response, originalRequest));
71
+ return handleRequest(request, env, ctx, (stageRequest, props, _options, stageEnv, stageCtx) => dispatchResponseStage(stageRequest, stageEnv, stageCtx, props), true, "worker", ctx?.assets).then((response) => applyCdnResponseIdentityHeaders(response, originalRequest));
73
72
  }
74
73
  function handleRequest(request, env, platformCtx, dispatchResponseStage, forceCacheBypass, defaultHostRuntime, assets) {
75
74
  const url = new URL(request.url);
@@ -90,6 +89,7 @@ async function handleRequestImpl(request, env, platformCtx, dispatchResponseStag
90
89
  let sharedOuterPolicyHeaders = null;
91
90
  let ctx = createWorkerRevalidationContext(platformCtx, (internalRequest, internalCtx) => handleRequest(internalRequest, env, internalCtx, dispatchResponseStage, forceCacheBypass, defaultHostRuntime, assets), defaultHostRuntime);
92
91
  configuredCdnCacheAdapters.registerConfiguredCacheAdapters(env);
92
+ assets ??= getExplicitCdnCacheAdapter()?.assets ?? (defaultHostRuntime === "worker" ? env?.ASSETS : void 0);
93
93
  if (configuredCdnCacheAdapters.hasConfiguredDataCache) registerLazyDataCacheHandler(async () => {
94
94
  (await import("virtual:vinext-cache-adapters")).registerConfiguredCacheAdapters(env);
95
95
  });
@@ -147,7 +147,8 @@ async function handleRequestImpl(request, env, platformCtx, dispatchResponseStag
147
147
  requestHost: url.host,
148
148
  stagedHeaders: null
149
149
  }, { cache: "bypass" }, env, ctx);
150
- if (isOpenRedirectShaped(pathname)) return new Response("This page could not be found", { status: 404 });
150
+ const protocolRelativeGuard = guardProtocolRelativeUrl(pathname, url.search);
151
+ if (protocolRelativeGuard) return protocolRelativeGuard;
151
152
  try {
152
153
  normalizePathnameForRouteMatchStrict(pathname);
153
154
  } catch {
@@ -165,6 +166,7 @@ async function handleRequestImpl(request, env, platformCtx, dispatchResponseStag
165
166
  }
166
167
  }
167
168
  const middlewareRequest = request;
169
+ const originalRenderUrl = pathname + new URL(request.url).search;
168
170
  const dataNorm = normalizeDataRequest(request);
169
171
  if (dataNorm.notFoundResponse && !vinextConfig?.skipProxyUrlNormalize) return dataNorm.notFoundResponse;
170
172
  const isDataReq = dataNorm.isDataReq;
@@ -184,6 +186,7 @@ async function handleRequestImpl(request, env, platformCtx, dispatchResponseStag
184
186
  });
185
187
  let speculativeRenderRequest = null;
186
188
  const deps = {
189
+ assetPrefix: vinextConfig?.assetPrefix,
187
190
  basePath,
188
191
  trailingSlash,
189
192
  i18nConfig,
@@ -227,7 +230,10 @@ async function handleRequestImpl(request, env, platformCtx, dispatchResponseStag
227
230
  kind: "pages-page",
228
231
  protocolVersion: 4,
229
232
  requestHost: new URL(req.url).host,
230
- renderOptions: options ?? null,
233
+ renderOptions: isDataReq ? {
234
+ ...options,
235
+ originalUrl: originalRenderUrl
236
+ } : options ?? null,
231
237
  resolvedUrl,
232
238
  stagedHeaders: isSharedStaticPage ? null : [...stagedHeaders ?? new Headers()]
233
239
  });
@@ -287,12 +293,12 @@ async function handleRequestImpl(request, env, platformCtx, dispatchResponseStag
287
293
  const allowedWidths = [...vinextConfig?.images?.deviceSizes ?? DEFAULT_DEVICE_SIZES, ...vinextConfig?.images?.imageSizes ?? DEFAULT_IMAGE_SIZES];
288
294
  return handleConfiguredImageOptimization(imageRequest, (assetPath) => Promise.resolve(assets.fetch(new Request(new URL(assetPath, request.url)))), allowedWidths, imageConfig);
289
295
  }
290
- return fetchWorkerFilesystemRoute(request, requestPathname, phase, (assetRequest) => Promise.resolve(assets.fetch(assetRequest)), publicFiles, missingBuildAsset);
296
+ return fetchWorkerFilesystemRoute(request, requestPathname, phase, (assetRequest) => Promise.resolve(assets.fetch(assetRequest)), publicFiles, basePath, assetPathPrefix);
291
297
  }
292
298
  };
293
299
  const result = await runPagesRequest(request, deps);
294
300
  if (result.type === "response") {
295
- let response = finalizeMissingStaticAssetResponse(result.response, missingBuildAsset);
301
+ let response = result.response;
296
302
  if (sharedResponseHeaders && sharedOuterPolicyHeaders) reconcileCdnResponseHeadersAfterOuterPolicy(response.headers, sharedOuterPolicyHeaders);
297
303
  if (probeMode && probeRoute && !responseStageDispatched) {
298
304
  const { finalizeRequestStageCacheabilityProbe } = await import("./cacheability-request.js");
@@ -16,6 +16,12 @@ export type PrerenderManifestRoute = {
16
16
  fallback?: boolean;
17
17
  headers?: Record<string, string | string[]>;
18
18
  responseStatus?: number;
19
+ /** Pages source returned notFound, rather than rendering a custom 404 document. */
20
+ notFound?: true;
21
+ /** Original Pages redirect props, including client navigation semantics. */
22
+ redirectProps?: object;
23
+ /** Pages locale rendered for this public pathname. */
24
+ locale?: string;
19
25
  routeSegments?: string[];
20
26
  tags?: string[];
21
27
  };
@@ -74,7 +74,7 @@ function getPrerenderedConcretePaths(manifest, options) {
74
74
  const paths = [];
75
75
  const seen = /* @__PURE__ */ new Set();
76
76
  for (const route of routes) {
77
- if (route.status !== "rendered") continue;
77
+ if (route.status !== "rendered" || route.notFound) continue;
78
78
  const pathname = route.path ?? route.route;
79
79
  if (!options?.includeFallbackShells && isFallbackShellArtifactPath(pathname, route)) continue;
80
80
  if (!options?.includeErrorDocuments && isErrorDocumentRoute(pathname, route)) continue;
@@ -2,6 +2,7 @@ import { NextI18nConfig } from "../config/next-config.js";
2
2
  import { negotiateEncoding } from "./accept-encoding.js";
3
3
  import { StaticFileCache } from "./static-file-cache.js";
4
4
  import { resolveRequestHost, trustProxy, trustedHosts } from "./proxy-trust.js";
5
+ import { COMPRESS_THRESHOLD, isCompressibleContentType } from "./response-compression.js";
5
6
  import { IncomingMessage, ServerResponse } from "node:http";
6
7
  //#region src/server/prod-server.d.ts
7
8
  /**
@@ -68,10 +69,6 @@ export type ProdServerOptions = {
68
69
  /** Suppress the startup log for internal child-process servers. */
69
70
  silent?: boolean;
70
71
  };
71
- /** Content types that benefit from compression. */
72
- declare const COMPRESSIBLE_TYPES: Set<string>;
73
- /** Minimum size threshold for compression (in bytes). Below this, compression overhead isn't worth it. */
74
- declare const COMPRESS_THRESHOLD = 1024;
75
72
  /**
76
73
  * Merge middleware headers and a Web Response's headers into a single
77
74
  * record suitable for Node.js `res.writeHead()`. Uses `getSetCookie()`
@@ -104,15 +101,19 @@ declare function sendCompressed(req: IncomingMessage, res: ServerResponse, body:
104
101
  *
105
102
  * Without a cache, falls back to async filesystem probing (still non-blocking,
106
103
  * unlike the old sync existsSync/statSync approach).
104
+ *
105
+ * `extraHeaders` go on every response for the file. `representationHeaders` go
106
+ * only on responses that carry the file's bytes (200 and 206), never on a 304,
107
+ * 412, 416 or 405.
107
108
  */
108
- declare function tryServeStatic(req: IncomingMessage, res: ServerResponse, clientDir: string, pathname: string, compress: boolean, cache?: StaticFileCache, extraHeaders?: Record<string, string | string[]>, statusCode?: number): Promise<boolean>;
109
+ declare function tryServeStatic(req: IncomingMessage, res: ServerResponse, clientDir: string, pathname: string, compress: boolean, cache?: StaticFileCache, extraHeaders?: Record<string, string | string[]>, statusCode?: number, representationHeaders?: Record<string, string>): Promise<boolean>;
109
110
  /**
110
111
  * Convert a Node.js IncomingMessage to a Web Request object.
111
112
  *
112
113
  * When `urlOverride` is provided, it is used as the path + query string
113
114
  * instead of `req.url`.
114
115
  */
115
- declare function nodeToWebRequest(req: IncomingMessage, urlOverride?: string, prerenderSecret?: string, i18nConfig?: NextI18nConfig | null, authorizeOnDemandRevalidate?: (headerValue: string | null) => boolean): Request;
116
+ declare function nodeToWebRequest(req: IncomingMessage, urlOverride?: string, prerenderSecret?: string, i18nConfig?: NextI18nConfig | null, authorizeOnDemandRevalidate?: (headerValue: string | null) => boolean, signal?: AbortSignal): Request;
116
117
  /**
117
118
  * Stream a Web Response back to a Node.js ServerResponse.
118
119
  * Supports streaming compression for SSR responses.
@@ -155,4 +156,4 @@ export declare function resolveAppRouterPrerenderSeeder(entryModule: unknown): A
155
156
  */
156
157
  export declare function resolveAppRouterAssetPath(pathname: string, assetPathPrefix: string, assetPrefix: string): string | null;
157
158
  //#endregion
158
- export { COMPRESSIBLE_TYPES, COMPRESS_THRESHOLD, mergeResponseHeaders, mergeWebResponse, negotiateEncoding, nodeToWebRequest, resolveRequestHost as resolveHost, sendCompressed, sendWebResponse, trustProxy, trustedHosts, tryServeStatic, waitForNodeResponseCompletion };
159
+ export { COMPRESS_THRESHOLD, isCompressibleContentType, mergeResponseHeaders, mergeWebResponse, negotiateEncoding, nodeToWebRequest, resolveRequestHost as resolveHost, sendCompressed, sendWebResponse, trustProxy, trustedHosts, tryServeStatic, waitForNodeResponseCompletion };