From 5377b1f1aaf46abcfbb8ca324856f6bb16ab30b5 Mon Sep 17 00:00:00 2001 From: Maksim <m.v.sharipov@gmail.com> Date: Wed, 17 Nov 2021 16:43:55 +0100 Subject: [PATCH] feat(config): migrate inline with the same sort (#12091) Co-authored-by: Michael Kriese <michael.kriese@visualon.de> Co-authored-by: Rhys Arkins <rhys@arkins.net> --- lib/config/migration.ts | 61 +----------- .../migrations/base/abstract-migration.ts | 26 +++++ .../base/remove-property-migration.ts | 7 ++ .../base/rename-property-migration.ts | 23 +++++ .../custom/binary-source-migration.spec.ts | 11 +++ .../custom/binary-source-migration.ts | 14 +++ .../custom/go-mod-tidy-migration.spec.ts | 31 ++++++ .../custom/go-mod-tidy-migration.ts | 19 ++++ .../ignore-node-modules-migration.spec.ts | 11 +++ .../custom/ignore-node-modules-migration.ts | 16 ++++ .../required-status-checks-migration.spec.ts | 12 +++ .../required-status-checks-migration.ts | 16 ++++ .../custom/trust-level-migration.spec.ts | 26 +++++ .../custom/trust-level-migration.ts | 21 ++++ lib/config/migrations/index.ts | 19 +--- lib/config/migrations/migration.ts | 18 ---- .../migrations/migrations-service.spec.ts | 45 +++++++++ lib/config/migrations/migrations-service.ts | 95 +++++++++++++++++++ .../required-status-checks-migration.spec.ts | 21 ---- .../required-status-checks-migration.ts | 11 --- lib/config/migrations/types.ts | 4 + 21 files changed, 382 insertions(+), 125 deletions(-) create mode 100644 lib/config/migrations/base/abstract-migration.ts create mode 100644 lib/config/migrations/base/remove-property-migration.ts create mode 100644 lib/config/migrations/base/rename-property-migration.ts create mode 100644 lib/config/migrations/custom/binary-source-migration.spec.ts create mode 100644 lib/config/migrations/custom/binary-source-migration.ts create mode 100644 lib/config/migrations/custom/go-mod-tidy-migration.spec.ts create mode 100644 lib/config/migrations/custom/go-mod-tidy-migration.ts create mode 100644 lib/config/migrations/custom/ignore-node-modules-migration.spec.ts create mode 100644 lib/config/migrations/custom/ignore-node-modules-migration.ts create mode 100644 lib/config/migrations/custom/required-status-checks-migration.spec.ts create mode 100644 lib/config/migrations/custom/required-status-checks-migration.ts create mode 100644 lib/config/migrations/custom/trust-level-migration.spec.ts create mode 100644 lib/config/migrations/custom/trust-level-migration.ts delete mode 100644 lib/config/migrations/migration.ts create mode 100644 lib/config/migrations/migrations-service.spec.ts create mode 100644 lib/config/migrations/migrations-service.ts delete mode 100644 lib/config/migrations/required-status-checks-migration.spec.ts delete mode 100644 lib/config/migrations/required-status-checks-migration.ts create mode 100644 lib/config/migrations/types.ts diff --git a/lib/config/migration.ts b/lib/config/migration.ts index ddad631b66..2d7fd47f07 100644 --- a/lib/config/migration.ts +++ b/lib/config/migration.ts @@ -5,7 +5,7 @@ import { logger } from '../logger'; import { clone } from '../util/clone'; import { regEx } from '../util/regex'; import { getGlobalConfig } from './global'; -import { applyMigrations } from './migrations'; +import { MigrationsService } from './migrations'; import { getOptions } from './options'; import { removedPresets } from './presets/common'; import type { @@ -20,23 +20,6 @@ const options = getOptions(); let optionTypes: Record<string, RenovateOptions['type']>; -const removedOptions = [ - 'maintainYarnLock', - 'yarnCacheFolder', - 'yarnMaintenanceBranchName', - 'yarnMaintenanceCommitMessage', - 'yarnMaintenancePrTitle', - 'yarnMaintenancePrBody', - 'groupBranchName', - 'groupBranchName', - 'groupCommitMessage', - 'groupPrTitle', - 'groupPrBody', - 'statusCheckVerify', - 'lazyGrouping', - 'supportPolicy', -]; - // Returns a migrated config export function migrateConfig( config: RenovateConfig, @@ -50,7 +33,8 @@ export function migrateConfig( optionTypes[option.name] = option.type; }); } - const migratedConfig = clone(config) as MigratedRenovateConfig; + const newConfig = MigrationsService.run(config); + const migratedConfig = clone(newConfig) as MigratedRenovateConfig; const depTypes = [ 'dependencies', 'devDependencies', @@ -59,11 +43,8 @@ export function migrateConfig( 'peerDependencies', ]; const { migratePresets } = getGlobalConfig(); - applyMigrations(config, migratedConfig); for (const [key, val] of Object.entries(config)) { - if (removedOptions.includes(key)) { - delete migratedConfig[key]; - } else if (key === 'pathRules') { + if (key === 'pathRules') { if (is.array(val)) { migratedConfig.packageRules = is.array(migratedConfig.packageRules) ? migratedConfig.packageRules @@ -85,13 +66,6 @@ export function migrateConfig( migratedConfig[newKey] = true; } delete migratedConfig[key]; - } else if (key === 'gomodTidy') { - if (val) { - migratedConfig.postUpdateOptions = - migratedConfig.postUpdateOptions || []; - migratedConfig.postUpdateOptions.push('gomodTidy'); - } - delete migratedConfig.gomodTidy; } else if (key === 'semanticCommits') { if (val === true) { migratedConfig.semanticCommits = 'enabled'; @@ -211,16 +185,6 @@ export function migrateConfig( if (val === false) { migratedConfig.rebaseWhen = 'never'; } - } else if (key === 'exposeEnv') { - migratedConfig.exposeAllEnv = val; - delete migratedConfig.exposeEnv; - } else if (key === 'trustLevel') { - delete migratedConfig.trustLevel; - if (val === 'high') { - migratedConfig.allowCustomCrateRegistries ??= true; - migratedConfig.allowScripts ??= true; - migratedConfig.exposeAllEnv ??= true; - } } else if (key === 'ignoreNpmrcFile') { delete migratedConfig.ignoreNpmrcFile; if (!is.string(migratedConfig.npmrc)) { @@ -305,9 +269,6 @@ export function migrateConfig( } } delete migratedConfig.unpublishSafe; - } else if (key === 'versionScheme') { - migratedConfig.versioning = val; - delete migratedConfig.versionScheme; } else if ( key === 'automergeType' && is.string(val) && @@ -322,25 +283,16 @@ export function migrateConfig( migratedConfig.major = migratedConfig.major || {}; migratedConfig.major.automerge = !!val; delete migratedConfig[key]; - } else if (key === 'multipleMajorPrs') { - delete migratedConfig.multipleMajorPrs; - migratedConfig.separateMultipleMajor = val; } else if (key === 'renovateFork' && is.boolean(val)) { delete migratedConfig.renovateFork; migratedConfig.includeForks = val; } else if (key === 'separateMajorReleases') { delete migratedConfig.separateMultipleMajor; migratedConfig.separateMajorMinor = val; - } else if (key === 'separatePatchReleases') { - delete migratedConfig.separatePatchReleases; - migratedConfig.separateMinorPatch = val; } else if (key === 'automergePatch') { migratedConfig.patch = migratedConfig.patch || {}; migratedConfig.patch.automerge = !!val; delete migratedConfig[key]; - } else if (key === 'ignoreNodeModules') { - delete migratedConfig.ignoreNodeModules; - migratedConfig.ignorePaths = val ? ['node_modules/'] : []; } else if ( key === 'automerge' && is.string(val) && @@ -374,9 +326,6 @@ export function migrateConfig( migratedConfig.packages ); delete migratedConfig.packages; - } else if (key === 'excludedPackageNames') { - migratedConfig.excludePackageNames = val; - delete migratedConfig.excludedPackageNames; } else if (key === 'packageName') { migratedConfig.packageNames = [val]; delete migratedConfig.packageName; @@ -541,8 +490,6 @@ export function migrateConfig( migratedConfig.suppressNotifications || []; migratedConfig.suppressNotifications.push('deprecationWarningIssues'); } - } else if (key === 'binarySource' && val === 'auto') { - migratedConfig.binarySource = 'global'; } else if (key === 'composerIgnorePlatformReqs') { if (val === true) { migratedConfig.composerIgnorePlatformReqs = []; diff --git a/lib/config/migrations/base/abstract-migration.ts b/lib/config/migrations/base/abstract-migration.ts new file mode 100644 index 0000000000..56d6fb7548 --- /dev/null +++ b/lib/config/migrations/base/abstract-migration.ts @@ -0,0 +1,26 @@ +import type { RenovateConfig } from '../../types'; +import type { Migration } from '../types'; + +export abstract class AbstractMigration implements Migration { + readonly propertyName: string; + + protected readonly originalConfig: RenovateConfig; + + protected readonly migratedConfig: RenovateConfig; + + constructor( + propertyName: string, + originalConfig: RenovateConfig, + migratedConfig: RenovateConfig + ) { + this.propertyName = propertyName; + this.originalConfig = originalConfig; + this.migratedConfig = migratedConfig; + } + + abstract run(): void; + + protected delete(property: string): void { + delete this.migratedConfig[property]; + } +} diff --git a/lib/config/migrations/base/remove-property-migration.ts b/lib/config/migrations/base/remove-property-migration.ts new file mode 100644 index 0000000000..0b2ad24969 --- /dev/null +++ b/lib/config/migrations/base/remove-property-migration.ts @@ -0,0 +1,7 @@ +import { AbstractMigration } from './abstract-migration'; + +export class RemovePropertyMigration extends AbstractMigration { + override run(): void { + this.delete(this.propertyName); + } +} diff --git a/lib/config/migrations/base/rename-property-migration.ts b/lib/config/migrations/base/rename-property-migration.ts new file mode 100644 index 0000000000..c317634be4 --- /dev/null +++ b/lib/config/migrations/base/rename-property-migration.ts @@ -0,0 +1,23 @@ +import type { RenovateConfig } from '../../types'; +import { AbstractMigration } from './abstract-migration'; + +export class RenamePropertyMigration extends AbstractMigration { + protected readonly newPropertyName: string; + + constructor( + deprecatedPropertyName: string, + newPropertyName: string, + originalConfig: RenovateConfig, + migratedConfig: RenovateConfig + ) { + super(deprecatedPropertyName, originalConfig, migratedConfig); + this.newPropertyName = newPropertyName; + } + + override run(): void { + this.delete(this.propertyName); + + this.migratedConfig[this.newPropertyName] = + this.originalConfig[this.propertyName]; + } +} diff --git a/lib/config/migrations/custom/binary-source-migration.spec.ts b/lib/config/migrations/custom/binary-source-migration.spec.ts new file mode 100644 index 0000000000..22ef956ba4 --- /dev/null +++ b/lib/config/migrations/custom/binary-source-migration.spec.ts @@ -0,0 +1,11 @@ +import { MigrationsService } from '../migrations-service'; + +describe('config/migrations/custom/binary-source-migration', () => { + it('should migrate "auto" to "global"', () => { + const migratedConfig = MigrationsService.run({ + binarySource: 'auto', + }); + + expect(migratedConfig.binarySource).toBe('global'); + }); +}); diff --git a/lib/config/migrations/custom/binary-source-migration.ts b/lib/config/migrations/custom/binary-source-migration.ts new file mode 100644 index 0000000000..1452897133 --- /dev/null +++ b/lib/config/migrations/custom/binary-source-migration.ts @@ -0,0 +1,14 @@ +import type { RenovateConfig } from '../../types'; +import { AbstractMigration } from '../base/abstract-migration'; + +export class BinarySourceMigration extends AbstractMigration { + constructor(originalConfig: RenovateConfig, migratedConfig: RenovateConfig) { + super('binarySource', originalConfig, migratedConfig); + } + + override run(): void { + if (this.originalConfig.binarySource === 'auto') { + this.migratedConfig.binarySource = 'global'; + } + } +} diff --git a/lib/config/migrations/custom/go-mod-tidy-migration.spec.ts b/lib/config/migrations/custom/go-mod-tidy-migration.spec.ts new file mode 100644 index 0000000000..f0c7be274f --- /dev/null +++ b/lib/config/migrations/custom/go-mod-tidy-migration.spec.ts @@ -0,0 +1,31 @@ +import { MigrationsService } from '../migrations-service'; + +describe('config/migrations/custom/go-mod-tidy-migration', () => { + it('should add postUpdateOptions option when true', () => { + const migratedConfig = MigrationsService.run({ + gomodTidy: true, + postUpdateOptions: ['test'], + }); + + expect(migratedConfig).not.toHaveProperty('gomodTidy'); + expect(migratedConfig.postUpdateOptions).toEqual(['test', 'gomodTidy']); + }); + + it('should handle case when postUpdateOptions is not defined ', () => { + const migratedConfig = MigrationsService.run({ + gomodTidy: true, + }); + + expect(migratedConfig).not.toHaveProperty('gomodTidy'); + expect(migratedConfig.postUpdateOptions).toEqual(['gomodTidy']); + }); + + it('should only remove when false', () => { + const migratedConfig = MigrationsService.run({ + gomodTidy: false, + }); + + expect(migratedConfig).not.toHaveProperty('gomodTidy'); + expect(migratedConfig).not.toHaveProperty('postUpdateOptions'); + }); +}); diff --git a/lib/config/migrations/custom/go-mod-tidy-migration.ts b/lib/config/migrations/custom/go-mod-tidy-migration.ts new file mode 100644 index 0000000000..b655489da2 --- /dev/null +++ b/lib/config/migrations/custom/go-mod-tidy-migration.ts @@ -0,0 +1,19 @@ +import type { RenovateConfig } from '../../types'; +import { AbstractMigration } from '../base/abstract-migration'; + +export class GoModTidyMigration extends AbstractMigration { + constructor(originalConfig: RenovateConfig, migratedConfig: RenovateConfig) { + super('gomodTidy', originalConfig, migratedConfig); + } + + override run(): void { + const { gomodTidy, postUpdateOptions } = this.originalConfig; + + this.delete(this.propertyName); + + if (gomodTidy) { + this.migratedConfig.postUpdateOptions ??= postUpdateOptions ?? []; + this.migratedConfig.postUpdateOptions.push('gomodTidy'); + } + } +} diff --git a/lib/config/migrations/custom/ignore-node-modules-migration.spec.ts b/lib/config/migrations/custom/ignore-node-modules-migration.spec.ts new file mode 100644 index 0000000000..4f2d4d000a --- /dev/null +++ b/lib/config/migrations/custom/ignore-node-modules-migration.spec.ts @@ -0,0 +1,11 @@ +import { MigrationsService } from '../migrations-service'; + +describe('config/migrations/custom/ignore-node-modules-migration', () => { + it('should migrate to ignorePaths', () => { + const migratedConfig = MigrationsService.run({ + ignoreNodeModules: true, + }); + + expect(migratedConfig.ignorePaths).toEqual(['node_modules/']); + }); +}); diff --git a/lib/config/migrations/custom/ignore-node-modules-migration.ts b/lib/config/migrations/custom/ignore-node-modules-migration.ts new file mode 100644 index 0000000000..976b53df3c --- /dev/null +++ b/lib/config/migrations/custom/ignore-node-modules-migration.ts @@ -0,0 +1,16 @@ +import type { RenovateConfig } from '../../types'; +import { AbstractMigration } from '../base/abstract-migration'; + +export class IgnoreNodeModulesMigration extends AbstractMigration { + constructor(originalConfig: RenovateConfig, migratedConfig: RenovateConfig) { + super('ignoreNodeModules', originalConfig, migratedConfig); + } + + override run(): void { + this.delete(this.propertyName); + + this.migratedConfig.ignorePaths = this.originalConfig.ignoreNodeModules + ? ['node_modules/'] + : []; + } +} diff --git a/lib/config/migrations/custom/required-status-checks-migration.spec.ts b/lib/config/migrations/custom/required-status-checks-migration.spec.ts new file mode 100644 index 0000000000..2fdd678208 --- /dev/null +++ b/lib/config/migrations/custom/required-status-checks-migration.spec.ts @@ -0,0 +1,12 @@ +import { MigrationsService } from '../migrations-service'; + +describe('config/migrations/custom/required-status-checks-migration', () => { + it('should migrate requiredStatusChecks=null to ignoreTests=true', () => { + const migratedConfig = MigrationsService.run({ + requiredStatusChecks: null, + }); + + expect(migratedConfig).not.toHaveProperty('requiredStatusChecks'); + expect(migratedConfig.ignoreTests).toBeTrue(); + }); +}); diff --git a/lib/config/migrations/custom/required-status-checks-migration.ts b/lib/config/migrations/custom/required-status-checks-migration.ts new file mode 100644 index 0000000000..cd06869c20 --- /dev/null +++ b/lib/config/migrations/custom/required-status-checks-migration.ts @@ -0,0 +1,16 @@ +import type { RenovateConfig } from '../../types'; +import { AbstractMigration } from '../base/abstract-migration'; + +export class RequiredStatusChecksMigration extends AbstractMigration { + constructor(originalConfig: RenovateConfig, migratedConfig: RenovateConfig) { + super('requiredStatusChecks', originalConfig, migratedConfig); + } + + override run(): void { + this.delete(this.propertyName); + + if (this.originalConfig.requiredStatusChecks === null) { + this.migratedConfig.ignoreTests = true; + } + } +} diff --git a/lib/config/migrations/custom/trust-level-migration.spec.ts b/lib/config/migrations/custom/trust-level-migration.spec.ts new file mode 100644 index 0000000000..5fac9753ea --- /dev/null +++ b/lib/config/migrations/custom/trust-level-migration.spec.ts @@ -0,0 +1,26 @@ +import { MigrationsService } from '../migrations-service'; + +describe('config/migrations/custom/trust-level-migration', () => { + it('should handle hight level', () => { + const migratedConfig = MigrationsService.run({ + trustLevel: 'high', + }); + + expect(migratedConfig.allowCustomCrateRegistries).toBeTrue(); + expect(migratedConfig.allowScripts).toBeTrue(); + expect(migratedConfig.exposeAllEnv).toBeTrue(); + }); + + it('should not rewrite provided properties', () => { + const migratedConfig = MigrationsService.run({ + allowCustomCrateRegistries: false, + allowScripts: false, + exposeAllEnv: false, + trustLevel: 'high', + }); + + expect(migratedConfig.allowCustomCrateRegistries).toBeFalse(); + expect(migratedConfig.allowScripts).toBeFalse(); + expect(migratedConfig.exposeAllEnv).toBeFalse(); + }); +}); diff --git a/lib/config/migrations/custom/trust-level-migration.ts b/lib/config/migrations/custom/trust-level-migration.ts new file mode 100644 index 0000000000..b9e09077f4 --- /dev/null +++ b/lib/config/migrations/custom/trust-level-migration.ts @@ -0,0 +1,21 @@ +import type { RenovateConfig } from '../../types'; +import { AbstractMigration } from '../base/abstract-migration'; + +export class TrustLevelMigration extends AbstractMigration { + constructor(originalConfig: RenovateConfig, migratedConfig: RenovateConfig) { + super('trustLevel', originalConfig, migratedConfig); + } + + override run(): void { + this.delete(this.propertyName); + + if (this.originalConfig.trustLevel === 'high') { + this.migratedConfig.allowCustomCrateRegistries = + this.originalConfig.allowCustomCrateRegistries ?? true; + this.migratedConfig.allowScripts = + this.originalConfig.allowScripts ?? true; + this.migratedConfig.exposeAllEnv = + this.originalConfig.exposeAllEnv ?? true; + } + } +} diff --git a/lib/config/migrations/index.ts b/lib/config/migrations/index.ts index 1f6c961c29..2831c79f22 100644 --- a/lib/config/migrations/index.ts +++ b/lib/config/migrations/index.ts @@ -1,18 +1 @@ -import { RenovateConfig } from '../types'; -import type { Migration } from './migration'; -import { RequiredStatusChecksMigration } from './required-status-checks-migration'; - -export function applyMigrations( - originalConfig: RenovateConfig, - migratedConfig: RenovateConfig -): RenovateConfig { - const migrations: Migration[] = [ - new RequiredStatusChecksMigration(originalConfig, migratedConfig), - ]; - - for (const migration of migrations) { - migration.migrate(); - } - - return migratedConfig; -} +export { MigrationsService } from './migrations-service'; diff --git a/lib/config/migrations/migration.ts b/lib/config/migrations/migration.ts deleted file mode 100644 index 616b96caea..0000000000 --- a/lib/config/migrations/migration.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { RenovateConfig } from '../types'; - -export abstract class Migration { - protected readonly originalConfig: RenovateConfig; - - protected readonly migratedConfig: RenovateConfig; - - constructor(originalConfig: RenovateConfig, migratedConfig: RenovateConfig) { - this.originalConfig = originalConfig; - this.migratedConfig = migratedConfig; - } - - abstract migrate(): void; - - protected delete(property: string): void { - delete this.migratedConfig[property]; - } -} diff --git a/lib/config/migrations/migrations-service.spec.ts b/lib/config/migrations/migrations-service.spec.ts new file mode 100644 index 0000000000..222da9a9ca --- /dev/null +++ b/lib/config/migrations/migrations-service.spec.ts @@ -0,0 +1,45 @@ +import type { RenovateConfig } from '../types'; +import { MigrationsService } from './migrations-service'; + +describe('config/migrations/migrations-service', () => { + it('should remove deprecated properties', () => { + for (const property of MigrationsService.removedProperties) { + const originalConfig: RenovateConfig = { + [property]: 'test', + }; + + const migratedConfig = MigrationsService.run(originalConfig); + expect(migratedConfig).not.toHaveProperty(property); + } + }); + + it('should rename renamed properties', () => { + for (const [ + oldPropertyName, + newPropertyName, + ] of MigrationsService.renamedProperties.entries()) { + const originalConfig: RenovateConfig = { + [oldPropertyName]: 'test', + }; + + const migratedConfig = MigrationsService.run(originalConfig); + expect(migratedConfig).not.toHaveProperty(oldPropertyName); + expect(migratedConfig[newPropertyName]).toBe('test'); + } + }); + + it('should save original order of properties', () => { + const originalConfig: RenovateConfig = { + exposeEnv: true, + versionScheme: 'test', + excludedPackageNames: ['test'], + }; + const migratedConfig = MigrationsService.run(originalConfig); + + const mappedProperties = Object.keys(originalConfig).map((property) => + MigrationsService.renamedProperties.get(property) + ); + + expect(mappedProperties).toEqual(Object.keys(migratedConfig)); + }); +}); diff --git a/lib/config/migrations/migrations-service.ts b/lib/config/migrations/migrations-service.ts new file mode 100644 index 0000000000..d1cee89acb --- /dev/null +++ b/lib/config/migrations/migrations-service.ts @@ -0,0 +1,95 @@ +import type { RenovateConfig } from '../types'; +import { RemovePropertyMigration } from './base/remove-property-migration'; +import { RenamePropertyMigration } from './base/rename-property-migration'; +import { BinarySourceMigration } from './custom/binary-source-migration'; +import { GoModTidyMigration } from './custom/go-mod-tidy-migration'; +import { IgnoreNodeModulesMigration } from './custom/ignore-node-modules-migration'; +import { RequiredStatusChecksMigration } from './custom/required-status-checks-migration'; +import { TrustLevelMigration } from './custom/trust-level-migration'; +import type { Migration } from './types'; + +export class MigrationsService { + static readonly removedProperties: ReadonlySet<string> = new Set([ + 'gitFs', + 'groupBranchName', + 'groupCommitMessage', + 'groupPrBody', + 'groupPrTitle', + 'lazyGrouping', + 'maintainYarnLock', + 'statusCheckVerify', + 'supportPolicy', + 'yarnCacheFolder', + 'yarnMaintenanceBranchName', + 'yarnMaintenanceCommitMessage', + 'yarnMaintenancePrBody', + 'yarnMaintenancePrTitle', + ]); + + static readonly renamedProperties: ReadonlyMap<string, string> = new Map([ + ['exposeEnv', 'exposeAllEnv'], + ['separatePatchReleases', 'separateMinorPatch'], + ['multipleMajorPrs', 'separateMultipleMajor'], + ['excludedPackageNames', 'excludePackageNames'], + ['versionScheme', 'versioning'], + ]); + + static run(originalConfig: RenovateConfig): RenovateConfig { + const migratedConfig: RenovateConfig = {}; + const migrations = MigrationsService.getMigrations( + originalConfig, + migratedConfig + ); + + for (const [key, value] of Object.entries(originalConfig)) { + migratedConfig[key] ??= value; + const migration = migrations.find((item) => item.propertyName === key); + migration?.run(); + } + + return migratedConfig; + } + + private static getMigrations( + originalConfig: RenovateConfig, + migratedConfig: RenovateConfig + ): Migration[] { + const migrations: Migration[] = []; + + for (const propertyName of MigrationsService.removedProperties) { + migrations.push( + new RemovePropertyMigration( + propertyName, + originalConfig, + migratedConfig + ) + ); + } + + for (const [ + oldPropertyName, + newPropertyName, + ] of MigrationsService.renamedProperties.entries()) { + migrations.push( + new RenamePropertyMigration( + oldPropertyName, + newPropertyName, + originalConfig, + migratedConfig + ) + ); + } + + migrations.push(new BinarySourceMigration(originalConfig, migratedConfig)); + migrations.push( + new IgnoreNodeModulesMigration(originalConfig, migratedConfig) + ); + migrations.push( + new RequiredStatusChecksMigration(originalConfig, migratedConfig) + ); + migrations.push(new TrustLevelMigration(originalConfig, migratedConfig)); + migrations.push(new GoModTidyMigration(originalConfig, migratedConfig)); + + return migrations; + } +} diff --git a/lib/config/migrations/required-status-checks-migration.spec.ts b/lib/config/migrations/required-status-checks-migration.spec.ts deleted file mode 100644 index afe9019ee5..0000000000 --- a/lib/config/migrations/required-status-checks-migration.spec.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { RequiredStatusChecksMigration } from './required-status-checks-migration'; - -describe('config/migrations/required-status-checks-migration', () => { - it('should migrate requiredStatusChecks=null to ignoreTests=true', () => { - const originalConfig: any = { - requiredStatusChecks: null, - }; - const migratedConfig: any = { - requiredStatusChecks: null, - }; - const migration = new RequiredStatusChecksMigration( - originalConfig, - migratedConfig - ); - - expect(migratedConfig.requiredStatusChecks).toBeNull(); - migration.migrate(); - expect(migratedConfig.requiredStatusChecks).toBeUndefined(); - expect(migratedConfig.ignoreTests).toBeTrue(); - }); -}); diff --git a/lib/config/migrations/required-status-checks-migration.ts b/lib/config/migrations/required-status-checks-migration.ts deleted file mode 100644 index 3f6d64e28f..0000000000 --- a/lib/config/migrations/required-status-checks-migration.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Migration } from './migration'; - -export class RequiredStatusChecksMigration extends Migration { - public migrate(): void { - this.delete('requiredStatusChecks'); - - if (this.originalConfig.requiredStatusChecks === null) { - this.migratedConfig.ignoreTests = true; - } - } -} diff --git a/lib/config/migrations/types.ts b/lib/config/migrations/types.ts new file mode 100644 index 0000000000..93f2035ed6 --- /dev/null +++ b/lib/config/migrations/types.ts @@ -0,0 +1,4 @@ +export interface Migration { + readonly propertyName: string; + run(): void; +} -- GitLab