@tamyla/clodo-framework 3.1.22 → 3.1.24

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 (210) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +230 -1
  3. package/dist/cli/commands/assess.js +192 -0
  4. package/dist/cli/commands/create.js +77 -0
  5. package/dist/{bin → cli}/commands/deploy.js +36 -14
  6. package/dist/cli/commands/diagnose.js +83 -0
  7. package/dist/{bin → cli}/commands/helpers/deployment-verification.js +2 -3
  8. package/dist/{bin → cli}/commands/helpers/error-recovery.js +1 -1
  9. package/dist/{bin → cli}/commands/helpers/resource-detection.js +1 -1
  10. package/dist/cli/commands/helpers.js +110 -0
  11. package/dist/cli/commands/init-config.js +57 -0
  12. package/dist/cli/commands/update.js +102 -0
  13. package/dist/cli/commands/validate.js +65 -0
  14. package/dist/cli/security-cli.js +118 -0
  15. package/dist/config/FeatureManager.js +6 -0
  16. package/dist/config/clodo-create.example.json +26 -0
  17. package/dist/config/clodo-deploy.example.json +41 -0
  18. package/dist/config/clodo-update.example.json +46 -0
  19. package/dist/config/clodo-validate.example.json +41 -0
  20. package/dist/config/customers/template/development.env.template +37 -0
  21. package/dist/config/customers/template/production.env.template +39 -0
  22. package/dist/config/customers/template/staging.env.template +37 -0
  23. package/dist/config/customers.js +625 -0
  24. package/dist/config/domain-examples/README.md +464 -0
  25. package/dist/config/domain-examples/environment-mapped.json +168 -0
  26. package/dist/config/domain-examples/multi-domain.json +144 -0
  27. package/dist/config/domain-examples/single-domain.json +50 -0
  28. package/dist/config/domains.js +186 -0
  29. package/dist/config/examples +12 -0
  30. package/dist/config/features.js +61 -0
  31. package/dist/config/index.js +6 -0
  32. package/dist/config/staging-deployment.json +60 -0
  33. package/dist/config/validation-config.json +347 -0
  34. package/dist/database/database-orchestrator.js +795 -0
  35. package/dist/database/index.js +4 -0
  36. package/dist/deployment/index.js +11 -0
  37. package/dist/deployment/orchestration/BaseDeploymentOrchestrator.js +426 -0
  38. package/dist/deployment/orchestration/PortfolioOrchestrator.js +273 -0
  39. package/dist/deployment/orchestration/SingleServiceOrchestrator.js +231 -0
  40. package/dist/deployment/orchestration/UnifiedDeploymentOrchestrator.js +662 -0
  41. package/dist/deployment/orchestration/index.js +17 -0
  42. package/dist/deployment/rollback-manager.js +36 -0
  43. package/dist/deployment/wrangler-deployer.js +640 -0
  44. package/dist/handlers/GenericRouteHandler.js +532 -0
  45. package/dist/lib/database/deployment-db-manager.js +423 -0
  46. package/dist/lib/database/wrangler-d1-manager.js +685 -0
  47. package/dist/lib/deployment/modules/DeploymentConfiguration.js +395 -0
  48. package/dist/lib/deployment/modules/DeploymentOrchestrator.js +492 -0
  49. package/dist/lib/deployment/modules/EnvironmentManager.js +517 -0
  50. package/dist/lib/deployment/modules/MonitoringIntegration.js +560 -0
  51. package/dist/lib/deployment/modules/ValidationManager.js +342 -0
  52. package/dist/lib/deployment/orchestration/BaseDeploymentOrchestrator.js +426 -0
  53. package/dist/lib/deployment/orchestration/EnterpriseOrchestrator.js +21 -0
  54. package/dist/lib/deployment/orchestration/PortfolioOrchestrator.js +273 -0
  55. package/dist/lib/deployment/orchestration/SingleServiceOrchestrator.js +231 -0
  56. package/dist/lib/deployment/orchestration/UnifiedDeploymentOrchestrator.js +662 -0
  57. package/dist/{bin → lib}/shared/cloudflare/domain-discovery.js +1 -1
  58. package/dist/{bin → lib}/shared/cloudflare/domain-manager.js +1 -1
  59. package/dist/{bin → lib}/shared/cloudflare/ops.js +4 -4
  60. package/dist/{bin → lib}/shared/config/command-config-manager.js +1 -1
  61. package/dist/{bin → lib}/shared/config/index.js +1 -1
  62. package/dist/{bin → lib}/shared/config/manifest-loader.js +3 -3
  63. package/dist/{bin → lib}/shared/deployment/credential-collector.js +1 -1
  64. package/dist/lib/shared/deployment/index.js +10 -0
  65. package/dist/{bin → lib}/shared/deployment/rollback-manager.js +1 -1
  66. package/dist/{bin → lib}/shared/deployment/utilities/d1-error-recovery.js +1 -1
  67. package/dist/{bin → lib}/shared/deployment/validator.js +1 -1
  68. package/dist/{bin → lib}/shared/deployment/workflows/interactive-database-workflow.js +1 -1
  69. package/dist/{bin → lib}/shared/monitoring/health-checker.js +2 -2
  70. package/dist/{bin → lib}/shared/routing/domain-router.js +1 -1
  71. package/dist/{bin → lib}/shared/utils/config-loader.js +47 -11
  72. package/dist/lib/shared/utils/service-config-manager.js +227 -0
  73. package/dist/{bin → lib}/shared/validation/ValidationRegistry.js +1 -1
  74. package/dist/migration/MigrationAdapters.js +608 -0
  75. package/dist/modules/ModuleManager.js +668 -0
  76. package/dist/modules/security.js +96 -0
  77. package/dist/orchestration/cross-domain-coordinator.js +1083 -0
  78. package/dist/orchestration/index.js +5 -0
  79. package/dist/orchestration/modules/DeploymentCoordinator.js +368 -0
  80. package/dist/orchestration/modules/DomainResolver.js +198 -0
  81. package/dist/orchestration/modules/StateManager.js +332 -0
  82. package/dist/orchestration/multi-domain-orchestrator.js +765 -0
  83. package/dist/routing/EnhancedRouter.js +158 -0
  84. package/dist/schema/SchemaManager.js +778 -0
  85. package/dist/security/index.js +2 -2
  86. package/dist/service-management/ConfirmationEngine.js +412 -0
  87. package/dist/service-management/ErrorTracker.js +299 -0
  88. package/dist/service-management/GenerationEngine.js +447 -0
  89. package/dist/service-management/InputCollector.js +619 -0
  90. package/dist/service-management/ServiceCreator.js +21 -0
  91. package/dist/service-management/ServiceOrchestrator.js +672 -0
  92. package/dist/service-management/generators/BaseGenerator.js +233 -0
  93. package/dist/service-management/generators/GeneratorRegistry.js +254 -0
  94. package/dist/service-management/generators/cicd/CiWorkflowGenerator.js +87 -0
  95. package/dist/service-management/generators/cicd/DeployWorkflowGenerator.js +106 -0
  96. package/dist/service-management/generators/code/ServiceHandlersGenerator.js +235 -0
  97. package/dist/service-management/generators/code/ServiceMiddlewareGenerator.js +116 -0
  98. package/dist/service-management/generators/code/ServiceUtilsGenerator.js +246 -0
  99. package/dist/service-management/generators/code/WorkerIndexGenerator.js +143 -0
  100. package/dist/service-management/generators/config/DevelopmentEnvGenerator.js +101 -0
  101. package/dist/service-management/generators/config/DomainsConfigGenerator.js +175 -0
  102. package/dist/service-management/generators/config/EnvExampleGenerator.js +178 -0
  103. package/dist/service-management/generators/config/ProductionEnvGenerator.js +97 -0
  104. package/dist/service-management/generators/config/StagingEnvGenerator.js +97 -0
  105. package/dist/service-management/generators/config/WranglerTomlGenerator.js +238 -0
  106. package/dist/service-management/generators/core/PackageJsonGenerator.js +243 -0
  107. package/dist/service-management/generators/core/SiteConfigGenerator.js +115 -0
  108. package/dist/service-management/generators/documentation/ApiDocsGenerator.js +331 -0
  109. package/dist/service-management/generators/documentation/ConfigurationDocsGenerator.js +294 -0
  110. package/dist/service-management/generators/documentation/DeploymentDocsGenerator.js +244 -0
  111. package/dist/service-management/generators/documentation/ReadmeGenerator.js +196 -0
  112. package/dist/service-management/generators/schemas/ServiceSchemaGenerator.js +190 -0
  113. package/dist/service-management/generators/scripts/DeployScriptGenerator.js +123 -0
  114. package/dist/service-management/generators/scripts/HealthCheckScriptGenerator.js +101 -0
  115. package/dist/service-management/generators/scripts/SetupScriptGenerator.js +88 -0
  116. package/dist/service-management/generators/service-types/StaticSiteGenerator.js +342 -0
  117. package/dist/service-management/generators/testing/EslintConfigGenerator.js +85 -0
  118. package/dist/service-management/generators/testing/IntegrationTestsGenerator.js +237 -0
  119. package/dist/service-management/generators/testing/JestConfigGenerator.js +72 -0
  120. package/dist/service-management/generators/testing/UnitTestsGenerator.js +277 -0
  121. package/dist/service-management/generators/tooling/DockerComposeGenerator.js +71 -0
  122. package/dist/service-management/generators/tooling/GitignoreGenerator.js +143 -0
  123. package/dist/service-management/generators/utils/FileWriter.js +179 -0
  124. package/dist/service-management/generators/utils/PathResolver.js +157 -0
  125. package/dist/service-management/generators/utils/ServiceManifestGenerator.js +111 -0
  126. package/dist/service-management/generators/utils/TemplateEngine.js +185 -0
  127. package/dist/service-management/generators/utils/index.js +18 -0
  128. package/dist/service-management/handlers/ConfirmationHandler.js +71 -0
  129. package/dist/service-management/handlers/GenerationHandler.js +80 -0
  130. package/dist/service-management/handlers/InputHandler.js +59 -0
  131. package/dist/service-management/handlers/ValidationHandler.js +216 -0
  132. package/dist/service-management/index.js +14 -0
  133. package/dist/service-management/routing/DomainRouteMapper.js +311 -0
  134. package/dist/service-management/routing/RouteGenerator.js +266 -0
  135. package/dist/service-management/routing/WranglerRoutesBuilder.js +273 -0
  136. package/dist/service-management/routing/index.js +14 -0
  137. package/dist/service-management/services/DirectoryStructureService.js +56 -0
  138. package/dist/service-management/services/GenerationCoordinator.js +208 -0
  139. package/dist/service-management/services/GeneratorRegistry.js +174 -0
  140. package/dist/services/GenericDataService.js +501 -0
  141. package/dist/ui-structures/concepts/second-order-acquisition-strategy.md +286 -0
  142. package/dist/ui-structures/concepts/service-lifecycle-management.md +150 -0
  143. package/dist/ui-structures/concepts/service-manifest-guide.md +309 -0
  144. package/dist/ui-structures/concepts/three-tier-categorization-strategy.md +231 -0
  145. package/dist/ui-structures/creation/automated-generation-ui.json +246 -0
  146. package/dist/ui-structures/creation/core-inputs-ui.json +217 -0
  147. package/dist/ui-structures/creation/smart-confirmable-ui.json +451 -0
  148. package/dist/ui-structures/reference/absolutely-required-inputs.json +315 -0
  149. package/dist/ui-structures/reference/service-manifest-template.json +342 -0
  150. package/dist/utils/cloudflare/ops.js +1 -1
  151. package/dist/utils/file-manager.js +1 -1
  152. package/dist/utils/formatters.js +1 -1
  153. package/dist/utils/logger.js +1 -1
  154. package/dist/version/VersionDetector.js +813 -0
  155. package/dist/worker/index.js +4 -0
  156. package/dist/worker/integration.js +351 -0
  157. package/package.json +7 -15
  158. package/dist/bin/commands/validate.js +0 -51
  159. package/dist/bin/security/security-cli.js +0 -108
  160. package/dist/bin/shared/deployment/index.js +0 -10
  161. /package/dist/{bin → cli}/clodo-service.js +0 -0
  162. /package/dist/{bin → cli}/commands/helpers/deployment-ui.js +0 -0
  163. /package/dist/{bin → lib}/shared/cache/configuration-cache.js +0 -0
  164. /package/dist/{bin → lib}/shared/cloudflare/index.js +0 -0
  165. /package/dist/{bin → lib}/shared/config/ConfigurationManager.js +0 -0
  166. /package/dist/{bin → lib}/shared/config/cache.js +0 -0
  167. /package/dist/{bin → lib}/shared/config/cloudflare-service-validator.js +0 -0
  168. /package/dist/{bin → lib}/shared/config/manager.js +0 -0
  169. /package/dist/{bin → lib}/shared/database/connection-manager.js +0 -0
  170. /package/dist/{bin → lib}/shared/database/index.js +0 -0
  171. /package/dist/{bin → lib}/shared/database/orchestrator.js +0 -0
  172. /package/dist/{bin → lib}/shared/deployment/auditor.js +0 -0
  173. /package/dist/{bin → lib}/shared/deployment/workflows/deployment-summary.js +0 -0
  174. /package/dist/{bin → lib}/shared/deployment/workflows/interactive-confirmation.js +0 -0
  175. /package/dist/{bin → lib}/shared/deployment/workflows/interactive-domain-info-gatherer.js +0 -0
  176. /package/dist/{bin → lib}/shared/deployment/workflows/interactive-secret-workflow.js +0 -0
  177. /package/dist/{bin → lib}/shared/deployment/workflows/interactive-testing-workflow.js +0 -0
  178. /package/dist/{bin → lib}/shared/deployment/workflows/interactive-validation.js +0 -0
  179. /package/dist/{bin → lib}/shared/error-handling/error-classifier.js +0 -0
  180. /package/dist/{bin → lib}/shared/index.js +0 -0
  181. /package/dist/{bin → lib}/shared/logging/Logger.js +0 -0
  182. /package/dist/{bin → lib}/shared/monitoring/index.js +0 -0
  183. /package/dist/{bin → lib}/shared/monitoring/memory-manager.js +0 -0
  184. /package/dist/{bin → lib}/shared/monitoring/production-monitor.js +0 -0
  185. /package/dist/{bin → lib}/shared/production-tester/api-tester.js +0 -0
  186. /package/dist/{bin → lib}/shared/production-tester/auth-tester.js +0 -0
  187. /package/dist/{bin → lib}/shared/production-tester/core.js +0 -0
  188. /package/dist/{bin → lib}/shared/production-tester/database-tester.js +0 -0
  189. /package/dist/{bin → lib}/shared/production-tester/index.js +0 -0
  190. /package/dist/{bin → lib}/shared/production-tester/load-tester.js +0 -0
  191. /package/dist/{bin → lib}/shared/production-tester/performance-tester.js +0 -0
  192. /package/dist/{bin → lib}/shared/security/api-token-manager.js +0 -0
  193. /package/dist/{bin → lib}/shared/security/index.js +0 -0
  194. /package/dist/{bin → lib}/shared/security/secret-generator.js +0 -0
  195. /package/dist/{bin → lib}/shared/security/secure-token-manager.js +0 -0
  196. /package/dist/{bin → lib}/shared/utils/ErrorHandler.js +0 -0
  197. /package/dist/{bin → lib}/shared/utils/cli-options.js +0 -0
  198. /package/dist/{bin → lib}/shared/utils/deployment-validator.js +0 -0
  199. /package/dist/{bin → lib}/shared/utils/error-recovery.js +0 -0
  200. /package/dist/{bin → lib}/shared/utils/file-manager.js +0 -0
  201. /package/dist/{bin → lib}/shared/utils/formatters.js +0 -0
  202. /package/dist/{bin → lib}/shared/utils/graceful-shutdown-manager.js +0 -0
  203. /package/dist/{bin → lib}/shared/utils/index.js +0 -0
  204. /package/dist/{bin → lib}/shared/utils/interactive-prompts.js +0 -0
  205. /package/dist/{bin → lib}/shared/utils/interactive-utils.js +0 -0
  206. /package/dist/{bin → lib}/shared/utils/output-formatter.js +0 -0
  207. /package/dist/{bin → lib}/shared/utils/progress-manager.js +0 -0
  208. /package/dist/{bin → lib}/shared/utils/progress-spinner.js +0 -0
  209. /package/dist/{bin → lib}/shared/utils/rate-limiter.js +0 -0
  210. /package/dist/{bin → lib}/shared/utils/sensitive-redactor.js +0 -0
