diff --git a/lib/config/definitions.js b/lib/config/definitions.js index d43372a112b7ea14bbe899644e0694504fc0c03f..e686c3614418af5db4d8a7425509e4736a3a48e6 100644 --- a/lib/config/definitions.js +++ b/lib/config/definitions.js @@ -192,6 +192,7 @@ const options = [ description: 'Rules for matching package names', type: 'list', stage: 'depType', + mergeable: true, cli: false, env: false, }, diff --git a/lib/config/index.js b/lib/config/index.js index a165b3b440c05d814d72b3ec985913a819ddac07..864e574d3ac6ff2122a31630e24e0cb7065a73bb 100644 --- a/lib/config/index.js +++ b/lib/config/index.js @@ -118,10 +118,17 @@ function mergeChildConfig(parentConfig, childConfig) { for (const option of definitions.getOptions()) { if (option.mergeable && childConfig[option.name]) { logger.debug(`mergeable option: ${option.name}`); - config[option.name] = { - ...parentConfig[option.name], - ...childConfig[option.name], - }; + if (option.type === 'list') { + // Place parent values *after* child + config[option.name] = config[option.name].concat( + parentConfig[option.name] + ); + } else { + config[option.name] = { + ...parentConfig[option.name], + ...childConfig[option.name], + }; + } logger.debug({ option: config[option.name] }, `config.${option.name}`); } } diff --git a/test/config/index.spec.js b/test/config/index.spec.js index 315b08575bf40e563544ccc29b6e7d0b1f4e1d1f..f5976043699f8c31fc516b8340eb1d48ccfb6b42 100644 --- a/test/config/index.spec.js +++ b/test/config/index.spec.js @@ -173,5 +173,22 @@ describe('config/index', () => { const config = configParser.mergeChildConfig(parentConfig, childConfig); expect(config.depTypes).toMatchSnapshot(); }); + it('merges packageRules', () => { + const parentConfig = { ...defaultConfig }; + Object.assign(parentConfig, { + packageRules: [{ a: 1 }, { a: 2 }], + }); + const childConfig = { + packageRules: [{ a: 3 }, { a: 4 }], + }; + const configParser = require('../../lib/config/index.js'); + const config = configParser.mergeChildConfig(parentConfig, childConfig); + expect(config.packageRules.map(rule => rule.a)).toMatchObject([ + 3, + 4, + 1, + 2, + ]); + }); }); });