From 77f7cee488c37956f88ad32d76fe474fd9fdf83b Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Fri, 23 Sep 2022 01:29:33 +0300 Subject: [PATCH] fix: cli crash with auto-install-peers=true (#5394) ref #5390 ref #5372 --- .changeset/twenty-wolves-destroy.md | 6 ++++++ packages/core/test/install/autoInstallPeers.ts | 6 ++++++ packages/resolve-dependencies/src/resolveDependencies.ts | 6 +++--- 3 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 .changeset/twenty-wolves-destroy.md 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, } }