diff --git a/lib/config/utils.ts b/lib/config/utils.ts index ce45ce20cd..e6aa51c7f2 100644 --- a/lib/config/utils.ts +++ b/lib/config/utils.ts @@ -1,3 +1,4 @@ +import { instrument } from '../instrumentation/index.ts'; import { logger } from '../logger/index.ts'; import { clone } from '../util/clone.ts'; import { getHighestVulnerabilitySeverity } from '../util/vulnerability/utils.ts'; @@ -8,50 +9,52 @@ export function mergeChildConfig< T extends Record, TChild extends Record | undefined, >(parent: T, child: TChild): T & TChild { - logger.trace({ parent, child }, `mergeChildConfig`); - if (!child) { - return parent as never; - } - const parentConfig = clone(parent); - const childConfig = clone(child); - const config: Record = { ...parentConfig, ...childConfig }; + return instrument('mergeChildConfig', () => { + logger.trace({ parent, child }, `mergeChildConfig`); + if (!child) { + return parent as never; + } + const parentConfig = clone(parent); + const childConfig = clone(child); + const config: Record = { ...parentConfig, ...childConfig }; - // Ensure highest severity survives parent / child merge - if (config?.isVulnerabilityAlert) { - config.vulnerabilitySeverity = getHighestVulnerabilitySeverity( - parent, - child, - ); - } - - for (const option of options.getOptions()) { - if ( - option.mergeable && - childConfig[option.name] && - parentConfig[option.name] - ) { - logger.trace(`mergeable option: ${option.name}`); - - if (option.name === 'constraints') { - config[option.name] = { - ...parentConfig[option.name], - ...childConfig[option.name], - }; - } else if (option.type === 'array') { - config[option.name] = (parentConfig[option.name] as unknown[]).concat( - config[option.name], - ); - } else { - config[option.name] = mergeChildConfig( - parentConfig[option.name] as RenovateConfig, - childConfig[option.name] as RenovateConfig, - ); - } - logger.trace( - { result: config[option.name] }, - `Merged config.${option.name}`, + // Ensure highest severity survives parent / child merge + if (config?.isVulnerabilityAlert) { + config.vulnerabilitySeverity = getHighestVulnerabilitySeverity( + parent, + child, ); } - } - return { ...config, ...config.force }; + + for (const option of options.getOptions()) { + if ( + option.mergeable && + childConfig[option.name] && + parentConfig[option.name] + ) { + logger.trace(`mergeable option: ${option.name}`); + + if (option.name === 'constraints') { + config[option.name] = { + ...parentConfig[option.name], + ...childConfig[option.name], + }; + } else if (option.type === 'array') { + config[option.name] = (parentConfig[option.name] as unknown[]).concat( + config[option.name], + ); + } else { + config[option.name] = mergeChildConfig( + parentConfig[option.name] as RenovateConfig, + childConfig[option.name] as RenovateConfig, + ); + } + logger.trace( + { result: config[option.name] }, + `Merged config.${option.name}`, + ); + } + } + return { ...config, ...config.force }; + }); }