/** * Примеры использования системы миграции конфигураций */ import { quickMigrateV1toV2, MigrationFacade, MigrationPresets, ConfigHelpers } from './facade' import { ConfigV1, ConfigV2 } from './types' import { DEFAULT_CONFIG } from '../default-config' /** Пример простой миграции V1 -> V2 */ export async function exampleSimpleMigration() { const configV1: ConfigV1 = { settings: { widgetTitle: "HyperShadow", welcomeMessage: "🖖 Hi there — I'm your assistant for finding documents, tracking access, and making sense of your files. \n\nHow can I help?", bgChat: "rgba(47, 47, 49, 0.90)", gapMessageLine: 12, paddingChat: 8, fontFamily: "MacPaw Fixel", borderRadius: "lg", launchView: "closed", letterSpacing: 0, logo: "", fontWeight: 400 }, sections: { top: { params: { size: "md" }, chipWidgetTitle: { color: "#BEB6E9", bgColor: "#5E4AC6" }, btnClose: { color: "#BBBBBD", bgColor: "#2F2F31" } }, inside: { params: { size: "md" }, messageUser: { color: "#F9F8F8", bgColor: "#F8F8F933" }, messageBot: { color: "#fff", bgColor: "#5E4AC6" }, welcomeMessage: { color: "#fff" } }, bottom: { params: { size: "sm" }, inputSend: { color: "#EEECEC", bgColor: "#1E1E1E" }, btnSend: { color: "#1E1E1E", bgColor: "rgba(255, 255, 255, 0.50)", type: "both" }, activeBtn: { color: "#fff", bgColor: "#F8F8F933" } } } } console.log('🔄 Миграция V1 -> V2...') // Быстрая миграция const migratedConfig = await quickMigrateV1toV2(configV1) if (migratedConfig) { console.log('✅ Миграция успешна!') console.log('📋 Добавленные поля V2:') console.log('- settings.loader:', migratedConfig.settings.loader) console.log('- sections.top.params.buttonStyle:', migratedConfig.sections.top.params.buttonStyle) console.log('- sections.top.params.chipStyle:', migratedConfig.sections.top.params.chipStyle) console.log('- texts.disclaimer:', migratedConfig.texts.disclaimer) } else { console.log('❌ Ошибка миграции') } return migratedConfig } /** Пример детальной миграции с отчетами */ export async function exampleDetailedMigration() { const facade = new MigrationFacade(true) // включаем подробные логи const configV1: ConfigV1 = { settings: { widgetTitle: "Test Widget", welcomeMessage: "Welcome!", bgChat: "#000000", gapMessageLine: 10, paddingChat: 5, fontFamily: "Arial", borderRadius: "md", launchView: "compact", letterSpacing: 1, logo: "logo.png", fontWeight: 300 }, sections: { top: { params: { size: "lg" }, chipWidgetTitle: { color: "#111", bgColor: "#222" }, btnClose: { color: "#333", bgColor: "#444" } }, inside: { params: { size: "sm" }, messageUser: { color: "#555", bgColor: "#666" }, messageBot: { color: "#777", bgColor: "#888" }, welcomeMessage: { color: "#999" } }, bottom: { params: { size: "md" }, inputSend: { color: "#AAA", bgColor: "#BBB" }, btnSend: { color: "#CCC", bgColor: "#DDD", type: "icon" }, activeBtn: { color: "#EEE", bgColor: "#FFF" } } } } console.log('\n🔍 Предварительный просмотр миграции...') // Предварительный просмотр const preview = await facade.preview(configV1, '2.0', MigrationPresets.DEBUG) console.log('📊 Отчет о планируемой миграции:') console.log(`- Исходная версия: ${preview.fromVersion}`) console.log(`- Целевая версия: ${preview.toVersion}`) console.log(`- Стратегий будет применено: ${preview.appliedStrategies.length}`) console.log(`- Ожидаемое время выполнения: ${preview.duration}ms`) console.log(`- Описание: ${preview.summary}`) console.log('\n🔄 Выполняем миграцию...') // Полная миграция const result = await facade.migrateV1toV2(configV1, MigrationPresets.DEBUG) if (result.success) { console.log('✅ Миграция завершена успешно!') console.log(`📈 Применено стратегий: ${result.appliedStrategies.length}`) console.log(`⚠️ Предупреждений: ${result.warnings.length}`) if (result.warnings.length > 0) { console.log('⚠️ Предупреждения:') result.warnings.forEach(warning => console.log(` - ${warning}`)) } return result.data } else { console.log('❌ Ошибки при миграции:') result.errors.forEach(error => console.log(` - ${error}`)) return null } } /** Пример пакетной миграции нескольких конфигураций */ export async function exampleBatchMigration() { const configs = [ // Конфигурация 1 - V1 { id: 'config1', data: { settings: { widgetTitle: "Config 1", welcomeMessage: "Hello from config 1", bgChat: "#111", gapMessageLine: 5, paddingChat: 10, fontFamily: "Roboto", borderRadius: "sm", launchView: "closed", letterSpacing: 0, logo: "", fontWeight: 400 }, sections: { top: { params: { size: "md" }, chipWidgetTitle: { color: "#AAA", bgColor: "#BBB" }, btnClose: { color: "#CCC", bgColor: "#DDD" } }, inside: { params: { size: "md" }, messageUser: { color: "#EEE", bgColor: "#FFF" }, messageBot: { color: "#000", bgColor: "#111" }, welcomeMessage: { color: "#222" } }, bottom: { params: { size: "sm" }, inputSend: { color: "#333", bgColor: "#444" }, btnSend: { color: "#555", bgColor: "#666", type: "text" }, activeBtn: { color: "#777", bgColor: "#888" } } } } }, // Конфигурация 2 - уже V2 { id: 'config2', data: { settings: { widgetTitle: "Config 2", welcomeMessage: "Hello from config 2", bgChat: "#222", gapMessageLine: 8, paddingChat: 12, fontFamily: "Inter", borderRadius: "lg", launchView: "compact", letterSpacing: 1, logo: "logo2.png", fontWeight: 500, loader: "circle-pulse", buttonStyle: "outlined", buttonType: "icon" }, sections: { top: { params: { size: "lg", chipStyle: "outlined" }, chipWidgetTitle: { color: "#999", bgColor: "#AAA" }, btnClose: { color: "#BBB", bgColor: "#CCC" } }, inside: { params: { size: "lg" }, messageUser: { color: "#DDD", bgColor: "#EEE", bgType: "bubble" }, messageBot: { color: "#FFF", bgColor: "#000", bgType: "plain" }, welcomeMessage: { color: "#111" }, aprooveButton: { color: "#222", bgColor: "#333" }, rejectButton: { color: "#444", bgColor: "#555" } }, bottom: { params: { size: "md" }, inputSend: { color: "#666", bgColor: "#777", borderStyle: { borderColor: "#888", borderWidth: 2 }, inputStyle: "stacked", bgType: "bubble" }, btnSend: { color: "#999", bgColor: "#AAA", type: "both" }, activeBtn: { color: "#BBB", bgColor: "#CCC" }, warningAlert: { color: "#DDD", bgColor: "#EEE" }, disclaimer: "Custom disclaimer" } } } } ] console.log('\n🔄 Пакетная миграция нескольких конфигураций...') const results = [] for (const config of configs) { console.log(`\n📋 Обрабатываем ${config.id}...`) // Определяем версию const version = ConfigHelpers.getConfigVersion(config.data) console.log(` Версия: ${version || 'неизвестна'}`) if (version === '1.0') { console.log(' 🔄 Миграция V1 -> V2...') const migrated = await quickMigrateV1toV2(config.data as ConfigV1) results.push({ id: config.id, originalVersion: version, migrated: !!migrated, result: migrated }) } else if (version === '2.0') { console.log(' ✅ Уже V2, пропускаем') results.push({ id: config.id, originalVersion: version, migrated: false, result: config.data }) } else { console.log(' ❌ Неизвестная версия') results.push({ id: config.id, originalVersion: version, migrated: false, result: null }) } } console.log('\n📊 Результаты пакетной миграции:') results.forEach(result => { console.log(`- ${result.id}: ${result.originalVersion} -> ${result.migrated ? 'V2 (мигрировано)' : 'без изменений'}`) }) return results } /** Пример с обработкой ошибок */ export async function exampleErrorHandling() { console.log('\n🧪 Тестирование обработки ошибок...') // Некорректная конфигурация const brokenConfig = { settings: { // Отсутствуют обязательные поля fontFamily: "Arial" }, // Отсутствует sections } const facade = new MigrationFacade(true) try { console.log('🔄 Попытка миграции некорректной конфигурации...') const result = await facade.migrate(brokenConfig, '2.0', MigrationPresets.STRICT) if (result.success) { console.log('✅ Неожиданно успешно') } else { console.log('❌ Ожидаемые ошибки:') result.errors.forEach(error => console.log(` - ${error}`)) } } catch (error) { console.log('💥 Критическая ошибка:', error) } // Тестируем мягкий режим console.log('\n🔄 Повторная попытка в мягком режиме...') const softResult = await facade.migrate(brokenConfig, '2.0', MigrationPresets.SOFT) if (softResult.success) { console.log('✅ Успешно в мягком режиме') } else { console.log('❌ Ошибки даже в мягком режиме:') softResult.errors.forEach(error => console.log(` - ${error}`)) } } /** Демонстрация всех примеров */ export async function runAllExamples() { console.log('🚀 Запуск всех примеров миграции...\n') try { await exampleSimpleMigration() await exampleDetailedMigration() await exampleBatchMigration() await exampleErrorHandling() console.log('\n🎉 Все примеры выполнены!') } catch (error) { console.error('💥 Критическая ошибка в примерах:', error) } } // Экспортируем готовые конфигурации для тестирования export const SAMPLE_CONFIGS = { V1_BASIC: { settings: { widgetTitle: "Sample V1", welcomeMessage: "Welcome to V1", bgChat: "#000", gapMessageLine: 10, paddingChat: 8, fontFamily: "Arial", borderRadius: "md", launchView: "closed", letterSpacing: 0, logo: "", fontWeight: 400 }, sections: { top: { params: { size: "md" }, chipWidgetTitle: { color: "#FFF", bgColor: "#000" }, btnClose: { color: "#000", bgColor: "#FFF" } }, inside: { params: { size: "md" }, messageUser: { color: "#333", bgColor: "#EEE" }, messageBot: { color: "#FFF", bgColor: "#007AFF" }, welcomeMessage: { color: "#333" } }, bottom: { params: { size: "sm" }, inputSend: { color: "#333", bgColor: "#FFF" }, btnSend: { color: "#FFF", bgColor: "#007AFF", type: "both" }, activeBtn: { color: "#007AFF", bgColor: "#EEE" } } } } as ConfigV1, V2_COMPLETE: DEFAULT_CONFIG as ConfigV2 }