fix: a file dep has a file dep (#4618)

close #4611
This commit is contained in:
Zoltan Kochan
2022-04-25 03:05:53 +03:00
committed by GitHub
parent 22ab407700
commit 3345c2cce8
4 changed files with 55 additions and 3 deletions

View File

@@ -0,0 +1,6 @@
---
"@pnpm/resolve-dependencies": patch
"pnpm": patch
---
It should be possible to use a chain of local file dependencies [#4611](https://github.com/pnpm/pnpm/issues/4611).

View File

@@ -1,7 +1,8 @@
import { promises as fs } from 'fs'
import path from 'path'
import { LOCKFILE_VERSION } from '@pnpm/constants'
import { prepareEmpty } from '@pnpm/prepare'
import { Lockfile } from '@pnpm/lockfile-file'
import { prepareEmpty, preparePackages } from '@pnpm/prepare'
import { addDistTag } from '@pnpm/registry-mock'
import fixtures from '@pnpm/test-fixtures'
import {
@@ -11,6 +12,7 @@ import {
} from '@pnpm/core'
import rimraf from '@zkochan/rimraf'
import normalizePath from 'normalize-path'
import readYamlFile from 'read-yaml-file'
import symlinkDir from 'symlink-dir'
import { testDefaults } from '../utils'
@@ -239,3 +241,41 @@ test('frozen-lockfile: installation fails if the integrity of a tarball dependen
install(manifest, await testDefaults({ frozenLockfile: true }))
).rejects.toThrow(/Got unexpected checksum/)
})
test('deep local', async () => {
const manifest1 = {
name: 'project-1',
version: '1.0.0',
dependencies: {
'project-2': 'file:../project-2',
},
}
preparePackages([
{
location: 'project-1',
package: manifest1,
},
{
location: 'project-2',
package: {
name: 'project-2',
version: '1.0.0',
dependencies: {
'project-3': 'file:./project-3',
},
},
},
{
location: 'project-2/project-3',
package: {
name: 'project-3',
version: '1.0.0',
},
},
])
process.chdir('../project-1')
await install(manifest1, await testDefaults())
const lockfile = await readYamlFile<Lockfile>('pnpm-lock.yaml')
expect(Object.keys(lockfile.packages ?? {})).toStrictEqual(['file:../project-2', 'file:../project-2/project-3'])
})

View File

@@ -159,6 +159,7 @@ export type PkgAddress = {
pkg: PackageManifest
version?: string
updated: boolean
rootDir: string
} & ({
isLinkedDependency: true
version: string
@@ -199,7 +200,7 @@ export interface ResolvedPackage {
}
}
type ParentPkg = Pick<PkgAddress, 'nodeId' | 'installable' | 'depPath'>
type ParentPkg = Pick<PkgAddress, 'nodeId' | 'installable' | 'depPath' | 'rootDir'>
interface ResolvedDependenciesOptions {
currentDepth: number
@@ -625,7 +626,7 @@ async function resolveDependency (
!wantedDependency.pref.startsWith('file:')
)
? ctx.lockfileDir
: ctx.prefix,
: options.parentPkg.rootDir,
registry: wantedDependency.alias && pickRegistryForPackage(ctx.registries, wantedDependency.alias, wantedDependency.pref) || ctx.registries.default,
// Unfortunately, even when run with --lockfile-only, we need the *real* package.json
// so fetching of the tarball cannot be ever avoided. Related issue: https://github.com/pnpm/pnpm/issues/1176
@@ -823,6 +824,9 @@ async function resolveDependency (
}
}
const rootDir = pkgResponse.body.resolution.type === 'directory'
? path.resolve(ctx.lockfileDir, pkgResponse.body.resolution['directory'])
: ctx.prefix
return {
alias: wantedDependency.alias || pkg.name,
depIsLinked,
@@ -831,6 +835,7 @@ async function resolveDependency (
nodeId,
normalizedPref: options.currentDepth === 0 ? pkgResponse.body.normalizedPref : undefined,
pkgId: pkgResponse.body.id,
rootDir,
// Next fields are actually only needed when isNew = true
installable,

View File

@@ -133,6 +133,7 @@ export default async function<T> (
nodeId: `>${importer.id}>`,
optional: false,
depPath: importer.id,
rootDir: importer.rootDir,
},
proceed,
resolvedDependencies: {