mirror of
https://github.com/pnpm/pnpm.git
synced 2026-03-24 01:51:41 -04:00
feat: don't resolve peer dependencies from workspace root (#4469)
This commit is contained in:
8
.changeset/nice-comics-fly.md
Normal file
8
.changeset/nice-comics-fly.md
Normal 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.
|
||||
@@ -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' })
|
||||
|
||||
@@ -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.')
|
||||
|
||||
@@ -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'])
|
||||
})
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user