mirror of
https://github.com/pnpm/pnpm.git
synced 2026-07-28 16:37:47 -04:00
fix: upgrade peer dependencies with pnpm upgrade --latest (#9928)
The `--latest` flag triggers the `installSome` code path, which built `currentBareSpecifiers` via `getAllDependenciesFromManifest()` — a function that excluded peer dependencies. The non-`--latest` path uses `getWantedDependencies()`, which honors `autoInstallPeers` and includes them. Pass `autoInstallPeers` through `getAllDependenciesFromManifest` so both paths agree. Closes #9900 Co-authored-by: Zoltan Kochan <z@kochan.io>
This commit is contained in:
committed by
Zoltan Kochan
parent
55e35d0491
commit
005eeb776b
6
.changeset/quiet-zebras-repeat.md
Normal file
6
.changeset/quiet-zebras-repeat.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
"@pnpm/installing.deps-installer": patch
|
||||||
|
"pnpm": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
Fix peer dependencies not being upgraded with `pnpm upgrade --latest` [#9900](https://github.com/pnpm/pnpm/issues/9900).
|
||||||
@@ -681,7 +681,9 @@ export async function mutateModules (
|
|||||||
>
|
>
|
||||||
|
|
||||||
async function installSome (project: InstallSomeProject) {
|
async function installSome (project: InstallSomeProject) {
|
||||||
const currentBareSpecifiers = opts.ignoreCurrentSpecifiers ? {} : getAllDependenciesFromManifest(project.manifest)
|
const currentBareSpecifiers = opts.ignoreCurrentSpecifiers
|
||||||
|
? {}
|
||||||
|
: getAllDependenciesFromManifest(project.manifest, { autoInstallPeers: opts.autoInstallPeers })
|
||||||
const optionalDependencies = project.targetDependenciesField ? {} : project.manifest.optionalDependencies ?? {}
|
const optionalDependencies = project.targetDependenciesField ? {} : project.manifest.optionalDependencies ?? {}
|
||||||
const devDependencies = project.targetDependenciesField ? {} : project.manifest.devDependencies ?? {}
|
const devDependencies = project.targetDependenciesField ? {} : project.manifest.devDependencies ?? {}
|
||||||
if (preferredSpecs == null) {
|
if (preferredSpecs == null) {
|
||||||
|
|||||||
@@ -263,3 +263,36 @@ test('peer dependency is not added to prod deps on update', async () => {
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Covers https://github.com/pnpm/pnpm/issues/9900
|
||||||
|
test('peer dependencies are updated with pnpm upgrade --latest when autoInstallPeers is true', async () => {
|
||||||
|
await addDistTag({ package: '@pnpm.e2e/foo', version: '1.0.0', distTag: 'latest' })
|
||||||
|
|
||||||
|
const project = prepareEmpty()
|
||||||
|
|
||||||
|
const manifest = {
|
||||||
|
name: 'test-pkg',
|
||||||
|
version: '1.0.0',
|
||||||
|
peerDependencies: {
|
||||||
|
'@pnpm.e2e/foo': '^1.0.0',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
await install(manifest, testDefaults({ autoInstallPeers: true }))
|
||||||
|
|
||||||
|
let lockfile = project.readLockfile()
|
||||||
|
expect(lockfile.importers?.['.']?.dependencies?.['@pnpm.e2e/foo'].version).toBe('1.0.0')
|
||||||
|
|
||||||
|
await addDistTag({ package: '@pnpm.e2e/foo', version: '1.3.0', distTag: 'latest' })
|
||||||
|
|
||||||
|
await addDependenciesToPackage(manifest, ['@pnpm.e2e/foo'], testDefaults({
|
||||||
|
allowNew: false,
|
||||||
|
autoInstallPeers: true,
|
||||||
|
update: true,
|
||||||
|
updateToLatest: true,
|
||||||
|
}))
|
||||||
|
|
||||||
|
lockfile = project.readLockfile()
|
||||||
|
|
||||||
|
expect(lockfile.importers?.['.']?.dependencies?.['@pnpm.e2e/foo'].version).toBe('1.3.0')
|
||||||
|
})
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
import type { Dependencies, DependenciesField, ProjectManifest } from '@pnpm/types'
|
import type { Dependencies, DependenciesField, ProjectManifest } from '@pnpm/types'
|
||||||
|
|
||||||
export function getAllDependenciesFromManifest (
|
export function getAllDependenciesFromManifest (
|
||||||
pkg: Pick<ProjectManifest, DependenciesField>
|
pkg: Pick<ProjectManifest, DependenciesField | 'peerDependencies'>,
|
||||||
|
opts?: { autoInstallPeers?: boolean }
|
||||||
): Dependencies {
|
): Dependencies {
|
||||||
return {
|
return {
|
||||||
...pkg.devDependencies,
|
...pkg.devDependencies,
|
||||||
...pkg.dependencies,
|
...pkg.dependencies,
|
||||||
...pkg.optionalDependencies,
|
...pkg.optionalDependencies,
|
||||||
|
...(opts?.autoInstallPeers ? pkg.peerDependencies : {}),
|
||||||
} as Dependencies
|
} as Dependencies
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,11 +25,13 @@ export function filterDependenciesByType (
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function getAllDependenciesFromManifest (
|
export function getAllDependenciesFromManifest (
|
||||||
manifest: Pick<ProjectManifest, 'devDependencies' | 'dependencies' | 'optionalDependencies'>
|
manifest: Pick<ProjectManifest, 'devDependencies' | 'dependencies' | 'optionalDependencies' | 'peerDependencies'>,
|
||||||
|
opts?: { autoInstallPeers?: boolean }
|
||||||
): Dependencies {
|
): Dependencies {
|
||||||
return {
|
return {
|
||||||
...manifest.devDependencies,
|
...manifest.devDependencies,
|
||||||
...manifest.dependencies,
|
...manifest.dependencies,
|
||||||
...manifest.optionalDependencies,
|
...manifest.optionalDependencies,
|
||||||
|
...(opts?.autoInstallPeers ? manifest.peerDependencies : {}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user