From db0c7e157611d52b4866b88b83d79fb8886ea272 Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Mon, 4 Jan 2021 02:23:18 +0200 Subject: [PATCH] fix: installing a new peer dependency PR #3057 --- .changeset/funny-doors-decide.md | 5 +++++ .../src/resolveDependencies.ts | 13 ++++++------ .../supi/test/install/peerDependencies.ts | 21 +++++++++++++++---- 3 files changed, 28 insertions(+), 11 deletions(-) create mode 100644 .changeset/funny-doors-decide.md diff --git a/.changeset/funny-doors-decide.md b/.changeset/funny-doors-decide.md new file mode 100644 index 0000000000..bb29031a45 --- /dev/null +++ b/.changeset/funny-doors-decide.md @@ -0,0 +1,5 @@ +--- +"@pnpm/resolve-dependencies": patch +--- + +When a new peer dependency is installed, don't remove the existing regular dependencies of the package that depends on the peer. diff --git a/packages/resolve-dependencies/src/resolveDependencies.ts b/packages/resolve-dependencies/src/resolveDependencies.ts index d649266caf..b71bab0712 100644 --- a/packages/resolve-dependencies/src/resolveDependencies.ts +++ b/packages/resolve-dependencies/src/resolveDependencies.ts @@ -432,15 +432,14 @@ function getDepsToResolve ( const infoFromLockfile = getInfoFromLockfile(wantedLockfile, options.registries, reference, wantedDependency.alias) if ( !proceedAll && - infoFromLockfile?.dependencyLockfile?.peerDependencies + (infoFromLockfile?.dependencyLockfile?.peerDependencies != null || !infoFromLockfile) ) { + if (infoFromLockfile?.dependencyLockfile?.peerDependencies) { + Object.keys(infoFromLockfile.dependencyLockfile.peerDependencies).forEach((peerName) => { + allPeers.add(peerName) + }) + } proceed = true - Object.keys(infoFromLockfile.dependencyLockfile.peerDependencies).forEach((peerName) => { - allPeers.add(peerName) - }) - } - if (!infoFromLockfile && !proceedAll) { - // In this case we don't know if the package depends on peer dependencies, so we proceed all. proceedAll = true for (const extendedWantedDep of extendedWantedDeps) { if (!extendedWantedDep.proceed) { diff --git a/packages/supi/test/install/peerDependencies.ts b/packages/supi/test/install/peerDependencies.ts index 2dfa85f494..cabc620ad6 100644 --- a/packages/supi/test/install/peerDependencies.ts +++ b/packages/supi/test/install/peerDependencies.ts @@ -240,12 +240,25 @@ test('strict-peer-dependencies: error is thrown when bad version of resolved pee test('top peer dependency is linked on subsequent install', async () => { prepareEmpty() - const manifest = await addDependenciesToPackage({}, ['ajv@4.10.4'], await testDefaults()) + const manifest = await addDependenciesToPackage({}, ['peer-c@1.0.0'], await testDefaults()) - await addDependenciesToPackage(manifest, ['ajv-keywords@1.5.0'], await testDefaults()) + await addDependenciesToPackage(manifest, ['abc-parent-with-ab@1.0.0'], await testDefaults()) - expect(await exists(path.resolve('node_modules/.pnpm/ajv-keywords@1.5.0/node_modules/ajv-keywords'))).toBeFalsy() - expect(await exists(path.resolve('node_modules/.pnpm/ajv-keywords@1.5.0_ajv@4.10.4/node_modules/ajv'))).toBeTruthy() + expect(await exists(path.resolve('node_modules/.pnpm/abc-parent-with-ab@1.0.0/node_modules/abc-parent-with-ab'))).toBeFalsy() + expect(await exists(path.resolve('node_modules/.pnpm/abc-parent-with-ab@1.0.0_peer-c@1.0.0/node_modules/abc-parent-with-ab'))).toBeTruthy() +}) + +test('top peer dependency is linked on subsequent install. Reverse order', async () => { + prepareEmpty() + console.log(process.cwd()) + + const manifest = await addDependenciesToPackage({}, ['abc-parent-with-ab@1.0.0'], await testDefaults()) + + await addDependenciesToPackage(manifest, ['peer-c@1.0.0'], await testDefaults()) + + expect(await exists(path.resolve('node_modules/.pnpm/abc-parent-with-ab@1.0.0/node_modules/abc-parent-with-ab'))).toBeFalsy() + expect(await exists(path.resolve('node_modules/.pnpm/abc-parent-with-ab@1.0.0_peer-c@1.0.0/node_modules/abc-parent-with-ab'))).toBeTruthy() + expect(await exists(path.resolve('node_modules/.pnpm/abc-parent-with-ab@1.0.0_peer-c@1.0.0/node_modules/is-positive'))).toBeTruthy() }) async function okFile (filename: string) {