From ee5dde3894bef5ef5effb12a45a90018cdf852c4 Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Mon, 11 Nov 2024 10:16:09 +0100 Subject: [PATCH] fix: rendering of missing peer dependencies output (#8745) close #8538 --- .changeset/chatty-garlics-change.md | 5 ++++ .changeset/many-peas-switch.md | 6 ++++ packages/render-peer-issues/src/index.ts | 5 ++++ packages/render-peer-issues/test/index.ts | 30 +++++++++++++++++++ .../resolve-dependencies/src/resolvePeers.ts | 5 +++- pnpm/test/install/misc.ts | 15 ++++++++++ 6 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 .changeset/chatty-garlics-change.md create mode 100644 .changeset/many-peas-switch.md diff --git a/.changeset/chatty-garlics-change.md b/.changeset/chatty-garlics-change.md new file mode 100644 index 0000000000..bffecb76cd --- /dev/null +++ b/.changeset/chatty-garlics-change.md @@ -0,0 +1,5 @@ +--- +"@pnpm/render-peer-issues": patch +--- + +Don't fail to render missing peer dependencies, when the parents field is an empty array. diff --git a/.changeset/many-peas-switch.md b/.changeset/many-peas-switch.md new file mode 100644 index 0000000000..e01b05c519 --- /dev/null +++ b/.changeset/many-peas-switch.md @@ -0,0 +1,6 @@ +--- +"@pnpm/resolve-dependencies": patch +"pnpm": patch +--- + +Fix `Cannot read properties of undefined (reading 'name')` that is printed while trying to render the missing peer dependencies warning message [#8538](https://github.com/pnpm/pnpm/issues/8538). diff --git a/packages/render-peer-issues/src/index.ts b/packages/render-peer-issues/src/index.ts index 80b24c8455..18a707520c 100644 --- a/packages/render-peer-issues/src/index.ts +++ b/packages/render-peer-issues/src/index.ts @@ -114,6 +114,11 @@ interface PkgNode { } function createTree (pkgNode: PkgNode, pkgs: Array<{ name: string, version: string }>, issueText: string): void { + if (pkgs.length === 0) { + // This will happen if incorrect data is passed to the reporter. + // It is better to print something instead of crashing. + pkgs = [{ name: '', version: '' }] + } const [pkg, ...rest] = pkgs const label = `${pkg.name} ${chalk.grey(pkg.version)}` if (!pkgNode.dependencies[label]) { diff --git a/packages/render-peer-issues/test/index.ts b/packages/render-peer-issues/test/index.ts index cabf4a7b6f..da5b993218 100644 --- a/packages/render-peer-issues/test/index.ts +++ b/packages/render-peer-issues/test/index.ts @@ -382,3 +382,33 @@ test('renderPeerIssues() format correctly the version ranges with spaces and "*" }, }, { width: 500 }))).toMatchSnapshot() }) + +test('renderPeerIssues() do not fail if the parents array is empty', () => { + expect(stripAnsi(renderPeerIssues({ + '.': { + missing: { + foo: [ + { + parents: [], + optional: false, + wantedRange: '>=1.0.0 <3.0.0', + }, + ], + }, + bad: {}, + conflicts: [], + intersections: { + foo: '^1.0.0', + }, + }, + }, { + rules: { + ignoreMissing: [], + }, + width: 500, + })).trim()).toBe(`. +└─┬ + └── ✕ missing peer foo@">=1.0.0 <3.0.0" +Peer dependencies that should be installed: + foo@^1.0.0`) +}) diff --git a/pkg-manager/resolve-dependencies/src/resolvePeers.ts b/pkg-manager/resolve-dependencies/src/resolvePeers.ts index 0c287fff7c..e0e5e1fa07 100644 --- a/pkg-manager/resolve-dependencies/src/resolvePeers.ts +++ b/pkg-manager/resolve-dependencies/src/resolvePeers.ts @@ -437,7 +437,10 @@ async function resolvePeersOfNode ( if (ctx.peerDependencyIssues.missing[peerName] == null) { ctx.peerDependencyIssues.missing[peerName] = [] } - const { parents } = getLocationFromParentNodeIds(ctx) + const { parents } = getLocationFromParentNodeIds({ + dependenciesTree: ctx.dependenciesTree, + parentNodeIds, + }) ctx.peerDependencyIssues.missing[peerName].push({ optional, parents, diff --git a/pnpm/test/install/misc.ts b/pnpm/test/install/misc.ts index e180e3aeca..0bd6c5e426 100644 --- a/pnpm/test/install/misc.ts +++ b/pnpm/test/install/misc.ts @@ -533,3 +533,18 @@ test('installation fails when the stored package name and version do not match t await execPnpm(['install', '--config.strict-store-pkg-content-check=false', ...settings]) }) + +// Covers https://github.com/pnpm/pnpm/issues/8538 +test('do not fail to render peer dependencies warning, when cache was hit during peer resolution', () => { + prepare({ + dependencies: { + '@udecode/plate-ui-table': '18.15.0', + '@udecode/plate-ui-toolbar': '18.15.0', + }, + }) + + const result = execPnpmSync(['install', '--config.auto-install-peers=false']) + + expect(result.status).toBe(0) + expect(result.stdout.toString()).toContain('Issues with peer dependencies found') +})