@tamyla/clodo-framework 3.1.21 → 3.1.22

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 (169) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +53 -0
  3. package/dist/bin/clodo-service.js +47 -15
  4. package/dist/bin/commands/deploy.js +115 -83
  5. package/dist/bin/commands/helpers/deployment-ui.js +138 -0
  6. package/dist/bin/commands/helpers/deployment-verification.js +251 -0
  7. package/dist/bin/commands/helpers/error-recovery.js +80 -0
  8. package/dist/bin/commands/helpers/resource-detection.js +113 -0
  9. package/dist/bin/commands/validate.js +1 -1
  10. package/dist/bin/security/security-cli.js +1 -1
  11. package/dist/bin/shared/cache/configuration-cache.js +82 -0
  12. package/dist/bin/shared/cloudflare/domain-manager.js +1 -1
  13. package/dist/bin/shared/cloudflare/index.js +1 -1
  14. package/dist/bin/shared/cloudflare/ops.js +6 -4
  15. package/dist/bin/shared/config/ConfigurationManager.js +23 -1
  16. package/dist/bin/shared/config/command-config-manager.js +19 -3
  17. package/dist/bin/shared/config/index.js +1 -1
  18. package/dist/bin/shared/deployment/credential-collector.js +30 -7
  19. package/dist/bin/shared/deployment/index.js +2 -2
  20. package/dist/bin/shared/deployment/rollback-manager.js +4 -520
  21. package/dist/bin/shared/deployment/utilities/d1-error-recovery.js +177 -0
  22. package/dist/bin/shared/deployment/validator.js +40 -10
  23. package/dist/bin/shared/deployment/workflows/deployment-summary.js +214 -0
  24. package/dist/bin/shared/deployment/workflows/interactive-confirmation.js +188 -0
  25. package/dist/bin/shared/deployment/workflows/interactive-database-workflow.js +234 -0
  26. package/dist/bin/shared/deployment/workflows/interactive-domain-info-gatherer.js +240 -0
  27. package/dist/bin/shared/deployment/workflows/interactive-secret-workflow.js +228 -0
  28. package/dist/bin/shared/deployment/workflows/interactive-testing-workflow.js +235 -0
  29. package/dist/bin/shared/deployment/workflows/interactive-validation.js +218 -0
  30. package/dist/bin/shared/error-handling/error-classifier.js +46 -0
  31. package/dist/bin/shared/monitoring/health-checker.js +129 -1
  32. package/dist/bin/shared/monitoring/memory-manager.js +17 -6
  33. package/dist/bin/shared/routing/domain-router.js +1 -1
  34. package/dist/bin/shared/utils/deployment-validator.js +97 -0
  35. package/dist/bin/shared/utils/formatters.js +10 -0
  36. package/dist/bin/shared/utils/index.js +13 -1
  37. package/dist/bin/shared/utils/interactive-prompts.js +34 -18
  38. package/dist/bin/shared/utils/progress-manager.js +2 -2
  39. package/dist/bin/shared/utils/progress-spinner.js +53 -0
  40. package/dist/bin/shared/utils/sensitive-redactor.js +91 -0
  41. package/dist/bin/shared/validation/ValidationRegistry.js +1 -1
  42. package/dist/security/index.js +1 -1
  43. package/dist/security/patterns/insecure-patterns.js +1 -1
  44. package/dist/utils/constants.js +102 -0
  45. package/dist/utils/deployment/wrangler-config-manager.js +215 -48
  46. package/dist/utils/framework-config.js +2 -2
  47. package/dist/utils/interactive-prompts.js +10 -59
  48. package/package.json +16 -8
  49. package/dist/bin/clodo-service-old.js +0 -868
  50. package/dist/bin/clodo-service-test.js +0 -10
  51. package/dist/bin/commands/assess.js +0 -91
  52. package/dist/bin/commands/create.js +0 -77
  53. package/dist/bin/commands/diagnose.js +0 -83
  54. package/dist/bin/commands/helpers.js +0 -138
  55. package/dist/bin/commands/update.js +0 -75
  56. package/dist/bin/database/deployment-db-manager.js +0 -423
  57. package/dist/bin/database/enterprise-db-manager.js +0 -457
  58. package/dist/bin/database/wrangler-d1-manager.js +0 -685
  59. package/dist/bin/deployment/enterprise-deploy.js +0 -877
  60. package/dist/bin/deployment/master-deploy.js +0 -1376
  61. package/dist/bin/deployment/modular-enterprise-deploy.js +0 -466
  62. package/dist/bin/deployment/modules/DeploymentConfiguration.js +0 -395
  63. package/dist/bin/deployment/modules/DeploymentOrchestrator.js +0 -492
  64. package/dist/bin/deployment/modules/EnvironmentManager.js +0 -517
  65. package/dist/bin/deployment/modules/MonitoringIntegration.js +0 -560
  66. package/dist/bin/deployment/modules/ValidationManager.js +0 -342
  67. package/dist/bin/deployment/orchestration/BaseDeploymentOrchestrator.js +0 -426
  68. package/dist/bin/deployment/orchestration/EnterpriseOrchestrator.js +0 -401
  69. package/dist/bin/deployment/orchestration/PortfolioOrchestrator.js +0 -273
  70. package/dist/bin/deployment/orchestration/SingleServiceOrchestrator.js +0 -231
  71. package/dist/bin/deployment/orchestration/UnifiedDeploymentOrchestrator.js +0 -662
  72. package/dist/bin/deployment/test-interactive-utils.js +0 -66
  73. package/dist/bin/portfolio/portfolio-manager.js +0 -487
  74. package/dist/bin/service-management/create-service.js +0 -122
  75. package/dist/bin/service-management/init-service.js +0 -79
  76. package/dist/config/customers.js +0 -623
  77. package/dist/config/domains.js +0 -186
  78. package/dist/config/index.js +0 -6
  79. package/dist/database/database-orchestrator.js +0 -795
  80. package/dist/database/index.js +0 -4
  81. package/dist/deployment/index.js +0 -11
  82. package/dist/deployment/orchestration/BaseDeploymentOrchestrator.js +0 -426
  83. package/dist/deployment/orchestration/EnterpriseOrchestrator.js +0 -401
  84. package/dist/deployment/orchestration/PortfolioOrchestrator.js +0 -273
  85. package/dist/deployment/orchestration/SingleServiceOrchestrator.js +0 -231
  86. package/dist/deployment/orchestration/UnifiedDeploymentOrchestrator.js +0 -662
  87. package/dist/deployment/orchestration/index.js +0 -17
  88. package/dist/deployment/rollback-manager.js +0 -36
  89. package/dist/deployment/wrangler-deployer.js +0 -640
  90. package/dist/handlers/GenericRouteHandler.js +0 -532
  91. package/dist/migration/MigrationAdapters.js +0 -562
  92. package/dist/modules/ModuleManager.js +0 -668
  93. package/dist/modules/security.js +0 -96
  94. package/dist/orchestration/cross-domain-coordinator.js +0 -1083
  95. package/dist/orchestration/index.js +0 -5
  96. package/dist/orchestration/modules/DeploymentCoordinator.js +0 -368
  97. package/dist/orchestration/modules/DomainResolver.js +0 -198
  98. package/dist/orchestration/modules/StateManager.js +0 -332
  99. package/dist/orchestration/multi-domain-orchestrator.js +0 -724
  100. package/dist/routing/EnhancedRouter.js +0 -158
  101. package/dist/schema/SchemaManager.js +0 -778
  102. package/dist/service-management/ConfirmationEngine.js +0 -412
  103. package/dist/service-management/ErrorTracker.js +0 -299
  104. package/dist/service-management/GenerationEngine.js +0 -447
  105. package/dist/service-management/InputCollector.js +0 -619
  106. package/dist/service-management/ServiceCreator.js +0 -265
  107. package/dist/service-management/ServiceInitializer.js +0 -453
  108. package/dist/service-management/ServiceOrchestrator.js +0 -633
  109. package/dist/service-management/generators/BaseGenerator.js +0 -233
  110. package/dist/service-management/generators/GeneratorRegistry.js +0 -254
  111. package/dist/service-management/generators/cicd/CiWorkflowGenerator.js +0 -87
  112. package/dist/service-management/generators/cicd/DeployWorkflowGenerator.js +0 -106
  113. package/dist/service-management/generators/code/ServiceHandlersGenerator.js +0 -235
  114. package/dist/service-management/generators/code/ServiceMiddlewareGenerator.js +0 -116
  115. package/dist/service-management/generators/code/ServiceUtilsGenerator.js +0 -246
  116. package/dist/service-management/generators/code/WorkerIndexGenerator.js +0 -143
  117. package/dist/service-management/generators/config/DevelopmentEnvGenerator.js +0 -101
  118. package/dist/service-management/generators/config/DomainsConfigGenerator.js +0 -175
  119. package/dist/service-management/generators/config/EnvExampleGenerator.js +0 -178
  120. package/dist/service-management/generators/config/ProductionEnvGenerator.js +0 -97
  121. package/dist/service-management/generators/config/StagingEnvGenerator.js +0 -97
  122. package/dist/service-management/generators/config/WranglerTomlGenerator.js +0 -238
  123. package/dist/service-management/generators/core/PackageJsonGenerator.js +0 -243
  124. package/dist/service-management/generators/core/SiteConfigGenerator.js +0 -115
  125. package/dist/service-management/generators/documentation/ApiDocsGenerator.js +0 -331
  126. package/dist/service-management/generators/documentation/ConfigurationDocsGenerator.js +0 -294
  127. package/dist/service-management/generators/documentation/DeploymentDocsGenerator.js +0 -244
  128. package/dist/service-management/generators/documentation/ReadmeGenerator.js +0 -196
  129. package/dist/service-management/generators/schemas/ServiceSchemaGenerator.js +0 -190
  130. package/dist/service-management/generators/scripts/DeployScriptGenerator.js +0 -123
  131. package/dist/service-management/generators/scripts/HealthCheckScriptGenerator.js +0 -101
  132. package/dist/service-management/generators/scripts/SetupScriptGenerator.js +0 -88
  133. package/dist/service-management/generators/service-types/StaticSiteGenerator.js +0 -342
  134. package/dist/service-management/generators/testing/EslintConfigGenerator.js +0 -85
  135. package/dist/service-management/generators/testing/IntegrationTestsGenerator.js +0 -237
  136. package/dist/service-management/generators/testing/JestConfigGenerator.js +0 -72
  137. package/dist/service-management/generators/testing/UnitTestsGenerator.js +0 -277
  138. package/dist/service-management/generators/tooling/DockerComposeGenerator.js +0 -71
  139. package/dist/service-management/generators/tooling/GitignoreGenerator.js +0 -143
  140. package/dist/service-management/generators/utils/FileWriter.js +0 -179
  141. package/dist/service-management/generators/utils/PathResolver.js +0 -157
  142. package/dist/service-management/generators/utils/ServiceManifestGenerator.js +0 -111
  143. package/dist/service-management/generators/utils/TemplateEngine.js +0 -185
  144. package/dist/service-management/generators/utils/index.js +0 -18
  145. package/dist/service-management/handlers/ConfirmationHandler.js +0 -71
  146. package/dist/service-management/handlers/GenerationHandler.js +0 -80
  147. package/dist/service-management/handlers/InputHandler.js +0 -59
  148. package/dist/service-management/handlers/ValidationHandler.js +0 -203
  149. package/dist/service-management/index.js +0 -14
  150. package/dist/service-management/routing/DomainRouteMapper.js +0 -311
  151. package/dist/service-management/routing/RouteGenerator.js +0 -266
  152. package/dist/service-management/routing/WranglerRoutesBuilder.js +0 -273
  153. package/dist/service-management/routing/index.js +0 -14
  154. package/dist/service-management/services/DirectoryStructureService.js +0 -56
  155. package/dist/service-management/services/GenerationCoordinator.js +0 -208
  156. package/dist/service-management/services/GeneratorRegistry.js +0 -174
  157. package/dist/services/GenericDataService.js +0 -501
  158. package/dist/ui-structures/concepts/second-order-acquisition-strategy.md +0 -286
  159. package/dist/ui-structures/concepts/service-lifecycle-management.md +0 -150
  160. package/dist/ui-structures/concepts/service-manifest-guide.md +0 -309
  161. package/dist/ui-structures/concepts/three-tier-categorization-strategy.md +0 -231
  162. package/dist/ui-structures/creation/automated-generation-ui.json +0 -246
  163. package/dist/ui-structures/creation/core-inputs-ui.json +0 -217
  164. package/dist/ui-structures/creation/smart-confirmable-ui.json +0 -451
  165. package/dist/ui-structures/reference/absolutely-required-inputs.json +0 -315
  166. package/dist/ui-structures/reference/service-manifest-template.json +0 -342
  167. package/dist/version/VersionDetector.js +0 -723
  168. package/dist/worker/index.js +0 -4
  169. package/dist/worker/integration.js +0 -351
