feat: strict-peer-dependencies is true by default (#4427)

This commit is contained in:
Zoltan Kochan
2022-03-10 11:54:19 +02:00
committed by GitHub
parent d504dc380c
commit 73d71a2d5b
12 changed files with 47 additions and 35 deletions

View File

@@ -0,0 +1,6 @@
---
"@pnpm/config": major
"@pnpm/core": major
---
`strict-peer-dependencies` is `true` by default.

View File

@@ -208,7 +208,7 @@ export default async (
shrinkwrap: npmDefaults.shrinkwrap,
reverse: false,
sort: true,
'strict-peer-dependencies': false,
'strict-peer-dependencies': true,
'unsafe-perm': npmDefaults['unsafe-perm'],
'use-beta-cli': false,
userconfig: npmDefaults.userconfig,

View File

@@ -154,7 +154,7 @@ const defaults = async (opts: InstallOptions) => {
symlink: true,
storeController: opts.storeController,
storeDir: opts.storeDir,
strictPeerDependencies: false,
strictPeerDependencies: true,
tag: 'latest',
unsafePerm: process.platform === 'win32' ||
process.platform === 'cygwin' ||

View File

@@ -1177,7 +1177,7 @@ test('memory consumption is under control on huge package with many peer depende
version: '0.0.0',
},
['@teambit/bit@0.0.30'],
await testDefaults({ fastUnpack: true, lockfileOnly: true })
await testDefaults({ fastUnpack: true, lockfileOnly: true, strictPeerDependencies: false })
)
expect(await exists('pnpm-lock.yaml')).toBeTruthy()
@@ -1193,7 +1193,7 @@ test('memory consumption is under control on huge package with many peer depende
version: '0.0.0',
},
['@teambit/react@0.0.30'],
await testDefaults({ fastUnpack: true, lockfileOnly: true })
await testDefaults({ fastUnpack: true, lockfileOnly: true, strictPeerDependencies: false })
)
expect(await exists('pnpm-lock.yaml')).toBeTruthy()

View File

@@ -1150,7 +1150,7 @@ test('resolve a subdependency from the workspace and use it as a peer', async ()
},
},
}
await mutateModules(importers, await testDefaults({ linkWorkspacePackagesDepth: Infinity, workspacePackages }))
await mutateModules(importers, await testDefaults({ linkWorkspacePackagesDepth: Infinity, strictPeerDependencies: false, workspacePackages }))
const project = assertProject(process.cwd())

View File

