diff --git a/lib/config/options/index.ts b/lib/config/options/index.ts index ae7e810c742205..cdbb0ae6d4a62b 100644 --- a/lib/config/options/index.ts +++ b/lib/config/options/index.ts @@ -152,8 +152,7 @@ const options: RenovateOptions[] = [ }, { name: 'extends', - description: - 'Configuration presets to use/extend. Note: does not work if configured in config.js.', + description: 'Configuration presets to use/extend.', stage: 'package', type: 'array', subType: 'string', diff --git a/lib/workers/repository/init/merge.spec.ts b/lib/workers/repository/init/merge.spec.ts index 36c7a4076dc9b4..464754b5033ccc 100644 --- a/lib/workers/repository/init/merge.spec.ts +++ b/lib/workers/repository/init/merge.spec.ts @@ -185,16 +185,28 @@ describe('workers/repository/init/merge', () => { it('migrates nested config', async () => { git.getFileList.mockResolvedValue(['renovate.json']); fs.readLocalFile.mockResolvedValue('{}'); - migrateAndValidate.migrateAndValidate.mockResolvedValue({ - warnings: [], - errors: [], - }); - migrate.migrateConfig.mockReturnValueOnce({ + migrateAndValidate.migrateAndValidate.mockImplementation((_, c) => + Promise.resolve({ + ...c, + warnings: [], + errors: [], + }) + ); + migrate.migrateConfig.mockImplementation((c) => ({ isMigrated: true, - migratedConfig: {}, + migratedConfig: c, + })); + config.extends = [':automergeAll']; + config.packageRules = [{ extends: ['monorepo:react'] }]; + const ret = await mergeRenovateConfig(config); + expect(ret).toMatchObject({ + automerge: true, + packageRules: [ + { + matchSourceUrlPrefixes: ['https://github.com/facebook/react'], + }, + ], }); - config.extends = [':automergeDisabled']; - expect(await mergeRenovateConfig(config)).toBeDefined(); }); it('continues if no errors', async () => { git.getFileList.mockResolvedValue(['package.json', '.renovaterc.json']); diff --git a/lib/workers/repository/init/merge.ts b/lib/workers/repository/init/merge.ts index 701697a7660fde..d603978a6b1900 100644 --- a/lib/workers/repository/init/merge.ts +++ b/lib/workers/repository/init/merge.ts @@ -177,6 +177,13 @@ export async function mergeRenovateConfig( ]; delete returnConfig.extends; } + if (is.nonEmptyArray(returnConfig.packageRules)) { + configFileParsed.packageRules = [ + ...returnConfig.packageRules, + ...(configFileParsed.packageRules || []), + ]; + delete returnConfig.packageRules; + } checkForRepoConfigError(repoConfig); const migratedConfig = await migrateAndValidate(config, configFileParsed); if (migratedConfig.errors.length) {