feat: don't resolve peer dependencies from workspace root (#4469)

This commit is contained in:
Zoltan Kochan
2022-03-31 12:16:25 +03:00
committed by GitHub
parent 5581e4ef62
commit e7bdc2cc28
5 changed files with 9 additions and 134 deletions

View File

@@ -0,0 +1,8 @@
---
"@pnpm/core": major
"@pnpm/plugin-commands-installation": major
"pnpm": major
"@pnpm/resolve-dependencies": major
---
Dependencies of the root workspace project are not used to resolve peer dependencies of other workspace projects.

View File

@@ -224,92 +224,6 @@ test('strict-peer-dependencies: error is thrown when cannot resolve peer depende
})
})
test('peer dependency is resolved from the dependencies of the workspace root project', async () => {
const projects = preparePackages([
{
location: '.',
package: { name: 'root' },
},
{
location: 'pkg',
package: {},
},
])
const reporter = jest.fn()
await mutateModules([
{
buildIndex: 0,
manifest: {
name: 'root',
version: '1.0.0',
dependencies: {
ajv: '4.10.0',
},
},
mutation: 'install',
rootDir: process.cwd(),
},
{
buildIndex: 0,
manifest: {
name: 'pkg',
version: '1.0.0',
dependencies: {
'ajv-keywords': '1.5.0',
},
},
mutation: 'install',
rootDir: path.resolve('pkg'),
},
], await testDefaults({ reporter }))
expect(reporter).not.toHaveBeenCalledWith(expect.objectContaining({
name: 'pnpm:peer-dependency-issues',
}))
{
const lockfile = await projects.root.readLockfile()
expect(lockfile.importers.pkg?.dependencies?.['ajv-keywords']).toBe('1.5.0_ajv@4.10.0')
}
await mutateModules([
{
buildIndex: 0,
manifest: {
name: 'root',
version: '1.0.0',
dependencies: {
ajv: '4.10.0',
},
},
mutation: 'install',
rootDir: process.cwd(),
},
{
buildIndex: 0,
manifest: {
name: 'pkg',
version: '1.0.0',
dependencies: {
'ajv-keywords': '1.5.0',
'is-positive': '1.0.0',
},
},
mutation: 'install',
rootDir: path.resolve('pkg'),
},
], await testDefaults({ reporter }))
{
const lockfile = await projects.root.readLockfile()
expect(lockfile.importers.pkg?.dependencies?.['ajv-keywords']).toBe('1.5.0_ajv@4.10.0')
}
})
test('warning is reported when cannot resolve peer dependency for non-top-level dependency', async () => {
prepareEmpty()
await addDistTag({ package: 'abc-parent-with-ab', version: '1.0.0', distTag: 'latest' })

View File

@@ -262,19 +262,6 @@ export default async function recursive (
} as MutatedProject)
}
}))
if (!opts.selectedProjectsGraph[opts.workspaceDir] && manifestsByPath[opts.workspaceDir] != null) {
const localConfig = await memReadLocalConfig(opts.workspaceDir)
const modulesDir = localConfig.modulesDir ?? opts.modulesDir
const { manifest, writeProjectManifest } = manifestsByPath[opts.workspaceDir]
writeProjectManifests.push(writeProjectManifest)
mutatedImporters.push({
buildIndex: 0,
manifest,
modulesDir,
mutation: 'install',
rootDir: opts.workspaceDir,
} as MutatedProject)
}
if ((mutatedImporters.length === 0) && cmdFullName === 'update' && opts.depth === 0) {
throw new PnpmError('NO_PACKAGE_IN_DEPENDENCIES',
'None of the specified packages were found in the dependencies of any of the projects.')

View File

@@ -1498,32 +1498,3 @@ test('pnpm run should include the workspace root when --workspace-root option is
expect(await exists('test')).toBeTruthy()
expect(await exists('project/test')).toBeTruthy()
})
test('peer dependencies are resolved from the root of the workspace when a new dependency is added to a workspace project', async () => {
const projects = preparePackages([
{
location: '.',
package: {
name: 'project-1',
version: '1.0.0',
dependencies: {
ajv: '4.10.4',
},
},
},
{
name: 'project-2',
version: '1.0.0',
},
])
await writeYamlFile('pnpm-workspace.yaml', { packages: ['**', '!store/**'] })
process.chdir('project-2')
await execPnpm(['add', 'ajv-keywords@1.5.0', '--strict-peer-dependencies'])
const lockfile = await projects['project-1'].readLockfile()
expect(lockfile.packages).toHaveProperty(['/ajv-keywords/1.5.0_ajv@4.10.4'])
})

View File

@@ -67,16 +67,11 @@ export default function<T extends PartialResolvedPackage> (
const depGraph: GenericDependenciesGraph<T> = {}
const pathsByNodeId = {}
const _createPkgsByName = createPkgsByName.bind(null, opts.dependenciesTree)
const rootProject = opts.projects.length > 1 ? opts.projects.find(({ id }) => id === '.') : null
const rootPkgsByName = rootProject == null ? {} : _createPkgsByName(rootProject)
const peerDependencyIssuesByProjects: PeerDependencyIssuesByProjects = {}
for (const { directNodeIdsByAlias, topParents, rootDir, id } of opts.projects) {
const peerDependencyIssues: Pick<PeerDependencyIssues, 'bad' | 'missing'> = { bad: {}, missing: {} }
const pkgsByName = {
...rootPkgsByName,
..._createPkgsByName({ directNodeIdsByAlias, topParents }),
}
const pkgsByName = _createPkgsByName({ directNodeIdsByAlias, topParents })
resolvePeersOfChildren(directNodeIdsByAlias, pkgsByName, {
dependenciesTree: opts.dependenciesTree,