fix(resolve-dependencies)): avoid not needed peer dependency warnings (#4144)

This commit is contained in:
Zoltan Kochan
2021-12-17 21:27:16 +02:00
committed by GitHub
parent 7bdfc03ea3
commit 7962c042ea
5 changed files with 75 additions and 2 deletions

View File

@@ -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.

View File

@@ -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",

View File

@@ -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<T extends PartialResolvedPackage> (
continue
}
if (!semver.satisfies(resolved.version, peerVersionRange, { loose: true })) {
if (!satisfiesWithPrereleases(resolved.version, peerVersionRange, true)) {
const location = getLocationFromNodeId({
dependenciesTree: ctx.dependenciesTree,
nodeId: ctx.nodeId,

View File

@@ -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'])
})
})

2
pnpm-lock.yaml generated
View File

@@ -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