mirror of
https://github.com/pnpm/pnpm.git
synced 2026-04-10 18:18:56 -04:00
fix: auto installing peer dep in a workspace (#5307)
* fix: auto installing peer dep in a workspace close #5144 * fix: auto installing peer dep in a workspace * fix: auto installing peer dep in a workspace
This commit is contained in:
7
.changeset/twenty-dragons-explode.md
Normal file
7
.changeset/twenty-dragons-explode.md
Normal file
@@ -0,0 +1,7 @@
|
||||
---
|
||||
"@pnpm/core": patch
|
||||
"@pnpm/resolve-dependencies": patch
|
||||
"pnpm": patch
|
||||
---
|
||||
|
||||
Auto installing a peer dependency in a workspace that also has it as a dev dependency in another project [#5144](https://github.com/pnpm/pnpm/issues/5144).
|
||||
@@ -1,3 +1,5 @@
|
||||
import path from 'path'
|
||||
import assertProject from '@pnpm/assert-project'
|
||||
import { addDependenciesToPackage, install, mutateModules } from '@pnpm/core'
|
||||
import { prepareEmpty, preparePackages } from '@pnpm/prepare'
|
||||
import { addDistTag, REGISTRY_MOCK_PORT } from '@pnpm/registry-mock'
|
||||
@@ -226,3 +228,41 @@ test('automatically install root peer dependencies', async () => {
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
test('automatically install peer dependency when it is a dev dependency in another workspace project', async () => {
|
||||
prepareEmpty()
|
||||
|
||||
await mutateModules([
|
||||
{
|
||||
buildIndex: 0,
|
||||
manifest: {
|
||||
name: 'project-1',
|
||||
devDependencies: {
|
||||
'is-positive': '1.0.0',
|
||||
},
|
||||
},
|
||||
mutation: 'install',
|
||||
rootDir: path.resolve('project-1'),
|
||||
},
|
||||
{
|
||||
buildIndex: 0,
|
||||
manifest: {
|
||||
name: 'project-2',
|
||||
peerDependencies: {
|
||||
'is-positive': '1.0.0',
|
||||
},
|
||||
},
|
||||
mutation: 'install',
|
||||
rootDir: path.resolve('project-2'),
|
||||
},
|
||||
], await testDefaults({ autoInstallPeers: true }))
|
||||
|
||||
const project = assertProject(process.cwd())
|
||||
const lockfile = await project.readLockfile()
|
||||
expect(lockfile.importers['project-1'].devDependencies).toStrictEqual({
|
||||
'is-positive': '1.0.0',
|
||||
})
|
||||
expect(lockfile.importers['project-2'].dependencies).toStrictEqual({
|
||||
'is-positive': '1.0.0',
|
||||
})
|
||||
})
|
||||
|
||||
@@ -135,6 +135,16 @@ export default async function (
|
||||
}
|
||||
|
||||
if (updatedManifest != null) {
|
||||
if (opts.autoInstallPeers) {
|
||||
if (updatedManifest.peerDependencies) {
|
||||
const allDeps = getAllDependenciesFromManifest(updatedManifest)
|
||||
for (const [peerName, peerRange] of Object.entries(updatedManifest.peerDependencies)) {
|
||||
if (allDeps[peerName]) continue
|
||||
updatedManifest.dependencies ??= {}
|
||||
updatedManifest.dependencies[peerName] = peerRange
|
||||
}
|
||||
}
|
||||
}
|
||||
const projectSnapshot = opts.wantedLockfile.importers[project.id]
|
||||
opts.wantedLockfile.importers[project.id] = addDirectDependenciesToLockfile(
|
||||
updatedManifest,
|
||||
@@ -334,14 +344,7 @@ function addDirectDependenciesToLockfile (
|
||||
return acc
|
||||
}, {})
|
||||
|
||||
let allDepsObj = getAllDependenciesFromManifest(newManifest)
|
||||
if (autoInstallPeers) {
|
||||
allDepsObj = {
|
||||
...newManifest.peerDependencies,
|
||||
...allDepsObj,
|
||||
}
|
||||
}
|
||||
const allDeps = Array.from(new Set(Object.keys(allDepsObj)))
|
||||
const allDeps = Array.from(new Set(Object.keys(getAllDependenciesFromManifest(newManifest))))
|
||||
|
||||
for (const alias of allDeps) {
|
||||
if (directDependenciesByAlias[alias]) {
|
||||
|
||||
Reference in New Issue
Block a user