diff --git a/.changeset/quiet-zebras-repeat.md b/.changeset/quiet-zebras-repeat.md new file mode 100644 index 0000000000..025c7cd8cf --- /dev/null +++ b/.changeset/quiet-zebras-repeat.md @@ -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). diff --git a/installing/deps-installer/src/install/index.ts b/installing/deps-installer/src/install/index.ts index 9c4dc0269a..7a60fcef0f 100644 --- a/installing/deps-installer/src/install/index.ts +++ b/installing/deps-installer/src/install/index.ts @@ -681,7 +681,9 @@ export async function mutateModules ( > 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 devDependencies = project.targetDependenciesField ? {} : project.manifest.devDependencies ?? {} if (preferredSpecs == null) { diff --git a/installing/deps-installer/test/install/update.ts b/installing/deps-installer/test/install/update.ts index 32fb460dce..e47008cb7e 100644 --- a/installing/deps-installer/test/install/update.ts +++ b/installing/deps-installer/test/install/update.ts @@ -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') +}) diff --git a/pkg-manifest/utils/src/getAllDependenciesFromManifest.ts b/pkg-manifest/utils/src/getAllDependenciesFromManifest.ts index 75d8dc57a4..9a9a92c3df 100644 --- a/pkg-manifest/utils/src/getAllDependenciesFromManifest.ts +++ b/pkg-manifest/utils/src/getAllDependenciesFromManifest.ts @@ -1,11 +1,13 @@ import type { Dependencies, DependenciesField, ProjectManifest } from '@pnpm/types' export function getAllDependenciesFromManifest ( - pkg: Pick + pkg: Pick, + opts?: { autoInstallPeers?: boolean } ): Dependencies { return { ...pkg.devDependencies, ...pkg.dependencies, ...pkg.optionalDependencies, + ...(opts?.autoInstallPeers ? pkg.peerDependencies : {}), } as Dependencies } diff --git a/pkg-manifest/utils/src/index.ts b/pkg-manifest/utils/src/index.ts index 5b19e6546c..e84cc31cea 100644 --- a/pkg-manifest/utils/src/index.ts +++ b/pkg-manifest/utils/src/index.ts @@ -25,11 +25,13 @@ export function filterDependenciesByType ( } export function getAllDependenciesFromManifest ( - manifest: Pick + manifest: Pick, + opts?: { autoInstallPeers?: boolean } ): Dependencies { return { ...manifest.devDependencies, ...manifest.dependencies, ...manifest.optionalDependencies, + ...(opts?.autoInstallPeers ? manifest.peerDependencies : {}), } }