mirror of
https://github.com/pnpm/pnpm.git
synced 2026-04-28 19:14:56 -04:00
fix: don't override root deps when auto installing peers (#5442)
close #5412
This commit is contained in:
6
.changeset/slow-panthers-refuse.md
Normal file
6
.changeset/slow-panthers-refuse.md
Normal 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).
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import path from 'path'
|
import path from 'path'
|
||||||
import assertProject from '@pnpm/assert-project'
|
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 { prepareEmpty, preparePackages } from '@pnpm/prepare'
|
||||||
import { addDistTag, REGISTRY_MOCK_PORT } from '@pnpm/registry-mock'
|
import { addDistTag, REGISTRY_MOCK_PORT } from '@pnpm/registry-mock'
|
||||||
import rimraf from '@zkochan/rimraf'
|
import rimraf from '@zkochan/rimraf'
|
||||||
@@ -347,3 +347,48 @@ test('installation on a package with many complex circular dependencies does not
|
|||||||
prepareEmpty()
|
prepareEmpty()
|
||||||
await addDependenciesToPackage({}, ['webpack@4.46.0'], await testDefaults({ autoInstallPeers: true }))
|
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')
|
||||||
|
})
|
||||||
|
|||||||
@@ -302,7 +302,7 @@ export async function resolveRootDependencies (
|
|||||||
})
|
})
|
||||||
importerResolutionResult = {
|
importerResolutionResult = {
|
||||||
pkgAddresses: resolveDependenciesResult.pkgAddresses,
|
pkgAddresses: resolveDependenciesResult.pkgAddresses,
|
||||||
...(await resolveDependenciesResult.resolvingPeers),
|
...filterMissingPeers(await resolveDependenciesResult.resolvingPeers, parentPkgAliases),
|
||||||
}
|
}
|
||||||
pkgAddresses.push(...importerResolutionResult.pkgAddresses)
|
pkgAddresses.push(...importerResolutionResult.pkgAddresses)
|
||||||
}
|
}
|
||||||
@@ -680,7 +680,7 @@ async function resolveDependenciesOfDependency (
|
|||||||
postponedPeersResolution: resolveDependencyResult.missingPeersOfChildren != null
|
postponedPeersResolution: resolveDependencyResult.missingPeersOfChildren != null
|
||||||
? async (parentPkgAliases) => {
|
? async (parentPkgAliases) => {
|
||||||
const missingPeers = await resolveDependencyResult.missingPeersOfChildren!.get()
|
const missingPeers = await resolveDependencyResult.missingPeersOfChildren!.get()
|
||||||
return filterMissingPeers(missingPeers, {}, parentPkgAliases)
|
return filterMissingPeers({ missingPeers, resolvedPeers: {} }, parentPkgAliases)
|
||||||
}
|
}
|
||||||
: undefined,
|
: undefined,
|
||||||
}
|
}
|
||||||
@@ -698,12 +698,15 @@ async function resolveDependenciesOfDependency (
|
|||||||
postponedResolution: async (postponedResolutionOpts) => {
|
postponedResolution: async (postponedResolutionOpts) => {
|
||||||
const { missingPeers, resolvedPeers } = await postponedResolution(postponedResolutionOpts)
|
const { missingPeers, resolvedPeers } = await postponedResolution(postponedResolutionOpts)
|
||||||
resolveDependencyResult.missingPeersOfChildren!.resolve(missingPeers)
|
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
|
const newMissing = {} as MissingPeers
|
||||||
for (const [peerName, peerVersion] of Object.entries(missingPeers)) {
|
for (const [peerName, peerVersion] of Object.entries(missingPeers)) {
|
||||||
if (parentPkgAliases[peerName]) {
|
if (parentPkgAliases[peerName]) {
|
||||||
|
|||||||
Reference in New Issue
Block a user