From caf453dd33e0d5f09018ae38fc2d7c03d5de84de Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Fri, 16 Jul 2021 02:31:59 +0300 Subject: [PATCH] fix: overriding should work when the range selector contains > --- .changeset/pink-ears-know.md | 5 +++ .../src/install/createVersionsOverrider.ts | 6 ++-- .../install/createVersionOverrider.test.ts | 34 ++++++++++++++++++- 3 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 .changeset/pink-ears-know.md diff --git a/.changeset/pink-ears-know.md b/.changeset/pink-ears-know.md new file mode 100644 index 0000000000..89d9e5523d --- /dev/null +++ b/.changeset/pink-ears-know.md @@ -0,0 +1,5 @@ +--- +"supi": patch +--- + +Overriding should work, when the range selector contains the ">" symbol. diff --git a/packages/supi/src/install/createVersionsOverrider.ts b/packages/supi/src/install/createVersionsOverrider.ts index 09dcf99cde..4cd068548c 100644 --- a/packages/supi/src/install/createVersionsOverrider.ts +++ b/packages/supi/src/install/createVersionsOverrider.ts @@ -16,8 +16,10 @@ export default function ( if (newPref.startsWith('link:')) { linkTarget = path.join(rootDir, newPref.substring(5)) } - if (selector.includes('>')) { - const [parentSelector, childSelector] = selector.split('>') + if (selector.includes('>') && selector.indexOf('>') < selector.lastIndexOf('@')) { + const delimiterIndex = selector.indexOf('>') + const parentSelector = selector.substring(0, delimiterIndex) + const childSelector = selector.substring(delimiterIndex + 1) versionOverrides.push({ linkTarget, newPref, diff --git a/packages/supi/test/install/createVersionOverrider.test.ts b/packages/supi/test/install/createVersionOverrider.test.ts index b851e43b90..fafac431d8 100644 --- a/packages/supi/test/install/createVersionOverrider.test.ts +++ b/packages/supi/test/install/createVersionOverrider.test.ts @@ -4,12 +4,17 @@ import createVersionsOverrider from 'supi/lib/install/createVersionsOverrider' test('createVersionsOverrider() matches subranges', () => { const overrider = createVersionsOverrider({ 'foo@2': '2.12.0', + 'qar@>2': '1.0.0', }, process.cwd()) expect( overrider({ dependencies: { foo: '^2.10.0' }, + optionalDependencies: { qar: '^4.0.0' }, }) - ).toStrictEqual({ dependencies: { foo: '2.12.0' } }) + ).toStrictEqual({ + dependencies: { foo: '2.12.0' }, + optionalDependencies: { qar: '1.0.0' }, + }) }) test('createVersionsOverrider() does not fail on non-range selectors', () => { @@ -35,6 +40,7 @@ test('createVersionsOverrider() does not fail on non-range selectors', () => { test('createVersionsOverrider() overrides dependencies of specified packages only', () => { const overrider = createVersionsOverrider({ 'foo@1>bar@^1.2.0': '3.0.0', + 'qar@1>bar@>4': '3.0.0', }, process.cwd()) expect(overrider({ name: 'foo', @@ -62,6 +68,32 @@ test('createVersionsOverrider() overrides dependencies of specified packages onl bar: '^1.2.0', }, }) + expect(overrider({ + name: 'qar', + version: '1.0.0', + dependencies: { + bar: '^10.0.0', + }, + })).toStrictEqual({ + name: 'qar', + version: '1.0.0', + dependencies: { + bar: '3.0.0', + }, + }) + expect(overrider({ + name: 'qar', + version: '1.0.0', + dependencies: { + bar: '^4.0.0', + }, + })).toStrictEqual({ + name: 'qar', + version: '1.0.0', + dependencies: { + bar: '^4.0.0', + }, + }) }) test('createVersionsOverrider() overrides all types of dependencies', () => {