@@ -56,6 +56,7 @@ test('nothing is needlessly removed from node_modules', async () => {
prepareEmpty()
const opts = await testDefaults({
modulesCacheMaxAge: 0,
strictPeerDependencies: false,
})
const manifest = await addDependenciesToPackage({}, ['using-ajv', 'ajv-keywords@1.5.0'], opts)
@@ -143,7 +144,7 @@ test('the right peer dependency is used in every workspace package', async () =>
rootDir: path.resolve('project-2'),
},
]
await mutateModules(importers, await testDefaults({ lockfileOnly: true }))
await mutateModules(importers, await testDefaults({ lockfileOnly: true, strictPeerDependencies: false }))
const lockfile = await readYamlFile<Lockfile>(path.resolve(WANTED_LOCKFILE))
@@ -161,7 +162,7 @@ test('warning is reported when cannot resolve peer dependency for top-level depe
const reporter = jest.fn()
await addDependenciesToPackage({}, ['ajv-keywords@1.5.0'], await testDefaults({ reporter }))
await addDependenciesToPackage({}, ['ajv-keywords@1.5.0'], await testDefaults({ reporter, strictPeerDependencies: false }))
expect(reporter).toHaveBeenCalledWith(
expect.objectContaining({
@@ -315,7 +316,7 @@ test('warning is reported when cannot resolve peer dependency for non-top-level
const reporter = jest.fn()
await addDependenciesToPackage({}, ['abc-grand-parent-without-c'], await testDefaults({ reporter }))
await addDependenciesToPackage({}, ['abc-grand-parent-without-c'], await testDefaults({ reporter, strictPeerDependencies: false }))
expect(reporter).toHaveBeenCalledWith(
expect.objectContaining({
@@ -360,7 +361,7 @@ test('warning is reported when bad version of resolved peer dependency for non-t
const reporter = jest.fn()
await addDependenciesToPackage({}, ['abc-grand-parent-without-c', 'peer-c@2'], await testDefaults({ reporter }))
await addDependenciesToPackage({}, ['abc-grand-parent-without-c', 'peer-c@2'], await testDefaults({ reporter, strictPeerDependencies: false }))
expect(reporter).toHaveBeenCalledWith(
expect.objectContaining({
@@ -457,9 +458,9 @@ test('top peer dependency is linked on subsequent install', async () => {
test('top peer dependency is linked on subsequent install, through transitive peer', async () => {
prepareEmpty()
const manifest = await addDependenciesToPackage({}, ['abc-grand-parent@1.0.0'], await testDefaults())
const manifest = await addDependenciesToPackage({}, ['abc-grand-parent@1.0.0'], await testDefaults({ strictPeerDependencies: false }))
await addDependenciesToPackage(manifest, ['peer-c@1.0.0'], await testDefaults())
await addDependenciesToPackage(manifest, ['peer-c@1.0.0'], await testDefaults({ strictPeerDependencies: false }))
expect(await exists(path.resolve('node_modules/.pnpm/abc-grand-parent@1.0.0_peer-c@1.0.0/node_modules/abc-grand-parent'))).toBeTruthy()
})
@@ -498,9 +499,9 @@ test('the list of transitive peer dependencies is kept up to date', async () =>
test('top peer dependency is linked on subsequent install. Reverse order', async () => {
prepareEmpty()
const manifest = await addDependenciesToPackage({}, ['abc-parent-with-ab@1.0.0'], await testDefaults())
const manifest = await addDependenciesToPackage({}, ['abc-parent-with-ab@1.0.0'], await testDefaults({ strictPeerDependencies: false }))
await addDependenciesToPackage(manifest, ['peer-c@1.0.0'], await testDefaults({ modulesCacheMaxAge: 0 }))
await addDependenciesToPackage(manifest, ['peer-c@1.0.0'], await testDefaults({ modulesCacheMaxAge: 0, strictPeerDependencies: false }))
expect(await exists(path.resolve('node_modules/.pnpm/abc-parent-with-ab@1.0.0/node_modules/abc-parent-with-ab'))).toBeFalsy()
expect(await exists(path.resolve('node_modules/.pnpm/abc-parent-with-ab@1.0.0_peer-c@1.0.0/node_modules/abc-parent-with-ab'))).toBeTruthy()
@@ -519,7 +520,7 @@ test('peer dependencies are linked when running one named installation', async (
prepareEmpty()
const manifest = await addDependenciesToPackage({}, ['abc-grand-parent-with-c', 'abc-parent-with-ab', 'peer-c@2.0.0'], await testDefaults())
const manifest = await addDependenciesToPackage({}, ['abc-grand-parent-with-c', 'abc-parent-with-ab', 'peer-c@2.0.0'], await testDefaults({ strictPeerDependencies: false }))
const pkgVariationsDir = path.resolve('node_modules/.pnpm/abc@1.0.0')
@@ -542,7 +543,7 @@ test('peer dependencies are linked when running one named installation', async (
// this part was failing. See issue: https://github.com/pnpm/pnpm/issues/1201
await addDistTag({ package: 'peer-a', version: '1.0.1', distTag: 'latest' })
await install(manifest, await testDefaults({ update: true, depth: 100 }))
await install(manifest, await testDefaults({ update: true, depth: 100, strictPeerDependencies: false }))
})
test('peer dependencies are linked when running two separate named installations', async () => {
@@ -550,8 +551,8 @@ test('peer dependencies are linked when running two separate named installations
await addDistTag({ package: 'peer-c', version: '1.0.0', distTag: 'latest' })
prepareEmpty()
const manifest = await addDependenciesToPackage({}, ['abc-grand-parent-with-c', 'peer-c@2.0.0'], await testDefaults())
await addDependenciesToPackage(manifest, ['abc-parent-with-ab'], await testDefaults())
const manifest = await addDependenciesToPackage({}, ['abc-grand-parent-with-c', 'peer-c@2.0.0'], await testDefaults({ strictPeerDependencies: false }))
await addDependenciesToPackage(manifest, ['abc-parent-with-ab'], await testDefaults({ strictPeerDependencies: false }))
const pkgVariationsDir = path.resolve('node_modules/.pnpm/abc@1.0.0')
@@ -685,7 +686,7 @@ test('peer dependency is grouped with dependent when the peer is a top dependenc
const reporter = sinon.spy()
await addDependenciesToPackage({}, ['ajv@4.10.4', 'ajv-keywords@1.5.0'], await testDefaults({ reporter, lockfileDir: path.resolve('..') }))
await addDependenciesToPackage({}, ['ajv@4.10.4', 'ajv-keywords@1.5.0'], await testDefaults({ reporter, lockfileDir: path.resolve('..'), strictPeerDependencies: false }))
expect(reporter.calledWithMatch({
message: `localhost+${REGISTRY_MOCK_PORT}/ajv-keywords@1.5.0 requires a peer of ajv@>=4.10.0 but none was installed.`,
@@ -718,8 +719,8 @@ test('peer dependency is grouped correctly with peer installed via separate inst
dependencies: {
abc: '1.0.0',
},
}, await testDefaults({ reporter, lockfileDir }))
await addDependenciesToPackage(manifest, ['peer-c@2.0.0'], await testDefaults({ reporter, lockfileDir }))
}, await testDefaults({ reporter, lockfileDir, strictPeerDependencies: false }))
await addDependenciesToPackage(manifest, ['peer-c@2.0.0'], await testDefaults({ reporter, lockfileDir, strictPeerDependencies: false }))
expect(await exists(path.join('../node_modules/.pnpm/abc@1.0.0_peer-c@2.0.0/node_modules/dep-of-pkg-with-1-dep'))).toBeTruthy()
})
@@ -730,7 +731,7 @@ test('peer dependency is grouped with dependent when the peer is a top dependenc
process.chdir('_')
const lockfileDir = path.resolve('..')
let manifest = await addDependenciesToPackage({}, ['ajv@4.10.4', 'ajv-keywords@1.5.0'], await testDefaults({ lockfileDir }))
let manifest = await addDependenciesToPackage({}, ['ajv@4.10.4', 'ajv-keywords@1.5.0'], await testDefaults({ lockfileDir, strictPeerDependencies: false }))
{
const lockfile = await readYamlFile<Lockfile>(path.resolve('..', WANTED_LOCKFILE))
@@ -746,7 +747,7 @@ test('peer dependency is grouped with dependent when the peer is a top dependenc
})
}
manifest = await install(manifest, await testDefaults({ lockfileDir }))
manifest = await install(manifest, await testDefaults({ lockfileDir, strictPeerDependencies: false }))
{
const lockfile = await readYamlFile<Lockfile>(path.resolve('..', WANTED_LOCKFILE))
@@ -774,6 +775,7 @@ test('peer dependency is grouped with dependent when the peer is a top dependenc
],
await testDefaults({
lockfileDir,
strictPeerDependencies: false,
})
)
@@ -835,7 +837,7 @@ test('external lockfile: peer dependency is grouped with dependent even after a
process.chdir('_')
const lockfileDir = path.resolve('..')
const manifest = await addDependenciesToPackage({}, ['peer-c@1.0.0', 'abc-parent-with-ab@1.0.0'], await testDefaults({ lockfileDir }))
const manifest = await addDependenciesToPackage({}, ['peer-c@1.0.0', 'abc-parent-with-ab@1.0.0'], await testDefaults({ lockfileDir, strictPeerDependencies: false }))
{
const lockfile = await readYamlFile<Lockfile>(path.resolve('..', WANTED_LOCKFILE))
@@ -851,7 +853,7 @@ test('external lockfile: peer dependency is grouped with dependent even after a
})
}
await addDependenciesToPackage(manifest, ['peer-c@2.0.0'], await testDefaults({ lockfileDir }))
await addDependenciesToPackage(manifest, ['peer-c@2.0.0'], await testDefaults({ lockfileDir, strictPeerDependencies: false }))
{
const lockfile = await readYamlFile<Lockfile>(path.resolve('..', WANTED_LOCKFILE))
@@ -1004,7 +1006,7 @@ test('warning is not reported when cannot resolve optional peer dependency', asy
const reporter = jest.fn()
await addDependenciesToPackage({}, ['abc-optional-peers@1.0.0', 'peer-c@2.0.0'], await testDefaults({ reporter }))
await addDependenciesToPackage({}, ['abc-optional-peers@1.0.0', 'peer-c@2.0.0'], await testDefaults({ reporter, strictPeerDependencies: false }))
expect(reporter).toHaveBeenCalledWith(
expect.objectContaining({
@@ -1076,7 +1078,7 @@ test('warning is not reported when cannot resolve optional peer dependency (spec
const reporter = jest.fn()
await addDependenciesToPackage({}, ['abc-optional-peers-meta-only@1.0.0', 'peer-c@2.0.0'], await testDefaults({ reporter }))
await addDependenciesToPackage({}, ['abc-optional-peers-meta-only@1.0.0', 'peer-c@2.0.0'], await testDefaults({ reporter, strictPeerDependencies: false }))
expect(reporter).toHaveBeenCalledWith(
expect.objectContaining({
@@ -1187,7 +1189,7 @@ test('peer dependency that is resolved by a dev dependency', async () => {
mutation: 'install',
rootDir: process.cwd(),
},
], await testDefaults({ fastUnpack: false, lockfileOnly: true }))
], await testDefaults({ fastUnpack: false, lockfileOnly: true, strictPeerDependencies: false }))
const lockfile = await project.readLockfile()
expect(lockfile.packages['/@types/mongoose/5.7.32'].dev).toBeTruthy()

View File

@@ -119,10 +119,10 @@ test("lockfile doesn't lock subdependencies that don't satisfy the new specs", a
const project = prepareEmpty()
// dependends on react-onclickoutside@5.9.0
const manifest = await addDependenciesToPackage({}, ['react-datetime@2.8.8'], await testDefaults({ fastUnpack: false, save: true }))
const manifest = await addDependenciesToPackage({}, ['react-datetime@2.8.8'], await testDefaults({ fastUnpack: false, save: true, strictPeerDependencies: false }))
// dependends on react-onclickoutside@0.3.4
await addDependenciesToPackage(manifest, ['react-datetime@1.3.0'], await testDefaults({ save: true }))
await addDependenciesToPackage(manifest, ['react-datetime@1.3.0'], await testDefaults({ save: true, strictPeerDependencies: false }))
expect(
project.requireModule('.pnpm/react-datetime@1.3.0/node_modules/react-onclickoutside/package.json').version

View File

@@ -233,7 +233,10 @@ when running add/update with the --workspace option')
rootDir: opts.dir,
targetDependenciesField: getSaveType(opts),
}
let [updatedImporter] = await mutateModules([mutatedProject], installOpts)
let [updatedImporter] = await mutateModules([mutatedProject], {
...installOpts,
strictPeerDependencies: opts.autoInstallPeers ? false : installOpts.strictPeerDependencies,
})
if (opts.save !== false) {
if (opts.autoInstallPeers && !isEmpty(updatedImporter.peerDependencyIssues?.intersections ?? {})) {
logger.info({

View File

@@ -65,6 +65,7 @@ export function rcOptionsTypes () {
'shared-workspace-lockfile',
'store',
'store-dir',
'strict-peer-dependencies',
'virtual-store-dir',
], allTypes)
}

View File

@@ -92,10 +92,10 @@ test('filterLog hook filters peer dependency warning', async () => {
}
`
await fs.writeFile('.pnpmfile.cjs', pnpmfile, 'utf8')
const result = execPnpmSync(['add', '@rollup/pluginutils@3.1.0'])
const result = execPnpmSync(['add', '@rollup/pluginutils@3.1.0', '--no-strict-peer-dependencies'])
expect(result.status).toBe(0)
expect(result.stdout.toString()).toEqual(
expect.not.stringContaining('requires a peer of rollup')
)
})
})

View File

@@ -607,8 +607,8 @@ test('readPackage hook is used during removal inside a workspace', async () => {
`, 'utf8')
process.chdir('project')
await execPnpm(['install'])
await execPnpm(['uninstall', 'is-positive'])
await execPnpm(['install', '--no-strict-peer-dependencies'])
await execPnpm(['uninstall', 'is-positive', '--no-strict-peer-dependencies'])
process.chdir('..')
const lockfile = await readYamlFile<Lockfile>('pnpm-lock.yaml')

View File

@@ -1189,7 +1189,7 @@ test('peer dependency is grouped with dependent when the peer is a top dependenc
})
}
await execPnpm(['uninstall', 'ajv'])
await execPnpm(['uninstall', 'ajv', '--no-strict-peer-dependencies'])
{
const lockfile = await readYamlFile<Lockfile>(path.resolve('..', WANTED_LOCKFILE))