diff --git a/lib/config/migrations/custom/match-managers-migration.spec.ts b/lib/config/migrations/custom/match-managers-migration.spec.ts new file mode 100644 index 00000000000000..8c7d519520f0e4 --- /dev/null +++ b/lib/config/migrations/custom/match-managers-migration.spec.ts @@ -0,0 +1,26 @@ +import { MatchManagersMigration } from './match-managers-migration'; + +describe('config/migrations/custom/match-managers-migration', () => { + it('migrates old custom manager syntax to new one', () => { + expect(MatchManagersMigration).toMigrate( + { + matchManagers: ['npm', 'regex', 'custom.someMgr'], + }, + { + matchManagers: ['npm', 'custom.regex', 'custom.someMgr'], + } + ); + }); + + // coverage + it('only migrates when necessary', () => { + expect(MatchManagersMigration).not.toMigrate( + { + matchManagers: undefined, + }, + { + matchManagers: undefined, + } + ); + }); +}); diff --git a/lib/config/migrations/custom/match-managers-migration.ts b/lib/config/migrations/custom/match-managers-migration.ts new file mode 100644 index 00000000000000..81457fca2b891d --- /dev/null +++ b/lib/config/migrations/custom/match-managers-migration.ts @@ -0,0 +1,18 @@ +import is from '@sindresorhus/is'; +import { isCustomManager } from '../../../modules/manager/custom'; +import { AbstractMigration } from '../base/abstract-migration'; + +export class MatchManagersMigration extends AbstractMigration { + override readonly propertyName = 'matchManagers'; + + override run(value: unknown): void { + if (!is.array(value, is.string)) { + return; + } + + const newValue = value.map((manager) => + isCustomManager(manager) ? `custom.${manager}` : manager + ); + this.rewrite(newValue); + } +} diff --git a/lib/config/validation-helpers/managers.spec.ts b/lib/config/validation-helpers/managers.spec.ts index 653f65bf2bf357..943d1e57f0e9c4 100644 --- a/lib/config/validation-helpers/managers.spec.ts +++ b/lib/config/validation-helpers/managers.spec.ts @@ -3,7 +3,7 @@ import { check } from './managers'; describe('config/validation-helpers/managers', () => { it('should have no errors', () => { const res = check({ - resolvedRule: { matchManagers: ['npm', 'regex'] }, + resolvedRule: { matchManagers: ['npm', 'regex', 'custom.regex'] }, currentPath: '', }); expect(res).toEqual([]); diff --git a/lib/config/validation-helpers/managers.ts b/lib/config/validation-helpers/managers.ts index aecad19df3c483..bf930ef2c8a979 100644 --- a/lib/config/validation-helpers/managers.ts +++ b/lib/config/validation-helpers/managers.ts @@ -13,7 +13,8 @@ export function check({ if (Array.isArray(resolvedRule.matchManagers)) { if ( resolvedRule.matchManagers.find( - (confManager) => !allManagersList.includes(confManager) + (confManager) => + !allManagersList.includes(confManager.replace('custom.', '')) ) ) { managersErrMessage = `${currentPath}: diff --git a/lib/util/package-rules/managers.spec.ts b/lib/util/package-rules/managers.spec.ts index c8e855c87e7fd2..c5a00ab509b336 100644 --- a/lib/util/package-rules/managers.spec.ts +++ b/lib/util/package-rules/managers.spec.ts @@ -47,5 +47,17 @@ describe('util/package-rules/managers', () => { ); expect(result).toBeFalse(); }); + + it('should match custom managers', () => { + const result = managersMatcher.matches( + { + manager: 'regex', + }, + { + matchManagers: ['custom.regex'], + } + ); + expect(result).toBeTrue(); + }); }); }); diff --git a/lib/util/package-rules/managers.ts b/lib/util/package-rules/managers.ts index cd5de99a2ad26e..6ceffdb9057987 100644 --- a/lib/util/package-rules/managers.ts +++ b/lib/util/package-rules/managers.ts @@ -1,5 +1,6 @@ import is from '@sindresorhus/is'; import type { PackageRule, PackageRuleInputConfig } from '../../config/types'; +import { isCustomManager } from '../../modules/manager/custom'; import { Matcher } from './base'; export class ManagersMatcher extends Matcher { @@ -13,6 +14,9 @@ export class ManagersMatcher extends Matcher { if (is.undefined(manager) || !manager) { return false; } + if (isCustomManager(manager)) { + return matchManagers.includes(`custom.${manager}`); + } return matchManagers.includes(manager); } }