From 0de12affd4b2b59052b344f236d10d4df2342735 Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Fri, 16 Sep 2022 04:05:35 +0300 Subject: [PATCH] fix: auto-install-peers in a workspace wip --- .../core/test/install/autoInstallPeers.ts | 31 +++++++++++- .../src/resolveDependencies.ts | 47 +++++++++++++++---- 2 files changed, 67 insertions(+), 11 deletions(-) diff --git a/packages/core/test/install/autoInstallPeers.ts b/packages/core/test/install/autoInstallPeers.ts index d1fd1ea600a..cb824551d82 100644 --- a/packages/core/test/install/autoInstallPeers.ts +++ b/packages/core/test/install/autoInstallPeers.ts @@ -134,7 +134,7 @@ test('don\'t auto-install a peer dependency, when that dependency is in the root ].sort()) }) -test('don\'t install the same missing peer dependency twice', async () => { +test.only('don\'t install the same missing peer dependency twice', async () => { await addDistTag({ package: '@pnpm/y', version: '2.0.0', distTag: 'latest' }) const project = prepareEmpty() await addDependenciesToPackage({}, [ @@ -295,3 +295,32 @@ test('auto install peer deps in a workspace', async () => { }, ], await testDefaults({ autoInstallPeers: true })) }) + +test('auto install peer deps in a workspace', async () => { + prepareEmpty() + await mutateModules([ + { + buildIndex: 0, + manifest: { + name: 'root-project', + devDependencies: { + '@pnpm.e2e/abc-parent-with-ab': '1.0.0', + '@pnpm.e2e/peer-c': '1.0.0', + }, + }, + mutation: 'install', + rootDir: process.cwd(), + }, + { + buildIndex: 0, + manifest: { + name: 'project', + peerDependencies: { + '@pnpm.e2e/abc-parent-with-ab': '1.0.0', + }, + }, + mutation: 'install', + rootDir: path.resolve('project'), + }, + ], await testDefaults({ autoInstallPeers: true })) +}) diff --git a/packages/resolve-dependencies/src/resolveDependencies.ts b/packages/resolve-dependencies/src/resolveDependencies.ts index 05ce0fc9249..2f60b7e5e79 100644 --- a/packages/resolve-dependencies/src/resolveDependencies.ts +++ b/packages/resolve-dependencies/src/resolveDependencies.ts @@ -591,10 +591,27 @@ async function resolveDependenciesOfDependency ( if (!resolveDependencyResult.isNew) { return { resolveDependencyResult, - postponedResolution: async () => ({ - missingPeers: await resolveDependencyResult.missingPeersOfChildren.promise, - resolvedPeers: {}, - }), + postponedResolution: async (postponedResolutionOpts) => { + const missingPeers = await resolveDependencyResult.missingPeersOfChildren.promise + const newMissing = {} as MissingPeers + const resolvedPeers = {} as ResolvedPeers + for (const [peerName, peerVersion] of Object.entries(missingPeers)) { + // if (!postponedResolutionOpts.parentPkgAliases[peerName]) { + // newMissing[peerName] = range + // } + if (postponedResolutionOpts.parentPkgAliases[peerName]) { + if (postponedResolutionOpts.parentPkgAliases[peerName] !== true) { + resolvedPeers[peerName] = postponedResolutionOpts.parentPkgAliases[peerName] as PkgAddress + } + } else { + newMissing[peerName] = peerVersion + } + } + return { + missingPeers: newMissing, + resolvedPeers, + } + }, } } @@ -611,7 +628,21 @@ async function resolveDependenciesOfDependency ( try { const result = await postponedResolution(postponedResolutionOpts) resolveDependencyResult.missingPeersOfChildren.resolve(result.missingPeers) - return result + const newMissing = {} as MissingPeers + const resolvedPeers = {} as ResolvedPeers + for (const [peerName, peerVersion] of Object.entries(result.missingPeers)) { + if (postponedResolutionOpts.parentPkgAliases[peerName]) { + if (postponedResolutionOpts.parentPkgAliases[peerName] !== true) { + resolvedPeers[peerName] = postponedResolutionOpts.parentPkgAliases[peerName] as PkgAddress + } + } else { + newMissing[peerName] = peerVersion + } + } + return { + resolvedPeers, + missingPeers: newMissing, + } } catch (err) { resolveDependencyResult.missingPeersOfChildren.reject(err) throw err @@ -1223,11 +1254,7 @@ function getMissingPeers (pkg: PackageManifest, parentPkgAliases: ParentPkgAlias const missingPeers = {} as MissingPeers const resolvedPeers = {} as ResolvedPeers for (const [peerName, peerVersion] of Object.entries(pkg.peerDependencies ?? {})) { - if (parentPkgAliases[peerName]) { - if (parentPkgAliases[peerName] !== true) { - resolvedPeers[peerName] = parentPkgAliases[peerName] as PkgAddress - } - } else if (!pkg.peerDependenciesMeta?.[peerName]?.optional) { + if (!pkg.peerDependenciesMeta?.[peerName]?.optional) { missingPeers[peerName] = peerVersion } }