diff --git a/.changeset/hungry-mirrors-thank.md b/.changeset/hungry-mirrors-thank.md new file mode 100644 index 0000000000..110dc6ffcc --- /dev/null +++ b/.changeset/hungry-mirrors-thank.md @@ -0,0 +1,6 @@ +--- +"@pnpm/hooks.read-package-hook": patch +"pnpm": patch +--- + +Link overrides should be able to use absolute path [#7749](https://github.com/pnpm/pnpm/pull/7749). diff --git a/hooks/read-package-hook/src/createVersionsOverrider.ts b/hooks/read-package-hook/src/createVersionsOverrider.ts index 6e0930ca70..fe9c8f6f6e 100644 --- a/hooks/read-package-hook/src/createVersionsOverrider.ts +++ b/hooks/read-package-hook/src/createVersionsOverrider.ts @@ -17,7 +17,8 @@ export function createVersionsOverrider ( .map((override) => { let linkTarget: string | undefined if (override.newPref.startsWith('link:')) { - linkTarget = path.join(rootDir, override.newPref.substring(5)) + const pkgPath = override.newPref.substring(5) + linkTarget = path.isAbsolute(pkgPath) ? pkgPath : path.join(rootDir, pkgPath) } let linkFileTarget: string | undefined if (override.newPref.startsWith('file:')) { diff --git a/hooks/read-package-hook/test/createVersionOverrider.test.ts b/hooks/read-package-hook/test/createVersionOverrider.test.ts index e5825a4510..e391b16679 100644 --- a/hooks/read-package-hook/test/createVersionOverrider.test.ts +++ b/hooks/read-package-hook/test/createVersionOverrider.test.ts @@ -1,5 +1,6 @@ import path from 'path' import { createVersionsOverrider } from '../lib/createVersionsOverrider' +import normalizePath from 'normalize-path' test('createVersionsOverrider() matches sub-ranges', () => { const overrider = createVersionsOverrider({ @@ -148,6 +149,27 @@ test('createVersionsOverrider() overrides dependencies with links', () => { }) }) +test('createVersionsOverrider() overrides dependencies with absolute links', () => { + const qarAbsolutePath = path.resolve(process.cwd(), './qar') + const overrider = createVersionsOverrider({ + qar: `link:${qarAbsolutePath}`, + }, process.cwd()) + + expect(overrider({ + name: 'foo', + version: '1.2.0', + dependencies: { + qar: '3.0.0', + }, + }, path.resolve('pkg'))).toStrictEqual({ + name: 'foo', + version: '1.2.0', + dependencies: { + qar: `link:${normalizePath(path.relative(path.resolve('pkg'), qarAbsolutePath))}`, + }, + }) +}) + test('createVersionsOverrider() overrides dependency of pkg matched by name and version', () => { const overrider = createVersionsOverrider({ 'yargs@^7.1.0>yargs-parser': '^20.0.0',