diff --git a/.changeset/twenty-wolves-destroy.md b/.changeset/twenty-wolves-destroy.md new file mode 100644 index 00000000000..004117a0716 --- /dev/null +++ b/.changeset/twenty-wolves-destroy.md @@ -0,0 +1,6 @@ +--- +"@pnpm/resolve-dependencies": patch +"pnpm": patch +--- + +Don't crash when auto-install-peers is true and the project has many complex circular dependencies. diff --git a/packages/core/test/install/autoInstallPeers.ts b/packages/core/test/install/autoInstallPeers.ts index b92df5be05f..855f71b2ff2 100644 --- a/packages/core/test/install/autoInstallPeers.ts +++ b/packages/core/test/install/autoInstallPeers.ts @@ -341,3 +341,9 @@ test('auto install peer deps in a workspace. test #2', async () => { }, ], await testDefaults({ autoInstallPeers: true })) }) + +// This test may be removed if autoInstallPeers will become true by default +test('installation on a package with many complex circular dependencies does not fail when auto install peers is on', async () => { + prepareEmpty() + await addDependenciesToPackage({}, ['webpack@4.46.0'], await testDefaults({ autoInstallPeers: true })) +}) diff --git a/packages/resolve-dependencies/src/resolveDependencies.ts b/packages/resolve-dependencies/src/resolveDependencies.ts index d61faa091ef..3b82b5719b9 100644 --- a/packages/resolve-dependencies/src/resolveDependencies.ts +++ b/packages/resolve-dependencies/src/resolveDependencies.ts @@ -158,7 +158,7 @@ export interface ResolutionContext { virtualStoreDir: string updateMatching?: (pkgName: string) => boolean workspacePackages?: WorkspacePackages - missingPeersOfChildrenByPkgId: Record + missingPeersOfChildrenByPkgId: Record } export type MissingPeers = Record @@ -1278,7 +1278,7 @@ async function resolveDependency ( let missingPeersOfChildren!: MissingPeersOfChildren | undefined if (!nodeIdContains(options.parentPkg.nodeId, depPath)) { if (ctx.missingPeersOfChildrenByPkgId[pkgResponse.body.id]) { - if (!options.parentPkg.nodeId.startsWith(ctx.missingPeersOfChildrenByPkgId[pkgResponse.body.id].parentNodeId)) { + if (!options.parentPkg.nodeId.startsWith(ctx.missingPeersOfChildrenByPkgId[pkgResponse.body.id].parentImporterId)) { missingPeersOfChildren = ctx.missingPeersOfChildrenByPkgId[pkgResponse.body.id].missingPeersOfChildren } } else { @@ -1289,7 +1289,7 @@ async function resolveDependency ( get: pShare(p.promise), } ctx.missingPeersOfChildrenByPkgId[pkgResponse.body.id] = { - parentNodeId: options.parentPkg.nodeId, + parentImporterId: options.parentPkg.nodeId.substring(0, options.parentPkg.nodeId.indexOf('>', 1) + 1), missingPeersOfChildren, } }