fix(read-package-hook): resolve file overrides should relative to root directory (#5712)

close #5493
Co-authored-by: Zoltan Kochan <z@kochan.io>
This commit is contained in:
await-ovo
2022-11-30 09:31:43 +08:00
committed by GitHub
parent 4097af6b5c
commit 924eca2937
4 changed files with 46 additions and 0 deletions

View File

@@ -0,0 +1,6 @@
---
"@pnpm/hooks.read-package-hook": patch
"pnpm": patch
---
It should be possible to override a dependency with a local package using relative path from the workspace root directory [#5493](https://github.com/pnpm/pnpm/issues/5493).

View File

@@ -16,9 +16,14 @@ export function createVersionsOverrider (
if (override.newPref.startsWith('link:')) {
linkTarget = path.join(rootDir, override.newPref.substring(5))
}
let linkFileTarget: string | undefined
if (override.newPref.startsWith('file:')) {
linkFileTarget = path.join(rootDir, override.newPref.substring(5))
}
return {
...override,
linkTarget,
linkFileTarget,
}
})
) as [VersionOverrideWithParent[], VersionOverride[]]
@@ -44,6 +49,7 @@ interface VersionOverride {
}
newPref: string
linkTarget?: string
linkFileTarget?: string
}
interface VersionOverrideWithParent extends VersionOverride {
@@ -72,6 +78,10 @@ function overrideDeps (versionOverrides: VersionOverride[], deps: Dependencies,
deps[versionOverride.targetPkg.name] = `link:${normalizePath(path.relative(dir, versionOverride.linkTarget))}`
continue
}
if (versionOverride.linkFileTarget) {
deps[versionOverride.targetPkg.name] = `file:${versionOverride.linkFileTarget}`
continue
}
deps[versionOverride.targetPkg.name] = versionOverride.newPref
}
}

View File

@@ -252,3 +252,22 @@ test('createVersionsOverrider() should work for scoped parent and scoped child',
},
})
})
test('createVersionsOverrider() overrides dependencies with file', () => {
const overrider = createVersionsOverrider({
qar: 'file:../qar',
}, 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: `file:${path.resolve('../qar')}`,
},
})
})

View File

@@ -12,6 +12,17 @@ test('resolve directory', async () => {
expect(resolveResult!.resolution['type']).toEqual('directory')
})
test('resolve directory specified using absolute path', async () => {
const linkedDir = path.join(__dirname, '..')
const normalizedLinkedDir = normalize(linkedDir)
const resolveResult = await resolveFromLocal({ pref: `link:${linkedDir}` }, { projectDir: __dirname })
expect(resolveResult!.id).toEqual('link:..')
expect(resolveResult!.normalizedPref).toEqual(`link:${normalizedLinkedDir}`)
expect(resolveResult!['manifest']!.name).toEqual('@pnpm/local-resolver')
expect(resolveResult!.resolution['directory']).toEqual(normalizedLinkedDir)
expect(resolveResult!.resolution['type']).toEqual('directory')
})
test('resolve injected directory', async () => {
const resolveResult = await resolveFromLocal({ injected: true, pref: '..' }, { projectDir: __dirname })
expect(resolveResult!.id).toEqual('file:..')