diff --git a/.changeset/empty-queens-run.md b/.changeset/empty-queens-run.md new file mode 100644 index 0000000000..f8105fdfd4 --- /dev/null +++ b/.changeset/empty-queens-run.md @@ -0,0 +1,5 @@ +--- +"supi": patch +--- + +Fix overrides that specify the parent package with a range. diff --git a/packages/supi/src/install/createVersionsOverrider.ts b/packages/supi/src/install/createVersionsOverrider.ts index 3f625a550a..3613e09958 100644 --- a/packages/supi/src/install/createVersionsOverrider.ts +++ b/packages/supi/src/install/createVersionsOverrider.ts @@ -4,6 +4,8 @@ import parseWantedDependency from '@pnpm/parse-wanted-dependency' import normalizePath from 'normalize-path' import semver from 'semver' +const DELIMITER_REGEX = /[^ |@]>/ + export default function ( overrides: Record, rootDir: string @@ -16,8 +18,9 @@ export default function ( if (newPref.startsWith('link:')) { linkTarget = path.join(rootDir, newPref.substring(5)) } - if (selector.includes('>') && (!selector.includes('@') || selector.indexOf('>') < selector.lastIndexOf('@'))) { - const delimiterIndex = selector.indexOf('>') + let delimiterIndex = selector.search(DELIMITER_REGEX) + if (delimiterIndex !== -1) { + delimiterIndex++ const parentSelector = selector.substring(0, delimiterIndex) const childSelector = selector.substring(delimiterIndex + 1) versionOverrides.push({ diff --git a/packages/supi/test/install/createVersionOverrider.test.ts b/packages/supi/test/install/createVersionOverrider.test.ts index fafac431d8..d5b99d7578 100644 --- a/packages/supi/test/install/createVersionOverrider.test.ts +++ b/packages/supi/test/install/createVersionOverrider.test.ts @@ -147,3 +147,45 @@ test('createVersionsOverrider() overrides dependencies with links', () => { }, }) }) + +test('createVersionsOverrider() overrides dependency of pkg matched by name and version', () => { + const overrider = createVersionsOverrider({ + 'yargs@^7.1.0>yargs-parser': '^20.0.0', + }, process.cwd()) + expect( + overrider({ + name: 'yargs', + version: '7.1.0', + dependencies: { + 'yargs-parser': '19', + }, + }) + ).toStrictEqual({ + name: 'yargs', + version: '7.1.0', + dependencies: { + 'yargs-parser': '^20.0.0', + }, + }) +}) + +test('createVersionsOverrider() does not override dependency of pkg matched by name and version', () => { + const overrider = createVersionsOverrider({ + 'yargs@^8.1.0>yargs-parser': '^20.0.0', + }, process.cwd()) + expect( + overrider({ + name: 'yargs', + version: '7.1.0', + dependencies: { + 'yargs-parser': '19', + }, + }) + ).toStrictEqual({ + name: 'yargs', + version: '7.1.0', + dependencies: { + 'yargs-parser': '19', + }, + }) +})