@morojs/moro 1.6.1 → 1.6.2
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/README.md +74 -256
- package/dist/core/auth/morojs-adapter.js +20 -20
- package/dist/core/auth/morojs-adapter.js.map +1 -1
- package/dist/core/config/config-manager.d.ts +44 -0
- package/dist/core/config/config-manager.js +104 -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 +503 -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 +791 -0
- package/dist/core/config/config-validator.js.map +1 -0
- package/dist/core/config/file-loader.d.ts +1 -6
- package/dist/core/config/file-loader.js +21 -249
- package/dist/core/config/file-loader.js.map +1 -1
- package/dist/core/config/index.d.ts +41 -12
- package/dist/core/config/index.js +65 -54
- package/dist/core/config/index.js.map +1 -1
- package/dist/core/config/schema.d.ts +2 -2
- package/dist/core/config/schema.js +55 -44
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/config/utils.d.ts +10 -3
- package/dist/core/config/utils.js +31 -58
- package/dist/core/config/utils.js.map +1 -1
- package/dist/core/database/adapters/drizzle.d.ts +1 -1
- package/dist/core/database/adapters/drizzle.js +18 -11
- package/dist/core/database/adapters/drizzle.js.map +1 -1
- package/dist/core/database/adapters/index.d.ts +7 -7
- package/dist/core/database/adapters/index.js +19 -29
- package/dist/core/database/adapters/index.js.map +1 -1
- package/dist/core/database/adapters/mongodb.d.ts +13 -1
- package/dist/core/database/adapters/mongodb.js +46 -10
- package/dist/core/database/adapters/mongodb.js.map +1 -1
- package/dist/core/database/adapters/mysql.d.ts +14 -1
- package/dist/core/database/adapters/mysql.js +19 -9
- package/dist/core/database/adapters/mysql.js.map +1 -1
- package/dist/core/database/adapters/postgresql.d.ts +12 -2
- package/dist/core/database/adapters/postgresql.js +19 -9
- package/dist/core/database/adapters/postgresql.js.map +1 -1
- package/dist/core/database/adapters/redis.d.ts +12 -1
- package/dist/core/database/adapters/redis.js +48 -13
- package/dist/core/database/adapters/redis.js.map +1 -1
- package/dist/core/database/adapters/sqlite.d.ts +3 -1
- package/dist/core/database/adapters/sqlite.js +19 -8
- package/dist/core/database/adapters/sqlite.js.map +1 -1
- package/dist/core/database/index.d.ts +2 -2
- package/dist/core/database/index.js +2 -18
- package/dist/core/database/index.js.map +1 -1
- package/dist/core/docs/index.d.ts +9 -9
- package/dist/core/docs/index.js +14 -35
- package/dist/core/docs/index.js.map +1 -1
- package/dist/core/docs/openapi-generator.d.ts +2 -2
- package/dist/core/docs/openapi-generator.js +11 -16
- package/dist/core/docs/openapi-generator.js.map +1 -1
- package/dist/core/docs/schema-to-openapi.d.ts +2 -2
- package/dist/core/docs/schema-to-openapi.js +5 -11
- package/dist/core/docs/schema-to-openapi.js.map +1 -1
- package/dist/core/docs/simple-docs.d.ts +1 -1
- package/dist/core/docs/simple-docs.js +4 -9
- package/dist/core/docs/simple-docs.js.map +1 -1
- package/dist/core/docs/swagger-ui.d.ts +2 -2
- package/dist/core/docs/swagger-ui.js +26 -29
- package/dist/core/docs/swagger-ui.js.map +1 -1
- package/dist/core/docs/zod-to-openapi.js +31 -28
- package/dist/core/docs/zod-to-openapi.js.map +1 -1
- package/dist/core/events/event-bus.d.ts +1 -1
- package/dist/core/events/event-bus.js +7 -11
- package/dist/core/events/event-bus.js.map +1 -1
- package/dist/core/events/index.d.ts +2 -2
- package/dist/core/events/index.js +1 -5
- package/dist/core/events/index.js.map +1 -1
- package/dist/core/framework.d.ts +20 -13
- package/dist/core/framework.js +285 -102
- package/dist/core/framework.js.map +1 -1
- package/dist/core/http/http-server.d.ts +59 -7
- package/dist/core/http/http-server.js +190 -176
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/index.d.ts +4 -3
- package/dist/core/http/index.js +3 -8
- package/dist/core/http/index.js.map +1 -1
- package/dist/core/http/uws-http-server.d.ts +46 -0
- package/dist/core/http/uws-http-server.js +523 -0
- package/dist/core/http/uws-http-server.js.map +1 -0
- package/dist/core/logger/filters.d.ts +1 -1
- package/dist/core/logger/filters.js +20 -23
- package/dist/core/logger/filters.js.map +1 -1
- package/dist/core/logger/index.d.ts +3 -3
- package/dist/core/logger/index.js +2 -24
- package/dist/core/logger/index.js.map +1 -1
- package/dist/core/logger/logger.d.ts +30 -14
- package/dist/core/logger/logger.js +398 -223
- package/dist/core/logger/logger.js.map +1 -1
- package/dist/core/logger/outputs.d.ts +1 -1
- package/dist/core/logger/outputs.js +8 -17
- package/dist/core/logger/outputs.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/file.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/file.js +10 -47
- package/dist/core/middleware/built-in/adapters/cache/file.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/cache/index.js +10 -17
- package/dist/core/middleware/built-in/adapters/cache/index.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.js +3 -7
- package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +3 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.js +11 -9
- package/dist/core/middleware/built-in/adapters/cache/redis.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.js +3 -7
- package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js +3 -7
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +3 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +12 -10
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/cdn/index.js +10 -17
- package/dist/core/middleware/built-in/adapters/cdn/index.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/index.js +4 -23
- package/dist/core/middleware/built-in/adapters/index.js.map +1 -1
- package/dist/core/middleware/built-in/auth-helpers.js +11 -22
- package/dist/core/middleware/built-in/auth-helpers.js.map +1 -1
- package/dist/core/middleware/built-in/auth-providers.d.ts +1 -1
- package/dist/core/middleware/built-in/auth-providers.js +4 -9
- package/dist/core/middleware/built-in/auth-providers.js.map +1 -1
- package/dist/core/middleware/built-in/auth.d.ts +2 -2
- package/dist/core/middleware/built-in/auth.js +93 -26
- package/dist/core/middleware/built-in/auth.js.map +1 -1
- package/dist/core/middleware/built-in/cache.d.ts +2 -2
- package/dist/core/middleware/built-in/cache.js +11 -12
- package/dist/core/middleware/built-in/cache.js.map +1 -1
- package/dist/core/middleware/built-in/cdn.d.ts +2 -2
- package/dist/core/middleware/built-in/cdn.js +5 -9
- package/dist/core/middleware/built-in/cdn.js.map +1 -1
- package/dist/core/middleware/built-in/cookie.d.ts +1 -1
- package/dist/core/middleware/built-in/cookie.js +3 -7
- package/dist/core/middleware/built-in/cookie.js.map +1 -1
- package/dist/core/middleware/built-in/cors.d.ts +1 -1
- package/dist/core/middleware/built-in/cors.js +3 -7
- package/dist/core/middleware/built-in/cors.js.map +1 -1
- package/dist/core/middleware/built-in/csp.d.ts +1 -1
- package/dist/core/middleware/built-in/csp.js +5 -8
- package/dist/core/middleware/built-in/csp.js.map +1 -1
- package/dist/core/middleware/built-in/csrf.d.ts +1 -1
- package/dist/core/middleware/built-in/csrf.js +5 -8
- package/dist/core/middleware/built-in/csrf.js.map +1 -1
- package/dist/core/middleware/built-in/error-tracker.js +3 -7
- package/dist/core/middleware/built-in/error-tracker.js.map +1 -1
- package/dist/core/middleware/built-in/index.d.ts +28 -27
- package/dist/core/middleware/built-in/index.js +48 -78
- package/dist/core/middleware/built-in/index.js.map +1 -1
- package/dist/core/middleware/built-in/jwt-helpers.d.ts +118 -0
- package/dist/core/middleware/built-in/jwt-helpers.js +218 -0
- package/dist/core/middleware/built-in/jwt-helpers.js.map +1 -0
- package/dist/core/middleware/built-in/performance-monitor.js +3 -7
- package/dist/core/middleware/built-in/performance-monitor.js.map +1 -1
- package/dist/core/middleware/built-in/rate-limit.d.ts +1 -1
- package/dist/core/middleware/built-in/rate-limit.js +3 -7
- package/dist/core/middleware/built-in/rate-limit.js.map +1 -1
- package/dist/core/middleware/built-in/request-logger.js +5 -8
- package/dist/core/middleware/built-in/request-logger.js.map +1 -1
- package/dist/core/middleware/built-in/session.d.ts +2 -2
- package/dist/core/middleware/built-in/session.js +11 -15
- package/dist/core/middleware/built-in/session.js.map +1 -1
- package/dist/core/middleware/built-in/sse.d.ts +1 -1
- package/dist/core/middleware/built-in/sse.js +12 -14
- package/dist/core/middleware/built-in/sse.js.map +1 -1
- package/dist/core/middleware/built-in/validation.d.ts +1 -1
- package/dist/core/middleware/built-in/validation.js +3 -7
- package/dist/core/middleware/built-in/validation.js.map +1 -1
- package/dist/core/middleware/index.d.ts +4 -4
- package/dist/core/middleware/index.js +8 -28
- package/dist/core/middleware/index.js.map +1 -1
- package/dist/core/modules/auto-discovery.d.ts +19 -2
- package/dist/core/modules/auto-discovery.js +391 -74
- package/dist/core/modules/auto-discovery.js.map +1 -1
- package/dist/core/modules/index.d.ts +2 -2
- package/dist/core/modules/index.js +2 -9
- package/dist/core/modules/index.js.map +1 -1
- package/dist/core/modules/modules.d.ts +3 -3
- package/dist/core/modules/modules.js +23 -54
- package/dist/core/modules/modules.js.map +1 -1
- package/dist/core/networking/adapters/index.d.ts +4 -3
- package/dist/core/networking/adapters/index.js +3 -7
- package/dist/core/networking/adapters/index.js.map +1 -1
- package/dist/core/networking/adapters/socketio-adapter.d.ts +1 -1
- package/dist/core/networking/adapters/socketio-adapter.js +5 -40
- package/dist/core/networking/adapters/socketio-adapter.js.map +1 -1
- package/dist/core/networking/adapters/uws-adapter.d.ts +44 -0
- package/dist/core/networking/adapters/uws-adapter.js +513 -0
- package/dist/core/networking/adapters/uws-adapter.js.map +1 -0
- package/dist/core/networking/adapters/ws-adapter.d.ts +2 -2
- package/dist/core/networking/adapters/ws-adapter.js +8 -43
- package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
- package/dist/core/networking/index.d.ts +3 -2
- package/dist/core/networking/index.js +2 -7
- package/dist/core/networking/index.js.map +1 -1
- package/dist/core/networking/service-discovery.js +8 -12
- package/dist/core/networking/service-discovery.js.map +1 -1
- package/dist/core/networking/websocket-adapter.js +1 -2
- package/dist/core/networking/websocket-adapter.js.map +1 -1
- package/dist/core/networking/websocket-manager.d.ts +3 -3
- package/dist/core/networking/websocket-manager.js +9 -11
- package/dist/core/networking/websocket-manager.js.map +1 -1
- package/dist/core/pooling/object-pool-manager.d.ts +140 -0
- package/dist/core/pooling/object-pool-manager.js +502 -0
- package/dist/core/pooling/object-pool-manager.js.map +1 -0
- package/dist/core/routing/app-integration.d.ts +14 -12
- package/dist/core/routing/app-integration.js +49 -85
- package/dist/core/routing/app-integration.js.map +1 -1
- package/dist/core/routing/index.d.ts +17 -11
- package/dist/core/routing/index.js +48 -237
- package/dist/core/routing/index.js.map +1 -1
- package/dist/core/routing/path-matcher.d.ts +67 -0
- package/dist/core/routing/path-matcher.js +182 -0
- package/dist/core/routing/path-matcher.js.map +1 -0
- package/dist/core/routing/router.d.ts +38 -0
- package/dist/core/routing/router.js +68 -0
- package/dist/core/routing/router.js.map +1 -0
- package/dist/core/routing/unified-router.d.ts +148 -0
- package/dist/core/routing/unified-router.js +684 -0
- package/dist/core/routing/unified-router.js.map +1 -0
- package/dist/core/runtime/aws-lambda-adapter.d.ts +3 -3
- package/dist/core/runtime/aws-lambda-adapter.js +2 -6
- package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
- package/dist/core/runtime/base-adapter.d.ts +2 -2
- package/dist/core/runtime/base-adapter.js +3 -7
- package/dist/core/runtime/base-adapter.js.map +1 -1
- package/dist/core/runtime/cloudflare-workers-adapter.d.ts +3 -3
- package/dist/core/runtime/cloudflare-workers-adapter.js +2 -6
- package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
- package/dist/core/runtime/index.d.ts +12 -12
- package/dist/core/runtime/index.js +22 -35
- package/dist/core/runtime/index.js.map +1 -1
- package/dist/core/runtime/node-adapter.d.ts +4 -4
- package/dist/core/runtime/node-adapter.js +18 -49
- package/dist/core/runtime/node-adapter.js.map +1 -1
- package/dist/core/runtime/vercel-edge-adapter.d.ts +3 -3
- package/dist/core/runtime/vercel-edge-adapter.js +2 -6
- package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
- package/dist/core/utilities/circuit-breaker.js +1 -5
- package/dist/core/utilities/circuit-breaker.js.map +1 -1
- package/dist/core/utilities/container.js +12 -22
- package/dist/core/utilities/container.js.map +1 -1
- package/dist/core/utilities/hooks.d.ts +2 -2
- package/dist/core/utilities/hooks.js +7 -12
- package/dist/core/utilities/hooks.js.map +1 -1
- package/dist/core/utilities/index.d.ts +5 -4
- package/dist/core/utilities/index.js +5 -19
- package/dist/core/utilities/index.js.map +1 -1
- package/dist/core/utilities/package-utils.d.ts +38 -0
- package/dist/core/utilities/package-utils.js +57 -0
- package/dist/core/utilities/package-utils.js.map +1 -0
- package/dist/core/validation/adapters.d.ts +1 -1
- package/dist/core/validation/adapters.js +15 -26
- package/dist/core/validation/adapters.js.map +1 -1
- package/dist/core/validation/index.d.ts +6 -4
- package/dist/core/validation/index.js +57 -28
- package/dist/core/validation/index.js.map +1 -1
- package/dist/core/validation/schema-interface.js +3 -9
- package/dist/core/validation/schema-interface.js.map +1 -1
- package/dist/index.d.ts +51 -52
- package/dist/index.js +23 -132
- package/dist/index.js.map +1 -1
- package/dist/moro.d.ts +70 -16
- package/dist/moro.js +658 -271
- package/dist/moro.js.map +1 -1
- package/dist/types/auth.js +3 -9
- package/dist/types/auth.js.map +1 -1
- package/dist/types/cache.js +1 -2
- package/dist/types/cdn.js +1 -2
- package/dist/types/config.d.ts +73 -2
- package/dist/types/config.js +1 -2
- package/dist/types/config.js.map +1 -1
- package/dist/types/core.d.ts +36 -42
- package/dist/types/core.js +1 -2
- package/dist/types/database.js +1 -2
- package/dist/types/discovery.js +1 -2
- package/dist/types/events.js +1 -2
- package/dist/types/hooks.d.ts +1 -1
- package/dist/types/hooks.js +1 -2
- package/dist/types/http.d.ts +16 -1
- package/dist/types/http.js +1 -2
- package/dist/types/logger.d.ts +7 -0
- package/dist/types/logger.js +1 -2
- package/dist/types/module.d.ts +11 -0
- package/dist/types/module.js +1 -2
- package/dist/types/runtime.d.ts +1 -1
- package/dist/types/runtime.js +1 -2
- package/dist/types/session.js +1 -2
- package/jest.config.mjs +41 -0
- package/package.json +19 -52
- package/src/core/auth/morojs-adapter.ts +18 -13
- package/src/core/config/config-manager.ts +133 -0
- package/src/core/config/config-sources.ts +600 -0
- package/src/core/config/config-validator.ts +1116 -0
- package/src/core/config/file-loader.ts +16 -273
- package/src/core/config/index.ts +83 -34
- package/src/core/config/schema.ts +47 -33
- package/src/core/config/utils.ts +24 -31
- package/src/core/database/README.md +26 -16
- package/src/core/database/adapters/drizzle.ts +18 -6
- package/src/core/database/adapters/index.ts +13 -13
- package/src/core/database/adapters/mongodb.ts +53 -5
- package/src/core/database/adapters/mysql.ts +32 -4
- package/src/core/database/adapters/postgresql.ts +30 -5
- package/src/core/database/adapters/redis.ts +61 -8
- package/src/core/database/adapters/sqlite.ts +19 -3
- package/src/core/database/index.ts +2 -2
- package/src/core/docs/index.ts +8 -8
- package/src/core/docs/openapi-generator.ts +4 -4
- package/src/core/docs/schema-to-openapi.ts +3 -6
- package/src/core/docs/simple-docs.ts +2 -2
- package/src/core/docs/swagger-ui.ts +19 -16
- package/src/core/docs/zod-to-openapi.ts +34 -34
- package/src/core/events/event-bus.ts +3 -3
- package/src/core/events/index.ts +2 -2
- package/src/core/framework.ts +320 -71
- package/src/core/http/http-server.ts +203 -143
- package/src/core/http/index.ts +4 -3
- package/src/core/http/uws-http-server.ts +591 -0
- package/src/core/logger/filters.ts +13 -5
- package/src/core/logger/index.ts +4 -3
- package/src/core/logger/logger.ts +435 -216
- package/src/core/logger/outputs.ts +1 -3
- package/src/core/middleware/built-in/adapters/cache/file.ts +3 -3
- package/src/core/middleware/built-in/adapters/cache/index.ts +7 -7
- package/src/core/middleware/built-in/adapters/cache/memory.ts +2 -2
- package/src/core/middleware/built-in/adapters/cache/redis.ts +18 -4
- package/src/core/middleware/built-in/adapters/cdn/azure.ts +2 -2
- package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +2 -2
- package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +16 -5
- package/src/core/middleware/built-in/adapters/cdn/index.ts +7 -7
- package/src/core/middleware/built-in/adapters/index.ts +4 -4
- package/src/core/middleware/built-in/auth-helpers.ts +1 -1
- package/src/core/middleware/built-in/auth-providers.ts +1 -1
- package/src/core/middleware/built-in/auth.ts +102 -21
- package/src/core/middleware/built-in/cache.ts +8 -6
- package/src/core/middleware/built-in/cdn.ts +4 -4
- package/src/core/middleware/built-in/cookie.ts +2 -2
- package/src/core/middleware/built-in/cors.ts +2 -2
- package/src/core/middleware/built-in/csp.ts +3 -3
- package/src/core/middleware/built-in/csrf.ts +3 -3
- package/src/core/middleware/built-in/error-tracker.ts +1 -1
- package/src/core/middleware/built-in/index.ts +38 -30
- package/src/core/middleware/built-in/jwt-helpers.ts +243 -0
- package/src/core/middleware/built-in/performance-monitor.ts +1 -1
- package/src/core/middleware/built-in/rate-limit.ts +2 -2
- package/src/core/middleware/built-in/request-logger.ts +3 -1
- package/src/core/middleware/built-in/session.ts +7 -8
- package/src/core/middleware/built-in/sse.ts +11 -9
- package/src/core/middleware/built-in/validation.ts +2 -2
- package/src/core/middleware/index.ts +6 -6
- package/src/core/modules/auto-discovery.ts +478 -15
- package/src/core/modules/index.ts +2 -2
- package/src/core/modules/modules.ts +23 -12
- package/src/core/networking/adapters/index.ts +4 -3
- package/src/core/networking/adapters/socketio-adapter.ts +5 -3
- package/src/core/networking/adapters/uws-adapter.ts +619 -0
- package/src/core/networking/adapters/ws-adapter.ts +8 -9
- package/src/core/networking/index.ts +3 -2
- package/src/core/networking/service-discovery.ts +6 -7
- package/src/core/networking/websocket-manager.ts +7 -7
- package/src/core/pooling/object-pool-manager.ts +630 -0
- package/src/core/routing/app-integration.ts +60 -112
- package/src/core/routing/index.ts +66 -293
- package/src/core/routing/path-matcher.ts +222 -0
- package/src/core/routing/router.ts +97 -0
- package/src/core/routing/unified-router.ts +870 -0
- package/src/core/runtime/aws-lambda-adapter.ts +3 -3
- package/src/core/runtime/base-adapter.ts +2 -2
- package/src/core/runtime/cloudflare-workers-adapter.ts +3 -3
- package/src/core/runtime/index.ts +13 -13
- package/src/core/runtime/node-adapter.ts +16 -10
- package/src/core/runtime/vercel-edge-adapter.ts +3 -3
- package/src/core/utilities/hooks.ts +3 -3
- package/src/core/utilities/index.ts +5 -4
- package/src/core/utilities/package-utils.ts +59 -0
- package/src/core/validation/adapters.ts +1 -1
- package/src/core/validation/index.ts +68 -16
- package/src/index.ts +73 -66
- package/src/moro.ts +784 -253
- package/src/types/config.ts +74 -2
- package/src/types/core.ts +49 -47
- package/src/types/hooks.ts +1 -1
- package/src/types/http.ts +23 -1
- package/src/types/logger.ts +9 -0
- package/src/types/module.ts +12 -0
- package/src/types/runtime.ts +1 -1
- package/tsconfig.json +4 -2
- 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/dist/core/http/router.d.ts +0 -14
- package/dist/core/http/router.js +0 -109
- package/dist/core/http/router.js.map +0 -1
- package/src/core/config/loader.ts +0 -633
- package/src/core/config/validation.ts +0 -140
- package/src/core/http/router.ts +0 -141
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
// Configuration File Loader - Load moro.config.js/ts files
|
|
2
2
|
import { existsSync } from 'fs';
|
|
3
3
|
import { join } from 'path';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { createRequire } from 'module';
|
|
5
|
+
import { AppConfig } from './schema.js';
|
|
6
|
+
import { createFrameworkLogger } from '../logger/index.js';
|
|
6
7
|
|
|
7
8
|
const logger = createFrameworkLogger('ConfigFile');
|
|
8
9
|
|
|
10
|
+
// Create require function for ESM to enable synchronous config loading
|
|
11
|
+
// Use process.cwd() as base since we're loading with absolute paths anyway
|
|
12
|
+
const moduleRequire = createRequire(join(process.cwd(), 'index.js'));
|
|
13
|
+
|
|
9
14
|
/**
|
|
10
15
|
* Supported configuration file names in order of preference
|
|
11
16
|
*/
|
|
@@ -23,55 +28,26 @@ export function loadConfigFileSync(cwd: string = process.cwd()): Partial<AppConf
|
|
|
23
28
|
logger.debug('No configuration file found');
|
|
24
29
|
return null;
|
|
25
30
|
}
|
|
26
|
-
// Handle TypeScript files by trying dynamic import (works with tsx/ts-node runtimes)
|
|
27
|
-
if (configFile.endsWith('.ts')) {
|
|
28
|
-
logger.debug('Found TypeScript config file, attempting to load with dynamic import');
|
|
29
|
-
try {
|
|
30
|
-
// When running under tsx/ts-node, dynamic imports work synchronously for TypeScript
|
|
31
|
-
// We can use require() with the current environment that already has TypeScript support
|
|
32
|
-
const config = require(configFile);
|
|
33
|
-
const configData = config.default || config;
|
|
34
|
-
|
|
35
|
-
if (!configData || typeof configData !== 'object') {
|
|
36
|
-
logger.warn(`Configuration file ${configFile} did not export a valid configuration object`);
|
|
37
|
-
return null;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
logger.info(`TypeScript configuration loaded from: ${configFile}`);
|
|
41
|
-
return configData;
|
|
42
|
-
} catch (error) {
|
|
43
|
-
logger.debug(
|
|
44
|
-
'TypeScript config loading failed in sync mode, this is expected if not running with tsx/ts-node'
|
|
45
|
-
);
|
|
46
|
-
logger.debug('Error details:', String(error));
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// Only .js files use the standard synchronous loading
|
|
52
|
-
if (!configFile.endsWith('.js')) {
|
|
53
|
-
logger.debug(
|
|
54
|
-
'Found config file with unsupported extension. Only .js and .ts files are supported.'
|
|
55
|
-
);
|
|
56
|
-
return null;
|
|
57
|
-
}
|
|
58
31
|
|
|
59
32
|
logger.debug(`Loading configuration from: ${configFile}`);
|
|
60
33
|
|
|
61
34
|
try {
|
|
62
|
-
//
|
|
63
|
-
|
|
35
|
+
// Use createRequire to enable synchronous loading in ESM
|
|
36
|
+
// Clear the require cache to ensure fresh config on each load
|
|
37
|
+
delete moduleRequire.cache[moduleRequire.resolve(configFile)];
|
|
64
38
|
|
|
65
|
-
const
|
|
66
|
-
const configData = config.default || config;
|
|
39
|
+
const configModule = moduleRequire(configFile);
|
|
67
40
|
|
|
68
|
-
|
|
41
|
+
// Handle ES module default export
|
|
42
|
+
const config = configModule.default || configModule;
|
|
43
|
+
|
|
44
|
+
if (!config || typeof config !== 'object') {
|
|
69
45
|
logger.warn(`Configuration file ${configFile} did not export a valid configuration object`);
|
|
70
46
|
return null;
|
|
71
47
|
}
|
|
72
48
|
|
|
73
49
|
logger.info(`Configuration loaded from: ${configFile}`);
|
|
74
|
-
return
|
|
50
|
+
return config;
|
|
75
51
|
} catch (error) {
|
|
76
52
|
logger.error(`Failed to load configuration file ${configFile}:`, String(error));
|
|
77
53
|
logger.warn('Falling back to environment variable configuration');
|
|
@@ -172,236 +148,3 @@ async function setupTypeScriptLoader(): Promise<void> {
|
|
|
172
148
|
// the TypeScript transpilation is already handled by those tools.
|
|
173
149
|
logger.debug('TypeScript config loading delegated to runtime environment');
|
|
174
150
|
}
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* Convert a configuration object to environment variable mappings
|
|
178
|
-
* This function flattens the config object and sets corresponding environment variables
|
|
179
|
-
*/
|
|
180
|
-
export function applyConfigAsEnvironmentVariables(config: Partial<AppConfig>): void {
|
|
181
|
-
if (!config || typeof config !== 'object') {
|
|
182
|
-
return;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
// Apply server configuration
|
|
186
|
-
if (config.server) {
|
|
187
|
-
setEnvIfNotSet('PORT', config.server.port?.toString());
|
|
188
|
-
setEnvIfNotSet('HOST', config.server.host);
|
|
189
|
-
setEnvIfNotSet('NODE_ENV', config.server.environment);
|
|
190
|
-
setEnvIfNotSet('MAX_CONNECTIONS', config.server.maxConnections?.toString());
|
|
191
|
-
setEnvIfNotSet('REQUEST_TIMEOUT', config.server.timeout?.toString());
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
// Apply database configuration
|
|
195
|
-
if (config.database) {
|
|
196
|
-
setEnvIfNotSet('DATABASE_URL', config.database.url);
|
|
197
|
-
|
|
198
|
-
if (config.database.redis) {
|
|
199
|
-
setEnvIfNotSet('REDIS_URL', config.database.redis.url);
|
|
200
|
-
setEnvIfNotSet('REDIS_MAX_RETRIES', config.database.redis.maxRetries?.toString());
|
|
201
|
-
setEnvIfNotSet('REDIS_RETRY_DELAY', config.database.redis.retryDelay?.toString());
|
|
202
|
-
setEnvIfNotSet('REDIS_KEY_PREFIX', config.database.redis.keyPrefix);
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
if (config.database.mysql) {
|
|
206
|
-
setEnvIfNotSet('MYSQL_HOST', config.database.mysql.host);
|
|
207
|
-
setEnvIfNotSet('MYSQL_PORT', config.database.mysql.port?.toString());
|
|
208
|
-
setEnvIfNotSet('MYSQL_DATABASE', config.database.mysql.database);
|
|
209
|
-
setEnvIfNotSet('MYSQL_USERNAME', config.database.mysql.username);
|
|
210
|
-
setEnvIfNotSet('MYSQL_PASSWORD', config.database.mysql.password);
|
|
211
|
-
setEnvIfNotSet('MYSQL_CONNECTION_LIMIT', config.database.mysql.connectionLimit?.toString());
|
|
212
|
-
setEnvIfNotSet('MYSQL_ACQUIRE_TIMEOUT', config.database.mysql.acquireTimeout?.toString());
|
|
213
|
-
setEnvIfNotSet('MYSQL_TIMEOUT', config.database.mysql.timeout?.toString());
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
// Apply service discovery configuration
|
|
218
|
-
if (config.serviceDiscovery) {
|
|
219
|
-
setEnvIfNotSet('SERVICE_DISCOVERY_ENABLED', config.serviceDiscovery.enabled?.toString());
|
|
220
|
-
setEnvIfNotSet('DISCOVERY_TYPE', config.serviceDiscovery.type);
|
|
221
|
-
setEnvIfNotSet('CONSUL_URL', config.serviceDiscovery.consulUrl);
|
|
222
|
-
setEnvIfNotSet('K8S_NAMESPACE', config.serviceDiscovery.kubernetesNamespace);
|
|
223
|
-
setEnvIfNotSet(
|
|
224
|
-
'HEALTH_CHECK_INTERVAL',
|
|
225
|
-
config.serviceDiscovery.healthCheckInterval?.toString()
|
|
226
|
-
);
|
|
227
|
-
setEnvIfNotSet('DISCOVERY_RETRY_ATTEMPTS', config.serviceDiscovery.retryAttempts?.toString());
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
// Apply logging configuration
|
|
231
|
-
if (config.logging) {
|
|
232
|
-
setEnvIfNotSet('LOG_LEVEL', config.logging.level);
|
|
233
|
-
setEnvIfNotSet('LOG_FORMAT', config.logging.format);
|
|
234
|
-
setEnvIfNotSet('LOG_COLORS', config.logging.enableColors?.toString());
|
|
235
|
-
setEnvIfNotSet('LOG_TIMESTAMP', config.logging.enableTimestamp?.toString());
|
|
236
|
-
setEnvIfNotSet('LOG_CONTEXT', config.logging.enableContext?.toString());
|
|
237
|
-
|
|
238
|
-
if (config.logging.outputs) {
|
|
239
|
-
setEnvIfNotSet('LOG_CONSOLE', config.logging.outputs.console?.toString());
|
|
240
|
-
|
|
241
|
-
if (config.logging.outputs.file) {
|
|
242
|
-
setEnvIfNotSet('LOG_FILE_ENABLED', config.logging.outputs.file.enabled?.toString());
|
|
243
|
-
setEnvIfNotSet('LOG_FILE_PATH', config.logging.outputs.file.path);
|
|
244
|
-
setEnvIfNotSet('LOG_FILE_MAX_SIZE', config.logging.outputs.file.maxSize);
|
|
245
|
-
setEnvIfNotSet('LOG_FILE_MAX_FILES', config.logging.outputs.file.maxFiles?.toString());
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
if (config.logging.outputs.webhook) {
|
|
249
|
-
setEnvIfNotSet('LOG_WEBHOOK_ENABLED', config.logging.outputs.webhook.enabled?.toString());
|
|
250
|
-
setEnvIfNotSet('LOG_WEBHOOK_URL', config.logging.outputs.webhook.url);
|
|
251
|
-
if (config.logging.outputs.webhook.headers) {
|
|
252
|
-
setEnvIfNotSet(
|
|
253
|
-
'LOG_WEBHOOK_HEADERS',
|
|
254
|
-
JSON.stringify(config.logging.outputs.webhook.headers)
|
|
255
|
-
);
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
// Apply module defaults
|
|
262
|
-
if (config.modules) {
|
|
263
|
-
if (config.modules.cache) {
|
|
264
|
-
setEnvIfNotSet('CACHE_ENABLED', config.modules.cache.enabled?.toString());
|
|
265
|
-
setEnvIfNotSet('DEFAULT_CACHE_TTL', config.modules.cache.defaultTtl?.toString());
|
|
266
|
-
setEnvIfNotSet('CACHE_MAX_SIZE', config.modules.cache.maxSize?.toString());
|
|
267
|
-
setEnvIfNotSet('CACHE_STRATEGY', config.modules.cache.strategy);
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
if (config.modules.rateLimit) {
|
|
271
|
-
setEnvIfNotSet('RATE_LIMIT_ENABLED', config.modules.rateLimit.enabled?.toString());
|
|
272
|
-
setEnvIfNotSet(
|
|
273
|
-
'DEFAULT_RATE_LIMIT_REQUESTS',
|
|
274
|
-
config.modules.rateLimit.defaultRequests?.toString()
|
|
275
|
-
);
|
|
276
|
-
setEnvIfNotSet(
|
|
277
|
-
'DEFAULT_RATE_LIMIT_WINDOW',
|
|
278
|
-
config.modules.rateLimit.defaultWindow?.toString()
|
|
279
|
-
);
|
|
280
|
-
setEnvIfNotSet(
|
|
281
|
-
'RATE_LIMIT_SKIP_SUCCESS',
|
|
282
|
-
config.modules.rateLimit.skipSuccessfulRequests?.toString()
|
|
283
|
-
);
|
|
284
|
-
setEnvIfNotSet(
|
|
285
|
-
'RATE_LIMIT_SKIP_FAILED',
|
|
286
|
-
config.modules.rateLimit.skipFailedRequests?.toString()
|
|
287
|
-
);
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
if (config.modules.validation) {
|
|
291
|
-
setEnvIfNotSet('VALIDATION_ENABLED', config.modules.validation.enabled?.toString());
|
|
292
|
-
setEnvIfNotSet(
|
|
293
|
-
'VALIDATION_STRIP_UNKNOWN',
|
|
294
|
-
config.modules.validation.stripUnknown?.toString()
|
|
295
|
-
);
|
|
296
|
-
setEnvIfNotSet('VALIDATION_ABORT_EARLY', config.modules.validation.abortEarly?.toString());
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
// Apply security configuration
|
|
301
|
-
if (config.security) {
|
|
302
|
-
if (config.security.cors) {
|
|
303
|
-
setEnvIfNotSet('CORS_ENABLED', config.security.cors.enabled?.toString());
|
|
304
|
-
if (typeof config.security.cors.origin === 'string') {
|
|
305
|
-
setEnvIfNotSet('CORS_ORIGIN', config.security.cors.origin);
|
|
306
|
-
} else if (Array.isArray(config.security.cors.origin)) {
|
|
307
|
-
setEnvIfNotSet('CORS_ORIGIN', config.security.cors.origin.join(','));
|
|
308
|
-
} else if (typeof config.security.cors.origin === 'boolean') {
|
|
309
|
-
setEnvIfNotSet('CORS_ORIGIN', config.security.cors.origin.toString());
|
|
310
|
-
}
|
|
311
|
-
setEnvIfNotSet('CORS_METHODS', config.security.cors.methods?.join(','));
|
|
312
|
-
setEnvIfNotSet('CORS_HEADERS', config.security.cors.allowedHeaders?.join(','));
|
|
313
|
-
setEnvIfNotSet('CORS_CREDENTIALS', config.security.cors.credentials?.toString());
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
if (config.security.helmet) {
|
|
317
|
-
setEnvIfNotSet('HELMET_ENABLED', config.security.helmet.enabled?.toString());
|
|
318
|
-
setEnvIfNotSet('HELMET_CSP', config.security.helmet.contentSecurityPolicy?.toString());
|
|
319
|
-
setEnvIfNotSet('HELMET_HSTS', config.security.helmet.hsts?.toString());
|
|
320
|
-
setEnvIfNotSet('HELMET_NO_SNIFF', config.security.helmet.noSniff?.toString());
|
|
321
|
-
setEnvIfNotSet('HELMET_FRAMEGUARD', config.security.helmet.frameguard?.toString());
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
if (config.security.rateLimit?.global) {
|
|
325
|
-
setEnvIfNotSet(
|
|
326
|
-
'GLOBAL_RATE_LIMIT_ENABLED',
|
|
327
|
-
config.security.rateLimit.global.enabled?.toString()
|
|
328
|
-
);
|
|
329
|
-
setEnvIfNotSet(
|
|
330
|
-
'GLOBAL_RATE_LIMIT_REQUESTS',
|
|
331
|
-
config.security.rateLimit.global.requests?.toString()
|
|
332
|
-
);
|
|
333
|
-
setEnvIfNotSet(
|
|
334
|
-
'GLOBAL_RATE_LIMIT_WINDOW',
|
|
335
|
-
config.security.rateLimit.global.window?.toString()
|
|
336
|
-
);
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
// Apply external services configuration
|
|
341
|
-
if (config.external) {
|
|
342
|
-
if (config.external.stripe) {
|
|
343
|
-
setEnvIfNotSet('STRIPE_SECRET_KEY', config.external.stripe.secretKey);
|
|
344
|
-
setEnvIfNotSet('STRIPE_PUBLISHABLE_KEY', config.external.stripe.publishableKey);
|
|
345
|
-
setEnvIfNotSet('STRIPE_WEBHOOK_SECRET', config.external.stripe.webhookSecret);
|
|
346
|
-
setEnvIfNotSet('STRIPE_API_VERSION', config.external.stripe.apiVersion);
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
if (config.external.paypal) {
|
|
350
|
-
setEnvIfNotSet('PAYPAL_CLIENT_ID', config.external.paypal.clientId);
|
|
351
|
-
setEnvIfNotSet('PAYPAL_CLIENT_SECRET', config.external.paypal.clientSecret);
|
|
352
|
-
setEnvIfNotSet('PAYPAL_WEBHOOK_ID', config.external.paypal.webhookId);
|
|
353
|
-
setEnvIfNotSet('PAYPAL_ENVIRONMENT', config.external.paypal.environment);
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
if (config.external.smtp) {
|
|
357
|
-
setEnvIfNotSet('SMTP_HOST', config.external.smtp.host);
|
|
358
|
-
setEnvIfNotSet('SMTP_PORT', config.external.smtp.port?.toString());
|
|
359
|
-
setEnvIfNotSet('SMTP_SECURE', config.external.smtp.secure?.toString());
|
|
360
|
-
setEnvIfNotSet('SMTP_USERNAME', config.external.smtp.username);
|
|
361
|
-
setEnvIfNotSet('SMTP_PASSWORD', config.external.smtp.password);
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
// Apply performance configuration
|
|
366
|
-
if (config.performance) {
|
|
367
|
-
if (config.performance.compression) {
|
|
368
|
-
setEnvIfNotSet('COMPRESSION_ENABLED', config.performance.compression.enabled?.toString());
|
|
369
|
-
setEnvIfNotSet('COMPRESSION_LEVEL', config.performance.compression.level?.toString());
|
|
370
|
-
setEnvIfNotSet('COMPRESSION_THRESHOLD', config.performance.compression.threshold?.toString());
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
if (config.performance.circuitBreaker) {
|
|
374
|
-
setEnvIfNotSet(
|
|
375
|
-
'CIRCUIT_BREAKER_ENABLED',
|
|
376
|
-
config.performance.circuitBreaker.enabled?.toString()
|
|
377
|
-
);
|
|
378
|
-
setEnvIfNotSet(
|
|
379
|
-
'CIRCUIT_BREAKER_THRESHOLD',
|
|
380
|
-
config.performance.circuitBreaker.failureThreshold?.toString()
|
|
381
|
-
);
|
|
382
|
-
setEnvIfNotSet(
|
|
383
|
-
'CIRCUIT_BREAKER_RESET',
|
|
384
|
-
config.performance.circuitBreaker.resetTimeout?.toString()
|
|
385
|
-
);
|
|
386
|
-
setEnvIfNotSet(
|
|
387
|
-
'CIRCUIT_BREAKER_MONITOR',
|
|
388
|
-
config.performance.circuitBreaker.monitoringPeriod?.toString()
|
|
389
|
-
);
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
if (config.performance.clustering) {
|
|
393
|
-
setEnvIfNotSet('CLUSTERING_ENABLED', config.performance.clustering.enabled?.toString());
|
|
394
|
-
setEnvIfNotSet('CLUSTER_WORKERS', config.performance.clustering.workers?.toString());
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
/**
|
|
400
|
-
* Set environment variable only if it's not already set
|
|
401
|
-
* This ensures environment variables take precedence over config file values
|
|
402
|
-
*/
|
|
403
|
-
function setEnvIfNotSet(key: string, value: string | undefined): void {
|
|
404
|
-
if (value !== undefined && process.env[key] === undefined) {
|
|
405
|
-
process.env[key] = value;
|
|
406
|
-
}
|
|
407
|
-
}
|
package/src/core/config/index.ts
CHANGED
|
@@ -1,60 +1,109 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Configuration System - Immutable Config with createApp Override Support
|
|
3
|
+
*
|
|
4
|
+
* This is the main entry point for the MoroJS configuration system.
|
|
5
|
+
* It provides a clean, immutable configuration that is locked at createApp() time.
|
|
6
|
+
*
|
|
7
|
+
* Key Features:
|
|
8
|
+
* - Immutable configuration after initialization
|
|
9
|
+
* - Clear precedence: Env Vars > createApp Options > Config File > Defaults
|
|
10
|
+
* - Type-safe validation
|
|
11
|
+
* - Single source of truth
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
// Export types and core components
|
|
15
|
+
export * from './schema.js';
|
|
16
|
+
export * from './config-sources.js';
|
|
17
|
+
export * from './config-validator.js';
|
|
18
|
+
export * from './file-loader.js';
|
|
19
|
+
|
|
20
|
+
// Export specific functions from config-manager to avoid conflicts
|
|
21
|
+
export {
|
|
22
|
+
initializeAndLockConfig,
|
|
23
|
+
isConfigLocked,
|
|
24
|
+
resetConfigForTesting,
|
|
25
|
+
} from './config-manager.js';
|
|
26
|
+
|
|
27
|
+
// Export utilities for backward compatibility
|
|
28
|
+
export * from './utils.js';
|
|
6
29
|
|
|
7
|
-
|
|
8
|
-
import {
|
|
9
|
-
import
|
|
10
|
-
import {
|
|
30
|
+
import { MoroOptions } from '../../types/core.js';
|
|
31
|
+
import { AppConfig } from '../../types/config.js';
|
|
32
|
+
import { loadConfigFromAllSources } from './config-sources.js';
|
|
33
|
+
import {
|
|
34
|
+
initializeAndLockConfig,
|
|
35
|
+
getGlobalConfig as getConfig,
|
|
36
|
+
isConfigLocked,
|
|
37
|
+
resetConfigForTesting,
|
|
38
|
+
} from './config-manager.js';
|
|
39
|
+
import { createFrameworkLogger } from '../logger/index.js';
|
|
11
40
|
|
|
12
|
-
|
|
13
|
-
let globalConfig: AppConfig | null = null;
|
|
41
|
+
const logger = createFrameworkLogger('ConfigSystem');
|
|
14
42
|
|
|
15
43
|
/**
|
|
16
|
-
* Initialize
|
|
17
|
-
* This
|
|
44
|
+
* Initialize configuration system with createApp options
|
|
45
|
+
* This is the main entry point called by createApp()
|
|
46
|
+
*
|
|
47
|
+
* @param options - createApp options that can override config file and defaults
|
|
48
|
+
* @returns Immutable, validated configuration object
|
|
18
49
|
*/
|
|
19
|
-
export function initializeConfig(): AppConfig {
|
|
20
|
-
if (
|
|
21
|
-
|
|
50
|
+
export function initializeConfig(options?: MoroOptions): Readonly<AppConfig> {
|
|
51
|
+
if (isConfigLocked()) {
|
|
52
|
+
logger.debug('Configuration already locked, returning existing config');
|
|
53
|
+
return getConfig();
|
|
22
54
|
}
|
|
23
55
|
|
|
24
|
-
|
|
56
|
+
logger.debug('Initializing configuration system');
|
|
25
57
|
|
|
26
|
-
//
|
|
27
|
-
|
|
58
|
+
// Load configuration from all sources with proper precedence
|
|
59
|
+
const config = loadConfigFromAllSources(options);
|
|
28
60
|
|
|
29
|
-
|
|
61
|
+
// Lock the configuration to prevent further changes
|
|
62
|
+
initializeAndLockConfig(config);
|
|
63
|
+
|
|
64
|
+
logger.info(
|
|
65
|
+
`Configuration system initialized and locked: ${process.env.NODE_ENV || 'development'}:${config.server.port} (sources: env + file + options + defaults)`
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
return config;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Load configuration without locking (for testing and utilities)
|
|
73
|
+
* This maintains backward compatibility with existing code
|
|
74
|
+
*/
|
|
75
|
+
export function loadConfig(): AppConfig {
|
|
76
|
+
return loadConfigFromAllSources();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Load configuration with createApp options (for testing and utilities)
|
|
81
|
+
* This maintains backward compatibility with existing code
|
|
82
|
+
*/
|
|
83
|
+
export function loadConfigWithOptions(options: MoroOptions): AppConfig {
|
|
84
|
+
return loadConfigFromAllSources(options);
|
|
30
85
|
}
|
|
31
86
|
|
|
32
87
|
/**
|
|
33
88
|
* Get the current global configuration
|
|
34
|
-
*
|
|
89
|
+
* Alias for getGlobalConfig() for backward compatibility
|
|
35
90
|
*/
|
|
36
|
-
export function getGlobalConfig(): AppConfig {
|
|
37
|
-
|
|
38
|
-
throw new Error('Configuration not initialized. Call initializeConfig() first.');
|
|
39
|
-
}
|
|
40
|
-
return globalConfig;
|
|
91
|
+
export function getGlobalConfig(): Readonly<AppConfig> {
|
|
92
|
+
return getConfig();
|
|
41
93
|
}
|
|
42
94
|
|
|
43
95
|
/**
|
|
44
|
-
* Check if configuration has been initialized
|
|
96
|
+
* Check if configuration has been initialized and locked
|
|
97
|
+
* Alias for isConfigLocked() for backward compatibility
|
|
45
98
|
*/
|
|
46
99
|
export function isConfigInitialized(): boolean {
|
|
47
|
-
return
|
|
100
|
+
return isConfigLocked();
|
|
48
101
|
}
|
|
49
102
|
|
|
50
103
|
/**
|
|
51
|
-
* Reset
|
|
104
|
+
* Reset configuration state (for testing only)
|
|
52
105
|
* @internal
|
|
53
106
|
*/
|
|
54
107
|
export function resetConfig(): void {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
// Also reset the utils config (by setting it to null via direct access)
|
|
58
|
-
const { setConfig } = require('./utils');
|
|
59
|
-
setConfig(null as any);
|
|
108
|
+
resetConfigForTesting();
|
|
60
109
|
}
|
|
@@ -1,15 +1,25 @@
|
|
|
1
1
|
// Core Configuration Schema for Moro Framework
|
|
2
2
|
|
|
3
|
-
import { AppConfig } from '../../types/config';
|
|
3
|
+
import { AppConfig } from '../../types/config.js';
|
|
4
4
|
|
|
5
|
-
//
|
|
5
|
+
// Minimal default configuration - performance-focused, most things opt-in
|
|
6
6
|
export const DEFAULT_CONFIG: AppConfig = {
|
|
7
7
|
server: {
|
|
8
8
|
port: 3001,
|
|
9
9
|
host: 'localhost',
|
|
10
|
-
environment: 'development',
|
|
11
10
|
maxConnections: 1000,
|
|
12
11
|
timeout: 30000,
|
|
12
|
+
bodySizeLimit: '10mb',
|
|
13
|
+
useUWebSockets: false, // Opt-in for high performance
|
|
14
|
+
requestTracking: {
|
|
15
|
+
enabled: true, // Enable by default for debugging
|
|
16
|
+
},
|
|
17
|
+
requestLogging: {
|
|
18
|
+
enabled: true, // Enable by default - logs requests independently
|
|
19
|
+
},
|
|
20
|
+
errorBoundary: {
|
|
21
|
+
enabled: true, // Always enabled for safety
|
|
22
|
+
},
|
|
13
23
|
},
|
|
14
24
|
serviceDiscovery: {
|
|
15
25
|
enabled: false,
|
|
@@ -19,33 +29,38 @@ export const DEFAULT_CONFIG: AppConfig = {
|
|
|
19
29
|
healthCheckInterval: 30000,
|
|
20
30
|
retryAttempts: 3,
|
|
21
31
|
},
|
|
22
|
-
database: {
|
|
23
|
-
redis: {
|
|
24
|
-
url: 'redis://localhost:6379',
|
|
25
|
-
maxRetries: 3,
|
|
26
|
-
retryDelay: 1000,
|
|
27
|
-
keyPrefix: 'moro:',
|
|
28
|
-
},
|
|
29
|
-
},
|
|
32
|
+
database: {},
|
|
30
33
|
modules: {
|
|
31
34
|
cache: {
|
|
32
|
-
enabled:
|
|
35
|
+
enabled: false, // Opt-in for better performance
|
|
33
36
|
defaultTtl: 300,
|
|
34
37
|
maxSize: 1000,
|
|
35
38
|
strategy: 'lru',
|
|
36
39
|
},
|
|
37
40
|
rateLimit: {
|
|
38
|
-
enabled:
|
|
41
|
+
enabled: false, // Opt-in to avoid unnecessary overhead
|
|
39
42
|
defaultRequests: 100,
|
|
40
43
|
defaultWindow: 60000,
|
|
41
44
|
skipSuccessfulRequests: false,
|
|
42
45
|
skipFailedRequests: false,
|
|
43
46
|
},
|
|
44
47
|
validation: {
|
|
45
|
-
enabled:
|
|
48
|
+
enabled: false,
|
|
46
49
|
stripUnknown: true,
|
|
47
50
|
abortEarly: false,
|
|
48
51
|
},
|
|
52
|
+
autoDiscovery: {
|
|
53
|
+
enabled: true, // Enable by default for better DX
|
|
54
|
+
paths: ['./modules', './src/modules'],
|
|
55
|
+
patterns: ['**/*.module.{ts,js}', '**/index.{ts,js}', '**/*.config.{ts,js}'],
|
|
56
|
+
recursive: true,
|
|
57
|
+
loadingStrategy: 'eager',
|
|
58
|
+
watchForChanges: false, // Opt-in for development
|
|
59
|
+
ignorePatterns: ['**/*.test.{ts,js}', '**/*.spec.{ts,js}', '**/node_modules/**'],
|
|
60
|
+
loadOrder: 'dependency',
|
|
61
|
+
failOnError: false, // Graceful degradation
|
|
62
|
+
maxDepth: 5,
|
|
63
|
+
},
|
|
49
64
|
},
|
|
50
65
|
logging: {
|
|
51
66
|
level: 'info',
|
|
@@ -69,14 +84,14 @@ export const DEFAULT_CONFIG: AppConfig = {
|
|
|
69
84
|
},
|
|
70
85
|
security: {
|
|
71
86
|
cors: {
|
|
72
|
-
enabled:
|
|
87
|
+
enabled: false, // Opt-in for better performance
|
|
73
88
|
origin: '*',
|
|
74
89
|
methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],
|
|
75
90
|
allowedHeaders: ['Content-Type', 'Authorization'],
|
|
76
91
|
credentials: false,
|
|
77
92
|
},
|
|
78
93
|
helmet: {
|
|
79
|
-
enabled:
|
|
94
|
+
enabled: false, // Opt-in for better performance
|
|
80
95
|
contentSecurityPolicy: true,
|
|
81
96
|
hsts: true,
|
|
82
97
|
noSniff: true,
|
|
@@ -90,26 +105,15 @@ export const DEFAULT_CONFIG: AppConfig = {
|
|
|
90
105
|
},
|
|
91
106
|
},
|
|
92
107
|
},
|
|
93
|
-
external: {
|
|
94
|
-
stripe: {
|
|
95
|
-
apiVersion: '2023-10-16',
|
|
96
|
-
},
|
|
97
|
-
paypal: {
|
|
98
|
-
environment: 'sandbox',
|
|
99
|
-
},
|
|
100
|
-
smtp: {
|
|
101
|
-
port: 587,
|
|
102
|
-
secure: false,
|
|
103
|
-
},
|
|
104
|
-
},
|
|
108
|
+
external: {},
|
|
105
109
|
performance: {
|
|
106
110
|
compression: {
|
|
107
|
-
enabled:
|
|
111
|
+
enabled: false, // Opt-in to avoid overhead
|
|
108
112
|
level: 6,
|
|
109
113
|
threshold: 1024,
|
|
110
114
|
},
|
|
111
115
|
circuitBreaker: {
|
|
112
|
-
enabled:
|
|
116
|
+
enabled: false, // Opt-in to avoid overhead
|
|
113
117
|
failureThreshold: 5,
|
|
114
118
|
resetTimeout: 60000,
|
|
115
119
|
monitoringPeriod: 10000,
|
|
@@ -117,13 +121,23 @@ export const DEFAULT_CONFIG: AppConfig = {
|
|
|
117
121
|
clustering: {
|
|
118
122
|
enabled: false,
|
|
119
123
|
workers: 1,
|
|
124
|
+
memoryPerWorkerGB: undefined,
|
|
120
125
|
},
|
|
121
126
|
},
|
|
127
|
+
websocket: {
|
|
128
|
+
enabled: false, // Opt-in - user must explicitly enable WebSockets
|
|
129
|
+
},
|
|
122
130
|
};
|
|
123
131
|
|
|
124
|
-
//
|
|
132
|
+
// Schema validation is now handled by config-validator.ts
|
|
133
|
+
// This export is kept for backward compatibility only
|
|
134
|
+
// Note: For actual validation, use validateConfig() from config-validator.ts directly
|
|
125
135
|
export const ConfigSchema = {
|
|
126
|
-
parse: (data: any): AppConfig =>
|
|
136
|
+
parse: (data: any): AppConfig => {
|
|
137
|
+
// Simple pass-through for backward compatibility
|
|
138
|
+
// Real validation happens in the config loading pipeline
|
|
139
|
+
return data as AppConfig;
|
|
140
|
+
},
|
|
127
141
|
};
|
|
128
142
|
|
|
129
143
|
// Re-export types for backward compatibility
|
|
@@ -137,7 +151,7 @@ export type {
|
|
|
137
151
|
SecurityConfig,
|
|
138
152
|
ExternalServicesConfig,
|
|
139
153
|
PerformanceConfig,
|
|
140
|
-
} from '../../types/config';
|
|
154
|
+
} from '../../types/config.js';
|
|
141
155
|
|
|
142
156
|
// For backward compatibility with modules that expect schema objects
|
|
143
157
|
export const ServerConfigSchema = { parse: (data: any) => data };
|