mirror of
https://github.com/pnpm/pnpm.git
synced 2026-03-27 11:31:45 -04:00
* fix: correctly identify workspace packages in all operations * fix: use Set for workspacePackages lookup and add uninstallSome test Use Set<string> instead of string[] for workspacePackages in dedupeInjectedDeps for O(1) lookups. Add test covering pnpm rm (uninstallSome) to directly reproduce the scenario from #9518. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: rename workspacePackages to workspaceProjectIds and add defensive guard Address Copilot review comments: - Rename `workspacePackages` to `workspaceProjectIds` to avoid confusion with the `WorkspacePackages` type used elsewhere in the codebase. - Add a defensive guard in `getDedupeMap` to skip deps whose target project is not in `dependenciesByProjectId`, preventing a potential runtime error if the function is called with a partial project set. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: use allProjectIds from ctx.projects instead of wantedLockfile.importers wantedLockfile.importers may not always contain all workspace projects (e.g. when pruneLockfileImporters is true during subset operations). Pass allProjectIds explicitly from ctx.projects, which is the authoritative source for all workspace project IDs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: make allProjectIds a required field All callers of resolveDependencies now explicitly pass allProjectIds rather than falling back to wantedLockfile.importers. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: rewrite test to actually reproduce the bug from #9518 The previous tests used mutateModules with all projects in allProjects, which caused installInContext to expand the projects list — hiding the bug. The real bug occurs when mutateModulesInSingleProject is used (as pnpm rm does from a single package directory), where allProjects contains only the operated-on package. The new test uses mutateModulesInSingleProject for the removal step, matching the actual pnpm rm code path. It correctly fails without the fix (receives "file:b" instead of "link:../b") and passes with it. Also fixes the workspaceProjectIds source to merge both allProjectIds and wantedLockfile.importers, since in single-project operations allProjectIds only has one project while the lockfile has all of them. Refines the defensive guard in getDedupeMap to allow deduplication when the target project has no children (empty set is always a subset). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: make workspaceProjectIds required in resolvePeers Remove the optional marker and empty-set fallback. All callers now provide this explicitly, and test call sites pass new Set(). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Zoltan Kochan <z@kochan.io> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>