Skip to content

Commit

Permalink
fix(read-package-hook): resolve file overrides should relative to roo…
Browse files Browse the repository at this point in the history
…t directory (#5712)

close #5493
Co-authored-by: Zoltan Kochan <z@kochan.io>
  • Loading branch information
await-ovo committed Nov 30, 2022
1 parent 4097af6 commit 924eca2
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 0 deletions.
6 changes: 6 additions & 0 deletions .changeset/old-otters-sleep.md
@@ -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).
10 changes: 10 additions & 0 deletions hooks/read-package-hook/src/createVersionsOverrider.ts
Expand Up @@ -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[]]
Expand All @@ -44,6 +49,7 @@ interface VersionOverride {
}
newPref: string
linkTarget?: string
linkFileTarget?: string
}

interface VersionOverrideWithParent extends VersionOverride {
Expand Down Expand Up @@ -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
}
}
Expand Down
19 changes: 19 additions & 0 deletions hooks/read-package-hook/test/createVersionOverrider.test.ts
Expand Up @@ -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')}`,
},
})
})
11 changes: 11 additions & 0 deletions resolving/local-resolver/test/index.ts
Expand Up @@ -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:..')
Expand Down

0 comments on commit 924eca2

Please sign in to comment.