@authrim/setup 0.1.63 → 0.1.64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/__tests__/migrate.test.d.ts +5 -0
  2. package/dist/__tests__/migrate.test.d.ts.map +1 -0
  3. package/dist/__tests__/migrate.test.js +273 -0
  4. package/dist/__tests__/migrate.test.js.map +1 -0
  5. package/dist/__tests__/paths.test.d.ts +2 -0
  6. package/dist/__tests__/paths.test.d.ts.map +1 -0
  7. package/dist/__tests__/paths.test.js +257 -0
  8. package/dist/__tests__/paths.test.js.map +1 -0
  9. package/dist/cli/commands/config.d.ts +1 -0
  10. package/dist/cli/commands/config.d.ts.map +1 -1
  11. package/dist/cli/commands/config.js +41 -7
  12. package/dist/cli/commands/config.js.map +1 -1
  13. package/dist/cli/commands/deploy.d.ts +1 -0
  14. package/dist/cli/commands/deploy.d.ts.map +1 -1
  15. package/dist/cli/commands/deploy.js +181 -19
  16. package/dist/cli/commands/deploy.js.map +1 -1
  17. package/dist/cli/commands/init.d.ts.map +1 -1
  18. package/dist/cli/commands/init.js +267 -82
  19. package/dist/cli/commands/init.js.map +1 -1
  20. package/dist/cli/commands/migrate.d.ts +21 -0
  21. package/dist/cli/commands/migrate.d.ts.map +1 -0
  22. package/dist/cli/commands/migrate.js +166 -0
  23. package/dist/cli/commands/migrate.js.map +1 -0
  24. package/dist/core/admin.d.ts +18 -1
  25. package/dist/core/admin.d.ts.map +1 -1
  26. package/dist/core/admin.js +36 -7
  27. package/dist/core/admin.js.map +1 -1
  28. package/dist/core/config.d.ts +10 -2
  29. package/dist/core/config.d.ts.map +1 -1
  30. package/dist/core/config.js +6 -2
  31. package/dist/core/config.js.map +1 -1
  32. package/dist/core/keys.d.ts +55 -4
  33. package/dist/core/keys.d.ts.map +1 -1
  34. package/dist/core/keys.js +104 -12
  35. package/dist/core/keys.js.map +1 -1
  36. package/dist/core/lock.d.ts +60 -3
  37. package/dist/core/lock.d.ts.map +1 -1
  38. package/dist/core/lock.js +108 -4
  39. package/dist/core/lock.js.map +1 -1
  40. package/dist/core/migrate.d.ts +95 -0
  41. package/dist/core/migrate.d.ts.map +1 -0
  42. package/dist/core/migrate.js +549 -0
  43. package/dist/core/migrate.js.map +1 -0
  44. package/dist/core/paths.d.ts +171 -0
  45. package/dist/core/paths.d.ts.map +1 -0
  46. package/dist/core/paths.js +319 -0
  47. package/dist/core/paths.js.map +1 -0
  48. package/dist/core/wrangler-sync.d.ts +88 -0
  49. package/dist/core/wrangler-sync.d.ts.map +1 -0
  50. package/dist/core/wrangler-sync.js +242 -0
  51. package/dist/core/wrangler-sync.js.map +1 -0
  52. package/dist/index.js +16 -1
  53. package/dist/index.js.map +1 -1
  54. package/dist/web/api.d.ts.map +1 -1
  55. package/dist/web/api.js +102 -28
  56. package/dist/web/api.js.map +1 -1
  57. package/dist/web/ui.d.ts.map +1 -1
  58. package/dist/web/ui.js +831 -273
  59. package/dist/web/ui.js.map +1 -1
  60. package/package.json +1 -1
