refactor(cli): parse JS command arguments with clap - #2523
Conversation
✅ Deploy Preview for viteplus-preview ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
c616858 to
86300af
Compare
CLI artifact sizes (
|
| Artifact | Format | Base | PR | Change |
|---|---|---|---|---|
packages/cli/dist |
Directory total | 1.61 MiB | 1.59 MiB | -18.84 KiB (-1.14%) |
packages/core/dist |
Directory total | 3.91 MiB | 3.91 MiB | 0 B (0.00%) |
| Combined package dist | Directory total | 5.52 MiB | 5.50 MiB | -18.84 KiB (-0.33%) |
vp (Linux x64) |
Binary | 10.73 MiB | 10.74 MiB | +12.00 KiB (+0.11%) |
vp (Linux x64) |
gzip -9 | 4.64 MiB | 4.64 MiB | +5.23 KiB (+0.11%) |
| NAPI (Linux x64) | Binary | 32.20 MiB | 32.39 MiB | +196.00 KiB (+0.59%) |
| NAPI (Linux x64) | gzip -9 | 12.69 MiB | 12.76 MiB | +70.03 KiB (+0.54%) |
vp (macOS ARM64) |
Binary | 8.02 MiB | 8.03 MiB | +16.16 KiB (+0.20%) |
vp (macOS ARM64) |
gzip -9 | 4.05 MiB | 4.05 MiB | +3.74 KiB (+0.09%) |
| NAPI (macOS ARM64) | Binary | 39.79 MiB | 39.93 MiB | +145.27 KiB (+0.36%) |
| NAPI (macOS ARM64) | gzip -9 | 16.98 MiB | 17.05 MiB | +66.18 KiB (+0.38%) |
vp (Windows x64) |
Binary | 8.63 MiB | 8.63 MiB | +7.50 KiB (+0.08%) |
vp (Windows x64) |
gzip -9 | 3.76 MiB | 3.77 MiB | +6.57 KiB (+0.17%) |
| NAPI (Windows x64) | Binary | 27.03 MiB | 27.20 MiB | +172.50 KiB (+0.62%) |
| NAPI (Windows x64) | gzip -9 | 10.76 MiB | 10.82 MiB | +65.98 KiB (+0.60%) |
| Trampoline (Windows x64) | Binary | 14.00 KiB | 14.00 KiB | 0 B (0.00%) |
| Trampoline (Windows x64) | gzip -9 | 7.09 KiB | 7.09 KiB | 0 B (0.00%) |
| Installer (Windows x64) | Binary | 4.50 MiB | 4.50 MiB | 0 B (0.00%) |
| Installer (Windows x64) | gzip -9 | 2.11 MiB | 2.11 MiB | 0 B (0.00%) |
7753568 to
6ea10b8
Compare
6ea10b8 to
61729ba
Compare
|
@codex review |
|
Codex Review: Didn't find any major issues. Keep it up! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
Registry bridge build (
|
| Package | Version |
|---|---|
vite-plus |
0.0.0-commit.fd332923578a5349f99ca6441856b6c80d94f058 |
@voidzero-dev/vite-plus-core |
0.0.0-commit.fd332923578a5349f99ca6441856b6c80d94f058 |
Install the Vite+ CLI built from this commit, then migrate a project:
# macOS / Linux
curl -fsSL https://github.com/@raw/voidzero-dev/vite-plus/fd332923578a5349f99ca6441856b6c80d94f058/packages/cli/install.sh | VP_PR_VERSION=2523 bash# Windows (PowerShell)
$env:VP_PR_VERSION="2523"; irm https://raw.githubusercontent.com/voidzero-dev/vite-plus/fd332923578a5349f99ca6441856b6c80d94f058/packages/cli/install.ps1 | iexOr download the standalone Windows installer built from this commit:
| Architecture | Installer |
|---|---|
| x64 | vp-setup-x86_64-pc-windows-msvc.exe |
| Arm64 | vp-setup-aarch64-pc-windows-msvc.exe |
GitHub requires you to sign in and downloads each installer as a ZIP artifact. Extract vp-setup.exe, then run it against this preview build:
.\vp-setup.exe --version "0.0.0-commit.fd332923578a5349f99ca6441856b6c80d94f058" --registry "https://registry-bridge.viteplus.dev/"After installing, upgrade the current project's vite-plus to this test build with:
vp migrateOr point your package manager at the bridge registry https://registry-bridge.viteplus.dev/:
| Package manager | Registry config |
|---|---|
| npm / pnpm / Bun | .npmrc: registry=https://registry-bridge.viteplus.dev/ |
| Yarn (v2+) | .yarnrc.yml: npmRegistryServer: "https://registry-bridge.viteplus.dev/" |
Then pin the build (vite aliases to vite-plus-core; pnpm can use a catalog, npm an overrides entry):
{
"devDependencies": {
"vite-plus": "0.0.0-commit.fd332923578a5349f99ca6441856b6c80d94f058",
"vite": "npm:@voidzero-dev/vite-plus-core@0.0.0-commit.fd332923578a5349f99ca6441856b6c80d94f058"
}
}
🐳 Docker preview imageBuilt from this PR's registry bridge build:
# remove any stale local copy from a previous run, then pull fresh
docker rmi ghcr.io/voidzero-dev/vite-plus:pr-2523 2>/dev/null; docker pull ghcr.io/voidzero-dev/vite-plus:pr-2523Quick check: docker run --rm ghcr.io/voidzero-dev/vite-plus:pr-2523 vp --versionSee docs/guide/docker.md for usage. |
`vp env` now manages Node.js and package-manager versions together. This release also fixes TanStack Start routing and stale Vitest aliases. ### Breaking Changes #### Package-manager setup Vite+ replaces Corepack with managed `npm`, `pnpm`, `yarn`, and `bun` commands. It removes the `corepack` shim and legacy global package-manager installations ([#2391](#2391)), by @liangmiQwQ. Replace Corepack setup commands in shell profiles, CI jobs, and Dockerfiles: | Previous setup | Replacement | | --- | --- | | `corepack enable` | `vp env setup` | | `vp install -g pnpm@<version>` | `vp env default pnpm@<version>` | | `vp install -g yarn@<version>` | `vp env default yarn@<version>` | | `vp install -g bun@<version>` | `vp env default bun@<version>` | | `vp install -g corepack` | Use the managed package-manager commands directly | Use `vp env pin <manager>@<version>` to set a project version. #### `vp env` command scope and JSON output Unscoped `vp env` commands now operate on Node.js and package managers. Package managers support independent defaults, project pins, session overrides, and installation commands ([#2398](#2398)), by @liangmiQwQ. Add `node` to limit an operation to Node.js, for example, `vp env off node` or `vp env unpin node`. Bare versions, such as `vp env default 22.19.0`, still select Node.js. Update scripts that read JSON output: | Command | New output structure | | --- | --- | | `vp env current --json` | `node` and `package_manager` objects | | `vp env list --json`, `vp env list-remote --json` | `node` and `package_managers` groups | See the [environment guide](https://viteplus.dev/guide/env). #### `vp pack` migration to `tsdown` `0.23` `vp pack` now uses `tsdown` `0.23`, which removes deprecated options and changes defaults ([#2614](#2614)), by @fengmk2. 1. Run `vp migrate` to update supported static configurations and package scripts, including projects that already use Vite+. 2. Check migration warnings in `vite.config.*`, `tsdown.config.*`, and `package.json`. 3. Update dynamic configurations manually. Arrays built with `.map()` require manual changes, even when migration reports no warning. 4. Run `vp pack` to check the result. | Previous option | Replacement | | --- | --- | | `bundle: false` | `unbundle: true` | | `outExtension` | `outExtensions` | | `publicDir` / `--public-dir` | `copy` / `--copy` | | `removeNodeProtocol: true` | `nodeProtocol: 'strip'` | | `injectStyle` | `css.inject` | | `inlineOnly` / `deps.onlyAllowBundle` | `deps.onlyBundle` | | `noExternal` | `deps.alwaysBundle` | | `skipNodeModulesBundle: true` / `deps.skipNodeModulesBundle: true` | `deps.neverBundle: true` | | `dts.tsgo: true` / `dts.oxc: true` | `dts.generator: 'tsgo'` / `dts.generator: 'oxc'` | Migration preserves the previous defaults for dependency resolution and ATTW. `tsdown` no longer supports Node.js `25`. Use Node.js `^22.18.0`, `^24.11.0`, or `>=26.0.0`. The programmatic `build()` API now returns `{ bundles, watch }`. See the [complete migration guide](https://github.com/rolldown/tsdown/releases/tag/v0.23.0) for declaration and TypeScript module-resolution changes. #### CLI argument validation `vp staged`, `vp config`, `vp hooks`, `vp migrate`, and `vp create` now reject unsupported options and extra positional arguments ([#2523](#2523)), by @fengmk2. Remove unsupported arguments from scripts. For example, replace `vp config --hooks-only` with `vp config --no-agent`. ### Highlights - Fix TanStack Start HTTP `404` responses caused by separate Vite runtime copies ([#2617](#2617)), by @fengmk2. - Reduce the Windows `vp-shim.exe` size from `214 KiB` to `14 KiB` ([#2466](#2466)), by @fengmk2. - Add `vp check --quiet` to hide lint warning diagnostics while retaining errors and summary counts ([#2593](#2593)), by @RSS1102. ### Features - Add `vp sync-versions --json` so automation can request dependency alignment plans from manifest snapshots without changing project files ([#2600](#2600)), by @afonsojramos. - Make `vp create --git` suggest an initial commit command after Git initialization ([#2581](#2581)), by @fengmk2. - Make `vp migrate` replace frozen `voidzero-dev/setup-vp@v1` workflow references with the supported version pin ([#2540](#2540)), by @fengmk2. - Upgrade `rolldown` from `1.2.5` to `1.2.7`, `tsdown` from `0.22.14` to `0.23.0`, and Oxc from `0.146.0` to `0.148.0`. Upgrade `oxlint` from `1.79.0` to `1.81.0` and `oxfmt` from `0.64.0` to `0.66.0`. These versions can flag code that passed before. Run `vp fmt` after upgrading if CI runs `vp check` ([#2580](#2580), [#2613](#2613)), by @voidzero-guard[bot]. ### Fixes & Enhancements - Resolve package-manager versions without rewriting `package.json`. Use `vp env pin` or `vp env unpin` to change project declarations explicitly ([#2399](#2399)), by @liangmiQwQ. - Let `vp migrate` repair stale `vitest` aliases that previously prevented the CLI from starting ([#2605](#2605)), by @fengmk2. - Keep Vite DevTools within the version ranges supported by the bundled Vite ([#2559](#2559)), by @fengmk2. - Keep automatic Vitest upgrades on the supported `4.x` major ([#2612](#2612)), by @fengmk2. - Remove a deprecated `tsdown` option from the prompts package build ([#2597](#2597)), by @jong-kyung. ### Refactor - Use the updated `which` dependency to resolve relative `PATH` entries ([#2583](#2583)), by @RSS1102. - Remove the unused `async-trait` annotation from `JsRuntimeProvider` ([#2538](#2538)), by @jong-kyung. ### Docs - Add Azure Pipelines setup instructions ([#2553](#2553)), by @naokihaba. - Correct Zed Oxc formatter settings and include JSX and TSX ([#2592](#2592)), by @joschuba. - Add Wrangler deployment configuration for the documentation site ([#2596](#2596)), by @mdong1909. - Explain conflicts between pnpm and Vite+ runtime management, including the `runtimeOnFail` setting ([#2620](#2620)), by @liangmiQwQ. ### Chore - Run CLI snapshots without published release packages ([#2625](#2625)), by @fengmk2. - Update the release-manager skill with package-install checks, changelog guidance, and announcement handling ([#2548](#2548)), by @fengmk2. - Wait for npm dependencies to become available before publishing dependent release packages ([#2601](#2601)), by @fengmk2. - Remove old Docker preview images ([#2539](#2539)), by @fengmk2. - Stabilize external-tool snapshots and isolate npm network cases ([#2577](#2577), [#2604](#2604)), by @fengmk2. - Avoid unreliable Fish PPA setup in CI ([#2560](#2560)), by @fengmk2. - Update the `vinext` fixture to an upstream fix ([#2571](#2571)), by @jong-kyung. - Stabilize the pnpm snapshot and Nuxt build in CI ([#2591](#2591)), by @voidzero-guard[bot]. - Pin pnpm in project-creation build-approval fixtures ([#2616](#2616)), by @liangmiQwQ. - Remove unused documentation components, assets, and the typewriter dependency ([#2550](#2550), [#2562](#2562)), by @jong-kyung. - Remove duplicate `tempfile` dependencies, an unused runtime helper, and unused error variants. Update the `unit_bindings` lint name ([#2555](#2555), [#2558](#2558), [#2566](#2566), [#2567](#2567)), by @jong-kyung. - Update GitHub Actions dependencies, including `actions/setup-node` `v7` ([#2544](#2544), [#2545](#2545), [#2582](#2582), [#2618](#2618)), by @renovate[bot]. - Update `crate-ci/typos` through `v1.50.1` ([#2584](#2584), [#2589](#2589), [#2609](#2609)), by @renovate[bot]. - Update repository pnpm to `11.24.0` ([#2590](#2590)), by @renovate[bot]. - Update `voidzero-dev/setup-vp` to `v1.19.0` ([#2619](#2619)), by @renovate[bot]. ### Bundled Versions | Tool | Version | Source | | --- | --- | --- | | `vite` | `8.2.2` | [`de1111a`](vitejs/vite@de1111a) | | `rolldown` | `1.2.7` | [`26b4c6e`](rolldown/rolldown@26b4c6e) | | `tsdown` | `0.23.0` | [npm](https://npmx.dev/package/tsdown/v/0.23.0) | | `vitest` | `4.1.11` | [npm](https://npmx.dev/package/vitest/v/4.1.11) | | `oxlint` | `1.81.0` | [npm](https://npmx.dev/package/oxlint/v/1.81.0) | | `oxlint-tsgolint` | `7.0.2001` | [npm](https://npmx.dev/package/oxlint-tsgolint/v/7.0.2001) | | `oxfmt` | `0.66.0` | [npm](https://npmx.dev/package/oxfmt/v/0.66.0) | ### Upgrade ```bash vp upgrade ``` ### New Contributors @afonsojramos, @joschuba **Full Changelog**: v0.3.0...v0.3.1 --- Merging this PR will trigger the release workflow. --------- Co-authored-by: voidzero-guard[bot] <278573678+voidzero-guard[bot]@users.noreply.github.com> Co-authored-by: MK (fengmk2) <fengmk2@gmail.com>
Move argument parsing for the staged, config, hooks, migrate, and create commands from JavaScript to Rust. Each NAPI parser uses clap for strict validation and returns a typed result to JavaScript.
Call graph
JavaScript sends raw arguments to one NAPI parser. JavaScript does not parse the returned values again.
The Rust parsers print command help through the shared vp_cli_help formatter. The global and local CLI paths use the same help format. The create parser keeps all template arguments after the separator in their original order.
This change removes duplicate JavaScript option data and the direct mri dependency. The RFC defines the parser rules, help synchronization, NAPI result types, and command ownership.
Compatibility
Argument parsing is now strict. The CLI rejects unknown options and extra positional arguments. It rejects unsupported negative string options and repeated scalar options.
The staged command rejects invalid concurrency values. It also rejects empty
--cwd,--diff, and--diff-filtervalues before JavaScript runs.The create command rejects
--alland invalid package-manager values. These inputs could pass throughmrior fail later in JavaScript.Performance
The benchmark compares the base commit
45acff9b4with this branch. It ran on macOS ARM64 with Node.js 22.22.0.Each CLI result used 25 to 30 alternating paired runs after four warm-up pairs. A negative change is faster.
The parser-only test used
vp staged --allow-empty --concurrent=2 --diff-filter ACMR --no-stash.vp --versioncontrolvp staged --helpvp config --helpvp hooks --helpvp migrate --helpvp create --helpvp staged --cwdvp hooks unknownvp config --hooks-dirThe clap/NAPI parser is 5.3 times slower in isolation. This adds about 5 µs to a CLI process that takes 130 to 155 ms.
The CLI calls the parser one time. The complete CLI path has no measurable regression. Help is 1% to 4% faster.
vp config --hooks-diris not a parser-only comparison. The base command starts hooks validation. The PR rejects the missing value first.Unknown-option timings are not comparable. The base parser can accept an unknown option and start command work. The PR rejects it during parsing.