From 6f785fd57e757f486f1beafd3ef01fc08f232bf0 Mon Sep 17 00:00:00 2001 From: Timon Jurschitsch <103483059+DerTimonius@users.noreply.github.com> Date: Tue, 9 Apr 2024 17:28:54 +0200 Subject: [PATCH] feat: support pnpm.overrides (#28199) Co-authored-by: Rhys Arkins --- .../npm/extract/common/package-file.ts | 23 ++++++ lib/modules/manager/npm/extract/index.spec.ts | 81 +++++++++++++++++++ 2 files changed, 104 insertions(+) diff --git a/lib/modules/manager/npm/extract/common/package-file.ts b/lib/modules/manager/npm/extract/common/package-file.ts index 31048ee922cdce..547155964fdd40 100644 --- a/lib/modules/manager/npm/extract/common/package-file.ts +++ b/lib/modules/manager/npm/extract/common/package-file.ts @@ -47,6 +47,7 @@ export function extractPackageJson( resolutions: 'resolutions', packageManager: 'packageManager', overrides: 'overrides', + pnpm: 'pnpm', }; for (const depType of Object.keys(depTypes) as (keyof typeof depTypes)[]) { @@ -82,6 +83,28 @@ export function extractPackageJson( val as unknown as NpmManagerData, ), ); + } else if (depType === 'pnpm' && depName === 'overrides') { + for (const [overridesKey, overridesVal] of Object.entries( + val as unknown as NpmPackageDependency, + )) { + if (is.string(overridesVal)) { + dep = { + depName: overridesKey, + depType: 'overrides', + ...extractDependency(depName, overridesKey, overridesVal), + }; + setNodeCommitTopic(dep); + dep.prettyDepType = depTypes[depName]; + deps.push(dep); + } else if (is.object(overridesVal)) { + deps.push( + ...extractOverrideDepsRec( + [overridesKey], + overridesVal as unknown as NpmManagerData, + ), + ); + } + } } else { // TODO: fix type #22198 dep = { ...dep, ...extractDependency(depType, depName, val!) }; diff --git a/lib/modules/manager/npm/extract/index.spec.ts b/lib/modules/manager/npm/extract/index.spec.ts index 9c0b54e4ddf5dc..5ae04415eee55f 100644 --- a/lib/modules/manager/npm/extract/index.spec.ts +++ b/lib/modules/manager/npm/extract/index.spec.ts @@ -894,6 +894,87 @@ describe('modules/manager/npm/extract/index', () => { ], }); }); + + it('extracts dependencies from pnpm.overrides', async () => { + const content = `{ + "devDependencies": { + "@types/react": "18.0.5" + }, + "pnpm": { + "overrides": { + "node": "8.9.2", + "@types/react": "18.0.5", + "baz": { + "node": "8.9.2", + "bar": { + "foo": "1.0.0" + } + }, + "foo2": { + ".": "1.0.0", + "bar2": "1.0.0" + }, + "emptyObject":{} + } + } + }`; + const res = await npmExtract.extractPackageFile( + content, + 'package.json', + defaultExtractConfig, + ); + expect(res).toMatchObject({ + deps: [ + { + depType: 'devDependencies', + depName: '@types/react', + currentValue: '18.0.5', + datasource: 'npm', + prettyDepType: 'devDependency', + }, + { + depType: 'overrides', + depName: 'node', + currentValue: '8.9.2', + datasource: 'npm', + commitMessageTopic: 'Node.js', + prettyDepType: 'overrides', + }, + { + depType: 'overrides', + depName: '@types/react', + currentValue: '18.0.5', + datasource: 'npm', + prettyDepType: 'overrides', + }, + { + depName: 'node', + managerData: { parents: ['baz'] }, + commitMessageTopic: 'Node.js', + currentValue: '8.9.2', + datasource: 'npm', + }, + { + depName: 'foo', + managerData: { parents: ['baz', 'bar'] }, + currentValue: '1.0.0', + datasource: 'npm', + }, + { + depName: 'foo2', + managerData: { parents: ['foo2'] }, + currentValue: '1.0.0', + datasource: 'npm', + }, + { + depName: 'bar2', + managerData: { parents: ['foo2'] }, + currentValue: '1.0.0', + datasource: 'npm', + }, + ], + }); + }); }); describe('.extractAllPackageFiles()', () => {