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.
- package/README.md +72 -1
- package/THIRD_PARTY_LICENSES.md +26 -0
- package/dist/build/app-page-static-eligibility.d.ts +15 -0
- package/dist/build/app-page-static-eligibility.js +82 -0
- package/dist/build/lifecycle.js +10 -10
- package/dist/build/pages-client-assets-module.js +6 -1
- package/dist/build/precompress.js +1 -1
- package/dist/build/prerender-paths.js +6 -85
- package/dist/build/prerender.d.ts +8 -1
- package/dist/build/prerender.js +167 -46
- package/dist/build/run-prerender.js +4 -3
- package/dist/build/server-entry.d.ts +2 -0
- package/dist/build/server-entry.js +7 -1
- package/dist/build/server-manifest.d.ts +7 -0
- package/dist/build/server-manifest.js +11 -1
- package/dist/cache/cache-adapters-virtual.d.ts +7 -1
- package/dist/cache/cache-adapters-virtual.js +3 -3
- package/dist/client/browser-globals.d.ts +4 -0
- package/dist/client/browser-globals.js +5 -0
- package/dist/client/navigation-runtime.d.ts +11 -1
- package/dist/client/navigation-runtime.js +3 -3
- package/dist/config/config-matchers.js +3 -1
- package/dist/config/dotenv.js +14 -3
- package/dist/config/next-config.d.ts +7 -0
- package/dist/config/next-config.js +18 -3
- package/dist/entries/app-rsc-entry.d.ts +2 -0
- package/dist/entries/app-rsc-entry.js +67 -45
- package/dist/index.d.ts +4 -1
- package/dist/index.js +200 -100
- package/dist/init-cloudflare.d.ts +1 -1
- package/dist/init-cloudflare.js +6 -6
- package/dist/init-platform.js +1 -1
- package/dist/init.js +4 -2
- package/dist/plugins/cache-flight-codec.d.ts +19 -0
- package/dist/plugins/cache-flight-codec.js +68 -0
- package/dist/plugins/commonjs-esm-facade.d.ts +35 -0
- package/dist/plugins/commonjs-esm-facade.js +80 -0
- package/dist/plugins/commonjs-syntax.d.ts +16 -0
- package/dist/plugins/commonjs-syntax.js +22 -0
- package/dist/plugins/fonts.d.ts +8 -11
- package/dist/plugins/fonts.js +71 -34
- package/dist/plugins/ignore-dynamic-requests.d.ts +11 -0
- package/dist/plugins/ignore-dynamic-requests.js +54 -3
- package/dist/plugins/import-meta-url.js +6 -6
- package/dist/plugins/og-asset-ownership.d.ts +2 -0
- package/dist/plugins/og-asset-ownership.js +24 -13
- package/dist/plugins/og-assets.d.ts +18 -0
- package/dist/plugins/og-assets.js +50 -8
- package/dist/plugins/og-harfbuzz.js +38 -27
- package/dist/plugins/optimize-imports.js +2 -1
- package/dist/plugins/require-context.d.ts +1 -0
- package/dist/plugins/require-context.js +28 -1
- package/dist/plugins/scan-build-css.d.ts +12 -0
- package/dist/plugins/scan-build-css.js +39 -0
- package/dist/plugins/strip-server-exports.d.ts +2 -0
- package/dist/plugins/strip-server-exports.js +3 -1
- package/dist/plugins/transform-result.d.ts +18 -0
- package/dist/plugins/transform-result.js +23 -2
- package/dist/plugins/typeof-window.d.ts +10 -0
- package/dist/plugins/typeof-window.js +33 -9
- package/dist/routing/app-route-graph.d.ts +0 -1
- package/dist/routing/app-route-graph.js +2 -4
- package/dist/routing/app-route-ids.d.ts +3 -0
- package/dist/routing/app-route-ids.js +6 -0
- package/dist/routing/file-matcher.d.ts +1 -0
- package/dist/routing/file-matcher.js +1 -1
- package/dist/server/api-handler.js +17 -7
- package/dist/server/app-bfcache-id.d.ts +1 -0
- package/dist/server/app-bfcache-id.js +7 -1
- package/dist/server/app-bfcache-identity.js +1 -2
- package/dist/server/app-browser-entry.js +15 -9
- package/dist/server/app-browser-history-controller.d.ts +2 -0
- package/dist/server/app-browser-history-controller.js +8 -0
- package/dist/server/app-browser-hydration.d.ts +1 -1
- package/dist/server/app-browser-hydration.js +2 -2
- package/dist/server/app-browser-interception-context.js +26 -2
- package/dist/server/app-browser-navigation-controller.d.ts +7 -1
- package/dist/server/app-browser-navigation-controller.js +94 -11
- package/dist/server/app-browser-state.js +1 -1
- package/dist/server/app-browser-stream.d.ts +1 -1
- package/dist/server/app-fallback-renderer.d.ts +2 -0
- package/dist/server/app-fallback-renderer.js +1 -0
- package/dist/server/app-history-state.d.ts +3 -1
- package/dist/server/app-history-state.js +9 -5
- package/dist/server/app-middleware.js +2 -1
- package/dist/server/app-optimistic-routing.js +1 -1
- package/dist/server/app-page-boundary-render.d.ts +5 -0
- package/dist/server/app-page-boundary-render.js +6 -4
- package/dist/server/app-page-cache-finalizer.d.ts +11 -0
- package/dist/server/app-page-cache-finalizer.js +41 -7
- package/dist/server/app-page-cache-render.d.ts +18 -0
- package/dist/server/app-page-cache-render.js +65 -44
- package/dist/server/app-page-cache.d.ts +5 -0
- package/dist/server/app-page-cache.js +27 -7
- package/dist/server/app-page-dispatch.d.ts +9 -1
- package/dist/server/app-page-dispatch.js +47 -30
- package/dist/server/app-page-element-builder.d.ts +7 -0
- package/dist/server/app-page-element-builder.js +27 -42
- package/dist/server/app-page-execution.d.ts +15 -12
- package/dist/server/app-page-execution.js +30 -40
- package/dist/server/app-page-head.d.ts +5 -0
- package/dist/server/app-page-head.js +9 -3
- package/dist/server/app-page-probe.d.ts +0 -109
- package/dist/server/app-page-probe.js +3 -136
- package/dist/server/app-page-render-identity.d.ts +0 -1
- package/dist/server/app-page-render-identity.js +1 -1
- package/dist/server/app-page-render-observation.js +2 -2
- package/dist/server/app-page-render.d.ts +13 -5
- package/dist/server/app-page-render.js +219 -118
- package/dist/server/app-page-request.d.ts +0 -1
- package/dist/server/app-page-request.js +1 -2
- package/dist/server/app-page-response.d.ts +4 -3
- package/dist/server/app-page-response.js +4 -3
- package/dist/server/app-page-route-wiring.d.ts +17 -5
- package/dist/server/app-page-route-wiring.js +55 -33
- package/dist/server/app-page-rsc-render-status.d.ts +48 -0
- package/dist/server/app-page-rsc-render-status.js +54 -0
- package/dist/server/app-page-search-params-observation.js +1 -1
- package/dist/server/app-page-stream.d.ts +15 -8
- package/dist/server/app-page-stream.js +7 -1
- package/dist/server/app-page-tracing.js +2 -1
- package/dist/server/app-pages-bridge.js +3 -2
- package/dist/server/app-render-abort-error.d.ts +3 -0
- package/dist/server/app-render-abort-error.js +8 -0
- package/dist/server/app-request-stage-dispatch.js +1 -1
- package/dist/server/app-request-stage-independent-entry.js +8 -11
- package/dist/server/app-response-header-provenance.d.ts +2 -0
- package/dist/server/app-response-header-provenance.js +10 -4
- package/dist/server/app-route-handler-cache.d.ts +2 -1
- package/dist/server/app-route-handler-cache.js +11 -7
- package/dist/server/app-route-handler-dispatch.js +11 -4
- package/dist/server/app-route-handler-execution.d.ts +9 -1
- package/dist/server/app-route-handler-execution.js +28 -13
- package/dist/server/app-route-handler-policy.js +2 -2
- package/dist/server/app-route-handler-response.d.ts +1 -1
- package/dist/server/app-route-handler-response.js +14 -5
- package/dist/server/app-router-entry.d.ts +2 -1
- package/dist/server/app-router-entry.js +8 -12
- package/dist/server/app-rsc-errors.d.ts +0 -1
- package/dist/server/app-rsc-errors.js +2 -6
- package/dist/server/app-rsc-handler.d.ts +5 -0
- package/dist/server/app-rsc-handler.js +229 -102
- package/dist/server/app-rsc-request-normalization.d.ts +4 -2
- package/dist/server/app-rsc-request-normalization.js +7 -4
- package/dist/server/app-rsc-response-finalizer.js +4 -1
- package/dist/server/app-rsc-response-stage.d.ts +1 -1
- package/dist/server/app-rsc-response-stage.js +6 -4
- package/dist/server/app-rsc-route-matching.d.ts +9 -1
- package/dist/server/app-rsc-route-matching.js +37 -20
- package/dist/server/app-server-action-execution.d.ts +2 -1
- package/dist/server/app-server-action-execution.js +1 -1
- package/dist/server/app-ssr-entry.d.ts +3 -2
- package/dist/server/app-ssr-entry.js +9 -7
- package/dist/server/app-ssr-search-params-gate.js +1 -1
- package/dist/server/app-ssr-stream.d.ts +6 -1
- package/dist/server/app-ssr-stream.js +35 -16
- package/dist/server/app-worker-stages.d.ts +2 -2
- package/dist/server/app-worker-stages.js +3 -3
- package/dist/server/cache-control.js +3 -11
- package/dist/server/cacheability-request.js +56 -52
- package/dist/server/config-headers.js +3 -1
- package/dist/server/dev-server.js +23 -5
- package/dist/server/headers.d.ts +16 -0
- package/dist/server/headers.js +19 -1
- package/dist/server/http-error-responses.js +1 -0
- package/dist/server/image-optimization.d.ts +16 -0
- package/dist/server/image-optimization.js +26 -6
- package/dist/server/isr-cache.d.ts +2 -0
- package/dist/server/isr-cache.js +8 -3
- package/dist/server/metadata-route-response.js +94 -37
- package/dist/server/middleware-matcher-pattern.js +8 -4
- package/dist/server/middleware-response-headers.js +2 -0
- package/dist/server/multi-stage.d.ts +8 -0
- package/dist/server/navigation-planner.js +1 -1
- package/dist/server/node-response-signal.d.ts +16 -0
- package/dist/server/node-response-signal.js +26 -0
- package/dist/server/open-redirect.d.ts +47 -0
- package/dist/server/open-redirect.js +74 -1
- package/dist/server/pages-api-route.js +8 -2
- package/dist/server/pages-asset-tags.d.ts +1 -0
- package/dist/server/pages-asset-tags.js +73 -22
- package/dist/server/pages-client-assets.d.ts +2 -0
- package/dist/server/pages-page-data.d.ts +6 -1
- package/dist/server/pages-page-data.js +71 -65
- package/dist/server/pages-page-handler.js +50 -15
- package/dist/server/pages-page-response.js +3 -1
- package/dist/server/pages-request-pipeline.d.ts +2 -1
- package/dist/server/pages-request-pipeline.js +20 -5
- package/dist/server/pages-request-stage-entry.js +14 -8
- package/dist/server/prerender-manifest.d.ts +6 -0
- package/dist/server/prerender-manifest.js +1 -1
- package/dist/server/prod-server.d.ts +8 -7
- package/dist/server/prod-server.js +152 -78
- package/dist/server/request-pipeline.d.ts +20 -8
- package/dist/server/request-pipeline.js +21 -7
- package/dist/server/response-compression.d.ts +43 -0
- package/dist/server/response-compression.js +111 -0
- package/dist/server/response-stage-cacheability.js +1 -1
- package/dist/server/seed-cache.js +10 -7
- package/dist/server/socket-error-backstop.d.ts +14 -0
- package/dist/server/socket-error-backstop.js +27 -4
- package/dist/server/worker-revalidation-context.d.ts +2 -1
- package/dist/server/worker-revalidation-context.js +1 -0
- package/dist/server/workers-tracing.d.ts +17 -0
- package/dist/server/workers-tracing.js +48 -8
- package/dist/shims/cache-adapter-instantiate.d.ts +50 -0
- package/dist/shims/cache-adapter-instantiate.js +118 -0
- package/dist/shims/cache-callable-runtime.d.ts +2 -40
- package/dist/shims/cache-callable-runtime.js +50 -168
- package/dist/shims/cache-flight-arguments.d.ts +22 -0
- package/dist/shims/cache-flight-arguments.js +56 -0
- package/dist/shims/cache-request-state.d.ts +18 -14
- package/dist/shims/cache-request-state.js +33 -21
- package/dist/shims/cache-runtime.d.ts +6 -19
- package/dist/shims/cache-runtime.js +168 -226
- package/dist/shims/cache.d.ts +3 -2
- package/dist/shims/cache.js +8 -5
- package/dist/shims/cacheability-classification.d.ts +8 -1
- package/dist/shims/cacheability-classification.js +2 -2
- package/dist/shims/cdn-cache.d.ts +10 -1
- package/dist/shims/cdn-cache.js +16 -9
- package/dist/shims/error-boundary-navigation.d.ts +7 -0
- package/dist/shims/error-boundary-navigation.js +19 -1
- package/dist/shims/error-boundary.d.ts +10 -10
- package/dist/shims/error-boundary.js +26 -7
- package/dist/shims/error.d.ts +4 -18
- package/dist/shims/error.js +17 -10
- package/dist/shims/error.react-server.d.ts +4 -6
- package/dist/shims/error.react-server.js +4 -1
- package/dist/shims/fetch-cache.d.ts +6 -0
- package/dist/shims/fetch-cache.js +23 -4
- package/dist/shims/form.js +1 -1
- package/dist/shims/headers.d.ts +19 -69
- package/dist/shims/headers.js +82 -183
- package/dist/shims/internal/app-page-props-cache-key.d.ts +5 -2
- package/dist/shims/internal/app-page-props-cache-key.js +24 -15
- package/dist/shims/internal/cache-context-accessor.d.ts +16 -0
- package/dist/shims/internal/cache-context-accessor.js +15 -0
- package/dist/shims/internal/headers-state.d.ts +73 -0
- package/dist/shims/internal/headers-state.js +157 -0
- package/dist/shims/metadata.js +3 -3
- package/dist/shims/navigation-errors.d.ts +6 -0
- package/dist/shims/navigation-errors.js +11 -1
- package/dist/shims/navigation.d.ts +7 -0
- package/dist/shims/navigation.js +16 -6
- package/dist/shims/request-context.d.ts +9 -0
- package/dist/shims/request-state-types.d.ts +2 -1
- package/dist/shims/root-params.js +1 -1
- package/dist/shims/server.js +52 -2
- package/dist/shims/thenable-params.d.ts +4 -0
- package/dist/shims/thenable-params.js +25 -3
- package/dist/shims/unified-request-context.d.ts +1 -1
- package/dist/shims/unified-request-context.js +1 -0
- package/dist/utils/encode-cache-tag.d.ts +1 -0
- package/dist/utils/encode-cache-tag.js +11 -1
- package/dist/utils/mdx-scan.d.ts +5 -0
- package/dist/utils/mdx-scan.js +8 -1
- package/dist/utils/regex-safety.d.ts +10 -0
- package/dist/utils/regex-safety.js +70 -18
- package/dist/utils/vite-cli-invocation.js +8 -1
- package/package.json +8 -4
- package/dist/server/metadata-route-cache-policy.d.ts +0 -5
- 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 {
|
|
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,
|
|
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 ||
|
|
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 {
|
|
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",
|
|
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
|
-
|
|
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:
|
|
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,
|
|
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 =
|
|
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 {
|
|
159
|
+
export { COMPRESS_THRESHOLD, isCompressibleContentType, mergeResponseHeaders, mergeWebResponse, negotiateEncoding, nodeToWebRequest, resolveRequestHost as resolveHost, sendCompressed, sendWebResponse, trustProxy, trustedHosts, tryServeStatic, waitForNodeResponseCompletion };
|