Vite+ 1.4 runs TypeScript and JavaScript files with vpx, and vp migrate can move tsx scripts to it. It also adds vp check --deny-warnings and vp 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.- Security:
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.- The installer and
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. - Upgrade the bundled tools (#3133, #3158, #3175), by @voidzero-guard[bot] and @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.- The new oxlint and oxfmt versions can flag code that passed before. If your CI runs
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
- The standalone
vpexecutable binary size 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.- When tasks miss the cache,
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. - Cached tasks no longer miss the cache when only pnpm's
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.- A mistyped or misplaced task setting fails with an error that names it, such as
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.- In cached tasks on Linux and macOS, programs that pass
-1as a directory descriptor, such asps -p <pid>from procps-ng 4.0.6 and later, no longer abort (vite-task#862), by @magurotuna. - On Linux, cached tasks such as
pnpm dlxno longer occasionally abort with a stack overflow when the program makes concurrent system calls at startup (vite-task#854), by @fengmk2. - On Windows,
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.- With
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.- In PowerShell, a bare
--reachesvpagain, sovp create vite -- --template react-tsforwards--templateto create-vite (#3083), by @fengmk2. - Nushell 0.112.1 and later starts when the user defines a custom command with the same name as a built-in that the Vite+
env.nucalls, such asupdate. Runvp env setupagain to regenerateenv.nu(#3123), by @naokihaba. - Package-manager commands reject options that the selected version would silently ignore, such as
--dry-runor--provenancewith an npm whose version is unknown, instead of running without them (#3122), by @jong-kyung. - Fresh Bun installs verify the integrity hash in a
packageManagerpin and reject a mismatched download, as pnpm 12 and later already did (#3134), by @jong-kyung. - A failed
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
- Replace
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. - Share clap error diagnostics, manager preference parsing, external tool lookup, and native shell parsing for migration rewrites, and remove a redundant git hooks wrapper (#3172, #3143, #3138, #3173), by @jong-kyung, @myuron, and @fengmk2.
Docs
Chore
- Bump vite-task to
a3c087a; its user-facing changes are listed above (#3153, #3168, #3184), by @wan9chi. - Run Node.js, runtime download, and package-manager tests against local mirrors and offline fixtures, serve snapshot registry traffic from local fixtures and a shared cache, replace sleeps with deterministic waits, keep snapshot setup off the npm registry, and fix or remove tests that checked nothing (#3067, #3169, #3170, #3171, #3144, #3146, #3145, #3147, #3148, #3194, #3203), by @fengmk2 and @liangmiQwQ.
- Cover package-manager detection for nested projects and owner listing with pnpm 11.28.7, and allow time for the Playwright type check on slow runners (#3051, #3174, #3082), by @liangmiQwQ, @jong-kyung, and @fengmk2.
- Update the Node.js versions used for development, CI, and release publishing to the October 2026 security releases: 22.23.4, 24.22.1, and 26.12.1 (#3186), by @fengmk2.
- Reduce GitHub Actions cache storage and enable the e18e lint rules for the repository (#3149, #3088), by @fengmk2.
- Upgrade JavaScript dependencies and Rust crates, including
@ast-grep/napi@0.51.0andserial_test@4(#3108, #3109), by @renovate[bot]. - Refine the release-manager and vite-task bump guidance (#3084, #3160), by @fengmk2 and @wan9chi.
Bundled Versions
| Tool | Version | Source | Changelog |
|---|---|---|---|
| vite | 8.3.5
| 981f07f
| 8.3.5 |
| rolldown | 1.2.15
| 89d821c
| 1.2.15 |
| oxc-node | 1.0.0
| 4759ced
| 1.0.0 |
| tsdown | 0.23.1
| npm | unchanged |
| vitest | 5.0.5
| npm | unchanged |
| oxlint | 1.89.0
| npm | 1.89.0 |
| oxlint-tsgolint | 7.0.2004
| npm | unchanged |
| oxfmt | 0.74.0
| npm | 0.74.0 |
Upgrade
vp upgradeNew Contributors
@acalvino4, @Dev-next-gen, @0froq, @Crimson341, @Dunqing, @magurotuna, @tlq5l
Full Changelog: v1.3.0...v1.4.0
Published Packages
@voidzero-dev/vite-plus-core@1.4.0vite-plus@1.4.0create-vite-plus@1.4.0
Installation
macOS/Linux:
curl -fsSL https://vite.plus | bashWindows:
irm https://vite.plus/ps1 | iexOr download and run vp-setup.exe from the assets below.
Docker:
docker run --rm -it -v "$PWD:/app" -w /app ghcr.io/voidzero-dev/vite-plus:1.4.0 vp buildRun any vp command without installing it; see the Docker guide for more.
Create a New App
Start a project without installing the global vp: create-vite-plus runs vp create through your package manager.
pnpm create vite-plus vite:application --directory my-app
cd my-app && pnpm exec vp devRun the command without arguments to pick a template interactively, and see the create guide for other package managers, templates, and options.