@@ -1,423 +0,0 @@
1
- /**
2
- * Deployment Database Manager Module
3
- * Handles D1 database operations specifically during service deployment context.
4
- *
5
- * This module is focused on single-service deployment operations and works in coordination
6
- * with the enterprise-db-manager.js for broader portfolio management tasks.
7
- *
8
- * Scope:
9
- * - D1 database validation during deployment
10
- * - Database configuration for specific service deployments
11
- * - Deployment-time migrations and health checks
12
- * - Integration with deployment orchestration
13
- *
14
- * For broader database management (monitoring, backups, multi-domain operations),
15
- * use the enterprise-db-manager.js CLI tool.
16
- */
17
-
18
- import { promisify } from 'util';
19
- import { exec } from 'child_process';
20
- import { askYesNo, askChoice, askUser } from '../shared/utils/interactive-prompts.js';
21
- import { databaseExists, createDatabase, getDatabaseId, runMigrations, executeSql, listDatabases, deleteDatabase } from '../shared/cloudflare/ops.js';
22
- const execAsync = promisify(exec);
23
-
24
- /**
25
- * Manages all D1 database operations including creation, validation,
26
- * migration management, and health checks
27
- */
28
- export class DeploymentDatabaseManager {
29
- constructor(options = {}) {
30
- this.options = options;
31
- this.state = {
32
- databasesChecked: [],
33
- migrationsRun: false,
34
- validationComplete: false
35
- };
36
- }
37
-
38
- /**
39
- * Handle comprehensive database setup and configuration
40
- */
41
- async handleDatabase(config) {
42
- console.log('\nšŸ—„ļø Database Configuration');
43
- console.log('=========================');
44
-
45
- // Generate database name if not provided
46
- if (!config.database.name) {
47
- config.database.name = `${config.domain}-auth-db`;
48
- }
49
- console.log(`\nšŸ“‹ Database name: ${config.database.name}`);
50
- const useGeneratedName = await askYesNo('Use this database name?', true);
51
- if (!useGeneratedName) {
52
- config.database.name = await askUser('Enter custom database name', config.database.name);
53
- }
54
-
55
- // Check for existing database
56
- console.log('\nšŸ” Checking for existing database...');
57
- try {
58
- const dbExists = await databaseExists(config.database.name);
59
- if (dbExists) {
60
- return await this.handleExistingDatabase(config);
61
- } else {
62
- return await this.handleNewDatabase(config);
63
- }
64
- } catch (error) {
65
- throw new Error(`Database check failed: ${error.message}`);
66
- }
67
- }
68
-
69
- /**
70
- * Handle existing database scenario
71
- */
72
- async handleExistingDatabase(config) {
73
- console.log(` šŸ“‹ Database '${config.database.name}' already exists`);
74
- const databaseChoice = await askChoice('What would you like to do with the existing database?', ['Use the existing database (recommended)', 'Create a new database with different name', 'Delete existing and create new (DANGER: DATA LOSS)'], 0);
75
- switch (databaseChoice) {
76
- case 0:
77
- {
78
- // Use existing database
79
- return await this.useExistingDatabase(config);
80
- }
81
- case 1:
82
- {
83
- // Create new database with different name
84
- return await this.createNewDatabaseWithDifferentName(config);
85
- }
86
- case 2:
87
- {
88
- // Delete existing and create new
89
- return await this.deleteAndRecreateDatabase(config);
90
- }
91
- }
92
- }
93
-
94
- /**
95
- * Use existing database
96
- */
97
- async useExistingDatabase(config) {
98
- try {
99
- // Extract database ID from the list command output
100
- const dbListResult = await execAsync('npx wrangler d1 list');
101
- const lines = dbListResult.stdout.split('\n');
102
- for (const line of lines) {
103
- if (line.includes(config.database.name)) {
104
- const match = line.match(/([a-f0-9-]{36})/);
105
- if (match) {
106
- config.database.id = match[1];
107
- console.log(` āœ… Using existing database ID: ${config.database.id}`);
108
- break;
109
- }
110
- }
111
- }
112
- if (!config.database.id) {
113
- throw new Error('Could not extract database ID from existing database');
114
- }
115
-
116
- // Check if migrations should be run
117
- if (config.database.enableMigrations) {
118
- const runMigs = await askYesNo('Run pending migrations on existing database?', true);
119
- if (runMigs) {
120
- await this.runDatabaseMigrations(config);
121
- }
122
- }
123
- return config.database;
124
- } catch (error) {
125
- throw new Error(`Failed to use existing database: ${error.message}`);
126
- }
127
- }
128
-
129
- /**
130
- * Create new database with different name
131
- */
132
- async createNewDatabaseWithDifferentName(config) {
133
- const newName = await askUser('Enter new database name');
134
- config.database.name = newName;
135
- config.database.createNew = true;
136
- return await this.handleNewDatabase(config);
137
- }
138
-
139
- /**
140
- * Delete existing database and create new one
141
- */
142
- async deleteAndRecreateDatabase(config) {
143
- const confirmDelete = await askYesNo('āš ļø Are you ABSOLUTELY SURE? This will permanently delete ALL data!', false);
144
- if (!confirmDelete) {
145
- console.log(' āœ… Database deletion cancelled');
146
- return await this.handleExistingDatabase(config);
147
- }
148
-
149
- // Additional confirmation
150
- const doubleConfirm = await askUser(`Type "${config.database.name}" to confirm deletion`);
151
- if (doubleConfirm !== config.database.name) {
152
- console.log(' āŒ Database name mismatch. Deletion cancelled for safety.');
153
- return await this.handleExistingDatabase(config);
154
- }
155
- try {
156
- console.log(' šŸ—‘ļø Deleting existing database...');
157
- await deleteDatabase(config.database.name);
158
- console.log(' āœ… Database deleted');
159
-
160
- // Now create new database
161
- return await this.handleNewDatabase(config);
162
- } catch (error) {
163
- throw new Error(`Database deletion failed: ${error.message}`);
164
- }
165
- }
166
-
167
- /**
168
- * Handle new database creation
169
- */
170
- async handleNewDatabase(config) {
171
- console.log(` āœ… Database name '${config.database.name}' is available`);
172
- const shouldCreate = await askYesNo(`Create new D1 database '${config.database.name}'?`, true);
173
- if (!shouldCreate) {
174
- throw new Error('Database creation cancelled by user');
175
- }
176
- try {
177
- console.log(' šŸ”Ø Creating database...');
178
- const createResult = await createDatabase(config.database.name);
179
- if (createResult && createResult.success) {
180
- config.database.id = createResult.id || (await getDatabaseId(config.database.name));
181
- console.log(` āœ… Database created successfully: ${config.database.id}`);
182
-
183
- // Run initial migrations if enabled
184
- if (config.database.enableMigrations) {
185
- const runInitialMigrations = await askYesNo('Run initial database migrations?', true);
186
- if (runInitialMigrations) {
187
- await this.runDatabaseMigrations(config);
188
- }
189
- }
190
- return config.database;
191
- } else {
192
- throw new Error('Database creation returned unsuccessful result');
193
- }
194
- } catch (error) {
195
- console.log(` āŒ Database creation failed: ${error.message}`);
196
- throw new Error(`Database creation failed: ${error.message}`);
197
- }
198
- }
199
-
200
- /**
201
- * Run database migrations
202
- */
203
- async runDatabaseMigrations(config) {
204
- console.log('\nšŸ”„ Running database migrations...');
205
- try {
206
- await runMigrations(config.database.name);
207
- console.log(' āœ… Database migrations completed');
208
- this.state.migrationsRun = true;
209
- } catch (error) {
210
- console.log(` āš ļø Migration warning: ${error.message}`);
211
- const continueAnyway = await askYesNo('Continue deployment despite migration issues?', false);
212
- if (!continueAnyway) {
213
- throw new Error(`Migration failed: ${error.message}`);
214
- }
215
- console.log(' āš ļø Continuing with migration warnings');
216
- }
217
- }
218
-
219
- /**
220
- * Validate database configuration and connectivity
221
- */
222
- async validateDatabaseConfiguration(config) {
223
- console.log('\nšŸ” Validating database configuration...');
224
- const validationResults = {
225
- exists: false,
226
- accessible: false,
227
- migrationsApplied: false,
228
- issues: []
229
- };
230
- try {
231
- // Check if database exists
232
- const exists = await databaseExists(config.database.name);
233
- validationResults.exists = exists;
234
- if (!exists) {
235
- validationResults.issues.push(`Database '${config.database.name}' does not exist`);
236
- return validationResults;
237
- }
238
- console.log(` āœ… Database '${config.database.name}' exists`);
239
-
240
- // Test basic connectivity
241
- try {
242
- await executeSql(config.database.name, 'SELECT 1 as test');
243
- validationResults.accessible = true;
244
- console.log(' āœ… Database is accessible');
245
- } catch (error) {
246
- validationResults.issues.push(`Database connectivity test failed: ${error.message}`);
247
- }
248
-
249
- // Check migrations status if enabled
250
- if (config.database.enableMigrations) {
251
- try {
252
- const migrationsResult = await execAsync(`npx wrangler d1 migrations list ${config.database.name}`);
253
- if (migrationsResult.stdout.includes('Applied')) {
254
- validationResults.migrationsApplied = true;
255
- console.log(' āœ… Migrations are applied');
256
- } else {
257
- validationResults.issues.push('No migrations have been applied');
258
- }
259
- } catch (error) {
260
- validationResults.issues.push(`Migration status check failed: ${error.message}`);
261
- }
262
- }
263
- } catch (error) {
264
- validationResults.issues.push(`Database validation failed: ${error.message}`);
265
- }
266
- this.state.validationComplete = true;
267
- this.state.databasesChecked.push({
268
- name: config.database.name,
269
- results: validationResults,
270
- timestamp: new Date().toISOString()
271
- });
272
- return validationResults;
273
- }
274
-
275
- /**
276
- * Perform database health check
277
- */
278
- async performHealthCheck(config) {
279
- console.log('\nšŸ„ Database Health Check');
280
- console.log('========================');
281
- const healthResults = {
282
- overall: 'unknown',
283
- connectivity: false,
284
- responseTime: 0,
285
- tableCount: 0,
286
- issues: []
287
- };
288
- const startTime = Date.now();
289
- try {
290
- // Test basic query
291
- await executeSql(config.database.name, 'SELECT 1 as health_check');
292
- healthResults.connectivity = true;
293
- healthResults.responseTime = Date.now() - startTime;
294
- console.log(` āœ… Database responding (${healthResults.responseTime}ms)`);
295
-
296
- // Count tables
297
- try {
298
- const tablesResult = await executeSql(config.database.name, "SELECT COUNT(*) as table_count FROM sqlite_master WHERE type='table'");
299
-
300
- // Parse table count from result
301
- if (tablesResult && tablesResult.results && tablesResult.results.length > 0) {
302
- healthResults.tableCount = tablesResult.results[0].table_count || 0;
303
- console.log(` šŸ“Š Database contains ${healthResults.tableCount} tables`);
304
- }
305
- } catch (error) {
306
- healthResults.issues.push(`Table count check failed: ${error.message}`);
307
- }
308
-
309
- // Overall health determination
310
- if (healthResults.connectivity && healthResults.responseTime < 5000) {
311
- healthResults.overall = 'healthy';
312
- } else if (healthResults.connectivity) {
313
- healthResults.overall = 'slow';
314
- } else {
315
- healthResults.overall = 'unhealthy';
316
- }
317
- } catch (error) {
318
- healthResults.overall = 'unhealthy';
319
- healthResults.responseTime = Date.now() - startTime;
320
- healthResults.issues.push(`Health check failed: ${error.message}`);
321
- console.log(` āŒ Database health check failed: ${error.message}`);
322
- }
323
- return healthResults;
324
- }
325
-
326
- /**
327
- * Get database management summary
328
- */
329
- getDatabaseSummary() {
330
- return {
331
- databasesManaged: this.state.databasesChecked.length,
332
- migrationsRun: this.state.migrationsRun,
333
- validationComplete: this.state.validationComplete,
334
- lastCheck: this.state.databasesChecked.length > 0 ? this.state.databasesChecked[this.state.databasesChecked.length - 1].timestamp : null
335
- };
336
- }
337
-
338
- /**
339
- * List all available databases
340
- */
341
- async listAvailableDatabases() {
342
- try {
343
- console.log('\nšŸ“‹ Available D1 Databases:');
344
- const databases = await listDatabases();
345
- if (databases && databases.length > 0) {
346
- databases.forEach((db, index) => {
347
- console.log(` ${index + 1}. ${db.name} (${db.id})`);
348
- });
349
- return databases;
350
- } else {
351
- console.log(' ā„¹ļø No D1 databases found in your account');
352
- return [];
353
- }
354
- } catch (error) {
355
- console.log(` āŒ Failed to list databases: ${error.message}`);
356
- return [];
357
- }
358
- }
359
-
360
- /**
361
- * Interactive database selection from existing databases
362
- */
363
- async selectFromExistingDatabases(config) {
364
- const databases = await this.listAvailableDatabases();
365
- if (databases.length === 0) {
366
- const createNew = await askYesNo('No existing databases found. Create a new one?', true);
367
- if (createNew) {
368
- return await this.handleNewDatabase(config);
369
- } else {
370
- throw new Error('Database selection cancelled');
371
- }
372
- }
373
- const dbOptions = databases.map(db => `${db.name} (${db.id})`);
374
- dbOptions.push('Create new database');
375
- const choice = await askChoice('Select a database to use:', dbOptions);
376
- if (choice === dbOptions.length - 1) {
377
- // Create new database option selected
378
- return await this.handleNewDatabase(config);
379
- }
380
-
381
- // Existing database selected
382
- const selectedDb = databases[choice];
383
- config.database.name = selectedDb.name;
384
- config.database.id = selectedDb.id;
385
- console.log(` āœ… Selected database: ${selectedDb.name} (${selectedDb.id})`);
386
-
387
- // Check if migrations should be run
388
- if (config.database.enableMigrations) {
389
- const runMigrations = await askYesNo('Run migrations on selected database?', false);
390
- if (runMigrations) {
391
- await this.runDatabaseMigrations(config);
392
- }
393
- }
394
- return config.database;
395
- }
396
-
397
- /**
398
- * Cleanup and rollback database operations
399
- */
400
- async rollbackDatabaseChanges(rollbackActions) {
401
- console.log('\nšŸ”„ Rolling back database changes...');
402
- const databaseRollbacks = rollbackActions.filter(action => action.type.includes('database') || action.type.includes('migration'));
403
- for (const action of databaseRollbacks) {
404
- try {
405
- console.log(` šŸ”„ ${action.description}`);
406
- switch (action.type) {
407
- case 'delete-database':
408
- await deleteDatabase(action.name);
409
- console.log(` āœ… Database '${action.name}' deleted`);
410
- break;
411
- case 'rollback-migration':
412
- // Note: D1 doesn't support migration rollback, so we log this
413
- console.log(` āš ļø Migration rollback not supported by D1: ${action.migration}`);
414
- break;
415
- default:
416
- console.log(` āš ļø Unknown rollback action: ${action.type}`);
417
- }
418
- } catch (error) {
419
- console.log(` āŒ Rollback failed: ${error.message}`);
420
- }
421
- }
422
- }
423
- }