fix: don't override root deps when auto installing peers (#5442)

close #5412
This commit is contained in:
Zoltan Kochan
2022-10-03 03:39:34 +03:00
committed by GitHub
parent d30f3ac680
commit ff331dd957
3 changed files with 59 additions and 5 deletions

View File

@@ -0,0 +1,6 @@
---
"@pnpm/resolve-dependencies": patch
"pnpm": patch
---
Don't override the root dependency when auto installing peer dependencies [#5412](https://github.com/pnpm/pnpm/issues/5412).

View File

@@ -1,6 +1,6 @@
import path from 'path'
import assertProject from '@pnpm/assert-project'
import { addDependenciesToPackage, install, mutateModules } from '@pnpm/core'
import { addDependenciesToPackage, install, mutateModules, PackageManifest } from '@pnpm/core'
import { prepareEmpty, preparePackages } from '@pnpm/prepare'
import { addDistTag, REGISTRY_MOCK_PORT } from '@pnpm/registry-mock'
import rimraf from '@zkochan/rimraf'
@@ -347,3 +347,48 @@ test('installation on a package with many complex circular dependencies does not
prepareEmpty()
await addDependenciesToPackage({}, ['webpack@4.46.0'], await testDefaults({ autoInstallPeers: true }))
})
test('do not override the direct dependency with an auto installed peer dependency', async () => {
const includedDeps = new Set([
'@angular-devkit/build-angular',
'@angular/platform-browser-dynamic',
'inquirer',
'rxjs',
'@angular/common',
'rxjs',
])
const project = prepareEmpty()
await install({
dependencies: {
rxjs: '6.6.7',
},
devDependencies: {
'jest-preset-angular': '12.0.1',
},
}, await testDefaults({
autoInstallPeers: true,
hooks: {
// This hook may be removed and the test will still be valid.
// The only reason the hook was added to remove the packages that aren't needed for the tests and make the test faster.
readPackage: [
(pkg: PackageManifest) => {
for (const depType of ['dependencies', 'optionalDependencies', 'peerDependencies', 'peerDependenciesMeta']) {
if (pkg[depType]) {
for (const depName of Object.keys(pkg[depType])) {
if (!includedDeps.has(depName)) {
delete pkg[depType][depName]
}
}
}
}
if (pkg.name === '@angular-devkit/build-angular' && pkg.dependencies) {
delete pkg.dependencies.rxjs
}
return pkg
},
],
},
}))
const lockfile = await project.readLockfile()
expect(lockfile.dependencies.rxjs).toStrictEqual('6.6.7')
})

View File

@@ -302,7 +302,7 @@ export async function resolveRootDependencies (
})
importerResolutionResult = {
pkgAddresses: resolveDependenciesResult.pkgAddresses,
...(await resolveDependenciesResult.resolvingPeers),
...filterMissingPeers(await resolveDependenciesResult.resolvingPeers, parentPkgAliases),
}
pkgAddresses.push(...importerResolutionResult.pkgAddresses)
}
@@ -680,7 +680,7 @@ async function resolveDependenciesOfDependency (
postponedPeersResolution: resolveDependencyResult.missingPeersOfChildren != null
? async (parentPkgAliases) => {
const missingPeers = await resolveDependencyResult.missingPeersOfChildren!.get()
return filterMissingPeers(missingPeers, {}, parentPkgAliases)
return filterMissingPeers({ missingPeers, resolvedPeers: {} }, parentPkgAliases)
}
: undefined,
}
@@ -698,12 +698,15 @@ async function resolveDependenciesOfDependency (
postponedResolution: async (postponedResolutionOpts) => {
const { missingPeers, resolvedPeers } = await postponedResolution(postponedResolutionOpts)
resolveDependencyResult.missingPeersOfChildren!.resolve(missingPeers)
return filterMissingPeers(missingPeers, resolvedPeers, postponedResolutionOpts.parentPkgAliases)
return filterMissingPeers({ missingPeers, resolvedPeers }, postponedResolutionOpts.parentPkgAliases)
},
}
}
function filterMissingPeers (missingPeers: MissingPeers, resolvedPeers: ResolvedPeers, parentPkgAliases: ParentPkgAliases): PeersResolutionResult {
function filterMissingPeers (
{ missingPeers, resolvedPeers }: PeersResolutionResult,
parentPkgAliases: ParentPkgAliases
): PeersResolutionResult {
const newMissing = {} as MissingPeers
for (const [peerName, peerVersion] of Object.entries(missingPeers)) {
if (parentPkgAliases[peerName]) {