vite-plus 1.4.0 → 1.5.0

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.
Files changed (68) hide show
  1. package/binding/index.cjs +54 -54
  2. package/binding/index.d.cts +31 -0
  3. package/dist/{agent-D8oxxhVR.js → agent-DkQD3xqe.js} +2 -2
  4. package/dist/bin.js +15 -7
  5. package/dist/config/bin.js +5 -5
  6. package/dist/{constants-DRUnJ_Dz.js → constants-D2P2aVKb.js} +6 -2
  7. package/dist/create/bin.js +114 -64
  8. package/dist/{define-config-rPhYIFSn.d.ts → define-config-BrvHRi-G.d.ts} +30 -2
  9. package/dist/{define-config-Cv2P6NT2.cjs → define-config-CwtQqYC1.cjs} +35 -3
  10. package/dist/{define-config-ChwJcu5e.js → define-config-wR57OZG_.js} +30 -5
  11. package/dist/define-config.cjs +2 -1
  12. package/dist/define-config.d.ts +2 -2
  13. package/dist/define-config.js +1 -1
  14. package/dist/{editor-ClL78D8u.js → editor-aOy1T15H.js} +1266 -884
  15. package/dist/hooks/bin.js +2 -2
  16. package/dist/{hooks-xRcJPc-O.js → hooks-w_e2whkQ.js} +40 -21
  17. package/dist/index.cjs +4 -3
  18. package/dist/index.d.ts +2 -2
  19. package/dist/index.js +2 -2
  20. package/dist/lint-plugins.cjs +1 -1
  21. package/dist/migration/bin.js +1302 -311
  22. package/dist/migration/compat/worker.js +1 -1
  23. package/dist/{oxlint-plugin-config-BVpqYdcC.js → oxlint-plugin-config-CHsI_zKo.js} +1 -1
  24. package/dist/oxlint-plugin.js +29 -4
  25. package/dist/pack-bin.js +2 -2
  26. package/dist/{package-DzsomcUD.js → package-DfFo6-E-.js} +1 -1
  27. package/dist/{prompts-GL1vj0wk.js → prompts-C7DI63WP.js} +3 -3
  28. package/dist/register.d.ts +1 -0
  29. package/dist/register.js +12 -0
  30. package/dist/{report-DLHO30yZ.js → report-BEdpIQvC.js} +2 -0
  31. package/dist/{resolve-vite-config-QO6cC0SP.js → resolve-vite-config-33bzSaeT.js} +1 -1
  32. package/dist/{resolve-vite-config-Dn5896A4.js → resolve-vite-config-Cx3cnVVI.js} +2 -2
  33. package/dist/script-esm-hooks.d.ts +5 -2
  34. package/dist/script-esm-hooks.js +5 -2
  35. package/dist/script-preload.cjs +24 -1
  36. package/dist/script-register.js +7 -2
  37. package/dist/script-watch.js +135 -41
  38. package/dist/staged/bin.js +2 -2
  39. package/dist/sync-versions/bin.js +1 -1
  40. package/dist/toolchain.js +13 -13
  41. package/dist/toolchain.json +13 -13
  42. package/dist/{tsconfig-Do6MAG_f.js → tsconfig-BE3Wj9OX.js} +1 -1
  43. package/dist/{tsconfig-LE_mAwe_.js → tsconfig-shNmmCE_.js} +2 -2
  44. package/dist/version.js +2 -2
  45. package/dist/versions.js +6 -6
  46. package/docs/config/check.md +2 -0
  47. package/docs/config/fmt.md +1 -1
  48. package/docs/config/lint.md +1 -1
  49. package/docs/config/run.md +6 -2
  50. package/docs/config/staged.md +1 -1
  51. package/docs/guide/check.md +5 -1
  52. package/docs/guide/ci.md +2 -2
  53. package/docs/guide/create.md +1 -1
  54. package/docs/guide/env.md +1 -1
  55. package/docs/guide/global-cli.md +12 -8
  56. package/docs/guide/homebrew.md +127 -0
  57. package/docs/guide/ide-integration.md +1 -3
  58. package/docs/guide/implode.md +5 -3
  59. package/docs/guide/local-cli.md +21 -0
  60. package/docs/guide/migrate-rules.md +81 -22
  61. package/docs/guide/migrate.md +9 -9
  62. package/docs/guide/run.md +23 -1
  63. package/docs/guide/test.md +1 -1
  64. package/docs/guide/troubleshooting.md +1 -1
  65. package/docs/guide/upgrade.md +12 -6
  66. package/docs/guide/vitest-v5.md +2 -2
  67. package/docs/guide/vpx.md +44 -4
  68. package/package.json +39 -33
@@ -200,7 +200,7 @@ Object-valued nested npm and Bun overrides are preserved: they are user-defined
200
200
 
201
201
  `vite` and `vite/*` imports are rewritten to `vite-plus` **only in config entry files**: `vite.config.*`, `vitest.config.*`, and any config file the migration resolved. Every other file keeps its `vite` imports, for two reasons:
202
202
 
203
- - `vite-plus` is not a guaranteed superset of Vite's exposed surface. It owns only `defineConfig`, `defineProject`, and `lazyPlugins`, so rewriting a pass-through symbol such as `createBuilder` or `loadConfigFromFile` (including in `typeof import('vite')` type positions) can break.
203
+ - `vite-plus` is not a guaranteed superset of Vite's exposed surface. It owns only `defineConfig`, `defineProject`, `lazyPlugins`, and `resolveConfigFromFile`, so rewriting a pass-through symbol such as `createBuilder` or `loadConfigFromFile` (including in `typeof import('vite')` type positions) can break.
204
204
  - An unrewritten `vite` import still resolves through the `@voidzero-dev/vite-plus-core` alias in a Vite+ project.
205
205
 
206
206
  Plugin packages (an unscoped name starting with `vite-plugin-` or `unplugin-`, or `vite` in `peerDependencies`/`dependencies`) skip the rewrite even in config files. Only the `vite` specifier is in scope for this rule.
@@ -250,18 +250,20 @@ The `prefer-vite-plus-imports` lint rule follows the same Nuxt exception, so lin
250
250
 
251
251
  Migration rewrites commands provided by the Vite+ toolchain in `package.json` scripts while preserving their arguments:
252
252
 