@@ -0,0 +1,395 @@
1
+ /**
2
+ * Deployment Configuration Module
3
+ * Centralized configuration management for enterprise deployments
4
+ */
5
+
6
+ import { readFileSync, writeFileSync } from 'fs';
7
+ import { join } from 'path';
8
+ import { askUser, askYesNo, askChoice } from '../../shared/utils/interactive-prompts.js';
9
+
10
+ /**
11
+ * Manages all deployment configuration including domain setup,
12
+ * worker configuration, database config, and secrets management
13
+ */
14
+ export class DeploymentConfiguration {
15
+ constructor(options = {}) {
16
+ this.options = options;
17
+ this.config = this.initializeDefaultConfig();
18
+ this.state = {
19
+ configurationId: this.generateConfigId(),
20
+ configDiscovered: false,
21
+ secretsGenerated: false,
22
+ validated: false
23
+ };
24
+ }
25
+
26
+ /**
27
+ * Generate unique configuration ID
28
+ */
29
+ generateConfigId() {
30
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
31
+ const random = Math.random().toString(36).substr(2, 9);
32
+ return `config-${timestamp}-${random}`;
33
+ }
34
+
35
+ /**
36
+ * Initialize default configuration structure
37
+ */
38
+ initializeDefaultConfig() {
39
+ return {
40
+ // Domain and service configuration
41
+ domain: null,
42
+ environment: 'production',
43
+ deploymentMode: 'single',
44
+ // Worker configuration
45
+ worker: {
46
+ name: null,
47
+ url: null,
48
+ routes: []
49
+ },
50
+ // Database configuration
51
+ database: {
52
+ name: null,
53
+ id: null,
54
+ createNew: true,
55
+ enableMigrations: true
56
+ },
57
+ // Secrets management
58
+ secrets: {
59
+ generateNew: true,
60
+ keys: {},
61
+ distributionMethod: 'individual'
62
+ },
63
+ // Enterprise features
64
+ enterprise: {
65
+ enableOrchestration: true,
66
+ enableCrossDomainCoordination: false,
67
+ enableAdvancedValidation: true,
68
+ enableProductionTesting: true,
69
+ enableConfigCaching: true,
70
+ enableAuditLogging: true
71
+ },
72
+ // Deployment options
73
+ deployment: {
74
+ runTests: true,
75
+ skipExisting: false,
76
+ enableRollback: true,
77
+ validationLevel: 'comprehensive',
78
+ auditLevel: 'detailed'
79
+ }
80
+ };
81
+ }
82
+
83
+ /**
84
+ * Gather single domain configuration information
85
+ */
86
+ async gatherSingleDomainInfo() {
87
+ console.log('\n🌐 Step 1: Domain Configuration');
88
+ console.log('===============================');
89
+ this.config.domain = await askUser('Enter the domain name (e.g., example.com)', this.config.domain);
90
+ const envChoice = await askChoice('Select deployment environment', ['production', 'staging', 'development'], 0);
91
+ this.config.environment = ['production', 'staging', 'development'][envChoice];
92
+
93
+ // Generate worker name and URL
94
+ const domainPrefix = this.config.domain.replace(/\./g, '-');
95
+ this.config.worker.name = `${domainPrefix}-${this.config.environment}`;
96
+ this.config.worker.url = this.config.environment === 'production' ? `https://${this.config.domain}` : `https://${this.config.environment}.${this.config.domain}`;
97
+ console.log(`\n📋 Configuration Summary:`);
98
+ console.log(` 🌐 Domain: ${this.config.domain}`);
99
+ console.log(` 🏷️ Environment: ${this.config.environment}`);
100
+ console.log(` 👷 Worker: ${this.config.worker.name}`);
101
+ console.log(` 🔗 URL: ${this.config.worker.url}`);
102
+ const confirmConfig = await askYesNo('Is this configuration correct?', true);
103
+ if (!confirmConfig) {
104
+ return await this.gatherSingleDomainInfo();
105
+ }
106
+ return this.config;
107
+ }
108
+
109
+ /**
110
+ * Configure database settings
111
+ */
112
+ async configureDatabaseSettings() {
113
+ console.log('\n🗄️ Database Configuration');
114
+ console.log('=========================');
115
+ this.config.database.name = `${this.config.domain}-auth-db`;
116
+ console.log(`\n📋 Generated database name: ${this.config.database.name}`);
117
+ const useGeneratedName = await askYesNo('Use this database name?', true);
118
+ if (!useGeneratedName) {
119
+ this.config.database.name = await askUser('Enter custom database name', this.config.database.name);
120
+ }
121
+ const enableMigrations = await askYesNo('Enable automatic database migrations?', true);
122
+ this.config.database.enableMigrations = enableMigrations;
123
+ return this.config.database;
124
+ }
125
+
126
+ /**
127
+ * Configure secrets management
128
+ */
129
+ async configureSecretsManagement() {
130
+ console.log('\n🔐 Secrets Management Configuration');
131
+ console.log('==================================');
132
+
133
+ // Check for existing secrets file
134
+ const secretsFile = join('secrets', `${this.config.domain}-secrets.json`);
135
+ let existingSecrets = {};
136
+ try {
137
+ const secretsData = JSON.parse(readFileSync(secretsFile, 'utf8'));
138
+ const {
139
+ domain,
140
+ environment,
141
+ generated,
142
+ note,
143
+ ...secrets
144
+ } = secretsData;
145
+ existingSecrets = secrets;
146
+ console.log(`\n📂 Found existing secrets file: ${secretsFile}`);
147
+ console.log(` 🔑 Contains ${Object.keys(secrets).length} secrets`);
148
+ console.log(` 📅 Generated: ${generated}`);
149
+ const reuseSecrets = await askYesNo('Do you want to reuse these existing secrets? (Recommended for consistency)', true);
150
+ if (reuseSecrets) {
151
+ this.config.secrets.keys = existingSecrets;
152
+ this.config.secrets.generateNew = false;
153
+ this.state.secretsGenerated = true;
154
+ console.log(' ✅ Will reuse existing secrets');
155
+ return this.config.secrets;
156
+ }
157
+ } catch (error) {
158
+ console.log(' ⚠️ No existing secrets found or file unreadable');
159
+ }
160
+
161
+ // Configure new secrets generation
162
+ const confirmGenerate = await askYesNo('Generate new cryptographic secrets? (Required for first deployment)', true);
163
+ if (!confirmGenerate) {
164
+ throw new Error('Secret generation is required for deployment');
165
+ }
166
+ this.config.secrets.generateNew = true;
167
+
168
+ // Select distribution method
169
+ const distributionChoice = await askChoice('Choose secret distribution method', ['Individual secrets (Recommended)', 'Batch deployment (Faster)', 'Manual distribution (Advanced)'], 0);
170
+ this.config.secrets.distributionMethod = ['individual', 'batch', 'manual'][distributionChoice];
171
+ return this.config.secrets;
172
+ }
173
+
174
+ /**
175
+ * Configure enterprise features
176
+ */
177
+ async configureEnterpriseFeatures() {
178
+ console.log('\n🏢 Enterprise Features Configuration');
179
+ console.log('===================================');
180
+ const features = [{
181
+ key: 'enableOrchestration',
182
+ name: 'Multi-Domain Orchestration',
183
+ description: 'Advanced deployment coordination across multiple domains',
184
+ default: true
185
+ }, {
186
+ key: 'enableAdvancedValidation',
187
+ name: 'Advanced Validation',
188
+ description: 'Comprehensive pre-deployment validation and testing',
189
+ default: true
190
+ }, {
191
+ key: 'enableProductionTesting',
192
+ name: 'Production Testing',
193
+ description: 'Automated post-deployment testing and validation',
194
+ default: true
195
+ }, {
196
+ key: 'enableConfigCaching',
197
+ name: 'Configuration Caching',
198
+ description: 'High-performance configuration caching and optimization',
199
+ default: true
200
+ }, {
201
+ key: 'enableAuditLogging',
202
+ name: 'Audit Logging',
203
+ description: 'Detailed audit trails and compliance reporting',
204
+ default: true
205
+ }];
206
+ for (const feature of features) {
207
+ console.log(`\n🔧 ${feature.name}`);
208
+ console.log(` ${feature.description}`);
209
+ const enable = await askYesNo(`Enable ${feature.name}?`, feature.default);
210
+ this.config.enterprise[feature.key] = enable;
211
+ }
212
+ return this.config.enterprise;
213
+ }
214
+
215
+ /**
216
+ * Update wrangler.toml configuration
217
+ */
218
+ async updateWranglerConfig() {
219
+ console.log('\n⚙️ Updating wrangler.toml configuration...');
220
+ try {
221
+ let config = readFileSync('wrangler.toml', 'utf8');
222
+
223
+ // Update worker name
224
+ config = config.replace(/^name = "[^"]*"/m, `name = "${this.config.worker.name}"`);
225
+
226
+ // Update production environment name
227
+ config = config.replace(/^\[env\.production\]\s*\nname = "[^"]*"/m, `[env.production]\nname = "${this.config.worker.name}"`);
228
+
229
+ // Update database configuration if database is configured
230
+ if (this.config.database.name && this.config.database.id) {
231
+ config = config.replace(/database_name = "[^"]*"/g, `database_name = "${this.config.database.name}"`);
232
+ config = config.replace(/database_id = "[^"]*"/g, `database_id = "${this.config.database.id}"`);
233
+ }
234
+
235
+ // Update SERVICE_DOMAIN
236
+ config = config.replace(/SERVICE_DOMAIN = "[^"]*"/g, `SERVICE_DOMAIN = "${this.config.domain}"`);
237
+
238
+ // Write updated configuration
239
+ writeFileSync('wrangler.toml', config);
240
+ console.log(' ✅ wrangler.toml updated successfully');
241
+ return {
242
+ success: true,
243
+ config
244
+ };
245
+ } catch (error) {
246
+ console.log(` ❌ Failed to update wrangler.toml: ${error.message}`);
247
+ throw new Error(`wrangler.toml update failed: ${error.message}`);
248
+ }
249
+ }
250
+
251
+ /**
252
+ * Try to discover existing configuration
253
+ */
254
+ async tryConfigurationDiscovery() {
255
+ console.log('\n🔍 Attempting configuration discovery...');
256
+ const discoveries = [];
257
+ try {
258
+ // Try to discover from wrangler.toml
259
+ const wranglerConfig = readFileSync('wrangler.toml', 'utf8');
260
+ const nameMatch = wranglerConfig.match(/^name = "([^"]+)"/m);
261
+ if (nameMatch) {
262
+ discoveries.push({
263
+ source: 'wrangler.toml',
264
+ key: 'worker.name',
265
+ value: nameMatch[1]
266
+ });
267
+ }
268
+ const domainMatch = wranglerConfig.match(/SERVICE_DOMAIN = "([^"]+)"/);
269
+ if (domainMatch) {
270
+ discoveries.push({
271
+ source: 'wrangler.toml',
272
+ key: 'domain',
273
+ value: domainMatch[1]
274
+ });
275
+ }
276
+ } catch (error) {
277
+ console.log(' ⚠️ No wrangler.toml found for discovery');
278
+ }
279
+ try {
280
+ // Try to discover from package.json
281
+ const packageJson = JSON.parse(readFileSync('package.json', 'utf8'));
282
+ if (packageJson.name) {
283
+ discoveries.push({
284
+ source: 'package.json',
285
+ key: 'project.name',
286
+ value: packageJson.name
287
+ });
288
+ }
289
+ } catch (error) {
290
+ console.log(' ⚠️ No package.json found for discovery');
291
+ }
292
+ if (discoveries.length > 0) {
293
+ console.log('\n📋 Discovered configuration:');
294
+ discoveries.forEach(discovery => {
295
+ console.log(` ${discovery.source}: ${discovery.key} = ${discovery.value}`);
296
+ });
297
+ const useDiscovered = await askYesNo('Use discovered configuration as starting point?', true);
298
+ if (useDiscovered) {
299
+ // Apply discoveries to config
300
+ discoveries.forEach(discovery => {
301
+ const keys = discovery.key.split('.');
302
+ let target = this.config;
303
+ for (let i = 0; i < keys.length - 1; i++) {
304
+ if (!target[keys[i]]) target[keys[i]] = {};
305
+ target = target[keys[i]];
306
+ }
307
+ target[keys[keys.length - 1]] = discovery.value;
308
+ });
309
+ this.state.configDiscovered = true;
310
+ console.log(' ✅ Configuration discovery applied');
311
+ }
312
+ } else {
313
+ console.log(' ℹ️ No configuration discovered, will use interactive setup');
314
+ }
315
+ return this.state.configDiscovered;
316
+ }
317
+
318
+ /**
319
+ * Validate configuration completeness
320
+ */
321
+ validateConfiguration() {
322
+ const issues = [];
323
+
324
+ // Check required fields
325
+ if (!this.config.domain) {
326
+ issues.push('Domain is required');
327
+ }
328
+ if (!this.config.worker.name) {
329
+ issues.push('Worker name is required');
330
+ }
331
+ if (!this.config.environment) {
332
+ issues.push('Environment is required');
333
+ }
334
+
335
+ // Validate domain format
336
+ if (this.config.domain && !/^[a-zA-Z0-9][a-zA-Z0-9-]*\.[a-zA-Z]{2,}$/.test(this.config.domain)) {
337
+ issues.push('Invalid domain format');
338
+ }
339
+
340
+ // Check database configuration if enabled
341
+ if (this.config.database.enableMigrations && !this.config.database.name) {
342
+ issues.push('Database name is required when migrations are enabled');
343
+ }
344
+ this.state.validated = issues.length === 0;
345
+ return {
346
+ valid: this.state.validated,
347
+ issues
348
+ };
349
+ }
350
+
351
+ /**
352
+ * Get configuration summary for display
353
+ */
354
+ getConfigurationSummary() {
355
+ return {
356
+ domain: this.config.domain,
357
+ environment: this.config.environment,
358
+ worker: this.config.worker.name,
359
+ database: this.config.database.name,
360
+ secretsConfigured: this.state.secretsGenerated,
361
+ enterpriseFeatures: Object.entries(this.config.enterprise).filter(([key, value]) => value).map(([key]) => key),
362
+ validated: this.state.validated
363
+ };
364
+ }
365
+
366
+ /**
367
+ * Export configuration for other modules
368
+ */
369
+ exportConfiguration() {
370
+ return {
371
+ ...this.config,
372
+ state: {
373
+ ...this.state
374
+ }
375
+ };
376
+ }
377
+
378
+ /**
379
+ * Import configuration from external source
380
+ */
381
+ importConfiguration(externalConfig) {
382
+ if (externalConfig.state) {
383
+ this.state = {
384
+ ...this.state,
385
+ ...externalConfig.state
386
+ };
387
+ delete externalConfig.state;
388
+ }
389
+ this.config = {
390
+ ...this.config,
391
+ ...externalConfig
392
+ };
393
+ return this.config;
394
+ }
395
+ }