diff --git a/docs/configuration.md b/docs/configuration.md index f0c978a5e3ecb3f1aa328936beecf45a7a2bf194..117e2e13cb89733a4ac0026522085aad9db1b6ed 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -39,11 +39,24 @@ module.exports = { }, { repository: 'singapore/repo2', - depTypes: ['dependencies', 'devDependencies', 'optionalDependencies'], + depTypes: [ + 'dependencies', + 'devDependencies', + { + depType: 'optionalDependencies', + labels: ['renovate', 'optional'], + }, + ], labels: ['renovate'], }, 'singapore/repo3', - ] + ], + packages: [ + { + package: 'jquery', + labels: ['jquery', 'uhoh'], + }, + ], } ``` diff --git a/lib/worker.js b/lib/worker.js index 318176e11a6167f991d624f74d43674309f84a77..b11fb73452660d91bfd851b0b29de984373defdd 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -78,6 +78,22 @@ function assignDepConfigs(inputConfig, deps) { const returnDep = Object.assign({}, dep); returnDep.config = Object.assign({}, inputConfig, getDepTypeConfig(inputConfig.depTypes, dep.depType)); + let packageRuleApplied = false; + if (returnDep.config.packages) { + // Loop through list looking for match + // Exit after first match + returnDep.config.packages.forEach((packageConfig) => { + if (!packageRuleApplied) { + const packageRegex = new RegExp(packageConfig.packageName); + if (dep.depName.match(packageRegex)) { + packageRuleApplied = true; + Object.assign(returnDep.config, packageConfig); + delete returnDep.config.packageName; + } + } + }); + } + delete returnDep.config.depType; delete returnDep.config.depTypes; delete returnDep.config.enabled; delete returnDep.config.onboarding; @@ -86,6 +102,7 @@ function assignDepConfigs(inputConfig, deps) { delete returnDep.config.logLevel; delete returnDep.config.repoConfigured; delete returnDep.config.ignoreDeps; + delete returnDep.config.packages; delete returnDep.config.maintainYarnLock; delete returnDep.config.yarnMaintenanceBranchName; delete returnDep.config.yarnMaintenanceCommitMessage; diff --git a/test/__snapshots__/worker.spec.js.snap b/test/__snapshots__/worker.spec.js.snap index 50e6f885d4e22382cb191bdc70220c0609b94a33..225e196e1b96dd10c6f4e325cbe93d9dca486141 100644 --- a/test/__snapshots__/worker.spec.js.snap +++ b/test/__snapshots__/worker.spec.js.snap @@ -4,7 +4,6 @@ exports[`worker assignDepConfigs(inputConfig, deps) handles depType config with Array [ Object { "config": Object { - "depType": "dependencies", "foo": "beta", }, "depName": "a", @@ -18,7 +17,6 @@ Array [ Object { "config": Object { "alpha": "beta", - "depType": "dependencies", "foo": "bar", }, "depName": "a", @@ -44,6 +42,58 @@ Array [ ] `; +exports[`worker assignDepConfigs(inputConfig, deps) handles package config 1`] = ` +Array [ + Object { + "config": Object { + "foo": "bar", + "labels": Array [ + "renovate", + ], + }, + "depName": "a", + }, +] +`; + +exports[`worker assignDepConfigs(inputConfig, deps) handles regex package config 1`] = ` +Array [ + Object { + "config": Object { + "foo": "bar", + "labels": Array [ + "eslint", + ], + }, + "depName": "eslint", + }, + Object { + "config": Object { + "foo": "bar", + "labels": Array [ + "eslint", + ], + }, + "depName": "eslint-foo", + }, + Object { + "config": Object { + "foo": "bar", + }, + "depName": "a", + }, + Object { + "config": Object { + "foo": "bar", + "labels": Array [ + "eslint", + ], + }, + "depName": "also-eslint", + }, +] +`; + exports[`worker assignDepConfigs(inputConfig, deps) handles string deps 1`] = ` Array [ Object { @@ -54,3 +104,27 @@ Array [ }, ] `; + +exports[`worker assignDepConfigs(inputConfig, deps) nested package config overrides depType and general config 1`] = ` +Array [ + Object { + "config": Object { + "foo": "gamma", + }, + "depName": "a", + "depType": "dependencies", + }, +] +`; + +exports[`worker assignDepConfigs(inputConfig, deps) package config overrides depType and general config 1`] = ` +Array [ + Object { + "config": Object { + "foo": "gamma", + }, + "depName": "a", + "depType": "dependencies", + }, +] +`; diff --git a/test/worker.spec.js b/test/worker.spec.js index 93efa892c7e4061f6e4b1267aeab743a29f46872..a5405a573452331a0ec697fb0e4aae1a5ac0cbba 100644 --- a/test/worker.spec.js +++ b/test/worker.spec.js @@ -160,6 +160,73 @@ describe('worker', () => { const updatedDeps = worker.assignDepConfigs(config, deps); expect(updatedDeps).toMatchSnapshot(); }); + it('handles package config', () => { + config.foo = 'bar'; + config.packages = [{ + packageName: 'a', + labels: ['renovate'], + }]; + deps.push({ + depName: 'a', + }); + const updatedDeps = worker.assignDepConfigs(config, deps); + expect(updatedDeps).toMatchSnapshot(); + }); + it('package config overrides depType and general config', () => { + config.foo = 'bar'; + config.depTypes = [{ + depType: 'dependencies', + foo: 'beta', + }]; + config.packages = [{ + packageName: 'a', + foo: 'gamma', + }]; + deps.push({ + depName: 'a', + depType: 'dependencies', + }); + const updatedDeps = worker.assignDepConfigs(config, deps); + expect(updatedDeps).toMatchSnapshot(); + }); + it('nested package config overrides depType and general config', () => { + config.foo = 'bar'; + config.depTypes = [{ + depType: 'dependencies', + foo: 'beta', + packages: [{ + packageName: 'a', + foo: 'gamma', + }], + }]; + deps.push({ + depName: 'a', + depType: 'dependencies', + }); + const updatedDeps = worker.assignDepConfigs(config, deps); + expect(updatedDeps).toMatchSnapshot(); + }); + it('handles regex package config', () => { + config.foo = 'bar'; + config.packages = [{ + packageName: 'eslint.*', + labels: ['eslint'], + }]; + deps.push({ + depName: 'eslint', + }); + deps.push({ + depName: 'eslint-foo', + }); + deps.push({ + depName: 'a', + }); + deps.push({ + depName: 'also-eslint', + }); + const updatedDeps = worker.assignDepConfigs(config, deps); + expect(updatedDeps).toMatchSnapshot(); + }); }); describe('getDepTypeConfig(depTypes, depTypeName)', () => { it('handles empty depTypes', () => {