vinext 0.0.25 → 0.0.27
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 +95 -86
- package/dist/build/static-export.d.ts.map +1 -1
- package/dist/build/static-export.js +3 -8
- package/dist/build/static-export.js.map +1 -1
- package/dist/check.d.ts.map +1 -1
- package/dist/check.js +154 -50
- package/dist/check.js.map +1 -1
- package/dist/cli.js +42 -12
- package/dist/cli.js.map +1 -1
- package/dist/client/entry.js.map +1 -1
- package/dist/client/vinext-next-data.d.ts +22 -0
- package/dist/client/vinext-next-data.d.ts.map +1 -0
- package/dist/client/vinext-next-data.js +2 -0
- package/dist/client/vinext-next-data.js.map +1 -0
- package/dist/cloudflare/kv-cache-handler.d.ts +32 -1
- package/dist/cloudflare/kv-cache-handler.d.ts.map +1 -1
- package/dist/cloudflare/kv-cache-handler.js +47 -21
- package/dist/cloudflare/kv-cache-handler.js.map +1 -1
- package/dist/cloudflare/tpr.d.ts.map +1 -1
- package/dist/cloudflare/tpr.js +15 -4
- package/dist/cloudflare/tpr.js.map +1 -1
- package/dist/config/config-matchers.d.ts +27 -0
- package/dist/config/config-matchers.d.ts.map +1 -1
- package/dist/config/config-matchers.js +312 -62
- package/dist/config/config-matchers.js.map +1 -1
- package/dist/config/dotenv.d.ts.map +1 -1
- package/dist/config/dotenv.js +1 -6
- package/dist/config/dotenv.js.map +1 -1
- package/dist/config/next-config.d.ts +38 -4
- package/dist/config/next-config.d.ts.map +1 -1
- package/dist/config/next-config.js +194 -31
- package/dist/config/next-config.js.map +1 -1
- package/dist/deploy.d.ts +11 -0
- package/dist/deploy.d.ts.map +1 -1
- package/dist/deploy.js +74 -39
- package/dist/deploy.js.map +1 -1
- package/dist/entries/app-browser-entry.d.ts +9 -0
- package/dist/entries/app-browser-entry.d.ts.map +1 -0
- package/dist/entries/app-browser-entry.js +340 -0
- package/dist/entries/app-browser-entry.js.map +1 -0
- package/dist/{server/app-dev-server.d.ts → entries/app-rsc-entry.d.ts} +4 -17
- package/dist/entries/app-rsc-entry.d.ts.map +1 -0
- package/dist/{server/app-dev-server.js → entries/app-rsc-entry.js} +438 -1232
- package/dist/entries/app-rsc-entry.js.map +1 -0
- package/dist/entries/app-ssr-entry.d.ts +8 -0
- package/dist/entries/app-ssr-entry.d.ts.map +1 -0
- package/dist/entries/app-ssr-entry.js +449 -0
- package/dist/entries/app-ssr-entry.js.map +1 -0
- package/dist/entries/pages-client-entry.d.ts +4 -0
- package/dist/entries/pages-client-entry.d.ts.map +1 -0
- package/dist/entries/pages-client-entry.js +96 -0
- package/dist/entries/pages-client-entry.js.map +1 -0
- package/dist/entries/pages-entry-helpers.d.ts +7 -0
- package/dist/entries/pages-entry-helpers.d.ts.map +1 -0
- package/dist/entries/pages-entry-helpers.js +18 -0
- package/dist/entries/pages-entry-helpers.js.map +1 -0
- package/dist/entries/pages-server-entry.d.ts +8 -0
- package/dist/entries/pages-server-entry.d.ts.map +1 -0
- package/dist/entries/pages-server-entry.js +1015 -0
- package/dist/entries/pages-server-entry.js.map +1 -0
- package/dist/index.d.ts +2 -26
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +407 -1357
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +6 -5
- package/dist/init.js.map +1 -1
- package/dist/routing/app-router.d.ts +2 -0
- package/dist/routing/app-router.d.ts.map +1 -1
- package/dist/routing/app-router.js +10 -18
- package/dist/routing/app-router.js.map +1 -1
- package/dist/routing/file-matcher.d.ts.map +1 -1
- package/dist/routing/file-matcher.js.map +1 -1
- package/dist/routing/pages-router.d.ts +2 -0
- package/dist/routing/pages-router.d.ts.map +1 -1
- package/dist/routing/pages-router.js +8 -5
- package/dist/routing/pages-router.js.map +1 -1
- package/dist/routing/utils.d.ts.map +1 -1
- package/dist/routing/utils.js.map +1 -1
- package/dist/server/api-handler.d.ts.map +1 -1
- package/dist/server/api-handler.js +7 -2
- package/dist/server/api-handler.js.map +1 -1
- package/dist/server/app-router-entry.d.ts +3 -2
- package/dist/server/app-router-entry.d.ts.map +1 -1
- package/dist/server/app-router-entry.js +8 -4
- package/dist/server/app-router-entry.js.map +1 -1
- package/dist/server/dev-module-runner.d.ts.map +1 -1
- package/dist/server/dev-module-runner.js +1 -1
- package/dist/server/dev-module-runner.js.map +1 -1
- package/dist/server/dev-origin-check.d.ts.map +1 -1
- package/dist/server/dev-origin-check.js.map +1 -1
- package/dist/server/dev-server.d.ts.map +1 -1
- package/dist/server/dev-server.js +30 -18
- package/dist/server/dev-server.js.map +1 -1
- package/dist/server/image-optimization.d.ts.map +1 -1
- package/dist/server/image-optimization.js.map +1 -1
- package/dist/server/instrumentation.d.ts +1 -1
- package/dist/server/instrumentation.js +2 -2
- package/dist/server/instrumentation.js.map +1 -1
- package/dist/server/isr-cache.d.ts +13 -1
- package/dist/server/isr-cache.d.ts.map +1 -1
- package/dist/server/isr-cache.js +10 -1
- package/dist/server/isr-cache.js.map +1 -1
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/metadata-routes.js +6 -18
- package/dist/server/metadata-routes.js.map +1 -1
- package/dist/server/middleware-codegen.d.ts +1 -1
- package/dist/server/middleware-codegen.d.ts.map +1 -1
- package/dist/server/middleware-codegen.js +13 -11
- package/dist/server/middleware-codegen.js.map +1 -1
- package/dist/server/middleware-request-headers.d.ts +9 -0
- package/dist/server/middleware-request-headers.d.ts.map +1 -0
- package/dist/server/middleware-request-headers.js +77 -0
- package/dist/server/middleware-request-headers.js.map +1 -0
- package/dist/server/middleware.d.ts.map +1 -1
- package/dist/server/middleware.js +38 -19
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/normalize-path.js.map +1 -1
- package/dist/server/prod-server.d.ts +1 -1
- package/dist/server/prod-server.d.ts.map +1 -1
- package/dist/server/prod-server.js +71 -41
- package/dist/server/prod-server.js.map +1 -1
- package/dist/server/request-pipeline.d.ts +93 -0
- package/dist/server/request-pipeline.d.ts.map +1 -0
- package/dist/server/request-pipeline.js +200 -0
- package/dist/server/request-pipeline.js.map +1 -0
- package/dist/shims/cache-runtime.d.ts.map +1 -1
- package/dist/shims/cache-runtime.js +21 -16
- package/dist/shims/cache-runtime.js.map +1 -1
- package/dist/shims/cache.d.ts.map +1 -1
- package/dist/shims/cache.js +18 -17
- package/dist/shims/cache.js.map +1 -1
- package/dist/shims/constants.d.ts +120 -3
- package/dist/shims/constants.d.ts.map +1 -1
- package/dist/shims/constants.js +165 -3
- package/dist/shims/constants.js.map +1 -1
- package/dist/shims/dynamic.d.ts.map +1 -1
- package/dist/shims/dynamic.js +1 -1
- package/dist/shims/dynamic.js.map +1 -1
- package/dist/shims/error-boundary.d.ts.map +1 -1
- package/dist/shims/error-boundary.js +2 -3
- package/dist/shims/error-boundary.js.map +1 -1
- package/dist/shims/error.d.ts.map +1 -1
- package/dist/shims/error.js +1 -3
- package/dist/shims/error.js.map +1 -1
- package/dist/shims/fetch-cache.d.ts.map +1 -1
- package/dist/shims/fetch-cache.js +53 -29
- package/dist/shims/fetch-cache.js.map +1 -1
- package/dist/shims/font-google-base.d.ts.map +1 -1
- package/dist/shims/font-google-base.js +16 -4
- package/dist/shims/font-google-base.js.map +1 -1
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.d.ts.map +1 -1
- package/dist/shims/font-google.generated.d.ts.map +1 -1
- package/dist/shims/font-google.generated.js +412 -206
- package/dist/shims/font-google.generated.js.map +1 -1
- package/dist/shims/font-google.js +1 -1
- package/dist/shims/font-google.js.map +1 -1
- package/dist/shims/font-local.d.ts.map +1 -1
- package/dist/shims/font-local.js +13 -3
- package/dist/shims/font-local.js.map +1 -1
- package/dist/shims/form.d.ts.map +1 -1
- package/dist/shims/form.js +2 -2
- package/dist/shims/form.js.map +1 -1
- package/dist/shims/head.d.ts.map +1 -1
- package/dist/shims/head.js +10 -8
- package/dist/shims/head.js.map +1 -1
- package/dist/shims/headers.d.ts +23 -5
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/headers.js +98 -37
- package/dist/shims/headers.js.map +1 -1
- package/dist/shims/image.d.ts.map +1 -1
- package/dist/shims/image.js +35 -8
- package/dist/shims/image.js.map +1 -1
- package/dist/shims/legacy-image.d.ts.map +1 -1
- package/dist/shims/legacy-image.js +1 -1
- package/dist/shims/legacy-image.js.map +1 -1
- package/dist/shims/link.d.ts.map +1 -1
- package/dist/shims/link.js +31 -17
- package/dist/shims/link.js.map +1 -1
- package/dist/shims/metadata.d.ts +19 -3
- package/dist/shims/metadata.d.ts.map +1 -1
- package/dist/shims/metadata.js +19 -11
- package/dist/shims/metadata.js.map +1 -1
- package/dist/shims/navigation-state.d.ts.map +1 -1
- package/dist/shims/navigation-state.js +3 -2
- package/dist/shims/navigation-state.js.map +1 -1
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/shims/navigation.js +26 -19
- package/dist/shims/navigation.js.map +1 -1
- package/dist/shims/og.d.ts +6 -6
- package/dist/shims/og.js +6 -6
- package/dist/shims/og.js.map +1 -1
- package/dist/shims/request-context.d.ts +50 -0
- package/dist/shims/request-context.d.ts.map +1 -0
- package/dist/shims/request-context.js +59 -0
- package/dist/shims/request-context.js.map +1 -0
- package/dist/shims/router-state.d.ts.map +1 -1
- package/dist/shims/router-state.js +2 -1
- package/dist/shims/router-state.js.map +1 -1
- package/dist/shims/router.d.ts.map +1 -1
- package/dist/shims/router.js +18 -25
- package/dist/shims/router.js.map +1 -1
- package/dist/shims/script.d.ts.map +1 -1
- package/dist/shims/script.js.map +1 -1
- package/dist/shims/server.d.ts +13 -0
- package/dist/shims/server.d.ts.map +1 -1
- package/dist/shims/server.js +100 -34
- package/dist/shims/server.js.map +1 -1
- package/dist/shims/url-utils.d.ts.map +1 -1
- package/dist/shims/url-utils.js +1 -3
- package/dist/shims/url-utils.js.map +1 -1
- package/dist/utils/base-path.d.ts +17 -0
- package/dist/utils/base-path.d.ts.map +1 -0
- package/dist/utils/base-path.js +25 -0
- package/dist/utils/base-path.js.map +1 -0
- package/dist/utils/project.d.ts +15 -0
- package/dist/utils/project.d.ts.map +1 -1
- package/dist/utils/project.js +50 -4
- package/dist/utils/project.js.map +1 -1
- package/dist/utils/query.d.ts.map +1 -1
- package/dist/utils/query.js +3 -1
- package/dist/utils/query.js.map +1 -1
- package/package.json +47 -33
- package/dist/server/app-dev-server.d.ts.map +0 -1
- package/dist/server/app-dev-server.js.map +0 -1
package/dist/cli.js
CHANGED
|
@@ -17,7 +17,7 @@ import fs from "node:fs";
|
|
|
17
17
|
import { pathToFileURL } from "node:url";
|
|
18
18
|
import { createRequire } from "node:module";
|
|
19
19
|
import { execFileSync } from "node:child_process";
|
|
20
|
-
import { detectPackageManager } from "./utils/project.js";
|
|
20
|
+
import { detectPackageManager, ensureViteConfigCompatibility } from "./utils/project.js";
|
|
21
21
|
import { deploy as runDeploy, parseDeployArgs } from "./deploy.js";
|
|
22
22
|
import { runCheck, formatReport } from "./check.js";
|
|
23
23
|
import { init as runInit, getReactUpgradeDeps } from "./init.js";
|
|
@@ -54,7 +54,8 @@ async function loadVite() {
|
|
|
54
54
|
function getViteVersion() {
|
|
55
55
|
return _viteModule?.version ?? "unknown";
|
|
56
56
|
}
|
|
57
|
-
const VERSION = JSON.parse(fs.readFileSync(new URL("../package.json", import.meta.url), "utf-8"))
|
|
57
|
+
const VERSION = JSON.parse(fs.readFileSync(new URL("../package.json", import.meta.url), "utf-8"))
|
|
58
|
+
.version;
|
|
58
59
|
// ─── CLI Argument Parsing ──────────────────────────────────────────────────────
|
|
59
60
|
const command = process.argv[2];
|
|
60
61
|
const rawArgs = process.argv.slice(3);
|
|
@@ -124,17 +125,35 @@ function buildViteConfig(overrides = {}) {
|
|
|
124
125
|
// when vinext is symlinked (bun link / npm link) and both vinext's
|
|
125
126
|
// and the project's node_modules contain React.
|
|
126
127
|
resolve: {
|
|
127
|
-
dedupe: [
|
|
128
|
-
"react",
|
|
129
|
-
"react-dom",
|
|
130
|
-
"react/jsx-runtime",
|
|
131
|
-
"react/jsx-dev-runtime",
|
|
132
|
-
],
|
|
128
|
+
dedupe: ["react", "react-dom", "react/jsx-runtime", "react/jsx-dev-runtime"],
|
|
133
129
|
},
|
|
134
130
|
...overrides,
|
|
135
131
|
};
|
|
136
132
|
return config;
|
|
137
133
|
}
|
|
134
|
+
/**
|
|
135
|
+
* Ensure the project's package.json has `"type": "module"` before Vite loads
|
|
136
|
+
* the vite.config.ts. This prevents the esbuild CJS-bundling path that Vite
|
|
137
|
+
* takes for projects without `"type": "module"`, which produces a `.mjs` temp
|
|
138
|
+
* file containing `require()` calls — calls that fail on Node 22 when
|
|
139
|
+
* targeting pure-ESM packages like `@cloudflare/vite-plugin`.
|
|
140
|
+
*
|
|
141
|
+
* This mirrors what `vinext init` does, but is applied lazily at dev/build
|
|
142
|
+
* time for projects that were set up before `vinext init` added the step, or
|
|
143
|
+
* that were migrated manually.
|
|
144
|
+
*/
|
|
145
|
+
function applyViteConfigCompatibility(root) {
|
|
146
|
+
const result = ensureViteConfigCompatibility(root);
|
|
147
|
+
if (!result)
|
|
148
|
+
return;
|
|
149
|
+
for (const [oldName, newName] of result.renamed) {
|
|
150
|
+
console.warn(` [vinext] Renamed ${oldName} → ${newName} (required for "type": "module")`);
|
|
151
|
+
}
|
|
152
|
+
if (result.addedTypeModule) {
|
|
153
|
+
console.warn(` [vinext] Added "type": "module" to package.json (required for Vite ESM config loading).\n` +
|
|
154
|
+
` Run \`vinext init\` to review all project configuration.`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
138
157
|
// ─── Commands ─────────────────────────────────────────────────────────────────
|
|
139
158
|
async function dev() {
|
|
140
159
|
const parsed = parseArgs(rawArgs);
|
|
@@ -144,6 +163,10 @@ async function dev() {
|
|
|
144
163
|
root: process.cwd(),
|
|
145
164
|
mode: "development",
|
|
146
165
|
});
|
|
166
|
+
// Ensure "type": "module" in package.json before Vite loads vite.config.ts.
|
|
167
|
+
// Without this, Vite bundles the config as CJS and tries require() on pure-ESM
|
|
168
|
+
// packages like @cloudflare/vite-plugin, which fails on Node 22.
|
|
169
|
+
applyViteConfigCompatibility(process.cwd());
|
|
147
170
|
const vite = await loadVite();
|
|
148
171
|
const port = parsed.port ?? 3000;
|
|
149
172
|
const host = parsed.hostname ?? "localhost";
|
|
@@ -163,6 +186,10 @@ async function buildApp() {
|
|
|
163
186
|
root: process.cwd(),
|
|
164
187
|
mode: "production",
|
|
165
188
|
});
|
|
189
|
+
// Ensure "type": "module" in package.json before Vite loads vite.config.ts.
|
|
190
|
+
// Without this, Vite bundles the config as CJS and tries require() on pure-ESM
|
|
191
|
+
// packages like @cloudflare/vite-plugin, which fails on Node 22.
|
|
192
|
+
applyViteConfigCompatibility(process.cwd());
|
|
166
193
|
const vite = await loadVite();
|
|
167
194
|
console.log(`\n vinext build (Vite ${getViteVersion()})\n`);
|
|
168
195
|
const isApp = hasAppDir();
|
|
@@ -227,8 +254,7 @@ async function start() {
|
|
|
227
254
|
const port = parsed.port ?? parseInt(process.env.PORT ?? "3000", 10);
|
|
228
255
|
const host = parsed.hostname ?? "0.0.0.0";
|
|
229
256
|
console.log(`\n vinext start (port ${port})\n`);
|
|
230
|
-
const { startProdServer } = (await import(
|
|
231
|
-
/* @vite-ignore */ "./server/prod-server.js"));
|
|
257
|
+
const { startProdServer } = (await import(/* @vite-ignore */ "./server/prod-server.js"));
|
|
232
258
|
await startProdServer({
|
|
233
259
|
port,
|
|
234
260
|
host,
|
|
@@ -265,9 +291,13 @@ async function lint() {
|
|
|
265
291
|
}
|
|
266
292
|
else {
|
|
267
293
|
console.log(" No linter found. Install eslint or oxlint:\n\n" +
|
|
268
|
-
" " +
|
|
294
|
+
" " +
|
|
295
|
+
detectPackageManager(process.cwd()) +
|
|
296
|
+
" eslint eslint-config-next\n" +
|
|
269
297
|
" # or\n" +
|
|
270
|
-
" " +
|
|
298
|
+
" " +
|
|
299
|
+
detectPackageManager(process.cwd()) +
|
|
300
|
+
" oxlint\n");
|
|
271
301
|
process.exit(1);
|
|
272
302
|
}
|
|
273
303
|
console.log("\n Lint passed.\n");
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n\n/**\n * vinext CLI — drop-in replacement for the `next` command\n *\n * vinext dev Start development server (Vite)\n * vinext build Build for production\n * vinext start Start production server\n * vinext deploy Deploy to Cloudflare Workers\n * vinext lint Run linter (delegates to eslint/oxlint)\n *\n * Automatically configures Vite with the vinext plugin — no vite.config.ts\n * needed for most Next.js apps.\n */\n\nimport vinext, { clientOutputConfig, clientTreeshakeConfig } from \"./index.js\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport { pathToFileURL } from \"node:url\";\nimport { createRequire } from \"node:module\";\nimport { execFileSync } from \"node:child_process\";\nimport { detectPackageManager } from \"./utils/project.js\";\nimport { deploy as runDeploy, parseDeployArgs } from \"./deploy.js\";\nimport { runCheck, formatReport } from \"./check.js\";\nimport { init as runInit, getReactUpgradeDeps } from \"./init.js\";\nimport { loadDotenv } from \"./config/dotenv.js\";\n\n// ─── Resolve Vite from the project root ────────────────────────────────────────\n//\n// When vinext is installed via `bun link` or `npm link`, Node follows the\n// symlink back to the monorepo and resolves `vite` from the monorepo's\n// node_modules — not the project's. This causes dual Vite instances, dual\n// React copies, and plugin resolution failures.\n//\n// To fix this, we resolve Vite dynamically from `process.cwd()` at runtime\n// using `createRequire`. This ensures we always use the project's Vite.\n\ninterface ViteModule {\n createServer: typeof import(\"vite\").createServer;\n build: typeof import(\"vite\").build;\n createBuilder: typeof import(\"vite\").createBuilder;\n version: string;\n}\n\nlet _viteModule: ViteModule | null = null;\n\n/**\n * Dynamically load Vite from the project root. Falls back to the bundled\n * copy if the project doesn't have its own Vite installation.\n */\nasync function loadVite(): Promise<ViteModule> {\n if (_viteModule) return _viteModule;\n\n const projectRoot = process.cwd();\n let vitePath: string;\n\n try {\n // Resolve \"vite\" from the project root, not from vinext's location\n const require = createRequire(path.join(projectRoot, \"package.json\"));\n vitePath = require.resolve(\"vite\");\n } catch {\n // Fallback: use the Vite that ships with vinext (works for non-linked installs)\n vitePath = \"vite\";\n }\n\n // On Windows, absolute paths must be file:// URLs for ESM import().\n // The fallback (\"vite\") is a bare specifier and works as-is.\n const viteUrl = vitePath === \"vite\" ? vitePath : pathToFileURL(vitePath).href;\n const vite = (await import(/* @vite-ignore */ viteUrl)) as ViteModule;\n _viteModule = vite;\n return vite;\n}\n\n/**\n * Get the Vite version string. Returns \"unknown\" before loadVite() is called.\n */\nfunction getViteVersion(): string {\n return _viteModule?.version ?? \"unknown\";\n}\n\nconst VERSION = JSON.parse(\n fs.readFileSync(new URL(\"../package.json\", import.meta.url), \"utf-8\"),\n).version as string;\n\n// ─── CLI Argument Parsing ──────────────────────────────────────────────────────\n\nconst command = process.argv[2];\nconst rawArgs = process.argv.slice(3);\n\ninterface ParsedArgs {\n port?: number;\n hostname?: string;\n help?: boolean;\n turbopack?: boolean; // accepted for compat, always ignored\n experimental?: boolean; // accepted for compat, always ignored\n}\n\nfunction parseArgs(args: string[]): ParsedArgs {\n const result: ParsedArgs = {};\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--help\" || arg === \"-h\") {\n result.help = true;\n } else if (arg === \"--turbopack\") {\n result.turbopack = true; // no-op, accepted for script compat\n } else if (arg === \"--experimental-https\") {\n result.experimental = true; // no-op\n } else if (arg === \"--port\" || arg === \"-p\") {\n result.port = parseInt(args[++i], 10);\n } else if (arg.startsWith(\"--port=\")) {\n result.port = parseInt(arg.split(\"=\")[1], 10);\n } else if (arg === \"--hostname\" || arg === \"-H\") {\n result.hostname = args[++i];\n } else if (arg.startsWith(\"--hostname=\")) {\n result.hostname = arg.split(\"=\")[1];\n }\n }\n return result;\n}\n\n// ─── Auto-configuration ───────────────────────────────────────────────────────\n\n/**\n * Build the Vite config automatically. If a vite.config.ts exists in the\n * project, Vite will merge our config with it (theirs takes precedence).\n * If there's no vite.config, this provides everything needed.\n */\nfunction hasAppDir(): boolean {\n return (\n fs.existsSync(path.join(process.cwd(), \"app\")) ||\n fs.existsSync(path.join(process.cwd(), \"src\", \"app\"))\n );\n}\n\nfunction hasViteConfig(): boolean {\n return (\n fs.existsSync(path.join(process.cwd(), \"vite.config.ts\")) ||\n fs.existsSync(path.join(process.cwd(), \"vite.config.js\")) ||\n fs.existsSync(path.join(process.cwd(), \"vite.config.mjs\"))\n );\n}\n\nfunction buildViteConfig(overrides: Record<string, unknown> = {}) {\n const hasConfig = hasViteConfig();\n\n // If a vite.config exists, let Vite load it — only set root and overrides.\n // The user's config already has vinext() + rsc() plugins configured.\n // Adding them here too would duplicate the RSC transform (causes\n // \"Identifier has already been declared\" errors in production builds).\n if (hasConfig) {\n return {\n root: process.cwd(),\n ...overrides,\n };\n }\n\n // No vite.config — auto-configure everything.\n // vinext() auto-registers @vitejs/plugin-rsc when app/ is detected,\n // so we only need vinext() in the plugins array.\n const config: Record<string, unknown> = {\n root: process.cwd(),\n configFile: false,\n plugins: [vinext()],\n // Deduplicate React packages to prevent \"Invalid hook call\" errors\n // when vinext is symlinked (bun link / npm link) and both vinext's\n // and the project's node_modules contain React.\n resolve: {\n dedupe: [\n \"react\",\n \"react-dom\",\n \"react/jsx-runtime\",\n \"react/jsx-dev-runtime\",\n ],\n },\n ...overrides,\n };\n\n return config;\n}\n\n// ─── Commands ─────────────────────────────────────────────────────────────────\n\nasync function dev() {\n const parsed = parseArgs(rawArgs);\n if (parsed.help) return printHelp(\"dev\");\n\n loadDotenv({\n root: process.cwd(),\n mode: \"development\",\n });\n\n const vite = await loadVite();\n\n const port = parsed.port ?? 3000;\n const host = parsed.hostname ?? \"localhost\";\n\n console.log(`\\n vinext dev (Vite ${getViteVersion()})\\n`);\n\n const config = buildViteConfig({\n server: { port, host },\n });\n\n const server = await vite.createServer(config);\n await server.listen();\n server.printUrls();\n}\n\nasync function buildApp() {\n const parsed = parseArgs(rawArgs);\n if (parsed.help) return printHelp(\"build\");\n\n loadDotenv({\n root: process.cwd(),\n mode: \"production\",\n });\n\n const vite = await loadVite();\n\n console.log(`\\n vinext build (Vite ${getViteVersion()})\\n`);\n\n const isApp = hasAppDir();\n\n // For App Router: upgrade React if needed for react-server-dom-webpack compatibility.\n // Without this, builds with react<19.2.4 produce a Worker that crashes at\n // runtime with \"Cannot read properties of undefined (reading 'moduleMap')\".\n if (isApp) {\n const reactUpgrade = getReactUpgradeDeps(process.cwd());\n if (reactUpgrade.length > 0) {\n const installCmd = detectPackageManager(process.cwd()).replace(/ -D$/, \"\");\n const [pm, ...pmArgs] = installCmd.split(\" \");\n console.log(\" Upgrading React for RSC compatibility...\");\n execFileSync(pm, [...pmArgs, ...reactUpgrade], { cwd: process.cwd(), stdio: \"inherit\" });\n }\n }\n\n if (isApp) {\n // App Router: use createBuilder for multi-environment RSC builds\n const config = buildViteConfig();\n const builder = await vite.createBuilder(config);\n await builder.buildApp();\n } else {\n // Pages Router: client + SSR builds.\n // Use buildViteConfig() so that when a vite.config exists we don't\n // duplicate the vinext() plugin.\n console.log(\" Building client...\");\n await vite.build(buildViteConfig({\n build: {\n outDir: \"dist/client\",\n manifest: true,\n ssrManifest: true,\n rollupOptions: {\n input: \"virtual:vinext-client-entry\",\n output: clientOutputConfig,\n treeshake: clientTreeshakeConfig,\n },\n },\n }));\n\n console.log(\" Building server...\");\n await vite.build(buildViteConfig({\n build: {\n outDir: \"dist/server\",\n ssr: \"virtual:vinext-server-entry\",\n rollupOptions: {\n output: {\n entryFileNames: \"entry.js\",\n },\n },\n },\n }));\n }\n\n console.log(\"\\n Build complete. Run `vinext start` to start the production server.\\n\");\n}\n\nasync function start() {\n const parsed = parseArgs(rawArgs);\n if (parsed.help) return printHelp(\"start\");\n\n loadDotenv({\n root: process.cwd(),\n mode: \"production\",\n });\n\n const port = parsed.port ?? parseInt(process.env.PORT ?? \"3000\", 10);\n const host = parsed.hostname ?? \"0.0.0.0\";\n\n console.log(`\\n vinext start (port ${port})\\n`);\n\n const { startProdServer } = (await import(\n /* @vite-ignore */ \"./server/prod-server.js\"\n )) as {\n startProdServer: (opts: {\n port: number;\n host: string;\n outDir: string;\n }) => Promise<unknown>;\n };\n\n await startProdServer({\n port,\n host,\n outDir: path.resolve(process.cwd(), \"dist\"),\n });\n}\n\nasync function lint() {\n const parsed = parseArgs(rawArgs);\n if (parsed.help) return printHelp(\"lint\");\n\n console.log(`\\n vinext lint\\n`);\n\n // Try oxlint first (fast), fall back to eslint\n const cwd = process.cwd();\n const hasOxlint = fs.existsSync(path.join(cwd, \"node_modules\", \".bin\", \"oxlint\"));\n const hasEslint = fs.existsSync(path.join(cwd, \"node_modules\", \".bin\", \"eslint\"));\n\n // Check for next lint config (eslint-config-next)\n const hasNextLintConfig =\n fs.existsSync(path.join(cwd, \".eslintrc.json\")) ||\n fs.existsSync(path.join(cwd, \".eslintrc.js\")) ||\n fs.existsSync(path.join(cwd, \".eslintrc.cjs\")) ||\n fs.existsSync(path.join(cwd, \"eslint.config.js\")) ||\n fs.existsSync(path.join(cwd, \"eslint.config.mjs\"));\n\n try {\n if (hasEslint && hasNextLintConfig) {\n console.log(\" Using eslint (with existing config)\\n\");\n execFileSync(\"npx\", [\"eslint\", \".\"], { cwd, stdio: \"inherit\" });\n } else if (hasOxlint) {\n console.log(\" Using oxlint\\n\");\n execFileSync(\"npx\", [\"oxlint\", \".\"], { cwd, stdio: \"inherit\" });\n } else if (hasEslint) {\n console.log(\" Using eslint\\n\");\n execFileSync(\"npx\", [\"eslint\", \".\"], { cwd, stdio: \"inherit\" });\n } else {\n console.log(\n \" No linter found. Install eslint or oxlint:\\n\\n\" +\n \" \" + detectPackageManager(process.cwd()) + \" eslint eslint-config-next\\n\" +\n \" # or\\n\" +\n \" \" + detectPackageManager(process.cwd()) + \" oxlint\\n\",\n );\n process.exit(1);\n }\n console.log(\"\\n Lint passed.\\n\");\n } catch {\n process.exit(1);\n }\n}\n\nasync function deployCommand() {\n const parsed = parseDeployArgs(rawArgs);\n if (parsed.help) return printHelp(\"deploy\");\n\n await loadVite();\n console.log(`\\n vinext deploy (Vite ${getViteVersion()})\\n`);\n\n await runDeploy({\n root: process.cwd(),\n preview: parsed.preview,\n env: parsed.env,\n skipBuild: parsed.skipBuild,\n dryRun: parsed.dryRun,\n name: parsed.name,\n experimentalTPR: parsed.experimentalTPR,\n tprCoverage: parsed.tprCoverage,\n tprLimit: parsed.tprLimit,\n tprWindow: parsed.tprWindow,\n });\n}\n\nasync function check() {\n const parsed = parseArgs(rawArgs);\n if (parsed.help) return printHelp(\"check\");\n\n const root = process.cwd();\n console.log(`\\n vinext check\\n`);\n console.log(\" Scanning project...\\n\");\n\n const result = runCheck(root);\n console.log(formatReport(result));\n}\n\nasync function initCommand() {\n const parsed = parseArgs(rawArgs);\n if (parsed.help) return printHelp(\"init\");\n\n console.log(`\\n vinext init\\n`);\n\n // Parse init-specific flags\n const port = parsed.port ?? 3001;\n const skipCheck = rawArgs.includes(\"--skip-check\");\n const force = rawArgs.includes(\"--force\");\n\n await runInit({\n root: process.cwd(),\n port,\n skipCheck,\n force,\n });\n}\n\n// ─── Help ─────────────────────────────────────────────────────────────────────\n\nfunction printHelp(cmd?: string) {\n if (cmd === \"dev\") {\n console.log(`\n vinext dev - Start development server\n\n Usage: vinext dev [options]\n\n Options:\n -p, --port <port> Port to listen on (default: 3000)\n -H, --hostname <host> Hostname to bind to (default: localhost)\n --turbopack Accepted for compatibility (no-op, Vite is always used)\n -h, --help Show this help\n`);\n return;\n }\n\n if (cmd === \"build\") {\n console.log(`\n vinext build - Build for production\n\n Usage: vinext build [options]\n\n Automatically detects App Router (app/) or Pages Router (pages/) and\n runs the appropriate multi-environment build via Vite.\n\n Options:\n -h, --help Show this help\n`);\n return;\n }\n\n if (cmd === \"start\") {\n console.log(`\n vinext start - Start production server\n\n Usage: vinext start [options]\n\n Serves the output from \\`vinext build\\`. Supports SSR, static files,\n compression, and all middleware.\n\n Options:\n -p, --port <port> Port to listen on (default: 3000, or PORT env)\n -H, --hostname <host> Hostname to bind to (default: 0.0.0.0)\n -h, --help Show this help\n`);\n return;\n }\n\n if (cmd === \"deploy\") {\n console.log(`\n vinext deploy - Deploy to Cloudflare Workers\n\n Usage: vinext deploy [options]\n\n One-command deployment to Cloudflare Workers. Automatically:\n - Detects App Router or Pages Router\n - Generates wrangler.jsonc, worker/index.ts, vite.config.ts if missing\n - Installs @cloudflare/vite-plugin and wrangler if needed\n - Builds the project with Vite\n - Deploys via wrangler\n\n Options:\n --preview Deploy to preview environment (same as --env preview)\n --env <name> Deploy using wrangler env.<name>\n --name <name> Custom Worker name (default: from package.json)\n --skip-build Skip the build step (use existing dist/)\n --dry-run Generate config files without building or deploying\n -h, --help Show this help\n\n Experimental:\n --experimental-tpr Enable Traffic-aware Pre-Rendering\n --tpr-coverage <pct> Traffic coverage target, 0–100 (default: 90)\n --tpr-limit <count> Hard cap on pages to pre-render (default: 1000)\n --tpr-window <hours> Analytics lookback window in hours (default: 24)\n\n TPR (Traffic-aware Pre-Rendering) uses Cloudflare zone analytics to determine\n which pages get the most traffic and pre-renders them into KV cache during\n deploy. This feature is experimental and must be explicitly enabled. Requires\n a custom domain (zone analytics are unavailable on *.workers.dev) and the\n CLOUDFLARE_API_TOKEN environment variable with Zone.Analytics read permission.\n\n Examples:\n vinext deploy Build and deploy to production\n vinext deploy --preview Deploy to a preview URL\n vinext deploy --env staging Deploy using wrangler env.staging\n vinext deploy --dry-run See what files would be generated\n vinext deploy --name my-app Deploy with a custom Worker name\n vinext deploy --experimental-tpr Enable TPR during deploy\n vinext deploy --experimental-tpr --tpr-coverage 95 Cover 95% of traffic\n vinext deploy --experimental-tpr --tpr-limit 500 Cap at 500 pages\n`);\n return;\n }\n\n if (cmd === \"check\") {\n console.log(`\n vinext check - Scan Next.js app for compatibility\n\n Usage: vinext check [options]\n\n Scans your Next.js project and produces a compatibility report showing\n which imports, config options, libraries, and conventions are supported,\n partially supported, or unsupported by vinext.\n\n Options:\n -h, --help Show this help\n`);\n return;\n }\n\n if (cmd === \"init\") {\n console.log(`\n vinext init - Migrate a Next.js project to run under vinext\n\n Usage: vinext init [options]\n\n One-command migration: installs dependencies, configures ESM,\n generates vite.config.ts, and adds npm scripts. Your Next.js\n setup continues to work alongside vinext.\n\n Options:\n -p, --port <port> Dev server port for the vinext script (default: 3001)\n --skip-check Skip the compatibility check step\n --force Overwrite existing vite.config.ts\n -h, --help Show this help\n\n Examples:\n vinext init Migrate with defaults\n vinext init -p 4000 Use port 4000 for dev:vinext\n vinext init --force Overwrite existing vite.config.ts\n vinext init --skip-check Skip the compatibility report\n`);\n return;\n }\n\n if (cmd === \"lint\") {\n console.log(`\n vinext lint - Run linter\n\n Usage: vinext lint [options]\n\n Delegates to your project's eslint (with eslint-config-next) or oxlint.\n If neither is installed, suggests how to add one.\n\n Options:\n -h, --help Show this help\n`);\n return;\n }\n\n console.log(`\n vinext v${VERSION} - Run Next.js apps on Vite\n\n Usage: vinext <command> [options]\n\n Commands:\n dev Start development server\n build Build for production\n start Start production server\n deploy Deploy to Cloudflare Workers\n init Migrate a Next.js project to vinext\n check Scan Next.js app for compatibility\n lint Run linter\n\n Options:\n -h, --help Show this help\n --version Show version\n\n Examples:\n vinext dev Start dev server on port 3000\n vinext dev -p 4000 Start dev server on port 4000\n vinext build Build for production\n vinext start Start production server\n vinext deploy Deploy to Cloudflare Workers\n vinext init Migrate a Next.js project\n vinext check Check compatibility\n vinext lint Run linter\n\n vinext is a drop-in replacement for the \\`next\\` CLI.\n No vite.config.ts needed — just run \\`vinext dev\\` in your Next.js project.\n`);\n}\n\n// ─── Entry ────────────────────────────────────────────────────────────────────\n\nif (command === \"--version\" || command === \"-v\") {\n console.log(`vinext v${VERSION}`);\n process.exit(0);\n}\n\nif (command === \"--help\" || command === \"-h\" || !command) {\n printHelp();\n if (!command) process.exit(0);\n process.exit(0);\n}\n\nswitch (command) {\n case \"dev\":\n dev().catch((e) => {\n console.error(e);\n process.exit(1);\n });\n break;\n\n case \"build\":\n buildApp().catch((e) => {\n console.error(e);\n process.exit(1);\n });\n break;\n\n case \"start\":\n start().catch((e) => {\n console.error(e);\n process.exit(1);\n });\n break;\n\n case \"deploy\":\n deployCommand().catch((e) => {\n console.error(e);\n process.exit(1);\n });\n break;\n\n case \"init\":\n initCommand().catch((e) => {\n console.error(e);\n process.exit(1);\n });\n break;\n\n case \"check\":\n check().catch((e) => {\n console.error(e);\n process.exit(1);\n });\n break;\n\n case \"lint\":\n lint().catch((e) => {\n console.error(e);\n process.exit(1);\n });\n break;\n\n default:\n console.error(`\\n Unknown command: ${command}\\n`);\n printHelp();\n process.exit(1);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n\n/**\n * vinext CLI — drop-in replacement for the `next` command\n *\n * vinext dev Start development server (Vite)\n * vinext build Build for production\n * vinext start Start production server\n * vinext deploy Deploy to Cloudflare Workers\n * vinext lint Run linter (delegates to eslint/oxlint)\n *\n * Automatically configures Vite with the vinext plugin — no vite.config.ts\n * needed for most Next.js apps.\n */\n\nimport vinext, { clientOutputConfig, clientTreeshakeConfig } from \"./index.js\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport { pathToFileURL } from \"node:url\";\nimport { createRequire } from \"node:module\";\nimport { execFileSync } from \"node:child_process\";\nimport { detectPackageManager, ensureViteConfigCompatibility } from \"./utils/project.js\";\nimport { deploy as runDeploy, parseDeployArgs } from \"./deploy.js\";\nimport { runCheck, formatReport } from \"./check.js\";\nimport { init as runInit, getReactUpgradeDeps } from \"./init.js\";\nimport { loadDotenv } from \"./config/dotenv.js\";\n\n// ─── Resolve Vite from the project root ────────────────────────────────────────\n//\n// When vinext is installed via `bun link` or `npm link`, Node follows the\n// symlink back to the monorepo and resolves `vite` from the monorepo's\n// node_modules — not the project's. This causes dual Vite instances, dual\n// React copies, and plugin resolution failures.\n//\n// To fix this, we resolve Vite dynamically from `process.cwd()` at runtime\n// using `createRequire`. This ensures we always use the project's Vite.\n\ninterface ViteModule {\n createServer: typeof import(\"vite\").createServer;\n build: typeof import(\"vite\").build;\n createBuilder: typeof import(\"vite\").createBuilder;\n version: string;\n}\n\nlet _viteModule: ViteModule | null = null;\n\n/**\n * Dynamically load Vite from the project root. Falls back to the bundled\n * copy if the project doesn't have its own Vite installation.\n */\nasync function loadVite(): Promise<ViteModule> {\n if (_viteModule) return _viteModule;\n\n const projectRoot = process.cwd();\n let vitePath: string;\n\n try {\n // Resolve \"vite\" from the project root, not from vinext's location\n const require = createRequire(path.join(projectRoot, \"package.json\"));\n vitePath = require.resolve(\"vite\");\n } catch {\n // Fallback: use the Vite that ships with vinext (works for non-linked installs)\n vitePath = \"vite\";\n }\n\n // On Windows, absolute paths must be file:// URLs for ESM import().\n // The fallback (\"vite\") is a bare specifier and works as-is.\n const viteUrl = vitePath === \"vite\" ? vitePath : pathToFileURL(vitePath).href;\n const vite = (await import(/* @vite-ignore */ viteUrl)) as ViteModule;\n _viteModule = vite;\n return vite;\n}\n\n/**\n * Get the Vite version string. Returns \"unknown\" before loadVite() is called.\n */\nfunction getViteVersion(): string {\n return _viteModule?.version ?? \"unknown\";\n}\n\nconst VERSION = JSON.parse(fs.readFileSync(new URL(\"../package.json\", import.meta.url), \"utf-8\"))\n .version as string;\n\n// ─── CLI Argument Parsing ──────────────────────────────────────────────────────\n\nconst command = process.argv[2];\nconst rawArgs = process.argv.slice(3);\n\ninterface ParsedArgs {\n port?: number;\n hostname?: string;\n help?: boolean;\n turbopack?: boolean; // accepted for compat, always ignored\n experimental?: boolean; // accepted for compat, always ignored\n}\n\nfunction parseArgs(args: string[]): ParsedArgs {\n const result: ParsedArgs = {};\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--help\" || arg === \"-h\") {\n result.help = true;\n } else if (arg === \"--turbopack\") {\n result.turbopack = true; // no-op, accepted for script compat\n } else if (arg === \"--experimental-https\") {\n result.experimental = true; // no-op\n } else if (arg === \"--port\" || arg === \"-p\") {\n result.port = parseInt(args[++i], 10);\n } else if (arg.startsWith(\"--port=\")) {\n result.port = parseInt(arg.split(\"=\")[1], 10);\n } else if (arg === \"--hostname\" || arg === \"-H\") {\n result.hostname = args[++i];\n } else if (arg.startsWith(\"--hostname=\")) {\n result.hostname = arg.split(\"=\")[1];\n }\n }\n return result;\n}\n\n// ─── Auto-configuration ───────────────────────────────────────────────────────\n\n/**\n * Build the Vite config automatically. If a vite.config.ts exists in the\n * project, Vite will merge our config with it (theirs takes precedence).\n * If there's no vite.config, this provides everything needed.\n */\nfunction hasAppDir(): boolean {\n return (\n fs.existsSync(path.join(process.cwd(), \"app\")) ||\n fs.existsSync(path.join(process.cwd(), \"src\", \"app\"))\n );\n}\n\nfunction hasViteConfig(): boolean {\n return (\n fs.existsSync(path.join(process.cwd(), \"vite.config.ts\")) ||\n fs.existsSync(path.join(process.cwd(), \"vite.config.js\")) ||\n fs.existsSync(path.join(process.cwd(), \"vite.config.mjs\"))\n );\n}\n\nfunction buildViteConfig(overrides: Record<string, unknown> = {}) {\n const hasConfig = hasViteConfig();\n\n // If a vite.config exists, let Vite load it — only set root and overrides.\n // The user's config already has vinext() + rsc() plugins configured.\n // Adding them here too would duplicate the RSC transform (causes\n // \"Identifier has already been declared\" errors in production builds).\n if (hasConfig) {\n return {\n root: process.cwd(),\n ...overrides,\n };\n }\n\n // No vite.config — auto-configure everything.\n // vinext() auto-registers @vitejs/plugin-rsc when app/ is detected,\n // so we only need vinext() in the plugins array.\n const config: Record<string, unknown> = {\n root: process.cwd(),\n configFile: false,\n plugins: [vinext()],\n // Deduplicate React packages to prevent \"Invalid hook call\" errors\n // when vinext is symlinked (bun link / npm link) and both vinext's\n // and the project's node_modules contain React.\n resolve: {\n dedupe: [\"react\", \"react-dom\", \"react/jsx-runtime\", \"react/jsx-dev-runtime\"],\n },\n ...overrides,\n };\n\n return config;\n}\n\n/**\n * Ensure the project's package.json has `\"type\": \"module\"` before Vite loads\n * the vite.config.ts. This prevents the esbuild CJS-bundling path that Vite\n * takes for projects without `\"type\": \"module\"`, which produces a `.mjs` temp\n * file containing `require()` calls — calls that fail on Node 22 when\n * targeting pure-ESM packages like `@cloudflare/vite-plugin`.\n *\n * This mirrors what `vinext init` does, but is applied lazily at dev/build\n * time for projects that were set up before `vinext init` added the step, or\n * that were migrated manually.\n */\nfunction applyViteConfigCompatibility(root: string): void {\n const result = ensureViteConfigCompatibility(root);\n if (!result) return;\n\n for (const [oldName, newName] of result.renamed) {\n console.warn(` [vinext] Renamed ${oldName} → ${newName} (required for \"type\": \"module\")`);\n }\n if (result.addedTypeModule) {\n console.warn(\n ` [vinext] Added \"type\": \"module\" to package.json (required for Vite ESM config loading).\\n` +\n ` Run \\`vinext init\\` to review all project configuration.`,\n );\n }\n}\n\n// ─── Commands ─────────────────────────────────────────────────────────────────\n\nasync function dev() {\n const parsed = parseArgs(rawArgs);\n if (parsed.help) return printHelp(\"dev\");\n\n loadDotenv({\n root: process.cwd(),\n mode: \"development\",\n });\n\n // Ensure \"type\": \"module\" in package.json before Vite loads vite.config.ts.\n // Without this, Vite bundles the config as CJS and tries require() on pure-ESM\n // packages like @cloudflare/vite-plugin, which fails on Node 22.\n applyViteConfigCompatibility(process.cwd());\n\n const vite = await loadVite();\n\n const port = parsed.port ?? 3000;\n const host = parsed.hostname ?? \"localhost\";\n\n console.log(`\\n vinext dev (Vite ${getViteVersion()})\\n`);\n\n const config = buildViteConfig({\n server: { port, host },\n });\n\n const server = await vite.createServer(config);\n await server.listen();\n server.printUrls();\n}\n\nasync function buildApp() {\n const parsed = parseArgs(rawArgs);\n if (parsed.help) return printHelp(\"build\");\n\n loadDotenv({\n root: process.cwd(),\n mode: \"production\",\n });\n\n // Ensure \"type\": \"module\" in package.json before Vite loads vite.config.ts.\n // Without this, Vite bundles the config as CJS and tries require() on pure-ESM\n // packages like @cloudflare/vite-plugin, which fails on Node 22.\n applyViteConfigCompatibility(process.cwd());\n\n const vite = await loadVite();\n\n console.log(`\\n vinext build (Vite ${getViteVersion()})\\n`);\n\n const isApp = hasAppDir();\n\n // For App Router: upgrade React if needed for react-server-dom-webpack compatibility.\n // Without this, builds with react<19.2.4 produce a Worker that crashes at\n // runtime with \"Cannot read properties of undefined (reading 'moduleMap')\".\n if (isApp) {\n const reactUpgrade = getReactUpgradeDeps(process.cwd());\n if (reactUpgrade.length > 0) {\n const installCmd = detectPackageManager(process.cwd()).replace(/ -D$/, \"\");\n const [pm, ...pmArgs] = installCmd.split(\" \");\n console.log(\" Upgrading React for RSC compatibility...\");\n execFileSync(pm, [...pmArgs, ...reactUpgrade], { cwd: process.cwd(), stdio: \"inherit\" });\n }\n }\n\n if (isApp) {\n // App Router: use createBuilder for multi-environment RSC builds\n const config = buildViteConfig();\n const builder = await vite.createBuilder(config);\n await builder.buildApp();\n } else {\n // Pages Router: client + SSR builds.\n // Use buildViteConfig() so that when a vite.config exists we don't\n // duplicate the vinext() plugin.\n console.log(\" Building client...\");\n await vite.build(\n buildViteConfig({\n build: {\n outDir: \"dist/client\",\n manifest: true,\n ssrManifest: true,\n rollupOptions: {\n input: \"virtual:vinext-client-entry\",\n output: clientOutputConfig,\n treeshake: clientTreeshakeConfig,\n },\n },\n }),\n );\n\n console.log(\" Building server...\");\n await vite.build(\n buildViteConfig({\n build: {\n outDir: \"dist/server\",\n ssr: \"virtual:vinext-server-entry\",\n rollupOptions: {\n output: {\n entryFileNames: \"entry.js\",\n },\n },\n },\n }),\n );\n }\n\n console.log(\"\\n Build complete. Run `vinext start` to start the production server.\\n\");\n}\n\nasync function start() {\n const parsed = parseArgs(rawArgs);\n if (parsed.help) return printHelp(\"start\");\n\n loadDotenv({\n root: process.cwd(),\n mode: \"production\",\n });\n\n const port = parsed.port ?? parseInt(process.env.PORT ?? \"3000\", 10);\n const host = parsed.hostname ?? \"0.0.0.0\";\n\n console.log(`\\n vinext start (port ${port})\\n`);\n\n const { startProdServer } = (await import(/* @vite-ignore */ \"./server/prod-server.js\")) as {\n startProdServer: (opts: { port: number; host: string; outDir: string }) => Promise<unknown>;\n };\n\n await startProdServer({\n port,\n host,\n outDir: path.resolve(process.cwd(), \"dist\"),\n });\n}\n\nasync function lint() {\n const parsed = parseArgs(rawArgs);\n if (parsed.help) return printHelp(\"lint\");\n\n console.log(`\\n vinext lint\\n`);\n\n // Try oxlint first (fast), fall back to eslint\n const cwd = process.cwd();\n const hasOxlint = fs.existsSync(path.join(cwd, \"node_modules\", \".bin\", \"oxlint\"));\n const hasEslint = fs.existsSync(path.join(cwd, \"node_modules\", \".bin\", \"eslint\"));\n\n // Check for next lint config (eslint-config-next)\n const hasNextLintConfig =\n fs.existsSync(path.join(cwd, \".eslintrc.json\")) ||\n fs.existsSync(path.join(cwd, \".eslintrc.js\")) ||\n fs.existsSync(path.join(cwd, \".eslintrc.cjs\")) ||\n fs.existsSync(path.join(cwd, \"eslint.config.js\")) ||\n fs.existsSync(path.join(cwd, \"eslint.config.mjs\"));\n\n try {\n if (hasEslint && hasNextLintConfig) {\n console.log(\" Using eslint (with existing config)\\n\");\n execFileSync(\"npx\", [\"eslint\", \".\"], { cwd, stdio: \"inherit\" });\n } else if (hasOxlint) {\n console.log(\" Using oxlint\\n\");\n execFileSync(\"npx\", [\"oxlint\", \".\"], { cwd, stdio: \"inherit\" });\n } else if (hasEslint) {\n console.log(\" Using eslint\\n\");\n execFileSync(\"npx\", [\"eslint\", \".\"], { cwd, stdio: \"inherit\" });\n } else {\n console.log(\n \" No linter found. Install eslint or oxlint:\\n\\n\" +\n \" \" +\n detectPackageManager(process.cwd()) +\n \" eslint eslint-config-next\\n\" +\n \" # or\\n\" +\n \" \" +\n detectPackageManager(process.cwd()) +\n \" oxlint\\n\",\n );\n process.exit(1);\n }\n console.log(\"\\n Lint passed.\\n\");\n } catch {\n process.exit(1);\n }\n}\n\nasync function deployCommand() {\n const parsed = parseDeployArgs(rawArgs);\n if (parsed.help) return printHelp(\"deploy\");\n\n await loadVite();\n console.log(`\\n vinext deploy (Vite ${getViteVersion()})\\n`);\n\n await runDeploy({\n root: process.cwd(),\n preview: parsed.preview,\n env: parsed.env,\n skipBuild: parsed.skipBuild,\n dryRun: parsed.dryRun,\n name: parsed.name,\n experimentalTPR: parsed.experimentalTPR,\n tprCoverage: parsed.tprCoverage,\n tprLimit: parsed.tprLimit,\n tprWindow: parsed.tprWindow,\n });\n}\n\nasync function check() {\n const parsed = parseArgs(rawArgs);\n if (parsed.help) return printHelp(\"check\");\n\n const root = process.cwd();\n console.log(`\\n vinext check\\n`);\n console.log(\" Scanning project...\\n\");\n\n const result = runCheck(root);\n console.log(formatReport(result));\n}\n\nasync function initCommand() {\n const parsed = parseArgs(rawArgs);\n if (parsed.help) return printHelp(\"init\");\n\n console.log(`\\n vinext init\\n`);\n\n // Parse init-specific flags\n const port = parsed.port ?? 3001;\n const skipCheck = rawArgs.includes(\"--skip-check\");\n const force = rawArgs.includes(\"--force\");\n\n await runInit({\n root: process.cwd(),\n port,\n skipCheck,\n force,\n });\n}\n\n// ─── Help ─────────────────────────────────────────────────────────────────────\n\nfunction printHelp(cmd?: string) {\n if (cmd === \"dev\") {\n console.log(`\n vinext dev - Start development server\n\n Usage: vinext dev [options]\n\n Options:\n -p, --port <port> Port to listen on (default: 3000)\n -H, --hostname <host> Hostname to bind to (default: localhost)\n --turbopack Accepted for compatibility (no-op, Vite is always used)\n -h, --help Show this help\n`);\n return;\n }\n\n if (cmd === \"build\") {\n console.log(`\n vinext build - Build for production\n\n Usage: vinext build [options]\n\n Automatically detects App Router (app/) or Pages Router (pages/) and\n runs the appropriate multi-environment build via Vite.\n\n Options:\n -h, --help Show this help\n`);\n return;\n }\n\n if (cmd === \"start\") {\n console.log(`\n vinext start - Start production server\n\n Usage: vinext start [options]\n\n Serves the output from \\`vinext build\\`. Supports SSR, static files,\n compression, and all middleware.\n\n Options:\n -p, --port <port> Port to listen on (default: 3000, or PORT env)\n -H, --hostname <host> Hostname to bind to (default: 0.0.0.0)\n -h, --help Show this help\n`);\n return;\n }\n\n if (cmd === \"deploy\") {\n console.log(`\n vinext deploy - Deploy to Cloudflare Workers\n\n Usage: vinext deploy [options]\n\n One-command deployment to Cloudflare Workers. Automatically:\n - Detects App Router or Pages Router\n - Generates wrangler.jsonc, worker/index.ts, vite.config.ts if missing\n - Installs @cloudflare/vite-plugin and wrangler if needed\n - Builds the project with Vite\n - Deploys via wrangler\n\n Options:\n --preview Deploy to preview environment (same as --env preview)\n --env <name> Deploy using wrangler env.<name>\n --name <name> Custom Worker name (default: from package.json)\n --skip-build Skip the build step (use existing dist/)\n --dry-run Generate config files without building or deploying\n -h, --help Show this help\n\n Experimental:\n --experimental-tpr Enable Traffic-aware Pre-Rendering\n --tpr-coverage <pct> Traffic coverage target, 0–100 (default: 90)\n --tpr-limit <count> Hard cap on pages to pre-render (default: 1000)\n --tpr-window <hours> Analytics lookback window in hours (default: 24)\n\n TPR (Traffic-aware Pre-Rendering) uses Cloudflare zone analytics to determine\n which pages get the most traffic and pre-renders them into KV cache during\n deploy. This feature is experimental and must be explicitly enabled. Requires\n a custom domain (zone analytics are unavailable on *.workers.dev) and the\n CLOUDFLARE_API_TOKEN environment variable with Zone.Analytics read permission.\n\n Examples:\n vinext deploy Build and deploy to production\n vinext deploy --preview Deploy to a preview URL\n vinext deploy --env staging Deploy using wrangler env.staging\n vinext deploy --dry-run See what files would be generated\n vinext deploy --name my-app Deploy with a custom Worker name\n vinext deploy --experimental-tpr Enable TPR during deploy\n vinext deploy --experimental-tpr --tpr-coverage 95 Cover 95% of traffic\n vinext deploy --experimental-tpr --tpr-limit 500 Cap at 500 pages\n`);\n return;\n }\n\n if (cmd === \"check\") {\n console.log(`\n vinext check - Scan Next.js app for compatibility\n\n Usage: vinext check [options]\n\n Scans your Next.js project and produces a compatibility report showing\n which imports, config options, libraries, and conventions are supported,\n partially supported, or unsupported by vinext.\n\n Options:\n -h, --help Show this help\n`);\n return;\n }\n\n if (cmd === \"init\") {\n console.log(`\n vinext init - Migrate a Next.js project to run under vinext\n\n Usage: vinext init [options]\n\n One-command migration: installs dependencies, configures ESM,\n generates vite.config.ts, and adds npm scripts. Your Next.js\n setup continues to work alongside vinext.\n\n Options:\n -p, --port <port> Dev server port for the vinext script (default: 3001)\n --skip-check Skip the compatibility check step\n --force Overwrite existing vite.config.ts\n -h, --help Show this help\n\n Examples:\n vinext init Migrate with defaults\n vinext init -p 4000 Use port 4000 for dev:vinext\n vinext init --force Overwrite existing vite.config.ts\n vinext init --skip-check Skip the compatibility report\n`);\n return;\n }\n\n if (cmd === \"lint\") {\n console.log(`\n vinext lint - Run linter\n\n Usage: vinext lint [options]\n\n Delegates to your project's eslint (with eslint-config-next) or oxlint.\n If neither is installed, suggests how to add one.\n\n Options:\n -h, --help Show this help\n`);\n return;\n }\n\n console.log(`\n vinext v${VERSION} - Run Next.js apps on Vite\n\n Usage: vinext <command> [options]\n\n Commands:\n dev Start development server\n build Build for production\n start Start production server\n deploy Deploy to Cloudflare Workers\n init Migrate a Next.js project to vinext\n check Scan Next.js app for compatibility\n lint Run linter\n\n Options:\n -h, --help Show this help\n --version Show version\n\n Examples:\n vinext dev Start dev server on port 3000\n vinext dev -p 4000 Start dev server on port 4000\n vinext build Build for production\n vinext start Start production server\n vinext deploy Deploy to Cloudflare Workers\n vinext init Migrate a Next.js project\n vinext check Check compatibility\n vinext lint Run linter\n\n vinext is a drop-in replacement for the \\`next\\` CLI.\n No vite.config.ts needed — just run \\`vinext dev\\` in your Next.js project.\n`);\n}\n\n// ─── Entry ────────────────────────────────────────────────────────────────────\n\nif (command === \"--version\" || command === \"-v\") {\n console.log(`vinext v${VERSION}`);\n process.exit(0);\n}\n\nif (command === \"--help\" || command === \"-h\" || !command) {\n printHelp();\n if (!command) process.exit(0);\n process.exit(0);\n}\n\nswitch (command) {\n case \"dev\":\n dev().catch((e) => {\n console.error(e);\n process.exit(1);\n });\n break;\n\n case \"build\":\n buildApp().catch((e) => {\n console.error(e);\n process.exit(1);\n });\n break;\n\n case \"start\":\n start().catch((e) => {\n console.error(e);\n process.exit(1);\n });\n break;\n\n case \"deploy\":\n deployCommand().catch((e) => {\n console.error(e);\n process.exit(1);\n });\n break;\n\n case \"init\":\n initCommand().catch((e) => {\n console.error(e);\n process.exit(1);\n });\n break;\n\n case \"check\":\n check().catch((e) => {\n console.error(e);\n process.exit(1);\n });\n break;\n\n case \"lint\":\n lint().catch((e) => {\n console.error(e);\n process.exit(1);\n });\n break;\n\n default:\n console.error(`\\n Unknown command: ${command}\\n`);\n printHelp();\n process.exit(1);\n}\n"]}
|
package/dist/client/entry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry.js","sourceRoot":"","sources":["../../src/client/entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,0EAA0E;AAC1E,6EAA6E;AAC7E,wDAAwD;AACxD,OAAO,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"entry.js","sourceRoot":"","sources":["../../src/client/entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,0EAA0E;AAC1E,6EAA6E;AAC7E,wDAAwD;AACxD,OAAO,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAG9D,2CAA2C;AAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,aAA2C,CAAC;AACpE,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,IAAI,EAAE,CAA4B,CAAC;AAC/E,MAAM,cAAc,GAAG,QAAQ,EAAE,YAAY,CAAC;AAC9C,MAAM,aAAa,GAAG,QAAQ,EAAE,WAAW,CAAC;AAE5C,KAAK,UAAU,OAAO;IACpB,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC3E,OAAO;IACT,CAAC;IAED,qCAAqC;IACrC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC;IAEzC,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IAED,IAAI,OAA2B,CAAC;IAEhC,kDAAkD;IAClD,IAAI,aAAa,EAAE,CAAC;QAClB,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC;gBACjE,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC;gBACvC,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,YAAY,EAAE;oBAC1C,SAAS,EAAE,aAAa;oBACxB,SAAS;iBACV,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,0FAA0F;IAC1F,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IACpD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAE7C,mEAAmE;IACnE,yEAAyE;IACzE,gEAAgE;IAChE,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC;AAChC,CAAC;AAED,KAAK,OAAO,EAAE,CAAC","sourcesContent":["/**\n * Client-side hydration entry point.\n *\n * This module is injected as a <script type=\"module\"> in the SSR HTML.\n * It reads __NEXT_DATA__ from the window, dynamically imports the page\n * component, and hydrates it onto #__next.\n *\n * The actual page import path is injected at serve-time by the plugin\n * via a virtual module or inline script.\n */\nimport React from \"react\";\nimport { hydrateRoot } from \"react-dom/client\";\n// Eagerly import the router shim so its module-level popstate listener is\n// registered. Without this, browser back/forward buttons do nothing because\n// navigateClient() is never invoked on history changes.\nimport \"next/router\";\nimport { isValidModulePath } from \"./validate-module-path.js\";\nimport type { VinextNextData } from \"./vinext-next-data.js\";\n\n// Read the SSR data injected by the server\nconst nextData = window.__NEXT_DATA__ as VinextNextData | undefined;\nconst pageProps = (nextData?.props.pageProps ?? {}) as Record<string, unknown>;\nconst pageModulePath = nextData?.__pageModule;\nconst appModulePath = nextData?.__appModule;\n\nasync function hydrate() {\n if (!isValidModulePath(pageModulePath)) {\n console.error(\"[vinext] Invalid or missing __pageModule in __NEXT_DATA__\");\n return;\n }\n\n // Dynamically import the page module\n const pageModule = await import(/* @vite-ignore */ pageModulePath);\n const PageComponent = pageModule.default;\n\n if (!PageComponent) {\n console.error(\"[vinext] Page module has no default export\");\n return;\n }\n\n let element: React.ReactElement;\n\n // If there's a custom _app, wrap the page with it\n if (appModulePath) {\n if (!isValidModulePath(appModulePath)) {\n console.error(\"[vinext] Invalid __appModule in __NEXT_DATA__\");\n } else {\n try {\n const appModule = await import(/* @vite-ignore */ appModulePath);\n const AppComponent = appModule.default;\n element = React.createElement(AppComponent, {\n Component: PageComponent,\n pageProps,\n });\n } catch {\n // No _app, render page directly\n }\n }\n }\n\n // @ts-expect-error -- element is assigned in the _app branch above, or falls through here\n if (!element) {\n element = React.createElement(PageComponent, pageProps);\n }\n\n const container = document.getElementById(\"__next\");\n if (!container) {\n console.error(\"[vinext] No #__next element found\");\n return;\n }\n\n const root = hydrateRoot(container, element);\n\n // Expose root on window so the router shim (a separate module) can\n // re-render the tree during client-side navigation. import.meta.hot.data\n // is module-scoped and cannot be read across module boundaries.\n window.__VINEXT_ROOT__ = root;\n}\n\nvoid hydrate();\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vinext-specific extensions to Next.js's `NEXT_DATA`.
|
|
3
|
+
*
|
|
4
|
+
* The `next` package declares `Window.__NEXT_DATA__: NEXT_DATA` in its types.
|
|
5
|
+
* We can't augment the `NEXT_DATA` type alias, so we extend the vinext shim's
|
|
6
|
+
* interface (shims/internal/utils.ts) and cast at the usage sites.
|
|
7
|
+
*/
|
|
8
|
+
import type { NEXT_DATA } from "../shims/internal/utils.js";
|
|
9
|
+
export interface VinextNextData extends NEXT_DATA {
|
|
10
|
+
/** vinext-specific additions (not part of Next.js upstream). */
|
|
11
|
+
__vinext?: {
|
|
12
|
+
/** Absolute URL of the page module for dynamic import. */
|
|
13
|
+
pageModuleUrl?: string;
|
|
14
|
+
/** Absolute URL of the `_app` module for dynamic import. */
|
|
15
|
+
appModuleUrl?: string;
|
|
16
|
+
};
|
|
17
|
+
/** Serialised page module path (legacy — used by `client/entry.ts`). */
|
|
18
|
+
__pageModule?: string;
|
|
19
|
+
/** Serialised `_app` module path (legacy — used by `client/entry.ts`). */
|
|
20
|
+
__appModule?: string;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=vinext-next-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vinext-next-data.d.ts","sourceRoot":"","sources":["../../src/client/vinext-next-data.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE5D,MAAM,WAAW,cAAe,SAAQ,SAAS;IAC/C,gEAAgE;IAChE,QAAQ,CAAC,EAAE;QACT,0DAA0D;QAC1D,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,4DAA4D;QAC5D,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vinext-next-data.js","sourceRoot":"","sources":["../../src/client/vinext-next-data.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * vinext-specific extensions to Next.js's `NEXT_DATA`.\n *\n * The `next` package declares `Window.__NEXT_DATA__: NEXT_DATA` in its types.\n * We can't augment the `NEXT_DATA` type alias, so we extend the vinext shim's\n * interface (shims/internal/utils.ts) and cast at the usage sites.\n */\nimport type { NEXT_DATA } from \"../shims/internal/utils.js\";\n\nexport interface VinextNextData extends NEXT_DATA {\n /** vinext-specific additions (not part of Next.js upstream). */\n __vinext?: {\n /** Absolute URL of the page module for dynamic import. */\n pageModuleUrl?: string;\n /** Absolute URL of the `_app` module for dynamic import. */\n appModuleUrl?: string;\n };\n /** Serialised page module path (legacy — used by `client/entry.ts`). */\n __pageModule?: string;\n /** Serialised `_app` module path (legacy — used by `client/entry.ts`). */\n __appModule?: string;\n}\n"]}
|
|
@@ -11,8 +11,10 @@
|
|
|
11
11
|
* import { setCacheHandler } from "vinext/shims/cache";
|
|
12
12
|
*
|
|
13
13
|
* export default {
|
|
14
|
-
* async fetch(request: Request, env: Env) {
|
|
14
|
+
* async fetch(request: Request, env: Env, ctx: ExecutionContext) {
|
|
15
15
|
* setCacheHandler(new KVCacheHandler(env.VINEXT_CACHE));
|
|
16
|
+
* // ctx is propagated automatically via runWithExecutionContext in
|
|
17
|
+
* // the vinext handler — no need to pass it to KVCacheHandler.
|
|
16
18
|
* // ... rest of worker handler
|
|
17
19
|
* }
|
|
18
20
|
* };
|
|
@@ -51,11 +53,25 @@ interface KVNamespace {
|
|
|
51
53
|
cursor?: string;
|
|
52
54
|
}>;
|
|
53
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Minimal ExecutionContext interface for Cloudflare Workers.
|
|
58
|
+
* Background KV operations (cleanup deletes, cache writes) are registered
|
|
59
|
+
* with ctx.waitUntil() so they are not killed when the Response is returned.
|
|
60
|
+
*
|
|
61
|
+
* The preferred way to supply ctx is via runWithExecutionContext() in the
|
|
62
|
+
* worker entry (see vinext/shims/request-context). The constructor option
|
|
63
|
+
* is kept as a fallback for callers that set it explicitly.
|
|
64
|
+
*/
|
|
65
|
+
interface ExecutionContext {
|
|
66
|
+
waitUntil(promise: Promise<unknown>): void;
|
|
67
|
+
}
|
|
54
68
|
export declare class KVCacheHandler implements CacheHandler {
|
|
55
69
|
private kv;
|
|
56
70
|
private prefix;
|
|
71
|
+
private ctx;
|
|
57
72
|
constructor(kvNamespace: KVNamespace, options?: {
|
|
58
73
|
appPrefix?: string;
|
|
74
|
+
ctx?: ExecutionContext;
|
|
59
75
|
});
|
|
60
76
|
get(key: string, _ctx?: Record<string, unknown>): Promise<CacheHandlerValue | null>;
|
|
61
77
|
set(key: string, data: IncrementalCacheValue | null, ctx?: Record<string, unknown>): Promise<void>;
|
|
@@ -63,6 +79,21 @@ export declare class KVCacheHandler implements CacheHandler {
|
|
|
63
79
|
expire?: number;
|
|
64
80
|
}): Promise<void>;
|
|
65
81
|
resetRequestCache(): void;
|
|
82
|
+
/**
|
|
83
|
+
* Fire a KV delete in the background.
|
|
84
|
+
* Prefers the per-request ExecutionContext from ALS (set by
|
|
85
|
+
* runWithExecutionContext in the worker entry) so that background KV
|
|
86
|
+
* operations are registered with the correct request's waitUntil().
|
|
87
|
+
* Falls back to the constructor-provided ctx for callers that set it
|
|
88
|
+
* explicitly, and to fire-and-forget when neither is available (Node.js dev).
|
|
89
|
+
*/
|
|
90
|
+
private _deleteInBackground;
|
|
91
|
+
/**
|
|
92
|
+
* Fire a KV put in the background.
|
|
93
|
+
* Same ALS ctx → constructor ctx → fire-and-forget precedence as
|
|
94
|
+
* `_deleteInBackground`.
|
|
95
|
+
*/
|
|
96
|
+
private _putInBackground;
|
|
66
97
|
}
|
|
67
98
|
export {};
|
|
68
99
|
//# sourceMappingURL=kv-cache-handler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kv-cache-handler.d.ts","sourceRoot":"","sources":["../../src/cloudflare/kv-cache-handler.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"kv-cache-handler.d.ts","sourceRoot":"","sources":["../../src/cloudflare/kv-cache-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAIhG,UAAU,WAAW;IACnB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACtE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,IAAI,EAAE,aAAa,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAChF,GAAG,CACD,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,cAAc,EAC5C,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GACvE,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAC5E,IAAI,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,CAAC,CAAC;QAClE,aAAa,EAAE,OAAO,CAAC;QACvB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ;AAED;;;;;;;;GAQG;AACH,UAAU,gBAAgB;IACxB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CAC5C;AAiCD,qBAAa,cAAe,YAAW,YAAY;IACjD,OAAO,CAAC,EAAE,CAAc;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,GAAG,CAA+B;gBAE9B,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,gBAAgB,CAAA;KAAE;IAMxF,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAmEzF,GAAG,CACD,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,qBAAqB,GAAG,IAAI,EAClC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC;IA8DV,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,UAAU,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAe7F,iBAAiB,IAAI,IAAI;IAIzB;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;CAYzB"}
|
|
@@ -11,8 +11,10 @@
|
|
|
11
11
|
* import { setCacheHandler } from "vinext/shims/cache";
|
|
12
12
|
*
|
|
13
13
|
* export default {
|
|
14
|
-
* async fetch(request: Request, env: Env) {
|
|
14
|
+
* async fetch(request: Request, env: Env, ctx: ExecutionContext) {
|
|
15
15
|
* setCacheHandler(new KVCacheHandler(env.VINEXT_CACHE));
|
|
16
|
+
* // ctx is propagated automatically via runWithExecutionContext in
|
|
17
|
+
* // the vinext handler — no need to pass it to KVCacheHandler.
|
|
16
18
|
* // ... rest of worker handler
|
|
17
19
|
* }
|
|
18
20
|
* };
|
|
@@ -25,6 +27,7 @@
|
|
|
25
27
|
* ]
|
|
26
28
|
* }
|
|
27
29
|
*/
|
|
30
|
+
import { getRequestExecutionContext } from "../shims/request-context.js";
|
|
28
31
|
/** Key prefix for tag invalidation timestamps. */
|
|
29
32
|
const TAG_PREFIX = "__tag:";
|
|
30
33
|
/** Key prefix for cache entries. */
|
|
@@ -48,9 +51,11 @@ function validateTag(tag) {
|
|
|
48
51
|
export class KVCacheHandler {
|
|
49
52
|
kv;
|
|
50
53
|
prefix;
|
|
54
|
+
ctx;
|
|
51
55
|
constructor(kvNamespace, options) {
|
|
52
56
|
this.kv = kvNamespace;
|
|
53
57
|
this.prefix = options?.appPrefix ? `${options.appPrefix}:` : "";
|
|
58
|
+
this.ctx = options?.ctx;
|
|
54
59
|
}
|
|
55
60
|
async get(key, _ctx) {
|
|
56
61
|
const kvKey = this.prefix + ENTRY_PREFIX + key;
|
|
@@ -62,15 +67,16 @@ export class KVCacheHandler {
|
|
|
62
67
|
parsed = JSON.parse(raw);
|
|
63
68
|
}
|
|
64
69
|
catch {
|
|
65
|
-
// Corrupted JSON — delete and treat as miss
|
|
66
|
-
|
|
70
|
+
// Corrupted JSON — fire cleanup delete in the background and treat as miss.
|
|
71
|
+
// Using waitUntil ensures the delete isn't killed when the Response is returned.
|
|
72
|
+
this._deleteInBackground(kvKey);
|
|
67
73
|
return null;
|
|
68
74
|
}
|
|
69
75
|
// Validate deserialized shape before using
|
|
70
76
|
const entry = validateCacheEntry(parsed);
|
|
71
77
|
if (!entry) {
|
|
72
78
|
console.error("[vinext] Invalid cache entry shape for key:", key);
|
|
73
|
-
|
|
79
|
+
this._deleteInBackground(kvKey);
|
|
74
80
|
return null;
|
|
75
81
|
}
|
|
76
82
|
// Restore ArrayBuffer fields that were base64-encoded for JSON storage
|
|
@@ -78,7 +84,7 @@ export class KVCacheHandler {
|
|
|
78
84
|
const ok = restoreArrayBuffers(entry.value);
|
|
79
85
|
if (!ok) {
|
|
80
86
|
// base64 decode failed — corrupted entry, treat as miss
|
|
81
|
-
|
|
87
|
+
this._deleteInBackground(kvKey);
|
|
82
88
|
return null;
|
|
83
89
|
}
|
|
84
90
|
}
|
|
@@ -92,7 +98,7 @@ export class KVCacheHandler {
|
|
|
92
98
|
if (Number.isNaN(tagTimestamp) || tagTimestamp >= entry.lastModified) {
|
|
93
99
|
// Tag was invalidated after this entry, or timestamp is corrupted
|
|
94
100
|
// — treat as miss to force re-render
|
|
95
|
-
|
|
101
|
+
this._deleteInBackground(kvKey);
|
|
96
102
|
return null;
|
|
97
103
|
}
|
|
98
104
|
}
|
|
@@ -111,7 +117,7 @@ export class KVCacheHandler {
|
|
|
111
117
|
value: entry.value,
|
|
112
118
|
};
|
|
113
119
|
}
|
|
114
|
-
|
|
120
|
+
set(key, data, ctx) {
|
|
115
121
|
// Collect, validate, and dedupe tags from data and context
|
|
116
122
|
const tagSet = new Set();
|
|
117
123
|
if (data && "tags" in data && Array.isArray(data.tags)) {
|
|
@@ -162,9 +168,10 @@ export class KVCacheHandler {
|
|
|
162
168
|
// KV minimum TTL is 60 seconds
|
|
163
169
|
expirationTtl = Math.max(expirationTtl, 60);
|
|
164
170
|
}
|
|
165
|
-
|
|
171
|
+
this._putInBackground(this.prefix + ENTRY_PREFIX + key, JSON.stringify(entry), {
|
|
166
172
|
expirationTtl,
|
|
167
173
|
});
|
|
174
|
+
return Promise.resolve();
|
|
168
175
|
}
|
|
169
176
|
async revalidateTag(tags, _durations) {
|
|
170
177
|
const tagList = Array.isArray(tags) ? tags : [tags];
|
|
@@ -179,18 +186,40 @@ export class KVCacheHandler {
|
|
|
179
186
|
resetRequestCache() {
|
|
180
187
|
// No-op — KV is stateless per request
|
|
181
188
|
}
|
|
189
|
+
/**
|
|
190
|
+
* Fire a KV delete in the background.
|
|
191
|
+
* Prefers the per-request ExecutionContext from ALS (set by
|
|
192
|
+
* runWithExecutionContext in the worker entry) so that background KV
|
|
193
|
+
* operations are registered with the correct request's waitUntil().
|
|
194
|
+
* Falls back to the constructor-provided ctx for callers that set it
|
|
195
|
+
* explicitly, and to fire-and-forget when neither is available (Node.js dev).
|
|
196
|
+
*/
|
|
197
|
+
_deleteInBackground(kvKey) {
|
|
198
|
+
const promise = this.kv.delete(kvKey);
|
|
199
|
+
const ctx = getRequestExecutionContext() ?? this.ctx;
|
|
200
|
+
if (ctx) {
|
|
201
|
+
ctx.waitUntil(promise);
|
|
202
|
+
}
|
|
203
|
+
// else: fire-and-forget on Node.js
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Fire a KV put in the background.
|
|
207
|
+
* Same ALS ctx → constructor ctx → fire-and-forget precedence as
|
|
208
|
+
* `_deleteInBackground`.
|
|
209
|
+
*/
|
|
210
|
+
_putInBackground(kvKey, value, options) {
|
|
211
|
+
const promise = this.kv.put(kvKey, value, options);
|
|
212
|
+
const ctx = getRequestExecutionContext() ?? this.ctx;
|
|
213
|
+
if (ctx) {
|
|
214
|
+
ctx.waitUntil(promise);
|
|
215
|
+
}
|
|
216
|
+
// else: fire-and-forget on Node.js
|
|
217
|
+
}
|
|
182
218
|
}
|
|
183
219
|
// ---------------------------------------------------------------------------
|
|
184
220
|
// Validation helpers
|
|
185
221
|
// ---------------------------------------------------------------------------
|
|
186
|
-
const VALID_KINDS = new Set([
|
|
187
|
-
"FETCH",
|
|
188
|
-
"APP_PAGE",
|
|
189
|
-
"PAGES",
|
|
190
|
-
"APP_ROUTE",
|
|
191
|
-
"REDIRECT",
|
|
192
|
-
"IMAGE",
|
|
193
|
-
]);
|
|
222
|
+
const VALID_KINDS = new Set(["FETCH", "APP_PAGE", "PAGES", "APP_ROUTE", "REDIRECT", "IMAGE"]);
|
|
194
223
|
/**
|
|
195
224
|
* Validate that a parsed JSON value has the expected KVCacheEntry shape.
|
|
196
225
|
* Returns the validated entry or null if the shape is invalid.
|
|
@@ -204,8 +233,7 @@ function validateCacheEntry(raw) {
|
|
|
204
233
|
return null;
|
|
205
234
|
if (!Array.isArray(obj.tags))
|
|
206
235
|
return null;
|
|
207
|
-
if (obj.revalidateAt !== null &&
|
|
208
|
-
typeof obj.revalidateAt !== "number")
|
|
236
|
+
if (obj.revalidateAt !== null && typeof obj.revalidateAt !== "number")
|
|
209
237
|
return null;
|
|
210
238
|
// value must be null or a valid cache value object with a known kind
|
|
211
239
|
if (obj.value !== null) {
|
|
@@ -228,9 +256,7 @@ function serializeForJSON(value) {
|
|
|
228
256
|
if (value.kind === "APP_PAGE") {
|
|
229
257
|
return {
|
|
230
258
|
...value,
|
|
231
|
-
rscData: value.rscData
|
|
232
|
-
? arrayBufferToBase64(value.rscData)
|
|
233
|
-
: undefined,
|
|
259
|
+
rscData: value.rscData ? arrayBufferToBase64(value.rscData) : undefined,
|
|
234
260
|
};
|
|
235
261
|
}
|
|
236
262
|
if (value.kind === "APP_ROUTE") {
|