diff --git a/.changeset/strange-parents-drum.md b/.changeset/strange-parents-drum.md new file mode 100644 index 00000000000..330b68103e7 --- /dev/null +++ b/.changeset/strange-parents-drum.md @@ -0,0 +1,7 @@ +--- +"@pnpm/resolve-dependencies": patch +"pnpm": patch +--- + +Don't update a direct dependency that has the same name as a dependency in the workspace, when adding a new dependency to a workspace project [#4575](https://github.com/pnpm/pnpm/pull/4575). + diff --git a/packages/core/test/install/multipleImporters.ts b/packages/core/test/install/multipleImporters.ts index cb39c16ff30..2cd364ab1fe 100644 --- a/packages/core/test/install/multipleImporters.ts +++ b/packages/core/test/install/multipleImporters.ts @@ -1316,3 +1316,72 @@ test('install the dependency that is already present in the workspace when addin expect(currentLockfile.importers['project-1'].dependencies?.['dep-of-pkg-with-1-dep']).toBe('100.0.0') expect(currentLockfile.importers['project-2'].dependencies?.['dep-of-pkg-with-1-dep']).toBe('100.0.0') }) + +test('do not update dependency that has the same name as a dependency in the workspace', async () => { + await addDistTag({ package: 'dep-of-pkg-with-1-dep', version: '100.0.0', distTag: 'latest' }) + const manifest1: ProjectManifest = { + name: 'project-1', + version: '1.0.0', + dependencies: { + 'dep-of-pkg-with-1-dep': '^100.0.0', + }, + } + const manifest2: ProjectManifest = { name: 'dep-of-pkg-with-1-dep', version: '100.1.0' } + + preparePackages([ + { + location: 'project-1', + package: manifest1, + }, + { + location: 'project-2', + package: manifest2, + }, + ]) + + const importers: MutatedProject[] = [ + { + buildIndex: 0, + manifest: manifest1, + mutation: 'install', + rootDir: path.resolve('project-1'), + }, + { + buildIndex: 0, + manifest: manifest2, + mutation: 'install', + rootDir: path.resolve('project-2'), + }, + ] + const workspacePackages = { + 'project-1': { + '1.0.0': { + dir: path.resolve('project-1'), + manifest: manifest1, + }, + }, + 'dep-of-pkg-with-1-dep': { + '100.1.0': { + dir: path.resolve('project-2'), + manifest: manifest2, + }, + }, + } + await mutateModules(importers, await testDefaults({ linkWorkspacePackagesDepth: -1, workspacePackages })) + await addDistTag({ package: 'dep-of-pkg-with-1-dep', version: '100.1.0', distTag: 'latest' }) + await mutateModules([ + { + ...importers[0], + dependencySelectors: ['is-negative@2.1.0'], + mutation: 'installSome', + }, + importers[1], + ], await testDefaults({ linkWorkspacePackagesDepth: -1, workspacePackages, preferredVersions: {} })) + + const rootModules = assertProject(process.cwd()) + const currentLockfile = await rootModules.readCurrentLockfile() + expect(Object.keys(currentLockfile.packages)).toStrictEqual([ + '/dep-of-pkg-with-1-dep/100.0.0', + '/is-negative/2.1.0', + ]) +}) diff --git a/packages/resolve-dependencies/src/resolveDependencies.ts b/packages/resolve-dependencies/src/resolveDependencies.ts index f9e83436d94..f97bcb93106 100644 --- a/packages/resolve-dependencies/src/resolveDependencies.ts +++ b/packages/resolve-dependencies/src/resolveDependencies.ts @@ -283,6 +283,7 @@ async function resolveDependenciesOfDependency ( ) ) || Boolean( (options.workspacePackages != null) && + ctx.linkWorkspacePackagesDepth !== -1 && wantedDepIsLocallyAvailable( options.workspacePackages, extendedWantedDep.wantedDependency, diff --git a/utils/eslint-config/package.json b/utils/eslint-config/package.json index f89413eb150..04ea2bab04c 100644 --- a/utils/eslint-config/package.json +++ b/utils/eslint-config/package.json @@ -10,8 +10,7 @@ "bugs": { "url": "https://github.com/pnpm/eslint-config/issues" }, - "main": "lib/index.js", - "types": "lib/index.d.ts", + "main": "index.js", "directories": { "test": "test" },