From 32dadefb537979ef7e981eff40dbb7756ee22049 Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Thu, 22 May 2025 15:26:51 +0200 Subject: [PATCH] fix: install exiting with 1 exit code and no error message (#9567) close #9559 --- .changeset/empty-files-laugh.md | 6 ++++ cli/default-reporter/src/reportError.ts | 7 +++- .../src/install/reportPeerDependencyIssues.ts | 2 +- .../test/filterPeerDependencyIssues.test.ts | 33 +++++++++++++++++++ 4 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 .changeset/empty-files-laugh.md diff --git a/.changeset/empty-files-laugh.md b/.changeset/empty-files-laugh.md new file mode 100644 index 0000000000..e3dccf00ac --- /dev/null +++ b/.changeset/empty-files-laugh.md @@ -0,0 +1,6 @@ +--- +"@pnpm/core": patch +"pnpm": patch +--- + +Installation should not exit with an error if `strictPeerDependencies` is `true` but all issues are ignored by `peerDependencyRules` [#9505](https://github.com/pnpm/pnpm/pull/9505). diff --git a/cli/default-reporter/src/reportError.ts b/cli/default-reporter/src/reportError.ts index 1714c5b95e..dd5c625a3c 100644 --- a/cli/default-reporter/src/reportError.ts +++ b/cli/default-reporter/src/reportError.ts @@ -444,7 +444,12 @@ function reportPeerDependencyIssuesError ( strictPeerDependencies: false `) const rendered = renderPeerIssues(msg.issuesByProjects) - if (!rendered) return null + if (!rendered) { + // This should never happen. + return { + title: err.message, + } + } return { title: err.message, body: `${rendered} diff --git a/pkg-manager/core/src/install/reportPeerDependencyIssues.ts b/pkg-manager/core/src/install/reportPeerDependencyIssues.ts index 865fed0291..a8313fc67e 100644 --- a/pkg-manager/core/src/install/reportPeerDependencyIssues.ts +++ b/pkg-manager/core/src/install/reportPeerDependencyIssues.ts @@ -45,7 +45,7 @@ export function filterPeerDependencyIssues ( newPeerDependencyIssuesByProjects[projectId] = { bad: {}, missing: {}, conflicts, intersections } for (const [peerName, issues] of Object.entries(missing)) { if ( - ignoreMissingMatcher(peerName) + ignoreMissingMatcher(peerName) || issues.every(({ optional }) => optional) ) { continue } diff --git a/pkg-manager/core/test/filterPeerDependencyIssues.test.ts b/pkg-manager/core/test/filterPeerDependencyIssues.test.ts index 57c4eb55d9..ff711640f7 100644 --- a/pkg-manager/core/test/filterPeerDependencyIssues.test.ts +++ b/pkg-manager/core/test/filterPeerDependencyIssues.test.ts @@ -207,3 +207,36 @@ test('filterPeerDependencyIssues() allowed versions', () => { }, }) }) + +test('filterPeerDependencyIssues() ignores missing optional dependency issues', () => { + expect(filterPeerDependencyIssues({ + '.': { + missing: { + aaa: [ + { + parents: [ + { + name: 'xxx', + version: '1.0.0', + }], + + optional: true, + wantedRange: '>=1.0.0 <3.0.0', + }, + ], + }, + bad: {}, + conflicts: [], + intersections: {}, + }, + }, { + allowAny: [], + })).toStrictEqual({ + '.': { + bad: {}, + conflicts: [], + intersections: {}, + missing: {}, + }, + }) +})