253
- | Before | After |
254
- | ------------- | ------------------------------------------- |
255
- | `vite` | `vp dev`, or the matching `vp` subcommand |
256
- | `vitest` | `vp test` |
257
- | `oxlint` | `vp lint` |
258
- | `oxfmt` | `vp fmt` |
259
- | `tsdown` | `vp pack` |
260
- | `lint-staged` | `vp staged` |
261
- | `eslint` | `vp lint`, when its optional migration runs |
262
- | `prettier` | `vp fmt`, when its optional migration runs |
263
- | `tsup` | `vp pack`, when its optional migration runs |
264
- | `tsx` | `vpx`, when its optional migration runs |
253
+ | Before | After |
254
+ | ------------- | -------------------------------------------- |
255
+ | `vite` | `vp dev`, or the matching `vp` subcommand |
256
+ | `vitest` | `vp test` |
257
+ | `oxlint` | `vp lint` |
258
+ | `oxfmt` | `vp fmt` |
259
+ | `tsdown` | `vp pack` |
260
+ | `lint-staged` | `vp staged` |
261
+ | `eslint` | `vp lint`, when its optional migration runs |
262
+ | `prettier` | `vp fmt`, when its optional migration runs |
263
+ | `tsup` | `vp pack`, when its optional migration runs |
264
+ | `tsx` | `vpx`, when its optional migration runs |
265
+ | `oxnode` | `vpx`, when its optional migration runs |
266
+ | `ts-node` | `vpx`, for supported transpile-only commands |
265
267
 
