@tamyla/clodo-framework 1.0.0
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 +564 -0
- package/LICENSE +21 -0
- package/README.md +1393 -0
- package/bin/README.md +71 -0
- package/bin/clodo-service.js +416 -0
- package/bin/security/security-cli.js +96 -0
- package/bin/service-management/README.md +74 -0
- package/bin/service-management/create-service.js +129 -0
- package/bin/service-management/init-service.js +102 -0
- package/bin/service-management/init-service.js.backup +889 -0
- package/bin/shared/config/customer-cli.js +293 -0
- package/dist/config/ConfigurationManager.js +159 -0
- package/dist/config/CustomerConfigCLI.js +220 -0
- package/dist/config/FeatureManager.js +426 -0
- package/dist/config/customers.js +441 -0
- package/dist/config/domains.js +180 -0
- package/dist/config/features.js +225 -0
- package/dist/config/index.js +6 -0
- package/dist/database/database-orchestrator.js +730 -0
- package/dist/database/index.js +4 -0
- package/dist/deployment/auditor.js +971 -0
- package/dist/deployment/index.js +10 -0
- package/dist/deployment/rollback-manager.js +523 -0
- package/dist/deployment/testers/api-tester.js +80 -0
- package/dist/deployment/testers/auth-tester.js +129 -0
- package/dist/deployment/testers/core.js +217 -0
- package/dist/deployment/testers/database-tester.js +105 -0
- package/dist/deployment/testers/index.js +74 -0
- package/dist/deployment/testers/load-tester.js +120 -0
- package/dist/deployment/testers/performance-tester.js +105 -0
- package/dist/deployment/validator.js +558 -0
- package/dist/deployment/wrangler-deployer.js +574 -0
- package/dist/handlers/GenericRouteHandler.js +532 -0
- package/dist/index.js +39 -0
- package/dist/migration/MigrationAdapters.js +562 -0
- package/dist/modules/ModuleManager.js +668 -0
- package/dist/modules/security.js +98 -0
- package/dist/orchestration/cross-domain-coordinator.js +1083 -0
- package/dist/orchestration/index.js +5 -0
- package/dist/orchestration/modules/DeploymentCoordinator.js +258 -0
- package/dist/orchestration/modules/DomainResolver.js +196 -0
- package/dist/orchestration/modules/StateManager.js +332 -0
- package/dist/orchestration/multi-domain-orchestrator.js +255 -0
- package/dist/routing/EnhancedRouter.js +158 -0
- package/dist/schema/SchemaManager.js +778 -0
- package/dist/security/ConfigurationValidator.js +490 -0
- package/dist/security/DeploymentManager.js +208 -0
- package/dist/security/SecretGenerator.js +142 -0
- package/dist/security/SecurityCLI.js +228 -0
- package/dist/security/index.js +51 -0
- package/dist/security/patterns/environment-rules.js +66 -0
- package/dist/security/patterns/insecure-patterns.js +21 -0
- package/dist/service-management/ConfirmationEngine.js +411 -0
- package/dist/service-management/ErrorTracker.js +294 -0
- package/dist/service-management/GenerationEngine.js +3109 -0
- package/dist/service-management/InputCollector.js +237 -0
- package/dist/service-management/ServiceCreator.js +229 -0
- package/dist/service-management/ServiceInitializer.js +448 -0
- package/dist/service-management/ServiceOrchestrator.js +638 -0
- package/dist/service-management/handlers/ConfigMutator.js +130 -0
- package/dist/service-management/handlers/ConfirmationHandler.js +71 -0
- package/dist/service-management/handlers/GenerationHandler.js +80 -0
- package/dist/service-management/handlers/InputHandler.js +59 -0
- package/dist/service-management/handlers/ValidationHandler.js +203 -0
- package/dist/service-management/index.js +7 -0
- package/dist/services/GenericDataService.js +488 -0
- package/dist/shared/cloudflare/domain-discovery.js +562 -0
- package/dist/shared/cloudflare/domain-manager.js +912 -0
- package/dist/shared/cloudflare/index.js +8 -0
- package/dist/shared/cloudflare/ops.js +387 -0
- package/dist/shared/config/cache.js +1167 -0
- package/dist/shared/config/command-config-manager.js +174 -0
- package/dist/shared/config/customer-cli.js +258 -0
- package/dist/shared/config/index.js +9 -0
- package/dist/shared/config/manager.js +289 -0
- package/dist/shared/database/connection-manager.js +338 -0
- package/dist/shared/database/index.js +7 -0
- package/dist/shared/database/orchestrator.js +632 -0
- package/dist/shared/deployment/auditor.js +971 -0
- package/dist/shared/deployment/index.js +10 -0
- package/dist/shared/deployment/rollback-manager.js +523 -0
- package/dist/shared/deployment/validator.js +558 -0
- package/dist/shared/index.js +32 -0
- package/dist/shared/monitoring/health-checker.js +250 -0
- package/dist/shared/monitoring/index.js +8 -0
- package/dist/shared/monitoring/memory-manager.js +382 -0
- package/dist/shared/monitoring/production-monitor.js +390 -0
- package/dist/shared/production-tester/api-tester.js +80 -0
- package/dist/shared/production-tester/auth-tester.js +129 -0
- package/dist/shared/production-tester/core.js +217 -0
- package/dist/shared/production-tester/database-tester.js +105 -0
- package/dist/shared/production-tester/index.js +74 -0
- package/dist/shared/production-tester/load-tester.js +120 -0
- package/dist/shared/production-tester/performance-tester.js +105 -0
- package/dist/shared/security/api-token-manager.js +296 -0
- package/dist/shared/security/index.js +8 -0
- package/dist/shared/security/secret-generator.js +918 -0
- package/dist/shared/security/secure-token-manager.js +379 -0
- package/dist/shared/utils/error-recovery.js +240 -0
- package/dist/shared/utils/graceful-shutdown-manager.js +380 -0
- package/dist/shared/utils/index.js +9 -0
- package/dist/shared/utils/interactive-prompts.js +134 -0
- package/dist/shared/utils/rate-limiter.js +249 -0
- package/dist/utils/ErrorHandler.js +173 -0
- package/dist/utils/deployment/config-cache.js +1160 -0
- package/dist/utils/deployment/index.js +6 -0
- package/dist/utils/deployment/interactive-prompts.js +97 -0
- package/dist/utils/deployment/secret-generator.js +896 -0
- package/dist/utils/dirname-helper.js +35 -0
- package/dist/utils/domain-config.js +159 -0
- package/dist/utils/error-recovery.js +240 -0
- package/dist/utils/esm-helper.js +52 -0
- package/dist/utils/framework-config.js +481 -0
- package/dist/utils/graceful-shutdown-manager.js +379 -0
- package/dist/utils/health-checker.js +114 -0
- package/dist/utils/index.js +36 -0
- package/dist/utils/prompt-handler.js +98 -0
- package/dist/utils/usage-tracker.js +252 -0
- package/dist/utils/validation.js +112 -0
- package/dist/version/VersionDetector.js +723 -0
- package/dist/worker/index.js +4 -0
- package/dist/worker/integration.js +332 -0
- package/docs/FRAMEWORK-ARCHITECTURE-OVERVIEW.md +206 -0
- package/docs/INTEGRATION_GUIDE.md +2045 -0
- package/docs/README.md +82 -0
- package/docs/SECURITY.md +242 -0
- package/docs/deployment/deployment-guide.md +540 -0
- package/docs/overview.md +280 -0
- package/package.json +176 -0
- package/types/index.d.ts +575 -0
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { createLogger } from '../utils/index.js';
|
|
2
|
+
const logger = createLogger('FeatureFlags');
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Feature Flag Manager Class
|
|
6
|
+
* Manages feature flags for domain-specific functionality
|
|
7
|
+
*/
|
|
8
|
+
export class FeatureFlagManager {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.currentDomain = null;
|
|
11
|
+
this.globalOverrides = new Map();
|
|
12
|
+
this.listeners = new Set();
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Sets the current domain configuration
|
|
17
|
+
* @param {Object} domainConfig - Domain configuration object
|
|
18
|
+
*/
|
|
19
|
+
setDomain(domainConfig) {
|
|
20
|
+
if (!domainConfig) {
|
|
21
|
+
throw new Error('Domain configuration is required');
|
|
22
|
+
}
|
|
23
|
+
this.currentDomain = domainConfig;
|
|
24
|
+
logger.info(`Domain set for feature flags: ${domainConfig.name}`);
|
|
25
|
+
|
|
26
|
+
// Notify listeners of domain change
|
|
27
|
+
this._notifyListeners('domainChanged', {
|
|
28
|
+
domain: domainConfig.name
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Checks if a feature is enabled
|
|
34
|
+
* @param {string} featureName - Name of the feature to check
|
|
35
|
+
* @param {boolean} defaultValue - Default value if feature not configured
|
|
36
|
+
* @returns {boolean} Whether the feature is enabled
|
|
37
|
+
*/
|
|
38
|
+
isEnabled(featureName, defaultValue = false) {
|
|
39
|
+
if (!this.currentDomain) {
|
|
40
|
+
logger.warn('No domain set, using default value for feature check');
|
|
41
|
+
return defaultValue;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Check global overrides first
|
|
45
|
+
if (this.globalOverrides.has(featureName)) {
|
|
46
|
+
return this.globalOverrides.get(featureName);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Check domain-specific features
|
|
50
|
+
const features = this.currentDomain.features || {};
|
|
51
|
+
const enabled = features[featureName] ?? defaultValue;
|
|
52
|
+
logger.debug(`Feature ${featureName}: ${enabled ? 'enabled' : 'disabled'}`);
|
|
53
|
+
return enabled;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Gets all enabled features for current domain
|
|
58
|
+
* @returns {string[]} Array of enabled feature names
|
|
59
|
+
*/
|
|
60
|
+
getEnabledFeatures() {
|
|
61
|
+
if (!this.currentDomain?.features) {
|
|
62
|
+
return [];
|
|
63
|
+
}
|
|
64
|
+
return Object.entries(this.currentDomain.features).filter(([, enabled]) => enabled === true).map(([feature]) => feature);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Gets all disabled features for current domain
|
|
69
|
+
* @returns {string[]} Array of disabled feature names
|
|
70
|
+
*/
|
|
71
|
+
getDisabledFeatures() {
|
|
72
|
+
if (!this.currentDomain?.features) {
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
return Object.entries(this.currentDomain.features).filter(([, enabled]) => enabled === false).map(([feature]) => feature);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Gets all configured features with their status
|
|
80
|
+
* @returns {Object} Object mapping feature names to enabled status
|
|
81
|
+
*/
|
|
82
|
+
getAllFeatures() {
|
|
83
|
+
return this.currentDomain?.features || {};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Sets a global feature override
|
|
88
|
+
* @param {string} featureName - Name of the feature
|
|
89
|
+
* @param {boolean} enabled - Whether to enable the feature
|
|
90
|
+
*/
|
|
91
|
+
setGlobalOverride(featureName, enabled) {
|
|
92
|
+
this.globalOverrides.set(featureName, enabled);
|
|
93
|
+
logger.info(`Global override set: ${featureName} = ${enabled}`);
|
|
94
|
+
this._notifyListeners('overrideChanged', {
|
|
95
|
+
feature: featureName,
|
|
96
|
+
enabled
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Removes a global feature override
|
|
102
|
+
* @param {string} featureName - Name of the feature
|
|
103
|
+
*/
|
|
104
|
+
removeGlobalOverride(featureName) {
|
|
105
|
+
const hadOverride = this.globalOverrides.has(featureName);
|
|
106
|
+
this.globalOverrides.delete(featureName);
|
|
107
|
+
if (hadOverride) {
|
|
108
|
+
logger.info(`Global override removed: ${featureName}`);
|
|
109
|
+
this._notifyListeners('overrideChanged', {
|
|
110
|
+
feature: featureName,
|
|
111
|
+
removed: true
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Clears all global overrides
|
|
118
|
+
*/
|
|
119
|
+
clearGlobalOverrides() {
|
|
120
|
+
const count = this.globalOverrides.size;
|
|
121
|
+
this.globalOverrides.clear();
|
|
122
|
+
if (count > 0) {
|
|
123
|
+
logger.info(`Cleared ${count} global overrides`);
|
|
124
|
+
this._notifyListeners('overridesCleared', {
|
|
125
|
+
count
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Adds a listener for feature flag changes
|
|
132
|
+
* @param {Function} listener - Callback function
|
|
133
|
+
*/
|
|
134
|
+
addListener(listener) {
|
|
135
|
+
this.listeners.add(listener);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Removes a listener
|
|
140
|
+
* @param {Function} listener - Callback function to remove
|
|
141
|
+
*/
|
|
142
|
+
removeListener(listener) {
|
|
143
|
+
this.listeners.delete(listener);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Gets feature flag status with metadata
|
|
148
|
+
* @param {string} featureName - Name of the feature
|
|
149
|
+
* @returns {Object} Feature status information
|
|
150
|
+
*/
|
|
151
|
+
getFeatureInfo(featureName) {
|
|
152
|
+
const domainEnabled = this.currentDomain?.features?.[featureName] ?? null;
|
|
153
|
+
const globalOverride = this.globalOverrides.get(featureName);
|
|
154
|
+
const effectiveEnabled = this.isEnabled(featureName);
|
|
155
|
+
return {
|
|
156
|
+
name: featureName,
|
|
157
|
+
domainEnabled,
|
|
158
|
+
globalOverride,
|
|
159
|
+
effectiveEnabled,
|
|
160
|
+
hasOverride: globalOverride !== undefined,
|
|
161
|
+
domain: this.currentDomain?.name
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Creates a feature toggle function
|
|
167
|
+
* @param {string} featureName - Name of the feature
|
|
168
|
+
* @param {Function} enabledHandler - Function to call when enabled
|
|
169
|
+
* @param {Function} disabledHandler - Function to call when disabled
|
|
170
|
+
* @returns {Function} Toggle function
|
|
171
|
+
*/
|
|
172
|
+
createToggle(featureName, enabledHandler, disabledHandler) {
|
|
173
|
+
return (...args) => {
|
|
174
|
+
if (this.isEnabled(featureName)) {
|
|
175
|
+
return enabledHandler?.(...args);
|
|
176
|
+
} else {
|
|
177
|
+
return disabledHandler?.(...args);
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Notifies all listeners of changes
|
|
184
|
+
* @private
|
|
185
|
+
*/
|
|
186
|
+
_notifyListeners(event, data) {
|
|
187
|
+
this.listeners.forEach(listener => {
|
|
188
|
+
try {
|
|
189
|
+
listener(event, data);
|
|
190
|
+
} catch (error) {
|
|
191
|
+
logger.error(`Error in feature flag listener: ${error.message}`);
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Default singleton instance
|
|
198
|
+
export const featureManager = new FeatureFlagManager();
|
|
199
|
+
|
|
200
|
+
// Convenience functions for common operations
|
|
201
|
+
export const isFeatureEnabled = (featureName, defaultValue = false) => featureManager.isEnabled(featureName, defaultValue);
|
|
202
|
+
export const getEnabledFeatures = () => featureManager.getEnabledFeatures();
|
|
203
|
+
export const setFeatureOverride = (featureName, enabled) => featureManager.setGlobalOverride(featureName, enabled);
|
|
204
|
+
|
|
205
|
+
// Feature flag constants for common features
|
|
206
|
+
export const COMMON_FEATURES = {
|
|
207
|
+
AUTHENTICATION: 'authentication',
|
|
208
|
+
AUTHORIZATION: 'authorization',
|
|
209
|
+
LOGGING: 'logging',
|
|
210
|
+
MONITORING: 'monitoring',
|
|
211
|
+
ANALYTICS: 'analytics',
|
|
212
|
+
CACHING: 'caching',
|
|
213
|
+
RATE_LIMITING: 'rateLimiting',
|
|
214
|
+
FILE_STORAGE: 'fileStorage',
|
|
215
|
+
EMAIL_NOTIFICATIONS: 'emailNotifications',
|
|
216
|
+
PUSH_NOTIFICATIONS: 'pushNotifications',
|
|
217
|
+
SEARCH: 'search',
|
|
218
|
+
FILTERING: 'filtering',
|
|
219
|
+
SORTING: 'sorting',
|
|
220
|
+
PAGINATION: 'pagination',
|
|
221
|
+
EXPORT: 'export',
|
|
222
|
+
IMPORT: 'import',
|
|
223
|
+
BACKUP: 'backup',
|
|
224
|
+
RESTORE: 'restore'
|
|
225
|
+
};
|