@morojs/moro 1.5.5 → 1.5.7

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 (70) hide show
  1. package/dist/core/config/config-manager.d.ts +44 -0
  2. package/dist/core/config/config-manager.js +114 -0
  3. package/dist/core/config/config-manager.js.map +1 -0
  4. package/dist/core/config/config-sources.d.ts +21 -0
  5. package/dist/core/config/config-sources.js +314 -0
  6. package/dist/core/config/config-sources.js.map +1 -0
  7. package/dist/core/config/config-validator.d.ts +21 -0
  8. package/dist/core/config/config-validator.js +744 -0
  9. package/dist/core/config/config-validator.js.map +1 -0
  10. package/dist/core/config/file-loader.d.ts +0 -5
  11. package/dist/core/config/file-loader.js +0 -171
  12. package/dist/core/config/file-loader.js.map +1 -1
  13. package/dist/core/config/index.d.ts +39 -10
  14. package/dist/core/config/index.js +66 -29
  15. package/dist/core/config/index.js.map +1 -1
  16. package/dist/core/config/schema.js +29 -31
  17. package/dist/core/config/schema.js.map +1 -1
  18. package/dist/core/config/utils.d.ts +9 -2
  19. package/dist/core/config/utils.js +19 -32
  20. package/dist/core/config/utils.js.map +1 -1
  21. package/dist/core/framework.d.ts +4 -7
  22. package/dist/core/framework.js +38 -12
  23. package/dist/core/framework.js.map +1 -1
  24. package/dist/core/http/http-server.d.ts +12 -0
  25. package/dist/core/http/http-server.js +56 -0
  26. package/dist/core/http/http-server.js.map +1 -1
  27. package/dist/core/http/router.d.ts +12 -0
  28. package/dist/core/http/router.js +114 -36
  29. package/dist/core/http/router.js.map +1 -1
  30. package/dist/core/logger/index.d.ts +1 -1
  31. package/dist/core/logger/index.js +2 -1
  32. package/dist/core/logger/index.js.map +1 -1
  33. package/dist/core/logger/logger.d.ts +9 -1
  34. package/dist/core/logger/logger.js +36 -3
  35. package/dist/core/logger/logger.js.map +1 -1
  36. package/dist/core/routing/index.d.ts +20 -0
  37. package/dist/core/routing/index.js +109 -11
  38. package/dist/core/routing/index.js.map +1 -1
  39. package/dist/moro.d.ts +7 -20
  40. package/dist/moro.js +115 -200
  41. package/dist/moro.js.map +1 -1
  42. package/dist/types/config.d.ts +46 -2
  43. package/dist/types/core.d.ts +22 -39
  44. package/dist/types/logger.d.ts +4 -0
  45. package/package.json +1 -1
  46. package/src/core/config/config-manager.ts +133 -0
  47. package/src/core/config/config-sources.ts +384 -0
  48. package/src/core/config/config-validator.ts +1042 -0
  49. package/src/core/config/file-loader.ts +0 -233
  50. package/src/core/config/index.ts +77 -32
  51. package/src/core/config/schema.ts +29 -31
  52. package/src/core/config/utils.ts +22 -29
  53. package/src/core/framework.ts +51 -18
  54. package/src/core/http/http-server.ts +66 -0
  55. package/src/core/http/router.ts +127 -38
  56. package/src/core/logger/index.ts +1 -0
  57. package/src/core/logger/logger.ts +43 -4
  58. package/src/core/routing/index.ts +116 -12
  59. package/src/moro.ts +127 -233
  60. package/src/types/config.ts +47 -2
  61. package/src/types/core.ts +32 -43
  62. package/src/types/logger.ts +6 -0
  63. package/dist/core/config/loader.d.ts +0 -7
  64. package/dist/core/config/loader.js +0 -269
  65. package/dist/core/config/loader.js.map +0 -1
  66. package/dist/core/config/validation.d.ts +0 -17
  67. package/dist/core/config/validation.js +0 -131
  68. package/dist/core/config/validation.js.map +0 -1
  69. package/src/core/config/loader.ts +0 -633
  70. package/src/core/config/validation.ts +0 -140
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Configuration Manager - Immutable Single Source of Truth
3
+ *
4
+ * This module provides centralized, immutable configuration state management.
5
+ * Configuration is locked at createApp() initialization and cannot be changed afterward.
6
+ *
7
+ * Precedence: Environment Variables > createApp Options > Config File > Defaults
8
+ */
9
+ import { AppConfig } from '../../types/config';
10
+ /**
11
+ * Initialize and lock global configuration state
12
+ * This should only be called once during createApp() initialization
13
+ */
14
+ export declare function initializeAndLockConfig(config: AppConfig): void;
15
+ /**
16
+ * Get the current global configuration
17
+ * Throws if configuration hasn't been initialized
18
+ */
19
+ export declare function getGlobalConfig(): Readonly<AppConfig>;
20
+ /**
21
+ * Check if configuration has been initialized and locked
22
+ */
23
+ export declare function isConfigLocked(): boolean;
24
+ /**
25
+ * Reset configuration state (for testing only)
26
+ * @internal - This should only be used in tests
27
+ */
28
+ export declare function resetConfigForTesting(): void;
29
+ /**
30
+ * Get a specific configuration value using dot notation
31
+ * This provides a safe way to access nested config values
32
+ *
33
+ * @example
34
+ * getConfigValue('server.port') // Returns the server port
35
+ * getConfigValue('database.redis.url') // Returns the Redis URL
36
+ */
37
+ export declare function getConfigValue<T = any>(path: string): T | undefined;
38
+ /**
39
+ * Utility functions for common environment checks
40
+ * These now read NODE_ENV directly for consistency with Node.js ecosystem
41
+ */
42
+ export declare function isDevelopment(): boolean;
43
+ export declare function isProduction(): boolean;
44
+ export declare function isStaging(): boolean;
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ /**
3
+ * Configuration Manager - Immutable Single Source of Truth
4
+ *
5
+ * This module provides centralized, immutable configuration state management.
6
+ * Configuration is locked at createApp() initialization and cannot be changed afterward.
7
+ *
8
+ * Precedence: Environment Variables > createApp Options > Config File > Defaults
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.initializeAndLockConfig = initializeAndLockConfig;
12
+ exports.getGlobalConfig = getGlobalConfig;
13
+ exports.isConfigLocked = isConfigLocked;
14
+ exports.resetConfigForTesting = resetConfigForTesting;
15
+ exports.getConfigValue = getConfigValue;
16
+ exports.isDevelopment = isDevelopment;
17
+ exports.isProduction = isProduction;
18
+ exports.isStaging = isStaging;
19
+ const logger_1 = require("../logger");
20
+ const logger = (0, logger_1.createFrameworkLogger)('ConfigManager');
21
+ /**
22
+ * Global configuration state - immutable after initialization
23
+ */
24
+ let globalConfig = null;
25
+ let isLocked = false;
26
+ /**
27
+ * Initialize and lock global configuration state
28
+ * This should only be called once during createApp() initialization
29
+ */
30
+ function initializeAndLockConfig(config) {
31
+ if (isLocked) {
32
+ throw new Error('Configuration is already locked and cannot be changed. ' +
33
+ 'Configuration can only be set once during createApp() initialization.');
34
+ }
35
+ // Deep freeze the configuration to make it truly immutable
36
+ globalConfig = deepFreeze(config);
37
+ isLocked = true;
38
+ logger.info(`Configuration locked and initialized: ${process.env.NODE_ENV || 'development'}:${config.server.port}`);
39
+ }
40
+ /**
41
+ * Get the current global configuration
42
+ * Throws if configuration hasn't been initialized
43
+ */
44
+ function getGlobalConfig() {
45
+ if (!globalConfig || !isLocked) {
46
+ throw new Error('Configuration not initialized. Call createApp() to initialize the configuration system.');
47
+ }
48
+ return globalConfig;
49
+ }
50
+ /**
51
+ * Check if configuration has been initialized and locked
52
+ */
53
+ function isConfigLocked() {
54
+ return isLocked && globalConfig !== null;
55
+ }
56
+ /**
57
+ * Reset configuration state (for testing only)
58
+ * @internal - This should only be used in tests
59
+ */
60
+ function resetConfigForTesting() {
61
+ if (process.env.NODE_ENV !== 'test' &&
62
+ !process.env.MORO_ALLOW_CONFIG_RESET &&
63
+ !process.env.JEST_WORKER_ID) {
64
+ throw new Error('Configuration reset is only allowed in test environments. ' +
65
+ 'Set MORO_ALLOW_CONFIG_RESET=true to override this check.');
66
+ }
67
+ globalConfig = null;
68
+ isLocked = false;
69
+ logger.debug('Configuration state reset for testing');
70
+ }
71
+ /**
72
+ * Deep freeze an object to make it truly immutable
73
+ * This prevents any accidental mutations to the configuration
74
+ */
75
+ function deepFreeze(obj) {
76
+ // Get property names
77
+ const propNames = Object.getOwnPropertyNames(obj);
78
+ // Freeze properties before freezing self
79
+ for (const name of propNames) {
80
+ const value = obj[name];
81
+ if (value && typeof value === 'object') {
82
+ deepFreeze(value);
83
+ }
84
+ }
85
+ return Object.freeze(obj);
86
+ }
87
+ /**
88
+ * Get a specific configuration value using dot notation
89
+ * This provides a safe way to access nested config values
90
+ *
91
+ * @example
92
+ * getConfigValue('server.port') // Returns the server port
93
+ * getConfigValue('database.redis.url') // Returns the Redis URL
94
+ */
95
+ function getConfigValue(path) {
96
+ const config = getGlobalConfig();
97
+ return path.split('.').reduce((obj, key) => {
98
+ return obj && obj[key] !== undefined ? obj[key] : undefined;
99
+ }, config);
100
+ }
101
+ /**
102
+ * Utility functions for common environment checks
103
+ * These now read NODE_ENV directly for consistency with Node.js ecosystem
104
+ */
105
+ function isDevelopment() {
106
+ return process.env.NODE_ENV === 'development';
107
+ }
108
+ function isProduction() {
109
+ return process.env.NODE_ENV === 'production';
110
+ }
111
+ function isStaging() {
112
+ return process.env.NODE_ENV === 'staging';
113
+ }
114
+ //# sourceMappingURL=config-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../../src/core/config/config-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Configuration Sources - Load from Environment, Files, and Options
3
+ *
4
+ * This module handles loading configuration from different sources with clear precedence:
5
+ * Environment Variables > createApp Options > Config File > Schema Defaults
6
+ */
7
+ import { AppConfig } from '../../types/config';
8
+ import { MoroOptions } from '../../types/core';
9
+ /**
10
+ * Configuration source metadata for debugging
11
+ */
12
+ export interface ConfigSourceInfo {
13
+ source: 'environment' | 'createApp' | 'configFile' | 'default';
14
+ path: string;
15
+ value: any;
16
+ }
17
+ /**
18
+ * Load configuration from all sources with proper precedence
19
+ * Returns a validated, complete configuration object
20
+ */
21
+ export declare function loadConfigFromAllSources(createAppOptions?: MoroOptions): AppConfig;
@@ -0,0 +1,314 @@
1
+ "use strict";
2
+ /**
3
+ * Configuration Sources - Load from Environment, Files, and Options
4
+ *
5
+ * This module handles loading configuration from different sources with clear precedence:
6
+ * Environment Variables > createApp Options > Config File > Schema Defaults
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.loadConfigFromAllSources = loadConfigFromAllSources;
10
+ const schema_1 = require("./schema");
11
+ const file_loader_1 = require("./file-loader");
12
+ const logger_1 = require("../logger");
13
+ const config_validator_1 = require("./config-validator");
14
+ const logger = (0, logger_1.createFrameworkLogger)('ConfigSources');
15
+ /**
16
+ * Load configuration from all sources with proper precedence
17
+ * Returns a validated, complete configuration object
18
+ */
19
+ function loadConfigFromAllSources(createAppOptions) {
20
+ logger.debug('Loading configuration from all sources');
21
+ // 1. Start with schema defaults
22
+ let config = JSON.parse(JSON.stringify(schema_1.DEFAULT_CONFIG));
23
+ const sourceMap = new Map();
24
+ // Track default values
25
+ trackConfigSource(config, sourceMap, 'default', 'schema');
26
+ // 2. Load and merge config file (if exists)
27
+ try {
28
+ const fileConfig = (0, file_loader_1.loadConfigFileSync)();
29
+ if (fileConfig) {
30
+ config = deepMerge(config, fileConfig);
31
+ trackConfigSource(fileConfig, sourceMap, 'configFile', 'moro.config.js/ts');
32
+ logger.debug('Config file loaded and merged');
33
+ }
34
+ }
35
+ catch (error) {
36
+ logger.warn('Config file loading failed, continuing without it:', String(error));
37
+ }
38
+ // 3. Load and merge environment variables
39
+ const envConfig = loadEnvironmentConfig();
40
+ config = deepMerge(config, envConfig);
41
+ trackConfigSource(envConfig, sourceMap, 'environment', 'process.env');
42
+ // 4. Load and merge createApp options (highest precedence)
43
+ if (createAppOptions) {
44
+ const normalizedOptions = normalizeCreateAppOptions(createAppOptions);
45
+ config = deepMerge(config, normalizedOptions);
46
+ trackConfigSource(normalizedOptions, sourceMap, 'createApp', 'createApp()');
47
+ logger.debug('createApp options merged');
48
+ }
49
+ // 5. Validate the final configuration
50
+ const validatedConfig = (0, config_validator_1.validateConfig)(config);
51
+ // Log configuration sources for debugging
52
+ logConfigurationSources(sourceMap);
53
+ return validatedConfig;
54
+ }
55
+ /**
56
+ * Load configuration from environment variables
57
+ * Handles both standard and MORO_ prefixed variables
58
+ */
59
+ function loadEnvironmentConfig() {
60
+ const config = {};
61
+ // Server configuration
62
+ if (process.env.PORT || process.env.MORO_PORT) {
63
+ if (!config.server)
64
+ config.server = {};
65
+ config.server.port = parseInt(process.env.PORT || process.env.MORO_PORT || '3001', 10);
66
+ }
67
+ if (process.env.HOST || process.env.MORO_HOST) {
68
+ if (!config.server)
69
+ config.server = {};
70
+ config.server.host = process.env.HOST || process.env.MORO_HOST || 'localhost';
71
+ }
72
+ if (process.env.MAX_CONNECTIONS || process.env.MORO_MAX_CONNECTIONS) {
73
+ if (!config.server)
74
+ config.server = {};
75
+ config.server.maxConnections = parseInt(process.env.MAX_CONNECTIONS || process.env.MORO_MAX_CONNECTIONS || '1000', 10);
76
+ }
77
+ if (process.env.REQUEST_TIMEOUT || process.env.MORO_TIMEOUT) {
78
+ if (!config.server)
79
+ config.server = {};
80
+ config.server.timeout = parseInt(process.env.REQUEST_TIMEOUT || process.env.MORO_TIMEOUT || '30000', 10);
81
+ }
82
+ // Database configuration
83
+ if (process.env.DATABASE_URL || process.env.MORO_DATABASE_URL) {
84
+ if (!config.database)
85
+ config.database = {};
86
+ config.database.url = process.env.DATABASE_URL || process.env.MORO_DATABASE_URL;
87
+ }
88
+ // Redis configuration
89
+ if (process.env.REDIS_URL || process.env.MORO_REDIS_URL) {
90
+ if (!config.database)
91
+ config.database = {};
92
+ if (!config.database.redis)
93
+ config.database.redis = {};
94
+ config.database.redis.url =
95
+ process.env.REDIS_URL || process.env.MORO_REDIS_URL || 'redis://localhost:6379';
96
+ config.database.redis.maxRetries = parseInt(process.env.REDIS_MAX_RETRIES || process.env.MORO_REDIS_MAX_RETRIES || '3', 10);
97
+ config.database.redis.retryDelay = parseInt(process.env.REDIS_RETRY_DELAY || process.env.MORO_REDIS_RETRY_DELAY || '1000', 10);
98
+ config.database.redis.keyPrefix =
99
+ process.env.REDIS_KEY_PREFIX || process.env.MORO_REDIS_KEY_PREFIX || 'moro:';
100
+ }
101
+ // MySQL configuration - only include if MYSQL_HOST is set
102
+ if (process.env.MYSQL_HOST || process.env.MORO_MYSQL_HOST) {
103
+ if (!config.database)
104
+ config.database = {};
105
+ config.database.mysql = {
106
+ host: process.env.MYSQL_HOST || process.env.MORO_MYSQL_HOST || 'localhost',
107
+ port: parseInt(process.env.MYSQL_PORT || process.env.MORO_MYSQL_PORT || '3306', 10),
108
+ database: process.env.MYSQL_DATABASE || process.env.MORO_MYSQL_DB,
109
+ username: process.env.MYSQL_USERNAME || process.env.MORO_MYSQL_USER,
110
+ password: process.env.MYSQL_PASSWORD || process.env.MORO_MYSQL_PASS,
111
+ connectionLimit: parseInt(process.env.MYSQL_CONNECTION_LIMIT || process.env.MORO_MYSQL_CONNECTIONS || '10', 10),
112
+ acquireTimeout: parseInt(process.env.MYSQL_ACQUIRE_TIMEOUT || process.env.MORO_MYSQL_ACQUIRE || '60000', 10),
113
+ timeout: parseInt(process.env.MYSQL_TIMEOUT || process.env.MORO_MYSQL_TIMEOUT || '60000', 10),
114
+ };
115
+ }
116
+ // Logging configuration
117
+ if (process.env.LOG_LEVEL || process.env.MORO_LOG_LEVEL) {
118
+ const level = process.env.LOG_LEVEL || process.env.MORO_LOG_LEVEL;
119
+ if (level === 'debug' ||
120
+ level === 'info' ||
121
+ level === 'warn' ||
122
+ level === 'error' ||
123
+ level === 'fatal') {
124
+ if (!config.logging)
125
+ config.logging = {};
126
+ config.logging.level = level;
127
+ }
128
+ }
129
+ // External services - only include if configured
130
+ const externalConfig = {};
131
+ // Stripe
132
+ if (process.env.STRIPE_SECRET_KEY || process.env.MORO_STRIPE_SECRET) {
133
+ externalConfig.stripe = {
134
+ secretKey: process.env.STRIPE_SECRET_KEY || process.env.MORO_STRIPE_SECRET,
135
+ publishableKey: process.env.STRIPE_PUBLISHABLE_KEY || process.env.MORO_STRIPE_PUBLIC,
136
+ webhookSecret: process.env.STRIPE_WEBHOOK_SECRET || process.env.MORO_STRIPE_WEBHOOK,
137
+ apiVersion: process.env.STRIPE_API_VERSION || process.env.MORO_STRIPE_VERSION || '2023-10-16',
138
+ };
139
+ }
140
+ // PayPal
141
+ if (process.env.PAYPAL_CLIENT_ID || process.env.MORO_PAYPAL_CLIENT) {
142
+ externalConfig.paypal = {
143
+ clientId: process.env.PAYPAL_CLIENT_ID || process.env.MORO_PAYPAL_CLIENT,
144
+ clientSecret: process.env.PAYPAL_CLIENT_SECRET || process.env.MORO_PAYPAL_SECRET,
145
+ webhookId: process.env.PAYPAL_WEBHOOK_ID || process.env.MORO_PAYPAL_WEBHOOK,
146
+ environment: (process.env.PAYPAL_ENVIRONMENT || process.env.MORO_PAYPAL_ENV) === 'production'
147
+ ? 'production'
148
+ : 'sandbox',
149
+ };
150
+ }
151
+ // SMTP
152
+ if (process.env.SMTP_HOST || process.env.MORO_SMTP_HOST) {
153
+ externalConfig.smtp = {
154
+ host: process.env.SMTP_HOST || process.env.MORO_SMTP_HOST,
155
+ port: parseInt(process.env.SMTP_PORT || process.env.MORO_SMTP_PORT || '587', 10),
156
+ secure: (process.env.SMTP_SECURE || 'false').toLowerCase() === 'true',
157
+ username: process.env.SMTP_USERNAME || process.env.MORO_SMTP_USER,
158
+ password: process.env.SMTP_PASSWORD || process.env.MORO_SMTP_PASS,
159
+ };
160
+ }
161
+ if (Object.keys(externalConfig).length > 0) {
162
+ config.external = externalConfig;
163
+ }
164
+ return config;
165
+ }
166
+ /**
167
+ * Normalize createApp options to match AppConfig structure
168
+ * This handles the flexible createApp API while converting to structured config
169
+ */
170
+ function normalizeCreateAppOptions(options) {
171
+ const config = {};
172
+ // Direct config section overrides - merge with existing config
173
+ if (options.server) {
174
+ config.server = { ...config.server, ...options.server };
175
+ }
176
+ if (options.database) {
177
+ config.database = { ...config.database, ...options.database };
178
+ }
179
+ if (options.modules) {
180
+ config.modules = { ...config.modules, ...options.modules };
181
+ }
182
+ if (options.logging) {
183
+ config.logging = { ...config.logging, ...options.logging };
184
+ }
185
+ if (options.security) {
186
+ config.security = { ...config.security, ...options.security };
187
+ }
188
+ if (options.external) {
189
+ config.external = { ...config.external, ...options.external };
190
+ }
191
+ if (options.performance) {
192
+ config.performance = { ...config.performance, ...options.performance };
193
+ }
194
+ // Handle shorthand boolean/object options
195
+ if (options.cors !== undefined) {
196
+ config.security = {
197
+ ...config.security,
198
+ cors: typeof options.cors === 'boolean'
199
+ ? { ...schema_1.DEFAULT_CONFIG.security.cors, enabled: options.cors }
200
+ : { ...schema_1.DEFAULT_CONFIG.security.cors, ...options.cors },
201
+ };
202
+ }
203
+ if (options.compression !== undefined) {
204
+ config.performance = {
205
+ ...config.performance,
206
+ compression: typeof options.compression === 'boolean'
207
+ ? { ...schema_1.DEFAULT_CONFIG.performance.compression, enabled: options.compression }
208
+ : { ...schema_1.DEFAULT_CONFIG.performance.compression, ...options.compression },
209
+ };
210
+ }
211
+ if (options.helmet !== undefined) {
212
+ config.security = {
213
+ ...config.security,
214
+ helmet: typeof options.helmet === 'boolean'
215
+ ? { ...schema_1.DEFAULT_CONFIG.security.helmet, enabled: options.helmet }
216
+ : { ...schema_1.DEFAULT_CONFIG.security.helmet, ...options.helmet },
217
+ };
218
+ }
219
+ return config;
220
+ }
221
+ /**
222
+ * Check if a config field contains sensitive information
223
+ */
224
+ function isSensitiveField(path) {
225
+ const sensitivePatterns = [
226
+ 'password',
227
+ 'secret',
228
+ 'key',
229
+ 'token',
230
+ 'auth',
231
+ 'stripe',
232
+ 'paypal',
233
+ 'smtp.password',
234
+ 'smtp.username',
235
+ 'database.url',
236
+ 'redis.url',
237
+ 'mysql.password',
238
+ ];
239
+ return sensitivePatterns.some(pattern => path.toLowerCase().includes(pattern.toLowerCase()));
240
+ }
241
+ /**
242
+ * Deep merge two configuration objects
243
+ * Later object properties override earlier ones
244
+ */
245
+ function deepMerge(target, source) {
246
+ const result = { ...target };
247
+ for (const key in source) {
248
+ const sourceValue = source[key];
249
+ const targetValue = result[key];
250
+ if (sourceValue &&
251
+ typeof sourceValue === 'object' &&
252
+ !Array.isArray(sourceValue) &&
253
+ targetValue &&
254
+ typeof targetValue === 'object' &&
255
+ !Array.isArray(targetValue)) {
256
+ result[key] = deepMerge(targetValue, sourceValue);
257
+ }
258
+ else if (sourceValue !== undefined) {
259
+ result[key] = sourceValue;
260
+ }
261
+ }
262
+ return result;
263
+ }
264
+ /**
265
+ * Track configuration sources for debugging
266
+ */
267
+ function trackConfigSource(config, sourceMap, source, path) {
268
+ function traverse(obj, currentPath) {
269
+ for (const key in obj) {
270
+ const value = obj[key];
271
+ const fullPath = currentPath ? `${currentPath}.${key}` : key;
272
+ if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
273
+ traverse(value, fullPath);
274
+ }
275
+ else {
276
+ sourceMap.set(fullPath, { source, path, value });
277
+ }
278
+ }
279
+ }
280
+ traverse(config, '');
281
+ }
282
+ /**
283
+ * Log configuration sources for debugging
284
+ */
285
+ function logConfigurationSources(sourceMap) {
286
+ const allSources = Array.from(sourceMap.entries()).sort(([a], [b]) => a.localeCompare(b));
287
+ const nonDefaultSources = allSources.filter(([_, info]) => info.source !== 'default');
288
+ if (process.env.NODE_ENV === 'production') {
289
+ // In production, only show non-default values with sensitive data obfuscated
290
+ if (nonDefaultSources.length > 0) {
291
+ logger.debug(`Configuration overrides loaded (${nonDefaultSources.length} total)`);
292
+ nonDefaultSources.forEach(([path, info]) => {
293
+ const valueStr = isSensitiveField(path)
294
+ ? '***'
295
+ : typeof info.value === 'object'
296
+ ? JSON.stringify(info.value)
297
+ : String(info.value);
298
+ logger.debug(` ${path}: ${valueStr} (from ${info.source})`);
299
+ });
300
+ }
301
+ else {
302
+ logger.debug('Using default configuration (no overrides)');
303
+ }
304
+ }
305
+ else {
306
+ // In development, show all sources for debugging
307
+ logger.debug(`Configuration sources loaded (${allSources.length} total)`);
308
+ allSources.forEach(([path, info]) => {
309
+ const valueStr = typeof info.value === 'object' ? JSON.stringify(info.value) : String(info.value);
310
+ logger.debug(` ${path}: ${valueStr} (from ${info.source})`);
311
+ });
312
+ }
313
+ }
314
+ //# sourceMappingURL=config-sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-sources.js","sourceRoot":"","sources":["../../../src/core/config/config-sources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Configuration Validator - Type-Safe Schema Validation
3
+ *
4
+ * This module provides runtime validation for configuration objects using
5
+ * simple TypeScript functions that match the type definitions exactly.
6
+ */
7
+ import { AppConfig } from '../../types/config';
8
+ /**
9
+ * Configuration validation error with detailed context
10
+ */
11
+ export declare class ConfigValidationError extends Error {
12
+ readonly field: string;
13
+ readonly value: unknown;
14
+ readonly expectedType: string;
15
+ constructor(field: string, value: unknown, expectedType: string, message: string);
16
+ }
17
+ /**
18
+ * Validate and normalize a complete configuration object
19
+ * This ensures type safety and provides helpful error messages
20
+ */
21
+ export declare function validateConfig(config: any): AppConfig;