import { isNullOrUndefined, isString } from '@sindresorhus/is'; import type { AllConfig, RenovateConfig } from '../../types.ts'; import type { MigratableConfig, Migration } from '../types.ts'; export abstract class AbstractMigration< T extends RenovateConfig = AllConfig, > implements Migration { readonly deprecated: boolean = false; abstract readonly propertyName: string | RegExp; private readonly originalConfig: MigratableConfig; private readonly migratedConfig: MigratableConfig; constructor( originalConfig: MigratableConfig, migratedConfig: MigratableConfig, ) { this.originalConfig = originalConfig; this.migratedConfig = migratedConfig; } abstract run(value: unknown, key: string): void; protected get>( key: Key, ): MigratableConfig[Key] { return this.migratedConfig[key] ?? this.originalConfig[key]; } protected has(key: Key): boolean { return key in this.originalConfig; } protected setSafely>( key: Key, value: MigratableConfig[Key], ): void { if ( isNullOrUndefined(this.originalConfig[key]) && isNullOrUndefined(this.migratedConfig[key]) ) { this.migratedConfig[key] = value; } } protected setHard>( key: Key, value: MigratableConfig[Key], ): void { this.migratedConfig[key] = value; } protected rewrite(value: unknown): void { if (!isString(this.propertyName)) { throw new Error(); } // TODO: fix types this.setHard( this.propertyName as keyof MigratableConfig, value as never, ); } protected delete(property = this.propertyName): void { if (!isString(property)) { throw new Error(); } // TODO: fix types delete this.migratedConfig[property as keyof MigratableConfig]; } }