Avatar for the oxc-project user
oxc-project
oxc-resolver
BlogDocsChangelog

Performance History

Latest Results

chore(deps): update vite+ to v0.2.1 (#1225) This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Adoption](https://docs.renovatebot.com/merge-confidence/) | [Passing](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---|---|---| | [vite-plus](https://viteplus.dev/guide) ([source](https://redirect.github.com/voidzero-dev/vite-plus/tree/HEAD/packages/cli)) | [`0.2.0` โ†’ `0.2.1`](https://renovatebot.com/diffs/npm/vite-plus/0.2.0/0.2.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/vite-plus/0.2.1?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/vite-plus/0.2.1?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/vite-plus/0.2.0/0.2.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vite-plus/0.2.0/0.2.1?slim=true) | --- ### Release Notes <details> <summary>voidzero-dev/vite-plus (vite-plus)</summary> ### [`v0.2.1`](https://redirect.github.com/voidzero-dev/vite-plus/releases/tag/v0.2.1): vite-plus v0.2.1 [Compare Source](https://redirect.github.com/voidzero-dev/vite-plus/compare/v0.2.0...v0.2.1) Restores support for older Node.js (back to `20.19.0`) and makes `vp exec --fail-if-no-match` fail correctly on unmatched filters. ##### Fixes & Enhancements - Stop blocking older Node.js versions: v0.2.0 blocked commands when the resolved Node.js version fell outside the declared range. This reverts that enforcement and widens `engines.node` to `^20.19.0 || ^22.18.0 || >=24.11.0`, matching Vite's own `^20.19.0` floor, so older Node that works in practice (e.g. Node 20 in rolldown CI) is no longer rejected ([#&#8203;1865](https://redirect.github.com/voidzero-dev/vite-plus/pull/1865)), by [@&#8203;fengmk2](https://redirect.github.com/fengmk2) - `vp exec --fail-if-no-match`: exit non-zero when one or more `--filter` expressions match no workspace packages. Strict mode previously only warned and returned success, so typoed filters looked successful in CI even though no package command ran ([#&#8203;1859](https://redirect.github.com/voidzero-dev/vite-plus/pull/1859)), by [@&#8203;jong-kyung](https://redirect.github.com/jong-kyung) ##### Bundled Versions | Tool | Version | Source | | --------------- | -------- | ------------------------------------------------------------------------------------------------- | | vite | `8.0.16` | [`f94df87`](https://redirect.github.com/vitejs/vite/commit/f94df87ff03b40b65e29bacdc04cc18c7bccaa4a) | | rolldown | `1.1.1` | [`d7f919c`](https://redirect.github.com/rolldown/rolldown/commit/d7f919c18980e6b4a26d06bd071d7cf14cf810a7) | | tsdown | `0.22.3` | [npm](https://npmx.dev/package/tsdown/v/0.22.3) | | vitest | `4.1.9` | [npm](https://npmx.dev/package/vitest/v/4.1.9) | | oxlint | `1.70.0` | [npm](https://npmx.dev/package/oxlint/v/1.70.0) | | oxlint-tsgolint | `0.23.0` | [npm](https://npmx.dev/package/oxlint-tsgolint/v/0.23.0) | | oxfmt | `0.55.0` | [npm](https://npmx.dev/package/oxfmt/v/0.55.0) | ##### Upgrade ```bash vp upgrade ``` ##### Upgrading from 0.1.x to 0.2.1 Prompt ```md You are upgrading a project that uses Vite+ (the `vp` CLI) from v0.1.x to v0.2.1. v0.2.1 has one breaking change vs v0.1.x: it consumes upstream Vitest directly. The `@voidzero-dev/vite-plus-test` wrapper package is removed; `vitest` now comes in transitively through `vite-plus`. Do not run `vp migrate` for this upgrade; it is not reliable enough yet. Make the changes yourself by editing the project's files, then verify by running the tools. How to run vp: if a global `vp` is available, use it. Otherwise this project only ships the local CLI from the `vite-plus` package, so run vp as the project-local binary (for example via the package manager's exec: pnpm exec, npx, yarn, or bunx). After any install, re-resolve vp so you always run the version currently in the project. Do the following: 1. Set the `vite-plus` dependency to the exact version `0.2.1` and reinstall, so the new toolchain is installed and the lockfile moves off 0.1.x. In a monorepo, do this for every workspace package that depends on `vite-plus`. Changing the spec to `0.2.1` is what moves the lockfile off the old resolution; a reinstall that leaves the spec unchanged would keep the old version. 2. Remove the `@voidzero-dev/vite-plus-test` wrapper from the project. Search everywhere it could appear: package.json, the lockfile, any workspace or catalog config (such as pnpm-workspace.yaml or .yarnrc.yml), and the source files. Then: - Decide whether the project itself depends on vitest. It does only if a source or test file imports directly from `vitest` or `@vitest/...`, or a `@vitest/*` package is listed in its dependencies (for example a coverage provider). Imports from `vite-plus/test` do NOT count. - If the project has no such vitest usage (the common case), remove the vitest configuration entirely. In package.json, delete the `vitest` entry from `dependencies` / `devDependencies` in whatever form it takes (a `@voidzero-dev/vite-plus-test` alias, a `catalog:` reference, or a plain version). Also remove the `vitest` entry from every dependency-resolution mechanism in the project: both `overrides` and `resolutions`, pnpm `overrides`/`catalog` (in package.json or pnpm-workspace.yaml), and any catalog entry. If `vitest` appears in more than one of these, remove all of them. Do not add a pinned `vitest`; it arrives transitively through `vite-plus` and the test command still works. - If the project does use vitest directly, pin upstream vitest to the version bundled with vite-plus (4.1.9 for v0.2.1), and upgrade every vitest ecosystem package the project depends on so the whole tree resolves to a single vitest. Set each `@vitest/*` package the project lists (for example `@vitest/coverage-v8`, `@vitest/ui`, `@vitest/browser`) to that same version (4.1.9), since those are pinned to an exact vitest version. Also update any other vitest integration package (such as `vitest-browser-*`) to a release compatible with that vitest version. Leaving an ecosystem package on an older version pulls in a second copy of vitest, which Vitest rejects at runtime. - Also delete any dependency-resolution config that existed only to accommodate the wrapper or the old vitest, for example pnpm `peerDependencyRules` entries (`allowedVersions` / `ignoreMissing`) referencing `vitest`, `@vitest/*`, or `@voidzero-dev/vite-plus-test`, and the equivalent peer-tweak config in other package managers (such as yarn `packageExtensions`). Leave rules that are unrelated to vitest or the wrapper untouched. 3. Keep the `vite` -> Vite+ core override (it is still required) and set it to the matching exact version: map `vite` to `npm:@&#8203;voidzero-dev/vite-plus-core@0.2.1` in whatever override, resolution, or catalog form the project already uses. `@voidzero-dev/vite-plus-core` is released in lockstep with `vite-plus`. 4. Leave imports from `vite-plus/test` (and `vite-plus/test/*`) unchanged; that is the stable public API. Only if a file imports directly from `@voidzero-dev/vite-plus-test`, repoint it to `vite-plus/test`. 5. Reinstall so the lockfile reflects your edits, then verify: confirm that no reference to `@voidzero-dev/vite-plus-test` remains anywhere outside node_modules, confirm the dependency tree resolves to a single `vitest` version (no duplicate copies), run the project's tests and confirm they pass (you will see Vitest's native banner), and run the Vite+ check workflow and confirm it passes. Constraints: - Do not run `vp migrate`. - Do not bypass git hooks. If a pre-existing failure blocks you, report it rather than forcing through. - Make the smallest set of edits that reaches the end state above; do not reformat unrelated files. - When done, give me a short summary: old vs new `vite-plus` version, the files you changed, and the test/check results. ``` **Full Changelog**: <https://github.com/voidzero-dev/vite-plus/compare/v0.2.0...v0.2.1> ##### Published Packages - `@voidzero-dev/vite-plus-core@0.2.1` - `vite-plus@0.2.1` ##### Installation **macOS/Linux:** ```bash curl -fsSL https://vite.plus | bash ``` **Windows:** ```powershell irm https://vite.plus/ps1 | iex ``` Or download and run `vp-setup.exe` from the assets below. </details> --- ### Configuration ๐Ÿ“… **Schedule**: (in timezone Asia/Shanghai) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) ๐Ÿšฆ **Automerge**: Enabled. โ™ป **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. ๐Ÿ”• **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/oxc-project/oxc-resolver). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yMTkuMCIsInVwZGF0ZWRJblZlciI6IjQzLjIxOS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
main
1 hour ago
chore(deps): update vite+ to v0.2.1
renovate/vite+
2 hours ago
feat: track allocation counts for cache-free parse sub-operations Add a committed allocation-count snapshot gate, mirroring oxc's `tasks/track_memory_allocations`: - New `tasks/track_allocations` crate: a counting `#[global_allocator]` over pinned MiMalloc tallies NUM_ALLOC / NUM_REALLOC. - Measures `PackageJson::parse` and `TsConfig::parse` over a spread of fixed inputs and writes a committed `allocs.snap` (counts, not bytes). - `cargo allocs` alias + `just allocs` recipe regenerate it. - A step in the `test` job (ubuntu) runs `cargo allocs` and fails on `git diff`. Coverage / magnitude: 8 fixtures across the parse-input shapes โ€” package.json (small, large-mixed, exports x40, imports x15, browser x15) and tsconfig (small, options-heavy, paths x80). The tsconfig paths-heavy fixture (250 allocs) gives a high-magnitude base where a per-entry regression is an unmistakable delta. Determinism: counts (not bytes) are platform-stable. These ops are cache-free on valid input (no DashMap, no fs walk). Allocation COUNT is a pure function of the input shape, independent of allocator / SIMD width / core count / hash seed: parsing pre-sizes containers to the known element count, so the count never depends on hashbrown's seeded bucket placement. Verified by the intentionally >32-key `exports x40` fixture, whose count is byte-identical across separate processes (different per-process hash seeds), and run-to-run. Whole-resolve() allocation tracking is a follow-up: it needs the resolver cache's DashMap shard count pinned first (a small core change).
hyf0:feat/alloc-count-tracking
2 hours ago
feat: track filesystem call counts Add a committed fs-call-count snapshot gate. A counting `FileSystem` decorator (`CountingFs`) wraps the resolver's filesystem and tallies the per-method logical call counts (read / read_to_string / metadata / symlink_metadata / read_link / canonicalize) the resolver issues, plus the file_dependencies / missing_dependencies counts from `resolve_with_context`, over a fixed set of resolution scenarios. - New `tasks/track_fs_calls` crate writing a committed `fs.snap`. - `cargo fs-calls` alias + `just fs-calls` recipe regenerate it. - A step in the `test` job (ubuntu) runs `cargo fs-calls` and fails on `git diff`. Coverage: 24 scenarios spanning the in-memory-resolvable feature surface โ€” relative / absolute / alias / extension-alias / exports (dot, subpath, conditions, wildcard) / imports (+ conditions) / browser-field / tsconfig-paths / extensions-fallback / directory-index / scoped-main / builtin / file-url / query-fragment / fully-specified / not-found / a deep node_modules ancestor walk (magnitude) / and a cache-warm delta row (expected ~0 traffic โ€” a regression guard for cache busting). Determinism (local == CI): - single-threaded over a fixed in-memory FS rooted at `/`, so node_modules / package.json ancestor walks terminate at a fixed depth (not the checkout path); - NODE_PATH and OXC_RESOLVER_YARN_PNP are cleared at startup (both feed process-wide state that would otherwise perturb the walk); - a startup assertion enforces every fixture object stays <= 32 keys (above that, halfbrown switches to randomized-iteration mode and the first-match target โ€” hence the fs traffic โ€” would become non-deterministic). Verified deterministic run-to-run and across separate processes locally. Symlink (pnpm) / yarn-pnp / .d.ts coverage need separate infra and are follow-ups.
hyf0:feat/fs-call-tracking
3 hours ago
chore(deps): update napi to v3.9.2
renovate/napi
6 hours ago

Latest Branches

CodSpeed Performance Gauge
+5%
chore(deps): update vite+ to v0.2.1#1225
2 hours ago
77a52d6
renovate/vite+
CodSpeed Performance Gauge
+5%
feat: track allocation counts for cache-free parse sub-operations#1223
6 hours ago
5495c06
hyf0:feat/alloc-count-tracking
CodSpeed Performance Gauge
+3%
6 hours ago
273f32b
hyf0:feat/fs-call-tracking
ยฉ 2026 CodSpeed Technology
Home Terms Privacy Docs