From a12f8377bc380d47f353f68d49e3ccc249ebb599 Mon Sep 17 00:00:00 2001 From: StinkyLord <42116482+PhilipAbed@users.noreply.github.com> Date: Sat, 2 Apr 2022 09:36:57 +0300 Subject: [PATCH] fix(yarn): package.json resolutions patch in yarn was clobbered (#14538) --- .../npm/__fixtures__/inputs/patch1.json | 14 ++++++++++ .../npm/__fixtures__/inputs/patch2.json | 9 +++++++ .../npm/__fixtures__/outputs/patch1o.json | 14 ++++++++++ .../npm/__fixtures__/outputs/patch2o.json | 9 +++++++ .../npm/update/dependency/index.spec.ts | 26 +++++++++++++++++++ .../manager/npm/update/dependency/index.ts | 14 +++++++++- 6 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 lib/modules/manager/npm/__fixtures__/inputs/patch1.json create mode 100644 lib/modules/manager/npm/__fixtures__/inputs/patch2.json create mode 100644 lib/modules/manager/npm/__fixtures__/outputs/patch1o.json create mode 100644 lib/modules/manager/npm/__fixtures__/outputs/patch2o.json diff --git a/lib/modules/manager/npm/__fixtures__/inputs/patch1.json b/lib/modules/manager/npm/__fixtures__/inputs/patch1.json new file mode 100644 index 0000000000..cecd931c74 --- /dev/null +++ b/lib/modules/manager/npm/__fixtures__/inputs/patch1.json @@ -0,0 +1,14 @@ +{ + "name": "renovate-repro", + "dependencies": { + "lodash": "^4.16.0" + }, + "resolutions": { + "lodash": "patch:lodash@npm:4.16.0#patches/lodash.patch" + }, + "dependenciesMeta": { + "lodash@4.16.0": { + "unplugged": true + } + } +} diff --git a/lib/modules/manager/npm/__fixtures__/inputs/patch2.json b/lib/modules/manager/npm/__fixtures__/inputs/patch2.json new file mode 100644 index 0000000000..48cc40edef --- /dev/null +++ b/lib/modules/manager/npm/__fixtures__/inputs/patch2.json @@ -0,0 +1,9 @@ +{ + "name": "renovate-repro", + "dependencies": { + "metro": "^0.58.0" + }, + "resolutions": { + "metro": "patch:metro@^0.58.0#./.patches/metro.patch" + } +} diff --git a/lib/modules/manager/npm/__fixtures__/outputs/patch1o.json b/lib/modules/manager/npm/__fixtures__/outputs/patch1o.json new file mode 100644 index 0000000000..01c60a6c2d --- /dev/null +++ b/lib/modules/manager/npm/__fixtures__/outputs/patch1o.json @@ -0,0 +1,14 @@ +{ + "name": "renovate-repro", + "dependencies": { + "lodash": "4.17.21" + }, + "resolutions": { + "lodash": "patch:lodash@npm:4.17.21#patches/lodash.patch" + }, + "dependenciesMeta": { + "lodash@4.16.0": { + "unplugged": true + } + } +} diff --git a/lib/modules/manager/npm/__fixtures__/outputs/patch2o.json b/lib/modules/manager/npm/__fixtures__/outputs/patch2o.json new file mode 100644 index 0000000000..250ccb5454 --- /dev/null +++ b/lib/modules/manager/npm/__fixtures__/outputs/patch2o.json @@ -0,0 +1,9 @@ +{ + "name": "renovate-repro", + "dependencies": { + "metro": "^0.60.0" + }, + "resolutions": { + "metro": "patch:metro@^0.60.0#./.patches/metro.patch" + } +} diff --git a/lib/modules/manager/npm/update/dependency/index.spec.ts b/lib/modules/manager/npm/update/dependency/index.spec.ts index 080a61b608..78d19e20de 100644 --- a/lib/modules/manager/npm/update/dependency/index.spec.ts +++ b/lib/modules/manager/npm/update/dependency/index.spec.ts @@ -257,5 +257,31 @@ describe('modules/manager/npm/update/dependency/index', () => { expect(JSON.parse(testContent).resolutions.config).toBeUndefined(); expect(JSON.parse(testContent).resolutions['**/abc']).toBe('2.0.0'); }); + it('pins also the version in patch with npm protocol in resolutions', () => { + const upgrade = { + depType: 'dependencies', + depName: 'lodash', + newValue: '4.17.21', + }; + const outputContent = readFixture('outputs/patch1o.json'); + const testContent = npmUpdater.updateDependency({ + fileContent: readFixture('inputs/patch1.json'), + upgrade, + }); + expect(testContent).toEqual(outputContent); + }); + it('replaces also the version in patch with range in resolutions', () => { + const upgrade = { + depType: 'dependencies', + depName: 'metro', + newValue: '^0.60.0', + }; + const outputContent = readFixture('outputs/patch2o.json'); + const testContent = npmUpdater.updateDependency({ + fileContent: readFixture('inputs/patch2.json'), + upgrade, + }); + expect(testContent).toEqual(outputContent); + }); }); }); diff --git a/lib/modules/manager/npm/update/dependency/index.ts b/lib/modules/manager/npm/update/dependency/index.ts index 9de7e2d6e9..4b41192200 100644 --- a/lib/modules/manager/npm/update/dependency/index.ts +++ b/lib/modules/manager/npm/update/dependency/index.ts @@ -1,6 +1,7 @@ import { dequal } from 'dequal'; import type { PackageJson } from 'type-fest'; import { logger } from '../../../../../logger'; +import { escapeRegExp, regEx } from '../../../../../util/regex'; import { matchAt, replaceAt } from '../../../../../util/string'; import type { UpdateDependencyConfig } from '../../../types'; @@ -25,7 +26,17 @@ function replaceAsString( } // Look for the old version number const searchString = `"${oldValue}"`; - const newString = `"${newValue}"`; + let newString = `"${newValue}"`; + + const escapedDepName = escapeRegExp(depName); + const patchRe = regEx(`^(patch:${escapedDepName}@(npm:)?).*#`); + const match = patchRe.exec(oldValue); + if (match) { + const patch = oldValue.replace(match[0], `${match[1]}${newValue}#`); + parsedContents[depType][depName] = patch; + newString = `"${patch}"`; + } + // Skip ahead to depType section let searchIndex = fileContent.indexOf(`"${depType}"`) + depType.length; logger.trace(`Starting search at index ${searchIndex}`); @@ -91,6 +102,7 @@ export function updateDependency({ logger.trace('Version is already updated'); return fileContent; } + let newFileContent = replaceAsString( parsedContents, fileContent, -- GitLab