vinext 0.1.7 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -30
- package/dist/build/inject-pregenerated-paths.d.ts +4 -0
- package/dist/build/inject-pregenerated-paths.js +18 -0
- package/dist/build/layout-classification.js +1 -1
- package/dist/build/nitro-route-rules.js +1 -1
- package/dist/build/pages-client-assets-module.d.ts +11 -0
- package/dist/build/pages-client-assets-module.js +27 -0
- package/dist/build/prerender.d.ts +2 -1
- package/dist/build/prerender.js +13 -6
- package/dist/build/report.d.ts +13 -2
- package/dist/build/report.js +99 -2
- package/dist/build/run-prerender.d.ts +7 -0
- package/dist/build/run-prerender.js +10 -1
- package/dist/build/standalone.js +2 -0
- package/dist/cache/cache-adapters-virtual.js +3 -3
- package/dist/check.d.ts +18 -0
- package/dist/check.js +77 -19
- package/dist/cli-args.d.ts +1 -2
- package/dist/cli-args.js +1 -1
- package/dist/cli-dev-config.d.ts +12 -0
- package/dist/cli-dev-config.js +23 -0
- package/dist/cli.js +113 -97
- package/dist/{server → client}/dev-error-overlay-store.d.ts +1 -1
- package/dist/{server → client}/dev-error-overlay-store.js +1 -1
- package/dist/{server → client}/dev-error-overlay.d.ts +1 -1
- package/dist/{server → client}/dev-error-overlay.js +2 -2
- package/dist/client/navigation-runtime.d.ts +2 -0
- package/dist/client/navigation-runtime.js +3 -1
- package/dist/client/window-next.d.ts +2 -1
- package/dist/cloudflare/index.d.ts +2 -2
- package/dist/cloudflare/index.js +2 -2
- package/dist/config/config-matchers.js +14 -10
- package/dist/config/next-config.d.ts +6 -3
- package/dist/config/next-config.js +47 -1
- package/dist/config/prerender.d.ts +34 -0
- package/dist/config/prerender.js +55 -0
- package/dist/config/server-external-packages.d.ts +4 -0
- package/dist/config/server-external-packages.js +91 -0
- package/dist/entries/app-rsc-entry.d.ts +2 -1
- package/dist/entries/app-rsc-entry.js +89 -15
- package/dist/entries/app-rsc-manifest.js +10 -0
- package/dist/entries/pages-client-entry.d.ts +3 -0
- package/dist/entries/pages-client-entry.js +16 -1
- package/dist/entries/pages-server-entry.js +6 -2
- package/dist/image/image-adapters-virtual.d.ts +59 -0
- package/dist/image/image-adapters-virtual.js +59 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.js +211 -118
- package/dist/init-cloudflare.d.ts +43 -0
- package/dist/init-cloudflare.js +839 -0
- package/dist/init-platform.d.ts +40 -0
- package/dist/init-platform.js +195 -0
- package/dist/init.d.ts +16 -38
- package/dist/init.js +208 -97
- package/dist/node_modules/.pnpm/am-i-vibing@0.5.0/node_modules/am-i-vibing/dist/detector-1yx2Hoe0.js +294 -0
- package/dist/node_modules/.pnpm/process-ancestry@0.1.0/node_modules/process-ancestry/dist/index.js +94 -0
- package/dist/{cloudflare → packages/cloudflare}/src/cache/cdn-adapter.runtime.js +1 -1
- package/dist/{cloudflare → packages/cloudflare}/src/cache/kv-data-adapter.runtime.d.ts +2 -2
- package/dist/{cloudflare → packages/cloudflare}/src/cache/kv-data-adapter.runtime.js +1 -1
- package/dist/packages/cloudflare/src/deploy-config.js +150 -0
- package/dist/packages/cloudflare/src/deploy-help.js +55 -0
- package/dist/packages/cloudflare/src/deploy.js +276 -0
- package/dist/{cloudflare → packages/cloudflare/src}/tpr.d.ts +4 -41
- package/dist/{cloudflare → packages/cloudflare/src}/tpr.js +18 -15
- package/dist/plugins/ast-scope.d.ts +16 -0
- package/dist/plugins/ast-scope.js +62 -0
- package/dist/plugins/ast-utils.d.ts +27 -1
- package/dist/plugins/ast-utils.js +32 -1
- package/dist/plugins/css-module-imports.d.ts +14 -0
- package/dist/plugins/css-module-imports.js +59 -0
- package/dist/plugins/extensionless-dynamic-import.js +2 -2
- package/dist/plugins/ignore-dynamic-requests.d.ts +11 -0
- package/dist/plugins/ignore-dynamic-requests.js +530 -0
- package/dist/plugins/middleware-server-only.d.ts +8 -6
- package/dist/plugins/middleware-server-only.js +8 -7
- package/dist/plugins/optimize-imports.js +1 -1
- package/dist/plugins/typeof-window.d.ts +1 -1
- package/dist/plugins/typeof-window.js +28 -56
- package/dist/routing/app-route-graph.d.ts +29 -4
- package/dist/routing/app-route-graph.js +182 -40
- package/dist/routing/app-router.d.ts +5 -0
- package/dist/routing/app-router.js +5 -0
- package/dist/routing/file-matcher.d.ts +8 -0
- package/dist/routing/file-matcher.js +10 -1
- package/dist/routing/pages-router.js +2 -2
- package/dist/server/api-handler.js +9 -14
- package/dist/server/app-browser-action-result.d.ts +4 -1
- package/dist/server/app-browser-action-result.js +8 -1
- package/dist/server/app-browser-entry.js +194 -190
- package/dist/server/app-browser-history-controller.d.ts +2 -1
- package/dist/server/app-browser-history-controller.js +6 -2
- package/dist/server/app-browser-interception-context.d.ts +1 -0
- package/dist/server/app-browser-interception-context.js +4 -2
- package/dist/server/app-browser-navigation-controller.d.ts +2 -0
- package/dist/server/app-browser-navigation-controller.js +60 -31
- package/dist/server/app-browser-server-action-client.d.ts +32 -0
- package/dist/server/app-browser-server-action-client.js +127 -0
- package/dist/server/app-browser-state.d.ts +11 -1
- package/dist/server/app-browser-state.js +25 -8
- package/dist/server/app-browser-visible-commit.d.ts +6 -1
- package/dist/server/app-browser-visible-commit.js +43 -25
- package/dist/server/app-elements-wire.d.ts +9 -2
- package/dist/server/app-elements-wire.js +8 -1
- package/dist/server/app-elements.d.ts +2 -2
- package/dist/server/app-elements.js +4 -3
- package/dist/server/app-fallback-renderer.d.ts +5 -2
- package/dist/server/app-fallback-renderer.js +15 -7
- package/dist/server/app-hydration-cache-publication.d.ts +11 -0
- package/dist/server/app-hydration-cache-publication.js +43 -0
- package/dist/server/app-middleware.d.ts +4 -3
- package/dist/server/app-middleware.js +8 -3
- package/dist/server/app-optimistic-routing.js +11 -4
- package/dist/server/app-page-boundary-render.d.ts +3 -0
- package/dist/server/app-page-boundary-render.js +14 -3
- package/dist/server/app-page-cache-finalizer.d.ts +1 -0
- package/dist/server/app-page-cache-finalizer.js +10 -3
- package/dist/server/app-page-cache-render.d.ts +1 -0
- package/dist/server/app-page-cache-render.js +8 -4
- package/dist/server/app-page-cache.d.ts +1 -0
- package/dist/server/app-page-cache.js +5 -2
- package/dist/server/app-page-dispatch.d.ts +33 -4
- package/dist/server/app-page-dispatch.js +63 -90
- package/dist/server/app-page-element-builder.d.ts +9 -2
- package/dist/server/app-page-element-builder.js +114 -23
- package/dist/server/app-page-head.d.ts +16 -1
- package/dist/server/app-page-head.js +44 -22
- package/dist/server/app-page-params.d.ts +2 -1
- package/dist/server/app-page-params.js +8 -1
- package/dist/server/app-page-ppr-runtime.d.ts +7 -0
- package/dist/server/app-page-ppr-runtime.js +70 -0
- package/dist/server/app-page-probe.d.ts +1 -0
- package/dist/server/app-page-probe.js +6 -1
- package/dist/server/app-page-render-identity.d.ts +1 -0
- package/dist/server/app-page-render-identity.js +1 -1
- package/dist/server/app-page-render.d.ts +4 -1
- package/dist/server/app-page-render.js +26 -3
- package/dist/server/app-page-request.d.ts +22 -1
- package/dist/server/app-page-request.js +92 -15
- package/dist/server/app-page-route-wiring.d.ts +14 -2
- package/dist/server/app-page-route-wiring.js +61 -25
- package/dist/server/app-page-search-params-observation.d.ts +4 -2
- package/dist/server/app-page-search-params-observation.js +11 -7
- package/dist/server/app-page-segment-state.d.ts +2 -1
- package/dist/server/app-page-segment-state.js +3 -1
- package/dist/server/app-page-stream.d.ts +5 -0
- package/dist/server/app-page-stream.js +3 -1
- package/dist/server/app-ppr-fallback-shell-render.d.ts +4 -3
- package/dist/server/app-route-handler-dispatch.js +1 -0
- package/dist/server/app-route-handler-execution.js +7 -2
- package/dist/server/app-route-handler-response.js +1 -0
- package/dist/server/app-route-handler-runtime.js +1 -1
- package/dist/server/app-route-module-loader.d.ts +2 -0
- package/dist/server/app-route-module-loader.js +1 -0
- package/dist/server/app-router-entry.js +16 -8
- package/dist/server/app-rsc-errors.js +7 -1
- package/dist/server/app-rsc-handler.d.ts +3 -1
- package/dist/server/app-rsc-handler.js +67 -39
- package/dist/server/app-rsc-request-normalization.d.ts +3 -2
- package/dist/server/app-rsc-request-normalization.js +6 -3
- package/dist/server/app-rsc-route-matching.d.ts +7 -0
- package/dist/server/app-rsc-route-matching.js +36 -3
- package/dist/server/app-segment-config.d.ts +12 -0
- package/dist/server/app-segment-config.js +91 -5
- package/dist/server/app-server-action-execution.d.ts +5 -0
- package/dist/server/app-server-action-execution.js +94 -33
- package/dist/server/app-ssr-entry.d.ts +3 -0
- package/dist/server/app-ssr-entry.js +19 -8
- package/dist/server/app-ssr-stream.d.ts +7 -3
- package/dist/server/app-ssr-stream.js +10 -6
- package/dist/server/app-static-generation.d.ts +1 -0
- package/dist/server/app-static-generation.js +1 -0
- package/dist/server/app-visited-response-cache.d.ts +6 -0
- package/dist/server/app-visited-response-cache.js +3 -1
- package/dist/server/client-trace-metadata.js +26 -0
- package/dist/server/default-global-not-found-module.d.ts +14 -0
- package/dist/server/default-global-not-found-module.js +14 -0
- package/dist/server/dev-route-files.js +4 -0
- package/dist/server/dev-server.js +19 -18
- package/dist/server/dev-stack-sourcemap.d.ts +1 -1
- package/dist/server/dev-stack-sourcemap.js +1 -1
- package/dist/server/fetch-handler.d.ts +2 -0
- package/dist/server/fetch-handler.js +18 -0
- package/dist/server/headers.d.ts +5 -15
- package/dist/server/headers.js +4 -15
- package/dist/server/image-optimization.d.ts +51 -1
- package/dist/server/image-optimization.js +52 -2
- package/dist/server/implicit-tags.js +1 -1
- package/dist/server/isr-cache.d.ts +1 -1
- package/dist/server/isr-cache.js +2 -2
- package/dist/server/metadata-routes.d.ts +3 -1
- package/dist/server/metadata-routes.js +12 -2
- package/dist/server/middleware-runtime.js +6 -1
- package/dist/server/navigation-planner.d.ts +1 -0
- package/dist/server/navigation-planner.js +14 -3
- package/dist/server/pages-api-route.js +2 -2
- package/dist/server/pages-asset-tags.d.ts +4 -6
- package/dist/server/pages-asset-tags.js +12 -12
- package/dist/server/pages-client-assets.d.ts +12 -0
- package/dist/server/pages-client-assets.js +10 -0
- package/dist/server/pages-node-compat.d.ts +8 -1
- package/dist/server/pages-node-compat.js +32 -4
- package/dist/server/pages-page-data.d.ts +24 -1
- package/dist/server/pages-page-data.js +45 -24
- package/dist/server/pages-page-handler.d.ts +2 -1
- package/dist/server/pages-page-handler.js +19 -12
- package/dist/server/pages-page-response.d.ts +7 -0
- package/dist/server/pages-page-response.js +4 -1
- package/dist/server/pages-request-pipeline.d.ts +2 -0
- package/dist/server/pages-request-pipeline.js +25 -1
- package/dist/server/pages-router-entry.d.ts +30 -0
- package/dist/server/pages-router-entry.js +108 -0
- package/dist/server/prerender-manifest.d.ts +3 -1
- package/dist/server/prerender-route-params.js +1 -1
- package/dist/server/prod-server.d.ts +1 -1
- package/dist/server/prod-server.js +48 -26
- package/dist/server/request-pipeline.js +1 -0
- package/dist/server/seed-cache.js +4 -4
- package/dist/server/worker-utils.d.ts +2 -1
- package/dist/server/worker-utils.js +7 -1
- package/dist/shims/app-router-scroll-state.d.ts +1 -0
- package/dist/shims/app-router-scroll-state.js +1 -0
- package/dist/shims/app-router-scroll.js +2 -1
- package/dist/shims/cache.js +19 -15
- package/dist/shims/cdn-cache.js +1 -1
- package/dist/shims/dynamic-preload-chunks.js +2 -1
- package/dist/shims/error-boundary.d.ts +19 -1
- package/dist/shims/error-boundary.js +11 -1
- package/dist/shims/form.d.ts +3 -1
- package/dist/shims/form.js +37 -43
- package/dist/shims/headers.d.ts +9 -1
- package/dist/shims/headers.js +31 -6
- package/dist/shims/image.js +75 -14
- package/dist/shims/internal/app-route-detection.d.ts +2 -17
- package/dist/shims/internal/app-route-detection.js +4 -17
- package/dist/shims/internal/hybrid-client-route-owner-direct.d.ts +23 -0
- package/dist/shims/internal/hybrid-client-route-owner-direct.js +51 -0
- package/dist/shims/internal/hybrid-client-route-owner.d.ts +2 -15
- package/dist/shims/internal/hybrid-client-route-owner.js +9 -60
- package/dist/shims/internal/pages-data-fetch-dedup.d.ts +9 -5
- package/dist/shims/internal/pages-data-fetch-dedup.js +73 -14
- package/dist/shims/internal/pages-data-target.d.ts +10 -9
- package/dist/shims/internal/pages-data-target.js +91 -12
- package/dist/shims/internal/pages-router-components.d.ts +7 -0
- package/dist/shims/internal/pages-router-components.js +13 -0
- package/dist/shims/layout-segment-context.d.ts +4 -1
- package/dist/shims/layout-segment-context.js +18 -4
- package/dist/shims/link.js +70 -37
- package/dist/shims/metadata.d.ts +3 -2
- package/dist/shims/metadata.js +8 -4
- package/dist/shims/navigation.d.ts +5 -1
- package/dist/shims/navigation.js +45 -10
- package/dist/shims/navigation.react-server.js +1 -1
- package/dist/shims/root-params.d.ts +15 -1
- package/dist/shims/root-params.js +21 -1
- package/dist/shims/router.d.ts +5 -7
- package/dist/shims/router.js +374 -94
- package/dist/shims/server.js +3 -2
- package/dist/shims/slot.js +3 -6
- package/dist/typegen.js +6 -5
- package/dist/utils/client-runtime-metadata.d.ts +2 -18
- package/dist/utils/client-runtime-metadata.js +31 -22
- package/dist/utils/dev-stack-sourcemap-endpoint.d.ts +4 -0
- package/dist/{server → utils}/dev-stack-sourcemap-endpoint.js +1 -1
- package/dist/utils/domain-locale.d.ts +6 -3
- package/dist/{server → utils}/middleware-request-headers.d.ts +1 -1
- package/dist/{server → utils}/middleware-request-headers.js +2 -2
- package/dist/utils/path.d.ts +2 -1
- package/dist/utils/path.js +1 -1
- package/dist/utils/project.d.ts +52 -2
- package/dist/utils/project.js +230 -5
- package/dist/utils/protocol-headers.d.ts +17 -0
- package/dist/utils/protocol-headers.js +17 -0
- package/dist/utils/react-version.d.ts +4 -0
- package/dist/utils/react-version.js +44 -0
- package/package.json +53 -4
- package/dist/deploy.d.ts +0 -190
- package/dist/deploy.js +0 -1033
- package/dist/server/dev-stack-sourcemap-endpoint.d.ts +0 -4
- /package/dist/{cloudflare → packages/cloudflare}/src/utils/cache-control-metadata.js +0 -0
package/dist/cli.js
CHANGED
|
@@ -2,14 +2,21 @@
|
|
|
2
2
|
import { detectPackageManager, ensureViteConfigCompatibility, hasAppDir, hasViteConfig } from "./utils/project.js";
|
|
3
3
|
import { formatReport, runCheck } from "./check.js";
|
|
4
4
|
import { parseArgs } from "./cli-args.js";
|
|
5
|
+
import { createDevServerConfigPlugin, normalizeDevServerHostname } from "./cli-dev-config.js";
|
|
6
|
+
import { normalizePathSeparators } from "./utils/path.js";
|
|
5
7
|
import { PHASE_PRODUCTION_BUILD } from "./shims/constants.js";
|
|
6
8
|
import { createRscCompatibilityId, loadNextConfig, resolveNextConfig } from "./config/next-config.js";
|
|
7
9
|
import { generateRouteTypes } from "./typegen.js";
|
|
8
|
-
import {
|
|
10
|
+
import { clearPagesClientAssetsBuildMetadata } from "./build/pages-client-assets-module.js";
|
|
11
|
+
import { findVinextPrerenderConfigInPlugins, formatVinextPrerenderLabel, resolveVinextPrerenderDecision } from "./config/prerender.js";
|
|
12
|
+
import vinext from "./index.js";
|
|
9
13
|
import { runPrerender } from "./build/run-prerender.js";
|
|
10
14
|
import { loadDotenv } from "./config/dotenv.js";
|
|
11
|
-
import { deploy, parseDeployArgs } from "./deploy.js";
|
|
12
|
-
import
|
|
15
|
+
import { deploy, parseDeployArgs } from "./packages/cloudflare/src/deploy.js";
|
|
16
|
+
import { printDeployHelp } from "./packages/cloudflare/src/deploy-help.js";
|
|
17
|
+
import { getReactUpgradeDeps } from "./utils/react-version.js";
|
|
18
|
+
import { init } from "./init.js";
|
|
19
|
+
import { INIT_PLATFORMS, resolveInitPlatform, resolveInitPrerender } from "./init-platform.js";
|
|
13
20
|
import { resolveVinextPackageRoot } from "./utils/vinext-root.js";
|
|
14
21
|
import { emitStandaloneOutput } from "./build/standalone.js";
|
|
15
22
|
import { cleanBuildOutput } from "./build/clean-output.js";
|
|
@@ -27,7 +34,7 @@ import { execFileSync } from "node:child_process";
|
|
|
27
34
|
* vinext dev Start development server (Vite)
|
|
28
35
|
* vinext build Build for production
|
|
29
36
|
* vinext start Start production server
|
|
30
|
-
* vinext deploy
|
|
37
|
+
* vinext deploy Deprecated Cloudflare deploy shim
|
|
31
38
|
* vinext typegen Generate App Router route helper types
|
|
32
39
|
* vinext lint Run linter (delegates to eslint/oxlint)
|
|
33
40
|
*
|
|
@@ -120,13 +127,17 @@ function createBuildLogger(vite) {
|
|
|
120
127
|
function hasPagesDir() {
|
|
121
128
|
return fs.existsSync(path.join(process.cwd(), "pages")) || fs.existsSync(path.join(process.cwd(), "src", "pages"));
|
|
122
129
|
}
|
|
123
|
-
async function
|
|
124
|
-
if (!hasViteConfig(root)) return
|
|
125
|
-
const
|
|
130
|
+
async function loadBuildViteConfigMetadata(vite, root) {
|
|
131
|
+
if (!hasViteConfig(root)) return { prerenderConfig: null };
|
|
132
|
+
const loaded = await vite.loadConfigFromFile({
|
|
126
133
|
command: "build",
|
|
127
134
|
mode: "production"
|
|
128
|
-
}, void 0, root)
|
|
129
|
-
|
|
135
|
+
}, void 0, root);
|
|
136
|
+
const emptyOutDir = loaded?.config.build?.emptyOutDir;
|
|
137
|
+
return {
|
|
138
|
+
emptyOutDir: typeof emptyOutDir === "boolean" ? emptyOutDir : void 0,
|
|
139
|
+
prerenderConfig: findVinextPrerenderConfigInPlugins(loaded?.config.plugins)
|
|
140
|
+
};
|
|
130
141
|
}
|
|
131
142
|
/**
|
|
132
143
|
* Build the Vite config automatically. If a vite.config.ts exists in the
|
|
@@ -179,20 +190,20 @@ async function dev() {
|
|
|
179
190
|
});
|
|
180
191
|
applyViteConfigCompatibility(process.cwd());
|
|
181
192
|
const vite = await loadVite();
|
|
182
|
-
const
|
|
183
|
-
const
|
|
193
|
+
const initialPort = parsed.port ?? 3e3;
|
|
194
|
+
const initialHost = parsed.hostname ?? "localhost";
|
|
184
195
|
let lockfile;
|
|
185
196
|
const startedAt = Date.now();
|
|
186
197
|
if (process.env.VINEXT_NO_DEV_LOCK !== "1") {
|
|
187
198
|
const root = process.cwd();
|
|
188
|
-
const initialDisplayHost =
|
|
199
|
+
const initialDisplayHost = initialHost === "0.0.0.0" ? "localhost" : initialHost;
|
|
189
200
|
const acquired = tryAcquireLockfile({
|
|
190
201
|
root,
|
|
191
202
|
info: {
|
|
192
203
|
pid: process.pid,
|
|
193
|
-
port,
|
|
194
|
-
hostname:
|
|
195
|
-
appUrl: `http://${initialDisplayHost}:${
|
|
204
|
+
port: initialPort,
|
|
205
|
+
hostname: initialHost,
|
|
206
|
+
appUrl: `http://${initialDisplayHost}:${initialPort}`,
|
|
196
207
|
startedAt,
|
|
197
208
|
cwd: root
|
|
198
209
|
}
|
|
@@ -208,13 +219,21 @@ async function dev() {
|
|
|
208
219
|
lockfile = acquired.lockfile;
|
|
209
220
|
}
|
|
210
221
|
console.log(`\n vinext dev (Vite ${getViteVersion()})\n`);
|
|
211
|
-
const config = buildViteConfig(
|
|
212
|
-
|
|
213
|
-
host
|
|
214
|
-
} });
|
|
222
|
+
const config = buildViteConfig();
|
|
223
|
+
(config.plugins ??= []).push(createDevServerConfigPlugin(parsed));
|
|
215
224
|
let server;
|
|
216
225
|
try {
|
|
217
226
|
server = await vite.createServer(config);
|
|
227
|
+
const port = server.config.server.port ?? 3e3;
|
|
228
|
+
const host = normalizeDevServerHostname(server.config.server.host);
|
|
229
|
+
lockfile?.update({
|
|
230
|
+
pid: process.pid,
|
|
231
|
+
port,
|
|
232
|
+
hostname: host,
|
|
233
|
+
appUrl: `http://${host === "0.0.0.0" ? "localhost" : host}:${port}`,
|
|
234
|
+
startedAt,
|
|
235
|
+
cwd: process.cwd()
|
|
236
|
+
});
|
|
218
237
|
await server.listen();
|
|
219
238
|
} catch (err) {
|
|
220
239
|
lockfile?.release();
|
|
@@ -222,8 +241,10 @@ async function dev() {
|
|
|
222
241
|
}
|
|
223
242
|
server.printUrls();
|
|
224
243
|
if (lockfile) {
|
|
244
|
+
const configuredPort = server.config.server.port ?? 3e3;
|
|
245
|
+
const configuredHost = normalizeDevServerHostname(server.config.server.host);
|
|
225
246
|
const resolved = server.resolvedUrls?.local[0];
|
|
226
|
-
let actualPort =
|
|
247
|
+
let actualPort = configuredPort;
|
|
227
248
|
let appUrl;
|
|
228
249
|
if (resolved) {
|
|
229
250
|
appUrl = resolved.replace(/\/$/, "");
|
|
@@ -233,13 +254,13 @@ async function dev() {
|
|
|
233
254
|
} catch {}
|
|
234
255
|
} else {
|
|
235
256
|
const address = server.httpServer?.address();
|
|
236
|
-
actualPort = typeof address === "object" && address ? address.port :
|
|
237
|
-
appUrl = `http://${
|
|
257
|
+
actualPort = typeof address === "object" && address ? address.port : configuredPort;
|
|
258
|
+
appUrl = `http://${configuredHost === "0.0.0.0" ? "localhost" : configuredHost}:${actualPort}`;
|
|
238
259
|
}
|
|
239
260
|
lockfile.update({
|
|
240
261
|
pid: process.pid,
|
|
241
262
|
port: actualPort,
|
|
242
|
-
hostname:
|
|
263
|
+
hostname: configuredHost,
|
|
243
264
|
appUrl,
|
|
244
265
|
startedAt,
|
|
245
266
|
cwd: process.cwd()
|
|
@@ -260,7 +281,7 @@ async function buildApp() {
|
|
|
260
281
|
const withBuildBundlerOptions = (bundlerOptions) => viteMajorVersion >= 8 ? { rolldownOptions: bundlerOptions } : { rollupOptions: bundlerOptions };
|
|
261
282
|
console.log(`\n vinext build (Vite ${getViteVersion()})\n`);
|
|
262
283
|
const root = process.cwd();
|
|
263
|
-
const isApp = hasAppDir(
|
|
284
|
+
const isApp = hasAppDir(normalizePathSeparators(root));
|
|
264
285
|
const resolvedNextConfig = await resolveNextConfig(await loadNextConfig(root, PHASE_PRODUCTION_BUILD), root);
|
|
265
286
|
process.env.__VINEXT_SHARED_BUILD_ID = resolvedNextConfig.buildId;
|
|
266
287
|
process.env.__VINEXT_SHARED_RSC_COMPATIBILITY_ID = createRscCompatibilityId(resolvedNextConfig);
|
|
@@ -287,15 +308,19 @@ async function buildApp() {
|
|
|
287
308
|
});
|
|
288
309
|
}
|
|
289
310
|
}
|
|
311
|
+
const buildConfigMetadata = await loadBuildViteConfigMetadata(vite, root);
|
|
290
312
|
cleanBuildOutput({
|
|
291
313
|
root,
|
|
292
314
|
outDir: distDir,
|
|
293
|
-
emptyOutDir:
|
|
315
|
+
emptyOutDir: buildConfigMetadata.emptyOutDir
|
|
294
316
|
});
|
|
295
|
-
const
|
|
296
|
-
|
|
297
|
-
if (
|
|
298
|
-
|
|
317
|
+
const isHybrid = isApp && hasPagesDir();
|
|
318
|
+
const pagesClientAssetsBuildSession = isHybrid ? randomBytes(16).toString("hex") : null;
|
|
319
|
+
if (pagesClientAssetsBuildSession) process.env.__VINEXT_PAGES_CLIENT_ASSETS_BUILD_SESSION = pagesClientAssetsBuildSession;
|
|
320
|
+
try {
|
|
321
|
+
const config = buildViteConfig({}, logger);
|
|
322
|
+
await (await vite.createBuilder(config)).buildApp();
|
|
323
|
+
if (isHybrid) {
|
|
299
324
|
console.log(" Building Pages Router server (hybrid)...");
|
|
300
325
|
const root = process.cwd();
|
|
301
326
|
let userTransformPlugins = [];
|
|
@@ -326,6 +351,11 @@ async function buildApp() {
|
|
|
326
351
|
}
|
|
327
352
|
});
|
|
328
353
|
}
|
|
354
|
+
} finally {
|
|
355
|
+
if (pagesClientAssetsBuildSession) {
|
|
356
|
+
clearPagesClientAssetsBuildMetadata(pagesClientAssetsBuildSession);
|
|
357
|
+
if (process.env.__VINEXT_PAGES_CLIENT_ASSETS_BUILD_SESSION === pagesClientAssetsBuildSession) delete process.env.__VINEXT_PAGES_CLIENT_ASSETS_BUILD_SESSION;
|
|
358
|
+
}
|
|
329
359
|
}
|
|
330
360
|
if (outputMode === "standalone") {
|
|
331
361
|
const standalone = emitStandaloneOutput({
|
|
@@ -337,23 +367,27 @@ async function buildApp() {
|
|
|
337
367
|
return process.exit(0);
|
|
338
368
|
}
|
|
339
369
|
let prerenderResult;
|
|
340
|
-
|
|
370
|
+
const prerenderDecision = resolveVinextPrerenderDecision({
|
|
371
|
+
prerenderAllFlag: parsed.prerenderAll,
|
|
372
|
+
vinextPrerenderConfig: buildConfigMetadata.prerenderConfig,
|
|
373
|
+
nextOutput: resolvedNextConfig.output
|
|
374
|
+
});
|
|
375
|
+
if (prerenderDecision) {
|
|
341
376
|
if (resolvedNextConfig.enablePrerenderSourceMaps) {
|
|
342
377
|
process.setSourceMapsEnabled(true);
|
|
343
378
|
Error.stackTraceLimit = Math.max(Error.stackTraceLimit, 50);
|
|
344
379
|
}
|
|
345
|
-
const label = parsed.prerenderAll ? "Pre-rendering all routes..." : "Pre-rendering all routes (output: 'export')...";
|
|
346
380
|
process.stdout.write("\x1B[0m");
|
|
347
|
-
console.log(` ${
|
|
381
|
+
console.log(` ${formatVinextPrerenderLabel(prerenderDecision)}`);
|
|
348
382
|
prerenderResult = await runPrerender({
|
|
349
|
-
root: process.cwd(),
|
|
383
|
+
root: normalizePathSeparators(process.cwd()),
|
|
350
384
|
concurrency: parsed.prerenderConcurrency
|
|
351
385
|
});
|
|
352
386
|
}
|
|
353
387
|
process.stdout.write("\x1B[0m");
|
|
354
388
|
const { printBuildReport } = await import("./build/report.js");
|
|
355
389
|
await printBuildReport({
|
|
356
|
-
root: process.cwd(),
|
|
390
|
+
root: normalizePathSeparators(process.cwd()),
|
|
357
391
|
pageExtensions: resolvedNextConfig.pageExtensions,
|
|
358
392
|
prerenderResult: prerenderResult ?? void 0
|
|
359
393
|
});
|
|
@@ -420,7 +454,12 @@ async function lint() {
|
|
|
420
454
|
}
|
|
421
455
|
async function deployCommand() {
|
|
422
456
|
const parsed = parseDeployArgs(rawArgs);
|
|
423
|
-
if (parsed.help)
|
|
457
|
+
if (parsed.help) {
|
|
458
|
+
printDeployDeprecationWarning();
|
|
459
|
+
printDeployHelp();
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
printDeployDeprecationWarning();
|
|
424
463
|
await loadVite();
|
|
425
464
|
console.log(`\n vinext deploy (Vite ${getViteVersion()})\n`);
|
|
426
465
|
await deploy({
|
|
@@ -438,12 +477,14 @@ async function deployCommand() {
|
|
|
438
477
|
tprWindow: parsed.tprWindow
|
|
439
478
|
});
|
|
440
479
|
}
|
|
480
|
+
function printDeployDeprecationWarning() {
|
|
481
|
+
console.log(" ⚠️ Warning: `vinext deploy` has moved to the `@vinext/cloudflare` package.\n Please switch to `npx @vinext/cloudflare deploy` or `vp exec vinext-cloudflare deploy`; this compatibility command will be removed in a future release.\n");
|
|
482
|
+
}
|
|
441
483
|
async function check() {
|
|
442
484
|
if (parseArgs(rawArgs).help) return printHelp("check");
|
|
443
|
-
const root = process.cwd();
|
|
444
485
|
console.log(`\n vinext check\n`);
|
|
445
486
|
console.log(" Scanning project...\n");
|
|
446
|
-
const result = runCheck(
|
|
487
|
+
const result = runCheck(normalizePathSeparators(process.cwd()));
|
|
447
488
|
console.log(formatReport(result));
|
|
448
489
|
}
|
|
449
490
|
async function typegen() {
|
|
@@ -467,11 +508,17 @@ async function initCommand() {
|
|
|
467
508
|
const port = parsed.port ?? 3001;
|
|
468
509
|
const skipCheck = rawArgs.includes("--skip-check");
|
|
469
510
|
const force = rawArgs.includes("--force");
|
|
511
|
+
const platform = await resolveInitPlatform(rawArgs);
|
|
512
|
+
const platformOptions = await INIT_PLATFORMS[platform].options(rawArgs);
|
|
513
|
+
const prerender = await resolveInitPrerender(rawArgs);
|
|
470
514
|
await init({
|
|
471
515
|
root: process.cwd(),
|
|
472
516
|
port,
|
|
473
517
|
skipCheck,
|
|
474
|
-
force
|
|
518
|
+
force,
|
|
519
|
+
platform,
|
|
520
|
+
prerender,
|
|
521
|
+
cloudflare: platform === "cloudflare" ? platformOptions : void 0
|
|
475
522
|
});
|
|
476
523
|
}
|
|
477
524
|
function printHelp(cmd) {
|
|
@@ -501,8 +548,8 @@ function printHelp(cmd) {
|
|
|
501
548
|
|
|
502
549
|
Options:
|
|
503
550
|
--verbose Show full Vite/Rollup build output (suppressed by default)
|
|
504
|
-
--prerender-all Pre-render discovered routes after building
|
|
505
|
-
|
|
551
|
+
--prerender-all Pre-render discovered routes after building. Equivalent
|
|
552
|
+
to vinext({ prerender: true }) and takes priority.
|
|
506
553
|
--prerender-concurrency <count>
|
|
507
554
|
Maximum number of routes to pre-render in parallel
|
|
508
555
|
--precompress Precompress static assets at build time (.br, .gz, .zst)
|
|
@@ -528,52 +575,8 @@ function printHelp(cmd) {
|
|
|
528
575
|
return;
|
|
529
576
|
}
|
|
530
577
|
if (cmd === "deploy") {
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
Usage: vinext deploy [options]
|
|
535
|
-
|
|
536
|
-
One-command deployment to Cloudflare Workers. Automatically:
|
|
537
|
-
- Detects App Router or Pages Router
|
|
538
|
-
- Generates wrangler.jsonc, worker/index.ts, vite.config.ts if missing
|
|
539
|
-
- Installs @cloudflare/vite-plugin and wrangler if needed
|
|
540
|
-
- Builds the project with Vite
|
|
541
|
-
- Deploys via wrangler
|
|
542
|
-
|
|
543
|
-
Options:
|
|
544
|
-
--preview Deploy to preview environment (same as --env preview)
|
|
545
|
-
--env <name> Deploy using wrangler env.<name>
|
|
546
|
-
--name <name> Custom Worker name (default: from package.json)
|
|
547
|
-
--skip-build Skip the build step (use existing dist/)
|
|
548
|
-
--dry-run Generate config files without building or deploying
|
|
549
|
-
--prerender-all Pre-render discovered routes after building (future
|
|
550
|
-
releases will auto-populate the remote cache)
|
|
551
|
-
--prerender-concurrency <count>
|
|
552
|
-
Maximum number of routes to pre-render in parallel
|
|
553
|
-
-h, --help Show this help
|
|
554
|
-
|
|
555
|
-
Experimental:
|
|
556
|
-
--experimental-tpr Enable Traffic-aware Pre-Rendering
|
|
557
|
-
--tpr-coverage <pct> Traffic coverage target, 0–100 (default: 90)
|
|
558
|
-
--tpr-limit <count> Hard cap on pages to pre-render (default: 1000)
|
|
559
|
-
--tpr-window <hours> Analytics lookback window in hours (default: 24)
|
|
560
|
-
|
|
561
|
-
TPR (Traffic-aware Pre-Rendering) uses Cloudflare zone analytics to determine
|
|
562
|
-
which pages get the most traffic and pre-renders them into KV cache during
|
|
563
|
-
deploy. This feature is experimental and must be explicitly enabled. Requires
|
|
564
|
-
a custom domain (zone analytics are unavailable on *.workers.dev) and the
|
|
565
|
-
CLOUDFLARE_API_TOKEN environment variable with Zone.Analytics read permission.
|
|
566
|
-
|
|
567
|
-
Examples:
|
|
568
|
-
vinext deploy Build and deploy to production
|
|
569
|
-
vinext deploy --preview Deploy to a preview URL
|
|
570
|
-
vinext deploy --env staging Deploy using wrangler env.staging
|
|
571
|
-
vinext deploy --dry-run See what files would be generated
|
|
572
|
-
vinext deploy --name my-app Deploy with a custom Worker name
|
|
573
|
-
vinext deploy --experimental-tpr Enable TPR during deploy
|
|
574
|
-
vinext deploy --experimental-tpr --tpr-coverage 95 Cover 95% of traffic
|
|
575
|
-
vinext deploy --experimental-tpr --tpr-limit 500 Cap at 500 pages
|
|
576
|
-
`);
|
|
578
|
+
printDeployDeprecationWarning();
|
|
579
|
+
printDeployHelp();
|
|
577
580
|
return;
|
|
578
581
|
}
|
|
579
582
|
if (cmd === "check") {
|
|
@@ -605,10 +608,23 @@ function printHelp(cmd) {
|
|
|
605
608
|
-p, --port <port> Dev server port for the vinext script (default: 3001)
|
|
606
609
|
--skip-check Skip the compatibility check step
|
|
607
610
|
--force Overwrite existing vite.config.ts
|
|
611
|
+
--platform <target> Deployment target: cloudflare or node
|
|
612
|
+
--prerender Configure vinext build to pre-render all static routes
|
|
613
|
+
(default: prompt, with No selected by default)
|
|
614
|
+
--data-cache <type> Cloudflare data cache: kv or none (default: kv)
|
|
615
|
+
--image-optimization <type>
|
|
616
|
+
Cloudflare image optimization: cloudflare-images or none
|
|
608
617
|
-h, --help Show this help
|
|
609
618
|
|
|
610
619
|
Examples:
|
|
611
|
-
vinext init
|
|
620
|
+
vinext init Prompt for a deployment platform
|
|
621
|
+
vinext init --platform=cloudflare Configure Cloudflare Workers (default)
|
|
622
|
+
vinext init --platform=cloudflare --data-cache=kv
|
|
623
|
+
Configure the default Cloudflare cache handlers
|
|
624
|
+
vinext init --platform=cloudflare --image-optimization=none
|
|
625
|
+
Do not configure Cloudflare Images
|
|
626
|
+
vinext init --prerender Add prerender: { routes: "*" } to vite.config.ts
|
|
627
|
+
vinext init --platform=node Configure a Node deployment
|
|
612
628
|
vinext init -p 4000 Use port 4000 for dev:vinext
|
|
613
629
|
vinext init --force Overwrite existing vite.config.ts
|
|
614
630
|
vinext init --skip-check Skip the compatibility report
|
|
@@ -653,7 +669,6 @@ function printHelp(cmd) {
|
|
|
653
669
|
dev Start development server
|
|
654
670
|
build Build for production
|
|
655
671
|
start Start production server
|
|
656
|
-
deploy Deploy to Cloudflare Workers
|
|
657
672
|
typegen Generate App Router route helper types
|
|
658
673
|
init Migrate a Next.js project to vinext
|
|
659
674
|
check Scan Next.js app for compatibility
|
|
@@ -664,15 +679,16 @@ function printHelp(cmd) {
|
|
|
664
679
|
--version Show version
|
|
665
680
|
|
|
666
681
|
Examples:
|
|
667
|
-
vinext dev
|
|
668
|
-
vinext dev -p 4000
|
|
669
|
-
vinext build
|
|
670
|
-
vinext typegen
|
|
671
|
-
vinext start
|
|
672
|
-
vinext
|
|
673
|
-
vinext
|
|
674
|
-
vinext
|
|
675
|
-
vinext
|
|
682
|
+
vinext dev Start dev server on port 3000
|
|
683
|
+
vinext dev -p 4000 Start dev server on port 4000
|
|
684
|
+
vinext build Build for production
|
|
685
|
+
vinext typegen Generate route helper types
|
|
686
|
+
vinext start Start production server
|
|
687
|
+
vinext init Migrate a Next.js project
|
|
688
|
+
vinext check Check compatibility
|
|
689
|
+
vinext lint Run linter
|
|
690
|
+
npx @vinext/cloudflare deploy Deploy to Cloudflare Workers
|
|
691
|
+
vp exec vinext-cloudflare deploy Deploy to Cloudflare Workers with Vite+
|
|
676
692
|
|
|
677
693
|
vinext is a drop-in replacement for the \`next\` CLI.
|
|
678
694
|
No vite.config.ts needed — just run \`vinext dev\` in your Next.js project.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ReportedError, dismissOverlay } from "./dev-error-overlay-store.js";
|
|
2
2
|
|
|
3
|
-
//#region src/
|
|
3
|
+
//#region src/client/dev-error-overlay.d.ts
|
|
4
4
|
declare const DEV_ERROR_OVERLAY_HOST_ID = "__vinext_dev_error_overlay_root";
|
|
5
5
|
declare const DEV_ERROR_OVERLAY_MOUNT_ID = "__vinext_dev_error_overlay_mount";
|
|
6
6
|
declare function installDevErrorOverlay(): void;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { VINEXT_DEV_ERROR_RECOVERY_EVENT } from "../utils/dev-error-recovery-event.js";
|
|
2
2
|
import { isNavigationSignalError } from "../utils/navigation-signal.js";
|
|
3
|
-
import { VINEXT_ORIGINAL_STACK_TRACE_ENDPOINT } from "
|
|
3
|
+
import { VINEXT_ORIGINAL_STACK_TRACE_ENDPOINT } from "../utils/dev-stack-sourcemap-endpoint.js";
|
|
4
4
|
import { dismissOverlay, expandOverlay, getOverlaySnapshot, minimizeOverlay, reportToOverlay, setOverlayIndex, subscribeOverlay, updateOverlayErrorStack } from "./dev-error-overlay-store.js";
|
|
5
5
|
import { Fragment, useEffect, useMemo, useState, useSyncExternalStore } from "react";
|
|
6
6
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
7
7
|
import { createRoot } from "react-dom/client";
|
|
8
|
-
//#region src/
|
|
8
|
+
//#region src/client/dev-error-overlay.tsx
|
|
9
9
|
const DEV_ERROR_OVERLAY_HOST_ID = "__vinext_dev_error_overlay_root";
|
|
10
10
|
const DEV_ERROR_OVERLAY_MOUNT_ID = "__vinext_dev_error_overlay_mount";
|
|
11
11
|
const VITE_ERROR_HANDLER_DATA_KEY = "__vinext_vite_error_handler__";
|
|
@@ -9,6 +9,8 @@ type NavigationRuntimeSnapshot = {
|
|
|
9
9
|
type NavigationRuntimeRscChunk = string | [3, string];
|
|
10
10
|
type NavigationRuntimeRscBootstrap = {
|
|
11
11
|
done?: boolean;
|
|
12
|
+
dynamicStaleTimeSeconds?: number;
|
|
13
|
+
initialCacheKind?: "dynamic" | "static";
|
|
12
14
|
nav?: NavigationRuntimeSnapshot;
|
|
13
15
|
params?: Record<string, string | string[]>;
|
|
14
16
|
rsc: NavigationRuntimeRscChunk[];
|
|
@@ -50,10 +50,12 @@ function isNavigationRuntimeParams(value) {
|
|
|
50
50
|
function isNavigationRuntimeRscBootstrap(value) {
|
|
51
51
|
if (!isUnknownRecord(value)) return false;
|
|
52
52
|
const done = Reflect.get(value, "done");
|
|
53
|
+
const dynamicStaleTimeSeconds = Reflect.get(value, "dynamicStaleTimeSeconds");
|
|
54
|
+
const initialCacheKind = Reflect.get(value, "initialCacheKind");
|
|
53
55
|
const nav = Reflect.get(value, "nav");
|
|
54
56
|
const params = Reflect.get(value, "params");
|
|
55
57
|
const rsc = Reflect.get(value, "rsc");
|
|
56
|
-
return (done === void 0 || typeof done === "boolean") && (nav === void 0 || isNavigationRuntimeSnapshot(nav)) && (params === void 0 || isNavigationRuntimeParams(params)) && Array.isArray(rsc) && rsc.every(isNavigationRuntimeRscChunk);
|
|
58
|
+
return (done === void 0 || typeof done === "boolean") && (dynamicStaleTimeSeconds === void 0 || typeof dynamicStaleTimeSeconds === "number" && Number.isFinite(dynamicStaleTimeSeconds) && dynamicStaleTimeSeconds >= 0) && (initialCacheKind === void 0 || initialCacheKind === "dynamic" || initialCacheKind === "static") && (nav === void 0 || isNavigationRuntimeSnapshot(nav)) && (params === void 0 || isNavigationRuntimeParams(params)) && Array.isArray(rsc) && rsc.every(isNavigationRuntimeRscChunk);
|
|
57
59
|
}
|
|
58
60
|
function isReadonlyStringArray(value) {
|
|
59
61
|
return Array.isArray(value) && value.every((entry) => typeof entry === "string");
|
|
@@ -97,7 +97,8 @@ type PagesRouterPublicInstance = {
|
|
|
97
97
|
* prefetch — App Router targets land here as `{ __appRouter: true }`.
|
|
98
98
|
* See: `packages/next/src/shared/lib/router/router.ts:2525`.
|
|
99
99
|
*/
|
|
100
|
-
components: Record<string, unknown>;
|
|
100
|
+
components: Record<string, unknown>; /** Persistent Pages Router static-data cache, matching Next.js `Router.sdc`. */
|
|
101
|
+
sdc: Record<string, Promise<Response>>;
|
|
101
102
|
};
|
|
102
103
|
declare global {
|
|
103
104
|
interface Window {
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { KVCacheHandler } from "
|
|
2
|
-
import { TPROptions, TPRResult, runTPR } from "
|
|
1
|
+
import { KVCacheHandler } from "../packages/cloudflare/src/cache/kv-data-adapter.runtime.js";
|
|
2
|
+
import { TPROptions, TPRResult, runTPR } from "../packages/cloudflare/src/tpr.js";
|
|
3
3
|
export { KVCacheHandler, type TPROptions, type TPRResult, runTPR };
|
package/dist/cloudflare/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { KVCacheHandler } from "
|
|
2
|
-
import { runTPR } from "
|
|
1
|
+
import { KVCacheHandler } from "../packages/cloudflare/src/cache/kv-data-adapter.runtime.js";
|
|
2
|
+
import { runTPR } from "../packages/cloudflare/src/tpr.js";
|
|
3
3
|
export { KVCacheHandler, runTPR };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { VINEXT_MW_CTX_HEADER, VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SECRET_HEADER } from "../
|
|
2
|
-
import { buildRequestHeadersFromMiddlewareResponse } from "../
|
|
1
|
+
import { VINEXT_MW_CTX_HEADER, VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SECRET_HEADER } from "../utils/protocol-headers.js";
|
|
2
|
+
import { buildRequestHeadersFromMiddlewareResponse } from "../utils/middleware-request-headers.js";
|
|
3
3
|
import { parseCookieHeader } from "../utils/parse-cookie.js";
|
|
4
4
|
//#region src/config/config-matchers.ts
|
|
5
5
|
/**
|
|
@@ -526,11 +526,13 @@ function extractConstraint(str, re) {
|
|
|
526
526
|
*
|
|
527
527
|
* The root path `"/"` is preserved as-is.
|
|
528
528
|
*/
|
|
529
|
-
function stripTrailingSlashForConfigMatch(
|
|
530
|
-
return
|
|
529
|
+
function stripTrailingSlashForConfigMatch(value) {
|
|
530
|
+
return value.length > 1 && value.endsWith("/") ? value.slice(0, -1) : value;
|
|
531
531
|
}
|
|
532
532
|
function matchConfigPattern(pathname, pattern) {
|
|
533
|
+
const pathnameHadTrailingSlash = pathname.length > 1 && pathname.endsWith("/");
|
|
533
534
|
pathname = stripTrailingSlashForConfigMatch(pathname);
|
|
535
|
+
if (pathnameHadTrailingSlash) pattern = stripTrailingSlashForConfigMatch(pattern);
|
|
534
536
|
const catchAllAnchor = /:[\w-]+[*+]/.test(pattern);
|
|
535
537
|
const namedParamCount = (pattern.match(/:[\w-]+/g) || []).length;
|
|
536
538
|
if (pattern.includes("(") || pattern.includes("\\") || /:[\w-]+[*+][^/]/.test(pattern) || /:[\w-]+\./.test(pattern) || /[^/]:[\w-]+/.test(pattern) || catchAllAnchor && namedParamCount > 1) try {
|
|
@@ -628,12 +630,12 @@ function matchConfigPattern(pathname, pattern) {
|
|
|
628
630
|
*/
|
|
629
631
|
function matchRedirect(pathname, redirects, ctx, basePathState = _BASEPATH_DEFAULT) {
|
|
630
632
|
if (redirects.length === 0) return null;
|
|
631
|
-
|
|
633
|
+
const normalizedPathname = stripTrailingSlashForConfigMatch(pathname);
|
|
632
634
|
const index = _getRedirectIndex(redirects);
|
|
633
635
|
let localeMatch = null;
|
|
634
636
|
let localeMatchIndex = Infinity;
|
|
635
637
|
if (index.localeStatic.size > 0) {
|
|
636
|
-
const noLocaleBucket = index.localeStatic.get(
|
|
638
|
+
const noLocaleBucket = index.localeStatic.get(normalizedPathname);
|
|
637
639
|
if (noLocaleBucket) for (const entry of noLocaleBucket) {
|
|
638
640
|
if (!entry.optional) continue;
|
|
639
641
|
if (entry.originalIndex >= localeMatchIndex) continue;
|
|
@@ -651,10 +653,10 @@ function matchRedirect(pathname, redirects, ctx, basePathState = _BASEPATH_DEFAU
|
|
|
651
653
|
localeMatchIndex = entry.originalIndex;
|
|
652
654
|
break;
|
|
653
655
|
}
|
|
654
|
-
const slashTwo =
|
|
656
|
+
const slashTwo = normalizedPathname.indexOf("/", 1);
|
|
655
657
|
if (slashTwo !== -1) {
|
|
656
|
-
const suffix =
|
|
657
|
-
const localePart =
|
|
658
|
+
const suffix = normalizedPathname.slice(slashTwo);
|
|
659
|
+
const localePart = normalizedPathname.slice(1, slashTwo);
|
|
658
660
|
const localeBucket = index.localeStatic.get(suffix);
|
|
659
661
|
if (localeBucket) for (const entry of localeBucket) {
|
|
660
662
|
if (entry.originalIndex >= localeMatchIndex) continue;
|
|
@@ -956,11 +958,13 @@ async function proxyExternalRequest(request, externalUrl) {
|
|
|
956
958
|
* when evaluating headers, so this parameter is required.
|
|
957
959
|
*/
|
|
958
960
|
function matchHeaders(pathname, headers, ctx, basePathState = _BASEPATH_DEFAULT) {
|
|
961
|
+
const pathnameHadTrailingSlash = pathname.length > 1 && pathname.endsWith("/");
|
|
959
962
|
pathname = stripTrailingSlashForConfigMatch(pathname);
|
|
960
963
|
const result = [];
|
|
961
964
|
for (const rule of headers) {
|
|
962
965
|
if (!shouldEvaluateRule(rule.basePath, basePathState)) continue;
|
|
963
|
-
const
|
|
966
|
+
const source = pathnameHadTrailingSlash ? stripTrailingSlashForConfigMatch(rule.source) : rule.source;
|
|
967
|
+
const sourceRegex = getCachedRegex(_compiledHeaderSourceCache, source, () => safeRegExp("^" + escapeHeaderSource(source) + "$"));
|
|
964
968
|
if (sourceRegex && sourceRegex.test(pathname)) {
|
|
965
969
|
if (rule.has || rule.missing) {
|
|
966
970
|
if (!checkHasConditions(rule.has, rule.missing, ctx)) continue;
|
|
@@ -107,7 +107,7 @@ type NextConfig = {
|
|
|
107
107
|
}; /** Custom response headers */
|
|
108
108
|
headers?: () => Promise<NextHeader[]> | NextHeader[]; /** Image optimization config */
|
|
109
109
|
images?: {
|
|
110
|
-
remotePatterns?: Array<{
|
|
110
|
+
remotePatterns?: Array<URL | {
|
|
111
111
|
protocol?: string;
|
|
112
112
|
hostname: string;
|
|
113
113
|
port?: string;
|
|
@@ -272,8 +272,11 @@ type ResolvedNextConfig = {
|
|
|
272
272
|
aliases: Record<string, string>; /** Extra allowed origins for dev server access (from allowedDevOrigins). */
|
|
273
273
|
allowedDevOrigins: string[]; /** Extra allowed origins for server action CSRF validation (from experimental.serverActions.allowedOrigins). */
|
|
274
274
|
serverActionsAllowedOrigins: string[]; /** Packages whose barrel imports should be optimized (from experimental.optimizePackageImports). */
|
|
275
|
-
optimizePackageImports: string[]; /**
|
|
276
|
-
|
|
275
|
+
optimizePackageImports: string[]; /** Packages explicitly requested for server/client transpilation. */
|
|
276
|
+
transpilePackages: string[]; /** Packages treated as application code by Turbopack's foreign-code condition. */
|
|
277
|
+
turbopackTranspilePackages: string[]; /** Inline app CSS into production HTML (from experimental.inlineCss). */
|
|
278
|
+
inlineCss: boolean; /** Enable standalone route-miss 404 handling (from experimental.globalNotFound). */
|
|
279
|
+
globalNotFound: boolean; /** Parsed body size limit for server actions in bytes (from experimental.serverActions.bodySizeLimit). Defaults to 1MB. */
|
|
277
280
|
serverActionsBodySizeLimit: number; /** Verbatim body size limit config value (e.g. "2mb") for the "Body exceeded {limit} limit" error. Defaults to "1 MB". */
|
|
278
281
|
serverActionsBodySizeLimitLabel: string; /** Route-level expire fallback in seconds for ISR entries with numeric revalidate. */
|
|
279
282
|
expireTime: number;
|