diff --git a/.changeset/few-bikes-add.md b/.changeset/few-bikes-add.md new file mode 100644 index 0000000000..89e48f0a0f --- /dev/null +++ b/.changeset/few-bikes-add.md @@ -0,0 +1,5 @@ +--- +"@pnpm/dependency-path": major +--- + +createPeersFolderSuffix renamed to createPeersDirSuffix. diff --git a/packages/dependency-path/src/index.ts b/packages/dependency-path/src/index.ts index a4f455eb20..410d2bde60 100644 --- a/packages/dependency-path/src/index.ts +++ b/packages/dependency-path/src/index.ts @@ -118,7 +118,7 @@ function depPathToFilenameUnescaped (depPath: string) { return depPath.replace(':', '+') } -export function createPeersFolderSuffix (peers: Array<{ name: string, version: string }>): string { +export function createPeersDirSuffix (peers: Array<{ name: string, version: string }>): string { const folderName = peers.map(({ name, version }) => `${name}@${version}`).sort().join(')(') return `(${folderName})` } diff --git a/pkg-manager/core/test/install/autoInstallPeers.ts b/pkg-manager/core/test/install/autoInstallPeers.ts index 252224da31..e784621ca5 100644 --- a/pkg-manager/core/test/install/autoInstallPeers.ts +++ b/pkg-manager/core/test/install/autoInstallPeers.ts @@ -4,7 +4,7 @@ import { addDependenciesToPackage, install, mutateModules, mutateModulesInSingle import { prepareEmpty, preparePackages } from '@pnpm/prepare' import { addDistTag, REGISTRY_MOCK_PORT } from '@pnpm/registry-mock' import rimraf from '@zkochan/rimraf' -import { createPeersFolderSuffix } from '@pnpm/dependency-path' +import { createPeersDirSuffix } from '@pnpm/dependency-path' import { testDefaults } from '../utils' test('auto install non-optional peer dependencies', async () => { @@ -71,7 +71,7 @@ test('hoist a peer dependency in order to reuse it by other dependencies, when i const project = prepareEmpty() await addDependenciesToPackage({}, ['@pnpm/xyz-parent-parent-parent-parent', '@pnpm/xyz-parent-parent-with-xyz'], await testDefaults({ autoInstallPeers: true })) const lockfile = await project.readLockfile() - const suffix = createPeersFolderSuffix([{ name: '@pnpm/x', version: '1.0.0' }, { name: '@pnpm/y', version: '1.0.0' }, { name: '@pnpm/z', version: '1.0.0' }]) + const suffix = createPeersDirSuffix([{ name: '@pnpm/x', version: '1.0.0' }, { name: '@pnpm/y', version: '1.0.0' }, { name: '@pnpm/z', version: '1.0.0' }]) expect(Object.keys(lockfile.packages)).toStrictEqual([ '/@pnpm/x@1.0.0', `/@pnpm/xyz-parent-parent-parent-parent@1.0.0${suffix}`, @@ -94,8 +94,8 @@ test('don\'t hoist a peer dependency when there is a root dependency by that nam `http://localhost:${REGISTRY_MOCK_PORT}/@pnpm/y/-/y-2.0.0.tgz`, ], await testDefaults({ autoInstallPeers: true })) const lockfile = await project.readLockfile() - const suffix1 = createPeersFolderSuffix([{ name: '@pnpm/y', version: '2.0.0' }, { name: '@pnpm/z', version: '1.0.0' }, { name: '@pnpm.e2e/peer-a', version: '1.0.0' }]) - const suffix2 = createPeersFolderSuffix([{ name: '@pnpm/x', version: '1.0.0' }, { name: '@pnpm/y', version: '1.0.0' }, { name: '@pnpm/z', version: '1.0.0' }]) + const suffix1 = createPeersDirSuffix([{ name: '@pnpm/y', version: '2.0.0' }, { name: '@pnpm/z', version: '1.0.0' }, { name: '@pnpm.e2e/peer-a', version: '1.0.0' }]) + const suffix2 = createPeersDirSuffix([{ name: '@pnpm/x', version: '1.0.0' }, { name: '@pnpm/y', version: '1.0.0' }, { name: '@pnpm/z', version: '1.0.0' }]) expect(Object.keys(lockfile.packages).sort()).toStrictEqual([ '/@pnpm.e2e/peer-a@1.0.0', '/@pnpm/x@1.0.0', @@ -121,7 +121,7 @@ test('don\'t auto-install a peer dependency, when that dependency is in the root `http://localhost:${REGISTRY_MOCK_PORT}/@pnpm/y/-/y-2.0.0.tgz`, ], await testDefaults({ autoInstallPeers: true })) const lockfile = await project.readLockfile() - const suffix = createPeersFolderSuffix([{ name: '@pnpm/y', version: '2.0.0' }, { name: '@pnpm/z', version: '1.0.0' }, { name: '@pnpm.e2e/peer-a', version: '1.0.0' }]) + const suffix = createPeersDirSuffix([{ name: '@pnpm/y', version: '2.0.0' }, { name: '@pnpm/z', version: '1.0.0' }, { name: '@pnpm.e2e/peer-a', version: '1.0.0' }]) expect(Object.keys(lockfile.packages).sort()).toStrictEqual([ `/@pnpm/xyz-parent-parent-parent-parent@1.0.0${suffix}`, `/@pnpm/xyz-parent-parent-parent@1.0.0${suffix}`, @@ -143,7 +143,7 @@ test('don\'t install the same missing peer dependency twice', async () => { const lockfile = await project.readLockfile() expect(Object.keys(lockfile.packages).sort()).toStrictEqual([ '/@pnpm/y@1.0.0', - `/@pnpm.e2e/has-has-y-peer-peer@1.0.0${createPeersFolderSuffix([{ name: '@pnpm/y', version: '1.0.0' }, { name: '@pnpm.e2e/has-y-peer', version: '1.0.0' }])}`, + `/@pnpm.e2e/has-has-y-peer-peer@1.0.0${createPeersDirSuffix([{ name: '@pnpm/y', version: '1.0.0' }, { name: '@pnpm.e2e/has-y-peer', version: '1.0.0' }])}`, '/@pnpm.e2e/has-y-peer@1.0.0(@pnpm/y@1.0.0)', ].sort()) }) diff --git a/pkg-manager/core/test/install/defaultPeerDependencies.ts b/pkg-manager/core/test/install/defaultPeerDependencies.ts index 85cbd2c7c3..a37b48ce96 100644 --- a/pkg-manager/core/test/install/defaultPeerDependencies.ts +++ b/pkg-manager/core/test/install/defaultPeerDependencies.ts @@ -3,7 +3,7 @@ import { prepareEmpty } from '@pnpm/prepare' import { addDistTag } from '@pnpm/registry-mock' import { addDependenciesToPackage } from '@pnpm/core' import deepRequireCwd from 'deep-require-cwd' -import { createPeersFolderSuffix } from '@pnpm/dependency-path' +import { createPeersDirSuffix } from '@pnpm/dependency-path' import exists from 'path-exists' import { testDefaults } from '../utils' @@ -26,7 +26,7 @@ test('don\'t install the default peer dependency when it may be resolved from pa const lockfile = await project.readLockfile() expect(Object.keys(lockfile.packages)).toStrictEqual([ '/@pnpm.e2e/dep-of-pkg-with-1-dep@101.0.0', - `/@pnpm.e2e/has-default-peer@1.0.0${createPeersFolderSuffix([{ name: '@pnpm.e2e/dep-of-pkg-with-1-dep', version: '101.0.0' }])}`, + `/@pnpm.e2e/has-default-peer@1.0.0${createPeersDirSuffix([{ name: '@pnpm.e2e/dep-of-pkg-with-1-dep', version: '101.0.0' }])}`, ]) }) diff --git a/pkg-manager/core/test/install/multipleImporters.ts b/pkg-manager/core/test/install/multipleImporters.ts index d1795e20ab..faeea52728 100644 --- a/pkg-manager/core/test/install/multipleImporters.ts +++ b/pkg-manager/core/test/install/multipleImporters.ts @@ -13,7 +13,7 @@ import { mutateModulesInSingleProject, } from '@pnpm/core' import rimraf from '@zkochan/rimraf' -import { createPeersFolderSuffix } from '@pnpm/dependency-path' +import { createPeersDirSuffix } from '@pnpm/dependency-path' import loadJsonFile from 'load-json-file' import exists from 'path-exists' import pick from 'ramda/src/pick' @@ -1475,8 +1475,8 @@ test('resolve a subdependency from the workspace and use it as a peer', async () const project = assertProject(process.cwd()) const wantedLockfile = await project.readLockfile() - const suffix1 = createPeersFolderSuffix([{ name: '@pnpm.e2e/peer-a', version: '@pnpm.e2e+peer-a' }, { name: '@pnpm.e2e/peer-b', version: '1.0.0' }]) - const suffix2 = createPeersFolderSuffix([{ name: '@pnpm.e2e/peer-a', version: '@pnpm.e2e+peer-a' }, { name: '@pnpm.e2e/peer-b', version: '1.0.0' }, { name: '@pnpm.e2e/peer-c', version: '1.0.1' }]) + const suffix1 = createPeersDirSuffix([{ name: '@pnpm.e2e/peer-a', version: '@pnpm.e2e+peer-a' }, { name: '@pnpm.e2e/peer-b', version: '1.0.0' }]) + const suffix2 = createPeersDirSuffix([{ name: '@pnpm.e2e/peer-a', version: '@pnpm.e2e+peer-a' }, { name: '@pnpm.e2e/peer-b', version: '1.0.0' }, { name: '@pnpm.e2e/peer-c', version: '1.0.1' }]) expect(Object.keys(wantedLockfile.packages).sort()).toStrictEqual( [ '/@pnpm.e2e/abc-grand-parent-with-c@1.0.0', diff --git a/pkg-manager/core/test/install/peerDependencies.ts b/pkg-manager/core/test/install/peerDependencies.ts index ee047d7ca3..dcccb17ab9 100644 --- a/pkg-manager/core/test/install/peerDependencies.ts +++ b/pkg-manager/core/test/install/peerDependencies.ts @@ -19,7 +19,7 @@ import rimraf from '@zkochan/rimraf' import exists from 'path-exists' import sinon from 'sinon' import deepRequireCwd from 'deep-require-cwd' -import { createPeersFolderSuffix, depPathToFilename } from '@pnpm/dependency-path' +import { createPeersDirSuffix, depPathToFilename } from '@pnpm/dependency-path' import { testDefaults } from '../utils' const f = fixtures(__dirname) @@ -551,7 +551,7 @@ test('peer dependencies are linked when running one named installation', async ( const pkgVariation1 = path.join( 'node_modules/.pnpm', - depPathToFilename(`/@pnpm.e2e/abc@1.0.0${createPeersFolderSuffix([{ name: '@pnpm.e2e/peer-a', version: '1.0.0' }, { name: '@pnpm.e2e/peer-b', version: '1.0.0' }, { name: '@pnpm.e2e/peer-c', version: '1.0.0' }])}`), + depPathToFilename(`/@pnpm.e2e/abc@1.0.0${createPeersDirSuffix([{ name: '@pnpm.e2e/peer-a', version: '1.0.0' }, { name: '@pnpm.e2e/peer-b', version: '1.0.0' }, { name: '@pnpm.e2e/peer-c', version: '1.0.0' }])}`), 'node_modules' ) await okFile(path.join(pkgVariation1, '@pnpm.e2e/abc')) @@ -562,7 +562,7 @@ test('peer dependencies are linked when running one named installation', async ( const pkgVariation2 = path.join( 'node_modules/.pnpm', - depPathToFilename(`/@pnpm.e2e/abc@1.0.0${createPeersFolderSuffix([{ name: '@pnpm.e2e/peer-a', version: '1.0.0' }, { name: '@pnpm.e2e/peer-b', version: '1.0.0' }, { name: '@pnpm.e2e/peer-c', version: '1.0.0' }])}`), + depPathToFilename(`/@pnpm.e2e/abc@1.0.0${createPeersDirSuffix([{ name: '@pnpm.e2e/peer-a', version: '1.0.0' }, { name: '@pnpm.e2e/peer-b', version: '1.0.0' }, { name: '@pnpm.e2e/peer-c', version: '1.0.0' }])}`), 'node_modules' ) await okFile(path.join(pkgVariation2, '@pnpm.e2e/abc')) @@ -590,7 +590,7 @@ test('peer dependencies are linked when running two separate named installations const pkgVariation1 = path.join( 'node_modules/.pnpm', - depPathToFilename(`/@pnpm.e2e/abc@1.0.0${createPeersFolderSuffix([{ name: '@pnpm.e2e/peer-a', version: '1.0.0' }, { name: '@pnpm.e2e/peer-b', version: '1.0.0' }, { name: '@pnpm.e2e/peer-c', version: '1.0.0' }])}`), + depPathToFilename(`/@pnpm.e2e/abc@1.0.0${createPeersDirSuffix([{ name: '@pnpm.e2e/peer-a', version: '1.0.0' }, { name: '@pnpm.e2e/peer-b', version: '1.0.0' }, { name: '@pnpm.e2e/peer-c', version: '1.0.0' }])}`), 'node_modules' ) await okFile(path.join(pkgVariation1, '@pnpm.e2e/abc')) @@ -601,7 +601,7 @@ test('peer dependencies are linked when running two separate named installations const pkgVariation2 = path.join( 'node_modules/.pnpm', - depPathToFilename(`/@pnpm.e2e/abc@1.0.0${createPeersFolderSuffix([{ name: '@pnpm.e2e/peer-a', version: '1.0.0' }, { name: '@pnpm.e2e/peer-b', version: '1.0.0' }, { name: '@pnpm.e2e/peer-c', version: '2.0.0' }])}`), + depPathToFilename(`/@pnpm.e2e/abc@1.0.0${createPeersDirSuffix([{ name: '@pnpm.e2e/peer-a', version: '1.0.0' }, { name: '@pnpm.e2e/peer-b', version: '1.0.0' }, { name: '@pnpm.e2e/peer-c', version: '2.0.0' }])}`), 'node_modules' ) await okFile(path.join(pkgVariation2, '@pnpm.e2e/abc')) @@ -661,7 +661,7 @@ test('peer bins are linked', async () => { await addDependenciesToPackage({}, ['@pnpm.e2e/for-testing-peers-having-bins'], await testDefaults({ fastUnpack: false })) - const suffix = createPeersFolderSuffix([{ name: '@pnpm.e2e/peer-with-bin', version: '1.0.0' }]) + const suffix = createPeersDirSuffix([{ name: '@pnpm.e2e/peer-with-bin', version: '1.0.0' }]) const pkgVariation = path.join('.pnpm', depPathToFilename(`/@pnpm.e2e/pkg-with-peer-having-bin@1.0.0${suffix}`), 'node_modules') await project.isExecutable(path.join(pkgVariation, '@pnpm.e2e/pkg-with-peer-having-bin/node_modules/.bin', 'peer-with-bin')) @@ -986,7 +986,7 @@ test('peer dependency is resolved from parent package via its alias', async () = }, await testDefaults()) const lockfile = await readYamlFile(WANTED_LOCKFILE) - const suffix = createPeersFolderSuffix([{ name: '@pnpm.e2e/tango-tango', version: '1.0.0' }]) + const suffix = createPeersDirSuffix([{ name: '@pnpm.e2e/tango-tango', version: '1.0.0' }]) expect(Object.keys(lockfile.packages ?? {})).toStrictEqual([ `/@pnpm.e2e/has-tango-as-peer-dep@1.0.0${suffix}`, `/@pnpm.e2e/tango-tango@1.0.0${suffix}`, @@ -1303,7 +1303,7 @@ test('deduplicate packages that have optional and non-optional peers', async () const lockfile = await readYamlFile(path.resolve(WANTED_LOCKFILE)) const depPaths = Object.keys(lockfile.packages ?? {}) expect(depPaths.length).toBe(5) - expect(depPaths).toContain(`/@pnpm.e2e/abc-optional-peers@1.0.0${createPeersFolderSuffix([{ name: '@pnpm.e2e/peer-a', version: '1.0.0' }, { name: '@pnpm.e2e/peer-b', version: '1.0.0' }, { name: '@pnpm.e2e/peer-c', version: '1.0.0' }])}`) + expect(depPaths).toContain(`/@pnpm.e2e/abc-optional-peers@1.0.0${createPeersDirSuffix([{ name: '@pnpm.e2e/peer-a', version: '1.0.0' }, { name: '@pnpm.e2e/peer-b', version: '1.0.0' }, { name: '@pnpm.e2e/peer-c', version: '1.0.0' }])}`) }) test('deduplicate packages that have peers', async () => { @@ -1321,8 +1321,8 @@ test('deduplicate packages that have peers', async () => { const lockfile = await readYamlFile(path.resolve(WANTED_LOCKFILE)) const depPaths = Object.keys(lockfile.packages ?? {}) expect(depPaths.length).toBe(8) - expect(depPaths).toContain(`/@pnpm.e2e/abc@1.0.0${createPeersFolderSuffix([{ name: '@pnpm.e2e/peer-a', version: '1.0.0' }, { name: '@pnpm.e2e/peer-b', version: '1.0.0' }, { name: '@pnpm.e2e/peer-c', version: '1.0.0' }])}`) - expect(depPaths).toContain(`/@pnpm.e2e/abc-parent-with-ab@1.0.0${createPeersFolderSuffix([{ name: '@pnpm.e2e/peer-c', version: '1.0.0' }])}`) + expect(depPaths).toContain(`/@pnpm.e2e/abc@1.0.0${createPeersDirSuffix([{ name: '@pnpm.e2e/peer-a', version: '1.0.0' }, { name: '@pnpm.e2e/peer-b', version: '1.0.0' }, { name: '@pnpm.e2e/peer-c', version: '1.0.0' }])}`) + expect(depPaths).toContain(`/@pnpm.e2e/abc-parent-with-ab@1.0.0${createPeersDirSuffix([{ name: '@pnpm.e2e/peer-c', version: '1.0.0' }])}`) }) test('deduplicate packages that have peers, when adding new dependency in a workspace', async () => { @@ -1385,8 +1385,8 @@ test('deduplicate packages that have peers, when adding new dependency in a work const lockfile = await readYamlFile(path.resolve(WANTED_LOCKFILE)) const depPaths = Object.keys(lockfile.packages ?? {}) expect(depPaths.length).toBe(8) - expect(depPaths).toContain(`/@pnpm.e2e/abc@1.0.0${createPeersFolderSuffix([{ name: '@pnpm.e2e/peer-a', version: '1.0.0' }, { name: '@pnpm.e2e/peer-b', version: '1.0.0' }, { name: '@pnpm.e2e/peer-c', version: '1.0.0' }])}`) - expect(depPaths).toContain(`/@pnpm.e2e/abc-parent-with-ab@1.0.0${createPeersFolderSuffix([{ name: '@pnpm.e2e/peer-c', version: '1.0.0' }])}`) + expect(depPaths).toContain(`/@pnpm.e2e/abc@1.0.0${createPeersDirSuffix([{ name: '@pnpm.e2e/peer-a', version: '1.0.0' }, { name: '@pnpm.e2e/peer-b', version: '1.0.0' }, { name: '@pnpm.e2e/peer-c', version: '1.0.0' }])}`) + expect(depPaths).toContain(`/@pnpm.e2e/abc-parent-with-ab@1.0.0${createPeersDirSuffix([{ name: '@pnpm.e2e/peer-c', version: '1.0.0' }])}`) }) test('resolve peer dependencies from aliased subdependencies if they are dependencies of a parent package', async () => { diff --git a/pkg-manager/resolve-dependencies/src/resolvePeers.ts b/pkg-manager/resolve-dependencies/src/resolvePeers.ts index 5efddb332e..f7918abb83 100644 --- a/pkg-manager/resolve-dependencies/src/resolvePeers.ts +++ b/pkg-manager/resolve-dependencies/src/resolvePeers.ts @@ -6,7 +6,7 @@ import type { PeerDependencyIssues, PeerDependencyIssuesByProjects, } from '@pnpm/types' -import { depPathToFilename, createPeersFolderSuffix } from '@pnpm/dependency-path' +import { depPathToFilename, createPeersDirSuffix } from '@pnpm/dependency-path' import mapValues from 'ramda/src/map' import partition from 'ramda/src/partition' import pick from 'ramda/src/pick' @@ -386,7 +386,7 @@ function resolvePeersOfNode ( if (allResolvedPeers.size === 0) { depPath = resolvedPackage.depPath } else { - const peersFolderSuffix = createPeersFolderSuffix( + const peersFolderSuffix = createPeersDirSuffix( [...allResolvedPeers.entries()] .map(([alias, nodeId]) => { if (nodeId.startsWith('link:')) { diff --git a/pnpm/test/install/hooks.ts b/pnpm/test/install/hooks.ts index 2991fb9426..1d69376ae9 100644 --- a/pnpm/test/install/hooks.ts +++ b/pnpm/test/install/hooks.ts @@ -2,7 +2,7 @@ import { promises as fs } from 'fs' import path from 'path' import { type Lockfile } from '@pnpm/lockfile-types' import { prepare, preparePackages } from '@pnpm/prepare' -import { createPeersFolderSuffix } from '@pnpm/dependency-path' +import { createPeersDirSuffix } from '@pnpm/dependency-path' import readYamlFile from 'read-yaml-file' import loadJsonFile from 'load-json-file' import writeYamlFile from 'write-yaml-file' @@ -613,7 +613,7 @@ test('readPackage hook is used during removal inside a workspace', async () => { process.chdir('..') const lockfile = await readYamlFile('pnpm-lock.yaml') - const suffix = createPeersFolderSuffix([{ name: '@pnpm.e2e/peer-a', version: '1.0.0' }, { name: 'is-negative', version: '1.0.0' }]) + const suffix = createPeersDirSuffix([{ name: '@pnpm.e2e/peer-a', version: '1.0.0' }, { name: 'is-negative', version: '1.0.0' }]) expect(lockfile.packages![`/@pnpm.e2e/abc@1.0.0${suffix}`].peerDependencies!['is-negative']).toBe('1.0.0') }) diff --git a/pnpm/test/monorepo/dedupePeers.test.ts b/pnpm/test/monorepo/dedupePeers.test.ts index cf3a5c0d8a..9ae0db0a59 100644 --- a/pnpm/test/monorepo/dedupePeers.test.ts +++ b/pnpm/test/monorepo/dedupePeers.test.ts @@ -5,7 +5,7 @@ import { type Lockfile } from '@pnpm/lockfile-types' import { preparePackages } from '@pnpm/prepare' import { addDistTag } from '@pnpm/registry-mock' import { sync as readYamlFile } from 'read-yaml-file' -import { createPeersFolderSuffix } from '@pnpm/dependency-path' +import { createPeersDirSuffix } from '@pnpm/dependency-path' import { sync as loadJsonFile } from 'load-json-file' import { sync as writeYamlFile } from 'write-yaml-file' import { execPnpm } from '../utils' @@ -44,8 +44,8 @@ auto-install-peers=false`, 'utf8') const lockfile = readYamlFile(path.resolve(WANTED_LOCKFILE)) const depPaths = Object.keys(lockfile.packages ?? {}) expect(depPaths.length).toBe(8) - expect(depPaths).toContain(`/@pnpm.e2e/abc@1.0.0${createPeersFolderSuffix([{ name: '@pnpm.e2e/peer-a', version: '1.0.0' }, { name: '@pnpm.e2e/peer-b', version: '1.0.0' }, { name: '@pnpm.e2e/peer-c', version: '1.0.0' }])}`) - expect(depPaths).toContain(`/@pnpm.e2e/abc-parent-with-ab@1.0.0${createPeersFolderSuffix([{ name: '@pnpm.e2e/peer-c', version: '1.0.0' }])}`) + expect(depPaths).toContain(`/@pnpm.e2e/abc@1.0.0${createPeersDirSuffix([{ name: '@pnpm.e2e/peer-a', version: '1.0.0' }, { name: '@pnpm.e2e/peer-b', version: '1.0.0' }, { name: '@pnpm.e2e/peer-c', version: '1.0.0' }])}`) + expect(depPaths).toContain(`/@pnpm.e2e/abc-parent-with-ab@1.0.0${createPeersDirSuffix([{ name: '@pnpm.e2e/peer-c', version: '1.0.0' }])}`) }) test('partial update in a workspace should work with dedupe-peer-dependents is true', async () => {