/** * Типы для системы миграции конфигураций виджета чата */ import { WidgetConfig } from '../config.types' /** Версии конфигурации */ export type ConfigVersion = '1.0' | '2.0' | '3.0' | '3.1' /** * Ordered list of supported config versions. * Keep this in sync with `ConfigVersion` union above. */ export const CONFIG_VERSIONS = ['1.0', '2.0', '3.0', '3.1'] as const satisfies ReadonlyArray /** Latest supported config version. */ export const LATEST_CONFIG_VERSION: ConfigVersion = CONFIG_VERSIONS[CONFIG_VERSIONS.length - 1] /** Результат миграции */ export interface MigrationResult { success: boolean data?: T errors: string[] warnings: string[] fromVersion: ConfigVersion toVersion: ConfigVersion appliedStrategies: string[] } /** Контекст миграции */ export interface MigrationContext { fromVersion: ConfigVersion toVersion: ConfigVersion config: any options?: MigrationOptions } /** Опции миграции */ export interface MigrationOptions { /** Строгий режим - останавливаться на ошибках */ strict?: boolean /** Сохранять неизвестные поля */ preserveUnknown?: boolean /** Логировать процесс миграции */ verbose?: boolean /** Применить только определенные стратегии */ onlyStrategies?: string[] /** Исключить определенные стратегии */ excludeStrategies?: string[] } /** Абстрактная стратегия миграции */ export interface MigrationStrategy { /** Уникальное имя стратегии */ name: string /** Описание что делает стратегия */ description: string /** Версии для которых применяется */ appliesTo: { from: ConfigVersion to: ConfigVersion } /** Проверка применимости стратегии */ canApply(context: MigrationContext): boolean /** Применение стратегии */ apply(context: MigrationContext): MigrationStepResult /** Откат стратегии (если возможен) */ rollback?(context: MigrationContext): MigrationStepResult } /** Результат шага миграции */ export interface MigrationStepResult { success: boolean data?: any errors: string[] warnings: string[] modified: boolean } /** Команда миграции */ export interface MigrationCommand { /** Имя команды */ name: string /** Описание команды */ description: string /** Выполнить команду */ execute(config: any, options?: any): MigrationStepResult } /** Детектор версии конфигурации */ export interface VersionDetector { /** Определить версию конфигурации */ detect(config: any): ConfigVersion | null } /** Валидатор конфигурации */ export interface ConfigValidator { /** Валидировать конфигурацию для версии */ validate(config: any, version: ConfigVersion): { isValid: boolean errors: string[] warnings: string[] } } /** Схема конфигурации для конкретной версии */ export interface ConfigSchema { version: ConfigVersion schema: any // JSON Schema или подобное required: string[] optional: string[] } /** Отчет о миграции */ export interface MigrationReport { timestamp: Date fromVersion: ConfigVersion toVersion: ConfigVersion success: boolean duration: number appliedStrategies: Array<{ name: string success: boolean errors: string[] warnings: string[] }> totalErrors: number totalWarnings: number summary: string } /** Логгер для миграции */ export interface MigrationLogger { info(message: string, context?: any): void warn(message: string, context?: any): void error(message: string, context?: any): void debug(message: string, context?: any): void } /** Базовые типы для различных версий конфигурации */ /** Конфигурация V1 */ export interface ConfigV1 { settings: { widgetTitle: string welcomeMessage: string bgChat: string gapMessageLine: number paddingChat: number fontFamily: string borderRadius: string launchView: string letterSpacing: number logo: string fontWeight: number } sections: { top: { params: { size: string } chipWidgetTitle: { color: string; bgColor: string } btnClose: { color: string; bgColor: string } } inside: { params: { size: string } messageUser: { color: string; bgColor: string } messageBot: { color: string; bgColor: string } welcomeMessage: { color: string } } bottom: { params: { size: string } inputSend: { color: string; bgColor: string } btnSend: { color: string; bgColor: string; type: string } activeBtn: { color: string; bgColor: string } } } } /** Конфигурация V2 - расширенная версия */ export interface ConfigV2 extends WidgetConfig {} /** Маппинг типов конфигурации по версиям */ export type ConfigByVersion = { '1.0': ConfigV1 '2.0': ConfigV2 '3.0': WidgetConfig // Для будущих версий '3.1': WidgetConfig } /** Фабрика для создания пустых конфигураций */ export type ConfigFactory = { [V in ConfigVersion]: () => ConfigByVersion[V] }