mirror of
https://github.com/pnpm/pnpm.git
synced 2026-03-30 04:52:04 -04:00
refactor: dependency-path
This commit is contained in:
5
.changeset/new-eyes-fail.md
Normal file
5
.changeset/new-eyes-fail.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@pnpm/dependency-path": major
|
||||
---
|
||||
|
||||
Rename createPeersFolderSuffixNewFormat to createPeersFolderSuffix.
|
||||
@@ -172,22 +172,7 @@ function depPathToFilenameUnescaped (depPath: string) {
|
||||
return depPath.replace(':', '+')
|
||||
}
|
||||
|
||||
export function createPeersFolderSuffixNewFormat (peers: Array<{ name: string, version: string }>): string {
|
||||
export function createPeersFolderSuffix (peers: Array<{ name: string, version: string }>): string {
|
||||
const folderName = peers.map(({ name, version }) => `${name}@${version}`).sort().join(')(')
|
||||
return `(${folderName})`
|
||||
}
|
||||
|
||||
export function createPeersFolderSuffix (peers: Array<{ name: string, version: string }>): string {
|
||||
const folderName = peers.map(({ name, version }) => `${name.replace('/', '+')}@${version}`).sort().join('+')
|
||||
|
||||
// We don't want the folder name to get too long.
|
||||
// Otherwise, an ENAMETOOLONG error might happen.
|
||||
// see: https://github.com/pnpm/pnpm/issues/977
|
||||
//
|
||||
// A bigger limit might be fine but the base32 encoded md5 hash will be 26 symbols,
|
||||
// so for consistency's sake, we go with 26.
|
||||
if (folderName.length > 26) {
|
||||
return `_${createBase32Hash(folderName)}`
|
||||
}
|
||||
return `_${folderName}`
|
||||
}
|
||||
|
||||
@@ -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 { createPeersFolderSuffixNewFormat as createPeersFolderSuffix } from '@pnpm/dependency-path'
|
||||
import { createPeersFolderSuffix } from '@pnpm/dependency-path'
|
||||
import { testDefaults } from '../utils'
|
||||
|
||||
test('auto install non-optional peer dependencies', async () => {
|
||||
|
||||
@@ -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 { createPeersFolderSuffixNewFormat as createPeersFolderSuffix } from '@pnpm/dependency-path'
|
||||
import { createPeersFolderSuffix } from '@pnpm/dependency-path'
|
||||
import exists from 'path-exists'
|
||||
import { testDefaults } from '../utils'
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ import {
|
||||
mutateModulesInSingleProject,
|
||||
} from '@pnpm/core'
|
||||
import rimraf from '@zkochan/rimraf'
|
||||
import { createPeersFolderSuffixNewFormat as createPeersFolderSuffix } from '@pnpm/dependency-path'
|
||||
import { createPeersFolderSuffix } from '@pnpm/dependency-path'
|
||||
import loadJsonFile from 'load-json-file'
|
||||
import exists from 'path-exists'
|
||||
import pick from 'ramda/src/pick'
|
||||
|
||||
@@ -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 { createPeersFolderSuffixNewFormat as createPeersFolderSuffix, depPathToFilename } from '@pnpm/dependency-path'
|
||||
import { createPeersFolderSuffix, 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${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' }])}`),
|
||||
'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${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' }])}`),
|
||||
'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${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' }])}`),
|
||||
'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${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' }])}`),
|
||||
'node_modules'
|
||||
)
|
||||
await okFile(path.join(pkgVariation2, '@pnpm.e2e/abc'))
|
||||
|
||||
@@ -7,7 +7,7 @@ import type {
|
||||
PeerDependencyIssues,
|
||||
PeerDependencyIssuesByProjects,
|
||||
} from '@pnpm/types'
|
||||
import { depPathToFilename, createPeersFolderSuffixNewFormat } from '@pnpm/dependency-path'
|
||||
import { depPathToFilename, createPeersFolderSuffix } from '@pnpm/dependency-path'
|
||||
import isEmpty from 'ramda/src/isEmpty'
|
||||
import mapValues from 'ramda/src/map'
|
||||
import pick from 'ramda/src/pick'
|
||||
@@ -320,7 +320,7 @@ function resolvePeersOfNode<T extends PartialResolvedPackage> (
|
||||
if (isEmpty(allResolvedPeers)) {
|
||||
depPath = resolvedPackage.depPath
|
||||
} else {
|
||||
const peersFolderSuffix = createPeersFolderSuffixNewFormat(
|
||||
const peersFolderSuffix = createPeersFolderSuffix(
|
||||
Object.entries(allResolvedPeers)
|
||||
.map(([alias, nodeId]) => {
|
||||
if (nodeId.startsWith('link:')) {
|
||||
|
||||
@@ -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 { createPeersFolderSuffixNewFormat as createPeersFolderSuffix } from '@pnpm/dependency-path'
|
||||
import { createPeersFolderSuffix } from '@pnpm/dependency-path'
|
||||
import readYamlFile from 'read-yaml-file'
|
||||
import loadJsonFile from 'load-json-file'
|
||||
import writeYamlFile from 'write-yaml-file'
|
||||
|
||||
@@ -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 { createPeersFolderSuffixNewFormat } from '@pnpm/dependency-path'
|
||||
import { createPeersFolderSuffix } 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<Lockfile>(path.resolve(WANTED_LOCKFILE))
|
||||
const depPaths = Object.keys(lockfile.packages ?? {})
|
||||
expect(depPaths.length).toBe(8)
|
||||
expect(depPaths).toContain(`/@pnpm.e2e/abc@1.0.0${createPeersFolderSuffixNewFormat([{ 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${createPeersFolderSuffixNewFormat([{ name: '@pnpm.e2e/peer-c', version: '1.0.0' }])}`)
|
||||
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' }])}`)
|
||||
})
|
||||
|
||||
test('partial update in a workspace should work with dedupe-peer-dependents is true', async () => {
|
||||
|
||||
Reference in New Issue
Block a user