diff --git a/src/lib/lockfile/helpers/generate-pnpm-lockfile.ts b/src/lib/lockfile/helpers/generate-pnpm-lockfile.ts index 9f2fcbc..f07f842 100644 --- a/src/lib/lockfile/helpers/generate-pnpm-lockfile.ts +++ b/src/lib/lockfile/helpers/generate-pnpm-lockfile.ts @@ -118,7 +118,7 @@ export async function generatePnpmLockfile({ return [ ".", - pnpmMapImporter(importer, { + pnpmMapImporter(".", importer, { includeDevDependencies, includePatchedDependencies, directoryByPackageName, @@ -130,7 +130,7 @@ export async function generatePnpmLockfile({ return [ importerId, - pnpmMapImporter(importer, { + pnpmMapImporter(importerId, importer, { includeDevDependencies, includePatchedDependencies, directoryByPackageName, diff --git a/src/lib/lockfile/helpers/pnpm-map-importer.ts b/src/lib/lockfile/helpers/pnpm-map-importer.ts index 9724009..4f33f31 100644 --- a/src/lib/lockfile/helpers/pnpm-map-importer.ts +++ b/src/lib/lockfile/helpers/pnpm-map-importer.ts @@ -1,3 +1,4 @@ +import path from "node:path"; import type { ProjectSnapshot, ResolvedDependencies, @@ -7,6 +8,7 @@ import { mapValues } from "remeda"; /** Convert dependency links */ export function pnpmMapImporter( + importerPath: string, { dependencies, devDependencies, ...rest }: ProjectSnapshot, { includeDevDependencies, @@ -19,21 +21,41 @@ export function pnpmMapImporter( ): ProjectSnapshot { return { dependencies: dependencies - ? pnpmMapDependenciesLinks(dependencies, directoryByPackageName) + ? pnpmMapDependenciesLinks( + importerPath, + dependencies, + directoryByPackageName + ) : undefined, devDependencies: includeDevDependencies && devDependencies - ? pnpmMapDependenciesLinks(devDependencies, directoryByPackageName) + ? pnpmMapDependenciesLinks( + importerPath, + devDependencies, + directoryByPackageName + ) : undefined, ...rest, }; } function pnpmMapDependenciesLinks( + importerPath: string, def: ResolvedDependencies, directoryByPackageName: { [packageName: string]: string } ): ResolvedDependencies { - return mapValues(def, (value, key) => - value.startsWith("link:") ? `link:./${directoryByPackageName[key]}` : value - ); + return mapValues(def, (value, key) => { + if (!value.startsWith("link:")) { + return value; + } + + const relativePath = path.relative( + importerPath, + directoryByPackageName[key] + ); + + return relativePath.startsWith(".") + ? `link:${relativePath}` + : `link:./${relativePath}`; + }); }