From 3898585093aca5caf7f649b0d27a02f48c193300 Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Thu, 24 Jun 2021 10:53:50 +0300 Subject: [PATCH] fix: resolving peer deps from deps of root project (#3559) --- .changeset/late-ducks-relate.md | 5 +++ .../src/resolveDependencyTree.ts | 2 +- .../supi/test/install/peerDependencies.ts | 43 +++++++++++++++++-- 3 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 .changeset/late-ducks-relate.md diff --git a/.changeset/late-ducks-relate.md b/.changeset/late-ducks-relate.md new file mode 100644 index 0000000000..e930a4be63 --- /dev/null +++ b/.changeset/late-ducks-relate.md @@ -0,0 +1,5 @@ +--- +"@pnpm/resolve-dependencies": patch +--- + +Dependencies from the root workspace package should be used to resolve peer dependencies of any projects in the workspace. diff --git a/packages/resolve-dependencies/src/resolveDependencyTree.ts b/packages/resolve-dependencies/src/resolveDependencyTree.ts index 9dff25752f..f1ef94e863 100644 --- a/packages/resolve-dependencies/src/resolveDependencyTree.ts +++ b/packages/resolve-dependencies/src/resolveDependencyTree.ts @@ -116,7 +116,7 @@ export default async function ( // This may be optimized. // We only need to proceed resolving every dependency // if the newly added dependency has peer dependencies. - const proceed = importer.hasRemovedDependencies === true || importer.wantedDependencies.some((wantedDep) => wantedDep['isNew']) + const proceed = importer.id === '.' || importer.hasRemovedDependencies === true || importer.wantedDependencies.some((wantedDep) => wantedDep['isNew']) const resolveOpts = { currentDepth: 0, parentPkg: { diff --git a/packages/supi/test/install/peerDependencies.ts b/packages/supi/test/install/peerDependencies.ts index 21577d9f1c..510764ef27 100644 --- a/packages/supi/test/install/peerDependencies.ts +++ b/packages/supi/test/install/peerDependencies.ts @@ -207,7 +207,7 @@ test('peer dependency is resolved from the dependencies of the workspace root pr { buildIndex: 0, manifest: { - name: 'root', + name: 'pkg', version: '1.0.0', dependencies: { @@ -223,8 +223,45 @@ test('peer dependency is resolved from the dependencies of the workspace root pr message: 'ajv-keywords@1.5.0 requires a peer of ajv@>=4.10.0 but none was installed.', }) - const lockfile = await projects.root.readLockfile() - expect(lockfile.importers.pkg?.dependencies?.['ajv-keywords']).toBe('1.5.0_ajv@4.10.0') + { + const lockfile = await projects.root.readLockfile() + expect(lockfile.importers.pkg?.dependencies?.['ajv-keywords']).toBe('1.5.0_ajv@4.10.0') + } + + await mutateModules([ + { + buildIndex: 0, + manifest: { + name: 'root', + version: '1.0.0', + + dependencies: { + ajv: '4.10.0', + }, + }, + mutation: 'install', + rootDir: process.cwd(), + }, + { + buildIndex: 0, + manifest: { + name: 'pkg', + version: '1.0.0', + + dependencies: { + 'ajv-keywords': '1.5.0', + 'is-positive': '1.0.0', + }, + }, + mutation: 'install', + rootDir: path.resolve('pkg'), + }, + ], await testDefaults({ reporter })) + + { + const lockfile = await projects.root.readLockfile() + expect(lockfile.importers.pkg?.dependencies?.['ajv-keywords']).toBe('1.5.0_ajv@4.10.0') + } }) test('warning is reported when cannot resolve peer dependency for non-top-level dependency', async () => {