Repository navigation
release: v1.4.0 - #3201
release: v1.4.0#3201
Conversation
NAPI bakes the package.json version into binding/index.cjs version checks. The prepare_release workflow bumps package.json but does not regenerate this file, so the CI build's regeneration step produces a diff that the post-build no-unexpected-changes guard rejects. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
✅ Staging deployment successful! Preview: https://viteplus-staging.void.app/ |
CLI artifact sizes (
|
| Artifact | Format | Base | PR | Change |
|---|---|---|---|---|
packages/cli/dist |
Directory total | 2.25 MiB | 2.25 MiB | 0 B (0.00%) |
packages/core/dist |
Directory total | 4.07 MiB | 4.07 MiB | 0 B (0.00%) |
| Combined package dist | Directory total | 6.33 MiB | 6.33 MiB | 0 B (0.00%) |
vp (Linux x64) |
Binary | 8.22 MiB | 8.22 MiB | 0 B (0.00%) |
vp (Linux x64) |
gzip -9 | 3.76 MiB | 3.76 MiB | -76 B (-0.00%) |
| NAPI (Linux x64) | Binary | 35.45 MiB | 35.45 MiB | 0 B (0.00%) |
| NAPI (Linux x64) | gzip -9 | 14.12 MiB | 14.12 MiB | +230 B (+0.00%) |
vp (macOS ARM64) |
Binary | 5.38 MiB | 5.38 MiB | -16 B (-0.00%) |
vp (macOS ARM64) |
gzip -9 | 3.20 MiB | 3.20 MiB | -74 B (-0.00%) |
| NAPI (macOS ARM64) | Binary | 42.23 MiB | 42.23 MiB | 0 B (0.00%) |
| NAPI (macOS ARM64) | gzip -9 | 18.25 MiB | 18.25 MiB | +8 B (+0.00%) |
vp (Windows x64) |
Binary | 6.08 MiB | 6.08 MiB | 0 B (0.00%) |
vp (Windows x64) |
gzip -9 | 2.81 MiB | 2.81 MiB | +61 B (+0.00%) |
| NAPI (Windows x64) | Binary | 31.50 MiB | 31.50 MiB | 0 B (0.00%) |
| NAPI (Windows x64) | gzip -9 | 12.83 MiB | 12.83 MiB | -477 B (-0.00%) |
| Trampoline (Windows x64) | Binary | 13.50 KiB | 13.50 KiB | 0 B (0.00%) |
| Trampoline (Windows x64) | gzip -9 | 7.09 KiB | 7.09 KiB | -3 B (-0.04%) |
| Installer (Windows x64) | Binary | 4.67 MiB | 4.67 MiB | 0 B (0.00%) |
| Installer (Windows x64) | gzip -9 | 2.24 MiB | 2.24 MiB | -1 B (-0.00%) |
🚀 Deploying Preview to Cloudflare 🚀Preview URL: https://release-v1-4-0-viteplus-dev.voidzero-docs.workers.dev (commit 790a5b7)This URL reflects your latest Preview deploymentPreview Deployments by commit
|
Preview binary sizes (
|
| Binary | Latest release | Preview | Change |
|---|---|---|---|
vp (macOS ARM64) |
7.62 MiB | 5.38 MiB | -2.25 MiB (-29.46%) |
| NAPI (macOS ARM64) | 41.49 MiB | 42.20 MiB | +727.89 KiB (+1.71%) |
vp (macOS x64) |
9.29 MiB | 6.82 MiB | -2.47 MiB (-26.61%) |
| NAPI (macOS x64) | 46.44 MiB | 47.34 MiB | +918.86 KiB (+1.93%) |
vp (Linux ARM64 GNU) |
8.48 MiB | 6.81 MiB | -1.66 MiB (-19.63%) |
| NAPI (Linux ARM64 GNU) | 30.66 MiB | 31.45 MiB | +809.63 KiB (+2.58%) |
vp (Linux ARM64 musl) |
8.53 MiB | 6.88 MiB | -1.65 MiB (-19.29%) |
| NAPI (Linux ARM64 musl) | 29.89 MiB | 30.67 MiB | +798.06 KiB (+2.61%) |
vp (Linux x64 GNU) |
10.21 MiB | 8.23 MiB | -1.98 MiB (-19.43%) |
| NAPI (Linux x64 GNU) | 34.53 MiB | 35.45 MiB | +945.56 KiB (+2.67%) |
vp (Linux x64 musl) |
10.21 MiB | 8.30 MiB | -1.92 MiB (-18.77%) |
| NAPI (Linux x64 musl) | 33.50 MiB | 34.43 MiB | +955.69 KiB (+2.79%) |
vp (Windows x64) |
8.29 MiB | 6.09 MiB | -2.19 MiB (-26.47%) |
| NAPI (Windows x64) | 30.25 MiB | 31.16 MiB | +934.00 KiB (+3.02%) |
| Trampoline (Windows x64) | 13.00 KiB | 13.00 KiB | 0 B (0.00%) |
| Installer (Windows x64) | 3.64 MiB | 4.67 MiB | +1.04 MiB (+28.50%) |
vp (Windows ARM64) |
6.94 MiB | 5.33 MiB | -1.61 MiB (-23.18%) |
| NAPI (Windows ARM64) | 26.83 MiB | 27.56 MiB | +756.50 KiB (+2.75%) |
| Trampoline (Windows ARM64) | 13.00 KiB | 13.00 KiB | 0 B (0.00%) |
| Installer (Windows ARM64) | 3.01 MiB | 3.85 MiB | +858.50 KiB (+27.84%) |
gzip -9 sizes
| Binary | Latest release | Preview | Change |
|---|---|---|---|
vp (macOS ARM64) |
3.94 MiB | 3.20 MiB | -762.31 KiB (-18.88%) |
| NAPI (macOS ARM64) | 17.97 MiB | 18.25 MiB | +290.71 KiB (+1.58%) |
vp (macOS x64) |
4.28 MiB | 3.38 MiB | -920.40 KiB (-21.01%) |
| NAPI (macOS x64) | 19.14 MiB | 19.44 MiB | +311.49 KiB (+1.59%) |
vp (Linux ARM64 GNU) |
4.26 MiB | 3.69 MiB | -585.99 KiB (-13.42%) |
| NAPI (Linux ARM64 GNU) | 13.00 MiB | 13.31 MiB | +316.62 KiB (+2.38%) |
vp (Linux ARM64 musl) |
4.30 MiB | 3.71 MiB | -606.28 KiB (-13.76%) |
| NAPI (Linux ARM64 musl) | 12.71 MiB | 13.01 MiB | +312.64 KiB (+2.40%) |
vp (Linux x64 GNU) |
4.50 MiB | 3.76 MiB | -761.99 KiB (-16.53%) |
| NAPI (Linux x64 GNU) | 13.81 MiB | 14.12 MiB | +321.87 KiB (+2.28%) |
vp (Linux x64 musl) |
4.51 MiB | 3.79 MiB | -741.84 KiB (-16.06%) |
| NAPI (Linux x64 musl) | 13.35 MiB | 13.66 MiB | +323.37 KiB (+2.37%) |
vp (Windows x64) |
3.66 MiB | 2.82 MiB | -857.93 KiB (-22.90%) |
| NAPI (Windows x64) | 12.37 MiB | 12.69 MiB | +325.26 KiB (+2.57%) |
| Trampoline (Windows x64) | 7.14 KiB | 7.14 KiB | -1 B (-0.01%) |
| Installer (Windows x64) | 1.78 MiB | 2.24 MiB | +467.43 KiB (+25.62%) |
vp (Windows ARM64) |
3.46 MiB | 2.69 MiB | -788.68 KiB (-22.26%) |
| NAPI (Windows ARM64) | 11.75 MiB | 12.05 MiB | +309.83 KiB (+2.58%) |
| Trampoline (Windows ARM64) | 6.93 KiB | 6.93 KiB | -1 B (-0.01%) |
| Installer (Windows ARM64) | 1.71 MiB | 2.13 MiB | +438.15 KiB (+25.07%) |
Raw sizes are uncompressed file sizes. gzip sizes recompress each binary at level 9; they are not package or download archive sizes.
The baseline uses published release files, including NAPI packages from npm at the same version. Build versions and toolchains can affect the difference.
Registry bridge build (
|
| Package | Version |
|---|---|
vite-plus |
0.0.0-commit.6bc2d240a024170c08fbc831f0c201c162afd22e |
@voidzero-dev/vite-plus-core |
0.0.0-commit.6bc2d240a024170c08fbc831f0c201c162afd22e |
create-vite-plus |
0.0.0-commit.6bc2d240a024170c08fbc831f0c201c162afd22e |
Install the Vite+ CLI built from this commit, then migrate a project:
# macOS / Linux
curl -fsSL https://raw.githubusercontent.com/voidzero-dev/vite-plus/6bc2d240a024170c08fbc831f0c201c162afd22e/packages/cli/install.sh | VP_PR_VERSION=3201 VP_LEGACY_INSTALLER_URL=https://raw.githubusercontent.com/voidzero-dev/vite-plus/6bc2d240a024170c08fbc831f0c201c162afd22e/packages/cli/install-legacy.sh bash# Windows (PowerShell)
$env:VP_PR_VERSION="3201"; $env:VP_LEGACY_INSTALLER_URL="https://raw.githubusercontent.com/voidzero-dev/vite-plus/6bc2d240a024170c08fbc831f0c201c162afd22e/packages/cli/install-legacy.ps1"; irm https://raw.githubusercontent.com/voidzero-dev/vite-plus/6bc2d240a024170c08fbc831f0c201c162afd22e/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.6bc2d240a024170c08fbc831f0c201c162afd22e" --registry "https://registry-bridge.viteplus.dev/"After installing, upgrade the current project's vite-plus to this test build with:
vp migrateOr create a new project from this commit without installing the CLI:
export npm_config_registry=https://registry-bridge.viteplus.dev/ pnpm_config_registry=https://registry-bridge.viteplus.dev/
pnpm create vite-plus@0.0.0-commit.6bc2d240a024170c08fbc831f0c201c162afd22e # or: npm create vite-plus@0.0.0-commit.6bc2d240a024170c08fbc831f0c201c162afd22e$env:npm_config_registry="https://registry-bridge.viteplus.dev/"; $env:pnpm_config_registry="https://registry-bridge.viteplus.dev/"
pnpm create vite-plus@0.0.0-commit.6bc2d240a024170c08fbc831f0c201c162afd22e # or: npm create vite-plus@0.0.0-commit.6bc2d240a024170c08fbc831f0c201c162afd22epnpm 11+ reads pnpm_config_registry, npm and older pnpm read npm_config_registry. The new project pins this build, so keep the registry set for later installs, or configure it as below.
Or 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.6bc2d240a024170c08fbc831f0c201c162afd22e",
"vite": "npm:@voidzero-dev/vite-plus-core@0.0.0-commit.6bc2d240a024170c08fbc831f0c201c162afd22e"
}
}
🐳 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-3201 2>/dev/null; docker pull ghcr.io/voidzero-dev/vite-plus:pr-3201Quick check: docker run --rm ghcr.io/voidzero-dev/vite-plus:pr-3201 vp --versionSee docs/guide/docker.md for usage. |
Update tokio from 1.54.0 to 1.54.1 to fix [RUSTSEC-2026-0384](https://rustsec.org/advisories/RUSTSEC-2026-0384). In 1.54.0, `tokio::time::Interval` on the multi-threaded runtime can race with the time driver and cause a use-after-free. tokio yanked 1.54.0. Only the tokio entry in `Cargo.lock` changes. This clears the Security Analysis failure on the v1.4.0 release PR (#3201). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
## Problem On the v1.4.0 release PR (#3201), every CLI snapshot shard fails on every OS. Every case dies while the runner prepares its home: ``` first-start setup failed with status exit status: 1 error: Setup error: Failed to fetch CLI package metadata from https://registry.npmjs.org/@voidzero-dev/vite-plus-cli-linux-x64-gnu/1.4.0: HTTP status client error (404 Not Found) ``` Since #3117, first-start setup calls `vp_setup::lockfile::prepare` unless `VP_SKIP_DEPS_INSTALL` is set. The dev-built case binary has no `vp-install-lock.yaml` beside it, so `prepare` looks up the platform package for the binary's own version on registry.npmjs.org. A release branch has not published that version yet, so the lookup returns 404 and every case fails before its first step. Every future release branch would fail the same way. `main` only passes because the previous version (1.3.0) is published and advertises no lockfile, so `prepare` returns without installing anything. As a side effect, each case makes a hidden request to npm. The `snapshot_setup` fixture's reference home has the same problem. It mirrors the runner's preparation by running the unmarked binary in a second home, so it would still fail on a release branch after the runner is fixed. ## Change - The runner's first-start command now sets `VP_SKIP_DEPS_INSTALL=1`, next to the existing `VP_SELF_SETUP_NO_MODIFY_PATH=1`. First-start runs in place, and the checkout package is already installed in the case home, so setup has nothing to install and resolves no Node runtime on this path. The only effect is that the registry lookup no longer happens. - `snapshot_setup/verify.mjs` sets the same override for its reference setup. It also asserts that case commands do not inherit the override, as it already does for `VP_SELF_SETUP_NO_MODIFY_PATH`. Fixtures that test self-setup, such as `download_progress` and `command_self_setup`, keep their own `VP_SKIP_DEPS_INSTALL` values. - The snapshot runner README documents the override. Product code (`vp_setup`, `self_setup`) is unchanged, and no recorded snapshots change. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Vite+ 1.4 runs TypeScript and JavaScript files with
vpx, andvp migratecan move tsx scripts to it. It also addsvp check --deny-warningsandvp pm team, and installs the global CLI's dependencies from a lockfile published with each release.Features
vpx <file>runs a TypeScript or JavaScript file on the project's Node.js with the oxc-node loader that ships with Vite+, andvpx --watch <file>reruns it when a file it uses changes. Inpackage.jsonscripts, thevpxbin of thevite-pluspackage runs scripts without the global CLI and runs package binaries only fromnode_modules/.bin, pointing tovp dlxfor anything not installed (docs) (#2936, #3164), by @Brooooooklyn and @fengmk2.vp migrateoffers to move tsx scripts tovpx:tsx a.ts,npx tsx a.ts,node --import tsx a.ts, andtsx watch a.tsinpackage.jsonscripts, lint-staged tasks, and#!/usr/bin/env tsxshebangs becomevpx a.tsorvpx --watch a.ts. A project already on Vite+ gets the offer withvp migrate --full(docs) (#3179), by @fengmk2.vp check --deny-warningsfails the check on lint warnings, so CI no longer needs a separatevp lint --deny-warningsrun (docs) (#3075), by @acalvino4.vp pm teamcreates and destroys registry organization teams and adds, removes, and lists their members, through npm or pnpm 11.13.0 and later, falling back to npm for older pnpm and Bun (#3040), by @jong-kyung.vpno longer accepts HTTPS certificates issued through the distrusted emSign intermediates when downloading Node.js, package managers, and upgrades (RUSTSEC-2026-0382, RUSTSEC-2026-0383), and it ships tokio 1.54.1, which fixes a race intokio::time::Interval(RUSTSEC-2026-0384) (#3159, #3202), by @wan9chi and @fengmk2.vp pmregistry commands (login,logout,whoami,owner,token,dist-tag,deprecate,search,ping, andpublish) run pnpm's own commands on pnpm 11 and later (tokenfrom 12.13.0), andvp pm ownerandvp pm publishrun Yarn's own commands, so they follow that package manager's registry configuration and authentication. Older versions still go through npm (#3044), by @jong-kyung.vp upgradeinstall the global CLI's JavaScript dependencies from a lockfile published with each release, so every installation of a version gets the same dependency versions. SetVP_SETUP_SKIP_INSTALL_LOCKFILE=1to resolve them again if that installation fails (docs) (#3117), by @fengmk2.vite@8.3.4tovite@8.3.5, with fixes for bundled dev mode, chunk import maps, CSSurl()values containing%, and subpath imports with several#characters.rolldown@1.2.14torolldown@1.2.15, with fixes forthis.resolverecursion between plugins usingskipSelf: true, strict execution order, and chunk import maps.oxlint@1.88.0tooxlint@1.89.0, with rule fixes that report cases missed before, for example inprefer-const,no-param-reassign, andsort-imports.oxfmt@0.73.0tooxfmt@0.74.0, with formatting fixes for comments, parentheses, JSDoc, JSON, YAML, and Markdown.vp check, runvp fmtafter upgrading.vpxscripts run onoxc-node@1.0.0.@vitejs/devtools0.8 is accepted as a peer dependency, alongside 0.7.Fixes & Enhancements
vpexecutable is 30%+ smaller (#3086), by @fengmk2.VP_SETUP_NODE_VERSIONselects the Node.js version the installer uses for the CLI's dependencies, sosetup-vpcan use the project's version and avoid downloading a second Node.js in CI (docs) (#3087), by @fengmk2.vp runfinishes sooner because it no longer waits for the disk after saving each result. If the computer loses power or the operating system crashes during a run, the entries it saved can be lost and those tasks run again (vite-task#871), by @magurotuna.node_modules/.modules.yamldiffers, for example after installing with another pnpm version, with--ignore-scripts, or on glibc and musl machines (vite-task#850), by @wan9chi.vp runin a package that sits inside a workspace folder but is not listed in itspnpm-workspace.yamlpackagesorpackage.jsonworkspacesruns that package's own tasks with its ownpackageManager, instead of treating the enclosing workspace as its root (vite-task#859), by @liangmiQwQ.unknown field outputs, instead ofdata did not match any variant of untagged enum UserTaskDefinition(vite-task#815), by @tlq5l.vp runno longer panics on scripts that contain non-ASCII characters, such asecho こんにちは, and no longer cuts those commands off in its output (vite-task#861), by @magurotuna.-1as a directory descriptor, such asps -p <pid>from procps-ng 4.0.6 and later, no longer abort (vite-task#862), by @magurotuna.pnpm dlxno longer occasionally abort with a stack overflow when the program makes concurrent system calls at startup (vite-task#854), by @fengmk2.vp runand the globalvpxwait for the child process to finish its Ctrl+C cleanup and exit with its code, instead of exiting immediately (#3167), by @fengmk2.vp migrateand theprefer-vite-plus-importslint autofix leavevite/rolldownandvite/rolldown/*imports unchanged, instead of rewriting them tovite-plus/rolldownsubpaths thatvite-plusdoes not export (#3070, #3191), by @Crimson341 and @Dunqing.vp migratekeeps existing.nvmrcfiles instead of converting them to.node-version, so nvm, fnm, and other tools that read.nvmrckeep working and the selected Node.js version does not change (#3126), by @liangmiQwQ.vp migrateconverts Oxlint configs thatextendsshared JSON files into TypeScript modules imported throughlint.extends, so the inherited rules keep applying after migration (#3097), by @fengmk2.vp migrateskips the git hooks prompt when the project's Vite+ hooks are already set up, and completes a partial setup without prompting (#3118), by @0froq.vp migratekeeps the workspace members declared inpackage.jsonworkspaceswhen it selects pnpm for a project without a lockfile, so recursive commands still include them (#2863), by @SaKaNa-Y.vp migrateno longer reportsunawaited-assertionfor a local assertion promise that the function later awaits or returns (#3180), by @fengmk2.pnpm create vite-plusandyarn create vite-plusno longer fail during dependency installation whenvpis not onPATH, and no longer run a different globalvpversion for installation, formatting, and hooks (#3181), by @fengmk2.vp createandvp migrateresolve the npm registry and credentials as npm does: a.npmrcabove the project is no longer read,userconfigandglobalconfigare honored, and registry hosts in credential keys match regardless of case (#3124), by @liangmiQwQ.vp packandvp createfind the monorepo root the same way asvp runandvp install, andvp packat a monorepo root without avite.configno longer picks up a config from the directory above (#3101), by @liangmiQwQ.defineConfigkeeps plugins that are promises unchanged, so plugins that find themselves through properties on their promise, such asvike(), work under Vite+ (#3154), by @liangmiQwQ.vp devwithexperimental.bundledDevno longer fails withERR_MODULE_NOT_FOUNDwhen no separaterolldownpackage is installed, and no longer picks up the runtime of an unrelated installedrolldown(#3111), by @fengmk2.nodeShimMode: system_first,vp nodeandvp env execrun the system tool that the shell would find, instead of downloading and running the managed Node.js (#3100), by @liangmiQwQ.VP_NODE_VERSION=22and other partial versions resolve to an exact release invp env install,vp env exec, andvp env clean, instead of failing with a 404 download error (#3038), by @Dev-next-gen.vp env pinandvp env unpinshow the file and field they changed. Package-manager pins from a workspace member update the workspace rootpackage.json, and the help and guide now say so (#3103), by @SaKaNa-Y.--reachesvpagain, sovp create vite -- --template react-tsforwards--templateto create-vite (#3083), by @fengmk2.env.nucalls, such asupdate. Runvp env setupagain to regenerateenv.nu(#3123), by @naokihaba.--dry-runor--provenancewith an npm whose version is unknown, instead of running without them (#3122), by @jong-kyung.packageManagerpin and reject a mismatched download, as pnpm 12 and later already did (#3134), by @jong-kyung.vp install -grestores the executables and npm links that existed before, instead of deleting files it never created (#3119), by @jong-kyung.vp install -gskips package binaries with unsafe names or targets instead of linking them, as pnpm does (#3156), by @jong-kyung.npm uninstall -g <package> --dry-runno longer removes the package's commands from Vite+ (#3112), by @jong-kyung.Refactor
globwithtinyglobbyin the CLI and share.nvmrcline parsing between reading and pinning. Workspace discovery invp createandvp migratenow honors negated patterns such as!packages/fooand follows symlinked directories in**patterns, as pnpm does (#3099, #3125), by @liangmiQwQ.Docs
run.cachecan only be set in the workspace root'svite.config.ts(#3139), by @yusuke99.Chore
a3c087a; its user-facing changes are listed above (#3153, #3168, #3184), by @wan9chi.@ast-grep/napi@0.51.0andserial_test@4(#3108, #3109), by @renovate[bot].Bundled Versions
8.3.5981f07f1.2.1589d821c1.0.04759ced0.23.15.0.51.89.07.0.20040.74.0Upgrade
New Contributors
@acalvino4, @Dev-next-gen, @0froq, @Crimson341, @Dunqing, @magurotuna, @tlq5l
Full Changelog: v1.3.0...v1.4.0
Merging this PR will trigger the release workflow.