@morojs/moro 1.8.3 → 1.8.4
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-sources.js.map +1 -1
- package/dist/core/framework.d.ts +11 -0
- package/dist/core/framework.js +107 -36
- package/dist/core/framework.js.map +1 -1
- package/dist/core/graphql/core.js.map +1 -1
- package/dist/core/grpc/types.js.map +1 -1
- package/dist/core/http/moro-engine-server.js.map +1 -1
- package/dist/core/mail/mail-adapter.js.map +1 -1
- package/dist/core/middleware/built-in/cloudwatch/index.d.ts +4 -0
- package/dist/core/middleware/built-in/cloudwatch/index.js +5 -0
- package/dist/core/middleware/built-in/cloudwatch/index.js.map +1 -0
- package/dist/core/middleware/built-in/cloudwatch/middleware.d.ts +31 -0
- package/dist/core/middleware/built-in/cloudwatch/middleware.js +52 -0
- package/dist/core/middleware/built-in/cloudwatch/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/error-tracker/index.d.ts +3 -1
- package/dist/core/middleware/built-in/error-tracker/index.js +3 -2
- package/dist/core/middleware/built-in/error-tracker/index.js.map +1 -1
- package/dist/core/middleware/built-in/error-tracker/middleware.d.ts +6 -3
- package/dist/core/middleware/built-in/error-tracker/middleware.js +18 -13
- package/dist/core/middleware/built-in/error-tracker/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/index.d.ts +43 -7
- package/dist/core/middleware/built-in/index.js +37 -7
- package/dist/core/middleware/built-in/index.js.map +1 -1
- package/dist/core/middleware/built-in/performance-monitor/index.d.ts +3 -1
- package/dist/core/middleware/built-in/performance-monitor/index.js +3 -2
- package/dist/core/middleware/built-in/performance-monitor/index.js.map +1 -1
- package/dist/core/middleware/built-in/performance-monitor/middleware.d.ts +3 -3
- package/dist/core/middleware/built-in/performance-monitor/middleware.js +19 -17
- package/dist/core/middleware/built-in/performance-monitor/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/prometheus/core.d.ts +27 -0
- package/dist/core/middleware/built-in/prometheus/core.js +0 -0
- package/dist/core/middleware/built-in/prometheus/core.js.map +1 -0
- package/dist/core/middleware/built-in/prometheus/index.d.ts +5 -0
- package/dist/core/middleware/built-in/prometheus/index.js +6 -0
- package/dist/core/middleware/built-in/prometheus/index.js.map +1 -0
- package/dist/core/middleware/built-in/prometheus/middleware.d.ts +15 -0
- package/dist/core/middleware/built-in/prometheus/middleware.js +30 -0
- package/dist/core/middleware/built-in/prometheus/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/request-logger/index.d.ts +3 -1
- package/dist/core/middleware/built-in/request-logger/index.js +3 -2
- package/dist/core/middleware/built-in/request-logger/index.js.map +1 -1
- package/dist/core/middleware/built-in/request-logger/middleware.d.ts +4 -4
- package/dist/core/middleware/built-in/request-logger/middleware.js +14 -12
- package/dist/core/middleware/built-in/request-logger/middleware.js.map +1 -1
- package/dist/core/middleware/index.d.ts +1 -1
- package/dist/core/middleware/index.js +1 -1
- package/dist/core/middleware/index.js.map +1 -1
- package/dist/core/pooling/index.d.ts +3 -0
- package/dist/core/pooling/index.js +5 -0
- package/dist/core/pooling/index.js.map +1 -0
- package/dist/core/pooling/lru-cache.d.ts +32 -0
- package/dist/core/pooling/lru-cache.js +74 -0
- package/dist/core/pooling/lru-cache.js.map +1 -0
- package/dist/core/pooling/object-pool-manager.d.ts +3 -1
- package/dist/core/pooling/object-pool-manager.js +37 -140
- package/dist/core/pooling/object-pool-manager.js.map +1 -1
- package/dist/core/pooling/object-pool.d.ts +42 -0
- package/dist/core/pooling/object-pool.js +78 -0
- package/dist/core/pooling/object-pool.js.map +1 -0
- package/dist/core/routing/create-router.js.map +1 -1
- package/dist/core/routing/path-matcher.js +1 -43
- package/dist/core/routing/path-matcher.js.map +1 -1
- package/dist/core/utilities/hooks.d.ts +0 -1
- package/dist/core/utilities/hooks.js +0 -2
- package/dist/core/utilities/hooks.js.map +1 -1
- package/dist/core/utilities/index.d.ts +0 -1
- package/dist/core/utilities/index.js +0 -2
- package/dist/core/utilities/index.js.map +1 -1
- package/dist/core/workers/facade.d.ts +20 -4
- package/dist/core/workers/facade.js +15 -7
- package/dist/core/workers/facade.js.map +1 -1
- package/dist/core/workers/worker-manager.d.ts +12 -0
- package/dist/core/workers/worker-manager.js +27 -0
- package/dist/core/workers/worker-manager.js.map +1 -1
- package/dist/core/workers/worker.d.ts +17 -1
- package/dist/core/workers/worker.js +28 -26
- package/dist/core/workers/worker.js.map +1 -1
- package/dist/index.d.ts +39 -2
- package/dist/index.js +14 -2
- package/dist/index.js.map +1 -1
- package/dist/moro.js +25 -1
- package/dist/moro.js.map +1 -1
- package/dist/types/config.js.map +1 -1
- package/dist/types/core.d.ts +1 -0
- package/dist/types/core.js.map +1 -1
- package/dist/types/module.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-sources.js","sourceRoot":"","sources":["../../../src/core/config/config-sources.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-non-null-assertion --\n * This module walks the config tree along paths that were just created or\n * validated in the same function (e.g. the parent object is assigned on the\n * line above), so the non-null assertions are provably safe. Consolidated here\n * rather than repeated as ~23 inline disables. */\n/**\n * Configuration Sources - Load from Environment, Files, and Options\n *\n * This module handles loading configuration from different sources with clear precedence:\n * Environment Variables > createApp Options > Config File > Schema Defaults\n */\n\nimport { AppConfig, DeepPartial } from '../../types/config.js';\nimport { MoroOptions } from '../../types/core.js';\nimport { DEFAULT_CONFIG } from './schema.js';\nimport { loadConfigFileSync, loadConfigFile } from './file-loader.js';\nimport { createFrameworkLogger } from '../logger/index.js';\nimport { validateConfig } from './config-validator.js';\n\nconst logger = createFrameworkLogger('ConfigSources');\n\n/**\n * Configuration source metadata for debugging\n */\nexport interface ConfigSourceInfo {\n source: 'environment' | 'createApp' | 'configFile' | 'default';\n path: string;\n value: any;\n}\n\n/**\n * Load configuration from all sources with proper precedence\n * Returns a validated, complete configuration object\n */\nexport function loadConfigFromAllSources(createAppOptions?: MoroOptions): AppConfig {\n logger.debug('Loading configuration from all sources');\n\n // 1. Start with schema defaults\n let config = JSON.parse(JSON.stringify(DEFAULT_CONFIG)) as AppConfig;\n const sourceMap = new Map<string, ConfigSourceInfo>();\n\n // Track default values\n trackConfigSource(config, sourceMap, 'default', 'schema');\n\n // 2. Load and merge config file (if exists)\n try {\n const fileConfig = loadConfigFileSync();\n if (fileConfig) {\n config = deepMerge(config, fileConfig) as AppConfig;\n trackConfigSource(fileConfig, sourceMap, 'configFile', 'moro.config.js/ts');\n logger.debug('Config file loaded and merged');\n }\n } catch (error) {\n logger.warn('Config file loading failed, continuing without it:', String(error));\n }\n\n // 3. Load and merge environment variables\n const envConfig = loadEnvironmentConfig();\n config = deepMerge(config, envConfig) as AppConfig;\n trackConfigSource(envConfig, sourceMap, 'environment', 'process.env');\n\n // 4. Load and merge createApp options (highest precedence)\n if (createAppOptions) {\n const normalizedOptions = normalizeCreateAppOptions(createAppOptions);\n config = deepMerge(config, normalizedOptions) as AppConfig;\n trackConfigSource(normalizedOptions, sourceMap, 'createApp', 'createApp()');\n logger.debug('createApp options merged');\n }\n\n // 5. Validate the final configuration\n const validatedConfig = validateConfig(config);\n\n // Log configuration sources for debugging\n logConfigurationSources(sourceMap);\n\n return validatedConfig;\n}\n\n/**\n * Load configuration from all sources with proper precedence — async version.\n * Uses dynamic import() for the config file so ESM config files\n * (projects with \"type\":\"module\") are loaded correctly.\n *\n * Called by the async createApp() factory. Precedence is identical to the\n * sync version: Env Vars > createApp Options > Config File > Defaults\n */\nexport async function loadConfigFromAllSourcesAsync(\n createAppOptions?: MoroOptions\n): Promise<AppConfig> {\n logger.debug('Loading configuration from all sources (async)');\n\n // 1. Start with schema defaults\n let config = JSON.parse(JSON.stringify(DEFAULT_CONFIG)) as AppConfig;\n const sourceMap = new Map<string, ConfigSourceInfo>();\n\n trackConfigSource(config, sourceMap, 'default', 'schema');\n\n // 2. Load and merge config file via import() — supports both CJS and ESM\n try {\n const fileConfig = await loadConfigFile();\n if (fileConfig) {\n config = deepMerge(config, fileConfig) as AppConfig;\n trackConfigSource(fileConfig, sourceMap, 'configFile', 'moro.config.js/ts');\n logger.debug('Config file loaded and merged (async)');\n }\n } catch (error) {\n logger.warn('Config file loading failed, continuing without it:', String(error));\n }\n\n // 3. Load and merge environment variables\n const envConfig = loadEnvironmentConfig();\n config = deepMerge(config, envConfig) as AppConfig;\n trackConfigSource(envConfig, sourceMap, 'environment', 'process.env');\n\n // 4. Load and merge createApp options (highest precedence)\n if (createAppOptions) {\n const normalizedOptions = normalizeCreateAppOptions(createAppOptions);\n config = deepMerge(config, normalizedOptions) as AppConfig;\n trackConfigSource(normalizedOptions, sourceMap, 'createApp', 'createApp()');\n logger.debug('createApp options merged');\n }\n\n // 5. Validate the final configuration\n const validatedConfig = validateConfig(config);\n\n logConfigurationSources(sourceMap);\n\n return validatedConfig;\n}\n\n/**\n * Load configuration from environment variables\n * Handles both standard and MORO_ prefixed variables\n */\nfunction loadEnvironmentConfig(): DeepPartial<AppConfig> {\n const config: DeepPartial<AppConfig> = {};\n\n // Server configuration\n if (process.env.PORT || process.env.MORO_PORT) {\n if (!config.server) config.server = {} as any;\n config.server!.port = parseInt(process.env.PORT || process.env.MORO_PORT || '3001', 10);\n }\n\n if (process.env.HOST || process.env.MORO_HOST) {\n if (!config.server) config.server = {} as any;\n config.server!.host = process.env.HOST || process.env.MORO_HOST || 'localhost';\n }\n\n if (process.env.MAX_CONNECTIONS || process.env.MORO_MAX_CONNECTIONS) {\n if (!config.server) config.server = {} as any;\n config.server!.maxConnections = parseInt(\n process.env.MAX_CONNECTIONS || process.env.MORO_MAX_CONNECTIONS || '0',\n 10\n );\n }\n\n if (process.env.REQUEST_TIMEOUT || process.env.MORO_TIMEOUT) {\n if (!config.server) config.server = {} as any;\n if (!config.server!.timeouts) config.server!.timeouts = {} as any;\n // Now writes the canonical timeouts.request (timeout is its deprecated alias).\n config.server!.timeouts!.request = parseInt(\n process.env.REQUEST_TIMEOUT || process.env.MORO_TIMEOUT || '0',\n 10\n );\n }\n\n // Additional timeout knobs (all ms).\n const setTimeoutEnv = (envName: string, key: 'idle' | 'keepAlive' | 'headers') => {\n if (process.env[envName]) {\n if (!config.server) config.server = {} as any;\n if (!config.server!.timeouts) config.server!.timeouts = {} as any;\n (config.server!.timeouts as any)[key] = parseInt(process.env[envName] as string, 10);\n }\n };\n setTimeoutEnv('MORO_IDLE_TIMEOUT', 'idle');\n setTimeoutEnv('MORO_KEEPALIVE_TIMEOUT', 'keepAlive');\n setTimeoutEnv('MORO_HEADERS_TIMEOUT', 'headers');\n\n if (process.env.MORO_BACKLOG) {\n if (!config.server) config.server = {} as any;\n config.server!.backlog = parseInt(process.env.MORO_BACKLOG, 10);\n }\n\n // Limit knobs. Size values stay as strings so the validator/parser handle\n // '16kb'-style inputs uniformly.\n const setLimitEnv = (envName: string, key: string) => {\n if (process.env[envName]) {\n if (!config.server) config.server = {} as any;\n if (!config.server!.limits) config.server!.limits = {} as any;\n (config.server!.limits as any)[key] = process.env[envName];\n }\n };\n setLimitEnv('MORO_MAX_HEADER_SIZE', 'maxHeaderSize');\n setLimitEnv('MORO_WS_MAX_MESSAGE_SIZE', 'wsMaxMessageSize');\n if (process.env.MORO_MAX_HEADERS) {\n if (!config.server) config.server = {} as any;\n if (!config.server!.limits) config.server!.limits = {} as any;\n config.server!.limits!.maxHeaders = parseInt(process.env.MORO_MAX_HEADERS, 10);\n }\n const setMultipartEnv = (envName: string, key: string, numeric: boolean) => {\n if (process.env[envName]) {\n if (!config.server) config.server = {} as any;\n if (!config.server!.limits) config.server!.limits = {} as any;\n if (!config.server!.limits!.multipart) config.server!.limits!.multipart = {} as any;\n (config.server!.limits!.multipart as any)[key] = numeric\n ? parseInt(process.env[envName] as string, 10)\n : process.env[envName];\n }\n };\n setMultipartEnv('MORO_MULTIPART_MAX_PARTS', 'maxParts', true);\n setMultipartEnv('MORO_MULTIPART_MAX_FILES', 'maxFiles', true);\n setMultipartEnv('MORO_MULTIPART_MAX_FILE_SIZE', 'maxFileSize', false);\n\n // SSL from env (file paths + passphrase; never fails boot — a partial set is\n // caught by the validator).\n const setSslEnv = (envName: string, key: string) => {\n if (process.env[envName]) {\n if (!config.server) config.server = {} as any;\n if (!config.server!.ssl) config.server!.ssl = {} as any;\n (config.server!.ssl as any)[key] = process.env[envName];\n }\n };\n setSslEnv('MORO_SSL_KEY_FILE', 'keyFile');\n setSslEnv('MORO_SSL_CERT_FILE', 'certFile');\n setSslEnv('MORO_SSL_CA_FILE', 'caFile');\n setSslEnv('MORO_SSL_PASSPHRASE', 'passphrase');\n\n if (process.env.MORO_HTTP2) {\n const v = process.env.MORO_HTTP2.trim().toLowerCase();\n if (v === 'true' || v === '1' || v === 'false' || v === '0') {\n if (!config.server) config.server = {} as any;\n config.server!.http2 = v === 'true' || v === '1';\n }\n }\n\n if (process.env.MORO_SERVER_ENGINE) {\n // Normalize and whitelist like the other env enums (LOG_LEVEL etc.):\n // engine selection must never fail the boot, so an invalid value is\n // ignored rather than being handed to the validator to throw on.\n // Legacy 'auto'/'native' values map to 'moro'.\n const rawEngine = process.env.MORO_SERVER_ENGINE.trim().toLowerCase();\n const engineValue =\n rawEngine === 'auto' || rawEngine === 'native'\n ? 'moro'\n : rawEngine === 'moro' || rawEngine === 'node' || rawEngine === 'uws'\n ? rawEngine\n : undefined;\n if (engineValue) {\n if (!config.server) config.server = {} as any;\n config.server!.engine = engineValue;\n }\n }\n\n // Database configuration\n const databaseUrl = process.env.DATABASE_URL || process.env.MORO_DATABASE_URL;\n if (databaseUrl) {\n if (!config.database) config.database = {} as any;\n config.database!.url = databaseUrl;\n }\n\n // Redis configuration\n if (process.env.REDIS_URL || process.env.MORO_REDIS_URL) {\n if (!config.database) config.database = {} as any;\n if (!config.database!.redis) config.database!.redis = {} as any;\n config.database!.redis!.url =\n process.env.REDIS_URL || process.env.MORO_REDIS_URL || 'redis://localhost:6379';\n config.database!.redis!.maxRetries = parseInt(\n process.env.REDIS_MAX_RETRIES || process.env.MORO_REDIS_MAX_RETRIES || '3',\n 10\n );\n config.database!.redis!.retryDelay = parseInt(\n process.env.REDIS_RETRY_DELAY || process.env.MORO_REDIS_RETRY_DELAY || '1000',\n 10\n );\n config.database!.redis!.keyPrefix =\n process.env.REDIS_KEY_PREFIX || process.env.MORO_REDIS_KEY_PREFIX || 'moro:';\n }\n\n // MySQL configuration - only include if MYSQL_HOST is set\n if (process.env.MYSQL_HOST || process.env.MORO_MYSQL_HOST) {\n if (!config.database) config.database = {} as any;\n config.database!.mysql = {\n host: process.env.MYSQL_HOST || process.env.MORO_MYSQL_HOST || 'localhost',\n port: parseInt(process.env.MYSQL_PORT || process.env.MORO_MYSQL_PORT || '3306', 10),\n database: process.env.MYSQL_DATABASE || process.env.MORO_MYSQL_DB,\n username: process.env.MYSQL_USERNAME || process.env.MORO_MYSQL_USER,\n password: process.env.MYSQL_PASSWORD || process.env.MORO_MYSQL_PASS,\n connectionLimit: parseInt(\n process.env.MYSQL_CONNECTION_LIMIT || process.env.MORO_MYSQL_CONNECTIONS || '10',\n 10\n ),\n acquireTimeout: parseInt(\n process.env.MYSQL_ACQUIRE_TIMEOUT || process.env.MORO_MYSQL_ACQUIRE || '60000',\n 10\n ),\n timeout: parseInt(process.env.MYSQL_TIMEOUT || process.env.MORO_MYSQL_TIMEOUT || '60000', 10),\n } as any;\n }\n\n // Logging configuration\n const ensureLoggingBlock = (): NonNullable<DeepPartial<AppConfig>['logging']> => {\n if (!config.logging) config.logging = {} as any;\n return config.logging!;\n };\n\n // Parses common boolean-ish env strings; returns undefined if not set so we\n // never accidentally clobber a default with `false`.\n const parseBoolEnv = (raw: string | undefined): boolean | undefined => {\n if (raw === undefined) return undefined;\n const v = raw.trim().toLowerCase();\n if (v === '') return undefined;\n if (v === 'true' || v === '1' || v === 'yes' || v === 'on') return true;\n if (v === 'false' || v === '0' || v === 'no' || v === 'off') return false;\n return undefined;\n };\n\n if (process.env.LOG_LEVEL || process.env.MORO_LOG_LEVEL) {\n const level = process.env.LOG_LEVEL || process.env.MORO_LOG_LEVEL;\n if (\n level === 'debug' ||\n level === 'info' ||\n level === 'warn' ||\n level === 'error' ||\n level === 'fatal'\n ) {\n ensureLoggingBlock().level = level;\n }\n }\n\n if (process.env.LOG_FORMAT || process.env.MORO_LOG_FORMAT) {\n const fmt = (process.env.LOG_FORMAT || process.env.MORO_LOG_FORMAT) as\n | 'pretty'\n | 'json'\n | 'compact';\n if (fmt === 'pretty' || fmt === 'json' || fmt === 'compact') {\n ensureLoggingBlock().format = fmt;\n }\n }\n\n const colorsEnv = parseBoolEnv(process.env.LOG_COLORS ?? process.env.MORO_LOG_COLORS);\n if (colorsEnv !== undefined) {\n ensureLoggingBlock().enableColors = colorsEnv;\n }\n\n const timestampEnv = parseBoolEnv(process.env.LOG_TIMESTAMP ?? process.env.MORO_LOG_TIMESTAMP);\n if (timestampEnv !== undefined) {\n ensureLoggingBlock().enableTimestamp = timestampEnv;\n }\n\n const contextEnv = parseBoolEnv(process.env.LOG_CONTEXT ?? process.env.MORO_LOG_CONTEXT);\n if (contextEnv !== undefined) {\n ensureLoggingBlock().enableContext = contextEnv;\n }\n\n // Opt-in: appends \"{...}\" JSON tail to pretty log lines.\n const metadataEnv = parseBoolEnv(process.env.LOG_METADATA ?? process.env.MORO_LOG_METADATA);\n if (metadataEnv !== undefined) {\n ensureLoggingBlock().enableMetadata = metadataEnv;\n }\n\n // Opt-in: collects/renders memory + duration on each log line.\n const perfEnv = parseBoolEnv(process.env.LOG_PERFORMANCE ?? process.env.MORO_LOG_PERFORMANCE);\n if (perfEnv !== undefined) {\n ensureLoggingBlock().enablePerformance = perfEnv;\n }\n\n // External services - only include if configured\n const externalConfig: Partial<AppConfig['external']> = {};\n\n // Stripe\n if (process.env.STRIPE_SECRET_KEY || process.env.MORO_STRIPE_SECRET) {\n externalConfig.stripe = {\n secretKey: process.env.STRIPE_SECRET_KEY || process.env.MORO_STRIPE_SECRET,\n publishableKey: process.env.STRIPE_PUBLISHABLE_KEY || process.env.MORO_STRIPE_PUBLIC,\n webhookSecret: process.env.STRIPE_WEBHOOK_SECRET || process.env.MORO_STRIPE_WEBHOOK,\n apiVersion: process.env.STRIPE_API_VERSION || process.env.MORO_STRIPE_VERSION || '2023-10-16',\n };\n }\n\n // PayPal\n if (process.env.PAYPAL_CLIENT_ID || process.env.MORO_PAYPAL_CLIENT) {\n externalConfig.paypal = {\n clientId: process.env.PAYPAL_CLIENT_ID || process.env.MORO_PAYPAL_CLIENT,\n clientSecret: process.env.PAYPAL_CLIENT_SECRET || process.env.MORO_PAYPAL_SECRET,\n webhookId: process.env.PAYPAL_WEBHOOK_ID || process.env.MORO_PAYPAL_WEBHOOK,\n environment:\n (process.env.PAYPAL_ENVIRONMENT || process.env.MORO_PAYPAL_ENV) === 'production'\n ? 'production'\n : 'sandbox',\n };\n }\n\n // SMTP\n if (process.env.SMTP_HOST || process.env.MORO_SMTP_HOST) {\n externalConfig.smtp = {\n host: process.env.SMTP_HOST || process.env.MORO_SMTP_HOST,\n port: parseInt(process.env.SMTP_PORT || process.env.MORO_SMTP_PORT || '587', 10),\n secure: (process.env.SMTP_SECURE || 'false').toLowerCase() === 'true',\n username: process.env.SMTP_USERNAME || process.env.MORO_SMTP_USER,\n password: process.env.SMTP_PASSWORD || process.env.MORO_SMTP_PASS,\n };\n }\n\n if (Object.keys(externalConfig).length > 0) {\n config.external = externalConfig;\n }\n\n // Module configuration\n const moduleEnvVars = [\n // Cache\n 'CACHE_ENABLED',\n 'MORO_CACHE_ENABLED',\n 'DEFAULT_CACHE_TTL',\n 'MORO_CACHE_TTL',\n 'CACHE_MAX_SIZE',\n 'MORO_CACHE_SIZE',\n 'CACHE_STRATEGY',\n 'MORO_CACHE_STRATEGY',\n // Rate Limit\n 'RATE_LIMIT_ENABLED',\n 'MORO_RATE_LIMIT_ENABLED',\n 'DEFAULT_RATE_LIMIT_REQUESTS',\n 'MORO_RATE_LIMIT_REQUESTS',\n 'DEFAULT_RATE_LIMIT_WINDOW',\n 'MORO_RATE_LIMIT_WINDOW',\n // Validation\n 'VALIDATION_ENABLED',\n 'MORO_VALIDATION_ENABLED',\n // Auto-Discovery\n 'AUTO_DISCOVERY_ENABLED',\n 'MORO_AUTO_DISCOVERY_ENABLED',\n 'AUTO_DISCOVERY_PATHS',\n 'MORO_AUTO_DISCOVERY_PATHS',\n 'AUTO_DISCOVERY_PATTERNS',\n 'MORO_AUTO_DISCOVERY_PATTERNS',\n 'AUTO_DISCOVERY_LOADING_STRATEGY',\n 'MORO_AUTO_DISCOVERY_LOADING_STRATEGY',\n 'AUTO_DISCOVERY_WATCH_FOR_CHANGES',\n 'MORO_AUTO_DISCOVERY_WATCH_FOR_CHANGES',\n 'AUTO_DISCOVERY_LOAD_ORDER',\n 'MORO_AUTO_DISCOVERY_LOAD_ORDER',\n 'AUTO_DISCOVERY_FAIL_ON_ERROR',\n 'MORO_AUTO_DISCOVERY_FAIL_ON_ERROR',\n 'AUTO_DISCOVERY_MAX_DEPTH',\n 'MORO_AUTO_DISCOVERY_MAX_DEPTH',\n ];\n\n if (moduleEnvVars.some(envVar => process.env[envVar])) {\n if (!config.modules) config.modules = {} as any;\n\n // Cache configuration\n if (process.env.CACHE_ENABLED || process.env.MORO_CACHE_ENABLED) {\n if (!config.modules!.cache) config.modules!.cache = {} as any;\n config.modules!.cache!.enabled =\n (process.env.CACHE_ENABLED || process.env.MORO_CACHE_ENABLED) === 'true';\n }\n if (process.env.DEFAULT_CACHE_TTL || process.env.MORO_CACHE_TTL) {\n if (!config.modules!.cache) config.modules!.cache = {} as any;\n config.modules!.cache!.defaultTtl = parseInt(\n process.env.DEFAULT_CACHE_TTL || process.env.MORO_CACHE_TTL || '300',\n 10\n );\n }\n if (process.env.CACHE_MAX_SIZE || process.env.MORO_CACHE_SIZE) {\n if (!config.modules!.cache) config.modules!.cache = {} as any;\n config.modules!.cache!.maxSize = parseInt(\n process.env.CACHE_MAX_SIZE || process.env.MORO_CACHE_SIZE || '1000',\n 10\n );\n }\n if (process.env.CACHE_STRATEGY || process.env.MORO_CACHE_STRATEGY) {\n if (!config.modules!.cache) config.modules!.cache = {} as any;\n const strategy = process.env.CACHE_STRATEGY || process.env.MORO_CACHE_STRATEGY;\n if (['lru', 'lfu', 'fifo'].includes(strategy || '')) {\n config.modules!.cache!.strategy = strategy as 'lru' | 'lfu' | 'fifo';\n }\n }\n\n // Rate limit configuration\n if (process.env.RATE_LIMIT_ENABLED || process.env.MORO_RATE_LIMIT_ENABLED) {\n if (!config.modules!.rateLimit) config.modules!.rateLimit = {} as any;\n config.modules!.rateLimit!.enabled =\n (process.env.RATE_LIMIT_ENABLED || process.env.MORO_RATE_LIMIT_ENABLED) === 'true';\n }\n if (process.env.DEFAULT_RATE_LIMIT_REQUESTS || process.env.MORO_RATE_LIMIT_REQUESTS) {\n if (!config.modules!.rateLimit) config.modules!.rateLimit = {} as any;\n config.modules!.rateLimit!.defaultRequests = parseInt(\n process.env.DEFAULT_RATE_LIMIT_REQUESTS || process.env.MORO_RATE_LIMIT_REQUESTS || '100',\n 10\n );\n }\n if (process.env.DEFAULT_RATE_LIMIT_WINDOW || process.env.MORO_RATE_LIMIT_WINDOW) {\n if (!config.modules!.rateLimit) config.modules!.rateLimit = {} as any;\n config.modules!.rateLimit!.defaultWindow = parseInt(\n process.env.DEFAULT_RATE_LIMIT_WINDOW || process.env.MORO_RATE_LIMIT_WINDOW || '60000',\n 10\n );\n }\n\n // Validation configuration\n if (process.env.VALIDATION_ENABLED || process.env.MORO_VALIDATION_ENABLED) {\n if (!config.modules!.validation) config.modules!.validation = {} as any;\n config.modules!.validation!.enabled =\n (process.env.VALIDATION_ENABLED || process.env.MORO_VALIDATION_ENABLED) === 'true';\n }\n\n // Auto-Discovery configuration\n if (process.env.AUTO_DISCOVERY_ENABLED || process.env.MORO_AUTO_DISCOVERY_ENABLED) {\n if (!config.modules!.autoDiscovery) config.modules!.autoDiscovery = {} as any;\n config.modules!.autoDiscovery!.enabled =\n (process.env.AUTO_DISCOVERY_ENABLED || process.env.MORO_AUTO_DISCOVERY_ENABLED) === 'true';\n }\n if (process.env.AUTO_DISCOVERY_PATHS || process.env.MORO_AUTO_DISCOVERY_PATHS) {\n if (!config.modules!.autoDiscovery) config.modules!.autoDiscovery = {} as any;\n const paths = (\n process.env.AUTO_DISCOVERY_PATHS ||\n process.env.MORO_AUTO_DISCOVERY_PATHS ||\n ''\n )\n .split(',')\n .map(p => p.trim())\n .filter(Boolean);\n if (paths.length > 0) {\n config.modules!.autoDiscovery!.paths = paths;\n }\n }\n if (process.env.AUTO_DISCOVERY_PATTERNS || process.env.MORO_AUTO_DISCOVERY_PATTERNS) {\n if (!config.modules!.autoDiscovery) config.modules!.autoDiscovery = {} as any;\n const patterns = (\n process.env.AUTO_DISCOVERY_PATTERNS ||\n process.env.MORO_AUTO_DISCOVERY_PATTERNS ||\n ''\n )\n .split(',')\n .map(p => p.trim())\n .filter(Boolean);\n if (patterns.length > 0) {\n config.modules!.autoDiscovery!.patterns = patterns;\n }\n }\n if (\n process.env.AUTO_DISCOVERY_LOADING_STRATEGY ||\n process.env.MORO_AUTO_DISCOVERY_LOADING_STRATEGY\n ) {\n if (!config.modules!.autoDiscovery) config.modules!.autoDiscovery = {} as any;\n const strategy =\n process.env.AUTO_DISCOVERY_LOADING_STRATEGY ||\n process.env.MORO_AUTO_DISCOVERY_LOADING_STRATEGY;\n if (['eager', 'lazy', 'conditional'].includes(strategy || '')) {\n config.modules!.autoDiscovery!.loadingStrategy = strategy as\n | 'eager'\n | 'lazy'\n | 'conditional';\n }\n }\n if (\n process.env.AUTO_DISCOVERY_WATCH_FOR_CHANGES ||\n process.env.MORO_AUTO_DISCOVERY_WATCH_FOR_CHANGES\n ) {\n if (!config.modules!.autoDiscovery) config.modules!.autoDiscovery = {} as any;\n config.modules!.autoDiscovery!.watchForChanges =\n (process.env.AUTO_DISCOVERY_WATCH_FOR_CHANGES ||\n process.env.MORO_AUTO_DISCOVERY_WATCH_FOR_CHANGES) === 'true';\n }\n if (process.env.AUTO_DISCOVERY_LOAD_ORDER || process.env.MORO_AUTO_DISCOVERY_LOAD_ORDER) {\n if (!config.modules!.autoDiscovery) config.modules!.autoDiscovery = {} as any;\n const loadOrder =\n process.env.AUTO_DISCOVERY_LOAD_ORDER || process.env.MORO_AUTO_DISCOVERY_LOAD_ORDER;\n if (['alphabetical', 'dependency', 'custom'].includes(loadOrder || '')) {\n config.modules!.autoDiscovery!.loadOrder = loadOrder as\n | 'alphabetical'\n | 'dependency'\n | 'custom';\n }\n }\n if (process.env.AUTO_DISCOVERY_FAIL_ON_ERROR || process.env.MORO_AUTO_DISCOVERY_FAIL_ON_ERROR) {\n if (!config.modules!.autoDiscovery) config.modules!.autoDiscovery = {} as any;\n config.modules!.autoDiscovery!.failOnError =\n (process.env.AUTO_DISCOVERY_FAIL_ON_ERROR ||\n process.env.MORO_AUTO_DISCOVERY_FAIL_ON_ERROR) === 'true';\n }\n if (process.env.AUTO_DISCOVERY_MAX_DEPTH || process.env.MORO_AUTO_DISCOVERY_MAX_DEPTH) {\n if (!config.modules!.autoDiscovery) config.modules!.autoDiscovery = {} as any;\n config.modules!.autoDiscovery!.maxDepth = parseInt(\n process.env.AUTO_DISCOVERY_MAX_DEPTH || process.env.MORO_AUTO_DISCOVERY_MAX_DEPTH || '5',\n 10\n );\n }\n }\n\n // File-based auto routing (config.routing). MORO_ROUTING=false disables it;\n // MORO_ROUTING_PATHS is a comma-separated list of directories to scan.\n const routingEnabled = parseBoolEnv(process.env.MORO_ROUTING ?? process.env.MORO_AUTO_ROUTING);\n const routingPaths = (process.env.MORO_ROUTING_PATHS || '')\n .split(',')\n .map(p => p.trim())\n .filter(Boolean);\n if (routingEnabled !== undefined || routingPaths.length > 0) {\n config.routing = {\n enabled: routingEnabled ?? true,\n ...(routingPaths.length > 0 ? { paths: routingPaths } : {}),\n };\n }\n\n return config;\n}\n\n/**\n * Normalize createApp options to match AppConfig structure\n * This handles the flexible createApp API while converting to structured config\n */\nfunction normalizeCreateAppOptions(options: MoroOptions): DeepPartial<AppConfig> {\n const config: DeepPartial<AppConfig> = {};\n\n // Direct config section overrides - merge with existing config\n if (options.server) {\n config.server = { ...config.server, ...options.server } as any;\n }\n\n // options.https is the node-style alias for server.ssl; options.http2 the\n // top-level HTTP/2 switch. Fold both into server config (only when the\n // canonical server field isn't already set) so a config file / env can also\n // drive them and everything flows through one validated shape. framework.ts\n // still reads options.https/options.http2 directly at highest precedence for\n // back-compat — they arrive identical after this.\n if ((options as any).https && !(options.server as any)?.ssl) {\n config.server = { ...(config.server as any), ssl: (options as any).https } as any;\n }\n if ((options as any).http2 !== undefined && (options.server as any)?.http2 === undefined) {\n config.server = { ...(config.server as any), http2: (options as any).http2 } as any;\n }\n if (options.database) {\n config.database = { ...config.database, ...options.database } as any;\n }\n if (options.modules) {\n config.modules = { ...config.modules, ...options.modules } as any;\n }\n\n // Handle autoDiscover option (maps to modules.autoDiscovery)\n if (options.autoDiscover !== undefined) {\n const autoDiscoveryConfig =\n typeof options.autoDiscover === 'boolean'\n ? { enabled: options.autoDiscover }\n : options.autoDiscover;\n\n config.modules = {\n ...config.modules,\n autoDiscovery: {\n ...DEFAULT_CONFIG.modules.autoDiscovery,\n ...autoDiscoveryConfig,\n },\n } as any;\n }\n\n // Handle validation option (maps to modules.validation)\n if (options.validation !== undefined) {\n config.modules = {\n ...config.modules,\n validation: {\n ...DEFAULT_CONFIG.modules.validation,\n ...options.validation,\n },\n } as any;\n }\n\n // Handle legacy modulesPath option (maps to modules.autoDiscovery.paths)\n if (options.modulesPath) {\n config.modules = {\n ...config.modules,\n autoDiscovery: {\n ...DEFAULT_CONFIG.modules.autoDiscovery,\n ...(config.modules as any)?.autoDiscovery,\n enabled: true,\n paths: [options.modulesPath],\n },\n } as any;\n }\n // Handle both 'logger' and 'logging' options (logger is an alias)\n if (options.logging) {\n config.logging = { ...config.logging, ...options.logging } as any;\n }\n if ((options as any).logger) {\n config.logging = { ...config.logging, ...(options as any).logger } as any;\n }\n if (options.security) {\n config.security = { ...config.security, ...options.security } as any;\n }\n if (options.external) {\n config.external = { ...config.external, ...options.external } as any;\n }\n if (options.performance) {\n config.performance = { ...config.performance, ...options.performance } as any;\n }\n if (options.jobs) {\n config.jobs = deepMerge(config.jobs || {}, options.jobs) as any;\n }\n\n // Handle shorthand boolean/object options\n if (options.cors !== undefined) {\n config.security = {\n ...config.security,\n cors:\n typeof options.cors === 'boolean'\n ? { ...DEFAULT_CONFIG.security.cors, enabled: options.cors }\n : { ...DEFAULT_CONFIG.security.cors, ...options.cors },\n } as any;\n }\n\n if (options.compression !== undefined) {\n config.performance = {\n ...config.performance,\n compression:\n typeof options.compression === 'boolean'\n ? { ...DEFAULT_CONFIG.performance.compression, enabled: options.compression }\n : { ...DEFAULT_CONFIG.performance.compression, ...options.compression },\n } as any;\n }\n\n if (options.helmet !== undefined) {\n config.security = {\n ...config.security,\n helmet:\n typeof options.helmet === 'boolean'\n ? { ...DEFAULT_CONFIG.security.helmet, enabled: options.helmet }\n : { ...DEFAULT_CONFIG.security.helmet, ...options.helmet },\n } as any;\n }\n\n return config;\n}\n\n/**\n * Check if a config field contains sensitive information\n */\n// Cache sensitive patterns as a Set for O(1) lookups\nconst SENSITIVE_PATTERNS = new Set([\n 'password',\n 'secret',\n 'key',\n 'token',\n 'auth',\n 'stripe',\n 'paypal',\n 'smtp.password',\n 'smtp.username',\n 'database.url',\n 'redis.url',\n 'mysql.password',\n]);\n\nfunction isSensitiveField(path: string): boolean {\n const lowerPath = path.toLowerCase();\n\n // Fast path: direct lookup for exact matches\n if (SENSITIVE_PATTERNS.has(lowerPath)) {\n return true;\n }\n\n // Check if any pattern is included in the path\n for (const pattern of SENSITIVE_PATTERNS) {\n if (lowerPath.includes(pattern)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Deep merge two configuration objects\n * Later object properties override earlier ones\n */\nfunction deepMerge<T extends Record<string, any>>(target: T, source: DeepPartial<T>): T {\n const result = { ...target };\n\n for (const key in source) {\n if (!Object.prototype.hasOwnProperty.call(source, key)) continue;\n\n const sourceValue = source[key];\n const targetValue = result[key];\n\n if (\n sourceValue &&\n typeof sourceValue === 'object' &&\n !Array.isArray(sourceValue) &&\n targetValue &&\n typeof targetValue === 'object' &&\n !Array.isArray(targetValue)\n ) {\n result[key] = deepMerge(targetValue, sourceValue as any);\n } else if (sourceValue !== undefined) {\n result[key] = sourceValue as any;\n }\n }\n\n return result;\n}\n\n/**\n * Track configuration sources for debugging\n */\nfunction trackConfigSource(\n config: any,\n sourceMap: Map<string, ConfigSourceInfo>,\n source: ConfigSourceInfo['source'],\n path: string\n): void {\n function traverse(obj: any, currentPath: string): void {\n for (const key in obj) {\n const value = obj[key];\n const fullPath = currentPath ? `${currentPath}.${key}` : key;\n\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n traverse(value, fullPath);\n } else {\n sourceMap.set(fullPath, { source, path, value });\n }\n }\n }\n\n traverse(config, '');\n}\n\n/**\n * Log configuration sources for debugging\n */\nfunction logConfigurationSources(sourceMap: Map<string, ConfigSourceInfo>): void {\n const allSources = Array.from(sourceMap.entries()).sort(([a], [b]) => a.localeCompare(b));\n const nonDefaultSources = allSources.filter(([_, info]) => info.source !== 'default');\n\n if (process.env.NODE_ENV === 'production') {\n // In production, only show non-default values with sensitive data obfuscated\n if (nonDefaultSources.length > 0) {\n logger.debug(`Configuration overrides loaded (${nonDefaultSources.length} total)`);\n\n nonDefaultSources.forEach(([path, info]) => {\n const valueStr = isSensitiveField(path)\n ? '***'\n : typeof info.value === 'object'\n ? JSON.stringify(info.value)\n : String(info.value);\n logger.debug(` ${path}: ${valueStr} (from ${info.source})`);\n });\n } else {\n logger.debug('Using default configuration (no overrides)');\n }\n } else {\n // In development, show all sources for debugging\n logger.debug(`Configuration sources loaded (${allSources.length} total)`);\n\n allSources.forEach(([path, info]) => {\n const valueStr =\n typeof info.value === 'object' ? JSON.stringify(info.value) : String(info.value);\n logger.debug(` ${path}: ${valueStr} (from ${info.source})`);\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"config-sources.js","sourceRoot":"","sources":["../../../src/core/config/config-sources.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-non-null-assertion --\n * This module walks the config tree along paths that were just created or\n * validated in the same function (e.g. the parent object is assigned on the\n * line above), so the non-null assertions are provably safe. Consolidated here\n * rather than repeated as ~23 inline disables. */\n/**\n * Configuration Sources - Load from Environment, Files, and Options\n *\n * This module handles loading configuration from different sources with clear precedence:\n * Environment Variables > createApp Options > Config File > Schema Defaults\n */\n\nimport { AppConfig, DeepPartial } from '../../types/config.js';\nimport { MoroOptions } from '../../types/core.js';\nimport { DEFAULT_CONFIG } from './schema.js';\nimport { loadConfigFileSync, loadConfigFile } from './file-loader.js';\nimport { createFrameworkLogger } from '../logger/index.js';\nimport { validateConfig } from './config-validator.js';\n\nconst logger = createFrameworkLogger('ConfigSources');\n\n/**\n * Configuration source metadata for debugging\n */\nexport interface ConfigSourceInfo {\n source: 'environment' | 'createApp' | 'configFile' | 'default';\n path: string;\n value: any;\n}\n\n/**\n * Load configuration from all sources with proper precedence\n * Returns a validated, complete configuration object\n */\nexport function loadConfigFromAllSources(createAppOptions?: MoroOptions): AppConfig {\n logger.debug('Loading configuration from all sources');\n\n // 1. Start with schema defaults\n let config = JSON.parse(JSON.stringify(DEFAULT_CONFIG)) as AppConfig;\n const sourceMap = new Map<string, ConfigSourceInfo>();\n\n // Track default values\n trackConfigSource(config, sourceMap, 'default', 'schema');\n\n // 2. Load and merge config file (if exists)\n try {\n const fileConfig = loadConfigFileSync();\n if (fileConfig) {\n config = deepMerge(config, fileConfig) as AppConfig;\n trackConfigSource(fileConfig, sourceMap, 'configFile', 'moro.config.js/ts');\n logger.debug('Config file loaded and merged');\n }\n } catch (error) {\n logger.warn('Config file loading failed, continuing without it:', String(error));\n }\n\n // 3. Load and merge environment variables\n const envConfig = loadEnvironmentConfig();\n config = deepMerge(config, envConfig) as AppConfig;\n trackConfigSource(envConfig, sourceMap, 'environment', 'process.env');\n\n // 4. Load and merge createApp options (highest precedence)\n if (createAppOptions) {\n const normalizedOptions = normalizeCreateAppOptions(createAppOptions);\n config = deepMerge(config, normalizedOptions) as AppConfig;\n trackConfigSource(normalizedOptions, sourceMap, 'createApp', 'createApp()');\n logger.debug('createApp options merged');\n }\n\n // 5. Validate the final configuration\n const validatedConfig = validateConfig(config);\n\n // Log configuration sources for debugging\n logConfigurationSources(sourceMap);\n\n return validatedConfig;\n}\n\n/**\n * Load configuration from all sources with proper precedence — async version.\n * Uses dynamic import() for the config file so ESM config files\n * (projects with \"type\":\"module\") are loaded correctly.\n *\n * Called by the async createApp() factory. Precedence is identical to the\n * sync version: Env Vars > createApp Options > Config File > Defaults\n */\nexport async function loadConfigFromAllSourcesAsync(\n createAppOptions?: MoroOptions\n): Promise<AppConfig> {\n logger.debug('Loading configuration from all sources (async)');\n\n // 1. Start with schema defaults\n let config = JSON.parse(JSON.stringify(DEFAULT_CONFIG)) as AppConfig;\n const sourceMap = new Map<string, ConfigSourceInfo>();\n\n trackConfigSource(config, sourceMap, 'default', 'schema');\n\n // 2. Load and merge config file via import() — supports both CJS and ESM\n try {\n const fileConfig = await loadConfigFile();\n if (fileConfig) {\n config = deepMerge(config, fileConfig) as AppConfig;\n trackConfigSource(fileConfig, sourceMap, 'configFile', 'moro.config.js/ts');\n logger.debug('Config file loaded and merged (async)');\n }\n } catch (error) {\n logger.warn('Config file loading failed, continuing without it:', String(error));\n }\n\n // 3. Load and merge environment variables\n const envConfig = loadEnvironmentConfig();\n config = deepMerge(config, envConfig) as AppConfig;\n trackConfigSource(envConfig, sourceMap, 'environment', 'process.env');\n\n // 4. Load and merge createApp options (highest precedence)\n if (createAppOptions) {\n const normalizedOptions = normalizeCreateAppOptions(createAppOptions);\n config = deepMerge(config, normalizedOptions) as AppConfig;\n trackConfigSource(normalizedOptions, sourceMap, 'createApp', 'createApp()');\n logger.debug('createApp options merged');\n }\n\n // 5. Validate the final configuration\n const validatedConfig = validateConfig(config);\n\n logConfigurationSources(sourceMap);\n\n return validatedConfig;\n}\n\n/**\n * Load configuration from environment variables\n * Handles both standard and MORO_ prefixed variables\n */\nfunction loadEnvironmentConfig(): DeepPartial<AppConfig> {\n const config: DeepPartial<AppConfig> = {};\n\n // Server configuration\n if (process.env.PORT || process.env.MORO_PORT) {\n if (!config.server) config.server = {} as any;\n config.server!.port = parseInt(process.env.PORT || process.env.MORO_PORT || '3001', 10);\n }\n\n if (process.env.HOST || process.env.MORO_HOST) {\n if (!config.server) config.server = {} as any;\n config.server!.host = process.env.HOST || process.env.MORO_HOST || 'localhost';\n }\n\n if (process.env.MAX_CONNECTIONS || process.env.MORO_MAX_CONNECTIONS) {\n if (!config.server) config.server = {} as any;\n config.server!.maxConnections = parseInt(\n process.env.MAX_CONNECTIONS || process.env.MORO_MAX_CONNECTIONS || '0',\n 10\n );\n }\n\n if (process.env.REQUEST_TIMEOUT || process.env.MORO_TIMEOUT) {\n if (!config.server) config.server = {} as any;\n if (!config.server!.timeouts) config.server!.timeouts = {} as any;\n // Now writes the canonical timeouts.request (timeout is its deprecated alias).\n config.server!.timeouts!.request = parseInt(\n process.env.REQUEST_TIMEOUT || process.env.MORO_TIMEOUT || '0',\n 10\n );\n }\n\n // Additional timeout knobs (all ms).\n const setTimeoutEnv = (envName: string, key: 'idle' | 'keepAlive' | 'headers') => {\n if (process.env[envName]) {\n if (!config.server) config.server = {} as any;\n if (!config.server!.timeouts) config.server!.timeouts = {} as any;\n (config.server!.timeouts as any)[key] = parseInt(process.env[envName] as string, 10);\n }\n };\n setTimeoutEnv('MORO_IDLE_TIMEOUT', 'idle');\n setTimeoutEnv('MORO_KEEPALIVE_TIMEOUT', 'keepAlive');\n setTimeoutEnv('MORO_HEADERS_TIMEOUT', 'headers');\n\n if (process.env.MORO_BACKLOG) {\n if (!config.server) config.server = {} as any;\n config.server!.backlog = parseInt(process.env.MORO_BACKLOG, 10);\n }\n\n // Limit knobs. Size values stay as strings so the validator/parser handle\n // '16kb'-style inputs uniformly.\n const setLimitEnv = (envName: string, key: string) => {\n if (process.env[envName]) {\n if (!config.server) config.server = {} as any;\n if (!config.server!.limits) config.server!.limits = {} as any;\n (config.server!.limits as any)[key] = process.env[envName];\n }\n };\n setLimitEnv('MORO_MAX_HEADER_SIZE', 'maxHeaderSize');\n setLimitEnv('MORO_WS_MAX_MESSAGE_SIZE', 'wsMaxMessageSize');\n if (process.env.MORO_MAX_HEADERS) {\n if (!config.server) config.server = {} as any;\n if (!config.server!.limits) config.server!.limits = {} as any;\n config.server!.limits!.maxHeaders = parseInt(process.env.MORO_MAX_HEADERS, 10);\n }\n const setMultipartEnv = (envName: string, key: string, numeric: boolean) => {\n if (process.env[envName]) {\n if (!config.server) config.server = {} as any;\n if (!config.server!.limits) config.server!.limits = {} as any;\n if (!config.server!.limits!.multipart) config.server!.limits!.multipart = {} as any;\n (config.server!.limits!.multipart as any)[key] = numeric\n ? parseInt(process.env[envName] as string, 10)\n : process.env[envName];\n }\n };\n setMultipartEnv('MORO_MULTIPART_MAX_PARTS', 'maxParts', true);\n setMultipartEnv('MORO_MULTIPART_MAX_FILES', 'maxFiles', true);\n setMultipartEnv('MORO_MULTIPART_MAX_FILE_SIZE', 'maxFileSize', false);\n\n // SSL from env (file paths + passphrase; never fails boot — a partial set is\n // caught by the validator).\n const setSslEnv = (envName: string, key: string) => {\n if (process.env[envName]) {\n if (!config.server) config.server = {} as any;\n if (!config.server!.ssl) config.server!.ssl = {} as any;\n (config.server!.ssl as any)[key] = process.env[envName];\n }\n };\n setSslEnv('MORO_SSL_KEY_FILE', 'keyFile');\n setSslEnv('MORO_SSL_CERT_FILE', 'certFile');\n setSslEnv('MORO_SSL_CA_FILE', 'caFile');\n setSslEnv('MORO_SSL_PASSPHRASE', 'passphrase');\n\n if (process.env.MORO_HTTP2) {\n const v = process.env.MORO_HTTP2.trim().toLowerCase();\n if (v === 'true' || v === '1' || v === 'false' || v === '0') {\n if (!config.server) config.server = {} as any;\n config.server!.http2 = v === 'true' || v === '1';\n }\n }\n\n if (process.env.MORO_SERVER_ENGINE) {\n // Normalize and whitelist like the other env enums (LOG_LEVEL etc.):\n // engine selection must never fail the boot, so an invalid value is\n // ignored rather than being handed to the validator to throw on.\n // Legacy 'auto'/'native' values map to 'moro'.\n const rawEngine = process.env.MORO_SERVER_ENGINE.trim().toLowerCase();\n const engineValue =\n rawEngine === 'auto' || rawEngine === 'native'\n ? 'moro'\n : rawEngine === 'moro' || rawEngine === 'node' || rawEngine === 'uws'\n ? rawEngine\n : undefined;\n if (engineValue) {\n if (!config.server) config.server = {} as any;\n config.server!.engine = engineValue;\n }\n }\n\n // Database configuration\n const databaseUrl = process.env.DATABASE_URL || process.env.MORO_DATABASE_URL;\n if (databaseUrl) {\n if (!config.database) config.database = {} as any;\n config.database!.url = databaseUrl;\n }\n\n // Redis configuration\n if (process.env.REDIS_URL || process.env.MORO_REDIS_URL) {\n if (!config.database) config.database = {} as any;\n if (!config.database!.redis) config.database!.redis = {} as any;\n config.database!.redis!.url =\n process.env.REDIS_URL || process.env.MORO_REDIS_URL || 'redis://localhost:6379';\n config.database!.redis!.maxRetries = parseInt(\n process.env.REDIS_MAX_RETRIES || process.env.MORO_REDIS_MAX_RETRIES || '3',\n 10\n );\n config.database!.redis!.retryDelay = parseInt(\n process.env.REDIS_RETRY_DELAY || process.env.MORO_REDIS_RETRY_DELAY || '1000',\n 10\n );\n config.database!.redis!.keyPrefix =\n process.env.REDIS_KEY_PREFIX || process.env.MORO_REDIS_KEY_PREFIX || 'moro:';\n }\n\n // MySQL configuration - only include if MYSQL_HOST is set\n if (process.env.MYSQL_HOST || process.env.MORO_MYSQL_HOST) {\n if (!config.database) config.database = {} as any;\n config.database!.mysql = {\n host: process.env.MYSQL_HOST || process.env.MORO_MYSQL_HOST || 'localhost',\n port: parseInt(process.env.MYSQL_PORT || process.env.MORO_MYSQL_PORT || '3306', 10),\n database: process.env.MYSQL_DATABASE || process.env.MORO_MYSQL_DB,\n username: process.env.MYSQL_USERNAME || process.env.MORO_MYSQL_USER,\n password: process.env.MYSQL_PASSWORD || process.env.MORO_MYSQL_PASS,\n connectionLimit: parseInt(\n process.env.MYSQL_CONNECTION_LIMIT || process.env.MORO_MYSQL_CONNECTIONS || '10',\n 10\n ),\n acquireTimeout: parseInt(\n process.env.MYSQL_ACQUIRE_TIMEOUT || process.env.MORO_MYSQL_ACQUIRE || '60000',\n 10\n ),\n timeout: parseInt(process.env.MYSQL_TIMEOUT || process.env.MORO_MYSQL_TIMEOUT || '60000', 10),\n } as any;\n }\n\n // Logging configuration\n const ensureLoggingBlock = (): NonNullable<DeepPartial<AppConfig>['logging']> => {\n if (!config.logging) config.logging = {} as any;\n return config.logging!;\n };\n\n // Parses common boolean-ish env strings; returns undefined if not set so we\n // never accidentally clobber a default with `false`.\n const parseBoolEnv = (raw: string | undefined): boolean | undefined => {\n if (raw === undefined) return undefined;\n const v = raw.trim().toLowerCase();\n if (v === '') return undefined;\n if (v === 'true' || v === '1' || v === 'yes' || v === 'on') return true;\n if (v === 'false' || v === '0' || v === 'no' || v === 'off') return false;\n return undefined;\n };\n\n if (process.env.LOG_LEVEL || process.env.MORO_LOG_LEVEL) {\n const level = process.env.LOG_LEVEL || process.env.MORO_LOG_LEVEL;\n if (\n level === 'debug' ||\n level === 'info' ||\n level === 'warn' ||\n level === 'error' ||\n level === 'fatal'\n ) {\n ensureLoggingBlock().level = level;\n }\n }\n\n if (process.env.LOG_FORMAT || process.env.MORO_LOG_FORMAT) {\n const fmt = (process.env.LOG_FORMAT || process.env.MORO_LOG_FORMAT) as\n 'pretty' | 'json' | 'compact';\n if (fmt === 'pretty' || fmt === 'json' || fmt === 'compact') {\n ensureLoggingBlock().format = fmt;\n }\n }\n\n const colorsEnv = parseBoolEnv(process.env.LOG_COLORS ?? process.env.MORO_LOG_COLORS);\n if (colorsEnv !== undefined) {\n ensureLoggingBlock().enableColors = colorsEnv;\n }\n\n const timestampEnv = parseBoolEnv(process.env.LOG_TIMESTAMP ?? process.env.MORO_LOG_TIMESTAMP);\n if (timestampEnv !== undefined) {\n ensureLoggingBlock().enableTimestamp = timestampEnv;\n }\n\n const contextEnv = parseBoolEnv(process.env.LOG_CONTEXT ?? process.env.MORO_LOG_CONTEXT);\n if (contextEnv !== undefined) {\n ensureLoggingBlock().enableContext = contextEnv;\n }\n\n // Opt-in: appends \"{...}\" JSON tail to pretty log lines.\n const metadataEnv = parseBoolEnv(process.env.LOG_METADATA ?? process.env.MORO_LOG_METADATA);\n if (metadataEnv !== undefined) {\n ensureLoggingBlock().enableMetadata = metadataEnv;\n }\n\n // Opt-in: collects/renders memory + duration on each log line.\n const perfEnv = parseBoolEnv(process.env.LOG_PERFORMANCE ?? process.env.MORO_LOG_PERFORMANCE);\n if (perfEnv !== undefined) {\n ensureLoggingBlock().enablePerformance = perfEnv;\n }\n\n // External services - only include if configured\n const externalConfig: Partial<AppConfig['external']> = {};\n\n // Stripe\n if (process.env.STRIPE_SECRET_KEY || process.env.MORO_STRIPE_SECRET) {\n externalConfig.stripe = {\n secretKey: process.env.STRIPE_SECRET_KEY || process.env.MORO_STRIPE_SECRET,\n publishableKey: process.env.STRIPE_PUBLISHABLE_KEY || process.env.MORO_STRIPE_PUBLIC,\n webhookSecret: process.env.STRIPE_WEBHOOK_SECRET || process.env.MORO_STRIPE_WEBHOOK,\n apiVersion: process.env.STRIPE_API_VERSION || process.env.MORO_STRIPE_VERSION || '2023-10-16',\n };\n }\n\n // PayPal\n if (process.env.PAYPAL_CLIENT_ID || process.env.MORO_PAYPAL_CLIENT) {\n externalConfig.paypal = {\n clientId: process.env.PAYPAL_CLIENT_ID || process.env.MORO_PAYPAL_CLIENT,\n clientSecret: process.env.PAYPAL_CLIENT_SECRET || process.env.MORO_PAYPAL_SECRET,\n webhookId: process.env.PAYPAL_WEBHOOK_ID || process.env.MORO_PAYPAL_WEBHOOK,\n environment:\n (process.env.PAYPAL_ENVIRONMENT || process.env.MORO_PAYPAL_ENV) === 'production'\n ? 'production'\n : 'sandbox',\n };\n }\n\n // SMTP\n if (process.env.SMTP_HOST || process.env.MORO_SMTP_HOST) {\n externalConfig.smtp = {\n host: process.env.SMTP_HOST || process.env.MORO_SMTP_HOST,\n port: parseInt(process.env.SMTP_PORT || process.env.MORO_SMTP_PORT || '587', 10),\n secure: (process.env.SMTP_SECURE || 'false').toLowerCase() === 'true',\n username: process.env.SMTP_USERNAME || process.env.MORO_SMTP_USER,\n password: process.env.SMTP_PASSWORD || process.env.MORO_SMTP_PASS,\n };\n }\n\n if (Object.keys(externalConfig).length > 0) {\n config.external = externalConfig;\n }\n\n // Module configuration\n const moduleEnvVars = [\n // Cache\n 'CACHE_ENABLED',\n 'MORO_CACHE_ENABLED',\n 'DEFAULT_CACHE_TTL',\n 'MORO_CACHE_TTL',\n 'CACHE_MAX_SIZE',\n 'MORO_CACHE_SIZE',\n 'CACHE_STRATEGY',\n 'MORO_CACHE_STRATEGY',\n // Rate Limit\n 'RATE_LIMIT_ENABLED',\n 'MORO_RATE_LIMIT_ENABLED',\n 'DEFAULT_RATE_LIMIT_REQUESTS',\n 'MORO_RATE_LIMIT_REQUESTS',\n 'DEFAULT_RATE_LIMIT_WINDOW',\n 'MORO_RATE_LIMIT_WINDOW',\n // Validation\n 'VALIDATION_ENABLED',\n 'MORO_VALIDATION_ENABLED',\n // Auto-Discovery\n 'AUTO_DISCOVERY_ENABLED',\n 'MORO_AUTO_DISCOVERY_ENABLED',\n 'AUTO_DISCOVERY_PATHS',\n 'MORO_AUTO_DISCOVERY_PATHS',\n 'AUTO_DISCOVERY_PATTERNS',\n 'MORO_AUTO_DISCOVERY_PATTERNS',\n 'AUTO_DISCOVERY_LOADING_STRATEGY',\n 'MORO_AUTO_DISCOVERY_LOADING_STRATEGY',\n 'AUTO_DISCOVERY_WATCH_FOR_CHANGES',\n 'MORO_AUTO_DISCOVERY_WATCH_FOR_CHANGES',\n 'AUTO_DISCOVERY_LOAD_ORDER',\n 'MORO_AUTO_DISCOVERY_LOAD_ORDER',\n 'AUTO_DISCOVERY_FAIL_ON_ERROR',\n 'MORO_AUTO_DISCOVERY_FAIL_ON_ERROR',\n 'AUTO_DISCOVERY_MAX_DEPTH',\n 'MORO_AUTO_DISCOVERY_MAX_DEPTH',\n ];\n\n if (moduleEnvVars.some(envVar => process.env[envVar])) {\n if (!config.modules) config.modules = {} as any;\n\n // Cache configuration\n if (process.env.CACHE_ENABLED || process.env.MORO_CACHE_ENABLED) {\n if (!config.modules!.cache) config.modules!.cache = {} as any;\n config.modules!.cache!.enabled =\n (process.env.CACHE_ENABLED || process.env.MORO_CACHE_ENABLED) === 'true';\n }\n if (process.env.DEFAULT_CACHE_TTL || process.env.MORO_CACHE_TTL) {\n if (!config.modules!.cache) config.modules!.cache = {} as any;\n config.modules!.cache!.defaultTtl = parseInt(\n process.env.DEFAULT_CACHE_TTL || process.env.MORO_CACHE_TTL || '300',\n 10\n );\n }\n if (process.env.CACHE_MAX_SIZE || process.env.MORO_CACHE_SIZE) {\n if (!config.modules!.cache) config.modules!.cache = {} as any;\n config.modules!.cache!.maxSize = parseInt(\n process.env.CACHE_MAX_SIZE || process.env.MORO_CACHE_SIZE || '1000',\n 10\n );\n }\n if (process.env.CACHE_STRATEGY || process.env.MORO_CACHE_STRATEGY) {\n if (!config.modules!.cache) config.modules!.cache = {} as any;\n const strategy = process.env.CACHE_STRATEGY || process.env.MORO_CACHE_STRATEGY;\n if (['lru', 'lfu', 'fifo'].includes(strategy || '')) {\n config.modules!.cache!.strategy = strategy as 'lru' | 'lfu' | 'fifo';\n }\n }\n\n // Rate limit configuration\n if (process.env.RATE_LIMIT_ENABLED || process.env.MORO_RATE_LIMIT_ENABLED) {\n if (!config.modules!.rateLimit) config.modules!.rateLimit = {} as any;\n config.modules!.rateLimit!.enabled =\n (process.env.RATE_LIMIT_ENABLED || process.env.MORO_RATE_LIMIT_ENABLED) === 'true';\n }\n if (process.env.DEFAULT_RATE_LIMIT_REQUESTS || process.env.MORO_RATE_LIMIT_REQUESTS) {\n if (!config.modules!.rateLimit) config.modules!.rateLimit = {} as any;\n config.modules!.rateLimit!.defaultRequests = parseInt(\n process.env.DEFAULT_RATE_LIMIT_REQUESTS || process.env.MORO_RATE_LIMIT_REQUESTS || '100',\n 10\n );\n }\n if (process.env.DEFAULT_RATE_LIMIT_WINDOW || process.env.MORO_RATE_LIMIT_WINDOW) {\n if (!config.modules!.rateLimit) config.modules!.rateLimit = {} as any;\n config.modules!.rateLimit!.defaultWindow = parseInt(\n process.env.DEFAULT_RATE_LIMIT_WINDOW || process.env.MORO_RATE_LIMIT_WINDOW || '60000',\n 10\n );\n }\n\n // Validation configuration\n if (process.env.VALIDATION_ENABLED || process.env.MORO_VALIDATION_ENABLED) {\n if (!config.modules!.validation) config.modules!.validation = {} as any;\n config.modules!.validation!.enabled =\n (process.env.VALIDATION_ENABLED || process.env.MORO_VALIDATION_ENABLED) === 'true';\n }\n\n // Auto-Discovery configuration\n if (process.env.AUTO_DISCOVERY_ENABLED || process.env.MORO_AUTO_DISCOVERY_ENABLED) {\n if (!config.modules!.autoDiscovery) config.modules!.autoDiscovery = {} as any;\n config.modules!.autoDiscovery!.enabled =\n (process.env.AUTO_DISCOVERY_ENABLED || process.env.MORO_AUTO_DISCOVERY_ENABLED) === 'true';\n }\n if (process.env.AUTO_DISCOVERY_PATHS || process.env.MORO_AUTO_DISCOVERY_PATHS) {\n if (!config.modules!.autoDiscovery) config.modules!.autoDiscovery = {} as any;\n const paths = (\n process.env.AUTO_DISCOVERY_PATHS ||\n process.env.MORO_AUTO_DISCOVERY_PATHS ||\n ''\n )\n .split(',')\n .map(p => p.trim())\n .filter(Boolean);\n if (paths.length > 0) {\n config.modules!.autoDiscovery!.paths = paths;\n }\n }\n if (process.env.AUTO_DISCOVERY_PATTERNS || process.env.MORO_AUTO_DISCOVERY_PATTERNS) {\n if (!config.modules!.autoDiscovery) config.modules!.autoDiscovery = {} as any;\n const patterns = (\n process.env.AUTO_DISCOVERY_PATTERNS ||\n process.env.MORO_AUTO_DISCOVERY_PATTERNS ||\n ''\n )\n .split(',')\n .map(p => p.trim())\n .filter(Boolean);\n if (patterns.length > 0) {\n config.modules!.autoDiscovery!.patterns = patterns;\n }\n }\n if (\n process.env.AUTO_DISCOVERY_LOADING_STRATEGY ||\n process.env.MORO_AUTO_DISCOVERY_LOADING_STRATEGY\n ) {\n if (!config.modules!.autoDiscovery) config.modules!.autoDiscovery = {} as any;\n const strategy =\n process.env.AUTO_DISCOVERY_LOADING_STRATEGY ||\n process.env.MORO_AUTO_DISCOVERY_LOADING_STRATEGY;\n if (['eager', 'lazy', 'conditional'].includes(strategy || '')) {\n config.modules!.autoDiscovery!.loadingStrategy = strategy as\n 'eager' | 'lazy' | 'conditional';\n }\n }\n if (\n process.env.AUTO_DISCOVERY_WATCH_FOR_CHANGES ||\n process.env.MORO_AUTO_DISCOVERY_WATCH_FOR_CHANGES\n ) {\n if (!config.modules!.autoDiscovery) config.modules!.autoDiscovery = {} as any;\n config.modules!.autoDiscovery!.watchForChanges =\n (process.env.AUTO_DISCOVERY_WATCH_FOR_CHANGES ||\n process.env.MORO_AUTO_DISCOVERY_WATCH_FOR_CHANGES) === 'true';\n }\n if (process.env.AUTO_DISCOVERY_LOAD_ORDER || process.env.MORO_AUTO_DISCOVERY_LOAD_ORDER) {\n if (!config.modules!.autoDiscovery) config.modules!.autoDiscovery = {} as any;\n const loadOrder =\n process.env.AUTO_DISCOVERY_LOAD_ORDER || process.env.MORO_AUTO_DISCOVERY_LOAD_ORDER;\n if (['alphabetical', 'dependency', 'custom'].includes(loadOrder || '')) {\n config.modules!.autoDiscovery!.loadOrder = loadOrder as\n 'alphabetical' | 'dependency' | 'custom';\n }\n }\n if (process.env.AUTO_DISCOVERY_FAIL_ON_ERROR || process.env.MORO_AUTO_DISCOVERY_FAIL_ON_ERROR) {\n if (!config.modules!.autoDiscovery) config.modules!.autoDiscovery = {} as any;\n config.modules!.autoDiscovery!.failOnError =\n (process.env.AUTO_DISCOVERY_FAIL_ON_ERROR ||\n process.env.MORO_AUTO_DISCOVERY_FAIL_ON_ERROR) === 'true';\n }\n if (process.env.AUTO_DISCOVERY_MAX_DEPTH || process.env.MORO_AUTO_DISCOVERY_MAX_DEPTH) {\n if (!config.modules!.autoDiscovery) config.modules!.autoDiscovery = {} as any;\n config.modules!.autoDiscovery!.maxDepth = parseInt(\n process.env.AUTO_DISCOVERY_MAX_DEPTH || process.env.MORO_AUTO_DISCOVERY_MAX_DEPTH || '5',\n 10\n );\n }\n }\n\n // File-based auto routing (config.routing). MORO_ROUTING=false disables it;\n // MORO_ROUTING_PATHS is a comma-separated list of directories to scan.\n const routingEnabled = parseBoolEnv(process.env.MORO_ROUTING ?? process.env.MORO_AUTO_ROUTING);\n const routingPaths = (process.env.MORO_ROUTING_PATHS || '')\n .split(',')\n .map(p => p.trim())\n .filter(Boolean);\n if (routingEnabled !== undefined || routingPaths.length > 0) {\n config.routing = {\n enabled: routingEnabled ?? true,\n ...(routingPaths.length > 0 ? { paths: routingPaths } : {}),\n };\n }\n\n return config;\n}\n\n/**\n * Normalize createApp options to match AppConfig structure\n * This handles the flexible createApp API while converting to structured config\n */\nfunction normalizeCreateAppOptions(options: MoroOptions): DeepPartial<AppConfig> {\n const config: DeepPartial<AppConfig> = {};\n\n // Direct config section overrides - merge with existing config\n if (options.server) {\n config.server = { ...config.server, ...options.server } as any;\n }\n\n // options.https is the node-style alias for server.ssl; options.http2 the\n // top-level HTTP/2 switch. Fold both into server config (only when the\n // canonical server field isn't already set) so a config file / env can also\n // drive them and everything flows through one validated shape. framework.ts\n // still reads options.https/options.http2 directly at highest precedence for\n // back-compat — they arrive identical after this.\n if ((options as any).https && !(options.server as any)?.ssl) {\n config.server = { ...(config.server as any), ssl: (options as any).https } as any;\n }\n if ((options as any).http2 !== undefined && (options.server as any)?.http2 === undefined) {\n config.server = { ...(config.server as any), http2: (options as any).http2 } as any;\n }\n if (options.database) {\n config.database = { ...config.database, ...options.database } as any;\n }\n if (options.modules) {\n config.modules = { ...config.modules, ...options.modules } as any;\n }\n\n // Handle autoDiscover option (maps to modules.autoDiscovery)\n if (options.autoDiscover !== undefined) {\n const autoDiscoveryConfig =\n typeof options.autoDiscover === 'boolean'\n ? { enabled: options.autoDiscover }\n : options.autoDiscover;\n\n config.modules = {\n ...config.modules,\n autoDiscovery: {\n ...DEFAULT_CONFIG.modules.autoDiscovery,\n ...autoDiscoveryConfig,\n },\n } as any;\n }\n\n // Handle validation option (maps to modules.validation)\n if (options.validation !== undefined) {\n config.modules = {\n ...config.modules,\n validation: {\n ...DEFAULT_CONFIG.modules.validation,\n ...options.validation,\n },\n } as any;\n }\n\n // Handle legacy modulesPath option (maps to modules.autoDiscovery.paths)\n if (options.modulesPath) {\n config.modules = {\n ...config.modules,\n autoDiscovery: {\n ...DEFAULT_CONFIG.modules.autoDiscovery,\n ...(config.modules as any)?.autoDiscovery,\n enabled: true,\n paths: [options.modulesPath],\n },\n } as any;\n }\n // Handle both 'logger' and 'logging' options (logger is an alias)\n if (options.logging) {\n config.logging = { ...config.logging, ...options.logging } as any;\n }\n if ((options as any).logger) {\n config.logging = { ...config.logging, ...(options as any).logger } as any;\n }\n if (options.security) {\n config.security = { ...config.security, ...options.security } as any;\n }\n if (options.external) {\n config.external = { ...config.external, ...options.external } as any;\n }\n if (options.performance) {\n config.performance = { ...config.performance, ...options.performance } as any;\n }\n if (options.jobs) {\n config.jobs = deepMerge(config.jobs || {}, options.jobs) as any;\n }\n\n // Handle shorthand boolean/object options\n if (options.cors !== undefined) {\n config.security = {\n ...config.security,\n cors:\n typeof options.cors === 'boolean'\n ? { ...DEFAULT_CONFIG.security.cors, enabled: options.cors }\n : { ...DEFAULT_CONFIG.security.cors, ...options.cors },\n } as any;\n }\n\n if (options.compression !== undefined) {\n config.performance = {\n ...config.performance,\n compression:\n typeof options.compression === 'boolean'\n ? { ...DEFAULT_CONFIG.performance.compression, enabled: options.compression }\n : { ...DEFAULT_CONFIG.performance.compression, ...options.compression },\n } as any;\n }\n\n if (options.helmet !== undefined) {\n config.security = {\n ...config.security,\n helmet:\n typeof options.helmet === 'boolean'\n ? { ...DEFAULT_CONFIG.security.helmet, enabled: options.helmet }\n : { ...DEFAULT_CONFIG.security.helmet, ...options.helmet },\n } as any;\n }\n\n return config;\n}\n\n/**\n * Check if a config field contains sensitive information\n */\n// Cache sensitive patterns as a Set for O(1) lookups\nconst SENSITIVE_PATTERNS = new Set([\n 'password',\n 'secret',\n 'key',\n 'token',\n 'auth',\n 'stripe',\n 'paypal',\n 'smtp.password',\n 'smtp.username',\n 'database.url',\n 'redis.url',\n 'mysql.password',\n]);\n\nfunction isSensitiveField(path: string): boolean {\n const lowerPath = path.toLowerCase();\n\n // Fast path: direct lookup for exact matches\n if (SENSITIVE_PATTERNS.has(lowerPath)) {\n return true;\n }\n\n // Check if any pattern is included in the path\n for (const pattern of SENSITIVE_PATTERNS) {\n if (lowerPath.includes(pattern)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Deep merge two configuration objects\n * Later object properties override earlier ones\n */\nfunction deepMerge<T extends Record<string, any>>(target: T, source: DeepPartial<T>): T {\n const result = { ...target };\n\n for (const key in source) {\n if (!Object.prototype.hasOwnProperty.call(source, key)) continue;\n\n const sourceValue = source[key];\n const targetValue = result[key];\n\n if (\n sourceValue &&\n typeof sourceValue === 'object' &&\n !Array.isArray(sourceValue) &&\n targetValue &&\n typeof targetValue === 'object' &&\n !Array.isArray(targetValue)\n ) {\n result[key] = deepMerge(targetValue, sourceValue as any);\n } else if (sourceValue !== undefined) {\n result[key] = sourceValue as any;\n }\n }\n\n return result;\n}\n\n/**\n * Track configuration sources for debugging\n */\nfunction trackConfigSource(\n config: any,\n sourceMap: Map<string, ConfigSourceInfo>,\n source: ConfigSourceInfo['source'],\n path: string\n): void {\n function traverse(obj: any, currentPath: string): void {\n for (const key in obj) {\n const value = obj[key];\n const fullPath = currentPath ? `${currentPath}.${key}` : key;\n\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n traverse(value, fullPath);\n } else {\n sourceMap.set(fullPath, { source, path, value });\n }\n }\n }\n\n traverse(config, '');\n}\n\n/**\n * Log configuration sources for debugging\n */\nfunction logConfigurationSources(sourceMap: Map<string, ConfigSourceInfo>): void {\n const allSources = Array.from(sourceMap.entries()).sort(([a], [b]) => a.localeCompare(b));\n const nonDefaultSources = allSources.filter(([_, info]) => info.source !== 'default');\n\n if (process.env.NODE_ENV === 'production') {\n // In production, only show non-default values with sensitive data obfuscated\n if (nonDefaultSources.length > 0) {\n logger.debug(`Configuration overrides loaded (${nonDefaultSources.length} total)`);\n\n nonDefaultSources.forEach(([path, info]) => {\n const valueStr = isSensitiveField(path)\n ? '***'\n : typeof info.value === 'object'\n ? JSON.stringify(info.value)\n : String(info.value);\n logger.debug(` ${path}: ${valueStr} (from ${info.source})`);\n });\n } else {\n logger.debug('Using default configuration (no overrides)');\n }\n } else {\n // In development, show all sources for debugging\n logger.debug(`Configuration sources loaded (${allSources.length} total)`);\n\n allSources.forEach(([path, info]) => {\n const valueStr =\n typeof info.value === 'object' ? JSON.stringify(info.value) : String(info.value);\n logger.debug(` ${path}: ${valueStr} (from ${info.source})`);\n });\n }\n}\n"]}
|
package/dist/core/framework.d.ts
CHANGED
|
@@ -100,6 +100,17 @@ export declare class Moro extends EventEmitter {
|
|
|
100
100
|
* Returns false if middleware stopped execution, true to continue
|
|
101
101
|
*/
|
|
102
102
|
private executeModuleMiddleware;
|
|
103
|
+
private namedMiddlewareCache;
|
|
104
|
+
/**
|
|
105
|
+
* Resolve a string middleware name to an executable (req, res, next) function.
|
|
106
|
+
* Resolution order: user-installed middleware (MiddlewareManager) → built-in
|
|
107
|
+
* factories instantiated with default options.
|
|
108
|
+
*
|
|
109
|
+
* Returns null when the name refers to a hook-based middleware that is
|
|
110
|
+
* already installed globally (nothing to run per-route). Throws when the name
|
|
111
|
+
* cannot be resolved — declared middleware is never silently skipped.
|
|
112
|
+
*/
|
|
113
|
+
private resolveNamedMiddleware;
|
|
103
114
|
private mountRouter;
|
|
104
115
|
private finalModuleHandlerSetup;
|
|
105
116
|
setupFinalModuleHandler(): void;
|
package/dist/core/framework.js
CHANGED
|
@@ -15,7 +15,7 @@ import { normalizeSSLConfig, sslForNode, sslForUws, sslIsComplete, } from './htt
|
|
|
15
15
|
import { MoroEventBus } from './events/index.js';
|
|
16
16
|
import { createFrameworkLogger, logger as globalLogger } from './logger/index.js';
|
|
17
17
|
import { mergeWebSocketConfig, } from './networking/websocket-adapter.js';
|
|
18
|
-
import { cors, helmet, compression } from './middleware/built-in/index.js';
|
|
18
|
+
import { cors, helmet, compression, MIDDLEWARE_FACTORY } from './middleware/built-in/index.js';
|
|
19
19
|
export class Moro extends EventEmitter {
|
|
20
20
|
httpServer;
|
|
21
21
|
server; // HTTP/2 server type or uWebSockets app
|
|
@@ -783,58 +783,65 @@ export class Moro extends EventEmitter {
|
|
|
783
783
|
// Middleware manager not registered, will fall back to built-in only
|
|
784
784
|
}
|
|
785
785
|
for (const mw of middleware) {
|
|
786
|
-
// If middleware is a string, resolve it from built-in or installed middleware
|
|
787
786
|
let resolvedMiddleware;
|
|
788
787
|
if (typeof mw === 'string') {
|
|
789
|
-
|
|
790
|
-
if (
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
if (!resolvedMiddleware) {
|
|
794
|
-
// Try to resolve from built-in middleware
|
|
795
|
-
const { builtInMiddleware } = await import('./middleware/built-in/index.js');
|
|
796
|
-
resolvedMiddleware = builtInMiddleware[mw];
|
|
797
|
-
}
|
|
798
|
-
if (!resolvedMiddleware) {
|
|
799
|
-
this.logger.warn(`Middleware '${mw}' not found, skipping`, 'ModuleMiddleware');
|
|
788
|
+
resolvedMiddleware = await this.resolveNamedMiddleware(mw, middlewareManager);
|
|
789
|
+
if (resolvedMiddleware === null) {
|
|
790
|
+
// Name refers to a hook-based middleware already installed globally —
|
|
791
|
+
// it runs through the hook pipeline, nothing to execute per-route.
|
|
800
792
|
continue;
|
|
801
793
|
}
|
|
802
794
|
}
|
|
803
795
|
else if (typeof mw === 'function') {
|
|
804
|
-
|
|
796
|
+
if (mw[MIDDLEWARE_FACTORY]) {
|
|
797
|
+
// A built-in factory passed uncalled — executing it as middleware
|
|
798
|
+
// would silently misbehave. Fail loudly with the fix.
|
|
799
|
+
throw new Error(`Built-in middleware factory '${mw.name || 'unknown'}' was passed uncalled in a middleware array. ` +
|
|
800
|
+
`Call it first: middleware: [factory(options)] — e.g. middleware: [middleware.helmet()].`);
|
|
801
|
+
}
|
|
805
802
|
resolvedMiddleware = mw;
|
|
806
803
|
}
|
|
804
|
+
else if (mw && typeof mw === 'object' && typeof mw.install === 'function') {
|
|
805
|
+
// A declared middleware that cannot run must fail the request, not be
|
|
806
|
+
// silently skipped — it may be an auth guard.
|
|
807
|
+
throw new Error(`Middleware '${mw.metadata?.name || mw.name || 'unknown'}' is a hook-based MiddlewareInterface and cannot run per-route. ` +
|
|
808
|
+
`Install it globally with app.use(...) instead of listing it in a middleware array.`);
|
|
809
|
+
}
|
|
807
810
|
else {
|
|
808
|
-
|
|
809
|
-
continue;
|
|
811
|
+
throw new Error(`Invalid module middleware entry of type ${typeof mw}`);
|
|
810
812
|
}
|
|
811
813
|
// Execute the middleware
|
|
812
814
|
try {
|
|
813
|
-
let middlewareContinue = true;
|
|
814
|
-
// Check if it's a MiddlewareInterface (needs to be converted to standard middleware)
|
|
815
|
-
if (resolvedMiddleware &&
|
|
816
|
-
typeof resolvedMiddleware === 'object' &&
|
|
817
|
-
typeof resolvedMiddleware.install === 'function') {
|
|
818
|
-
// This is a MiddlewareInterface, we can't execute it directly
|
|
819
|
-
// These should be installed globally via app.use() or via the middleware manager
|
|
820
|
-
this.logger.warn(`Middleware '${typeof mw === 'string' ? mw : 'unknown'}' is a MiddlewareInterface and cannot be used directly in module middleware. Use app.use() to install it globally instead.`, 'ModuleMiddleware');
|
|
821
|
-
continue;
|
|
822
|
-
}
|
|
823
815
|
await new Promise((resolve, reject) => {
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
816
|
+
let settled = false;
|
|
817
|
+
const done = () => {
|
|
818
|
+
if (!settled) {
|
|
819
|
+
settled = true;
|
|
820
|
+
if (typeof res.removeListener === 'function') {
|
|
821
|
+
res.removeListener('finish', done);
|
|
822
|
+
}
|
|
823
|
+
resolve();
|
|
824
|
+
}
|
|
827
825
|
};
|
|
828
|
-
|
|
826
|
+
// Middleware may legitimately end the response instead of calling
|
|
827
|
+
// next() (auth denial, rate limit, CORS preflight). Resolve on finish
|
|
828
|
+
// so a sync middleware that responds without next() cannot hang the
|
|
829
|
+
// request.
|
|
830
|
+
if (typeof res.once === 'function') {
|
|
831
|
+
res.once('finish', done);
|
|
832
|
+
}
|
|
833
|
+
else if (typeof res.on === 'function') {
|
|
834
|
+
res.on('finish', done);
|
|
835
|
+
}
|
|
836
|
+
const result = resolvedMiddleware(req, res, done);
|
|
829
837
|
// Handle async middleware
|
|
830
838
|
if (result && typeof result.then === 'function') {
|
|
831
|
-
result
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
839
|
+
result.then(done).catch((error) => {
|
|
840
|
+
if (!settled) {
|
|
841
|
+
settled = true;
|
|
842
|
+
reject(error);
|
|
835
843
|
}
|
|
836
|
-
})
|
|
837
|
-
.catch(reject);
|
|
844
|
+
});
|
|
838
845
|
}
|
|
839
846
|
});
|
|
840
847
|
// Check if response was sent
|
|
@@ -853,6 +860,70 @@ export class Moro extends EventEmitter {
|
|
|
853
860
|
}
|
|
854
861
|
return true; // Continue to handler
|
|
855
862
|
}
|
|
863
|
+
// String middleware names resolved once per framework instance. Unresolvable
|
|
864
|
+
// names cache their Error so every request fails fast with the same message
|
|
865
|
+
// without re-importing the built-in collections.
|
|
866
|
+
namedMiddlewareCache = new Map();
|
|
867
|
+
/**
|
|
868
|
+
* Resolve a string middleware name to an executable (req, res, next) function.
|
|
869
|
+
* Resolution order: user-installed middleware (MiddlewareManager) → built-in
|
|
870
|
+
* factories instantiated with default options.
|
|
871
|
+
*
|
|
872
|
+
* Returns null when the name refers to a hook-based middleware that is
|
|
873
|
+
* already installed globally (nothing to run per-route). Throws when the name
|
|
874
|
+
* cannot be resolved — declared middleware is never silently skipped.
|
|
875
|
+
*/
|
|
876
|
+
async resolveNamedMiddleware(name, middlewareManager) {
|
|
877
|
+
// User-installed middleware first — checked live because the manager's
|
|
878
|
+
// contents can change at runtime (install/uninstall).
|
|
879
|
+
const managed = middlewareManager?.get?.(name);
|
|
880
|
+
if (managed) {
|
|
881
|
+
if (typeof managed === 'function') {
|
|
882
|
+
return managed;
|
|
883
|
+
}
|
|
884
|
+
// Hook-based MiddlewareInterface installed via app.use(): already active
|
|
885
|
+
// for every request through the hook pipeline.
|
|
886
|
+
this.logger.debug(`Middleware '${name}' is installed globally as a hook; skipping per-route execution`, 'ModuleMiddleware');
|
|
887
|
+
return null;
|
|
888
|
+
}
|
|
889
|
+
const cached = this.namedMiddlewareCache.get(name);
|
|
890
|
+
if (cached) {
|
|
891
|
+
if (cached instanceof Error) {
|
|
892
|
+
throw cached;
|
|
893
|
+
}
|
|
894
|
+
return cached;
|
|
895
|
+
}
|
|
896
|
+
const { builtInMiddleware } = await import('./middleware/built-in/index.js');
|
|
897
|
+
let resolved = null;
|
|
898
|
+
let failure = null;
|
|
899
|
+
const factory = builtInMiddleware[name];
|
|
900
|
+
if (typeof factory === 'function') {
|
|
901
|
+
// Built-in factories take an options object; instantiate once with
|
|
902
|
+
// defaults. Factories that require configuration throw here.
|
|
903
|
+
try {
|
|
904
|
+
const instance = factory();
|
|
905
|
+
if (typeof instance === 'function') {
|
|
906
|
+
resolved = instance;
|
|
907
|
+
}
|
|
908
|
+
else {
|
|
909
|
+
failure = new Error(`Built-in middleware '${name}' is hook-based and cannot run per-route. ` +
|
|
910
|
+
`Install it globally with app.use(${name}(options)) instead of using the string name.`);
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
catch (error) {
|
|
914
|
+
failure = new Error(`Built-in middleware '${name}' requires configuration and cannot be used by name alone (${error.message}). ` +
|
|
915
|
+
`Pass the configured middleware function in the middleware array, or install it globally with app.use(${name}(options)).`);
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
else {
|
|
919
|
+
failure = new Error(`Middleware '${name}' not found. Use a built-in middleware name or install middleware before referencing it by name.`);
|
|
920
|
+
}
|
|
921
|
+
this.namedMiddlewareCache.set(name, resolved ?? failure);
|
|
922
|
+
if (failure) {
|
|
923
|
+
throw failure;
|
|
924
|
+
}
|
|
925
|
+
return resolved;
|
|
926
|
+
}
|
|
856
927
|
mountRouter(basePath, router) {
|
|
857
928
|
this.logger.debug(`Mounting router for basePath: ${basePath}`, 'Router');
|
|
858
929
|
// Register module routes directly with http-server
|