/** * Фасад для удобного использования системы миграции */ import { ConfigVersion, MigrationResult, MigrationOptions, MigrationReport, LATEST_CONFIG_VERSION, ConfigV1, ConfigV2 } from './types' import { ConfigMigrator, DefaultMigrationLogger } from './migrator' import { WidgetConfig } from '../config.types' /** Простой API для миграции конфигураций */ export class MigrationFacade { private migrator: ConfigMigrator constructor(verbose: boolean = true) { const logger = new DefaultMigrationLogger(verbose) this.migrator = new ConfigMigrator(logger) } /** * Мигрировать конфигурацию V1 в V2 */ async migrateV1toV2(config: ConfigV1, options?: MigrationOptions): Promise> { return this.migrator.migrate(config, '2.0', options) } /** * Мигрировать конфигурацию V2 в V3 (enhanced) */ async migrateV2toV3(config: ConfigV2, options?: MigrationOptions): Promise> { return this.migrator.migrate(config, '3.0', options) } /** * Мигрировать конфигурацию в последнюю версию */ async migrateToLatest(config: any, options?: MigrationOptions): Promise> { // Use the latest supported version from the shared version list. return this.migrator.migrate(config, LATEST_CONFIG_VERSION, options) } /** * Автоматически определить версию и мигрировать в указанную */ async migrate(config: any, targetVersion: ConfigVersion, options?: MigrationOptions): Promise { return this.migrator.migrate(config, targetVersion, options) } /** * Предварительный просмотр миграции без её выполнения */ async preview(config: any, targetVersion: ConfigVersion, options?: MigrationOptions): Promise { return this.migrator.dryRun(config, targetVersion, options) } /** * Быстрая проверка - можно ли мигрировать конфигурацию */ async canMigrate(config: any, targetVersion: ConfigVersion): Promise { try { const report = await this.preview(config, targetVersion) return report.success } catch { return false } } } /** Глобальный экземпляр фасада */ export const migrationFacade = new MigrationFacade() /** Утилитарные функции для быстрого использования */ /** * Быстрая миграция V1 -> V2 */ export async function quickMigrateV1toV2(config: ConfigV1, options?: MigrationOptions): Promise { try { const result = await migrationFacade.migrateV1toV2(config, options) return result.success ? result.data! : null } catch { return null } } /** * Quick migration V2 -> V3 (enhanced) */ export async function quickMigrateV2toV3(config: ConfigV2, options?: MigrationOptions): Promise { try { const result = await migrationFacade.migrateV2toV3(config, options) return result.success ? result.data! : null } catch { return null } } /** * Быстрая миграция в последнюю версию */ export async function quickMigrateToLatest(config: any, options?: MigrationOptions): Promise { try { const result = await migrationFacade.migrateToLatest(config, options) return result.success ? result.data! : null } catch { return null } } /** * Синхронная функция миграции V1 -> V2 (без async/await) * Использует только стратегии без побочных эффектов */ export function syncMigrateV1toV2(_config: ConfigV1): ConfigV2 | null { // Синхронная миграция пока не поддерживается, используйте async версию console.warn('syncMigrateV1toV2 не поддерживается, используйте quickMigrateV1toV2') return null } /** Набор предустановленных опций миграции */ export const MigrationPresets = { /** Строгий режим - останавливается на любой ошибке */ STRICT: { strict: true, preserveUnknown: false, verbose: false } as MigrationOptions, /** Мягкий режим - продолжает при ошибках, сохраняет неизвестные поля */ SOFT: { strict: false, preserveUnknown: true, verbose: false } as MigrationOptions, /** Режим отладки - подробные логи */ DEBUG: { strict: false, preserveUnknown: true, verbose: true } as MigrationOptions, /** Производственный режим - без логов, строгий */ PRODUCTION: { strict: true, preserveUnknown: false, verbose: false } as MigrationOptions } /** Хелперы для работы с конфигурациями */ export class ConfigHelpers { /** * Проверить является ли конфигурация V1 */ static isV1Config(config: any): config is ConfigV1 { return config && config.settings && config.sections && config.settings.loader === undefined && // V1 не имеет loader config.sections.inside?.aprooveButton === undefined // V1 не имеет approve кнопок } /** * Проверить является ли конфигурация V2 */ static isV2Config(config: any): config is ConfigV2 { return config && config.settings && config.sections && config.settings.loader !== undefined && // V2 имеет loader config.sections.inside?.aprooveButton !== undefined // V2 имеет approve кнопки } /** * Безопасно получить версию конфигурации */ static getConfigVersion(config: any): ConfigVersion | null { if (ConfigHelpers.isV2Config(config)) return '2.0' if (ConfigHelpers.isV1Config(config)) return '1.0' return null } /** * Создать резервную копию конфигурации */ static backup(config: any): { config: any; timestamp: number; version: ConfigVersion | null } { return { config: JSON.parse(JSON.stringify(config)), timestamp: Date.now(), version: ConfigHelpers.getConfigVersion(config) } } /** * Валидировать основную структуру конфигурации */ static isValidStructure(config: any): boolean { return !!( config && typeof config === 'object' && config.settings && typeof config.settings === 'object' && config.sections && typeof config.sections === 'object' && config.sections.top && config.sections.inside && config.sections.bottom ) } }