@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,235 +0,0 @@
|
|
|
1
|
-
import { BaseGenerator } from '../BaseGenerator.js';
|
|
2
|
-
import { join } from 'path';
|
|
3
|
-
import { mkdirSync, writeFileSync } from 'fs';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Service Handlers Generator
|
|
7
|
-
* Generates request handlers with routing, health checks, and API endpoints
|
|
8
|
-
*/
|
|
9
|
-
export class ServiceHandlersGenerator extends BaseGenerator {
|
|
10
|
-
/**
|
|
11
|
-
* Generate service handlers
|
|
12
|
-
* @param {Object} context - Generation context
|
|
13
|
-
* @returns {Promise<string>} Path to generated handlers file
|
|
14
|
-
*/
|
|
15
|
-
async generate(context) {
|
|
16
|
-
const {
|
|
17
|
-
coreInputs,
|
|
18
|
-
confirmedValues,
|
|
19
|
-
servicePath
|
|
20
|
-
} = this.extractContext(context);
|
|
21
|
-
if (!this.shouldGenerate(context)) {
|
|
22
|
-
return null;
|
|
23
|
-
}
|
|
24
|
-
const handlersContent = `/**
|
|
25
|
-
* ${confirmedValues.displayName} - Service Handlers
|
|
26
|
-
*
|
|
27
|
-
* Generated by Clodo Framework GenerationEngine
|
|
28
|
-
* Service Type: ${coreInputs.serviceType}
|
|
29
|
-
*/
|
|
30
|
-
|
|
31
|
-
import { healthCheckResponseSchema, errorResponseSchema } from '../schemas/service-schema.js';
|
|
32
|
-
|
|
33
|
-
export function createServiceHandlers(serviceConfig, env) {
|
|
34
|
-
return {
|
|
35
|
-
async handleRequest(request, ctx) {
|
|
36
|
-
const url = new URL(request.url);
|
|
37
|
-
const path = url.pathname;
|
|
38
|
-
|
|
39
|
-
// Health check endpoint
|
|
40
|
-
if (path === '${confirmedValues.healthCheckPath}') {
|
|
41
|
-
return this.handleHealthCheck(request, serviceConfig);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// API routes
|
|
45
|
-
if (path.startsWith('${confirmedValues.apiBasePath}')) {
|
|
46
|
-
return this.handleApiRequest(request, ctx, serviceConfig, env);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Default 404 response
|
|
50
|
-
return new Response(JSON.stringify({
|
|
51
|
-
error: 'Not Found',
|
|
52
|
-
message: \`Endpoint not found: \${path}\`,
|
|
53
|
-
availableEndpoints: [
|
|
54
|
-
'${confirmedValues.healthCheckPath}',
|
|
55
|
-
'${confirmedValues.apiBasePath}/*'
|
|
56
|
-
]
|
|
57
|
-
}), {
|
|
58
|
-
status: 404,
|
|
59
|
-
headers: { 'Content-Type': 'application/json' }
|
|
60
|
-
});
|
|
61
|
-
},
|
|
62
|
-
|
|
63
|
-
async handleHealthCheck(request, serviceConfig) {
|
|
64
|
-
try {
|
|
65
|
-
// Perform health checks
|
|
66
|
-
const healthStatus = await this.performHealthChecks(serviceConfig, env);
|
|
67
|
-
|
|
68
|
-
const response = {
|
|
69
|
-
status: healthStatus.overall === 'healthy' ? 'healthy' : 'unhealthy',
|
|
70
|
-
timestamp: new Date().toISOString(),
|
|
71
|
-
service: serviceConfig.name,
|
|
72
|
-
version: '${confirmedValues.version}',
|
|
73
|
-
environment: '${coreInputs.environment}',
|
|
74
|
-
checks: healthStatus.checks
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
return new Response(JSON.stringify(response), {
|
|
78
|
-
status: healthStatus.overall === 'healthy' ? 200 : 503,
|
|
79
|
-
headers: { 'Content-Type': 'application/json' }
|
|
80
|
-
});
|
|
81
|
-
} catch (error) {
|
|
82
|
-
return new Response(JSON.stringify({
|
|
83
|
-
status: 'unhealthy',
|
|
84
|
-
timestamp: new Date().toISOString(),
|
|
85
|
-
service: serviceConfig.name,
|
|
86
|
-
error: error.message
|
|
87
|
-
}), {
|
|
88
|
-
status: 503,
|
|
89
|
-
headers: { 'Content-Type': 'application/json' }
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
},
|
|
93
|
-
|
|
94
|
-
async handleApiRequest(request, ctx, serviceConfig, env) {
|
|
95
|
-
try {
|
|
96
|
-
const url = new URL(request.url);
|
|
97
|
-
const path = url.pathname.replace('${confirmedValues.apiBasePath}', '');
|
|
98
|
-
|
|
99
|
-
// Route to service-specific handlers
|
|
100
|
-
switch (request.method) {
|
|
101
|
-
case 'GET':
|
|
102
|
-
return this.handleGet(path, request, ctx, serviceConfig, env);
|
|
103
|
-
case 'POST':
|
|
104
|
-
return this.handlePost(path, request, ctx, serviceConfig, env);
|
|
105
|
-
case 'PUT':
|
|
106
|
-
return this.handlePut(path, request, ctx, serviceConfig, env);
|
|
107
|
-
case 'DELETE':
|
|
108
|
-
return this.handleDelete(path, request, ctx, serviceConfig, env);
|
|
109
|
-
default:
|
|
110
|
-
return new Response(JSON.stringify({
|
|
111
|
-
error: 'Method Not Allowed',
|
|
112
|
-
message: \`Method \${request.method} not supported\`
|
|
113
|
-
}), {
|
|
114
|
-
status: 405,
|
|
115
|
-
headers: { 'Content-Type': 'application/json' }
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
} catch (error) {
|
|
119
|
-
return new Response(JSON.stringify({
|
|
120
|
-
error: 'Internal Server Error',
|
|
121
|
-
message: error.message,
|
|
122
|
-
timestamp: new Date().toISOString()
|
|
123
|
-
}), {
|
|
124
|
-
status: 500,
|
|
125
|
-
headers: { 'Content-Type': 'application/json' }
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
},
|
|
129
|
-
|
|
130
|
-
async performHealthChecks(serviceConfig, env) {
|
|
131
|
-
const checks = [];
|
|
132
|
-
|
|
133
|
-
// Database connectivity check
|
|
134
|
-
try {
|
|
135
|
-
${confirmedValues.features.database ? `
|
|
136
|
-
// Check database connection
|
|
137
|
-
const dbCheck = await env.DB.prepare('SELECT 1 as health_check').first();
|
|
138
|
-
checks.push({
|
|
139
|
-
name: 'database',
|
|
140
|
-
status: dbCheck ? 'healthy' : 'unhealthy',
|
|
141
|
-
responseTime: Date.now()
|
|
142
|
-
});` : `
|
|
143
|
-
checks.push({
|
|
144
|
-
name: 'database',
|
|
145
|
-
status: 'disabled',
|
|
146
|
-
message: 'Database not configured for this service type'
|
|
147
|
-
});`}
|
|
148
|
-
} catch (error) {
|
|
149
|
-
checks.push({
|
|
150
|
-
name: 'database',
|
|
151
|
-
status: 'unhealthy',
|
|
152
|
-
error: error.message
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// Service configuration check
|
|
157
|
-
checks.push({
|
|
158
|
-
name: 'configuration',
|
|
159
|
-
status: serviceConfig ? 'healthy' : 'unhealthy',
|
|
160
|
-
message: serviceConfig ? 'Service configuration loaded' : 'Service configuration missing'
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
// Overall health status
|
|
164
|
-
const overall = checks.every(check => check.status === 'healthy' || check.status === 'disabled')
|
|
165
|
-
? 'healthy' : 'unhealthy';
|
|
166
|
-
|
|
167
|
-
return { overall, checks };
|
|
168
|
-
},
|
|
169
|
-
|
|
170
|
-
// Placeholder handlers - implement based on service type
|
|
171
|
-
async handleGet(path, request, ctx, serviceConfig, env) {
|
|
172
|
-
return new Response(JSON.stringify({
|
|
173
|
-
message: 'GET handler not implemented',
|
|
174
|
-
path,
|
|
175
|
-
service: serviceConfig.name,
|
|
176
|
-
timestamp: new Date().toISOString()
|
|
177
|
-
}), {
|
|
178
|
-
headers: { 'Content-Type': 'application/json' }
|
|
179
|
-
});
|
|
180
|
-
},
|
|
181
|
-
|
|
182
|
-
async handlePost(path, request, ctx, serviceConfig, env) {
|
|
183
|
-
return new Response(JSON.stringify({
|
|
184
|
-
message: 'POST handler not implemented',
|
|
185
|
-
path,
|
|
186
|
-
service: serviceConfig.name,
|
|
187
|
-
timestamp: new Date().toISOString()
|
|
188
|
-
}), {
|
|
189
|
-
headers: { 'Content-Type': 'application/json' }
|
|
190
|
-
});
|
|
191
|
-
},
|
|
192
|
-
|
|
193
|
-
async handlePut(path, request, ctx, serviceConfig, env) {
|
|
194
|
-
return new Response(JSON.stringify({
|
|
195
|
-
message: 'PUT handler not implemented',
|
|
196
|
-
path,
|
|
197
|
-
service: serviceConfig.name,
|
|
198
|
-
timestamp: new Date().toISOString()
|
|
199
|
-
}), {
|
|
200
|
-
headers: { 'Content-Type': 'application/json' }
|
|
201
|
-
});
|
|
202
|
-
},
|
|
203
|
-
|
|
204
|
-
async handleDelete(path, request, ctx, serviceConfig, env) {
|
|
205
|
-
return new Response(JSON.stringify({
|
|
206
|
-
message: 'DELETE handler not implemented',
|
|
207
|
-
path,
|
|
208
|
-
service: serviceConfig.name,
|
|
209
|
-
timestamp: new Date().toISOString()
|
|
210
|
-
}), {
|
|
211
|
-
headers: { 'Content-Type': 'application/json' }
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
};
|
|
215
|
-
}
|
|
216
|
-
`;
|
|
217
|
-
const filePath = join(servicePath, 'src', 'handlers', 'service-handlers.js');
|
|
218
|
-
|
|
219
|
-
// Ensure directory exists
|
|
220
|
-
const dir = join(servicePath, 'src', 'handlers');
|
|
221
|
-
mkdirSync(dir, {
|
|
222
|
-
recursive: true
|
|
223
|
-
});
|
|
224
|
-
writeFileSync(filePath, handlersContent, 'utf8');
|
|
225
|
-
this.logger.info(`Generated: ${filePath}`);
|
|
226
|
-
return filePath;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* Determine if generator should run
|
|
231
|
-
*/
|
|
232
|
-
shouldGenerate(context) {
|
|
233
|
-
return true; // Always generate handlers
|
|
234
|
-
}
|
|
235
|
-
}
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import { BaseGenerator } from '../BaseGenerator.js';
|
|
2
|
-
import { join } from 'path';
|
|
3
|
-
import { mkdirSync, writeFileSync } from 'fs';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Service Middleware Generator
|
|
7
|
-
* Generates middleware functions for request/response processing
|
|
8
|
-
*/
|
|
9
|
-
export class ServiceMiddlewareGenerator extends BaseGenerator {
|
|
10
|
-
/**
|
|
11
|
-
* Generate service middleware
|
|
12
|
-
* @param {Object} context - Generation context
|
|
13
|
-
* @returns {Promise<string>} Path to generated middleware file
|
|
14
|
-
*/
|
|
15
|
-
async generate(context) {
|
|
16
|
-
const {
|
|
17
|
-
coreInputs,
|
|
18
|
-
confirmedValues,
|
|
19
|
-
servicePath
|
|
20
|
-
} = this.extractContext(context);
|
|
21
|
-
if (!this.shouldGenerate(context)) {
|
|
22
|
-
return null;
|
|
23
|
-
}
|
|
24
|
-
const middlewareContent = `/**
|
|
25
|
-
* ${confirmedValues.displayName} - Service Middleware
|
|
26
|
-
*
|
|
27
|
-
* Generated by Clodo Framework GenerationEngine
|
|
28
|
-
* Service Type: ${coreInputs.serviceType}
|
|
29
|
-
*/
|
|
30
|
-
|
|
31
|
-
export function createServiceMiddleware(serviceConfig, env) {
|
|
32
|
-
return {
|
|
33
|
-
async processRequest(request) {
|
|
34
|
-
let processedRequest = request;
|
|
35
|
-
|
|
36
|
-
// Add service context headers
|
|
37
|
-
const headers = new Headers(request.headers);
|
|
38
|
-
headers.set('X-Service', serviceConfig.name);
|
|
39
|
-
headers.set('X-Version', '${confirmedValues.version}');
|
|
40
|
-
headers.set('X-Environment', '${coreInputs.environment}');
|
|
41
|
-
headers.set('X-Request-ID', crypto.randomUUID());
|
|
42
|
-
|
|
43
|
-
// CORS headers for API requests
|
|
44
|
-
if (request.url.includes('${confirmedValues.apiBasePath}')) {
|
|
45
|
-
headers.set('Access-Control-Allow-Origin', '*');
|
|
46
|
-
headers.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
|
|
47
|
-
headers.set('Access-Control-Allow-Headers', 'Content-Type, Authorization');
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
${confirmedValues.features.logging ? `
|
|
51
|
-
// Request logging
|
|
52
|
-
console.log(\`[\${new Date().toISOString()}] \${request.method} \${request.url}\`);` : ''}
|
|
53
|
-
|
|
54
|
-
${confirmedValues.features.rateLimiting ? `
|
|
55
|
-
// Rate limiting (placeholder - implement based on requirements)
|
|
56
|
-
// This would typically check request frequency and block if over limit` : ''}
|
|
57
|
-
|
|
58
|
-
${confirmedValues.features.authentication ? `
|
|
59
|
-
// Authentication middleware (placeholder)
|
|
60
|
-
// This would validate JWT tokens, API keys, etc.` : ''}
|
|
61
|
-
|
|
62
|
-
${confirmedValues.features.authorization ? `
|
|
63
|
-
// Authorization middleware (placeholder)
|
|
64
|
-
// This would check user permissions and roles` : ''}
|
|
65
|
-
|
|
66
|
-
return new Request(request.url, {
|
|
67
|
-
...request,
|
|
68
|
-
headers
|
|
69
|
-
});
|
|
70
|
-
},
|
|
71
|
-
|
|
72
|
-
async processResponse(response) {
|
|
73
|
-
const headers = new Headers(response.headers);
|
|
74
|
-
|
|
75
|
-
// Add standard response headers
|
|
76
|
-
headers.set('X-Service', serviceConfig.name);
|
|
77
|
-
headers.set('X-Version', '${confirmedValues.version}');
|
|
78
|
-
headers.set('X-Response-Time', Date.now().toString());
|
|
79
|
-
|
|
80
|
-
${confirmedValues.features.monitoring ? `
|
|
81
|
-
// Response monitoring
|
|
82
|
-
console.log(\`Response: \${response.status} (\${Date.now()}ms)\`);` : ''}
|
|
83
|
-
|
|
84
|
-
${confirmedValues.features.caching ? `
|
|
85
|
-
// Cache headers (placeholder - implement based on content type)
|
|
86
|
-
if (response.status === 200) {
|
|
87
|
-
headers.set('Cache-Control', 'public, max-age=300'); // 5 minutes
|
|
88
|
-
}` : ''}
|
|
89
|
-
|
|
90
|
-
return new Response(response.body, {
|
|
91
|
-
...response,
|
|
92
|
-
headers
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
`;
|
|
98
|
-
const filePath = join(servicePath, 'src', 'middleware', 'service-middleware.js');
|
|
99
|
-
|
|
100
|
-
// Ensure directory exists
|
|
101
|
-
const dir = join(servicePath, 'src', 'middleware');
|
|
102
|
-
mkdirSync(dir, {
|
|
103
|
-
recursive: true
|
|
104
|
-
});
|
|
105
|
-
writeFileSync(filePath, middlewareContent, 'utf8');
|
|
106
|
-
this.logger.info(`Generated: ${filePath}`);
|
|
107
|
-
return filePath;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Determine if generator should run
|
|
112
|
-
*/
|
|
113
|
-
shouldGenerate(context) {
|
|
114
|
-
return true; // Always generate middleware
|
|
115
|
-
}
|
|
116
|
-
}
|
|
@@ -1,246 +0,0 @@
|
|
|
1
|
-
import { BaseGenerator } from '../BaseGenerator.js';
|
|
2
|
-
import { join } from 'path';
|
|
3
|
-
import { mkdirSync, writeFileSync } from 'fs';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Service Utils Generator
|
|
7
|
-
* Generates utility classes for database, validation, responses, logging, and features
|
|
8
|
-
*/
|
|
9
|
-
export class ServiceUtilsGenerator extends BaseGenerator {
|
|
10
|
-
/**
|
|
11
|
-
* Generate service utilities
|
|
12
|
-
* @param {Object} context - Generation context
|
|
13
|
-
* @returns {Promise<string>} Path to generated utils file
|
|
14
|
-
*/
|
|
15
|
-
async generate(context) {
|
|
16
|
-
const {
|
|
17
|
-
coreInputs,
|
|
18
|
-
confirmedValues,
|
|
19
|
-
servicePath
|
|
20
|
-
} = this.extractContext(context);
|
|
21
|
-
if (!this.shouldGenerate(context)) {
|
|
22
|
-
return null;
|
|
23
|
-
}
|
|
24
|
-
const utilsContent = `/**
|
|
25
|
-
* ${confirmedValues.displayName} - Service Utilities
|
|
26
|
-
*
|
|
27
|
-
* Generated by Clodo Framework GenerationEngine
|
|
28
|
-
* Service Type: ${coreInputs.serviceType}
|
|
29
|
-
*/
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Utility functions for ${confirmedValues.displayName}
|
|
33
|
-
*/
|
|
34
|
-
|
|
35
|
-
// Database utilities
|
|
36
|
-
export class DatabaseUtils {
|
|
37
|
-
static async executeQuery(env, query, params = []) {
|
|
38
|
-
try {
|
|
39
|
-
const stmt = env.DB.prepare(query);
|
|
40
|
-
if (params.length > 0) {
|
|
41
|
-
return await stmt.bind(...params).all();
|
|
42
|
-
}
|
|
43
|
-
return await stmt.all();
|
|
44
|
-
} catch (error) {
|
|
45
|
-
console.error('Database query error:', error);
|
|
46
|
-
throw new Error(\`Database operation failed: \${error.message}\`);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
static async getById(env, table, id) {
|
|
51
|
-
const result = await this.executeQuery(
|
|
52
|
-
env,
|
|
53
|
-
\`SELECT * FROM \${table} WHERE id = ?\`,
|
|
54
|
-
[id]
|
|
55
|
-
);
|
|
56
|
-
return result.results[0] || null;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
static async create(env, table, data) {
|
|
60
|
-
const columns = Object.keys(data).join(', ');
|
|
61
|
-
const placeholders = Object.keys(data).map(() => '?').join(', ');
|
|
62
|
-
const values = Object.values(data);
|
|
63
|
-
|
|
64
|
-
const result = await this.executeQuery(
|
|
65
|
-
env,
|
|
66
|
-
\`INSERT INTO \${table} (\${columns}) VALUES (\${placeholders})\`,
|
|
67
|
-
values
|
|
68
|
-
);
|
|
69
|
-
|
|
70
|
-
return result.meta.last_row_id;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
static async update(env, table, id, data) {
|
|
74
|
-
const setClause = Object.keys(data).map(key => \`\${key} = ?\`).join(', ');
|
|
75
|
-
const values = [...Object.values(data), id];
|
|
76
|
-
|
|
77
|
-
const result = await this.executeQuery(
|
|
78
|
-
env,
|
|
79
|
-
\`UPDATE \${table} SET \${setClause} WHERE id = ?\`,
|
|
80
|
-
values
|
|
81
|
-
);
|
|
82
|
-
|
|
83
|
-
return result.meta.changes > 0;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
static async delete(env, table, id) {
|
|
87
|
-
const result = await this.executeQuery(
|
|
88
|
-
env,
|
|
89
|
-
\`DELETE FROM \${table} WHERE id = ?\`,
|
|
90
|
-
[id]
|
|
91
|
-
);
|
|
92
|
-
|
|
93
|
-
return result.meta.changes > 0;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// Validation utilities
|
|
98
|
-
export class ValidationUtils {
|
|
99
|
-
static isValidUUID(uuid) {
|
|
100
|
-
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
101
|
-
return uuidRegex.test(uuid);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
static isValidEmail(email) {
|
|
105
|
-
const emailRegex = /^[^@]+@[^@]+.[^@]+$/;
|
|
106
|
-
return emailRegex.test(email);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
static sanitizeString(str, maxLength = 1000) {
|
|
110
|
-
if (typeof str !== 'string') return '';
|
|
111
|
-
return str.trim().substring(0, maxLength);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
static validatePagination(limit = 20, offset = 0) {
|
|
115
|
-
const maxLimit = 100;
|
|
116
|
-
const sanitizedLimit = Math.min(Math.max(1, limit), maxLimit);
|
|
117
|
-
const sanitizedOffset = Math.max(0, offset);
|
|
118
|
-
|
|
119
|
-
return { limit: sanitizedLimit, offset: sanitizedOffset };
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// Response utilities
|
|
124
|
-
export class ResponseUtils {
|
|
125
|
-
static createSuccessResponse(data, status = 200) {
|
|
126
|
-
return new Response(JSON.stringify({
|
|
127
|
-
success: true,
|
|
128
|
-
data,
|
|
129
|
-
timestamp: new Date().toISOString()
|
|
130
|
-
}), {
|
|
131
|
-
status,
|
|
132
|
-
headers: { 'Content-Type': 'application/json' }
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
static createErrorResponse(error, status = 500, details = null) {
|
|
137
|
-
const errorResponse = {
|
|
138
|
-
success: false,
|
|
139
|
-
error: error.message || 'Internal Server Error',
|
|
140
|
-
timestamp: new Date().toISOString()
|
|
141
|
-
};
|
|
142
|
-
|
|
143
|
-
if (details) {
|
|
144
|
-
errorResponse.details = details;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
return new Response(JSON.stringify(errorResponse), {
|
|
148
|
-
status,
|
|
149
|
-
headers: { 'Content-Type': 'application/json' }
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
static createPaginatedResponse(data, pagination, status = 200) {
|
|
154
|
-
return new Response(JSON.stringify({
|
|
155
|
-
success: true,
|
|
156
|
-
data,
|
|
157
|
-
pagination: {
|
|
158
|
-
...pagination,
|
|
159
|
-
hasMore: data.length === pagination.limit
|
|
160
|
-
},
|
|
161
|
-
timestamp: new Date().toISOString()
|
|
162
|
-
}), {
|
|
163
|
-
status,
|
|
164
|
-
headers: { 'Content-Type': 'application/json' }
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// Logging utilities
|
|
170
|
-
export class LoggingUtils {
|
|
171
|
-
static logRequest(request, context = {}) {
|
|
172
|
-
console.log(JSON.stringify({
|
|
173
|
-
timestamp: new Date().toISOString(),
|
|
174
|
-
level: 'info',
|
|
175
|
-
type: 'request',
|
|
176
|
-
method: request.method,
|
|
177
|
-
url: request.url,
|
|
178
|
-
userAgent: request.headers.get('User-Agent'),
|
|
179
|
-
...context
|
|
180
|
-
}));
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
static logError(error, context = {}) {
|
|
184
|
-
console.error(JSON.stringify({
|
|
185
|
-
timestamp: new Date().toISOString(),
|
|
186
|
-
level: 'error',
|
|
187
|
-
type: 'error',
|
|
188
|
-
message: error.message,
|
|
189
|
-
stack: error.stack,
|
|
190
|
-
...context
|
|
191
|
-
}));
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
static logPerformance(operation, startTime, context = {}) {
|
|
195
|
-
const duration = Date.now() - startTime;
|
|
196
|
-
console.log(JSON.stringify({
|
|
197
|
-
timestamp: new Date().toISOString(),
|
|
198
|
-
level: 'info',
|
|
199
|
-
type: 'performance',
|
|
200
|
-
operation,
|
|
201
|
-
duration,
|
|
202
|
-
...context
|
|
203
|
-
}));
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
// Feature flag utilities
|
|
208
|
-
export class FeatureUtils {
|
|
209
|
-
static isFeatureEnabled(featureName, serviceConfig) {
|
|
210
|
-
return serviceConfig.features && serviceConfig.features[featureName] === true;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
static getEnabledFeatures(serviceConfig) {
|
|
214
|
-
if (!serviceConfig.features) return [];
|
|
215
|
-
return Object.entries(serviceConfig.features)
|
|
216
|
-
.filter(([, enabled]) => enabled)
|
|
217
|
-
.map(([feature]) => feature);
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
static getDisabledFeatures(serviceConfig) {
|
|
221
|
-
if (!serviceConfig.features) return [];
|
|
222
|
-
return Object.entries(serviceConfig.features)
|
|
223
|
-
.filter(([, enabled]) => !enabled)
|
|
224
|
-
.map(([feature]) => feature);
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
`;
|
|
228
|
-
const filePath = join(servicePath, 'src', 'utils', 'service-utils.js');
|
|
229
|
-
|
|
230
|
-
// Ensure directory exists
|
|
231
|
-
const dir = join(servicePath, 'src', 'utils');
|
|
232
|
-
mkdirSync(dir, {
|
|
233
|
-
recursive: true
|
|
234
|
-
});
|
|
235
|
-
writeFileSync(filePath, utilsContent, 'utf8');
|
|
236
|
-
this.logger.info(`Generated: ${filePath}`);
|
|
237
|
-
return filePath;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
/**
|
|
241
|
-
* Determine if generator should run
|
|
242
|
-
*/
|
|
243
|
-
shouldGenerate(context) {
|
|
244
|
-
return true; // Always generate utils
|
|
245
|
-
}
|
|
246
|
-
}
|