@morojs/moro 1.5.5 → 1.5.6
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/dist/core/config/config-manager.d.ts +44 -0
- package/dist/core/config/config-manager.js +114 -0
- package/dist/core/config/config-manager.js.map +1 -0
- package/dist/core/config/config-sources.d.ts +21 -0
- package/dist/core/config/config-sources.js +314 -0
- package/dist/core/config/config-sources.js.map +1 -0
- package/dist/core/config/config-validator.d.ts +21 -0
- package/dist/core/config/config-validator.js +737 -0
- package/dist/core/config/config-validator.js.map +1 -0
- package/dist/core/config/file-loader.d.ts +0 -5
- package/dist/core/config/file-loader.js +0 -171
- package/dist/core/config/file-loader.js.map +1 -1
- package/dist/core/config/index.d.ts +39 -10
- package/dist/core/config/index.js +66 -29
- package/dist/core/config/index.js.map +1 -1
- package/dist/core/config/schema.js +22 -31
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/config/utils.d.ts +9 -2
- package/dist/core/config/utils.js +19 -32
- package/dist/core/config/utils.js.map +1 -1
- package/dist/core/framework.d.ts +2 -7
- package/dist/core/framework.js +12 -5
- package/dist/core/framework.js.map +1 -1
- package/dist/core/http/http-server.d.ts +12 -0
- package/dist/core/http/http-server.js +56 -0
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/router.d.ts +12 -0
- package/dist/core/http/router.js +114 -36
- package/dist/core/http/router.js.map +1 -1
- package/dist/core/logger/index.d.ts +1 -1
- package/dist/core/logger/index.js +2 -1
- package/dist/core/logger/index.js.map +1 -1
- package/dist/core/logger/logger.d.ts +9 -1
- package/dist/core/logger/logger.js +36 -3
- package/dist/core/logger/logger.js.map +1 -1
- package/dist/core/routing/index.d.ts +20 -0
- package/dist/core/routing/index.js +109 -11
- package/dist/core/routing/index.js.map +1 -1
- package/dist/moro.d.ts +7 -20
- package/dist/moro.js +97 -192
- package/dist/moro.js.map +1 -1
- package/dist/types/config.d.ts +39 -2
- package/dist/types/core.d.ts +22 -39
- package/dist/types/logger.d.ts +4 -0
- package/package.json +1 -1
- package/src/core/config/config-manager.ts +133 -0
- package/src/core/config/config-sources.ts +384 -0
- package/src/core/config/config-validator.ts +1035 -0
- package/src/core/config/file-loader.ts +0 -233
- package/src/core/config/index.ts +77 -32
- package/src/core/config/schema.ts +22 -31
- package/src/core/config/utils.ts +22 -29
- package/src/core/framework.ts +18 -11
- package/src/core/http/http-server.ts +66 -0
- package/src/core/http/router.ts +127 -38
- package/src/core/logger/index.ts +1 -0
- package/src/core/logger/logger.ts +43 -4
- package/src/core/routing/index.ts +116 -12
- package/src/moro.ts +105 -225
- package/src/types/config.ts +40 -2
- package/src/types/core.ts +32 -43
- package/src/types/logger.ts +6 -0
- package/dist/core/config/loader.d.ts +0 -7
- package/dist/core/config/loader.js +0 -269
- package/dist/core/config/loader.js.map +0 -1
- package/dist/core/config/validation.d.ts +0 -17
- package/dist/core/config/validation.js +0 -131
- package/dist/core/config/validation.js.map +0 -1
- package/src/core/config/loader.ts +0 -633
- 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":";AAAA;;;;;;;GAOG;;AAiBH,0DAeC;AAMD,0CAOC;AAKD,wCAEC;AAMD,sDAeC;AA8BD,wCAMC;AAMD,sCAEC;AAED,oCAEC;AAED,8BAEC;AA1HD,sCAAkD;AAElD,MAAM,MAAM,GAAG,IAAA,8BAAqB,EAAC,eAAe,CAAC,CAAC;AAEtD;;GAEG;AACH,IAAI,YAAY,GAA+B,IAAI,CAAC;AACpD,IAAI,QAAQ,GAAG,KAAK,CAAC;AAErB;;;GAGG;AACH,SAAgB,uBAAuB,CAAC,MAAiB;IACvD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,yDAAyD;YACvD,uEAAuE,CAC1E,CAAC;IACJ,CAAC;IAED,2DAA2D;IAC3D,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAClC,QAAQ,GAAG,IAAI,CAAC;IAEhB,MAAM,CAAC,IAAI,CACT,yCAAyC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CACvG,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe;IAC7B,IAAI,CAAC,YAAY,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,yFAAyF,CAC1F,CAAC;IACJ,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc;IAC5B,OAAO,QAAQ,IAAI,YAAY,KAAK,IAAI,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,SAAgB,qBAAqB;IACnC,IACE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM;QAC/B,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB;QACpC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAC3B,CAAC;QACD,MAAM,IAAI,KAAK,CACb,4DAA4D;YAC1D,0DAA0D,CAC7D,CAAC;IACJ,CAAC;IAED,YAAY,GAAG,IAAI,CAAC;IACpB,QAAQ,GAAG,KAAK,CAAC;IACjB,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU,CAAI,GAAM;IAC3B,qBAAqB;IACrB,MAAM,SAAS,GAAG,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAElD,yCAAyC;IACzC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAI,GAAW,CAAC,IAAI,CAAC,CAAC;QAEjC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvC,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,cAAc,CAAU,IAAY;IAClD,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IAEjC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAQ,EAAE,GAAW,EAAE,EAAE;QACtD,OAAO,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9D,CAAC,EAAE,MAAM,CAAC,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,SAAgB,aAAa;IAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,CAAC;AAChD,CAAC;AAED,SAAgB,YAAY;IAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;AAC/C,CAAC;AAED,SAAgB,SAAS;IACvB,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC;AAC5C,CAAC"}
|
|
@@ -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;
|