From 525975f842e74c931e51876c5cc6a15797f65cf7 Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Sun, 24 Apr 2022 23:26:13 +0300 Subject: [PATCH] fix: a file dep has a file dep close #4611 --- packages/core/test/install/local.ts | 37 ++++++++++++++++++- .../src/resolveDependencies.ts | 9 ++++- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/packages/core/test/install/local.ts b/packages/core/test/install/local.ts index c246932093e..5a047270d1b 100644 --- a/packages/core/test/install/local.ts +++ b/packages/core/test/install/local.ts @@ -1,7 +1,7 @@ import { promises as fs } from 'fs' import path from 'path' import { LOCKFILE_VERSION } from '@pnpm/constants' -import { prepareEmpty } from '@pnpm/prepare' +import { prepareEmpty, preparePackages } from '@pnpm/prepare' import { addDistTag } from '@pnpm/registry-mock' import fixtures from '@pnpm/test-fixtures' import { @@ -239,3 +239,38 @@ 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()) +}) diff --git a/packages/resolve-dependencies/src/resolveDependencies.ts b/packages/resolve-dependencies/src/resolveDependencies.ts index f97bcb93106..5f1cf80f8ff 100644 --- a/packages/resolve-dependencies/src/resolveDependencies.ts +++ b/packages/resolve-dependencies/src/resolveDependencies.ts @@ -159,6 +159,7 @@ export type PkgAddress = { pkg: PackageManifest version?: string updated: boolean + prefix: string } & ({ isLinkedDependency: true version: string @@ -320,7 +321,10 @@ async function resolveDependenciesOfDependency ( postponedResolutionsQueue.push(async (preferredVersions) => resolveChildren( - ctx, + { + ...ctx, + prefix: resolveDependencyResult.prefix, + }, resolveDependencyResult, extendedWantedDep.infoFromLockfile?.dependencyLockfile, options.workspacePackages, @@ -831,6 +835,9 @@ async function resolveDependency ( nodeId, normalizedPref: options.currentDepth === 0 ? pkgResponse.body.normalizedPref : undefined, pkgId: pkgResponse.body.id, + prefix: pkgResponse.body.resolution.type === 'directory' + ? path.resolve(ctx.prefix, pkgResponse.body.resolution['directory']) + : ctx.prefix, // Next fields are actually only needed when isNew = true installable,