fix(overrides): filter overrides by intersection instead of subset (#6904)

close #6878
This commit is contained in:
Andrew Leedham
2023-08-04 15:39:43 +01:00
committed by GitHub
parent 840b65bda6
commit ec50dc98cc
4 changed files with 31 additions and 4 deletions

View File

@@ -0,0 +1,5 @@
---
"@pnpm/hooks.read-package-hook": patch
---
Compare overriding ranges with intersection instead of subset to fix override range bug [#6878](https://github.com/pnpm/pnpm/issues/6878).

View File

@@ -5,7 +5,7 @@ import { type Dependencies, type PackageManifest, type ReadPackageHook } from '@
import { PnpmError } from '@pnpm/error'
import { parseOverrides } from '@pnpm/parse-overrides'
import normalizePath from 'normalize-path'
import { isSubRange } from './isSubRange'
import { isIntersectingRange } from './isIntersectingRange'
export function createVersionsOverrider (
overrides: Record<string, string>,
@@ -94,13 +94,13 @@ function overrideDeps (
pickMostSpecificVersionOverride(
versionOverrides.filter(
({ targetPkg }) =>
targetPkg.name === name && isSubRange(targetPkg.pref, pref)
targetPkg.name === name && isIntersectingRange(targetPkg.pref, pref)
)
) ??
pickMostSpecificVersionOverride(
genericVersionOverrides.filter(
({ targetPkg }) =>
targetPkg.name === name && isSubRange(targetPkg.pref, pref)
targetPkg.name === name && isIntersectingRange(targetPkg.pref, pref)
)
)
if (!versionOverride) continue
@@ -122,5 +122,5 @@ function overrideDeps (
}
function pickMostSpecificVersionOverride (versionOverrides: VersionOverride[]): VersionOverride | undefined {
return versionOverrides.sort((a, b) => isSubRange(b.targetPkg.pref ?? '', a.targetPkg.pref ?? '') ? -1 : 1)[0]
return versionOverrides.sort((a, b) => isIntersectingRange(b.targetPkg.pref ?? '', a.targetPkg.pref ?? '') ? -1 : 1)[0]
}

View File

@@ -0,0 +1,9 @@
import semver from 'semver'
export function isIntersectingRange (range1: string | undefined, range2: string) {
return !range1 ||
range2 === range1 ||
semver.validRange(range2) != null &&
semver.validRange(range1) != null &&
semver.intersects(range2, range1)
}

View File

@@ -370,3 +370,16 @@ test('createVersionOverrider() throws error when supplied an invalid selector',
'foo > bar': '2',
}, process.cwd())).toThrowError('Cannot parse the "foo > bar" selector in pnpm.overrides')
})
test('createVersionsOverrider() matches intersections', () => {
const overrider = createVersionsOverrider({
'foo@<1.2.4': '>=1.2.4',
}, process.cwd())
expect(
overrider({
dependencies: { foo: '^1.2.3' },
})
).toStrictEqual({
dependencies: { foo: '>=1.2.4' },
})
})