From 7962c042eae72c6406bcf1f38612eabf0f9f59dc Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Fri, 17 Dec 2021 21:27:16 +0200 Subject: [PATCH] fix(resolve-dependencies)): avoid not needed peer dependency warnings (#4144) --- .changeset/cool-radios-wash.md | 7 +++ packages/resolve-dependencies/package.json | 1 + .../resolve-dependencies/src/resolvePeers.ts | 4 +- .../resolve-dependencies/test/resolvePeers.ts | 63 +++++++++++++++++++ pnpm-lock.yaml | 2 + 5 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 .changeset/cool-radios-wash.md diff --git a/.changeset/cool-radios-wash.md b/.changeset/cool-radios-wash.md new file mode 100644 index 0000000000..4389793591 --- /dev/null +++ b/.changeset/cool-radios-wash.md @@ -0,0 +1,7 @@ +--- +"@pnpm/resolve-dependencies": patch +--- + +Don't warn about unmet peer dependency when the peer is resolved from a prerelease version. + +For instance, if a project has `react@*` as a peer dependency, then react `16.0.0-rc.0` should not cause a warning. diff --git a/packages/resolve-dependencies/package.json b/packages/resolve-dependencies/package.json index 10adc2353a..15cac6fd23 100644 --- a/packages/resolve-dependencies/package.json +++ b/packages/resolve-dependencies/package.json @@ -43,6 +43,7 @@ "@pnpm/store-controller-types": "workspace:11.0.9", "@pnpm/types": "workspace:7.7.1", "@pnpm/which-version-is-pinned": "workspace:1.0.0", + "@yarnpkg/core": "^3.2.0-rc.4", "dependency-path": "workspace:8.0.8", "encode-registry": "^3.0.0", "get-npm-tarball-url": "^2.0.3", diff --git a/packages/resolve-dependencies/src/resolvePeers.ts b/packages/resolve-dependencies/src/resolvePeers.ts index 195ecc0aaf..f9e44abab9 100644 --- a/packages/resolve-dependencies/src/resolvePeers.ts +++ b/packages/resolve-dependencies/src/resolvePeers.ts @@ -1,5 +1,6 @@ import crypto from 'crypto' import path from 'path' +import { satisfiesWithPrereleases } from '@yarnpkg/core/lib/semverUtils' import { Dependencies, PeerDependencyIssues, @@ -11,7 +12,6 @@ import fromPairs from 'ramda/src/fromPairs' import isEmpty from 'ramda/src/isEmpty' import pick from 'ramda/src/pick' import scan from 'ramda/src/scan' -import semver from 'semver' import { DependenciesTree, DependenciesTreeNode, @@ -415,7 +415,7 @@ function resolvePeers ( continue } - if (!semver.satisfies(resolved.version, peerVersionRange, { loose: true })) { + if (!satisfiesWithPrereleases(resolved.version, peerVersionRange, true)) { const location = getLocationFromNodeId({ dependenciesTree: ctx.dependenciesTree, nodeId: ctx.nodeId, diff --git a/packages/resolve-dependencies/test/resolvePeers.ts b/packages/resolve-dependencies/test/resolvePeers.ts index bcf1709301..2b4bc85be8 100644 --- a/packages/resolve-dependencies/test/resolvePeers.ts +++ b/packages/resolve-dependencies/test/resolvePeers.ts @@ -393,3 +393,66 @@ describe('peer dependency issues', () => { .toStrictEqual({ peer: '>=2.2.0 <3.0.0' }) }) }) + +describe('unmet peer dependency issues', () => { + const { peerDependencyIssuesByProjects } = resolvePeers({ + projects: [ + { + directNodeIdsByAlias: { + foo: '>project1>foo/1.0.0', + peer1: '>project1>peer1/1.0.0-rc.0', + peer2: '>project1>peer2/1.1.0-rc.0', + }, + topParents: [], + rootDir: '', + id: 'project1', + }, + ], + dependenciesTree: { + '>project1>foo/1.0.0': { + children: {}, + installable: true, + resolvedPackage: { + name: 'foo', + version: '1.0.0', + depPath: 'foo/1.0.0', + peerDependencies: { + peer1: '*', + peer2: '>=1', + }, + }, + depth: 0, + }, + '>project1>peer1/1.0.0-rc.0': { + children: {}, + installable: true, + resolvedPackage: { + name: 'peer1', + version: '1.0.0-rc.0', + depPath: 'peer/1.0.0-rc.0', + peerDependencies: {}, + }, + depth: 0, + }, + '>project1>peer2/1.1.0-rc.0': { + children: {}, + installable: true, + resolvedPackage: { + name: 'peer2', + version: '1.1.0-rc.0', + depPath: 'peer/1.1.0-rc.0', + peerDependencies: {}, + }, + depth: 0, + }, + }, + virtualStoreDir: '', + lockfileDir: '', + }) + it('should not warn when the found package has prerelease version and the wanted range is *', () => { + expect(peerDependencyIssuesByProjects).not.toHaveProperty(['project1', 'bad', 'peer1']) + }) + it('should not warn when the found package is a prerelease version but satisfies the range', () => { + expect(peerDependencyIssuesByProjects).not.toHaveProperty(['project1', 'bad', 'peer2']) + }) +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 07b8319d73..c1ec21535c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3095,6 +3095,7 @@ importers: '@pnpm/which-version-is-pinned': workspace:1.0.0 '@types/ramda': 0.27.39 '@types/semver': ^7.3.4 + '@yarnpkg/core': ^3.2.0-rc.4 dependency-path: workspace:8.0.8 encode-registry: ^3.0.0 get-npm-tarball-url: ^2.0.3 @@ -3121,6 +3122,7 @@ importers: '@pnpm/store-controller-types': link:../store-controller-types '@pnpm/types': link:../types '@pnpm/which-version-is-pinned': link:../which-version-is-pinned + '@yarnpkg/core': 3.2.0-rc.8 dependency-path: link:../dependency-path encode-registry: 3.0.0 get-npm-tarball-url: 2.0.3