diff --git a/lib/config/options/index.ts b/lib/config/options/index.ts index bc84a2a66be7aa267714b9061073a72bbaed9651..9b1692ed1fde63699b0aeff43fb68d5a2c00a2eb 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 or extend. Note: This config option does not work if you use a `config.js` file.', + description: 'Configuration presets to use or 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 d0f7aa03d4d7ed70718b2219c9d2089ad5165607..c82dd31040bec502d3ca6fd2b0a119424d215490 100644 --- a/lib/workers/repository/init/merge.spec.ts +++ b/lib/workers/repository/init/merge.spec.ts @@ -199,16 +199,31 @@ 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) => { + // We shouldn't see packageRules here (avoids #14827). + // (someday the validation should probably be reworked to know about `sourceUrl` from the repo config, but that day isn't today) + expect(c).not.toHaveProperty('packageRules'); + return 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 () => { diff --git a/lib/workers/repository/init/merge.ts b/lib/workers/repository/init/merge.ts index 1ead00699e8f6e05d1f4a65ca5d09e306bdd54dc..4ad24befac8a3425f4850f15ae40c755074cb8e3 100644 --- a/lib/workers/repository/init/merge.ts +++ b/lib/workers/repository/init/merge.ts @@ -249,6 +249,7 @@ export async function mergeRenovateConfig( delete resolvedConfig.hostRules; } returnConfig = mergeChildConfig(returnConfig, resolvedConfig); + returnConfig = await presets.resolveConfigPresets(returnConfig, config); returnConfig.renovateJsonPresent = true; // istanbul ignore if if (returnConfig.ignorePaths?.length) { diff --git a/lib/workers/repository/onboarding/branch/index.spec.ts b/lib/workers/repository/onboarding/branch/index.spec.ts index ea25b06f2ae65e35797c0a02d26a094b229c9137..98a55a94d0ac2998f157fcf43e51804e0012c27d 100644 --- a/lib/workers/repository/onboarding/branch/index.spec.ts +++ b/lib/workers/repository/onboarding/branch/index.spec.ts @@ -96,13 +96,16 @@ describe('workers/repository/onboarding/branch/index', () => { git.getFileList.mockResolvedValue(['package.json']); fs.readLocalFile.mockResolvedValue('{}'); await checkOnboardingBranch(config); + const expectConfig = { + ...config, + onboardingBranch: 'test', + renovateJsonPresent: true, + warnings: [], + }; + delete expectConfig.extends; + delete expectConfig.ignorePresets; expect(configModule.getOnboardingConfigContents).toHaveBeenCalledWith( - { - ...config, - onboardingBranch: 'test', - renovateJsonPresent: true, - warnings: [], - }, + expectConfig, configFileNames[0] ); const file = git.commitFiles.mock.calls[0][0].files[0] as FileAddition;