vinext 0.0.51 → 0.0.52
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/dist/build/precompress.d.ts +7 -7
- package/dist/build/precompress.js +18 -17
- package/dist/build/precompress.js.map +1 -1
- package/dist/build/prerender.d.ts +3 -14
- package/dist/build/prerender.js +40 -40
- package/dist/build/prerender.js.map +1 -1
- package/dist/check.js +4 -0
- package/dist/check.js.map +1 -1
- package/dist/cli-args.d.ts +1 -0
- package/dist/cli-args.js +5 -0
- package/dist/cli-args.js.map +1 -1
- package/dist/cli.js +39 -0
- package/dist/cli.js.map +1 -1
- package/dist/client/navigation-runtime.d.ts +47 -0
- package/dist/client/navigation-runtime.js +156 -0
- package/dist/client/navigation-runtime.js.map +1 -0
- package/dist/client/pages-router-link-navigation.d.ts +26 -0
- package/dist/client/pages-router-link-navigation.js +14 -0
- package/dist/client/pages-router-link-navigation.js.map +1 -0
- package/dist/client/vinext-next-data.d.ts +12 -2
- package/dist/client/vinext-next-data.js +50 -1
- package/dist/client/vinext-next-data.js.map +1 -0
- package/dist/cloudflare/kv-cache-handler.js +2 -1
- package/dist/cloudflare/kv-cache-handler.js.map +1 -1
- package/dist/config/config-matchers.d.ts +63 -16
- package/dist/config/config-matchers.js +143 -8
- package/dist/config/config-matchers.js.map +1 -1
- package/dist/config/next-config.d.ts +20 -2
- package/dist/config/next-config.js +11 -1
- package/dist/config/next-config.js.map +1 -1
- package/dist/deploy.js +101 -39
- package/dist/deploy.js.map +1 -1
- package/dist/entries/app-browser-entry.js +9 -3
- package/dist/entries/app-browser-entry.js.map +1 -1
- package/dist/entries/app-rsc-entry.js +53 -13
- package/dist/entries/app-rsc-entry.js.map +1 -1
- package/dist/entries/app-rsc-manifest.d.ts +1 -0
- package/dist/entries/app-rsc-manifest.js +53 -6
- package/dist/entries/app-rsc-manifest.js.map +1 -1
- package/dist/entries/app-ssr-entry.d.ts +3 -3
- package/dist/entries/app-ssr-entry.js +4 -4
- package/dist/entries/app-ssr-entry.js.map +1 -1
- package/dist/entries/pages-client-entry.js +18 -2
- package/dist/entries/pages-client-entry.js.map +1 -1
- package/dist/entries/pages-server-entry.js +58 -8
- package/dist/entries/pages-server-entry.js.map +1 -1
- package/dist/entries/runtime-entry-module.d.ts +2 -1
- package/dist/entries/runtime-entry-module.js +9 -3
- package/dist/entries/runtime-entry-module.js.map +1 -1
- package/dist/index.js +132 -40
- package/dist/index.js.map +1 -1
- package/dist/plugins/css-data-url.d.ts +7 -0
- package/dist/plugins/css-data-url.js +81 -0
- package/dist/plugins/css-data-url.js.map +1 -0
- package/dist/plugins/fonts.js +5 -3
- package/dist/plugins/fonts.js.map +1 -1
- package/dist/plugins/middleware-server-only.d.ts +54 -0
- package/dist/plugins/middleware-server-only.js +91 -0
- package/dist/plugins/middleware-server-only.js.map +1 -0
- package/dist/plugins/optimize-imports.js +4 -4
- package/dist/plugins/optimize-imports.js.map +1 -1
- package/dist/plugins/strip-server-exports.js +5 -8
- package/dist/plugins/strip-server-exports.js.map +1 -1
- package/dist/routing/app-route-graph.d.ts +20 -1
- package/dist/routing/app-route-graph.js +58 -6
- package/dist/routing/app-route-graph.js.map +1 -1
- package/dist/routing/app-router.d.ts +2 -2
- package/dist/routing/app-router.js +2 -2
- package/dist/routing/app-router.js.map +1 -1
- package/dist/routing/utils.d.ts +2 -1
- package/dist/routing/utils.js +4 -1
- package/dist/routing/utils.js.map +1 -1
- package/dist/server/api-handler.js +139 -37
- package/dist/server/api-handler.js.map +1 -1
- package/dist/server/app-browser-entry.js +293 -149
- package/dist/server/app-browser-entry.js.map +1 -1
- package/dist/server/app-browser-interception-context.d.ts +24 -0
- package/dist/server/app-browser-interception-context.js +32 -0
- package/dist/server/app-browser-interception-context.js.map +1 -0
- package/dist/server/app-browser-navigation-controller.d.ts +3 -1
- package/dist/server/app-browser-navigation-controller.js +5 -1
- package/dist/server/app-browser-navigation-controller.js.map +1 -1
- package/dist/server/app-browser-rsc-redirect.d.ts +2 -1
- package/dist/server/app-browser-rsc-redirect.js +2 -2
- package/dist/server/app-browser-rsc-redirect.js.map +1 -1
- package/dist/server/app-browser-state.d.ts +18 -1
- package/dist/server/app-browser-state.js +19 -1
- package/dist/server/app-browser-state.js.map +1 -1
- package/dist/server/app-browser-stream.d.ts +5 -14
- package/dist/server/app-browser-stream.js +13 -7
- package/dist/server/app-browser-stream.js.map +1 -1
- package/dist/server/app-browser-visible-commit.d.ts +2 -1
- package/dist/server/app-browser-visible-commit.js +1 -0
- package/dist/server/app-browser-visible-commit.js.map +1 -1
- package/dist/server/app-elements-wire.d.ts +10 -5
- package/dist/server/app-elements-wire.js +84 -2
- package/dist/server/app-elements-wire.js.map +1 -1
- package/dist/server/app-elements.d.ts +3 -2
- package/dist/server/app-elements.js +3 -2
- package/dist/server/app-elements.js.map +1 -1
- package/dist/server/app-fallback-renderer.js +5 -3
- package/dist/server/app-fallback-renderer.js.map +1 -1
- package/dist/server/app-middleware.d.ts +13 -0
- package/dist/server/app-middleware.js +3 -1
- package/dist/server/app-middleware.js.map +1 -1
- package/dist/server/app-optimistic-routing.d.ts +54 -0
- package/dist/server/app-optimistic-routing.js +200 -0
- package/dist/server/app-optimistic-routing.js.map +1 -0
- package/dist/server/app-page-cache.d.ts +13 -1
- package/dist/server/app-page-cache.js +61 -6
- package/dist/server/app-page-cache.js.map +1 -1
- package/dist/server/app-page-dispatch.d.ts +2 -0
- package/dist/server/app-page-dispatch.js +28 -1
- package/dist/server/app-page-dispatch.js.map +1 -1
- package/dist/server/app-page-element-builder.js +2 -1
- package/dist/server/app-page-element-builder.js.map +1 -1
- package/dist/server/app-page-execution.d.ts +28 -1
- package/dist/server/app-page-execution.js +89 -4
- package/dist/server/app-page-execution.js.map +1 -1
- package/dist/server/app-page-head.js +21 -2
- package/dist/server/app-page-head.js.map +1 -1
- package/dist/server/app-page-probe.js +1 -1
- package/dist/server/app-page-render.d.ts +2 -0
- package/dist/server/app-page-render.js +2 -1
- package/dist/server/app-page-render.js.map +1 -1
- package/dist/server/app-page-response.js +4 -3
- package/dist/server/app-page-response.js.map +1 -1
- package/dist/server/app-page-route-wiring.js +17 -10
- package/dist/server/app-page-route-wiring.js.map +1 -1
- package/dist/server/app-page-stream.d.ts +3 -0
- package/dist/server/app-page-stream.js +1 -0
- package/dist/server/app-page-stream.js.map +1 -1
- package/dist/server/app-prerender-static-params.d.ts +2 -1
- package/dist/server/app-prerender-static-params.js +44 -8
- package/dist/server/app-prerender-static-params.js.map +1 -1
- package/dist/server/app-route-handler-cache.d.ts +2 -2
- package/dist/server/app-route-handler-cache.js +3 -2
- package/dist/server/app-route-handler-cache.js.map +1 -1
- package/dist/server/app-route-handler-dispatch.d.ts +6 -1
- package/dist/server/app-route-handler-dispatch.js +1 -1
- package/dist/server/app-route-handler-dispatch.js.map +1 -1
- package/dist/server/app-route-handler-execution.d.ts +17 -2
- package/dist/server/app-route-handler-execution.js.map +1 -1
- package/dist/server/app-route-handler-response.js +5 -4
- package/dist/server/app-route-handler-response.js.map +1 -1
- package/dist/server/app-router-entry.js +6 -2
- package/dist/server/app-router-entry.js.map +1 -1
- package/dist/server/app-rsc-handler.d.ts +9 -1
- package/dist/server/app-rsc-handler.js +32 -14
- package/dist/server/app-rsc-handler.js.map +1 -1
- package/dist/server/app-rsc-render-mode.d.ts +4 -3
- package/dist/server/app-rsc-render-mode.js +7 -1
- package/dist/server/app-rsc-render-mode.js.map +1 -1
- package/dist/server/app-rsc-request-normalization.d.ts +4 -1
- package/dist/server/app-rsc-request-normalization.js +4 -1
- package/dist/server/app-rsc-request-normalization.js.map +1 -1
- package/dist/server/app-rsc-response-finalizer.d.ts +8 -1
- package/dist/server/app-rsc-response-finalizer.js +10 -3
- package/dist/server/app-rsc-response-finalizer.js.map +1 -1
- package/dist/server/app-rsc-route-matching.js +2 -2
- package/dist/server/app-rsc-route-matching.js.map +1 -1
- package/dist/server/app-server-action-execution.js +1 -1
- package/dist/server/app-ssr-entry.d.ts +2 -0
- package/dist/server/app-ssr-entry.js +56 -55
- package/dist/server/app-ssr-entry.js.map +1 -1
- package/dist/server/app-ssr-stream.d.ts +6 -1
- package/dist/server/app-ssr-stream.js +17 -3
- package/dist/server/app-ssr-stream.js.map +1 -1
- package/dist/server/artifact-compatibility.d.ts +1 -1
- package/dist/server/artifact-compatibility.js.map +1 -1
- package/dist/server/cache-headers.d.ts +7 -0
- package/dist/server/cache-headers.js +19 -0
- package/dist/server/cache-headers.js.map +1 -0
- package/dist/server/cache-proof.d.ts +49 -3
- package/dist/server/cache-proof.js +78 -22
- package/dist/server/cache-proof.js.map +1 -1
- package/dist/server/client-reuse-manifest.d.ts +99 -0
- package/dist/server/client-reuse-manifest.js +212 -0
- package/dist/server/client-reuse-manifest.js.map +1 -0
- package/dist/server/default-global-error-module.d.ts +20 -0
- package/dist/server/default-global-error-module.js +20 -0
- package/dist/server/default-global-error-module.js.map +1 -0
- package/dist/server/dev-server.d.ts +9 -1
- package/dist/server/dev-server.js +76 -29
- package/dist/server/dev-server.js.map +1 -1
- package/dist/server/edge-api-runtime.d.ts +5 -0
- package/dist/server/edge-api-runtime.js +8 -0
- package/dist/server/edge-api-runtime.js.map +1 -0
- package/dist/server/headers.d.ts +18 -1
- package/dist/server/headers.js +18 -1
- package/dist/server/headers.js.map +1 -1
- package/dist/server/http-error-responses.d.ts +16 -1
- package/dist/server/http-error-responses.js +21 -1
- package/dist/server/http-error-responses.js.map +1 -1
- package/dist/server/isr-cache.d.ts +6 -2
- package/dist/server/isr-cache.js +20 -4
- package/dist/server/isr-cache.js.map +1 -1
- package/dist/server/middleware-runtime.d.ts +15 -0
- package/dist/server/middleware-runtime.js +59 -7
- package/dist/server/middleware-runtime.js.map +1 -1
- package/dist/server/middleware.d.ts +1 -1
- package/dist/server/middleware.js +4 -2
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/navigation-planner.d.ts +9 -3
- package/dist/server/navigation-planner.js +98 -25
- package/dist/server/navigation-planner.js.map +1 -1
- package/dist/server/navigation-trace.d.ts +2 -1
- package/dist/server/navigation-trace.js +1 -0
- package/dist/server/navigation-trace.js.map +1 -1
- package/dist/server/pages-api-route.d.ts +27 -1
- package/dist/server/pages-api-route.js +24 -3
- package/dist/server/pages-api-route.js.map +1 -1
- package/dist/server/pages-data-route.d.ts +77 -0
- package/dist/server/pages-data-route.js +97 -0
- package/dist/server/pages-data-route.js.map +1 -0
- package/dist/server/pages-i18n.d.ts +51 -1
- package/dist/server/pages-i18n.js +61 -1
- package/dist/server/pages-i18n.js.map +1 -1
- package/dist/server/pages-page-data.d.ts +29 -2
- package/dist/server/pages-page-data.js +31 -17
- package/dist/server/pages-page-data.js.map +1 -1
- package/dist/server/pages-page-response.d.ts +11 -1
- package/dist/server/pages-page-response.js +5 -3
- package/dist/server/pages-page-response.js.map +1 -1
- package/dist/server/prod-server.d.ts +13 -15
- package/dist/server/prod-server.js +109 -56
- package/dist/server/prod-server.js.map +1 -1
- package/dist/server/request-pipeline.d.ts +11 -2
- package/dist/server/request-pipeline.js +28 -11
- package/dist/server/request-pipeline.js.map +1 -1
- package/dist/server/seed-cache.d.ts +12 -31
- package/dist/server/seed-cache.js +22 -35
- package/dist/server/seed-cache.js.map +1 -1
- package/dist/server/server-action-not-found.js +8 -3
- package/dist/server/server-action-not-found.js.map +1 -1
- package/dist/server/skip-cache-proof.d.ts +41 -0
- package/dist/server/skip-cache-proof.js +101 -0
- package/dist/server/skip-cache-proof.js.map +1 -0
- package/dist/server/static-file-cache.d.ts +1 -1
- package/dist/server/static-file-cache.js +7 -6
- package/dist/server/static-file-cache.js.map +1 -1
- package/dist/shims/client-locale.d.ts +15 -0
- package/dist/shims/client-locale.js +13 -0
- package/dist/shims/client-locale.js.map +1 -0
- package/dist/shims/default-global-error.d.ts +32 -0
- package/dist/shims/default-global-error.js +181 -0
- package/dist/shims/default-global-error.js.map +1 -0
- package/dist/shims/document.d.ts +59 -3
- package/dist/shims/document.js +36 -5
- package/dist/shims/document.js.map +1 -1
- package/dist/shims/error-boundary.d.ts +2 -2
- package/dist/shims/form.js +13 -6
- package/dist/shims/form.js.map +1 -1
- package/dist/shims/link.d.ts +21 -3
- package/dist/shims/link.js +131 -22
- package/dist/shims/link.js.map +1 -1
- package/dist/shims/metadata.js +4 -4
- package/dist/shims/metadata.js.map +1 -1
- package/dist/shims/navigation.d.ts +8 -2
- package/dist/shims/navigation.js +36 -15
- package/dist/shims/navigation.js.map +1 -1
- package/dist/shims/og.d.ts +18 -2
- package/dist/shims/og.js +49 -1
- package/dist/shims/og.js.map +1 -0
- package/dist/shims/request-state-types.d.ts +1 -1
- package/dist/shims/root-params.d.ts +3 -1
- package/dist/shims/root-params.js +11 -3
- package/dist/shims/root-params.js.map +1 -1
- package/dist/shims/router-state.d.ts +1 -0
- package/dist/shims/router-state.js.map +1 -1
- package/dist/shims/router.d.ts +12 -5
- package/dist/shims/router.js +172 -22
- package/dist/shims/router.js.map +1 -1
- package/dist/shims/server.d.ts +21 -4
- package/dist/shims/server.js +29 -9
- package/dist/shims/server.js.map +1 -1
- package/dist/shims/slot.js +5 -1
- package/dist/shims/slot.js.map +1 -1
- package/dist/shims/unified-request-context.d.ts +1 -1
- package/dist/shims/url-safety.d.ts +23 -1
- package/dist/shims/url-safety.js +29 -2
- package/dist/shims/url-safety.js.map +1 -1
- package/dist/typegen.d.ts +10 -0
- package/dist/typegen.js +242 -0
- package/dist/typegen.js.map +1 -0
- package/dist/utils/asset-prefix.d.ts +33 -5
- package/dist/utils/asset-prefix.js +39 -6
- package/dist/utils/asset-prefix.js.map +1 -1
- package/dist/utils/cache-control-metadata.d.ts +2 -1
- package/dist/utils/cache-control-metadata.js +1 -3
- package/dist/utils/cache-control-metadata.js.map +1 -1
- package/dist/utils/domain-locale.d.ts +2 -1
- package/dist/utils/domain-locale.js +9 -1
- package/dist/utils/domain-locale.js.map +1 -1
- package/dist/utils/lazy-chunks.d.ts +1 -1
- package/dist/utils/lazy-chunks.js +1 -1
- package/dist/utils/lazy-chunks.js.map +1 -1
- package/dist/utils/prerender-output-paths.d.ts +15 -0
- package/dist/utils/prerender-output-paths.js +24 -0
- package/dist/utils/prerender-output-paths.js.map +1 -0
- package/dist/utils/query.d.ts +17 -1
- package/dist/utils/query.js +36 -1
- package/dist/utils/query.js.map +1 -1
- package/dist/utils/record.d.ts +5 -0
- package/dist/utils/record.js +8 -0
- package/dist/utils/record.js.map +1 -0
- package/package.json +11 -3
|
@@ -1,21 +1,24 @@
|
|
|
1
1
|
import { normalizePathnameForRouteMatchStrict } from "../routing/utils.js";
|
|
2
|
-
import { hasBasePath,
|
|
2
|
+
import { hasBasePath, stripBasePath } from "../utils/base-path.js";
|
|
3
3
|
import { VINEXT_PRERENDER_SECRET_HEADER, VINEXT_STATIC_FILE_HEADER } from "./headers.js";
|
|
4
4
|
import { normalizePath } from "./normalize-path.js";
|
|
5
5
|
import { applyMiddlewareRequestHeaders, isExternalUrl, matchRedirect, matchRewrite, proxyExternalRequest, requestContextFromRequest, sanitizeDestination } from "../config/config-matchers.js";
|
|
6
6
|
import { notFoundResponse } from "./http-error-responses.js";
|
|
7
|
-
import { applyConfigHeadersToHeaderRecord, filterInternalHeaders, isOpenRedirectShaped } from "./request-pipeline.js";
|
|
7
|
+
import { applyConfigHeadersToHeaderRecord, filterInternalHeaders, isOpenRedirectShaped, normalizeTrailingSlash } from "./request-pipeline.js";
|
|
8
|
+
import { mergeRewriteQuery } from "../utils/query.js";
|
|
9
|
+
import { normalizeDefaultLocalePathname, stripI18nLocaleForApiRoute } from "./pages-i18n.js";
|
|
8
10
|
import { installSocketErrorBackstop } from "./socket-error-backstop.js";
|
|
11
|
+
import { ASSET_PREFIX_URL_DIR, assetPrefixPathname, isAbsoluteAssetPrefix } from "../utils/asset-prefix.js";
|
|
9
12
|
import { CONTENT_TYPES, StaticFileCache, etagFromFilenameHash } from "./static-file-cache.js";
|
|
13
|
+
import { buildNextDataNotFoundResponse, isNextDataPathname, parseNextDataPathname } from "./pages-data-route.js";
|
|
10
14
|
import { manifestFileWithBase } from "../utils/manifest-paths.js";
|
|
11
|
-
import { ASSET_PREFIX_URL_DIR, assetPrefixPathname, isAbsoluteAssetPrefix } from "../utils/asset-prefix.js";
|
|
12
15
|
import { DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES, isSafeImageContentType, parseImageParams } from "./image-optimization.js";
|
|
13
16
|
import { computeLazyChunks } from "../utils/lazy-chunks.js";
|
|
14
17
|
import { readPrerenderSecret } from "../build/server-manifest.js";
|
|
15
18
|
import { seedMemoryCacheFromPrerender } from "./seed-cache.js";
|
|
16
19
|
import fs from "node:fs";
|
|
17
20
|
import path from "node:path";
|
|
18
|
-
import
|
|
21
|
+
import fs$1 from "node:fs/promises";
|
|
19
22
|
import { pathToFileURL } from "node:url";
|
|
20
23
|
import zlib from "node:zlib";
|
|
21
24
|
import { createServer } from "node:http";
|
|
@@ -325,7 +328,7 @@ async function tryServeStatic(req, res, clientDir, pathname, compress, cache, ex
|
|
|
325
328
|
if (!resolved) return false;
|
|
326
329
|
const ext = path.extname(resolved.path);
|
|
327
330
|
const ct = CONTENT_TYPES[ext] ?? "application/octet-stream";
|
|
328
|
-
const isHashed = pathname.
|
|
331
|
+
const isHashed = pathname.includes(`/${ASSET_PREFIX_URL_DIR}/`);
|
|
329
332
|
const cacheControl = isHashed ? "public, max-age=31536000, immutable" : "public, max-age=3600";
|
|
330
333
|
const etag = isHashed && etagFromFilenameHash(resolved.path, ext) || `W/"${resolved.size}-${Math.floor(resolved.mtimeMs / 1e3)}"`;
|
|
331
334
|
const baseType = ct.split(";")[0].trim();
|
|
@@ -415,7 +418,7 @@ async function resolveStaticFile(staticFile) {
|
|
|
415
418
|
}
|
|
416
419
|
async function statIfFile(filePath) {
|
|
417
420
|
try {
|
|
418
|
-
const stat = await
|
|
421
|
+
const stat = await fs$1.stat(filePath);
|
|
419
422
|
return stat.isFile() ? {
|
|
420
423
|
size: stat.size,
|
|
421
424
|
mtimeMs: stat.mtimeMs
|
|
@@ -584,6 +587,22 @@ function resolveAppRouterHandler(entry) {
|
|
|
584
587
|
console.error("[vinext] App Router entry must export either a default handler function or a Worker-style default export with fetch()");
|
|
585
588
|
process.exit(1);
|
|
586
589
|
}
|
|
590
|
+
function isAppRouterPrerenderSeederExport(value) {
|
|
591
|
+
return typeof value === "function";
|
|
592
|
+
}
|
|
593
|
+
function resolveAppRouterPrerenderSeeder(entryModule) {
|
|
594
|
+
if (typeof entryModule !== "object" || entryModule === null) return seedMemoryCacheFromPrerender;
|
|
595
|
+
const seedExport = Object.getOwnPropertyDescriptor(entryModule, "seedMemoryCacheFromPrerender")?.value;
|
|
596
|
+
if (!isAppRouterPrerenderSeederExport(seedExport)) {
|
|
597
|
+
if (process.env.NEXT_PRIVATE_DEBUG_CACHE) console.debug("[vinext] ISR: using fallback prerender cache seeder");
|
|
598
|
+
return seedMemoryCacheFromPrerender;
|
|
599
|
+
}
|
|
600
|
+
if (process.env.NEXT_PRIVATE_DEBUG_CACHE) console.debug("[vinext] ISR: using App Router entry prerender cache seeder");
|
|
601
|
+
return async (serverDir) => {
|
|
602
|
+
const result = await Promise.resolve(seedExport(serverDir));
|
|
603
|
+
return typeof result === "number" ? result : 0;
|
|
604
|
+
};
|
|
605
|
+
}
|
|
587
606
|
/**
|
|
588
607
|
* Resolve a request pathname to a static-asset lookup path inside `clientDir`.
|
|
589
608
|
*
|
|
@@ -592,27 +611,21 @@ function resolveAppRouterHandler(entry) {
|
|
|
592
611
|
*
|
|
593
612
|
* Three URL shapes are recognised:
|
|
594
613
|
*
|
|
595
|
-
* - `/
|
|
596
|
-
*
|
|
614
|
+
* - `/_next/static/...` — the default layout. Files land on disk at
|
|
615
|
+
* `dist/client/_next/static/...`, so the pathname maps 1:1. Also covers
|
|
616
|
+
* absolute-URL `assetPrefix` with no path component (same on-disk and
|
|
617
|
+
* URL shape).
|
|
597
618
|
* - `<assetPathPrefix>/_next/static/...` — when `assetPrefix` is a path
|
|
598
619
|
* prefix (e.g. `/custom-asset-prefix`). The on-disk layout is
|
|
599
620
|
* `dist/client/<prefix>/_next/static/...`, so the pathname maps 1:1.
|
|
600
|
-
* -
|
|
601
|
-
*
|
|
602
|
-
*
|
|
603
|
-
*
|
|
604
|
-
*
|
|
605
|
-
*
|
|
606
|
-
* (e.g. `https://cdn.example.com/sub`), files are written to
|
|
607
|
-
* `dist/client/_next/static/...` but emitted URLs prepend the full URL
|
|
608
|
-
* (`https://cdn.example.com/sub/_next/static/...`). Requests for those
|
|
609
|
-
* URLs do not normally arrive at this server — they go to the CDN. We
|
|
610
|
-
* still accept `<pathname>/_next/static/...` so a same-origin reverse
|
|
611
|
-
* proxy can route through.
|
|
621
|
+
* - `<absoluteURLPathname>/_next/static/...` — when `assetPrefix` is an
|
|
622
|
+
* absolute URL with a non-empty pathname (e.g. `https://cdn/sub`).
|
|
623
|
+
* Files are written to `dist/client/_next/static/...` but emitted URLs
|
|
624
|
+
* prepend the full URL. Requests do not normally arrive here — they go
|
|
625
|
+
* to the CDN — but we accept them so a same-origin reverse proxy can
|
|
626
|
+
* route through; the on-disk path is just `_next/static/...`.
|
|
612
627
|
*/
|
|
613
628
|
function resolveAppRouterAssetPath(pathname, assetPathPrefix, assetPrefix) {
|
|
614
|
-
if (pathname.startsWith("/assets/")) return pathname;
|
|
615
|
-
if (!assetPrefix) return null;
|
|
616
629
|
const nextStaticDir = `/${ASSET_PREFIX_URL_DIR}/`;
|
|
617
630
|
if (assetPathPrefix) {
|
|
618
631
|
if (pathname === assetPathPrefix || pathname.startsWith(assetPathPrefix + "/")) {
|
|
@@ -657,7 +670,7 @@ async function startAppRouterServer(options) {
|
|
|
657
670
|
const rscHandler = resolveAppRouterHandler(rscModule.default);
|
|
658
671
|
const appRouterAssetPrefix = typeof rscModule.__assetPrefix === "string" ? rscModule.__assetPrefix : "";
|
|
659
672
|
const appAssetPathPrefix = assetPrefixPathname(appRouterAssetPrefix);
|
|
660
|
-
const seededRoutes = await
|
|
673
|
+
const seededRoutes = await resolveAppRouterPrerenderSeeder(rscModule)(path.dirname(rscEntryPath));
|
|
661
674
|
if (seededRoutes > 0) console.log(`[vinext] Seeded ${seededRoutes} pre-rendered route${seededRoutes !== 1 ? "s" : ""} into memory cache`);
|
|
662
675
|
const staticCache = await StaticFileCache.create(clientDir);
|
|
663
676
|
const handleRequest = async (req, res) => {
|
|
@@ -687,7 +700,12 @@ async function startAppRouterServer(options) {
|
|
|
687
700
|
}
|
|
688
701
|
{
|
|
689
702
|
const assetLookupPath = resolveAppRouterAssetPath(pathname, appAssetPathPrefix, appRouterAssetPrefix);
|
|
690
|
-
if (assetLookupPath
|
|
703
|
+
if (assetLookupPath) {
|
|
704
|
+
if (await tryServeStatic(req, res, clientDir, assetLookupPath, compress, staticCache)) return;
|
|
705
|
+
res.writeHead(404, { "Content-Type": "text/plain; charset=utf-8" });
|
|
706
|
+
res.end("Not Found");
|
|
707
|
+
return;
|
|
708
|
+
}
|
|
691
709
|
}
|
|
692
710
|
if (pathname === "/_vinext/image") {
|
|
693
711
|
const params = parseImageParams(new URL(rawUrl, "http://localhost"), [...DEFAULT_DEVICE_SIZES, ...DEFAULT_IMAGE_SIZES]);
|
|
@@ -775,7 +793,7 @@ function readPagesServerEntryPageRoutes(value) {
|
|
|
775
793
|
*
|
|
776
794
|
* Uses the server entry (dist/server/entry.js) which exports:
|
|
777
795
|
* - renderPage(request, url, manifest, ctx?, middlewareHeaders?) — SSR rendering (Web Request → Response)
|
|
778
|
-
* - handleApiRoute(request, url) — API route handling (
|
|
796
|
+
* - handleApiRoute(request, url, ctx?) — API route handling (ctx optional; pass for ctx.waitUntil() on Workers)
|
|
779
797
|
* - runMiddleware(request, ctx?) — middleware execution (ctx optional; pass for ctx.waitUntil() on Workers)
|
|
780
798
|
* - vinextConfig — embedded next.config.js settings
|
|
781
799
|
*/
|
|
@@ -783,7 +801,7 @@ async function startPagesRouterServer(options) {
|
|
|
783
801
|
const { port, host, clientDir, serverEntryPath, compress, purpose } = options;
|
|
784
802
|
const serverMtime = fs.statSync(serverEntryPath).mtimeMs;
|
|
785
803
|
const serverEntry = await import(`${pathToFileURL(serverEntryPath).href}?t=${serverMtime}`);
|
|
786
|
-
const { renderPage, handleApiRoute: handleApi, runMiddleware, vinextConfig } = serverEntry;
|
|
804
|
+
const { renderPage, handleApiRoute: handleApi, runMiddleware, vinextConfig, buildId: pagesBuildId } = serverEntry;
|
|
787
805
|
const matchPageRoute = typeof serverEntry.matchPageRoute === "function" ? serverEntry.matchPageRoute : void 0;
|
|
788
806
|
const pageRoutes = readPagesServerEntryPageRoutes(serverEntry.pageRoutes);
|
|
789
807
|
const prerenderSecret = readPrerenderSecret(path.dirname(serverEntryPath));
|
|
@@ -792,6 +810,7 @@ async function startPagesRouterServer(options) {
|
|
|
792
810
|
const pagesAssetPathPrefix = assetPrefixPathname(assetPrefix);
|
|
793
811
|
const assetBase = basePath ? `${basePath}/` : "/";
|
|
794
812
|
const trailingSlash = vinextConfig?.trailingSlash ?? false;
|
|
813
|
+
const i18nConfig = vinextConfig?.i18n ?? null;
|
|
795
814
|
const configRedirects = vinextConfig?.redirects ?? [];
|
|
796
815
|
const configRewrites = vinextConfig?.rewrites ?? {
|
|
797
816
|
beforeFiles: [],
|
|
@@ -867,7 +886,12 @@ async function startPagesRouterServer(options) {
|
|
|
867
886
|
}
|
|
868
887
|
const staticLookupPath = stripBasePath(pathname, basePath);
|
|
869
888
|
const pagesAssetLookup = resolveAppRouterAssetPath(pathname, pagesAssetPathPrefix, assetPrefix);
|
|
870
|
-
if (pagesAssetLookup
|
|
889
|
+
if (pagesAssetLookup) {
|
|
890
|
+
if (await tryServeStatic(req, res, clientDir, pagesAssetLookup, compress, staticCache)) return;
|
|
891
|
+
res.writeHead(404, { "Content-Type": "text/plain; charset=utf-8" });
|
|
892
|
+
res.end("Not Found");
|
|
893
|
+
return;
|
|
894
|
+
}
|
|
871
895
|
if (pathname === "/_vinext/image" || staticLookupPath === "/_vinext/image") {
|
|
872
896
|
const params = parseImageParams(new URL(rawUrl, "http://localhost"), allowedImageWidths);
|
|
873
897
|
if (!params) {
|
|
@@ -891,6 +915,7 @@ async function startPagesRouterServer(options) {
|
|
|
891
915
|
return;
|
|
892
916
|
}
|
|
893
917
|
try {
|
|
918
|
+
const hadBasePath = !basePath || hasBasePath(pathname, basePath);
|
|
894
919
|
{
|
|
895
920
|
const stripped = stripBasePath(pathname, basePath);
|
|
896
921
|
if (stripped !== pathname) {
|
|
@@ -898,27 +923,41 @@ async function startPagesRouterServer(options) {
|
|
|
898
923
|
pathname = stripped;
|
|
899
924
|
}
|
|
900
925
|
}
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
926
|
+
const basePathState = {
|
|
927
|
+
basePath,
|
|
928
|
+
hadBasePath
|
|
929
|
+
};
|
|
930
|
+
{
|
|
931
|
+
const qs = url.includes("?") ? url.slice(url.indexOf("?")) : "";
|
|
932
|
+
const trailingSlashRedirect = normalizeTrailingSlash(pathname, basePath, trailingSlash, qs);
|
|
933
|
+
if (trailingSlashRedirect) {
|
|
934
|
+
const location = trailingSlashRedirect.headers.get("Location");
|
|
935
|
+
res.writeHead(trailingSlashRedirect.status, location ? { Location: location } : void 0);
|
|
906
936
|
res.end();
|
|
907
937
|
return;
|
|
908
|
-
}
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
938
|
+
}
|
|
939
|
+
}
|
|
940
|
+
let isDataReq = false;
|
|
941
|
+
if (isNextDataPathname(pathname)) {
|
|
942
|
+
const dataMatch = pagesBuildId ? parseNextDataPathname(pathname, pagesBuildId) : null;
|
|
943
|
+
if (!dataMatch) {
|
|
944
|
+
await sendWebResponse(buildNextDataNotFoundResponse(), req, res, compress);
|
|
912
945
|
return;
|
|
913
946
|
}
|
|
947
|
+
isDataReq = true;
|
|
948
|
+
const qs = url.includes("?") ? url.slice(url.indexOf("?")) : "";
|
|
949
|
+
url = dataMatch.pagePathname + qs;
|
|
950
|
+
pathname = dataMatch.pagePathname;
|
|
914
951
|
}
|
|
915
952
|
const rawProtocol = trustProxy ? req.headers["x-forwarded-proto"]?.split(",")[0]?.trim() : void 0;
|
|
916
953
|
const protocol = rawProtocol === "https" || rawProtocol === "http" ? rawProtocol : "http";
|
|
917
954
|
const hostHeader = resolveHost(req, `${host}:${port}`);
|
|
918
|
-
const
|
|
955
|
+
const rawReqHeaders = Object.entries(req.headers).reduce((h, [k, v]) => {
|
|
919
956
|
if (v) h.set(k, Array.isArray(v) ? v.join(", ") : v);
|
|
920
957
|
return h;
|
|
921
|
-
}, new Headers())
|
|
958
|
+
}, new Headers());
|
|
959
|
+
const isDataRequest = rawReqHeaders.get("x-nextjs-data") === "1";
|
|
960
|
+
const reqHeaders = filterInternalHeaders(rawReqHeaders);
|
|
922
961
|
const method = req.method ?? "GET";
|
|
923
962
|
const hasBody = method !== "GET" && method !== "HEAD";
|
|
924
963
|
let webRequest = new Request(`${protocol}://${hostHeader}${url}`, {
|
|
@@ -928,10 +967,12 @@ async function startPagesRouterServer(options) {
|
|
|
928
967
|
duplex: hasBody ? "half" : void 0
|
|
929
968
|
});
|
|
930
969
|
const reqCtx = requestContextFromRequest(webRequest);
|
|
970
|
+
const requestHostname = i18nConfig ? new URL(webRequest.url).hostname : "";
|
|
971
|
+
const matchPathname = i18nConfig ? normalizeDefaultLocalePathname(pathname, i18nConfig, { hostname: requestHostname }) : pathname;
|
|
931
972
|
if (configRedirects.length) {
|
|
932
|
-
const redirect = matchRedirect(
|
|
973
|
+
const redirect = matchRedirect(matchPathname, configRedirects, reqCtx, basePathState);
|
|
933
974
|
if (redirect) {
|
|
934
|
-
const dest = sanitizeDestination(basePath && !isExternalUrl(redirect.destination) && !hasBasePath(redirect.destination, basePath) ? basePath + redirect.destination : redirect.destination);
|
|
975
|
+
const dest = sanitizeDestination(basePath && hadBasePath && !isExternalUrl(redirect.destination) && !hasBasePath(redirect.destination, basePath) ? basePath + redirect.destination : redirect.destination);
|
|
935
976
|
res.writeHead(redirect.permanent ? 308 : 307, { Location: dest });
|
|
936
977
|
res.end();
|
|
937
978
|
return;
|
|
@@ -941,7 +982,7 @@ async function startPagesRouterServer(options) {
|
|
|
941
982
|
const middlewareHeaders = {};
|
|
942
983
|
let middlewareStatus;
|
|
943
984
|
if (typeof runMiddleware === "function") {
|
|
944
|
-
const result = await runMiddleware(webRequest, void 0);
|
|
985
|
+
const result = await runMiddleware(webRequest, void 0, { isDataRequest });
|
|
945
986
|
if (result.waitUntilPromises && result.waitUntilPromises.length > 0) Promise.allSettled(result.waitUntilPromises);
|
|
946
987
|
if (!result.continue) {
|
|
947
988
|
if (result.redirectUrl) {
|
|
@@ -983,30 +1024,41 @@ async function startPagesRouterServer(options) {
|
|
|
983
1024
|
const { postMwReqCtx, request: postMwReq } = applyMiddlewareRequestHeaders(middlewareHeaders, webRequest, { preserveCredentialHeaders: isExternalUrl(resolvedUrl) });
|
|
984
1025
|
webRequest = postMwReq;
|
|
985
1026
|
let resolvedPathname = resolvedUrl.split("?")[0];
|
|
1027
|
+
const matchResolvedPathname = (p) => i18nConfig ? normalizeDefaultLocalePathname(p, i18nConfig, { hostname: requestHostname }) : p;
|
|
986
1028
|
if (configHeaders.length) applyConfigHeadersToHeaderRecord(middlewareHeaders, {
|
|
987
1029
|
configHeaders,
|
|
988
|
-
pathname,
|
|
989
|
-
requestContext: reqCtx
|
|
1030
|
+
pathname: matchPathname,
|
|
1031
|
+
requestContext: reqCtx,
|
|
1032
|
+
basePathState
|
|
990
1033
|
});
|
|
991
1034
|
if (isExternalUrl(resolvedUrl)) {
|
|
992
1035
|
await sendWebResponse(mergeWebResponse(middlewareHeaders, await proxyExternalRequest(webRequest, resolvedUrl), void 0), req, res, compress);
|
|
993
1036
|
return;
|
|
994
1037
|
}
|
|
995
|
-
if (staticLookupPath !== "/" && !staticLookupPath.startsWith("/api/") && !staticLookupPath.startsWith(
|
|
1038
|
+
if (staticLookupPath !== "/" && !staticLookupPath.startsWith("/api/") && !staticLookupPath.startsWith(`/_next/static/`) && await tryServeStatic(req, res, clientDir, staticLookupPath, compress, staticCache, middlewareHeaders)) return;
|
|
1039
|
+
let configRewriteFired = false;
|
|
996
1040
|
if (configRewrites.beforeFiles?.length) {
|
|
997
|
-
const rewritten = matchRewrite(resolvedPathname, configRewrites.beforeFiles, postMwReqCtx);
|
|
1041
|
+
const rewritten = matchRewrite(matchResolvedPathname(resolvedPathname), configRewrites.beforeFiles, postMwReqCtx, basePathState);
|
|
998
1042
|
if (rewritten) {
|
|
999
1043
|
if (isExternalUrl(rewritten)) {
|
|
1000
1044
|
await sendWebResponse(await proxyExternalRequest(webRequest, rewritten), req, res, compress);
|
|
1001
1045
|
return;
|
|
1002
1046
|
}
|
|
1003
|
-
resolvedUrl = rewritten;
|
|
1004
|
-
resolvedPathname =
|
|
1047
|
+
resolvedUrl = mergeRewriteQuery(resolvedUrl, rewritten);
|
|
1048
|
+
resolvedPathname = resolvedUrl.split("?")[0];
|
|
1049
|
+
configRewriteFired = true;
|
|
1005
1050
|
}
|
|
1006
1051
|
}
|
|
1007
|
-
if (
|
|
1052
|
+
if (basePath && !hadBasePath && !configRewriteFired) {
|
|
1053
|
+
res.writeHead(404, { "Content-Type": "text/html; charset=utf-8" });
|
|
1054
|
+
res.end("This page could not be found");
|
|
1055
|
+
return;
|
|
1056
|
+
}
|
|
1057
|
+
const apiLookupUrl = stripI18nLocaleForApiRoute(resolvedUrl, vinextConfig?.i18n ?? null);
|
|
1058
|
+
const apiLookupPathname = apiLookupUrl.split("?")[0];
|
|
1059
|
+
if (apiLookupPathname.startsWith("/api/") || apiLookupPathname === "/api") {
|
|
1008
1060
|
let response;
|
|
1009
|
-
if (typeof handleApi === "function") response = await handleApi(webRequest,
|
|
1061
|
+
if (typeof handleApi === "function") response = await handleApi(webRequest, apiLookupUrl, createNodeExecutionContext());
|
|
1010
1062
|
else response = new Response("404 - API route not found", { status: 404 });
|
|
1011
1063
|
const mergedResponse = mergeWebResponse(middlewareHeaders, response, middlewareStatus);
|
|
1012
1064
|
if (!mergedResponse.body) {
|
|
@@ -1022,28 +1074,29 @@ async function startPagesRouterServer(options) {
|
|
|
1022
1074
|
}
|
|
1023
1075
|
const pageMatch = matchPageRoute ? matchPageRoute(resolvedPathname, webRequest) : null;
|
|
1024
1076
|
if ((!pageMatch || pageMatch.route.isDynamic) && configRewrites.afterFiles?.length) {
|
|
1025
|
-
const rewritten = matchRewrite(resolvedPathname, configRewrites.afterFiles, postMwReqCtx);
|
|
1077
|
+
const rewritten = matchRewrite(matchResolvedPathname(resolvedPathname), configRewrites.afterFiles, postMwReqCtx, basePathState);
|
|
1026
1078
|
if (rewritten) {
|
|
1027
1079
|
if (isExternalUrl(rewritten)) {
|
|
1028
1080
|
await sendWebResponse(await proxyExternalRequest(webRequest, rewritten), req, res, compress);
|
|
1029
1081
|
return;
|
|
1030
1082
|
}
|
|
1031
|
-
resolvedUrl = rewritten;
|
|
1032
|
-
resolvedPathname =
|
|
1083
|
+
resolvedUrl = mergeRewriteQuery(resolvedUrl, rewritten);
|
|
1084
|
+
resolvedPathname = resolvedUrl.split("?")[0];
|
|
1033
1085
|
}
|
|
1034
1086
|
}
|
|
1035
1087
|
let response;
|
|
1036
1088
|
if (typeof renderPage === "function") {
|
|
1037
1089
|
const middlewareResponseHeaders = toWebHeaders(middlewareHeaders);
|
|
1038
|
-
|
|
1090
|
+
const renderOptions = isDataReq ? { isDataReq: true } : void 0;
|
|
1091
|
+
response = await renderPage(webRequest, resolvedUrl, ssrManifest, void 0, middlewareResponseHeaders, renderOptions);
|
|
1039
1092
|
if (response && response.status === 404 && configRewrites.fallback?.length) {
|
|
1040
|
-
const fallbackRewrite = matchRewrite(resolvedPathname, configRewrites.fallback, postMwReqCtx);
|
|
1093
|
+
const fallbackRewrite = matchRewrite(matchResolvedPathname(resolvedPathname), configRewrites.fallback, postMwReqCtx, basePathState);
|
|
1041
1094
|
if (fallbackRewrite) {
|
|
1042
1095
|
if (isExternalUrl(fallbackRewrite)) {
|
|
1043
1096
|
await sendWebResponse(await proxyExternalRequest(webRequest, fallbackRewrite), req, res, compress);
|
|
1044
1097
|
return;
|
|
1045
1098
|
}
|
|
1046
|
-
response = await renderPage(webRequest, fallbackRewrite, ssrManifest, void 0, middlewareResponseHeaders);
|
|
1099
|
+
response = await renderPage(webRequest, mergeRewriteQuery(resolvedUrl, fallbackRewrite), ssrManifest, void 0, middlewareResponseHeaders, renderOptions);
|
|
1047
1100
|
}
|
|
1048
1101
|
}
|
|
1049
1102
|
}
|
|
@@ -1088,6 +1141,6 @@ async function startPagesRouterServer(options) {
|
|
|
1088
1141
|
};
|
|
1089
1142
|
}
|
|
1090
1143
|
//#endregion
|
|
1091
|
-
export { COMPRESSIBLE_TYPES, COMPRESS_THRESHOLD, mergeResponseHeaders, mergeWebResponse, negotiateEncoding, nodeToWebRequest, resolveAppRouterAssetPath, resolveHost, sendCompressed, sendWebResponse, startProdServer, trustProxy, trustedHosts, tryServeStatic };
|
|
1144
|
+
export { COMPRESSIBLE_TYPES, COMPRESS_THRESHOLD, mergeResponseHeaders, mergeWebResponse, negotiateEncoding, nodeToWebRequest, resolveAppRouterAssetPath, resolveAppRouterPrerenderSeeder, resolveHost, sendCompressed, sendWebResponse, startProdServer, trustProxy, trustedHosts, tryServeStatic };
|
|
1092
1145
|
|
|
1093
1146
|
//# sourceMappingURL=prod-server.js.map
|