@@ -0,0 +1,549 @@
1
+ /**
2
+ * Migration Module
3
+ *
4
+ * Handles migration from legacy flat file structure to new unified
5
+ * .authrim/{env}/ directory structure.
6
+ *
7
+ * Legacy structure:
8
+ * project/
9
+ * ├── authrim-config.json
10
+ * ├── authrim-lock.json
11
+ * └── .keys/{env}/
12
+ *
13
+ * New structure:
14
+ * project/
15
+ * └── .authrim/
16
+ * └── {env}/
17
+ * ├── config.json
18
+ * ├── lock.json
19
+ * ├── version.txt
20
+ * └── keys/
21
+ */
22
+ import { existsSync } from 'node:fs';
23
+ import { mkdir, copyFile, readFile, writeFile, readdir, rm, chmod } from 'node:fs/promises';
24
+ import { join } from 'node:path';
25
+ import { createRequire } from 'node:module';
26
+ import { LEGACY_CONFIG_FILE, LEGACY_LOCK_FILE, LEGACY_KEYS_DIR, getEnvironmentPaths, getLegacyPaths, detectStructure, listEnvironments, validateEnvName, } from './paths.js';
27
+ import { AuthrimConfigSchema } from './config.js';
28
+ import { AuthrimLockSchema } from './lock.js';
29
+ import { saveMasterWranglerConfigs } from './wrangler-sync.js';
30
+ // File permission constants
31
+ const SENSITIVE_FILE_MODE = 0o600; // Owner read/write only
32
+ const DIRECTORY_MODE = 0o700; // Owner read/write/execute only
33
+ // Get package version
34
+ const require = createRequire(import.meta.url);
35
+ function getVersion() {
36
+ try {
37
+ const pkg = require('../../package.json');
38
+ return pkg.version;
39
+ }
40
+ catch {
41
+ return '0.0.0';
42
+ }
43
+ }
44
+ // =============================================================================
45
+ // Migration Detection
46
+ // =============================================================================
47
+ /**
48
+ * Check if migration from legacy structure is needed
49
+ */
50
+ export function needsMigration(baseDir = process.cwd()) {
51
+ const structure = detectStructure(baseDir);
52
+ return structure.type === 'legacy';
53
+ }
54
+ /**
55
+ * Get list of environments that need migration
56
+ */
57
+ export function getEnvironmentsToMigrate(baseDir = process.cwd()) {
58
+ const legacyConfigPath = join(baseDir, LEGACY_CONFIG_FILE);
59
+ const legacyKeysDir = join(baseDir, LEGACY_KEYS_DIR);
60
+ const environments = [];
61
+ // Check if legacy config exists and extract environment from it
62
+ if (existsSync(legacyConfigPath)) {
63
+ try {
64
+ const content = require('fs').readFileSync(legacyConfigPath, 'utf-8');
65
+ const config = JSON.parse(content);
66
+ if (config.environment?.prefix) {
67
+ environments.push(config.environment.prefix);
68
+ }
69
+ }
70
+ catch {
71
+ // Ignore parse errors
72
+ }
73
+ }
74
+ // Also check for environments in .keys directory
75
+ if (existsSync(legacyKeysDir)) {
76
+ try {
77
+ const entries = require('fs').readdirSync(legacyKeysDir, { withFileTypes: true });
78
+ for (const entry of entries) {
79
+ if (entry.isDirectory() && !environments.includes(entry.name)) {
80
+ environments.push(entry.name);
81
+ }
82
+ }
83
+ }
84
+ catch {
85
+ // Ignore errors
86
+ }
87
+ }
88
+ return environments;
89
+ }
90
+ // =============================================================================
91
+ // Backup
92
+ // =============================================================================
93
+ /**
94
+ * Create a backup of legacy files before migration
95
+ */
96
+ export async function createBackup(baseDir = process.cwd(), onProgress) {
97
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
98
+ const backupDir = join(baseDir, `.authrim-backup-${timestamp}`);
99
+ const files = [];
100
+ try {
101
+ onProgress?.(`Creating backup at ${backupDir}`);
102
+ // Create backup directory
103
+ await mkdir(backupDir, { recursive: true });
104
+ // Backup legacy config
105
+ const legacyConfigPath = join(baseDir, LEGACY_CONFIG_FILE);
106
+ if (existsSync(legacyConfigPath)) {
107
+ const destPath = join(backupDir, LEGACY_CONFIG_FILE);
108
+ await copyFile(legacyConfigPath, destPath);
109
+ files.push(LEGACY_CONFIG_FILE);
110
+ onProgress?.(` Backed up ${LEGACY_CONFIG_FILE}`);
111
+ }
112
+ // Backup legacy lock file
113
+ const legacyLockPath = join(baseDir, LEGACY_LOCK_FILE);
114
+ if (existsSync(legacyLockPath)) {
115
+ const destPath = join(backupDir, LEGACY_LOCK_FILE);
116
+ await copyFile(legacyLockPath, destPath);
117
+ files.push(LEGACY_LOCK_FILE);
118
+ onProgress?.(` Backed up ${LEGACY_LOCK_FILE}`);
119
+ }
120
+ // Backup .keys directory
121
+ const legacyKeysDir = join(baseDir, LEGACY_KEYS_DIR);
122
+ if (existsSync(legacyKeysDir)) {
123
+ const backupKeysDir = join(backupDir, LEGACY_KEYS_DIR);
124
+ await copyDirectoryRecursive(legacyKeysDir, backupKeysDir, files, LEGACY_KEYS_DIR);
125
+ onProgress?.(` Backed up ${LEGACY_KEYS_DIR}/`);
126
+ }
127
+ onProgress?.(`Backup complete: ${files.length} files`);
128
+ return {
129
+ success: true,
130
+ backupPath: backupDir,
131
+ files,
132
+ };
133
+ }
134
+ catch (error) {
135
+ return {
136
+ success: false,
137
+ backupPath: backupDir,
138
+ error: error instanceof Error ? error.message : String(error),
139
+ files,
140
+ };
141
+ }
142
+ }
143
+ /**
144
+ * Check if a file is sensitive (keys, secrets)
145
+ */
146
+ function isSensitiveFile(filename) {
147
+ return (filename.endsWith('.pem') ||
148
+ filename.endsWith('.key') ||
149
+ filename.includes('secret') ||
150
+ filename.includes('private') ||
151
+ filename.includes('token'));
152
+ }
153
+ /**
154
+ * Recursively copy a directory with security checks
155
+ */
156
+ async function copyDirectoryRecursive(src, dest, files, relativePath) {
157
+ await mkdir(dest, { recursive: true, mode: DIRECTORY_MODE });
158
+ const entries = await readdir(src, { withFileTypes: true });
159
+ for (const entry of entries) {
160
+ const srcPath = join(src, entry.name);
161
+ const destPath = join(dest, entry.name);
162
+ const relPath = join(relativePath, entry.name);
163
+ // Security: Skip symbolic links to prevent symlink attacks
164
+ if (entry.isSymbolicLink()) {
165
+ continue;
166
+ }
167
+ if (entry.isDirectory()) {
168
+ await copyDirectoryRecursive(srcPath, destPath, files, relPath);
169
+ }
170
+ else {
171
+ await copyFile(srcPath, destPath);
172
+ files.push(relPath);
173
+ // Security: Set restrictive permissions on sensitive files
174
+ if (isSensitiveFile(entry.name)) {
175
+ await chmod(destPath, SENSITIVE_FILE_MODE);
176
+ }
177
+ }
178
+ }
179
+ }
180
+ // =============================================================================
181
+ // Migration
182
+ // =============================================================================
183
+ /**
184
+ * Migrate from legacy structure to new unified structure
185
+ */
186
+ export async function migrateToNewStructure(options = {}) {
187
+ const { baseDir = process.cwd(), env, dryRun = false, noBackup = false, deleteLegacy = false, onProgress, } = options;
188
+ const result = {
189
+ success: false,
190
+ migratedEnvs: [],
191
+ errors: [],
192
+ migratedFiles: [],
193
+ };
194
+ // Check if migration is needed
195
+ const structure = detectStructure(baseDir);
196
+ if (structure.type !== 'legacy') {
197
+ if (structure.type === 'new') {
198
+ onProgress?.('Already using new directory structure');
199
+ result.success = true;
200
+ return result;
201
+ }
202
+ else {
203
+ result.errors.push('No configuration files found to migrate');
204
+ return result;
205
+ }
206
+ }
207
+ // Determine environments to migrate
208
+ const environments = env ? [env] : getEnvironmentsToMigrate(baseDir);
209
+ if (environments.length === 0) {
210
+ result.errors.push('No environments detected for migration');
211
+ return result;
212
+ }
213
+ onProgress?.(`Environments to migrate: ${environments.join(', ')}`);
214
+ // Create backup (unless skipped or dry run)
215
+ if (!noBackup && !dryRun) {
216
+ onProgress?.('\nCreating backup...');
217
+ const backupResult = await createBackup(baseDir, onProgress);
218
+ if (!backupResult.success) {
219
+ result.errors.push(`Backup failed: ${backupResult.error}`);
220
+ return result;
221
+ }
222
+ result.backupPath = backupResult.backupPath;
223
+ }
224
+ // Migrate each environment
225
+ for (const envName of environments) {
226
+ onProgress?.(`\nMigrating environment: ${envName}`);
227
+ try {
228
+ const envResult = await migrateEnvironment(baseDir, envName, dryRun, onProgress);
229
+ if (envResult.success) {
230
+ result.migratedEnvs.push(envName);
231
+ result.migratedFiles.push(...envResult.files);
232
+ }
233
+ else {
234
+ result.errors.push(...envResult.errors);
235
+ }
236
+ }
237
+ catch (error) {
238
+ result.errors.push(`Failed to migrate ${envName}: ${error instanceof Error ? error.message : String(error)}`);
239
+ }
240
+ }
241
+ // Delete legacy files if requested and migration succeeded
242
+ if (deleteLegacy && !dryRun && result.migratedEnvs.length > 0 && result.errors.length === 0) {
243
+ onProgress?.('\nCleaning up legacy files...');
244
+ await deleteLegacyFiles(baseDir, onProgress);
245
+ }
246
+ result.success = result.errors.length === 0 && result.migratedEnvs.length > 0;
247
+ return result;
248
+ }
249
+ /**
250
+ * Migrate a single environment
251
+ */
252
+ async function migrateEnvironment(baseDir, env, dryRun, onProgress) {
253
+ const files = [];
254
+ const errors = [];
255
+ // Security: Validate environment name to prevent path traversal
256
+ if (!validateEnvName(env)) {
257
+ errors.push(`Invalid environment name: ${env}. Must start with lowercase letter and contain only lowercase letters, numbers, and hyphens.`);
258
+ return { success: false, files, errors };
259
+ }
260
+ const newPaths = getEnvironmentPaths({ baseDir, env });
261
+ const legacyPaths = getLegacyPaths(baseDir, env);
262
+ // Create new directory structure with secure permissions
263
+ if (!dryRun) {
264
+ await mkdir(newPaths.root, { recursive: true, mode: DIRECTORY_MODE });
265
+ await mkdir(newPaths.keys, { recursive: true, mode: DIRECTORY_MODE });
266
+ onProgress?.(` Created ${newPaths.root}`);
267
+ }
268
+ else {
269
+ onProgress?.(` Would create ${newPaths.root}`);
270
+ }
271
+ // Migrate config.json
272
+ if (existsSync(legacyPaths.config)) {
273
+ try {
274
+ const content = await readFile(legacyPaths.config, 'utf-8');
275
+ const config = JSON.parse(content);
276
+ // Update secretsPath to relative path within new structure
277
+ if (config.keys) {
278
+ config.keys.secretsPath = './keys/';
279
+ }
280
+ if (!dryRun) {
281
+ await writeFile(newPaths.config, JSON.stringify(config, null, 2));
282
+ onProgress?.(` Migrated config.json`);
283
+ }
284
+ else {
285
+ onProgress?.(` Would migrate config.json`);
286
+ }
287
+ files.push(newPaths.config);
288
+ }
289
+ catch (error) {
290
+ errors.push(`Failed to migrate config: ${error instanceof Error ? error.message : String(error)}`);
291
+ }
292
+ }
293
+ // Migrate lock.json
294
+ if (existsSync(legacyPaths.lock)) {
295
+ try {
296
+ const content = await readFile(legacyPaths.lock, 'utf-8');
297
+ const lock = JSON.parse(content);
298
+ if (!dryRun) {
299
+ await writeFile(newPaths.lock, JSON.stringify(lock, null, 2));
300
+ onProgress?.(` Migrated lock.json`);
301
+ }
302
+ else {
303
+ onProgress?.(` Would migrate lock.json`);
304
+ }
305
+ files.push(newPaths.lock);
306
+ }
307
+ catch (error) {
308
+ errors.push(`Failed to migrate lock: ${error instanceof Error ? error.message : String(error)}`);
309
+ }
310
+ }
311
+ // Migrate keys directory
312
+ const legacyKeysDir = join(baseDir, LEGACY_KEYS_DIR, env);
313
+ if (existsSync(legacyKeysDir)) {
314
+ try {
315
+ const keyFiles = await readdir(legacyKeysDir, { withFileTypes: true });
316
+ let migratedCount = 0;
317
+ for (const entry of keyFiles) {
318
+ // Security: Skip symbolic links to prevent symlink attacks
319
+ if (entry.isSymbolicLink() || entry.isDirectory()) {
320
+ continue;
321
+ }
322
+ const srcPath = join(legacyKeysDir, entry.name);
323
+ const destPath = join(newPaths.keys, entry.name);
324
+ if (!dryRun) {
325
+ await copyFile(srcPath, destPath);
326
+ // Security: Set restrictive permissions on sensitive files
327
+ if (isSensitiveFile(entry.name)) {
328
+ await chmod(destPath, SENSITIVE_FILE_MODE);
329
+ }
330
+ }
331
+ files.push(destPath);
332
+ migratedCount++;
333
+ }
334
+ if (!dryRun) {
335
+ onProgress?.(` Migrated ${migratedCount} key files`);
336
+ }
337
+ else {
338
+ onProgress?.(` Would migrate ${migratedCount} key files`);
339
+ }
340
+ }
341
+ catch (error) {
342
+ errors.push(`Failed to migrate keys: ${error instanceof Error ? error.message : String(error)}`);
343
+ }
344
+ }
345
+ // Create version.txt
346
+ const version = getVersion();
347
+ if (!dryRun) {
348
+ await writeFile(newPaths.version, version);
349
+ onProgress?.(` Created version.txt (${version})`);
350
+ }
351
+ else {
352
+ onProgress?.(` Would create version.txt (${version})`);
353
+ }
354
+ files.push(newPaths.version);
355
+ // Generate wrangler configs from migrated config and lock
356
+ // This is needed because legacy structure has no wrangler/ directory
357
+ if (existsSync(newPaths.config) && existsSync(newPaths.lock)) {
358
+ try {
359
+ const configContent = await readFile(newPaths.config, 'utf-8');
360
+ const lockContent = await readFile(newPaths.lock, 'utf-8');
361
+ const config = JSON.parse(configContent);
362
+ const lock = JSON.parse(lockContent);
363
+ // Build ResourceIds from lock file
364
+ // AuthrimLock has d1, kv, queues, r2 at the top level (not nested under resources)
365
+ const resourceIds = {
366
+ d1: {},
367
+ kv: {},
368
+ queues: {},
369
+ r2: {},
370
+ };
371
+ // Map D1 databases
372
+ if (lock.d1) {
373
+ for (const [binding, info] of Object.entries(lock.d1)) {
374
+ resourceIds.d1[binding] = { id: info.id, name: info.name };
375
+ }
376
+ }
377
+ // Map KV namespaces
378
+ if (lock.kv) {
379
+ for (const [binding, info] of Object.entries(lock.kv)) {
380
+ resourceIds.kv[binding] = { id: info.id, name: info.name };
381
+ }
382
+ }
383
+ // Map Queues (if present)
384
+ if (lock.queues) {
385
+ for (const [binding, info] of Object.entries(lock.queues)) {
386
+ if (resourceIds.queues) {
387
+ resourceIds.queues[binding] = { id: info.id, name: info.name };
388
+ }
389
+ }
390
+ }
391
+ // Map R2 buckets (if present)
392
+ if (lock.r2) {
393
+ for (const [binding, info] of Object.entries(lock.r2)) {
394
+ if (resourceIds.r2) {
395
+ resourceIds.r2[binding] = { name: info.name };
396
+ }
397
+ }
398
+ }
399
+ // Generate and save wrangler configs
400
+ if (!dryRun) {
401
+ onProgress?.(' Generating wrangler configs...');
402
+ const wranglerResult = await saveMasterWranglerConfigs(config, resourceIds, {
403
+ baseDir,
404
+ env,
405
+ dryRun: false,
406
+ onProgress,
407
+ });
408
+ if (wranglerResult.success) {
409
+ files.push(...wranglerResult.files);
410
+ onProgress?.(` Generated ${wranglerResult.files.length} wrangler configs`);
411
+ }
412
+ else {
413
+ for (const err of wranglerResult.errors) {
414
+ errors.push(`Wrangler generation: ${err}`);
415
+ }
416
+ }
417
+ }
418
+ else {
419
+ onProgress?.(` Would generate wrangler configs`);
420
+ }
421
+ }
422
+ catch (error) {
423
+ // Non-fatal: wrangler generation failure doesn't fail the migration
424
+ onProgress?.(` Warning: Could not generate wrangler configs: ${error instanceof Error ? error.message : String(error)}`);
425
+ }
426
+ }
427
+ return {
428
+ success: errors.length === 0,
429
+ files,
430
+ errors,
431
+ };
432
+ }
433
+ /**
434
+ * Delete legacy files after successful migration
435
+ */
436
+ async function deleteLegacyFiles(baseDir, onProgress) {
437
+ // Delete legacy config
438
+ const legacyConfigPath = join(baseDir, LEGACY_CONFIG_FILE);
439
+ if (existsSync(legacyConfigPath)) {
440
+ await rm(legacyConfigPath);
441
+ onProgress?.(` Deleted ${LEGACY_CONFIG_FILE}`);
442
+ }
443
+ // Delete legacy lock
444
+ const legacyLockPath = join(baseDir, LEGACY_LOCK_FILE);
445
+ if (existsSync(legacyLockPath)) {
446
+ await rm(legacyLockPath);
447
+ onProgress?.(` Deleted ${LEGACY_LOCK_FILE}`);
448
+ }
449
+ // Delete legacy keys directory
450
+ const legacyKeysDir = join(baseDir, LEGACY_KEYS_DIR);
451
+ if (existsSync(legacyKeysDir)) {
452
+ await rm(legacyKeysDir, { recursive: true });
453
+ onProgress?.(` Deleted ${LEGACY_KEYS_DIR}/`);
454
+ }
455
+ }
456
+ // =============================================================================
457
+ // Validation
458
+ // =============================================================================
459
+ /**
460
+ * Validate a migrated environment
461
+ */
462
+ export async function validateMigration(baseDir, env) {
463
+ const issues = [];
464
+ const paths = getEnvironmentPaths({ baseDir, env });
465
+ // Check directory exists
466
+ if (!existsSync(paths.root)) {
467
+ issues.push(`Environment directory not found: ${paths.root}`);
468
+ return { valid: false, issues };
469
+ }
470
+ // Check config.json
471
+ if (!existsSync(paths.config)) {
472
+ issues.push('config.json not found');
473
+ }
474
+ else {
475
+ try {
476
+ const content = await readFile(paths.config, 'utf-8');
477
+ const data = JSON.parse(content);
478
+ const result = AuthrimConfigSchema.safeParse(data);
479
+ if (!result.success) {
480
+ issues.push(`config.json validation failed: ${result.error.message}`);
481
+ }
482
+ }
483
+ catch (error) {
484
+ issues.push(`config.json read error: ${error instanceof Error ? error.message : String(error)}`);
485
+ }
486
+ }
487
+ // Check lock.json
488
+ if (!existsSync(paths.lock)) {
489
+ issues.push('lock.json not found');
490
+ }
491
+ else {
492
+ try {
493
+ const content = await readFile(paths.lock, 'utf-8');
494
+ const data = JSON.parse(content);
495
+ const result = AuthrimLockSchema.safeParse(data);
496
+ if (!result.success) {
497
+ issues.push(`lock.json validation failed: ${result.error.message}`);
498
+ }
499
+ }
500
+ catch (error) {
501
+ issues.push(`lock.json read error: ${error instanceof Error ? error.message : String(error)}`);
502
+ }
503
+ }
504
+ // Check version.txt
505
+ if (!existsSync(paths.version)) {
506
+ issues.push('version.txt not found');
507
+ }
508
+ // Check keys directory
509
+ if (!existsSync(paths.keys)) {
510
+ issues.push('keys/ directory not found');
511
+ }
512
+ else {
513
+ // Check for essential key files
514
+ const essentialKeys = ['private.pem', 'public.jwk.json'];
515
+ for (const keyFile of essentialKeys) {
516
+ if (!existsSync(join(paths.keys, keyFile))) {
517
+ issues.push(`Key file not found: ${keyFile}`);
518
+ }
519
+ }
520
+ }
521
+ return {
522
+ valid: issues.length === 0,
523
+ issues,
524
+ };
525
+ }
526
+ /**
527
+ * Get migration status summary
528
+ */
529
+ export function getMigrationStatus(baseDir = process.cwd()) {
530
+ const structure = detectStructure(baseDir);
531
+ const legacyFiles = [];
532
+ if (existsSync(join(baseDir, LEGACY_CONFIG_FILE))) {
533
+ legacyFiles.push(LEGACY_CONFIG_FILE);
534
+ }
535
+ if (existsSync(join(baseDir, LEGACY_LOCK_FILE))) {
536
+ legacyFiles.push(LEGACY_LOCK_FILE);
537
+ }
538
+ if (existsSync(join(baseDir, LEGACY_KEYS_DIR))) {
539
+ legacyFiles.push(LEGACY_KEYS_DIR + '/');
540
+ }
541
+ const environments = structure.type === 'new' ? listEnvironments(baseDir) : getEnvironmentsToMigrate(baseDir);
542
+ return {
543
+ needsMigration: structure.type === 'legacy',
544
+ currentStructure: structure.type,
545
+ environments,
546
+ legacyFiles,
547
+ };
548
+ }
549
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/core/migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,mBAAmB,EAAsB,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAoB,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAG/D,4BAA4B;AAC5B,MAAM,mBAAmB,GAAG,KAAK,CAAC,CAAC,wBAAwB;AAC3D,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,gCAAgC;AAE9D,sBAAsB;AACtB,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAC;QACjE,OAAO,GAAG,CAAC,OAAO,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAsDD,gFAAgF;AAChF,sBAAsB;AACtB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,UAAkB,OAAO,CAAC,GAAG,EAAE;IAC5D,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC3C,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,UAAkB,OAAO,CAAC,GAAG,EAAE;IACtE,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;IAC3D,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAErD,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,gEAAgE;IAChE,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;YACtE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;gBAC/B,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,aAAa,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAClF,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC9D,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,gFAAgF;AAChF,SAAS;AACT,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,UAAkB,OAAO,CAAC,GAAG,EAAE,EAC/B,UAAkC;IAElC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9E,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,mBAAmB,SAAS,EAAE,CAAC,CAAC;IAEhE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,CAAC;QACH,UAAU,EAAE,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;QAEhD,0BAA0B;QAC1B,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5C,uBAAuB;QACvB,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;QAC3D,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;YACrD,MAAM,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC/B,UAAU,EAAE,CAAC,eAAe,kBAAkB,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,0BAA0B;QAC1B,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QACvD,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;YACnD,MAAM,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC7B,UAAU,EAAE,CAAC,eAAe,gBAAgB,EAAE,CAAC,CAAC;QAClD,CAAC;QAED,yBAAyB;QACzB,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QACrD,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;YACvD,MAAM,sBAAsB,CAAC,aAAa,EAAE,aAAa,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;YACnF,UAAU,EAAE,CAAC,eAAe,eAAe,GAAG,CAAC,CAAC;QAClD,CAAC;QAED,UAAU,EAAE,CAAC,oBAAoB,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;QAEvD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,SAAS;YACrB,KAAK;SACN,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,SAAS;YACrB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YAC7D,KAAK;SACN,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,QAAgB;IACvC,OAAO,CACL,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QACzB,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QACzB,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC3B,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC5B,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC3B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,sBAAsB,CACnC,GAAW,EACX,IAAY,EACZ,KAAe,EACf,YAAoB;IAEpB,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;IAE7D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAE/C,2DAA2D;QAC3D,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,sBAAsB,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAEpB,2DAA2D;YAC3D,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,MAAM,KAAK,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,UAA4B,EAAE;IAE9B,MAAM,EACJ,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,EACvB,GAAG,EACH,MAAM,GAAG,KAAK,EACd,QAAQ,GAAG,KAAK,EAChB,YAAY,GAAG,KAAK,EACpB,UAAU,GACX,GAAG,OAAO,CAAC;IAEZ,MAAM,MAAM,GAAoB;QAC9B,OAAO,EAAE,KAAK;QACd,YAAY,EAAE,EAAE;QAChB,MAAM,EAAE,EAAE;QACV,aAAa,EAAE,EAAE;KAClB,CAAC;IAEF,+BAA+B;IAC/B,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAChC,IAAI,SAAS,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC7B,UAAU,EAAE,CAAC,uCAAuC,CAAC,CAAC;YACtD,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;YACtB,OAAO,MAAM,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;YAC9D,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,MAAM,YAAY,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAErE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QAC7D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,UAAU,EAAE,CAAC,4BAA4B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEpE,4CAA4C;IAC5C,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,UAAU,EAAE,CAAC,sBAAsB,CAAC,CAAC;QACrC,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAE7D,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC;YAC3D,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,CAAC,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;IAC9C,CAAC;IAED,2BAA2B;IAC3B,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,UAAU,EAAE,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC;QAEpD,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;YAEjF,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;gBACtB,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAClC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,MAAM,CAAC,IAAI,CAChB,qBAAqB,OAAO,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC1F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,IAAI,YAAY,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5F,UAAU,EAAE,CAAC,+BAA+B,CAAC,CAAC;QAC9C,MAAM,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IAE9E,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAC/B,OAAe,EACf,GAAW,EACX,MAAe,EACf,UAAkC;IAElC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,gEAAgE;IAChE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,6BAA6B,GAAG,8FAA8F,CAAC,CAAC;QAC5I,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC3C,CAAC;IAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAEjD,yDAAyD;IACzD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACtE,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACtE,UAAU,EAAE,CAAC,aAAa,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,UAAU,EAAE,CAAC,kBAAkB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,sBAAsB;IACtB,IAAI,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAkB,CAAC;YAEpD,2DAA2D;YAC3D,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;YACtC,CAAC;YAED,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAClE,UAAU,EAAE,CAAC,wBAAwB,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,UAAU,EAAE,CAAC,6BAA6B,CAAC,CAAC;YAC9C,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrG,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAC;YAEhD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC9D,UAAU,EAAE,CAAC,sBAAsB,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,UAAU,EAAE,CAAC,2BAA2B,CAAC,CAAC;YAC5C,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnG,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC;IAC1D,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YACvE,IAAI,aAAa,GAAG,CAAC,CAAC;YAEtB,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;gBAC7B,2DAA2D;gBAC3D,IAAI,KAAK,CAAC,cAAc,EAAE,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;oBAClD,SAAS;gBACX,CAAC;gBAED,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAEjD,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;oBAElC,2DAA2D;oBAC3D,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;wBAChC,MAAM,KAAK,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;oBAC7C,CAAC;gBACH,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACrB,aAAa,EAAE,CAAC;YAClB,CAAC;YAED,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,UAAU,EAAE,CAAC,cAAc,aAAa,YAAY,CAAC,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,UAAU,EAAE,CAAC,mBAAmB,aAAa,YAAY,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnG,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3C,UAAU,EAAE,CAAC,0BAA0B,OAAO,GAAG,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,UAAU,EAAE,CAAC,+BAA+B,OAAO,GAAG,CAAC,CAAC;IAC1D,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAE7B,0DAA0D;IAC1D,qEAAqE;IACrE,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7D,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC/D,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAkB,CAAC;YAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAgB,CAAC;YAEpD,mCAAmC;YACnC,mFAAmF;YACnF,MAAM,WAAW,GAAgB;gBAC/B,EAAE,EAAE,EAAE;gBACN,EAAE,EAAE,EAAE;gBACN,MAAM,EAAE,EAAE;gBACV,EAAE,EAAE,EAAE;aACP,CAAC;YAEF,mBAAmB;YACnB,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;gBACZ,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;oBACtD,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC7D,CAAC;YACH,CAAC;YAED,oBAAoB;YACpB,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;gBACZ,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;oBACtD,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC7D,CAAC;YACH,CAAC;YAED,0BAA0B;YAC1B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC1D,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;wBACvB,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;oBACjE,CAAC;gBACH,CAAC;YACH,CAAC;YAED,8BAA8B;YAC9B,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;gBACZ,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;oBACtD,IAAI,WAAW,CAAC,EAAE,EAAE,CAAC;wBACnB,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;oBAChD,CAAC;gBACH,CAAC;YACH,CAAC;YAED,qCAAqC;YACrC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,UAAU,EAAE,CAAC,kCAAkC,CAAC,CAAC;gBACjD,MAAM,cAAc,GAAG,MAAM,yBAAyB,CAAC,MAAM,EAAE,WAAW,EAAE;oBAC1E,OAAO;oBACP,GAAG;oBACH,MAAM,EAAE,KAAK;oBACb,UAAU;iBACX,CAAC,CAAC;gBAEH,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;oBAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;oBACpC,UAAU,EAAE,CAAC,eAAe,cAAc,CAAC,KAAK,CAAC,MAAM,mBAAmB,CAAC,CAAC;gBAC9E,CAAC;qBAAM,CAAC;oBACN,KAAK,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;wBACxC,MAAM,CAAC,IAAI,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC;oBAC7C,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,UAAU,EAAE,CAAC,mCAAmC,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,oEAAoE;YACpE,UAAU,EAAE,CAAC,mDAAmD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5H,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC5B,KAAK;QACL,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAC9B,OAAe,EACf,UAAkC;IAElC,uBAAuB;IACvB,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;IAC3D,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjC,MAAM,EAAE,CAAC,gBAAgB,CAAC,CAAC;QAC3B,UAAU,EAAE,CAAC,aAAa,kBAAkB,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,qBAAqB;IACrB,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IACvD,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/B,MAAM,EAAE,CAAC,cAAc,CAAC,CAAC;QACzB,UAAU,EAAE,CAAC,aAAa,gBAAgB,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,+BAA+B;IAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACrD,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,MAAM,EAAE,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,UAAU,EAAE,CAAC,aAAa,eAAe,GAAG,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,aAAa;AACb,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAe,EACf,GAAW;IAEX,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,mBAAmB,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IAEpD,yBAAyB;IACzB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,oCAAoC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAClC,CAAC;IAED,oBAAoB;IACpB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACjC,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACnD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,kCAAkC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnG,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACrC,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACpD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACjC,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,gCAAgC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,yBAAyB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;IAED,uBAAuB;IACvB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC3C,CAAC;SAAM,CAAC;QACN,gCAAgC;QAChC,MAAM,aAAa,GAAG,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;QACzD,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;YACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;gBAC3C,MAAM,CAAC,IAAI,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAkB,OAAO,CAAC,GAAG,EAAE;IAMhE,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAE3C,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC;QAClD,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC;QAChD,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;QAC/C,WAAW,CAAC,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,YAAY,GAChB,SAAS,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAE3F,OAAO;QACL,cAAc,EAAE,SAAS,CAAC,IAAI,KAAK,QAAQ;QAC3C,gBAAgB,EAAE,SAAS,CAAC,IAAI;QAChC,YAAY;QACZ,WAAW;KACZ,CAAC;AACJ,CAAC"}