fix(core): resolve bundled Rolldown bindings via platform packages - #2313
Conversation
✅ Deploy Preview for viteplus-preview canceled.
|
f6f8ce8 to
fcca21b
Compare
|
@codex review |
Native binary sizes (
|
| Artifact | Format | Base | PR | Change |
|---|---|---|---|---|
vp (Linux x64) |
Binary | 10.52 MiB | 10.52 MiB | 0 B (0.00%) |
vp (Linux x64) |
gzip -9 | 4.55 MiB | 4.55 MiB | 0 B (0.00%) |
| NAPI (Linux x64) | Binary | 33.61 MiB | 33.61 MiB | 0 B (0.00%) |
| NAPI (Linux x64) | gzip -9 | 13.02 MiB | 13.02 MiB | 0 B (0.00%) |
vp (macOS ARM64) |
Binary | 7.84 MiB | 7.84 MiB | 0 B (0.00%) |
vp (macOS ARM64) |
gzip -9 | 3.95 MiB | 3.95 MiB | 0 B (0.00%) |
| NAPI (macOS ARM64) | Binary | 40.92 MiB | 40.92 MiB | 0 B (0.00%) |
| NAPI (macOS ARM64) | gzip -9 | 17.24 MiB | 17.24 MiB | -15 B (-0.00%) |
vp (Windows x64) |
Binary | 8.42 MiB | 8.42 MiB | 0 B (0.00%) |
vp (Windows x64) |
gzip -9 | 3.67 MiB | 3.67 MiB | 0 B (0.00%) |
| NAPI (Windows x64) | Binary | 27.77 MiB | 27.77 MiB | 0 B (0.00%) |
| NAPI (Windows x64) | gzip -9 | 10.86 MiB | 10.86 MiB | +2 B (+0.00%) |
| Trampoline (Windows x64) | Binary | 203.00 KiB | 203.00 KiB | 0 B (0.00%) |
| Trampoline (Windows x64) | gzip -9 | 97.91 KiB | 97.91 KiB | 0 B (0.00%) |
| Installer (Windows x64) | Binary | 4.47 MiB | 4.47 MiB | 0 B (0.00%) |
| Installer (Windows x64) | gzip -9 | 2.09 MiB | 2.09 MiB | -1 B (-0.00%) |
|
Codex Review: Didn't find any major issues. Keep it up! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
Registry bridge build (
|
| Package | Version |
|---|---|
vite-plus |
0.0.0-commit.3a79c350a1c28c9f491c7c4642e42ed426dda78d |
@voidzero-dev/vite-plus-core |
0.0.0-commit.3a79c350a1c28c9f491c7c4642e42ed426dda78d |
Install the Vite+ CLI built from this commit, then migrate a project:
# macOS / Linux
curl -fsSL https://vite.plus | VP_PR_VERSION=2313 bash# Windows (PowerShell)
$env:VP_PR_VERSION="2313"; irm https://vite.plus/ps1 | iexAfter installing, upgrade the current project's vite-plus to this test build with:
vp migrateOr 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.3a79c350a1c28c9f491c7c4642e42ed426dda78d",
"vite": "npm:@voidzero-dev/vite-plus-core@0.0.0-commit.3a79c350a1c28c9f491c7c4642e42ed426dda78d"
}
}
🐳 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-2313 2>/dev/null; docker pull ghcr.io/voidzero-dev/vite-plus:pr-2313Quick check: docker run --rm ghcr.io/voidzero-dev/vite-plus:pr-2313 vp --versionSee docs/guide/docker.md for usage. |
|
Verified the bridge build ( Baseline (repro as published, This build (catalog pinned to Same layout, core still resolving from the global store realpath, now working. Mechanism checks on the installed artifacts:
|
8fc4ef5 to
3a79c35
Compare
Release-built core resolves bundled Rolldown's native binding through vite-plus/binding, an export of a package core never declares, which breaks pnpm enable-global-virtual-store, Yarn PnP, and standalone core installs. The RFC keeps the per-platform rewrite direction from PR #2067 but moves the platform optionalDependencies pins out of the committed package.json and into the publish pipeline, mirroring how napi-rs injects the same packages into vite-plus.
Release builds now rewrite each supported @rolldown/binding-<platform> require to @voidzero-dev/vite-plus-<platform> (suffixes derived from the CLI's napi.targets via parseTriple) instead of collapsing all of them to vite-plus/binding, and rewrite each branch's version guard to core's version in the same specifier-anchored pattern. Branches for platforms Vite+ does not ship, the WASI fallback, and Rolldown's public VERSION export stay untouched, and the build fails if the rewrite counts diverge from the napi-rs loader shape. publish-native-addons.ts mirrors the napi-injected platform pins from packages/cli/package.json into core's optionalDependencies in both npm and pkg-pr-new modes, so core declares what its loader requires while the committed package.json stays pin-free and release version bumps, the dirty-tree check, and preview builds keep working. reusable-release-build.yml stamps packages/core/package.json so preview builds bake guard versions that match the bridge-served platform packages. Closes #2054 See rfcs/core-binding-resolution.md for the design.
binding-resolution-layout.spec.ts rebuilds pnpm's enable-global-virtual-store shape with stub packages and requires through it in a child process: the old collapsed rewrite fails with the exact #2054 error, the transform output resolves through the declared platform package, and the re-armed version guard rejects a mismatched platform package under NAPI_RS_ENFORCE_VERSION_CHECK. A PTY snapshot case cannot cover this because snapshot installs use dev-built core, which embeds the .node in dist and never takes the rewritten path. Writing the spec surfaced a transform gap: the guard rewrite only matched the bundled-chunk __require( form. It now also matches plain require( for raw CJS loader output; the build.ts count assertion would have caught the miss, but the transform should handle both.
The export existed only for the old collapsed @rolldown/binding-* rewrite. Nothing imports the specifier: the CLI loads its binding through a relative import, and no repo, dist, snapshot, or ecosystem reference exists. Old published cores that require it always pair with an old vite-plus through the exact version pin, so removal cannot strand them. The binding/ files still ship for the CLI's own relative import.
The rewrite transform now reports which platform suffixes it redirected, and the release build asserts set equality with the published platforms instead of a specifier/guard count ratio, so a dropped or renamed loader branch fails the build by name instead of shipping a partial rewrite. The platform-package prefix derives from the CLI's napi.packageName in both the transform and the publish script, removing three hard-coded copies of the scope string. Also: lazy-load @napi-rs/cli in build.ts (release-only, ~120ms saved on every dev core build), share one fresh package.json read in publish-native-addons.ts via readJsonFile, single-source the workflow's stamp/verify file list through GITHUB_ENV, simplify the guard regex and both specs, and shrink core BUNDLING.md's derived mapping table to examples plus a pointer at the napi.targets table.
3a79c35 to
e872dae
Compare
Closes #2054. Design:
rfcs/core-binding-resolution.md. Solid edges are declared dependencies; dashed is an undeclared runtime require.Before
flowchart TD app["user project"] --> vp["vite-plus"] vp -->|"dependency, exact pin"| core["@voidzero-dev/vite-plus-core<br>(bundled Rolldown)"] vp -->|"optionalDependencies x8,<br>injected at publish"| plat["@voidzero-dev/vite-plus-*<br>platform packages (merged .node)"] core -.->|"require('vite-plus/binding'),<br>undeclared"| vp linkStyle 3 stroke:#d33,stroke-width:2pxRelease-built core reaches its Rolldown binding by requiring back into
vite-plus, an undeclared cycle that only resolves through pnpm's hidden hoist. pnpmenable-global-virtual-store, Yarn PnP, and standalone core installs (thevitealias) fail withCannot find module 'vite-plus/binding'.After
Core's bundled Rolldown requires the same platform packages
vite-plusalready uses, declared throughoptionalDependenciesinjected at publish time. No new packages, no cycle, core works standalone, and package managers dedupe the shared platform package.