diff --git a/lib/config/migration.ts b/lib/config/migration.ts index 4fcd2c952e045a..2d35cafd138034 100644 --- a/lib/config/migration.ts +++ b/lib/config/migration.ts @@ -137,17 +137,6 @@ export function migrateConfig(config: RenovateConfig): MigratedConfig { val.length === 1 ) { migratedConfig[key] = String(val[0]); - } else if (key === 'node' && (val as RenovateConfig).enabled === true) { - // validated non-null - delete migratedConfig.node!.enabled; - migratedConfig.travis = migratedConfig.travis ?? {}; - migratedConfig.travis.enabled = true; - if (Object.keys(migratedConfig.node!).length) { - const subMigrate = migrateConfig(migratedConfig.node!); - migratedConfig.node = subMigrate.migratedConfig; - } else { - delete migratedConfig.node; - } } else if (is.array(val)) { if (is.array(migratedConfig?.[key])) { const newArray = []; diff --git a/lib/config/migrations/custom/node-migration.spec.ts b/lib/config/migrations/custom/node-migration.spec.ts new file mode 100644 index 00000000000000..c7eaa60f6f406d --- /dev/null +++ b/lib/config/migrations/custom/node-migration.spec.ts @@ -0,0 +1,26 @@ +import { NodeMigration } from './node-migration'; + +describe('config/migrations/custom/node-migration', () => { + it('should migrate node to travis', () => { + expect(NodeMigration).toMigrate( + { + node: { enabled: true }, + }, + { + travis: { enabled: true }, + } + ); + }); + + it('should not delete node incase it has more than one property', () => { + expect(NodeMigration).toMigrate( + { + node: { enabled: true, automerge: false }, + }, + { + node: { automerge: false }, + travis: { enabled: true }, + } + ); + }); +}); diff --git a/lib/config/migrations/custom/node-migration.ts b/lib/config/migrations/custom/node-migration.ts new file mode 100644 index 00000000000000..7baee4c8fe15ac --- /dev/null +++ b/lib/config/migrations/custom/node-migration.ts @@ -0,0 +1,22 @@ +import type { RenovateConfig } from '../../types'; +import { AbstractMigration } from '../base/abstract-migration'; + +export class NodeMigration extends AbstractMigration { + override readonly propertyName = 'node'; + + override run(value: unknown): void { + const node = this.get('node') as RenovateConfig; + if ((value as RenovateConfig).enabled === true) { + // validated non-null + delete node.enabled; + const travis = (this.get('travis') ?? {}) as RenovateConfig; + travis.enabled = true; + if (Object.keys(node).length) { + this.rewrite(node); + } else { + this.delete('node'); + } + this.setSafely('travis', travis); + } + } +} diff --git a/lib/config/migrations/migrations-service.ts b/lib/config/migrations/migrations-service.ts index 4097ad06179218..9093003b105202 100644 --- a/lib/config/migrations/migrations-service.ts +++ b/lib/config/migrations/migrations-service.ts @@ -23,6 +23,7 @@ import { HostRulesMigration } from './custom/host-rules-migration'; import { IgnoreNodeModulesMigration } from './custom/ignore-node-modules-migration'; import { IgnoreNpmrcFileMigration } from './custom/ignore-npmrc-file-migration'; import { MatchStringsMigration } from './custom/match-strings-migration'; +import { NodeMigration } from './custom/node-migration'; import { PackageNameMigration } from './custom/package-name-migration'; import { PackagePatternMigration } from './custom/package-pattern-migration'; import { PackagesMigration } from './custom/packages-migration'; @@ -127,6 +128,7 @@ export class MigrationsService { VersionStrategyMigration, DryRunMigration, RequireConfigMigration, + NodeMigration, SemanticPrefixMigration, ];