266
268
  For commands launched through `bunx`, migration preserves `bunx` and its `--bun` flag (keeping the user's chosen runtime) and rewrites only the managed command. tsx is the exception: `bunx tsx` becomes `vpx`, and `bunx --bun tsx` keeps tsx (see [tsx to `vpx`](#tsx-to-vpx)). This also works when `bunx` follows a command-launcher delimiter such as `run` or `--`:
267
269
 
@@ -278,23 +280,80 @@ Unrelated `bunx` commands and other package-executor forms remain unchanged.
278
280
 
279
281
  When a `package.json` script, a lint-staged task, or a `#!/usr/bin/env tsx` shebang runs [tsx](https://tsx.is), migration offers to move it to [`vpx`](/guide/vpx), Vite+'s TypeScript script runner. It rewrites scripts and lint-staged tasks in `package.json` and JSON lint-staged files, and `#!/usr/bin/env tsx` shebangs in script files:
280
282
 
281
- | Before | After |
282
- | -------------------------------------------------------------------------- | ------------------------------------------ |
283
- | `tsx src/seed.ts --rows 10` | `vpx src/seed.ts --rows 10` |
284
- | `tsx watch --include "*.json" src/a.ts` | `vpx --watch --include "*.json" src/a.ts` |
285
- | `npx tsx a.ts`, `pnpm exec tsx a.ts`, `pnpm dlx tsx a.ts`, `bunx tsx a.ts` | `vpx a.ts` |
286
- | `node --import tsx ./a.ts` | `vpx ./a.ts` |
287
- | `cross-env NODE_ENV=dev tsx a.ts` | `cross-env NODE_ENV=dev vpx a.ts` |
288
- | `concurrently "tsx watch a.ts" "vp dev"` | `concurrently "vpx --watch a.ts" "vp dev"` |
283
+ | Before | After |
284
+ | -------------------------------------------------------------------------- | -------------------------------------------------- |
285
+ | `tsx src/seed.ts --rows 10` | `vpx src/seed.ts --rows 10` |
286
+ | `tsx watch --include "*.json" src/a.ts` | `vpx --watch --include "*.json" src/a.ts` |
287
+ | `npx tsx a.ts`, `pnpm exec tsx a.ts`, `pnpm dlx tsx a.ts`, `bunx tsx a.ts` | `vpx a.ts` |
288
+ | `node --import tsx ./a.ts` | `node --import vite-plus/register ./a.ts` |
289
+ | `node --import=tsx --test` | `node --import=vite-plus/register --test` |
290
+ | `NODE_OPTIONS='--import tsx' mocha` | `NODE_OPTIONS='--import vite-plus/register' mocha` |
291
+ | `cross-env NODE_ENV=dev tsx a.ts` | `cross-env NODE_ENV=dev vpx a.ts` |
292
+ | `concurrently "tsx watch a.ts" "vp dev"` | `concurrently "vpx --watch a.ts" "vp dev"` |
289
293
 
290
294
  `tsx watch` becomes `vpx --watch`, never `vpx watch`, which runs the npm package `watch`. Node.js options and tsx watch options keep their order, and `--no-cache` is dropped. A quoted command is rewritten only for programs that run it, such as `concurrently`, `nodemon --exec`, `sh -c`, and `cross-env-shell`; a quoted argument of other programs, as in `echo "tsx a.ts"`, is data. `vpx` needs the same Node.js versions as Vite+ itself, and migration already upgrades incompatible runtime pins to them (see [Vitest 5](/guide/vitest-v5)).
291
295
 
292
- Migration keeps tsx, with a warning, for a command `vpx` cannot run: `--eval`, `--print`, or `--check`, the REPL, `--test` without files or in watch mode, an entry without a file extension, commands that set `TSX_TSCONFIG_PATH` (pass `--tsconfig` to `vpx` instead) or load tsx through `NODE_OPTIONS`, and commands with pipes, variables, or subshells. It also reads the scripts a command runs, including local `--require` and `--import` modules, and keeps tsx when one does not exist yet, as when an earlier command generates it, and when `vpx` would fail on one: a `require()` of `./a.js` that only tsx resolves to `a.ts`, and, because tsx compiles ES module syntax to CommonJS, a `.cts` file with `import` or `export`, and a file that mixes `import` with `__dirname`, `__filename`, `require()`, or `module.exports` in a package without `"type": "module"`. This check skips globs and scripts after a `cd` or another shell state change, and reads only the files a command names, not the modules they import. It does not look for what else `vpx` handles differently, such as standard decorators, tsconfig `paths` in `require()`, or a tsconfig `module` of `node16` or `nodenext`; `vpx` reports those when the script runs. A package that lists tsx in `dependencies`, `optionalDependencies`, or `peerDependencies` keeps it too, since `vpx` comes from the `vite-plus` devDependency.
296
+ The plain `node --import tsx` and `node --import=tsx` forms keep Node.js, its options, wrappers, and arguments. They use [`vite-plus/register`](/guide/vpx#using-nodejs-directly), so Node.js retains its eval, test discovery, and native watch behavior. Literal `NODE_OPTIONS` assignments also migrate, including assignments through `cross-env` and known command launchers. `vite-plus/register` accepts `TSX_TSCONFIG_PATH` as a fallback. Assignments that also load a legacy tsx hook, or reach a command that still needs tsx, stay unchanged.
297
+
298
+ For the tsx executable and legacy loader forms such as `--loader tsx/esm` and `-r tsx/cjs`, migration keeps the existing `vpx` rules. It keeps tsx, with a warning, for `--eval`, `--print`, or `--check`, the REPL, `--test` without files or in watch mode, an entry without a file extension, or commands that load tsx through `NODE_OPTIONS`. Commands with pipes, variables, or subshells also stay unchanged. `vpx` accepts `TSX_TSCONFIG_PATH` as a fallback too; an explicit `--tsconfig` takes priority.
299
+
300
+ Both migration paths read the scripts a command names, including local `--require` and `--import` modules. They keep tsx when a script does not exist yet, as when an earlier command generates it, or when the Vite+ loader would fail on it: a `require()` of `./a.js` that only tsx resolves to `a.ts`, a `.cts` file with `import` or `export`, or a file that mixes `import` with `__dirname`, `__filename`, `require()`, or `module.exports` in a package without `"type": "module"`. This check skips globs and scripts after a `cd` or another shell state change, and reads only the files a command names, not the modules they import. It does not look for other compiler differences, such as standard decorators, tsconfig `paths` in `require()`, or a tsconfig `module` of `node16` or `nodenext`; the loader reports those when the script runs. A package that lists tsx in `dependencies`, `optionalDependencies`, or `peerDependencies` keeps it too, since the replacement comes from the `vite-plus` devDependency.
293
301
 
294
302
  Migration removes the `tsx` devDependency only when nothing uses tsx anymore: no kept script, no import of `tsx` or its subpaths such as `tsx/esm/api` (in source, build output, or a `package.json` `imports` alias), no shebang, no tool setting such as `--import=tsx` in `package.json` or a JSON or JavaScript config, and no tsx command in CI workflows, git hooks, or shell scripts. The root's dependency stays while any workspace package still uses tsx, and a package's dependency stays while a nested package under it does. When tsx stays, the warning names what still uses it.
295
303
 
304
+ Tool configurations and source files need manual edits. For example, change `nodeArguments: ['--import=tsx']` to `nodeArguments: ['--import=vite-plus/register']`, or Mocha's `"import": "tsx"` setting to `"import": "vite-plus/register"`. Keep tsx if the project uses its programmatic APIs.
305
+
296
306
  See [Coming from tsx](/guide/vpx#coming-from-tsx) for the other differences.
297
307
 
308
+ ### oxnode to `vpx`
309
+
310
+ Migration offers to replace `oxnode`, the command from `@oxc-node/cli`, with `vpx`. It rewrites `package.json` scripts, lint-staged tasks in `package.json` and JSON files, and `#!/usr/bin/env oxnode` shebangs. Node.js preload shebangs such as `#!/usr/bin/env -S node --import @oxc-node/core/register` keep Node.js and use `vite-plus/register`, including in extensionless scripts. The migration preserves the shebang's `env` syntax, flags, and relative paths. On a project that already uses Vite+, run `vp migrate --full` to include this migration.
311
+
312
+ | Before | After |
313
+ | --------------------------------------------------------- | ---------------------------------------------------- |
314
+ | `oxnode ./scripts/seed.ts` | `vpx ./scripts/seed.ts` |
315
+ | `oxnode -C dev ./build.ts` | `vpx -C dev ./build.ts` |
316
+ | `oxnode watch --include "config/*.json" ./server.ts` | `vpx --watch --include "config/*.json" ./server.ts` |
317
+ | `node --import @oxc-node/core/register ./scripts/seed.ts` | `node --import vite-plus/register ./scripts/seed.ts` |
318
+ | `NODE_OPTIONS='--import @oxc-node/core/register' mocha` | `NODE_OPTIONS='--import vite-plus/register' mocha` |
319
+
320
+ The `node --import @oxc-node/core/register` and `register.mjs` forms keep Node.js, its wrappers, arguments, and native watch, eval, and test modes. Literal `NODE_OPTIONS` assignments also use the public preload. Commands that use the `oxnode` executable follow the `vpx` rules instead: `oxnode --watch` stays unchanged because it starts Node.js's watcher, while `oxnode watch` and `vpx --watch` use oxc-node's watcher.
321
+
322
+ Commands that explicitly set `OXC_TRANSFORM_ALL` to anything other than `typescript` stay unchanged. Nonempty `VP_SCRIPT_TSCONFIG` and `TSX_TSCONFIG_PATH` assignments also stay unchanged because they would change config selection. Commands that read an environment file stay unchanged because it can select a different transform mode. Migration checks the named script and local preloads for standalone oxc-node API usage, which would configure a different loader after migration; it does not follow their imports.
323
+
324
+ Custom asynchronous `--loader` and `--experimental-loader` hooks stay in their original order when the register import changes. This supports project loaders for resolution and assets alongside the Vite+ TypeScript loader. It does not establish compatibility with a second TypeScript transformer or arbitrary synchronous `module.registerHooks()` chains.
325
+
326
+ Direct `oxnode` commands and Node.js preload commands stay unchanged when an additional `--require` or `--import` can change loader settings. Node.js commands also stay unchanged when inline code still calls standalone oxc-node APIs. Migration checks explicit local shebang loaders relative to the owning package for standalone API references, without following their imports. It leaves the paths unchanged: at runtime, relative loader paths use the caller's working directory, not the script's directory.
327
+
328
+ The `@oxc-node/cli` and `@oxc-node/core` development dependencies are removed only when no remaining use needs them. Loader references, API imports, CI commands, hooks, and shell scripts can keep these dependencies installed. Migration also checks files named by `--env-file` and `--env-file-if-exists`, regardless of their filename. If it cannot resolve or read an environment file, it keeps the dependencies for manual review. Runtime and peer dependencies stay in place.
329
+
330
+ ### ts-node to `vpx`
331
+
332
+ Migration offers to replace supported ts-node commands with `vpx` only when type-checking is explicitly disabled. Plain `ts-node` type-checks before execution; `vpx` does not. Commands that still type-check stay unchanged with a warning, even when another option enables transpile-only mode.
333
+
334
+ | Before | After |
335
+ | --------------------------------------------------------------------------------- | ------------------------------------------------------------------- |
336
+ | `ts-node --transpileOnly ./scripts/seed.ts` | `vpx ./scripts/seed.ts` |
337
+ | `ts-node -T -P tsconfig.scripts.json ./scripts/seed.ts` | `vpx --tsconfig=tsconfig.scripts.json ./scripts/seed.ts` |
338
+ | `ts-node-transpile-only ./scripts/seed.ts` | `vpx ./scripts/seed.ts` |
339
+ | `node -r ts-node/register/transpile-only ./scripts/seed.ts` | `node --import vite-plus/register ./scripts/seed.ts` |
340
+ | `node --loader ts-node/esm/transpile-only ./scripts/seed.ts` | `node --import vite-plus/register ./scripts/seed.ts` |
341
+ | `NODE_OPTIONS='--require ts-node/register/transpile-only' node ./scripts/seed.ts` | `NODE_OPTIONS='--import vite-plus/register' node ./scripts/seed.ts` |
342
+
343
+ The migration also reads `transpileOnly` and `typeCheck` from local JSONC tsconfig files, local `extends` chains, and literal `TS_NODE_TRANSPILE_ONLY` / `TS_NODE_TYPE_CHECK` assignments. `-P`, `--project`, and `TS_NODE_PROJECT` select the configuration. A directory passed to `-P` or `--project` resolves to its `tsconfig.json`; a directory in `TS_NODE_PROJECT` stays unchanged. When ts-node discovers a config implicitly, migration pins that file with `--tsconfig` so `vpx` uses it for the whole run. `ts-node-esm` and `--esm` are supported when type-checking is disabled.
344
+
345
+ If an existing config and its local `extends` chain omit both `target` and `useDefineForClassFields`, the command stays unchanged with a warning. ts-node defaults to assignment semantics for class fields in this case, while `vpx` defaults to define semantics. Set `compilerOptions.useDefineForClassFields` to `false` to preserve assignment semantics before migrating.
346
+
347
+ Supported Node.js preload commands keep Node.js and replace both the old loader option and module with `--import vite-plus/register`. Literal `NODE_OPTIONS` assignments also migrate when they reach a known `node` command and pass the same checks. An existing `TS_NODE_PROJECT` file selection stays in place. A preload that needs an implicit config pinned stays unchanged: set `TS_NODE_PROJECT` to the config file before migration, because Node.js cannot take `--tsconfig`.
348
+
349
+ Preloads also stay unchanged when the working directory has no config but the entry file would discover a different one. Migration does not scan imported modules for additional config files.
350
+
351
+ Custom compilers, transpilers, SWC, ts-node compiler overrides, unsupported configuration inheritance, eval, and REPL usage stay unchanged. Environment files, Node.js config files, additional preloads, and unsupported `NODE_OPTIONS` assignments also keep the original command because they can change ts-node settings before registration. Nonempty `VP_SCRIPT_TSCONFIG`, `TSX_TSCONFIG_PATH`, or `OXC_TSCONFIG_PATH` assignments stay unchanged because they would select a different config. Migration checks named scripts for known module incompatibilities; it does not follow their imports. Migrated scripts use the [tsconfig and module rules of `vpx`](/guide/vpx#tsconfig).
352
+
353
+ Entries with static imports or re-exports of CommonJS values also stay unchanged. This includes named, namespace, and default bindings, `.js` files in CommonJS packages, and package entry points. Migration checks both import and require resolution without executing dependencies. Unresolved targets and targets that differ between these modes stay unchanged for manual review. Even `esModuleInterop: true` can unwrap a CommonJS `__esModule.default` value differently from Node.js, so that setting alone does not make a default import safe. Type-only imports and exports, imports used only for side effects, checked ES module targets, and named Node.js built-in bindings do not trigger this check.
354
+
355
+ As with oxnode, migration rewrites package scripts, JSON lint-staged tasks, and supported env shebangs. Shebangs that need a pinned config stay unchanged because the config path depends on the caller's working directory. Existing Vite+ projects use `vp migrate --full`. The `ts-node` development dependency is removed only when no remaining command, loader, API import, or config reference needs it. Runtime and peer dependencies remain, and `typescript` is not removed.
356
+
298
357
  ## Continuous Integration Rules
299
358
 
300
359
  Migration replaces exact `voidzero-dev/setup-vp@v1` references in GitHub Actions workflows and composite actions under `.github` with the latest exact `setup-vp` release known to that Vite+ version. The frozen `v1` tag does not receive new releases. Existing exact versions and commit SHAs are left unchanged.
@@ -8,7 +8,7 @@ import { migrationPrompt, upgradePrompt } from '../.vitepress/theme/data/migrati
8
8
 
9
9
  ## Overview
10
10
 
11
- This command is the starting point for consolidating separate Vite, Vitest, Oxlint, Oxfmt, ESLint, Prettier, tsdown, tsup, and tsx setups into Vite+.
11
+ This command is the starting point for consolidating separate Vite, Vitest, Oxlint, Oxfmt, ESLint, Prettier, tsdown, tsup, tsx, oxnode, and ts-node setups into Vite+.
12
12
 
13
13
  Use it when you want to take an existing project and move it onto the Vite+ defaults instead of wiring each tool by hand.
14
14
 
@@ -95,21 +95,21 @@ Upgrade the [global CLI](./upgrade.md#global-vp) to your target 1.0 release, the
95
95
 
96
96
  ### Without the Global CLI
97
97
 
98
- Use an existing Node.js runtime that satisfies `^22.18.0 || ^24.11.0 || >=26.0.0`. Run the target migrator through your package manager without adding it to the project first. For the `1.4.0` release:
98
+ Use an existing Node.js runtime that satisfies `^22.18.0 || ^24.11.0 || >=26.0.0`. Run the target migrator through your package manager without adding it to the project first. For the `1.5.0` release:
99
99
 
100
100
  ::: code-group
101
101
 
102
102
  ```bash [pnpm]
103
- pnpm dlx --package=vite-plus@1.4.0 vp migrate --no-interactive
103
+ pnpm dlx --package=vite-plus@1.5.0 vp migrate --no-interactive
104
104
  ```
105
105
 
106
106
  ```bash [npm]
107
- npx --package=vite-plus@1.4.0 vp migrate --no-interactive
107
+ npx --package=vite-plus@1.5.0 vp migrate --no-interactive
108
108
  ```
109
109
 
110
110
  :::
111
111
 
112
- Replace `1.4.0` with your target release. For a preview, use the version from the PR and pass `--registry=https://registry-bridge.viteplus.dev` to `pnpm` or `npx` before the `vp` command. Keep the version in `--package` explicit so you run the target migrator rather than the old local CLI.
112
+ Replace `1.5.0` with your target release. For a preview, use the version from the PR and pass `--registry=https://registry-bridge.viteplus.dev` to `pnpm` or `npx` before the `vp` command. Keep the version in `--package` explicit so you run the target migrator rather than the old local CLI.
113
113
 
114
114
  After migration, finish dependency installation and validate with the updated local CLI:
115
115
 
@@ -151,7 +151,7 @@ View and copy this prompt into your coding agent to upgrade an existing Vite+ 0.
151
151
 
152
152
  ### Vitest
153
153
 
154
- Vitest is automatically migrated through `vp migrate`. `vite-plus` re-exports upstream `vitest@5.0.5` under `vite-plus/test*`, so for node-mode tests a single `vite-plus` install is enough — you no longer need to install `vitest` directly.
154
+ Vitest is automatically migrated through `vp migrate`. `vite-plus` re-exports upstream `vitest@5.1.0` under `vite-plus/test*`, so for node-mode tests a single `vite-plus` install is enough — you no longer need to install `vitest` directly.
155
155
 
156
156
  For browser mode, you can use the base browser runtime (`@vitest/browser`) and Preview provider (`@vitest/browser-preview`) included in `vite-plus`. To use Playwright or WebDriverIO, you also need the opt-in provider (`@vitest/browser-playwright` or `@vitest/browser-webdriverio`) and its framework peer (`playwright` or `webdriverio`).
157
157
 
@@ -234,11 +234,11 @@ export default defineConfig({
234
234
  });
235
235
  ```
236
236
 
237
- When no existing hook policy owns the workflow, `vp migrate` can move supported lint-staged rules and remove the old configuration and dependency. If an existing hook tool is preserved, keep lint-staged in place until you convert that hook policy manually. See the [Commit hooks guide](/guide/commit-hooks) and [Staged config reference](/config/staged) for details.
237
+ When no existing hook policy owns the workflow, `vp migrate` can move supported lint-staged rules and remove the old configuration and dependency. If an existing hook tool is preserved, keep lint-staged in place until you convert that hook policy manually. See the [Commit Hooks](/guide/commit-hooks) and [Staged Config](/config/staged) for details.
238
238
 
239
239
  ### Git hook tools
240
240
 
241
- The `vp migrate` command does not automatically convert Husky setups. When Husky is detected, Vite+ leaves its hooks, lifecycle scripts, configuration, and dependencies unchanged and shows a warning. You can migrate the project manually using the [Commit hooks guide](/guide/commit-hooks).
241
+ The `vp migrate` command does not automatically convert Husky setups. When Husky is detected, Vite+ leaves its hooks, lifecycle scripts, configuration, and dependencies unchanged and shows a warning. You can migrate the project manually using the [Commit Hooks](/guide/commit-hooks).
242
242
 
243
243
  Existing project-owned Vite+ hooks are also preserved. The default staged workflow is introduced only when no existing hook policy is found.
244
244
 
@@ -246,7 +246,7 @@ If your project currently uses `lefthook`, `simple-git-hooks`, or `yorkie`, `vp
246
246
 
247
247
  If you want to move one of those tools over to Vite+ manually, you can follow these steps. First, move your staged-file commands into the `staged` block within `vite.config.ts`. Then, update your lifecycle script so it runs `vp config`. You will also need to create a Vite+ hook at `.vite-hooks/pre-commit` that runs `vp staged`. Run `vp hooks enable` (or `vp config`) to install the dispatcher and set `core.hooksPath`. Finally, once you have confirmed that the Vite+ hook is working as expected, you can remove the old tool's configuration and dependency.
248
248
 
249
- Use `vp hooks status` to verify the dispatcher is active, and `vp hooks disable` if you need to turn it off again in this clone. You can find more details about the full Vite+ hook setup in the [Commit hooks guide](/guide/commit-hooks).
249
+ Use `vp hooks status` to verify the dispatcher is active, and `vp hooks disable` if you need to turn it off again in this clone. You can find more details about the full Vite+ hook setup in the [Commit Hooks](/guide/commit-hooks).
250
250
 
251
251
  ## Examples
252
252
 
package/docs/guide/run.md CHANGED
@@ -6,6 +6,10 @@
6
6
  `vpr` is available as a standalone shorthand for `vp run`. All examples below work with both `vp run` and `vpr`.
7
7
  :::
8
8
 
9
+ ::: info
10
+ Vite Task parses simple commands and `&&` chains itself instead of passing them to a shell, so they behave the same on every platform. Other shell syntax, such as pipes or redirects, may behave differently across platforms.
11
+ :::
12
+
9
13
  ## Overview
10
14
 
11
15
  Use `vp run` with existing `package.json` scripts:
@@ -232,7 +236,7 @@ vp run -w build
232
236
 
233
237
  ## Compound Commands
234
238
 
235
- Commands joined with `&&` are split into independent sub-tasks. Each sub-task is cached separately when [caching is enabled](/guide/cache#when-is-caching-enabled). This works for both `vite.config.ts` tasks and `package.json` scripts:
239
+ Commands joined with `&&` are split into independent sub-tasks, unless they also use other shell syntax. Each sub-task is cached separately when [caching is enabled](/guide/cache#when-is-caching-enabled). This works for both `vite.config.ts` tasks and `package.json` scripts:
236
240
 
237
241
  ```json [package.json]
238
242
  {
@@ -266,6 +270,24 @@ $ vp build ○ cache miss: 'index.html' modified, executing
266
270
  vp run: 1/2 cache hit (50%), 2/2 successful, 120ms saved.
267
271
  ```
268
272
 
273
+ ### Environment Variable Prefixes
274
+
275
+ Environment variable prefixes such as `FOO=bar command` work on every platform, without extra tools like `cross-env`:
276
+
277
+ ```json [package.json]
278
+ {
279
+ "scripts": {
280
+ "build": "NODE_ENV=production node build.js"
281
+ }
282
+ }
283
+ ```
284
+
285
+ A prefix applies only to the command it directly precedes. In `FOO=1 a && b`, `FOO` is set for `a` but not for `b`.
286
+
287
+ ::: warning
288
+ Prefixes may not work on every platform when the command also uses other shell syntax.
289
+ :::
290
+
269
291
  ### Nested `vp run`
270
292
 
271
293
  When a command contains `vp run`, Vite Task inlines it as separate tasks instead of spawning a nested process. Each sub-task is cached independently and output stays flat:
@@ -2,7 +2,7 @@
2
2
 
3
3
  `vp test` runs tests with [Vitest](https://vitest.dev).
4
4
 
5
- Vite+ depends on Vitest `5.0.5`, which requires Node `^22.18.0 || ^24.11.0 || >=26.0.0`. For existing projects, follow [Upgrade to Vitest 5](./vitest-v5.md) before updating dependencies.
5
+ Vite+ depends on Vitest `5.1.0`, which requires Node `^22.18.0 || ^24.11.0 || >=26.0.0`. For existing projects, follow [Upgrade to Vitest 5](./vitest-v5.md) before updating dependencies.
6
6
 
7
7
  `vp test` resolves Vitest from `vite-plus`'s dependencies first, then from your project.
8
8
 
@@ -72,7 +72,7 @@ If `vp staged` fails or your pre-commit hook does not run:
72
72
  - if status shows `Preference: disabled (local)`, re-enable with `vp hooks enable`
73
73
  - check whether hooks were skipped intentionally through `VP_GIT_HOOKS=0`
74
74
 
75
- To stop hooks in this clone without deleting project policy files, run `vp hooks disable`. See the [Commit hooks guide](/guide/commit-hooks) for the full workflow.
75
+ To stop hooks in this clone without deleting project policy files, run `vp hooks disable`. See the [Commit Hooks](/guide/commit-hooks) for the full workflow.
76
76
 
77
77
  A minimal staged config looks like this:
78
78
 
@@ -1,6 +1,6 @@
1
1
  # Upgrading Vite+
2
2
 
3
- Use `vp upgrade` to update the global `vp` binary. To update the local `vite-plus` package in a project, see [Update Vite+](/guide/upgrade-project).
3
+ Use `vp upgrade` to update the global `vp` binary, or [Homebrew](#homebrew) if it owns your installation. To update the local `vite-plus` package in a project, see [Update Vite+](/guide/upgrade-project).
4
4
 
5
5
  ## Overview
6
6
 
@@ -22,7 +22,7 @@ vp toolchain vite rolldown oxc
22
22
  vp toolchain --json
23
23
  ```
24
24
 
25
- The command uses the local `vite-plus` package when the project has one. Use `--global` to show the release for the global `vp` command:
25
+ The command uses the local `vite-plus` package when the project has one. Use `--global` or `-g` to show the release for the global `vp` command:
26
26
 
27
27
  ```bash
28
28
  vp toolchain --global
@@ -87,15 +87,19 @@ Older versions are pruned automatically after each upgrade. The active version a
87
87
 
88
88
  ### Homebrew
89
89
 
90
- Homebrew owns its installed binary and JavaScript package. Update them with:
90
+ The [official Homebrew tap](/guide/homebrew) owns its installed binary. Update it with:
91
91
 
92
92
  ```bash
93
- brew upgrade vite-plus
93
+ brew upgrade voidzero-dev/vite-plus/vp
94
94
  ```
95
95
 
96
- `vp upgrade` detects Homebrew installations and directs you to this command without downloading or installing another version. This also applies to `--force`, a specific version, and `--rollback`. Use Homebrew to manage these installations.
96
+ `vp upgrade` detects the installed formula and shows its Homebrew upgrade command without downloading or installing another version. This also applies to `--force`, a specific version, and `--rollback`. The script installer's rollback and automatic pruning do not apply to Homebrew installations.
97
97
 
98
- `vp upgrade --check` directs you to `brew outdated vite-plus`. Automatic npm update checks and notices are disabled for Homebrew installations.
98
+ For the tap, run `vp` after upgrading to install the new version's dependencies in your user data directory. Setup preserves your management preferences.
99
+
100
+ For the tap, `vp upgrade --check` directs you to `brew outdated voidzero-dev/vite-plus/vp`. Automatic npm update checks and notices are disabled for Homebrew installations.
101
+
102
+ To switch to the tap, follow the [migration steps](/guide/homebrew#switch-an-existing-installation).
99
103
 
100
104
  ## Preview Builds
101
105
 
@@ -111,6 +115,8 @@ Preview builds are addressed by pull request number or commit SHA. They are not
111
115
 
112
116
  ### Global `vp` Preview
113
117
 
118
+ For a Homebrew installation, follow the [tap preview instructions](/guide/homebrew#test-a-preview-build).
119
+
114
120
  Install a preview build of the global CLI by passing `VP_PR_VERSION` to the installer. Pass a pull request number or a commit SHA:
115
121
 
116
122
  ```bash
@@ -1,6 +1,6 @@
1
1
  # Upgrade to Vitest 5
2
2
 
3
- Vite+ bundles Vitest `5.0.5`. Use Node `^22.18.0 || ^24.11.0 || >=26.0.0` for the CLI and tests.
3
+ Vite+ bundles Vitest `5.1.0`. Use Node `^22.18.0 || ^24.11.0 || >=26.0.0` for the CLI and tests.
4
4
 
5
5
  ## Before you migrate
6
6
 
@@ -126,7 +126,7 @@ Review calls with benchmark options, imported or reassigned callbacks, callback
126
126
 
127
127
  ## Entry points and packages
128
128
 
129
- Use `vite-plus/test` for assertions and supported runner APIs. Keep coverage providers and `@vitest/ui` at the bundled runner's exact version, `5.0.5`. Keep `@vitest/web-worker` aligned when your project uses it.
129
+ Use `vite-plus/test` for assertions and supported runner APIs. Keep coverage providers and `@vitest/ui` at the bundled runner's exact version, `5.1.0`. Keep `@vitest/web-worker` aligned when your project uses it.
130
130
 
131
131
  | v4 import | v5 import or action |
132
132
  | ---------------------------------------- | --------------------------------------------------------------------------- |
package/docs/guide/vpx.md CHANGED
@@ -87,7 +87,7 @@ A missing path, or a missing name with a TypeScript extension, is an error: `vpx
87
87
 
88
88
  - `--tsconfig <path>` applies one tsconfig to every file (see [tsconfig](#tsconfig))
89
89
  - `--watch` runs the file again when a file it uses changes (see [Watch Mode](#watch-mode))
90
- - Node.js options before the file, such as `--inspect`, `--test`, `--env-file`, `--require`, and `--import`, are passed to Node.js; `--require` and `--import` preloads can be TypeScript too
90
+ - Node.js options before the file, such as `--inspect`, `--test`, `--env-file`, `--require`, and `--import`, are passed to Node.js; modules loaded with `--require` and `--import` can be TypeScript too
91
91
  - Everything after the file, including `--`, is passed to the script
92
92
 
93
93
  ### Shebang Scripts
@@ -103,6 +103,38 @@ Scripts can use `vpx` as their interpreter. Make the file executable and keep it
103
103
 
104
104
  The `vpx` bin of the `vite-plus` package runs scripts on its own, so `"seed": "vpx ./scripts/seed.ts"` works in `package.json` scripts without the global CLI. It runs them on the Node.js that started it, which inside `vp run` and package manager scripts is the project's version.
105
105
 
106
+ ### Using Node.js Directly
107
+
108
+ To run TypeScript with `node`, use `--import vite-plus/register`. This registers the Vite+ TypeScript loader before your script runs:
109
+
110
+ ```bash
111
+ node --import=vite-plus/register ./scripts/seed.ts
112
+ node --import vite-plus/register --test ./test/example.test.ts
113
+ NODE_OPTIONS='--import=vite-plus/register' node ./scripts/seed.ts
114
+ ```
115
+
116
+ Install `vite-plus` in the project first. Node.js resolves `vite-plus/register` from the project. The loader provides the same TypeScript transforms, tsconfig resolution, and source maps as `vpx`, and requires the same Node.js versions as Vite+.
117
+
118
+ If a tool starts Node.js itself, add `--import vite-plus/register` to its Node.js arguments or `NODE_OPTIONS`. Replace an existing `--import tsx` argument with `--import vite-plus/register`. For example, an AVA configuration can use:
119
+
120
+ ```json
121
+ {
122
+ "ava": {
123
+ "nodeArguments": ["--import=vite-plus/register"]
124
+ }
125
+ }
126
+ ```
127
+
128
+ Keep the tool's existing TypeScript file patterns and other settings. A JavaScript launcher can also run `await import('vite-plus/register')` before dynamically importing a TypeScript file. A static TypeScript import in that launcher is resolved before registration, so use `--import` for static imports.
129
+
130
+ `fork()` and workers inherit the `--import` option through Node.js arguments. `NODE_OPTIONS` also passes the option to spawned Node.js processes. Replacing a child's arguments or environment follows Node.js's normal inheritance rules.
131
+
132
+ To select a tsconfig, set `VP_SCRIPT_TSCONFIG=tsconfig.scripts.json`. The existing `TSX_TSCONFIG_PATH` variable also works, with `VP_SCRIPT_TSCONFIG` taking precedence. Otherwise the [usual tsconfig discovery](#tsconfig) applies. Each worker selects its config from its own environment, so workers can use different configs without changing their parent.
133
+
134
+ Node.js owns its flags, test discovery, and native watch mode. Eval and stdin can import TypeScript files, but their input text is not transformed. Modules loaded with `--require` run before modules loaded with `--import`. To load a TypeScript setup file, put `--import ./setup.ts` after `--import vite-plus/register`. Repeated imports of `vite-plus/register` are harmless, including when a tool already runs under `vpx`.
135
+
136
+ The [compiler differences from tsx](#coming-from-tsx) also apply when you use `vite-plus/register`.
137
+
106
138
  ### Watch Mode
107
139
 
108
140
  ```bash
@@ -132,7 +164,7 @@ It watches every file the script imports or requires (in worker threads too, on
132
164
 
133
165
  `vpx` reads compiler options from a tsconfig but does not type-check with it. Each file uses the nearest `tsconfig.json` above it that includes it through `files`, `include`, `exclude`, or project `references`, as `tsc` does, and `extends` is followed. Files in `node_modules` use no tsconfig, and neither does a file that no tsconfig includes, so it gets the defaults below. Such a file still resolves `paths` aliases through the nearest `tsconfig.json` above it, as tsx does: with a root tsconfig whose `include` is `["src"]`, a script in `scripts/` can import the same aliases as `src/`. Because the config depends on the file's location, not on the working directory, `vpx` compiles a file the same way wherever it runs from.
134
166
 
135
- `--tsconfig <path>` applies one config to every file instead, including files that config does not include. Without `--tsconfig`, an `OXC_TSCONFIG_PATH` or `TS_NODE_PROJECT` environment variable does the same. If it names a file that does not exist, or a tsconfig fails to parse, `vpx` prints a warning and runs without that config.
167
+ `--tsconfig <path>` applies one config to every file instead, including files that config does not include. Without `--tsconfig`, `TSX_TSCONFIG_PATH`, `TS_NODE_PROJECT`, or `OXC_TSCONFIG_PATH` can select a config, in that order. If it names a file that does not exist, or a tsconfig fails to parse, `vpx` prints a warning and runs without that config.
136
168
 
137
169
  A file that no tsconfig applies to runs as if its `compilerOptions` were empty:
138
170
 
@@ -193,8 +225,16 @@ JSX that depends on a compiler plugin is not supported. `vpx` compiles JSX only
193
225
  - **Node.js version**: `vpx` needs Node.js `^22.18.0 || ^24.11.0 || >=26.0.0`, while tsx also runs on older releases.
194
226
  - **Watch mode**: `tsx watch` becomes `vpx --watch`, which takes tsx watch's options (see [Watch Mode](#watch-mode)). It also reruns the script on tsconfig edits and when a file a failed import looked for is created, which tsx watch misses.
195
227
  - **Eval, REPL, and `--check`**: `vpx --eval`, the REPL, and `vpx --check` do not transform TypeScript.
196
- - **`node --import tsx`**: `vpx` has no equivalent for tools that must start `node` themselves.
197
- - **Other loaders**: remove `--import tsx` from `NODE_OPTIONS`. Two loaders registered together compete for the same files.
228
+ - **`node --import tsx`**: replace it with [`node --import vite-plus/register`](#using-nodejs-directly), including in tool settings and `NODE_OPTIONS`.
229
+ - **Other loaders**: replace `--import tsx` with `--import vite-plus/register`. Registering both TypeScript loaders makes them compete for the same files.
230
+
231
+ ### Coming from oxnode
232
+
233
+ `vp migrate` can replace `oxnode <file>` with `vpx <file>` and `oxnode watch <file>` with `vpx --watch <file>`. Both use oxc-node's transformer and watcher. Node.js commands and literal `NODE_OPTIONS` assignments that load `@oxc-node/core/register` use `vite-plus/register` instead. Migration removes the standalone development dependencies only when no remaining commands or imports need them. See [oxnode to `vpx`](/guide/migrate-rules#oxnode-to-vpx).
234
+
235
+ ### Coming from ts-node
236
+
237
+ `vp migrate` can replace supported transpile-only ts-node commands with `vpx`. Supported Node.js preloads and literal `NODE_OPTIONS` assignments use `vite-plus/register`. Migration keeps commands that type-check because neither replacement performs that check. Custom compiler settings and remaining loader or API usage can also keep `ts-node` installed. See [ts-node to `vpx`](/guide/migrate-rules#ts-node-to-vpx).
198
238
 
199
239
  ## `vp exec`
200
240
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vite-plus",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "description": "The Unified Toolchain for the Web",
5
5
  "homepage": "https://viteplus.dev/guide",
6
6
  "bugs": {
@@ -32,7 +32,9 @@
32
32
  "templates"
33
33
  ],
34
34
  "type": "module",
35
- "sideEffects": false,
35
+ "sideEffects": [
36
+ "./dist/register.js"
37
+ ],
36
38
  "main": "./dist/index.js",
37
39
  "types": "./dist/index.d.ts",
38
40
  "exports": {
@@ -85,6 +87,10 @@
85
87
  "types": "./dist/oxlint-plugin.d.ts"
86
88
  },
87
89
  "./package.json": "./package.json",
90
+ "./register": {
91
+ "types": "./dist/register.d.ts",
92
+ "default": "./dist/register.js"
93
+ },
88
94
  "./pack": {
89
95
  "types": "./dist/pack.d.ts",
90
96
  "import": "./dist/pack.js"
@@ -339,53 +345,53 @@
339
345
  }
340
346
  },
341
347
  "dependencies": {
342
- "@oxc-project/runtime": "=0.155.0",
343
- "@oxc-project/types": "=0.155.0",
344
- "@oxlint/plugins": "=1.89.0",
345
- "@vitest/browser": "5.0.5",
346
- "@vitest/browser-preview": "5.0.5",
347
- "@vitest/mocker": "5.0.5",
348
- "@vitest/pretty-format": "5.0.5",
349
- "@vitest/snapshot": "5.0.5",
350
- "@vitest/spy": "5.0.5",
351
- "@vitest/utils": "5.0.5",
352
- "oxfmt": "=0.74.0",
353
- "oxlint": "=1.89.0",
354
- "oxlint-tsgolint": "=7.0.2004",
355
- "vite": "npm:@voidzero-dev/vite-plus-core@1.4.0",
356
- "vitest": "5.0.5"
348
+ "@oxc-project/runtime": "=0.157.0",
349
+ "@oxc-project/types": "=0.157.0",
350
+ "@oxlint/plugins": "=1.91.0",
351
+ "@vitest/browser": "5.1.0",
352
+ "@vitest/browser-preview": "5.1.0",
353
+ "@vitest/mocker": "5.1.0",
354
+ "@vitest/pretty-format": "5.1.0",
355
+ "@vitest/snapshot": "5.1.0",
356
+ "@vitest/spy": "5.1.0",
357
+ "@vitest/utils": "5.1.0",
358
+ "oxfmt": "=0.76.0",
359
+ "oxlint": "=1.91.0",
360
+ "oxlint-tsgolint": "=7.0.2005",
361
+ "vite": "npm:@voidzero-dev/vite-plus-core@1.5.0",
362
+ "vitest": "5.1.0"
357
363
  },
358
364
  "devDependencies": {
359
- "@emnapi/core": "2.0.0-alpha.5",
360
- "@emnapi/runtime": "2.0.0-alpha.5",
365
+ "@emnapi/core": "2.0.0-beta.2",
366
+ "@emnapi/runtime": "2.0.0-beta.2",
361
367
  "@napi-rs/cli": "^3.10.0",
362
368
  "@nkzw/safe-word-list": "^3.1.0",
363
369
  "@types/cross-spawn": "^6.0.6",
364
370
  "@types/validate-npm-package-name": "^4.0.2",
365
- "@vitest/browser-playwright": "5.0.5",
371
+ "@vitest/browser-playwright": "5.1.0",
366
372
  "@vitest/browser-webdriverio": "5.0.0",
367
- "@voidzero-dev/vite-plus-prompts": "1.4.0",
373
+ "@voidzero-dev/vite-plus-prompts": "1.5.0",
368
374
  "@voidzero-dev/vite-task-client": "0.2.0",
369
375
  "bingo": "^0.13.2",
370
- "cac": "^7.0.0",
376
+ "cac": "^7.1.0",
371
377
  "cross-spawn": "^7.0.5",
372
378
  "detect-indent": "^7.0.2",
373
379
  "detect-newline": "^4.0.1",
374
380
  "jsonc-parser": "^3.3.1",
375
381
  "lint-staged": "^17.6.0",
376
- "minimatch": "^10.0.3",
382
+ "minimatch": "^11.0.0",
377
383
  "nanotar": "^0.3.0",
378
384
  "picocolors": "^1.1.1",
379
385
  "pirates": "^4.0.7",
380
386
  "tinyglobby": "^0.2.15",
381
- "tsdown": "^0.23.1",
387
+ "tsdown": "^0.23.4",
382
388
  "validate-npm-package-name": "^8.0.0",
383
389
  "verkit": "^0.5.0",
384
390
  "yaml": "^2.9.1",
385
391
  "zod": "^4.4.3"
386
392
  },
387
393
  "peerDependencies": {
388
- "@vitest/browser-playwright": "5.0.5",
394
+ "@vitest/browser-playwright": "5.1.0",
389
395
  "@vitest/browser-webdriverio": "^5.0.0-beta.5 || >=5.0.0",
390
396
  "playwright": "*"
391
397
  },
@@ -418,14 +424,14 @@
418
424
  "node": "^22.18.0 || ^24.11.0 || >=26.0.0"
419
425
  },
420
426
  "optionalDependencies": {
421
- "@voidzero-dev/vite-plus-darwin-arm64": "1.4.0",
422
- "@voidzero-dev/vite-plus-darwin-x64": "1.4.0",
423
- "@voidzero-dev/vite-plus-linux-arm64-gnu": "1.4.0",
424
- "@voidzero-dev/vite-plus-linux-arm64-musl": "1.4.0",
425
- "@voidzero-dev/vite-plus-linux-x64-gnu": "1.4.0",
426
- "@voidzero-dev/vite-plus-linux-x64-musl": "1.4.0",
427
- "@voidzero-dev/vite-plus-win32-x64-msvc": "1.4.0",
428
- "@voidzero-dev/vite-plus-win32-arm64-msvc": "1.4.0"
427
+ "@voidzero-dev/vite-plus-darwin-arm64": "1.5.0",
428
+ "@voidzero-dev/vite-plus-darwin-x64": "1.5.0",
429
+ "@voidzero-dev/vite-plus-linux-arm64-gnu": "1.5.0",
430
+ "@voidzero-dev/vite-plus-linux-arm64-musl": "1.5.0",
431
+ "@voidzero-dev/vite-plus-linux-x64-gnu": "1.5.0",
432
+ "@voidzero-dev/vite-plus-linux-x64-musl": "1.5.0",
433
+ "@voidzero-dev/vite-plus-win32-x64-msvc": "1.5.0",
434
+ "@voidzero-dev/vite-plus-win32-arm64-msvc": "1.5.0"
429
435
  },
430
436
  "scripts": {
431
437
  "build": "oxnode -C dev ./build.ts",