Skip to content

Commit

Permalink
fix: deduplicate peer deps
Browse files Browse the repository at this point in the history
close #5373
  • Loading branch information
zkochan committed Sep 19, 2022
1 parent cc0514c commit 743c7cc
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 5 deletions.
6 changes: 6 additions & 0 deletions .changeset/two-cobras-melt.md
@@ -0,0 +1,6 @@
---
"@pnpm/resolve-dependencies": patch
"pnpm": patch
---

Deduplicate peer dependencies when automatically installing them [#5373](https://github.com/pnpm/pnpm/issues/5373).
17 changes: 17 additions & 0 deletions packages/core/test/install/autoInstallPeers.ts
Expand Up @@ -148,6 +148,23 @@ test('don\'t install the same missing peer dependency twice', async () => {
].sort())
})

// Covers https://github.com/pnpm/pnpm/issues/5373
test('prefer the peer dependency version already used in the root', async () => {
await addDistTag({ package: '@pnpm/y', version: '2.0.0', distTag: 'latest' })
const project = prepareEmpty()
await install({
peerDependencies: {
'@pnpm.e2e/has-y-peer': '1.0.0',
'@pnpm/y': '^1.0.0',
},
}, await testDefaults({ autoInstallPeers: true }))
const lockfile = await project.readLockfile()
expect(Object.keys(lockfile.packages).sort()).toStrictEqual([
'/@pnpm/y/1.0.0',
'/@pnpm.e2e/has-y-peer/1.0.0_@pnpm+y@1.0.0',
].sort())
})

test('automatically install root peer dependencies', async () => {
const project = prepareEmpty()

Expand Down
24 changes: 19 additions & 5 deletions packages/resolve-dependencies/src/resolveDependencies.ts
Expand Up @@ -387,10 +387,10 @@ async function resolveDependenciesOfImporters (
}
const pkgAddressesByImportersWithoutPeers = await Promise.all(zipWith(async (importer, { pkgAddresses, postponedResolutionsQueue, postponedPeersResolutionQueue }) => {
const newPreferredVersions = { ...importer.preferredVersions }
const newParentPkgAliases = { ...importer.parentPkgAliases }
const currentParentPkgAliases = { ...importer.parentPkgAliases }
for (const pkgAddress of pkgAddresses) {
if (newParentPkgAliases[pkgAddress.alias] !== true) {
newParentPkgAliases[pkgAddress.alias] = pkgAddress
if (currentParentPkgAliases[pkgAddress.alias] !== true) {
currentParentPkgAliases[pkgAddress.alias] = pkgAddress
}
if (pkgAddress.updated) {
ctx.updatedSet.add(pkgAddress.alias)
Expand All @@ -402,6 +402,7 @@ async function resolveDependenciesOfImporters (
}
newPreferredVersions[resolvedPackage.name][resolvedPackage.version] = 'version'
}
const newParentPkgAliases = { ...importer.parentPkgAliases, ...currentParentPkgAliases }
const postponedResolutionOpts = {
preferredVersions: newPreferredVersions,
parentPkgAliases: newParentPkgAliases,
Expand All @@ -420,17 +421,30 @@ async function resolveDependenciesOfImporters (
const postponedPeersResolution = await Promise.all(
postponedPeersResolutionQueue.map((postponedMissingPeers) => postponedMissingPeers(postponedResolutionOpts.parentPkgAliases))
)
const resolvedPeers = [...childrenResults, ...postponedPeersResolution].reduce((acc, { resolvedPeers }) => Object.assign(acc, resolvedPeers), {})
const allMissingPeers = mergePkgsDeps(
[
...pkgAddresses,
...pkgAddresses.map((pkgAddress) => ({
...pkgAddress,
missingPeers: fromPairs(
Object.entries(pkgAddress.missingPeers || {})
.filter(([peerName]) => {
if (!currentParentPkgAliases[peerName]) return true
if (currentParentPkgAliases[peerName] !== true) {
resolvedPeers[peerName] = currentParentPkgAliases[peerName]
}
return false
})
),
})),
...childrenResults,
...postponedPeersResolution,
].map(({ missingPeers }) => missingPeers).filter(Boolean)
)
return {
missingPeers: allMissingPeers,
pkgAddresses,
resolvedPeers: [...childrenResults, ...postponedPeersResolution].reduce((acc, { resolvedPeers }) => Object.assign(acc, resolvedPeers), {}),
resolvedPeers,
}
}, importers, resolveResults))
return {
Expand Down

0 comments on commit 743c7cc

Please sign in to comment.