Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Merged
merged 4 commits into from Mar 31, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
8 changes: 8 additions & 0 deletions .changeset/nice-comics-fly.md
@@ -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.
86 changes: 0 additions & 86 deletions packages/core/test/install/peerDependencies.ts
Expand Up @@ -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' })
Expand Down
13 changes: 0 additions & 13 deletions packages/plugin-commands-installation/src/recursive.ts
Expand Up @@ -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.')
Expand Down
29 changes: 0 additions & 29 deletions packages/pnpm/test/monorepo/index.ts
Expand Up @@ -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'])
})
7 changes: 1 addition & 6 deletions packages/resolve-dependencies/src/resolvePeers.ts
Expand Up @@ -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,
Expand Down