|
| 1 | +--- |
| 2 | +date: 2026-07-26 |
| 3 | +repo: pnpm/pnpm |
| 4 | +size: L |
| 5 | +title: "pnpm lands major install and resolver fixes" |
| 6 | +excerpt: "Big day of install-lifecycle, lockfile, and peer-resolution fixes, plus CLI parity and a GVS crash fix." |
| 7 | +commits: 17 |
| 8 | +authors: [zkochan] |
| 9 | +commit_authors: {"5ed47dc": zkochan, "1e22aa1": zkochan, "5de55a1": zkochan, "b9df82e": zkochan, "d7d0ba7": zkochan, "b726d9f": zkochan, "51c849f": zkochan, "723dc76": zkochan, "208e5af": zkochan, "f892e3d": zkochan, "076f6cc": zkochan, "760b2ec": zkochan, "8c041fe": zkochan, "291ab43": zkochan, "01dc5ac": zkochan} |
| 10 | +--- |
| 11 | + |
| 12 | +### **Record bundledDependencies correctly** (5ed47dc) |
| 13 | +pnpm now preserves and honors `bundledDependencies` during install and bin linking, including the `bundleDependencies: true` form that means “bundle everything in `dependencies`.” This fixes a real packaging bug where bundled names could be dropped from the lockfile/install flow. |
| 14 | + |
| 15 | +### **Run `pnpm:devPreinstall` at the right time** (1e22aa1) |
| 16 | +The root project’s `pnpm:devPreinstall` hook now runs once per install before resolution/linking, matching pnpm’s behavior and unblocking workspaces that rely on it to prepare install-time state. It’s skipped in the expected no-script paths like `--ignore-scripts`, `--dry-run`, `--lockfile-only`, `fetch`, `rebuild`, and already-up-to-date installs. |
| 17 | + |
| 18 | +### **Resolve `$dep-name` override self-references** (5de55a1) |
| 19 | +Overrides that use `$foo` now resolve to the root manifest’s declared specifier for `foo` instead of staying as a raw `$foo` reference. That restores frozen-install compatibility with lockfiles written by pnpm 11 and prevents false `ERR_PNPM_OUTDATED_LOCKFILE` failures. |
| 20 | + |
| 21 | +### **Fix peer-edge keys to keep the provider’s depPath** (b9df82e) |
| 22 | +Peer edges are now keyed to the provider node’s own resolved depPath instead of being rewritten to a fabricated variant. This closes a lockfile/resolution mismatch that showed up in large workspace installs, including the remaining `next.js` reproduction. |
| 23 | + |
| 24 | +### **Make `dedupe --check` report the actual diff** (d7d0ba7) |
| 25 | +`pnpm dedupe --check` now prints what would change, returns a dedicated `ERR_PNPM_DEDUPE_CHECK_ISSUES` diagnostic, and warns when peer issues remain. The same work also restores `pnpm peers check` as a valid command spelling, matching the documented CLI surface. |
| 26 | + |
| 27 | +### **Give local directory deps their own GVS slot** (51c849f) |
| 28 | +Installing local `file:` directory dependencies with the global virtual store no longer crashes, and directory snapshots now get a project-scoped slot instead of being shared across unrelated projects. That fixes the broken symlink / `undefined.split` failure mode for local and injected directory packages. |
| 29 | + |
| 30 | +### **Rewrite `jsr:` deps on `update --latest`** (723dc76) |
| 31 | +`update --latest` now rewrites `jsr:` specifiers back to the picked version instead of leaving them stale. Without this, JSR dependencies could survive a latest update unchanged because the resolver never reported a normalized bare specifier. |
| 32 | + |
| 33 | +### **Match pnpm’s lifecycle-script selection rules** (208e5af) |
| 34 | +Projects now run their own lifecycle scripts based on pnpm’s per-project mutation rules instead of a single full-install flag. This fixes `add`, targeted `update`, workspace-root behavior, and other install-family commands that previously fired scripts for the wrong set of projects. |
| 35 | + |
| 36 | +### **Hoist root local deps by version, not path** (f892e3d) |
| 37 | +When a workspace root dependency is declared with `link:`, `file:`, or path-style `workspace:`, peers hoisted from that root now resolve against the linked package’s version rather than the raw path. That avoids broken symlinks and incorrect peer resolution for root-local packages. |
| 38 | + |
| 39 | +### **Free disk before coverage runs** (076f6cc) |
| 40 | +The codecov workflow now cleans up preinstalled toolchains before the coverage build. This is a CI reliability fix to stop the runner from hitting “No space left on device” mid-job. |
| 41 | + |
| 42 | +### **Close remaining CLI-surface parity gaps** (760b2ec) |
| 43 | +Several pnpm 12 CLI/reporting mismatches were restored, including the `Scope:` line, cached lockfile-verification timing, and the build-approval placeholder in `pnpm-workspace.yaml`. This is mostly parity work, but it touches user-facing output and workflow behavior. |
| 44 | + |
| 45 | +### **Fix peer-context divergences in large workspaces** (8c041fe) |
| 46 | +The resolver now matches pnpm’s handling for packages that shadow a peer in `dependencies`, and it collapses duplicate peer-suffixed variants more consistently. This addresses lockfile drift seen in larger workspaces where pnpm 11 and pacquet were producing different graphs. |
| 47 | + |
| 48 | +### **Support `publishConfig.name` for renamed publishes** (291ab43) |
| 49 | +Publishing now respects `publishConfig.name`, letting a package publish under a different registry name than its workspace manifest name. That also unblocks changelog, ledger, and release tooling paths that key off the published name. |
| 50 | + |
| 51 | +### **Fail frozen installs when recorded settings drift** (01dc5ac) |
| 52 | +Frozen installs now check more lockfile settings, including `autoInstallPeers`, `dedupePeers`, and `excludeLinksFromLockfile`. This closes a reproducibility hole where pnpm would have rejected the install but pacquet previously proceeded against a stale lockfile. |
| 53 | + |
| 54 | +### Other misc changes |
| 55 | +- Dependency and toolchain bumps, including Node.js, pnpm, and GitHub Actions configs (b726d9f) |
| 56 | +- Additional resolver/install test coverage across workspaces, peers, GVS, and lifecycle scripts |
| 57 | +- Minor internal refactors and reporter/output plumbing to support the fixes above |
0 commit comments