vinext 0.0.5 → 0.0.7
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 +5 -2
- package/dist/cli.js +19 -48
- package/dist/cli.js.map +1 -1
- package/dist/deploy.d.ts +28 -1
- package/dist/deploy.d.ts.map +1 -1
- package/dist/deploy.js +89 -10
- package/dist/deploy.js.map +1 -1
- package/dist/index.js +10 -10
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +15 -0
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +76 -2
- package/dist/init.js.map +1 -1
- package/dist/server/prod-server.js +2 -2
- package/dist/server/prod-server.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -64,7 +64,7 @@ Your existing `pages/`, `app/`, `next.config.js`, and `public/` directories work
|
|
|
64
64
|
|
|
65
65
|
Options: `-p / --port <port>`, `-H / --hostname <host>`, `--turbopack` (accepted, no-op).
|
|
66
66
|
|
|
67
|
-
`vinext deploy` options: `--preview`, `--name <name>`, `--skip-build`, `--dry-run`, `--experimental-tpr`.
|
|
67
|
+
`vinext deploy` options: `--preview`, `--env <name>`, `--name <name>`, `--skip-build`, `--dry-run`, `--experimental-tpr`.
|
|
68
68
|
|
|
69
69
|
`vinext init` options: `--port <port>` (default: 3001), `--skip-check`, `--force`.
|
|
70
70
|
|
|
@@ -96,7 +96,7 @@ Use `--force` to overwrite an existing `vite.config.ts`, or `--skip-check` to sk
|
|
|
96
96
|
|
|
97
97
|
## Why
|
|
98
98
|
|
|
99
|
-
Vite has become the default build tool for modern web frameworks — fast HMR, a clean plugin API, native ESM, and a growing ecosystem. With [`@vitejs/plugin-rsc`](https://github.com/vitejs/vite-plugin-rsc) adding React Server Components support, it's now possible to build a full RSC framework on Vite.
|
|
99
|
+
Vite has become the default build tool for modern web frameworks — fast HMR, a clean plugin API, native ESM, and a growing ecosystem. With [`@vitejs/plugin-rsc`](https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-rsc) adding React Server Components support, it's now possible to build a full RSC framework on Vite.
|
|
100
100
|
|
|
101
101
|
vinext is an experiment: can we reimplement the Next.js API surface on Vite, so that existing Next.js applications can run on a completely different toolchain? The answer, so far, is mostly yes — about 94% of the API surface works.
|
|
102
102
|
|
|
@@ -157,8 +157,11 @@ We track the public Next.js API surface and add support for new stable features.
|
|
|
157
157
|
|
|
158
158
|
```bash
|
|
159
159
|
vinext deploy
|
|
160
|
+
vinext deploy --env staging
|
|
160
161
|
```
|
|
161
162
|
|
|
163
|
+
Use `--env <name>` to target `wrangler.jsonc` `env.<name>`. `--preview` is shorthand for `--env preview`.
|
|
164
|
+
|
|
162
165
|
The deploy command also auto-detects and fixes common migration issues:
|
|
163
166
|
- Adds `"type": "module"` to package.json if missing
|
|
164
167
|
- Resolves tsconfig.json path aliases automatically (via `vite-tsconfig-paths`)
|
package/dist/cli.js
CHANGED
|
@@ -14,9 +14,10 @@
|
|
|
14
14
|
import vinext, { clientOutputConfig, clientTreeshakeConfig } from "./index.js";
|
|
15
15
|
import path from "node:path";
|
|
16
16
|
import fs from "node:fs";
|
|
17
|
+
import { pathToFileURL } from "node:url";
|
|
17
18
|
import { createRequire } from "node:module";
|
|
18
19
|
import { execSync } from "node:child_process";
|
|
19
|
-
import { deploy as runDeploy } from "./deploy.js";
|
|
20
|
+
import { deploy as runDeploy, parseDeployArgs } from "./deploy.js";
|
|
20
21
|
import { runCheck, formatReport } from "./check.js";
|
|
21
22
|
import { init as runInit } from "./init.js";
|
|
22
23
|
let _viteModule = null;
|
|
@@ -38,7 +39,10 @@ async function loadVite() {
|
|
|
38
39
|
// Fallback: use the Vite that ships with vinext (works for non-linked installs)
|
|
39
40
|
vitePath = "vite";
|
|
40
41
|
}
|
|
41
|
-
|
|
42
|
+
// On Windows, absolute paths must be file:// URLs for ESM import().
|
|
43
|
+
// The fallback ("vite") is a bare specifier and works as-is.
|
|
44
|
+
const viteUrl = vitePath === "vite" ? vitePath : pathToFileURL(vitePath).href;
|
|
45
|
+
const vite = (await import(/* @vite-ignore */ viteUrl));
|
|
42
46
|
_viteModule = vite;
|
|
43
47
|
return vite;
|
|
44
48
|
}
|
|
@@ -80,22 +84,6 @@ function parseArgs(args) {
|
|
|
80
84
|
}
|
|
81
85
|
return result;
|
|
82
86
|
}
|
|
83
|
-
/** Parse a numeric flag like --tpr-coverage 95 or --tpr-coverage=95. */
|
|
84
|
-
function parseNumericFlag(args, flag) {
|
|
85
|
-
const idx = args.indexOf(flag);
|
|
86
|
-
if (idx !== -1 && args[idx + 1]) {
|
|
87
|
-
const val = parseInt(args[idx + 1], 10);
|
|
88
|
-
if (!isNaN(val))
|
|
89
|
-
return val;
|
|
90
|
-
}
|
|
91
|
-
const eq = args.find((a) => a.startsWith(`${flag}=`));
|
|
92
|
-
if (eq) {
|
|
93
|
-
const val = parseInt(eq.split("=")[1], 10);
|
|
94
|
-
if (!isNaN(val))
|
|
95
|
-
return val;
|
|
96
|
-
}
|
|
97
|
-
return undefined;
|
|
98
|
-
}
|
|
99
87
|
// ─── Auto-configuration ───────────────────────────────────────────────────────
|
|
100
88
|
/**
|
|
101
89
|
* Build the Vite config automatically. If a vite.config.ts exists in the
|
|
@@ -266,41 +254,22 @@ async function lint() {
|
|
|
266
254
|
}
|
|
267
255
|
}
|
|
268
256
|
async function deployCommand() {
|
|
269
|
-
const parsed =
|
|
257
|
+
const parsed = parseDeployArgs(rawArgs);
|
|
270
258
|
if (parsed.help)
|
|
271
259
|
return printHelp("deploy");
|
|
272
260
|
await loadVite();
|
|
273
261
|
console.log(`\n vinext deploy (Vite ${getViteVersion()})\n`);
|
|
274
|
-
// Parse deploy-specific flags
|
|
275
|
-
const preview = rawArgs.includes("--preview");
|
|
276
|
-
const skipBuild = rawArgs.includes("--skip-build");
|
|
277
|
-
const dryRun = rawArgs.includes("--dry-run");
|
|
278
|
-
const experimentalTPR = rawArgs.includes("--experimental-tpr");
|
|
279
|
-
// Parse --name flag
|
|
280
|
-
let name;
|
|
281
|
-
const nameIdx = rawArgs.indexOf("--name");
|
|
282
|
-
if (nameIdx !== -1 && rawArgs[nameIdx + 1]) {
|
|
283
|
-
name = rawArgs[nameIdx + 1];
|
|
284
|
-
}
|
|
285
|
-
else {
|
|
286
|
-
const nameEq = rawArgs.find((a) => a.startsWith("--name="));
|
|
287
|
-
if (nameEq)
|
|
288
|
-
name = nameEq.split("=")[1];
|
|
289
|
-
}
|
|
290
|
-
// Parse TPR flags
|
|
291
|
-
const tprCoverage = parseNumericFlag(rawArgs, "--tpr-coverage");
|
|
292
|
-
const tprLimit = parseNumericFlag(rawArgs, "--tpr-limit");
|
|
293
|
-
const tprWindow = parseNumericFlag(rawArgs, "--tpr-window");
|
|
294
262
|
await runDeploy({
|
|
295
263
|
root: process.cwd(),
|
|
296
|
-
preview,
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
264
|
+
preview: parsed.preview,
|
|
265
|
+
env: parsed.env,
|
|
266
|
+
skipBuild: parsed.skipBuild,
|
|
267
|
+
dryRun: parsed.dryRun,
|
|
268
|
+
name: parsed.name,
|
|
269
|
+
experimentalTPR: parsed.experimentalTPR,
|
|
270
|
+
tprCoverage: parsed.tprCoverage,
|
|
271
|
+
tprLimit: parsed.tprLimit,
|
|
272
|
+
tprWindow: parsed.tprWindow,
|
|
304
273
|
});
|
|
305
274
|
}
|
|
306
275
|
async function check() {
|
|
@@ -389,7 +358,8 @@ function printHelp(cmd) {
|
|
|
389
358
|
- Deploys via wrangler
|
|
390
359
|
|
|
391
360
|
Options:
|
|
392
|
-
--preview Deploy to
|
|
361
|
+
--preview Deploy to preview environment (same as --env preview)
|
|
362
|
+
--env <name> Deploy using wrangler env.<name>
|
|
393
363
|
--name <name> Custom Worker name (default: from package.json)
|
|
394
364
|
--skip-build Skip the build step (use existing dist/)
|
|
395
365
|
--dry-run Generate config files without building or deploying
|
|
@@ -410,6 +380,7 @@ function printHelp(cmd) {
|
|
|
410
380
|
Examples:
|
|
411
381
|
vinext deploy Build and deploy to production
|
|
412
382
|
vinext deploy --preview Deploy to a preview URL
|
|
383
|
+
vinext deploy --env staging Deploy using wrangler env.staging
|
|
413
384
|
vinext deploy --dry-run See what files would be generated
|
|
414
385
|
vinext deploy --name my-app Deploy with a custom Worker name
|
|
415
386
|
vinext deploy --experimental-tpr Enable TPR during deploy
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;GAWG;AAEH,OAAO,MAAM,EAAE,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAC/E,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAmB5C,IAAI,WAAW,GAAsB,IAAI,CAAC;AAE1C;;;GAGG;AACH,KAAK,UAAU,QAAQ;IACrB,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC;IAEpC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAClC,IAAI,QAAgB,CAAC;IAErB,IAAI,CAAC;QACH,mEAAmE;QACnE,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;QACtE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,gFAAgF;QAChF,QAAQ,GAAG,MAAM,CAAC;IACpB,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAe,CAAC;IACvE,WAAW,GAAG,IAAI,CAAC;IACnB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,cAAc;IACrB,OAAO,WAAW,EAAE,OAAO,IAAI,SAAS,CAAC;AAC3C,CAAC;AAED,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,kFAAkF;AAElF,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAChC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAUtC,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACrC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;QACrB,CAAC;aAAM,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;YACjC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,oCAAoC;QAC/D,CAAC;aAAM,IAAI,GAAG,KAAK,sBAAsB,EAAE,CAAC;YAC1C,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,QAAQ;QACtC,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC5C,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACrC,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChD,CAAC;aAAM,IAAI,GAAG,KAAK,YAAY,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAChD,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9B,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,wEAAwE;AACxE,SAAS,gBAAgB,CAAC,IAAc,EAAE,IAAY;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;IAC9B,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;IACtD,IAAI,EAAE,EAAE,CAAC;QACP,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;IAC9B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,iFAAiF;AAEjF;;;;GAIG;AACH,SAAS,SAAS;IAChB,OAAO,CACL,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;QAC9C,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CACtD,CAAC;AACJ,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,CACL,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC;QACzD,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC;QACzD,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAC3D,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,YAAqC,EAAE;IAC9D,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;IAElC,2EAA2E;IAC3E,qEAAqE;IACrE,iEAAiE;IACjE,uEAAuE;IACvE,IAAI,SAAS,EAAE,CAAC;QACd,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE;YACnB,GAAG,SAAS;SACb,CAAC;IACJ,CAAC;IAED,8CAA8C;IAC9C,oEAAoE;IACpE,iDAAiD;IACjD,MAAM,MAAM,GAA4B;QACtC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE;QACnB,UAAU,EAAE,KAAK;QACjB,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC;QACnB,mEAAmE;QACnE,mEAAmE;QACnE,gDAAgD;QAChD,OAAO,EAAE;YACP,MAAM,EAAE;gBACN,OAAO;gBACP,WAAW;gBACX,mBAAmB;gBACnB,uBAAuB;aACxB;SACF;QACD,GAAG,SAAS;KACb,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,iFAAiF;AAEjF,KAAK,UAAU,GAAG;IAChB,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,MAAM,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;IAEzC,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC;IAE9B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;IACjC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,IAAI,WAAW,CAAC;IAE5C,OAAO,CAAC,GAAG,CAAC,yBAAyB,cAAc,EAAE,KAAK,CAAC,CAAC;IAE5D,MAAM,MAAM,GAAG,eAAe,CAAC;QAC7B,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;KACvB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;IACtB,MAAM,CAAC,SAAS,EAAE,CAAC;AACrB,CAAC;AAED,KAAK,UAAU,QAAQ;IACrB,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,MAAM,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC;IAE3C,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC;IAE9B,OAAO,CAAC,GAAG,CAAC,2BAA2B,cAAc,EAAE,KAAK,CAAC,CAAC;IAE9D,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAE1B,IAAI,KAAK,EAAE,CAAC;QACV,iEAAiE;QACjE,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,oCAAoC;QACpC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAE9B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,MAAM,IAAI,CAAC,KAAK,CAAC;YACf,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC;YACnB,KAAK,EAAE;gBACL,MAAM,EAAE,aAAa;gBACrB,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,IAAI;gBACjB,aAAa,EAAE;oBACb,KAAK,EAAE,6BAA6B;oBACpC,MAAM,EAAE,kBAAkB;oBAC1B,SAAS,EAAE,qBAAqB;iBACjC;aACF;SACF,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,MAAM,IAAI,CAAC,KAAK,CAAC;YACf,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC;YACnB,KAAK,EAAE;gBACL,MAAM,EAAE,aAAa;gBACrB,GAAG,EAAE,6BAA6B;gBAClC,aAAa,EAAE;oBACb,MAAM,EAAE;wBACN,cAAc,EAAE,UAAU;qBAC3B;iBACF;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAC;AAC1F,CAAC;AAED,KAAK,UAAU,KAAK;IAClB,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,MAAM,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC;IAE3C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;IACrE,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,IAAI,SAAS,CAAC;IAE1C,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,KAAK,CAAC,CAAC;IAElD,MAAM,EAAE,eAAe,EAAE,GAAG,CAAC,MAAM,MAAM;IACvC,kBAAkB,CAAC,yBAAyB,CAC7C,CAMA,CAAC;IAEF,MAAM,eAAe,CAAC;QACpB,IAAI;QACJ,IAAI;QACJ,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC;KAC5C,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,MAAM,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;IAE1C,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAEjC,+CAA+C;IAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,SAAS,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAClF,MAAM,SAAS,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAElF,kDAAkD;IAClD,MAAM,iBAAiB,GACrB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QAC/C,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC7C,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QAC9C,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;QACjD,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,IAAI,SAAS,IAAI,iBAAiB,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;YACvD,QAAQ,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACtD,CAAC;aAAM,IAAI,SAAS,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAChC,QAAQ,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACtD,CAAC;aAAM,IAAI,SAAS,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAChC,QAAQ,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CACT,kDAAkD;gBAChD,gDAAgD;gBAChD,YAAY;gBACZ,6BAA6B,CAChC,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa;IAC1B,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,MAAM,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAC;IAE5C,MAAM,QAAQ,EAAE,CAAC;IACjB,OAAO,CAAC,GAAG,CAAC,4BAA4B,cAAc,EAAE,KAAK,CAAC,CAAC;IAE/D,8BAA8B;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IAE/D,oBAAoB;IACpB,IAAI,IAAwB,CAAC;IAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,OAAO,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC;QAC3C,IAAI,GAAG,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;QAC5D,IAAI,MAAM;YAAE,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,kBAAkB;IAClB,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAE5D,MAAM,SAAS,CAAC;QACd,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE;QACnB,OAAO;QACP,SAAS;QACT,MAAM;QACN,IAAI;QACJ,eAAe;QACf,WAAW;QACX,QAAQ;QACR,SAAS;KACV,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,KAAK;IAClB,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,MAAM,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC;IAE3C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAEvC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,KAAK,UAAU,WAAW;IACxB,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,MAAM,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;IAE1C,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAEjC,4BAA4B;IAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;IACjC,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAE1C,MAAM,OAAO,CAAC;QACZ,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE;QACnB,IAAI;QACJ,SAAS;QACT,KAAK;KACN,CAAC,CAAC;AACL,CAAC;AAED,iFAAiF;AAEjF,SAAS,SAAS,CAAC,GAAY;IAC7B,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;CAUf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;CAUf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;CAYf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;CAWf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;CAoBf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;CAUf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC;YACF,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BlB,CAAC,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,IAAI,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;IAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;IACzD,SAAS,EAAE,CAAC;IACZ,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,QAAQ,OAAO,EAAE,CAAC;IAChB,KAAK,KAAK;QACR,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YAChB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,MAAM;IAER,KAAK,OAAO;QACV,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YACrB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,MAAM;IAER,KAAK,OAAO;QACV,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YAClB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,MAAM;IAER,KAAK,QAAQ;QACX,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YAC1B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,MAAM;IAER,KAAK,MAAM;QACT,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YACxB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,MAAM;IAER,KAAK,OAAO;QACV,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YAClB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,MAAM;IAER,KAAK,MAAM;QACT,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YACjB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,MAAM;IAER;QACE,OAAO,CAAC,KAAK,CAAC,wBAAwB,OAAO,IAAI,CAAC,CAAC;QACnD,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC","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 { createRequire } from \"node:module\";\nimport { execSync } from \"node:child_process\";\nimport { deploy as runDeploy } from \"./deploy.js\";\nimport { runCheck, formatReport } from \"./check.js\";\nimport { init as runInit } from \"./init.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 const vite = (await import(/* @vite-ignore */ vitePath)) 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 = \"0.0.1\";\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/** Parse a numeric flag like --tpr-coverage 95 or --tpr-coverage=95. */\nfunction parseNumericFlag(args: string[], flag: string): number | undefined {\n const idx = args.indexOf(flag);\n if (idx !== -1 && args[idx + 1]) {\n const val = parseInt(args[idx + 1], 10);\n if (!isNaN(val)) return val;\n }\n const eq = args.find((a) => a.startsWith(`${flag}=`));\n if (eq) {\n const val = parseInt(eq.split(\"=\")[1], 10);\n if (!isNaN(val)) return val;\n }\n return undefined;\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 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 const vite = await loadVite();\n\n console.log(`\\n vinext build (Vite ${getViteVersion()})\\n`);\n\n const isApp = hasAppDir();\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 const appRoot = process.cwd();\n\n console.log(\" Building client...\");\n await vite.build({\n root: appRoot,\n plugins: [vinext()],\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({\n root: appRoot,\n plugins: [vinext()],\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 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 execSync(\"npx eslint .\", { cwd, stdio: \"inherit\" });\n } else if (hasOxlint) {\n console.log(\" Using oxlint\\n\");\n execSync(\"npx oxlint .\", { cwd, stdio: \"inherit\" });\n } else if (hasEslint) {\n console.log(\" Using eslint\\n\");\n execSync(\"npx eslint .\", { cwd, stdio: \"inherit\" });\n } else {\n console.log(\n \" No linter found. Install eslint or oxlint:\\n\\n\" +\n \" npm install -D eslint eslint-config-next\\n\" +\n \" # or\\n\" +\n \" npm install -D 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 = parseArgs(rawArgs);\n if (parsed.help) return printHelp(\"deploy\");\n\n await loadVite();\n console.log(`\\n vinext deploy (Vite ${getViteVersion()})\\n`);\n\n // Parse deploy-specific flags\n const preview = rawArgs.includes(\"--preview\");\n const skipBuild = rawArgs.includes(\"--skip-build\");\n const dryRun = rawArgs.includes(\"--dry-run\");\n const experimentalTPR = rawArgs.includes(\"--experimental-tpr\");\n\n // Parse --name flag\n let name: string | undefined;\n const nameIdx = rawArgs.indexOf(\"--name\");\n if (nameIdx !== -1 && rawArgs[nameIdx + 1]) {\n name = rawArgs[nameIdx + 1];\n } else {\n const nameEq = rawArgs.find((a) => a.startsWith(\"--name=\"));\n if (nameEq) name = nameEq.split(\"=\")[1];\n }\n\n // Parse TPR flags\n const tprCoverage = parseNumericFlag(rawArgs, \"--tpr-coverage\");\n const tprLimit = parseNumericFlag(rawArgs, \"--tpr-limit\");\n const tprWindow = parseNumericFlag(rawArgs, \"--tpr-window\");\n\n await runDeploy({\n root: process.cwd(),\n preview,\n skipBuild,\n dryRun,\n name,\n experimentalTPR,\n tprCoverage,\n tprLimit,\n 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 a preview environment\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 --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 { execSync } from \"node:child_process\";\nimport { deploy as runDeploy, parseDeployArgs } from \"./deploy.js\";\nimport { runCheck, formatReport } from \"./check.js\";\nimport { init as runInit } from \"./init.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 = \"0.0.1\";\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 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 const vite = await loadVite();\n\n console.log(`\\n vinext build (Vite ${getViteVersion()})\\n`);\n\n const isApp = hasAppDir();\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 const appRoot = process.cwd();\n\n console.log(\" Building client...\");\n await vite.build({\n root: appRoot,\n plugins: [vinext()],\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({\n root: appRoot,\n plugins: [vinext()],\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 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 execSync(\"npx eslint .\", { cwd, stdio: \"inherit\" });\n } else if (hasOxlint) {\n console.log(\" Using oxlint\\n\");\n execSync(\"npx oxlint .\", { cwd, stdio: \"inherit\" });\n } else if (hasEslint) {\n console.log(\" Using eslint\\n\");\n execSync(\"npx eslint .\", { cwd, stdio: \"inherit\" });\n } else {\n console.log(\n \" No linter found. Install eslint or oxlint:\\n\\n\" +\n \" npm install -D eslint eslint-config-next\\n\" +\n \" # or\\n\" +\n \" npm install -D 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/deploy.d.ts
CHANGED
|
@@ -19,6 +19,8 @@ export interface DeployOptions {
|
|
|
19
19
|
root: string;
|
|
20
20
|
/** Deploy to preview environment (default: production) */
|
|
21
21
|
preview?: boolean;
|
|
22
|
+
/** Wrangler environment name from wrangler.jsonc env.<name> */
|
|
23
|
+
env?: string;
|
|
22
24
|
/** Custom project name for the Worker */
|
|
23
25
|
name?: string;
|
|
24
26
|
/** Skip the build step (assume already built) */
|
|
@@ -34,6 +36,18 @@ export interface DeployOptions {
|
|
|
34
36
|
/** TPR: analytics lookback window in hours (default: 24) */
|
|
35
37
|
tprWindow?: number;
|
|
36
38
|
}
|
|
39
|
+
export declare function parseDeployArgs(args: string[]): {
|
|
40
|
+
help: boolean;
|
|
41
|
+
preview: boolean;
|
|
42
|
+
env: string | undefined;
|
|
43
|
+
name: string | undefined;
|
|
44
|
+
skipBuild: boolean;
|
|
45
|
+
dryRun: boolean;
|
|
46
|
+
experimentalTPR: boolean;
|
|
47
|
+
tprCoverage: number | undefined;
|
|
48
|
+
tprLimit: number | undefined;
|
|
49
|
+
tprWindow: number | undefined;
|
|
50
|
+
};
|
|
37
51
|
interface ProjectInfo {
|
|
38
52
|
root: string;
|
|
39
53
|
isAppRouter: boolean;
|
|
@@ -75,13 +89,26 @@ interface MissingDep {
|
|
|
75
89
|
name: string;
|
|
76
90
|
version: string;
|
|
77
91
|
}
|
|
78
|
-
|
|
92
|
+
/**
|
|
93
|
+
* Check if a package is resolvable from a given root directory using
|
|
94
|
+
* Node's module resolution (createRequire). Handles hoisting, pnpm
|
|
95
|
+
* symlinks, monorepos, and Yarn PnP correctly.
|
|
96
|
+
*/
|
|
97
|
+
export declare function isPackageResolvable(root: string, packageName: string): boolean;
|
|
98
|
+
export declare function getMissingDeps(info: ProjectInfo,
|
|
99
|
+
/** Override for testing — defaults to `isPackageResolvable` */
|
|
100
|
+
_isResolvable?: (root: string, pkg: string) => boolean): MissingDep[];
|
|
79
101
|
interface GeneratedFile {
|
|
80
102
|
path: string;
|
|
81
103
|
content: string;
|
|
82
104
|
description: string;
|
|
83
105
|
}
|
|
84
106
|
export declare function getFilesToGenerate(info: ProjectInfo): GeneratedFile[];
|
|
107
|
+
export interface WranglerDeployArgs {
|
|
108
|
+
args: string[];
|
|
109
|
+
env: string | undefined;
|
|
110
|
+
}
|
|
111
|
+
export declare function buildWranglerDeployArgs(options: Pick<DeployOptions, "preview" | "env">): WranglerDeployArgs;
|
|
85
112
|
export declare function deploy(options: DeployOptions): Promise<void>;
|
|
86
113
|
export {};
|
|
87
114
|
//# sourceMappingURL=deploy.d.ts.map
|
package/dist/deploy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"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"}
|
package/dist/deploy.js
CHANGED
|
@@ -15,10 +15,42 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import fs from "node:fs";
|
|
17
17
|
import path from "node:path";
|
|
18
|
-
import {
|
|
18
|
+
import { createRequire } from "node:module";
|
|
19
|
+
import { execFileSync, execSync } from "node:child_process";
|
|
20
|
+
import { parseArgs as nodeParseArgs } from "node:util";
|
|
19
21
|
import { createBuilder, build } from "vite";
|
|
20
22
|
import { ensureESModule as _ensureESModule, renameCJSConfigs as _renameCJSConfigs, detectPackageManager as _detectPackageManager, } from "./utils/project.js";
|
|
23
|
+
import { getReactUpgradeDeps } from "./init.js";
|
|
21
24
|
import { runTPR } from "./cloudflare/tpr.js";
|
|
25
|
+
// ─── CLI arg parsing (uses Node.js util.parseArgs) ──────────────────────────
|
|
26
|
+
/** Deploy command flag definitions for util.parseArgs. */
|
|
27
|
+
const deployArgOptions = {
|
|
28
|
+
help: { type: "boolean", short: "h", default: false },
|
|
29
|
+
preview: { type: "boolean", default: false },
|
|
30
|
+
env: { type: "string" },
|
|
31
|
+
name: { type: "string" },
|
|
32
|
+
"skip-build": { type: "boolean", default: false },
|
|
33
|
+
"dry-run": { type: "boolean", default: false },
|
|
34
|
+
"experimental-tpr": { type: "boolean", default: false },
|
|
35
|
+
"tpr-coverage": { type: "string" },
|
|
36
|
+
"tpr-limit": { type: "string" },
|
|
37
|
+
"tpr-window": { type: "string" },
|
|
38
|
+
};
|
|
39
|
+
export function parseDeployArgs(args) {
|
|
40
|
+
const { values } = nodeParseArgs({ args, options: deployArgOptions, strict: true });
|
|
41
|
+
return {
|
|
42
|
+
help: values.help,
|
|
43
|
+
preview: values.preview,
|
|
44
|
+
env: values.env?.trim() || undefined,
|
|
45
|
+
name: values.name?.trim() || undefined,
|
|
46
|
+
skipBuild: values["skip-build"],
|
|
47
|
+
dryRun: values["dry-run"],
|
|
48
|
+
experimentalTPR: values["experimental-tpr"],
|
|
49
|
+
tprCoverage: values["tpr-coverage"] ? parseInt(values["tpr-coverage"], 10) : undefined,
|
|
50
|
+
tprLimit: values["tpr-limit"] ? parseInt(values["tpr-limit"], 10) : undefined,
|
|
51
|
+
tprWindow: values["tpr-window"] ? parseInt(values["tpr-window"], 10) : undefined,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
22
54
|
// ─── Detection ───────────────────────────────────────────────────────────────
|
|
23
55
|
export function detectProject(root) {
|
|
24
56
|
const hasApp = fs.existsSync(path.join(root, "app")) ||
|
|
@@ -442,7 +474,24 @@ export default defineConfig({
|
|
|
442
474
|
});
|
|
443
475
|
`;
|
|
444
476
|
}
|
|
445
|
-
|
|
477
|
+
/**
|
|
478
|
+
* Check if a package is resolvable from a given root directory using
|
|
479
|
+
* Node's module resolution (createRequire). Handles hoisting, pnpm
|
|
480
|
+
* symlinks, monorepos, and Yarn PnP correctly.
|
|
481
|
+
*/
|
|
482
|
+
export function isPackageResolvable(root, packageName) {
|
|
483
|
+
try {
|
|
484
|
+
const req = createRequire(path.join(root, "package.json"));
|
|
485
|
+
req.resolve(packageName);
|
|
486
|
+
return true;
|
|
487
|
+
}
|
|
488
|
+
catch {
|
|
489
|
+
return false;
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
export function getMissingDeps(info,
|
|
493
|
+
/** Override for testing — defaults to `isPackageResolvable` */
|
|
494
|
+
_isResolvable = isPackageResolvable) {
|
|
446
495
|
const missing = [];
|
|
447
496
|
if (!info.hasCloudflarePlugin) {
|
|
448
497
|
missing.push({ name: "@cloudflare/vite-plugin", version: "latest" });
|
|
@@ -453,6 +502,12 @@ export function getMissingDeps(info) {
|
|
|
453
502
|
if (info.isAppRouter && !info.hasRscPlugin) {
|
|
454
503
|
missing.push({ name: "@vitejs/plugin-rsc", version: "latest" });
|
|
455
504
|
}
|
|
505
|
+
if (info.isAppRouter) {
|
|
506
|
+
// react-server-dom-webpack must be resolvable from the project root for Vite.
|
|
507
|
+
if (!_isResolvable(info.root, "react-server-dom-webpack")) {
|
|
508
|
+
missing.push({ name: "react-server-dom-webpack", version: "latest" });
|
|
509
|
+
}
|
|
510
|
+
}
|
|
456
511
|
if (info.hasMDX) {
|
|
457
512
|
// Check if @mdx-js/rollup is already installed
|
|
458
513
|
const hasMdxRollup = fs.existsSync(path.join(info.root, "node_modules", "@mdx-js", "rollup"));
|
|
@@ -532,19 +587,31 @@ async function runBuild(info) {
|
|
|
532
587
|
await build({ root: info.root });
|
|
533
588
|
}
|
|
534
589
|
}
|
|
535
|
-
|
|
536
|
-
|
|
590
|
+
export function buildWranglerDeployArgs(options) {
|
|
591
|
+
const args = ["deploy"];
|
|
592
|
+
const env = options.env || (options.preview ? "preview" : undefined);
|
|
593
|
+
if (env) {
|
|
594
|
+
args.push("--env", env);
|
|
595
|
+
}
|
|
596
|
+
return { args, env };
|
|
597
|
+
}
|
|
598
|
+
function runWranglerDeploy(root, options) {
|
|
537
599
|
const wranglerBin = path.join(root, "node_modules", ".bin", "wrangler");
|
|
538
600
|
const execOpts = {
|
|
539
601
|
cwd: root,
|
|
540
602
|
stdio: "pipe",
|
|
541
603
|
encoding: "utf-8",
|
|
542
604
|
};
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
605
|
+
const { args, env } = buildWranglerDeployArgs(options);
|
|
606
|
+
if (env) {
|
|
607
|
+
console.log(`\n Deploying to env: ${env}...`);
|
|
608
|
+
}
|
|
609
|
+
else {
|
|
610
|
+
console.log("\n Deploying to production...");
|
|
611
|
+
}
|
|
612
|
+
// Use execFileSync to avoid shell injection — args are passed as an array,
|
|
613
|
+
// never interpolated into a shell command string.
|
|
614
|
+
const output = execFileSync(wranglerBin, args, execOpts);
|
|
548
615
|
// Parse the deployed URL from wrangler output
|
|
549
616
|
// Wrangler prints: "Published <name> (version_id)\n https://<name>.<subdomain>.workers.dev"
|
|
550
617
|
const urlMatch = output.match(/https:\/\/[^\s]+\.workers\.dev[^\s]*/);
|
|
@@ -576,6 +643,15 @@ export async function deploy(options) {
|
|
|
576
643
|
console.log(` Router: ${info.isAppRouter ? "App Router" : "Pages Router"}`);
|
|
577
644
|
console.log(` ISR: ${info.hasISR ? "detected" : "none"}`);
|
|
578
645
|
// Step 2: Check and install missing dependencies
|
|
646
|
+
// For App Router: upgrade React first if needed for react-server-dom-webpack compatibility
|
|
647
|
+
if (info.isAppRouter) {
|
|
648
|
+
const reactUpgrade = getReactUpgradeDeps(root);
|
|
649
|
+
if (reactUpgrade.length > 0) {
|
|
650
|
+
const installCmd = detectPackageManager(root).replace(/ -D$/, "");
|
|
651
|
+
console.log(` Upgrading ${reactUpgrade.map(d => d.replace(/@latest$/, "")).join(", ")}...`);
|
|
652
|
+
execSync(`${installCmd} ${reactUpgrade.join(" ")}`, { cwd: root, stdio: "inherit" });
|
|
653
|
+
}
|
|
654
|
+
}
|
|
579
655
|
const missingDeps = getMissingDeps(info);
|
|
580
656
|
if (missingDeps.length > 0) {
|
|
581
657
|
console.log();
|
|
@@ -628,7 +704,10 @@ export async function deploy(options) {
|
|
|
628
704
|
}
|
|
629
705
|
}
|
|
630
706
|
// Step 7: Deploy via wrangler
|
|
631
|
-
const url = runWranglerDeploy(root,
|
|
707
|
+
const url = runWranglerDeploy(root, {
|
|
708
|
+
preview: options.preview ?? false,
|
|
709
|
+
env: options.env,
|
|
710
|
+
});
|
|
632
711
|
console.log("\n ─────────────────────────────────────────");
|
|
633
712
|
console.log(` Deployed to: ${url}`);
|
|
634
713
|
console.log(" ─────────────────────────────────────────\n");
|