refactor: dependency-path

This commit is contained in:
Zoltan Kochan
2023-03-24 15:11:23 +02:00
parent b4f26e41aa
commit 0e26acb0fb
9 changed files with 20 additions and 30 deletions

View File

@@ -0,0 +1,5 @@
---
"@pnpm/dependency-path": major
---
Rename createPeersFolderSuffixNewFormat to createPeersFolderSuffix.

View File

@@ -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}`
}

View File

@@ -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 () => {

View File

@@ -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'

View File

@@ -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'

View File

@@ -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'))

View File

@@ -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:')) {

View File

@@ -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'

View 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 () => {