diff --git a/lib/manager/npm/__fixtures__/inputs/01-glob.json b/lib/manager/npm/__fixtures__/inputs/01-glob.json index 25031e31d3b66712788a8fd656dc20bcc16cb9b2..9f31f8be60b46a49ec2ad8b196ebb6fe8775f967 100644 --- a/lib/manager/npm/__fixtures__/inputs/01-glob.json +++ b/lib/manager/npm/__fixtures__/inputs/01-glob.json @@ -36,5 +36,6 @@ "repository": { "type": "git", "url": "http://github.com/singapore/renovate.git" - } + }, + "workspaces": [] } diff --git a/lib/manager/npm/__fixtures__/inputs/01.json b/lib/manager/npm/__fixtures__/inputs/01.json index 603fb8ef5e020a706427563b6753d3dbb7b2258c..661bcfa896b16a365acf49c81a0b1050538b4d6b 100644 --- a/lib/manager/npm/__fixtures__/inputs/01.json +++ b/lib/manager/npm/__fixtures__/inputs/01.json @@ -25,7 +25,10 @@ "@angular/core": "4.0.0-beta.1" }, "resolutions": { - "config": "1.21.0" + "config": "1.21.0", + "**/@angular/cli": "8.0.0", + "**/angular": "1.33.0", + "config/glob": "1.0.0" }, "homepage": "https://keylocation.sg", "keywords": [ diff --git a/lib/manager/npm/__fixtures__/outputs/011.json b/lib/manager/npm/__fixtures__/outputs/011.json index 6c53843e71bff63ca8536bad00b5effd7b5ddce3..badff4fe138dde397e2b18f3393c3effd5dad3d8 100644 --- a/lib/manager/npm/__fixtures__/outputs/011.json +++ b/lib/manager/npm/__fixtures__/outputs/011.json @@ -25,7 +25,10 @@ "@angular/core": "4.0.0-beta.1" }, "resolutions": { - "config": "1.21.0" + "config": "1.21.0", + "**/@angular/cli": "8.0.0", + "**/angular": "1.33.0", + "config/glob": "1.0.0" }, "homepage": "https://keylocation.sg", "keywords": [ diff --git a/lib/manager/npm/__fixtures__/outputs/012.json b/lib/manager/npm/__fixtures__/outputs/012.json index 31e1dfb3209c81d0252e5041f6dab6a95e34b81f..59155e560c92b423629f41a84e54f0ceb561b331 100644 --- a/lib/manager/npm/__fixtures__/outputs/012.json +++ b/lib/manager/npm/__fixtures__/outputs/012.json @@ -25,7 +25,10 @@ "@angular/core": "4.0.0-beta.1" }, "resolutions": { - "config": "1.21.0" + "config": "1.21.0", + "**/@angular/cli": "8.0.0", + "**/angular": "1.33.0", + "config/glob": "1.0.0" }, "homepage": "https://keylocation.sg", "keywords": [ diff --git a/lib/manager/npm/__fixtures__/outputs/013.json b/lib/manager/npm/__fixtures__/outputs/013.json index ebb828dbb7a39090c51860a87c7fc5ec3abe3109..75002dcbec54ad93b291bb386b9ef31b598d1b8d 100644 --- a/lib/manager/npm/__fixtures__/outputs/013.json +++ b/lib/manager/npm/__fixtures__/outputs/013.json @@ -25,7 +25,10 @@ "@angular/core": "4.0.0-beta.1" }, "resolutions": { - "config": "1.21.0" + "config": "1.21.0", + "**/@angular/cli": "8.0.0", + "**/angular": "1.33.0", + "config/glob": "1.0.0" }, "homepage": "https://keylocation.sg", "keywords": [ diff --git a/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap b/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap index cc6a89d49aacda58bc92b039186e9a2faefe5d0d..f9b6e422bb0f756d00582144b4535356c3a3745a 100644 --- a/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap +++ b/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap @@ -534,6 +534,43 @@ Object { "depType": "devDependencies", "prettyDepType": "devDependency", }, + Object { + "currentValue": "1.21.0", + "datasource": "npm", + "depName": "config", + "depType": "resolutions", + "prettyDepType": "resolutions", + }, + Object { + "currentValue": "8.0.0", + "datasource": "npm", + "depName": "@angular/cli", + "depType": "resolutions", + "managerData": Object { + "key": "**/@angular/cli", + }, + "prettyDepType": "resolutions", + }, + Object { + "currentValue": "1.33.0", + "datasource": "npm", + "depName": "angular", + "depType": "resolutions", + "managerData": Object { + "key": "**/angular", + }, + "prettyDepType": "resolutions", + }, + Object { + "currentValue": "1.0.0", + "datasource": "npm", + "depName": "glob", + "depType": "resolutions", + "managerData": Object { + "key": "config/glob", + }, + "prettyDepType": "resolutions", + }, ], "ignoreNpmrcFile": undefined, "lernaClient": "npm", @@ -631,6 +668,43 @@ Object { "depType": "devDependencies", "prettyDepType": "devDependency", }, + Object { + "currentValue": "1.21.0", + "datasource": "npm", + "depName": "config", + "depType": "resolutions", + "prettyDepType": "resolutions", + }, + Object { + "currentValue": "8.0.0", + "datasource": "npm", + "depName": "@angular/cli", + "depType": "resolutions", + "managerData": Object { + "key": "**/@angular/cli", + }, + "prettyDepType": "resolutions", + }, + Object { + "currentValue": "1.33.0", + "datasource": "npm", + "depName": "angular", + "depType": "resolutions", + "managerData": Object { + "key": "**/angular", + }, + "prettyDepType": "resolutions", + }, + Object { + "currentValue": "1.0.0", + "datasource": "npm", + "depName": "glob", + "depType": "resolutions", + "managerData": Object { + "key": "config/glob", + }, + "prettyDepType": "resolutions", + }, ], "ignoreNpmrcFile": undefined, "lernaClient": "yarn", @@ -728,6 +802,43 @@ Object { "depType": "devDependencies", "prettyDepType": "devDependency", }, + Object { + "currentValue": "1.21.0", + "datasource": "npm", + "depName": "config", + "depType": "resolutions", + "prettyDepType": "resolutions", + }, + Object { + "currentValue": "8.0.0", + "datasource": "npm", + "depName": "@angular/cli", + "depType": "resolutions", + "managerData": Object { + "key": "**/@angular/cli", + }, + "prettyDepType": "resolutions", + }, + Object { + "currentValue": "1.33.0", + "datasource": "npm", + "depName": "angular", + "depType": "resolutions", + "managerData": Object { + "key": "**/angular", + }, + "prettyDepType": "resolutions", + }, + Object { + "currentValue": "1.0.0", + "datasource": "npm", + "depName": "glob", + "depType": "resolutions", + "managerData": Object { + "key": "config/glob", + }, + "prettyDepType": "resolutions", + }, ], "ignoreNpmrcFile": undefined, "lernaClient": undefined, @@ -847,6 +958,43 @@ Object { "depType": "devDependencies", "prettyDepType": "devDependency", }, + Object { + "currentValue": "1.21.0", + "datasource": "npm", + "depName": "config", + "depType": "resolutions", + "prettyDepType": "resolutions", + }, + Object { + "currentValue": "8.0.0", + "datasource": "npm", + "depName": "@angular/cli", + "depType": "resolutions", + "managerData": Object { + "key": "**/@angular/cli", + }, + "prettyDepType": "resolutions", + }, + Object { + "currentValue": "1.33.0", + "datasource": "npm", + "depName": "angular", + "depType": "resolutions", + "managerData": Object { + "key": "**/angular", + }, + "prettyDepType": "resolutions", + }, + Object { + "currentValue": "1.0.0", + "datasource": "npm", + "depName": "glob", + "depType": "resolutions", + "managerData": Object { + "key": "config/glob", + }, + "prettyDepType": "resolutions", + }, ], "ignoreNpmrcFile": undefined, "lernaClient": "npm", @@ -966,6 +1114,43 @@ Object { "depType": "devDependencies", "prettyDepType": "devDependency", }, + Object { + "currentValue": "1.21.0", + "datasource": "npm", + "depName": "config", + "depType": "resolutions", + "prettyDepType": "resolutions", + }, + Object { + "currentValue": "8.0.0", + "datasource": "npm", + "depName": "@angular/cli", + "depType": "resolutions", + "managerData": Object { + "key": "**/@angular/cli", + }, + "prettyDepType": "resolutions", + }, + Object { + "currentValue": "1.33.0", + "datasource": "npm", + "depName": "angular", + "depType": "resolutions", + "managerData": Object { + "key": "**/angular", + }, + "prettyDepType": "resolutions", + }, + Object { + "currentValue": "1.0.0", + "datasource": "npm", + "depName": "glob", + "depType": "resolutions", + "managerData": Object { + "key": "config/glob", + }, + "prettyDepType": "resolutions", + }, ], "ignoreNpmrcFile": undefined, "lernaClient": undefined, diff --git a/lib/manager/npm/extract/index.ts b/lib/manager/npm/extract/index.ts index 3bfb283c3449ddf9f8fb88d83c00b2b68cc4c440..5d6d315c3842e9ee8d5e500e115b0bbe7b89164a 100644 --- a/lib/manager/npm/extract/index.ts +++ b/lib/manager/npm/extract/index.ts @@ -22,6 +22,13 @@ import * as nodeVersioning from '../../../versioning/node'; import * as datasourceNpm from '../../../datasource/npm'; import * as datasourceGithubTags from '../../../datasource/github-tags'; +function parseDepName(depType: string, key: string): string { + if (depType !== 'resolutions') return key; + + const [, depName] = /((?:@[^/]+\/)?[^/@]+)$/.exec(key); + return depName; +} + export async function extractPackageFile( content: string, fileName: string, @@ -136,6 +143,7 @@ export async function extractPackageFile( peerDependencies: 'peerDependency', engines: 'engine', volta: 'volta', + resolutions: 'resolutions', }; function extractDependency( @@ -272,13 +280,17 @@ export async function extractPackageFile( for (const depType of Object.keys(depTypes)) { if (packageJson[depType]) { try { - for (const [depName, val] of Object.entries( + for (const [key, val] of Object.entries( packageJson[depType] as NpmPackageDependeny )) { + const depName = parseDepName(depType, key); const dep: PackageDependency = { depType, depName, }; + if (depName !== key) { + dep.managerData = { key }; + } Object.assign(dep, extractDependency(depType, depName, val)); if (depName === 'node') { // This is a special case for Node.js to group it together with other managers diff --git a/lib/manager/npm/update.spec.ts b/lib/manager/npm/update.spec.ts index ed94b554a521dd6344ad74a15e852eb08d8fb730..e1e58a80534a1a6a5c109a72529592c9a4b78a19 100644 --- a/lib/manager/npm/update.spec.ts +++ b/lib/manager/npm/update.spec.ts @@ -133,6 +133,21 @@ describe('workers/branch/package-json', () => { '1.22.0' ); }); + it('updates glob resolutions without dep', () => { + const upgrade = { + depType: 'resolutions', + depName: '@angular/cli', + managerData: { key: '**/@angular/cli' }, + newValue: '8.1.0', + }; + const testContent = npmUpdater.updateDependency({ + fileContent: input01Content, + upgrade, + }); + expect(JSON.parse(testContent).resolutions['**/@angular/cli']).toEqual( + '8.1.0' + ); + }); it('replaces only the first instance of a value', () => { const upgrade = { depType: 'devDependencies', diff --git a/lib/manager/npm/update.ts b/lib/manager/npm/update.ts index 04150ffe55de4986aecc51ef98e4cd51ec454055..df8abe2ea3732b9ecd7035b15459b45c208fc0da 100644 --- a/lib/manager/npm/update.ts +++ b/lib/manager/npm/update.ts @@ -61,7 +61,8 @@ export function updateDependency({ fileContent, upgrade, }: UpdateDependencyConfig): string | null { - const { depType, depName } = upgrade; + const { depType, managerData } = upgrade; + const depName = managerData?.key || upgrade.depName; let { newValue } = upgrade; if (upgrade.currentRawValue) { if (upgrade.currentDigest) {