@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.
- package/CHANGELOG.md +9 -0
- package/README.md +53 -0
- package/dist/bin/clodo-service.js +47 -15
- package/dist/bin/commands/deploy.js +115 -83
- package/dist/bin/commands/helpers/deployment-ui.js +138 -0
- package/dist/bin/commands/helpers/deployment-verification.js +251 -0
- package/dist/bin/commands/helpers/error-recovery.js +80 -0
- package/dist/bin/commands/helpers/resource-detection.js +113 -0
- package/dist/bin/commands/validate.js +1 -1
- package/dist/bin/security/security-cli.js +1 -1
- package/dist/bin/shared/cache/configuration-cache.js +82 -0
- package/dist/bin/shared/cloudflare/domain-manager.js +1 -1
- package/dist/bin/shared/cloudflare/index.js +1 -1
- package/dist/bin/shared/cloudflare/ops.js +6 -4
- package/dist/bin/shared/config/ConfigurationManager.js +23 -1
- package/dist/bin/shared/config/command-config-manager.js +19 -3
- package/dist/bin/shared/config/index.js +1 -1
- package/dist/bin/shared/deployment/credential-collector.js +30 -7
- package/dist/bin/shared/deployment/index.js +2 -2
- package/dist/bin/shared/deployment/rollback-manager.js +4 -520
- package/dist/bin/shared/deployment/utilities/d1-error-recovery.js +177 -0
- package/dist/bin/shared/deployment/validator.js +40 -10
- package/dist/bin/shared/deployment/workflows/deployment-summary.js +214 -0
- package/dist/bin/shared/deployment/workflows/interactive-confirmation.js +188 -0
- package/dist/bin/shared/deployment/workflows/interactive-database-workflow.js +234 -0
- package/dist/bin/shared/deployment/workflows/interactive-domain-info-gatherer.js +240 -0
- package/dist/bin/shared/deployment/workflows/interactive-secret-workflow.js +228 -0
- package/dist/bin/shared/deployment/workflows/interactive-testing-workflow.js +235 -0
- package/dist/bin/shared/deployment/workflows/interactive-validation.js +218 -0
- package/dist/bin/shared/error-handling/error-classifier.js +46 -0
- package/dist/bin/shared/monitoring/health-checker.js +129 -1
- package/dist/bin/shared/monitoring/memory-manager.js +17 -6
- package/dist/bin/shared/routing/domain-router.js +1 -1
- package/dist/bin/shared/utils/deployment-validator.js +97 -0
- package/dist/bin/shared/utils/formatters.js +10 -0
- package/dist/bin/shared/utils/index.js +13 -1
- package/dist/bin/shared/utils/interactive-prompts.js +34 -18
- package/dist/bin/shared/utils/progress-manager.js +2 -2
- package/dist/bin/shared/utils/progress-spinner.js +53 -0
- package/dist/bin/shared/utils/sensitive-redactor.js +91 -0
- package/dist/bin/shared/validation/ValidationRegistry.js +1 -1
- package/dist/security/index.js +1 -1
- package/dist/security/patterns/insecure-patterns.js +1 -1
- package/dist/utils/constants.js +102 -0
- package/dist/utils/deployment/wrangler-config-manager.js +215 -48
- package/dist/utils/framework-config.js +2 -2
- package/dist/utils/interactive-prompts.js +10 -59
- package/package.json +16 -8
- package/dist/bin/clodo-service-old.js +0 -868
- package/dist/bin/clodo-service-test.js +0 -10
- package/dist/bin/commands/assess.js +0 -91
- package/dist/bin/commands/create.js +0 -77
- package/dist/bin/commands/diagnose.js +0 -83
- package/dist/bin/commands/helpers.js +0 -138
- package/dist/bin/commands/update.js +0 -75
- package/dist/bin/database/deployment-db-manager.js +0 -423
- package/dist/bin/database/enterprise-db-manager.js +0 -457
- package/dist/bin/database/wrangler-d1-manager.js +0 -685
- package/dist/bin/deployment/enterprise-deploy.js +0 -877
- package/dist/bin/deployment/master-deploy.js +0 -1376
- package/dist/bin/deployment/modular-enterprise-deploy.js +0 -466
- package/dist/bin/deployment/modules/DeploymentConfiguration.js +0 -395
- package/dist/bin/deployment/modules/DeploymentOrchestrator.js +0 -492
- package/dist/bin/deployment/modules/EnvironmentManager.js +0 -517
- package/dist/bin/deployment/modules/MonitoringIntegration.js +0 -560
- package/dist/bin/deployment/modules/ValidationManager.js +0 -342
- package/dist/bin/deployment/orchestration/BaseDeploymentOrchestrator.js +0 -426
- package/dist/bin/deployment/orchestration/EnterpriseOrchestrator.js +0 -401
- package/dist/bin/deployment/orchestration/PortfolioOrchestrator.js +0 -273
- package/dist/bin/deployment/orchestration/SingleServiceOrchestrator.js +0 -231
- package/dist/bin/deployment/orchestration/UnifiedDeploymentOrchestrator.js +0 -662
- package/dist/bin/deployment/test-interactive-utils.js +0 -66
- package/dist/bin/portfolio/portfolio-manager.js +0 -487
- package/dist/bin/service-management/create-service.js +0 -122
- package/dist/bin/service-management/init-service.js +0 -79
- package/dist/config/customers.js +0 -623
- package/dist/config/domains.js +0 -186
- package/dist/config/index.js +0 -6
- package/dist/database/database-orchestrator.js +0 -795
- package/dist/database/index.js +0 -4
- package/dist/deployment/index.js +0 -11
- package/dist/deployment/orchestration/BaseDeploymentOrchestrator.js +0 -426
- package/dist/deployment/orchestration/EnterpriseOrchestrator.js +0 -401
- package/dist/deployment/orchestration/PortfolioOrchestrator.js +0 -273
- package/dist/deployment/orchestration/SingleServiceOrchestrator.js +0 -231
- package/dist/deployment/orchestration/UnifiedDeploymentOrchestrator.js +0 -662
- package/dist/deployment/orchestration/index.js +0 -17
- package/dist/deployment/rollback-manager.js +0 -36
- package/dist/deployment/wrangler-deployer.js +0 -640
- package/dist/handlers/GenericRouteHandler.js +0 -532
- package/dist/migration/MigrationAdapters.js +0 -562
- package/dist/modules/ModuleManager.js +0 -668
- package/dist/modules/security.js +0 -96
- package/dist/orchestration/cross-domain-coordinator.js +0 -1083
- package/dist/orchestration/index.js +0 -5
- package/dist/orchestration/modules/DeploymentCoordinator.js +0 -368
- package/dist/orchestration/modules/DomainResolver.js +0 -198
- package/dist/orchestration/modules/StateManager.js +0 -332
- package/dist/orchestration/multi-domain-orchestrator.js +0 -724
- package/dist/routing/EnhancedRouter.js +0 -158
- package/dist/schema/SchemaManager.js +0 -778
- package/dist/service-management/ConfirmationEngine.js +0 -412
- package/dist/service-management/ErrorTracker.js +0 -299
- package/dist/service-management/GenerationEngine.js +0 -447
- package/dist/service-management/InputCollector.js +0 -619
- package/dist/service-management/ServiceCreator.js +0 -265
- package/dist/service-management/ServiceInitializer.js +0 -453
- package/dist/service-management/ServiceOrchestrator.js +0 -633
- package/dist/service-management/generators/BaseGenerator.js +0 -233
- package/dist/service-management/generators/GeneratorRegistry.js +0 -254
- package/dist/service-management/generators/cicd/CiWorkflowGenerator.js +0 -87
- package/dist/service-management/generators/cicd/DeployWorkflowGenerator.js +0 -106
- package/dist/service-management/generators/code/ServiceHandlersGenerator.js +0 -235
- package/dist/service-management/generators/code/ServiceMiddlewareGenerator.js +0 -116
- package/dist/service-management/generators/code/ServiceUtilsGenerator.js +0 -246
- package/dist/service-management/generators/code/WorkerIndexGenerator.js +0 -143
- package/dist/service-management/generators/config/DevelopmentEnvGenerator.js +0 -101
- package/dist/service-management/generators/config/DomainsConfigGenerator.js +0 -175
- package/dist/service-management/generators/config/EnvExampleGenerator.js +0 -178
- package/dist/service-management/generators/config/ProductionEnvGenerator.js +0 -97
- package/dist/service-management/generators/config/StagingEnvGenerator.js +0 -97
- package/dist/service-management/generators/config/WranglerTomlGenerator.js +0 -238
- package/dist/service-management/generators/core/PackageJsonGenerator.js +0 -243
- package/dist/service-management/generators/core/SiteConfigGenerator.js +0 -115
- package/dist/service-management/generators/documentation/ApiDocsGenerator.js +0 -331
- package/dist/service-management/generators/documentation/ConfigurationDocsGenerator.js +0 -294
- package/dist/service-management/generators/documentation/DeploymentDocsGenerator.js +0 -244
- package/dist/service-management/generators/documentation/ReadmeGenerator.js +0 -196
- package/dist/service-management/generators/schemas/ServiceSchemaGenerator.js +0 -190
- package/dist/service-management/generators/scripts/DeployScriptGenerator.js +0 -123
- package/dist/service-management/generators/scripts/HealthCheckScriptGenerator.js +0 -101
- package/dist/service-management/generators/scripts/SetupScriptGenerator.js +0 -88
- package/dist/service-management/generators/service-types/StaticSiteGenerator.js +0 -342
- package/dist/service-management/generators/testing/EslintConfigGenerator.js +0 -85
- package/dist/service-management/generators/testing/IntegrationTestsGenerator.js +0 -237
- package/dist/service-management/generators/testing/JestConfigGenerator.js +0 -72
- package/dist/service-management/generators/testing/UnitTestsGenerator.js +0 -277
- package/dist/service-management/generators/tooling/DockerComposeGenerator.js +0 -71
- package/dist/service-management/generators/tooling/GitignoreGenerator.js +0 -143
- package/dist/service-management/generators/utils/FileWriter.js +0 -179
- package/dist/service-management/generators/utils/PathResolver.js +0 -157
- package/dist/service-management/generators/utils/ServiceManifestGenerator.js +0 -111
- package/dist/service-management/generators/utils/TemplateEngine.js +0 -185
- package/dist/service-management/generators/utils/index.js +0 -18
- package/dist/service-management/handlers/ConfirmationHandler.js +0 -71
- package/dist/service-management/handlers/GenerationHandler.js +0 -80
- package/dist/service-management/handlers/InputHandler.js +0 -59
- package/dist/service-management/handlers/ValidationHandler.js +0 -203
- package/dist/service-management/index.js +0 -14
- package/dist/service-management/routing/DomainRouteMapper.js +0 -311
- package/dist/service-management/routing/RouteGenerator.js +0 -266
- package/dist/service-management/routing/WranglerRoutesBuilder.js +0 -273
- package/dist/service-management/routing/index.js +0 -14
- package/dist/service-management/services/DirectoryStructureService.js +0 -56
- package/dist/service-management/services/GenerationCoordinator.js +0 -208
- package/dist/service-management/services/GeneratorRegistry.js +0 -174
- package/dist/services/GenericDataService.js +0 -501
- package/dist/ui-structures/concepts/second-order-acquisition-strategy.md +0 -286
- package/dist/ui-structures/concepts/service-lifecycle-management.md +0 -150
- package/dist/ui-structures/concepts/service-manifest-guide.md +0 -309
- package/dist/ui-structures/concepts/three-tier-categorization-strategy.md +0 -231
- package/dist/ui-structures/creation/automated-generation-ui.json +0 -246
- package/dist/ui-structures/creation/core-inputs-ui.json +0 -217
- package/dist/ui-structures/creation/smart-confirmable-ui.json +0 -451
- package/dist/ui-structures/reference/absolutely-required-inputs.json +0 -315
- package/dist/ui-structures/reference/service-manifest-template.json +0 -342
- package/dist/version/VersionDetector.js +0 -723
- package/dist/worker/index.js +0 -4
- package/dist/worker/integration.js +0 -351
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
import { BaseGenerator } from '../BaseGenerator.js';
|
|
2
|
-
import { join } from 'path';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* WorkerIndexGenerator
|
|
6
|
-
*
|
|
7
|
-
* Generates src/worker/index.js - the main Cloudflare Worker entry point.
|
|
8
|
-
*
|
|
9
|
-
* Responsibilities:
|
|
10
|
-
* - Generate Worker fetch handler
|
|
11
|
-
* - Import domain configuration, handlers, and middleware
|
|
12
|
-
* - Set up request/response processing pipeline
|
|
13
|
-
* - Implement error handling with structured error responses
|
|
14
|
-
* - Include service metadata in error headers
|
|
15
|
-
*
|
|
16
|
-
* Output:
|
|
17
|
-
* - src/worker/index.js (ES module with default export fetch handler)
|
|
18
|
-
*/
|
|
19
|
-
export class WorkerIndexGenerator extends BaseGenerator {
|
|
20
|
-
constructor(options = {}) {
|
|
21
|
-
super({
|
|
22
|
-
name: 'WorkerIndexGenerator',
|
|
23
|
-
description: 'Generates Cloudflare Worker entry point in src/worker/index.js',
|
|
24
|
-
outputPath: 'src/worker/index.js',
|
|
25
|
-
...options
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Always generate worker index
|
|
31
|
-
*/
|
|
32
|
-
shouldGenerate(context) {
|
|
33
|
-
return true;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Generate src/worker/index.js
|
|
38
|
-
*/
|
|
39
|
-
async generate(context) {
|
|
40
|
-
// Support both new structured format and legacy flat format
|
|
41
|
-
const coreInputs = context.coreInputs || context;
|
|
42
|
-
const confirmedValues = context.confirmedValues || context;
|
|
43
|
-
const servicePath = context.servicePath || context.outputDir;
|
|
44
|
-
this.setContext({
|
|
45
|
-
coreInputs,
|
|
46
|
-
confirmedValues,
|
|
47
|
-
servicePath
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
// Build worker index content
|
|
51
|
-
const content = this._buildWorkerIndex(coreInputs, confirmedValues);
|
|
52
|
-
|
|
53
|
-
// Write file to src/worker/index.js
|
|
54
|
-
await this.writeFile(join('src', 'worker', 'index.js'), content);
|
|
55
|
-
|
|
56
|
-
// Return full path for backward compatibility
|
|
57
|
-
return join(servicePath, 'src', 'worker', 'index.js');
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Build the complete worker index.js content
|
|
62
|
-
*/
|
|
63
|
-
_buildWorkerIndex(coreInputs, confirmedValues) {
|
|
64
|
-
return `/**
|
|
65
|
-
* ${confirmedValues.displayName} - Cloudflare Worker
|
|
66
|
-
*
|
|
67
|
-
* Generated by Clodo Framework GenerationEngine
|
|
68
|
-
* Service Type: ${coreInputs.serviceType}
|
|
69
|
-
*/
|
|
70
|
-
|
|
71
|
-
import { domains } from '../config/domains.js';
|
|
72
|
-
import { createServiceHandlers } from '../handlers/service-handlers.js';
|
|
73
|
-
import { createServiceMiddleware } from '../middleware/service-middleware.js';
|
|
74
|
-
|
|
75
|
-
export default {
|
|
76
|
-
async fetch(request, env, ctx) {
|
|
77
|
-
try {
|
|
78
|
-
// Get service configuration
|
|
79
|
-
const serviceConfig = domains['${coreInputs.serviceName}'];
|
|
80
|
-
|
|
81
|
-
// Apply middleware
|
|
82
|
-
const middleware = createServiceMiddleware(serviceConfig, env);
|
|
83
|
-
const processedRequest = await middleware.processRequest(request);
|
|
84
|
-
|
|
85
|
-
// Route to appropriate handler
|
|
86
|
-
const handlers = createServiceHandlers(serviceConfig, env);
|
|
87
|
-
const response = await handlers.handleRequest(processedRequest, ctx);
|
|
88
|
-
|
|
89
|
-
// Apply response middleware
|
|
90
|
-
return await middleware.processResponse(response);
|
|
91
|
-
|
|
92
|
-
} catch (error) {
|
|
93
|
-
console.error('Worker error:', error);
|
|
94
|
-
|
|
95
|
-
return new Response(JSON.stringify({
|
|
96
|
-
error: 'Internal Server Error',
|
|
97
|
-
message: error.message,
|
|
98
|
-
timestamp: new Date().toISOString()
|
|
99
|
-
}), {
|
|
100
|
-
status: 500,
|
|
101
|
-
headers: {
|
|
102
|
-
'Content-Type': 'application/json',
|
|
103
|
-
'X-Service': '${coreInputs.serviceName}',
|
|
104
|
-
'X-Version': '${confirmedValues.version}'
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
|
-
`;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Validate context has required fields
|
|
115
|
-
*/
|
|
116
|
-
validateContext(context) {
|
|
117
|
-
const coreInputs = context.coreInputs || context;
|
|
118
|
-
const confirmedValues = context.confirmedValues || context;
|
|
119
|
-
const required = [{
|
|
120
|
-
field: 'serviceName',
|
|
121
|
-
source: coreInputs
|
|
122
|
-
}, {
|
|
123
|
-
field: 'serviceType',
|
|
124
|
-
source: coreInputs
|
|
125
|
-
}, {
|
|
126
|
-
field: 'displayName',
|
|
127
|
-
source: confirmedValues
|
|
128
|
-
}, {
|
|
129
|
-
field: 'version',
|
|
130
|
-
source: confirmedValues
|
|
131
|
-
}];
|
|
132
|
-
const missing = required.filter(({
|
|
133
|
-
field,
|
|
134
|
-
source
|
|
135
|
-
}) => !source || !source[field]).map(({
|
|
136
|
-
field
|
|
137
|
-
}) => field);
|
|
138
|
-
if (missing.length > 0) {
|
|
139
|
-
throw new Error(`WorkerIndexGenerator: Missing required fields: ${missing.join(', ')}`);
|
|
140
|
-
}
|
|
141
|
-
return true;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import { BaseGenerator } from '../BaseGenerator.js';
|
|
2
|
-
import { join } from 'path';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* DevelopmentEnvGenerator
|
|
6
|
-
*
|
|
7
|
-
* Generates config/development.env file for development environment.
|
|
8
|
-
*/
|
|
9
|
-
export class DevelopmentEnvGenerator extends BaseGenerator {
|
|
10
|
-
constructor(options = {}) {
|
|
11
|
-
super({
|
|
12
|
-
name: 'DevelopmentEnvGenerator',
|
|
13
|
-
description: 'Generates development environment configuration',
|
|
14
|
-
outputPath: 'config/development.env',
|
|
15
|
-
...options
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
shouldGenerate(context) {
|
|
19
|
-
return true;
|
|
20
|
-
}
|
|
21
|
-
async generate(context) {
|
|
22
|
-
const coreInputs = context.coreInputs || context;
|
|
23
|
-
const confirmedValues = context.confirmedValues || context;
|
|
24
|
-
const servicePath = context.servicePath || context.outputDir;
|
|
25
|
-
this.setContext({
|
|
26
|
-
coreInputs,
|
|
27
|
-
confirmedValues,
|
|
28
|
-
servicePath
|
|
29
|
-
});
|
|
30
|
-
const content = `# Development Environment Configuration
|
|
31
|
-
# Generated by Clodo Framework GenerationEngine
|
|
32
|
-
|
|
33
|
-
# Service Configuration
|
|
34
|
-
SERVICE_NAME=${coreInputs.serviceName}
|
|
35
|
-
SERVICE_TYPE=${coreInputs.serviceType}
|
|
36
|
-
ENVIRONMENT=development
|
|
37
|
-
|
|
38
|
-
# URLs
|
|
39
|
-
PRODUCTION_URL=${confirmedValues.productionUrl}
|
|
40
|
-
STAGING_URL=${confirmedValues.stagingUrl}
|
|
41
|
-
DEVELOPMENT_URL=${confirmedValues.developmentUrl}
|
|
42
|
-
|
|
43
|
-
# Cloudflare Configuration
|
|
44
|
-
CLOUDFLARE_ACCOUNT_ID=${coreInputs.cloudflareAccountId}
|
|
45
|
-
CLOUDFLARE_ZONE_ID=${coreInputs.cloudflareZoneId}
|
|
46
|
-
|
|
47
|
-
# Database
|
|
48
|
-
DATABASE_NAME=${confirmedValues.databaseName}
|
|
49
|
-
|
|
50
|
-
# Logging and Monitoring
|
|
51
|
-
LOG_LEVEL=debug
|
|
52
|
-
METRICS_ENABLED=false
|
|
53
|
-
ERROR_REPORTING_ENABLED=false
|
|
54
|
-
|
|
55
|
-
# Development settings
|
|
56
|
-
DEBUG_MODE=true
|
|
57
|
-
HOT_RELOAD=true
|
|
58
|
-
`;
|
|
59
|
-
await this.writeFile(join('config', 'development.env'), content);
|
|
60
|
-
return join(servicePath, 'config', 'development.env');
|
|
61
|
-
}
|
|
62
|
-
validateContext(context) {
|
|
63
|
-
const coreInputs = context.coreInputs || context;
|
|
64
|
-
const confirmedValues = context.confirmedValues || context;
|
|
65
|
-
const required = [{
|
|
66
|
-
field: 'serviceName',
|
|
67
|
-
source: coreInputs
|
|
68
|
-
}, {
|
|
69
|
-
field: 'serviceType',
|
|
70
|
-
source: coreInputs
|
|
71
|
-
}, {
|
|
72
|
-
field: 'cloudflareAccountId',
|
|
73
|
-
source: coreInputs
|
|
74
|
-
}, {
|
|
75
|
-
field: 'cloudflareZoneId',
|
|
76
|
-
source: coreInputs
|
|
77
|
-
}, {
|
|
78
|
-
field: 'productionUrl',
|
|
79
|
-
source: confirmedValues
|
|
80
|
-
}, {
|
|
81
|
-
field: 'stagingUrl',
|
|
82
|
-
source: confirmedValues
|
|
83
|
-
}, {
|
|
84
|
-
field: 'developmentUrl',
|
|
85
|
-
source: confirmedValues
|
|
86
|
-
}, {
|
|
87
|
-
field: 'databaseName',
|
|
88
|
-
source: confirmedValues
|
|
89
|
-
}];
|
|
90
|
-
const missing = required.filter(({
|
|
91
|
-
field,
|
|
92
|
-
source
|
|
93
|
-
}) => !source || !source[field]).map(({
|
|
94
|
-
field
|
|
95
|
-
}) => field);
|
|
96
|
-
if (missing.length > 0) {
|
|
97
|
-
throw new Error(`DevelopmentEnvGenerator: Missing required fields: ${missing.join(', ')}`);
|
|
98
|
-
}
|
|
99
|
-
return true;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
import { BaseGenerator } from '../BaseGenerator.js';
|
|
2
|
-
import { join } from 'path';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* DomainsConfigGenerator
|
|
6
|
-
*
|
|
7
|
-
* Generates src/config/domains.js configuration file.
|
|
8
|
-
*
|
|
9
|
-
* Responsibilities:
|
|
10
|
-
* - Generate domain configuration using createDomainConfigSchema from framework
|
|
11
|
-
* - Configure multi-environment URLs (production/staging/development)
|
|
12
|
-
* - Configure database bindings
|
|
13
|
-
* - Include service metadata and feature flags
|
|
14
|
-
* - Support multi-service domain configuration
|
|
15
|
-
*
|
|
16
|
-
* Output:
|
|
17
|
-
* - src/config/domains.js (ES module with domain configuration object)
|
|
18
|
-
*/
|
|
19
|
-
export class DomainsConfigGenerator extends BaseGenerator {
|
|
20
|
-
constructor(options = {}) {
|
|
21
|
-
super({
|
|
22
|
-
name: 'DomainsConfigGenerator',
|
|
23
|
-
description: 'Generates domain configuration in src/config/domains.js',
|
|
24
|
-
outputPath: 'src/config/domains.js',
|
|
25
|
-
...options
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Always generate domains configuration
|
|
31
|
-
*/
|
|
32
|
-
shouldGenerate(context) {
|
|
33
|
-
return true;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Generate domains.js configuration
|
|
38
|
-
*/
|
|
39
|
-
async generate(context) {
|
|
40
|
-
// Support both new structured format and legacy flat format
|
|
41
|
-
const coreInputs = context.coreInputs || context;
|
|
42
|
-
const confirmedValues = context.confirmedValues || context;
|
|
43
|
-
const servicePath = context.servicePath || context.outputDir;
|
|
44
|
-
this.setContext({
|
|
45
|
-
coreInputs,
|
|
46
|
-
confirmedValues,
|
|
47
|
-
servicePath
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
// Build domains.js content
|
|
51
|
-
const content = this._buildDomainsConfig(coreInputs, confirmedValues);
|
|
52
|
-
|
|
53
|
-
// Write file to src/config/domains.js
|
|
54
|
-
// Note: writeFile in BaseGenerator will join this with servicePath
|
|
55
|
-
await this.writeFile(join('src', 'config', 'domains.js'), content);
|
|
56
|
-
|
|
57
|
-
// Return full path for backward compatibility
|
|
58
|
-
return join(servicePath, 'src', 'config', 'domains.js');
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Build the complete domains.js configuration content
|
|
63
|
-
*/
|
|
64
|
-
_buildDomainsConfig(coreInputs, confirmedValues) {
|
|
65
|
-
const timestamp = new Date().toISOString();
|
|
66
|
-
return `import { createDomainConfigSchema } from '@tamyla/clodo-framework';
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Domain configuration for ${confirmedValues.displayName}
|
|
70
|
-
*
|
|
71
|
-
* Generated by Clodo Framework GenerationEngine
|
|
72
|
-
* Service Type: ${coreInputs.serviceType}
|
|
73
|
-
* Generated: ${timestamp}
|
|
74
|
-
*/
|
|
75
|
-
|
|
76
|
-
export const domains = {
|
|
77
|
-
'${coreInputs.serviceName}': {
|
|
78
|
-
...createDomainConfigSchema(),
|
|
79
|
-
name: '${coreInputs.serviceName}',
|
|
80
|
-
displayName: '${confirmedValues.displayName}',
|
|
81
|
-
description: '${confirmedValues.description}',
|
|
82
|
-
accountId: '${coreInputs.cloudflareAccountId}',
|
|
83
|
-
zoneId: '${coreInputs.cloudflareZoneId}',
|
|
84
|
-
domains: {
|
|
85
|
-
production: '${confirmedValues.productionUrl}',
|
|
86
|
-
staging: '${confirmedValues.stagingUrl}',
|
|
87
|
-
development: '${confirmedValues.developmentUrl}'
|
|
88
|
-
},
|
|
89
|
-
services: [
|
|
90
|
-
'${coreInputs.serviceName}'
|
|
91
|
-
],
|
|
92
|
-
databases: [
|
|
93
|
-
{
|
|
94
|
-
name: '${confirmedValues.databaseName}',
|
|
95
|
-
type: 'd1',
|
|
96
|
-
binding: 'DB'
|
|
97
|
-
}
|
|
98
|
-
],
|
|
99
|
-
features: ${JSON.stringify(confirmedValues.features, null, 4)},
|
|
100
|
-
metadata: {
|
|
101
|
-
version: '${confirmedValues.version}',
|
|
102
|
-
author: '${confirmedValues.author}',
|
|
103
|
-
generatedAt: '${timestamp}',
|
|
104
|
-
frameworkVersion: '3.0.0',
|
|
105
|
-
serviceType: '${coreInputs.serviceType}',
|
|
106
|
-
environment: '${coreInputs.environment}'
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
export default domains;
|
|
112
|
-
`;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Validate context has required fields
|
|
117
|
-
*/
|
|
118
|
-
validateContext(context) {
|
|
119
|
-
const coreInputs = context.coreInputs || context;
|
|
120
|
-
const confirmedValues = context.confirmedValues || context;
|
|
121
|
-
const required = [{
|
|
122
|
-
field: 'serviceName',
|
|
123
|
-
source: coreInputs
|
|
124
|
-
}, {
|
|
125
|
-
field: 'serviceType',
|
|
126
|
-
source: coreInputs
|
|
127
|
-
}, {
|
|
128
|
-
field: 'environment',
|
|
129
|
-
source: coreInputs
|
|
130
|
-
}, {
|
|
131
|
-
field: 'cloudflareAccountId',
|
|
132
|
-
source: coreInputs
|
|
133
|
-
}, {
|
|
134
|
-
field: 'cloudflareZoneId',
|
|
135
|
-
source: coreInputs
|
|
136
|
-
}, {
|
|
137
|
-
field: 'displayName',
|
|
138
|
-
source: confirmedValues
|
|
139
|
-
}, {
|
|
140
|
-
field: 'description',
|
|
141
|
-
source: confirmedValues
|
|
142
|
-
}, {
|
|
143
|
-
field: 'productionUrl',
|
|
144
|
-
source: confirmedValues
|
|
145
|
-
}, {
|
|
146
|
-
field: 'stagingUrl',
|
|
147
|
-
source: confirmedValues
|
|
148
|
-
}, {
|
|
149
|
-
field: 'developmentUrl',
|
|
150
|
-
source: confirmedValues
|
|
151
|
-
}, {
|
|
152
|
-
field: 'databaseName',
|
|
153
|
-
source: confirmedValues
|
|
154
|
-
}, {
|
|
155
|
-
field: 'version',
|
|
156
|
-
source: confirmedValues
|
|
157
|
-
}, {
|
|
158
|
-
field: 'author',
|
|
159
|
-
source: confirmedValues
|
|
160
|
-
}, {
|
|
161
|
-
field: 'features',
|
|
162
|
-
source: confirmedValues
|
|
163
|
-
}];
|
|
164
|
-
const missing = required.filter(({
|
|
165
|
-
field,
|
|
166
|
-
source
|
|
167
|
-
}) => !source || source[field] === undefined).map(({
|
|
168
|
-
field
|
|
169
|
-
}) => field);
|
|
170
|
-
if (missing.length > 0) {
|
|
171
|
-
throw new Error(`DomainsConfigGenerator: Missing required fields: ${missing.join(', ')}`);
|
|
172
|
-
}
|
|
173
|
-
return true;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
import { BaseGenerator } from '../BaseGenerator.js';
|
|
2
|
-
import { join } from 'path';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* EnvExampleGenerator
|
|
6
|
-
*
|
|
7
|
-
* Generates .env.example file with environment variable templates.
|
|
8
|
-
*
|
|
9
|
-
* Responsibilities:
|
|
10
|
-
* - Generate Cloudflare configuration variables (account/zone/token)
|
|
11
|
-
* - Generate service configuration variables
|
|
12
|
-
* - Generate environment-specific URLs
|
|
13
|
-
* - Generate API configuration (base path, health check)
|
|
14
|
-
* - Generate database configuration
|
|
15
|
-
* - Generate feature flag variables
|
|
16
|
-
* - Include placeholder comments for custom variables
|
|
17
|
-
*
|
|
18
|
-
* Output:
|
|
19
|
-
* - .env.example (environment variable template file)
|
|
20
|
-
*/
|
|
21
|
-
export class EnvExampleGenerator extends BaseGenerator {
|
|
22
|
-
constructor(options = {}) {
|
|
23
|
-
super({
|
|
24
|
-
name: 'EnvExampleGenerator',
|
|
25
|
-
description: 'Generates .env.example template file',
|
|
26
|
-
outputPath: '.env.example',
|
|
27
|
-
...options
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Always generate .env.example
|
|
33
|
-
*/
|
|
34
|
-
shouldGenerate(context) {
|
|
35
|
-
return true;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Generate .env.example file
|
|
40
|
-
*/
|
|
41
|
-
async generate(context) {
|
|
42
|
-
// Support both new structured format and legacy flat format
|
|
43
|
-
const coreInputs = context.coreInputs || context;
|
|
44
|
-
const confirmedValues = context.confirmedValues || context;
|
|
45
|
-
const servicePath = context.servicePath || context.outputDir;
|
|
46
|
-
this.setContext({
|
|
47
|
-
coreInputs,
|
|
48
|
-
confirmedValues,
|
|
49
|
-
servicePath
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
// Build .env.example content
|
|
53
|
-
const content = this._buildEnvExample(coreInputs, confirmedValues);
|
|
54
|
-
|
|
55
|
-
// Write file to root directory
|
|
56
|
-
await this.writeFile('.env.example', content);
|
|
57
|
-
|
|
58
|
-
// Return full path for backward compatibility
|
|
59
|
-
return join(servicePath, '.env.example');
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Build the complete .env.example content
|
|
64
|
-
*/
|
|
65
|
-
_buildEnvExample(coreInputs, confirmedValues) {
|
|
66
|
-
const featureFlags = this._generateFeatureFlags(confirmedValues.features);
|
|
67
|
-
return `# ${confirmedValues.displayName} Environment Variables
|
|
68
|
-
# Generated by Clodo Framework GenerationEngine
|
|
69
|
-
|
|
70
|
-
# Cloudflare Configuration
|
|
71
|
-
CLOUDFLARE_ACCOUNT_ID=${coreInputs.cloudflareAccountId}
|
|
72
|
-
CLOUDFLARE_ZONE_ID=${coreInputs.cloudflareZoneId}
|
|
73
|
-
CLOUDFLARE_API_TOKEN=${coreInputs.cloudflareToken}
|
|
74
|
-
|
|
75
|
-
# Service Configuration
|
|
76
|
-
SERVICE_NAME=${coreInputs.serviceName}
|
|
77
|
-
SERVICE_TYPE=${coreInputs.serviceType}
|
|
78
|
-
DOMAIN_NAME=${coreInputs.domainName}
|
|
79
|
-
ENVIRONMENT=${coreInputs.environment}
|
|
80
|
-
|
|
81
|
-
# URLs
|
|
82
|
-
PRODUCTION_URL=${confirmedValues.productionUrl}
|
|
83
|
-
STAGING_URL=${confirmedValues.stagingUrl}
|
|
84
|
-
DEVELOPMENT_URL=${confirmedValues.developmentUrl}
|
|
85
|
-
DOCUMENTATION_URL=${confirmedValues.documentationUrl}
|
|
86
|
-
|
|
87
|
-
# API Configuration
|
|
88
|
-
API_BASE_PATH=${confirmedValues.apiBasePath}
|
|
89
|
-
HEALTH_CHECK_PATH=${confirmedValues.healthCheckPath}
|
|
90
|
-
|
|
91
|
-
# Database Configuration
|
|
92
|
-
DATABASE_NAME=${confirmedValues.databaseName}
|
|
93
|
-
|
|
94
|
-
# Feature Flags
|
|
95
|
-
${featureFlags}
|
|
96
|
-
|
|
97
|
-
# Custom environment variables (uncomment and configure as needed)
|
|
98
|
-
# CUSTOM_VAR=value
|
|
99
|
-
# API_KEY=your-api-key-here
|
|
100
|
-
# SECRET_KEY=your-secret-key-here
|
|
101
|
-
`;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Generate feature flags section
|
|
106
|
-
*/
|
|
107
|
-
_generateFeatureFlags(features) {
|
|
108
|
-
if (!features || typeof features !== 'object') {
|
|
109
|
-
return '# No feature flags configured';
|
|
110
|
-
}
|
|
111
|
-
const flagEntries = Object.entries(features).filter(([, enabled]) => enabled).map(([feature]) => `FEATURE_${feature.toUpperCase()}=true`);
|
|
112
|
-
return flagEntries.length > 0 ? flagEntries.join('\n') : '# No feature flags configured';
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Validate context has required fields
|
|
117
|
-
*/
|
|
118
|
-
validateContext(context) {
|
|
119
|
-
const coreInputs = context.coreInputs || context;
|
|
120
|
-
const confirmedValues = context.confirmedValues || context;
|
|
121
|
-
const required = [{
|
|
122
|
-
field: 'cloudflareAccountId',
|
|
123
|
-
source: coreInputs
|
|
124
|
-
}, {
|
|
125
|
-
field: 'cloudflareZoneId',
|
|
126
|
-
source: coreInputs
|
|
127
|
-
}, {
|
|
128
|
-
field: 'cloudflareToken',
|
|
129
|
-
source: coreInputs
|
|
130
|
-
}, {
|
|
131
|
-
field: 'serviceName',
|
|
132
|
-
source: coreInputs
|
|
133
|
-
}, {
|
|
134
|
-
field: 'serviceType',
|
|
135
|
-
source: coreInputs
|
|
136
|
-
}, {
|
|
137
|
-
field: 'domainName',
|
|
138
|
-
source: coreInputs
|
|
139
|
-
}, {
|
|
140
|
-
field: 'environment',
|
|
141
|
-
source: coreInputs
|
|
142
|
-
}, {
|
|
143
|
-
field: 'displayName',
|
|
144
|
-
source: confirmedValues
|
|
145
|
-
}, {
|
|
146
|
-
field: 'productionUrl',
|
|
147
|
-
source: confirmedValues
|
|
148
|
-
}, {
|
|
149
|
-
field: 'stagingUrl',
|
|
150
|
-
source: confirmedValues
|
|
151
|
-
}, {
|
|
152
|
-
field: 'developmentUrl',
|
|
153
|
-
source: confirmedValues
|
|
154
|
-
}, {
|
|
155
|
-
field: 'documentationUrl',
|
|
156
|
-
source: confirmedValues
|
|
157
|
-
}, {
|
|
158
|
-
field: 'apiBasePath',
|
|
159
|
-
source: confirmedValues
|
|
160
|
-
}, {
|
|
161
|
-
field: 'healthCheckPath',
|
|
162
|
-
source: confirmedValues
|
|
163
|
-
}, {
|
|
164
|
-
field: 'databaseName',
|
|
165
|
-
source: confirmedValues
|
|
166
|
-
}];
|
|
167
|
-
const missing = required.filter(({
|
|
168
|
-
field,
|
|
169
|
-
source
|
|
170
|
-
}) => !source || !source[field]).map(({
|
|
171
|
-
field
|
|
172
|
-
}) => field);
|
|
173
|
-
if (missing.length > 0) {
|
|
174
|
-
throw new Error(`EnvExampleGenerator: Missing required fields: ${missing.join(', ')}`);
|
|
175
|
-
}
|
|
176
|
-
return true;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import { BaseGenerator } from '../BaseGenerator.js';
|
|
2
|
-
import { join } from 'path';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* ProductionEnvGenerator
|
|
6
|
-
*
|
|
7
|
-
* Generates config/production.env file for production environment.
|
|
8
|
-
*/
|
|
9
|
-
export class ProductionEnvGenerator extends BaseGenerator {
|
|
10
|
-
constructor(options = {}) {
|
|
11
|
-
super({
|
|
12
|
-
name: 'ProductionEnvGenerator',
|
|
13
|
-
description: 'Generates production environment configuration',
|
|
14
|
-
outputPath: 'config/production.env',
|
|
15
|
-
...options
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
shouldGenerate(context) {
|
|
19
|
-
return true;
|
|
20
|
-
}
|
|
21
|
-
async generate(context) {
|
|
22
|
-
const coreInputs = context.coreInputs || context;
|
|
23
|
-
const confirmedValues = context.confirmedValues || context;
|
|
24
|
-
const servicePath = context.servicePath || context.outputDir;
|
|
25
|
-
this.setContext({
|
|
26
|
-
coreInputs,
|
|
27
|
-
confirmedValues,
|
|
28
|
-
servicePath
|
|
29
|
-
});
|
|
30
|
-
const content = `# Production Environment Configuration
|
|
31
|
-
# Generated by Clodo Framework GenerationEngine
|
|
32
|
-
|
|
33
|
-
# Service Configuration
|
|
34
|
-
SERVICE_NAME=${coreInputs.serviceName}
|
|
35
|
-
SERVICE_TYPE=${coreInputs.serviceType}
|
|
36
|
-
ENVIRONMENT=production
|
|
37
|
-
|
|
38
|
-
# URLs
|
|
39
|
-
PRODUCTION_URL=${confirmedValues.productionUrl}
|
|
40
|
-
STAGING_URL=${confirmedValues.stagingUrl}
|
|
41
|
-
DEVELOPMENT_URL=${confirmedValues.developmentUrl}
|
|
42
|
-
|
|
43
|
-
# Cloudflare Configuration
|
|
44
|
-
CLOUDFLARE_ACCOUNT_ID=${coreInputs.cloudflareAccountId}
|
|
45
|
-
CLOUDFLARE_ZONE_ID=${coreInputs.cloudflareZoneId}
|
|
46
|
-
|
|
47
|
-
# Database
|
|
48
|
-
DATABASE_NAME=${confirmedValues.databaseName}
|
|
49
|
-
|
|
50
|
-
# Logging and Monitoring
|
|
51
|
-
LOG_LEVEL=warn
|
|
52
|
-
METRICS_ENABLED=true
|
|
53
|
-
ERROR_REPORTING_ENABLED=true
|
|
54
|
-
`;
|
|
55
|
-
await this.writeFile(join('config', 'production.env'), content);
|
|
56
|
-
return join(servicePath, 'config', 'production.env');
|
|
57
|
-
}
|
|
58
|
-
validateContext(context) {
|
|
59
|
-
const coreInputs = context.coreInputs || context;
|
|
60
|
-
const confirmedValues = context.confirmedValues || context;
|
|
61
|
-
const required = [{
|
|
62
|
-
field: 'serviceName',
|
|
63
|
-
source: coreInputs
|
|
64
|
-
}, {
|
|
65
|
-
field: 'serviceType',
|
|
66
|
-
source: coreInputs
|
|
67
|
-
}, {
|
|
68
|
-
field: 'cloudflareAccountId',
|
|
69
|
-
source: coreInputs
|
|
70
|
-
}, {
|
|
71
|
-
field: 'cloudflareZoneId',
|
|
72
|
-
source: coreInputs
|
|
73
|
-
}, {
|
|
74
|
-
field: 'productionUrl',
|
|
75
|
-
source: confirmedValues
|
|
76
|
-
}, {
|
|
77
|
-
field: 'stagingUrl',
|
|
78
|
-
source: confirmedValues
|
|
79
|
-
}, {
|
|
80
|
-
field: 'developmentUrl',
|
|
81
|
-
source: confirmedValues
|
|
82
|
-
}, {
|
|
83
|
-
field: 'databaseName',
|
|
84
|
-
source: confirmedValues
|
|
85
|
-
}];
|
|
86
|
-
const missing = required.filter(({
|
|
87
|
-
field,
|
|
88
|
-
source
|
|
89
|
-
}) => !source || !source[field]).map(({
|
|
90
|
-
field
|
|
91
|
-
}) => field);
|
|
92
|
-
if (missing.length > 0) {
|
|
93
|
-
throw new Error(`ProductionEnvGenerator: Missing required fields: ${missing.join(', ')}`);
|
|
94
|
-
}
|
|
95
|
-
return true;
|
|
96
|
-
}
|
|
97
|
-
}
|