@morojs/moro 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +233 -0
- package/dist/core/config/index.d.ts +19 -0
- package/dist/core/config/index.js +59 -0
- package/dist/core/config/index.js.map +1 -0
- package/dist/core/config/loader.d.ts +6 -0
- package/dist/core/config/loader.js +288 -0
- package/dist/core/config/loader.js.map +1 -0
- package/dist/core/config/schema.d.ts +335 -0
- package/dist/core/config/schema.js +286 -0
- package/dist/core/config/schema.js.map +1 -0
- package/dist/core/config/utils.d.ts +50 -0
- package/dist/core/config/utils.js +185 -0
- package/dist/core/config/utils.js.map +1 -0
- package/dist/core/database/adapters/drizzle.d.ts +29 -0
- package/dist/core/database/adapters/drizzle.js +366 -0
- package/dist/core/database/adapters/drizzle.js.map +1 -0
- package/dist/core/database/adapters/index.d.ts +8 -0
- package/dist/core/database/adapters/index.js +48 -0
- package/dist/core/database/adapters/index.js.map +1 -0
- package/dist/core/database/adapters/mongodb.d.ts +35 -0
- package/dist/core/database/adapters/mongodb.js +215 -0
- package/dist/core/database/adapters/mongodb.js.map +1 -0
- package/dist/core/database/adapters/mysql.d.ts +23 -0
- package/dist/core/database/adapters/mysql.js +149 -0
- package/dist/core/database/adapters/mysql.js.map +1 -0
- package/dist/core/database/adapters/postgresql.d.ts +24 -0
- package/dist/core/database/adapters/postgresql.js +160 -0
- package/dist/core/database/adapters/postgresql.js.map +1 -0
- package/dist/core/database/adapters/redis.d.ts +50 -0
- package/dist/core/database/adapters/redis.js +266 -0
- package/dist/core/database/adapters/redis.js.map +1 -0
- package/dist/core/database/adapters/sqlite.d.ts +23 -0
- package/dist/core/database/adapters/sqlite.js +194 -0
- package/dist/core/database/adapters/sqlite.js.map +1 -0
- package/dist/core/database/index.d.ts +2 -0
- package/dist/core/database/index.js +20 -0
- package/dist/core/database/index.js.map +1 -0
- package/dist/core/docs/index.d.ts +63 -0
- package/dist/core/docs/index.js +170 -0
- package/dist/core/docs/index.js.map +1 -0
- package/dist/core/docs/openapi-generator.d.ts +124 -0
- package/dist/core/docs/openapi-generator.js +413 -0
- package/dist/core/docs/openapi-generator.js.map +1 -0
- package/dist/core/docs/simple-docs.d.ts +21 -0
- package/dist/core/docs/simple-docs.js +268 -0
- package/dist/core/docs/simple-docs.js.map +1 -0
- package/dist/core/docs/swagger-ui.d.ts +28 -0
- package/dist/core/docs/swagger-ui.js +317 -0
- package/dist/core/docs/swagger-ui.js.map +1 -0
- package/dist/core/docs/zod-to-openapi.d.ts +29 -0
- package/dist/core/docs/zod-to-openapi.js +414 -0
- package/dist/core/docs/zod-to-openapi.js.map +1 -0
- package/dist/core/events/event-bus.d.ts +27 -0
- package/dist/core/events/event-bus.js +193 -0
- package/dist/core/events/event-bus.js.map +1 -0
- package/dist/core/events/index.d.ts +2 -0
- package/dist/core/events/index.js +7 -0
- package/dist/core/events/index.js.map +1 -0
- package/dist/core/framework.d.ts +57 -0
- package/dist/core/framework.js +432 -0
- package/dist/core/framework.js.map +1 -0
- package/dist/core/http/http-server.d.ts +114 -0
- package/dist/core/http/http-server.js +1154 -0
- package/dist/core/http/http-server.js.map +1 -0
- package/dist/core/http/index.d.ts +3 -0
- package/dist/core/http/index.js +10 -0
- package/dist/core/http/index.js.map +1 -0
- package/dist/core/http/router.d.ts +14 -0
- package/dist/core/http/router.js +113 -0
- package/dist/core/http/router.js.map +1 -0
- package/dist/core/logger/filters.d.ts +9 -0
- package/dist/core/logger/filters.js +134 -0
- package/dist/core/logger/filters.js.map +1 -0
- package/dist/core/logger/index.d.ts +3 -0
- package/dist/core/logger/index.js +26 -0
- package/dist/core/logger/index.js.map +1 -0
- package/dist/core/logger/logger.d.ts +49 -0
- package/dist/core/logger/logger.js +332 -0
- package/dist/core/logger/logger.js.map +1 -0
- package/dist/core/logger/outputs.d.ts +42 -0
- package/dist/core/logger/outputs.js +110 -0
- package/dist/core/logger/outputs.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/cache/file.d.ts +15 -0
- package/dist/core/middleware/built-in/adapters/cache/file.js +128 -0
- package/dist/core/middleware/built-in/adapters/cache/file.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/cache/index.d.ts +5 -0
- package/dist/core/middleware/built-in/adapters/cache/index.js +28 -0
- package/dist/core/middleware/built-in/adapters/cache/index.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/cache/memory.d.ts +11 -0
- package/dist/core/middleware/built-in/adapters/cache/memory.js +65 -0
- package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +17 -0
- package/dist/core/middleware/built-in/adapters/cache/redis.js +91 -0
- package/dist/core/middleware/built-in/adapters/cache/redis.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/cdn/azure.d.ts +21 -0
- package/dist/core/middleware/built-in/adapters/cdn/azure.js +40 -0
- package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.d.ts +14 -0
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js +77 -0
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +15 -0
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +73 -0
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +5 -0
- package/dist/core/middleware/built-in/adapters/cdn/index.js +28 -0
- package/dist/core/middleware/built-in/adapters/cdn/index.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/index.d.ts +4 -0
- package/dist/core/middleware/built-in/adapters/index.js +26 -0
- package/dist/core/middleware/built-in/adapters/index.js.map +1 -0
- package/dist/core/middleware/built-in/auth.d.ts +2 -0
- package/dist/core/middleware/built-in/auth.js +38 -0
- package/dist/core/middleware/built-in/auth.js.map +1 -0
- package/dist/core/middleware/built-in/cache.d.ts +3 -0
- package/dist/core/middleware/built-in/cache.js +188 -0
- package/dist/core/middleware/built-in/cache.js.map +1 -0
- package/dist/core/middleware/built-in/cdn.d.ts +3 -0
- package/dist/core/middleware/built-in/cdn.js +115 -0
- package/dist/core/middleware/built-in/cdn.js.map +1 -0
- package/dist/core/middleware/built-in/cookie.d.ts +14 -0
- package/dist/core/middleware/built-in/cookie.js +68 -0
- package/dist/core/middleware/built-in/cookie.js.map +1 -0
- package/dist/core/middleware/built-in/cors.d.ts +2 -0
- package/dist/core/middleware/built-in/cors.js +29 -0
- package/dist/core/middleware/built-in/cors.js.map +1 -0
- package/dist/core/middleware/built-in/csp.d.ts +22 -0
- package/dist/core/middleware/built-in/csp.js +74 -0
- package/dist/core/middleware/built-in/csp.js.map +1 -0
- package/dist/core/middleware/built-in/csrf.d.ts +9 -0
- package/dist/core/middleware/built-in/csrf.js +66 -0
- package/dist/core/middleware/built-in/csrf.js.map +1 -0
- package/dist/core/middleware/built-in/error-tracker.d.ts +1 -0
- package/dist/core/middleware/built-in/error-tracker.js +19 -0
- package/dist/core/middleware/built-in/error-tracker.js.map +1 -0
- package/dist/core/middleware/built-in/index.d.ts +70 -0
- package/dist/core/middleware/built-in/index.js +70 -0
- package/dist/core/middleware/built-in/index.js.map +1 -0
- package/dist/core/middleware/built-in/performance-monitor.d.ts +1 -0
- package/dist/core/middleware/built-in/performance-monitor.js +22 -0
- package/dist/core/middleware/built-in/performance-monitor.js.map +1 -0
- package/dist/core/middleware/built-in/rate-limit.d.ts +6 -0
- package/dist/core/middleware/built-in/rate-limit.js +47 -0
- package/dist/core/middleware/built-in/rate-limit.js.map +1 -0
- package/dist/core/middleware/built-in/request-logger.d.ts +1 -0
- package/dist/core/middleware/built-in/request-logger.js +15 -0
- package/dist/core/middleware/built-in/request-logger.js.map +1 -0
- package/dist/core/middleware/built-in/session.d.ts +41 -0
- package/dist/core/middleware/built-in/session.js +209 -0
- package/dist/core/middleware/built-in/session.js.map +1 -0
- package/dist/core/middleware/built-in/sse.d.ts +6 -0
- package/dist/core/middleware/built-in/sse.js +73 -0
- package/dist/core/middleware/built-in/sse.js.map +1 -0
- package/dist/core/middleware/built-in/validation.d.ts +2 -0
- package/dist/core/middleware/built-in/validation.js +31 -0
- package/dist/core/middleware/built-in/validation.js.map +1 -0
- package/dist/core/middleware/index.d.ts +21 -0
- package/dist/core/middleware/index.js +152 -0
- package/dist/core/middleware/index.js.map +1 -0
- package/dist/core/modules/auto-discovery.d.ts +27 -0
- package/dist/core/modules/auto-discovery.js +255 -0
- package/dist/core/modules/auto-discovery.js.map +1 -0
- package/dist/core/modules/index.d.ts +2 -0
- package/dist/core/modules/index.js +11 -0
- package/dist/core/modules/index.js.map +1 -0
- package/dist/core/modules/modules.d.ts +10 -0
- package/dist/core/modules/modules.js +137 -0
- package/dist/core/modules/modules.js.map +1 -0
- package/dist/core/networking/index.d.ts +2 -0
- package/dist/core/networking/index.js +9 -0
- package/dist/core/networking/index.js.map +1 -0
- package/dist/core/networking/service-discovery.d.ts +38 -0
- package/dist/core/networking/service-discovery.js +233 -0
- package/dist/core/networking/service-discovery.js.map +1 -0
- package/dist/core/networking/websocket-manager.d.ts +27 -0
- package/dist/core/networking/websocket-manager.js +211 -0
- package/dist/core/networking/websocket-manager.js.map +1 -0
- package/dist/core/routing/app-integration.d.ts +42 -0
- package/dist/core/routing/app-integration.js +152 -0
- package/dist/core/routing/app-integration.js.map +1 -0
- package/dist/core/routing/index.d.ts +106 -0
- package/dist/core/routing/index.js +343 -0
- package/dist/core/routing/index.js.map +1 -0
- package/dist/core/runtime/aws-lambda-adapter.d.ts +43 -0
- package/dist/core/runtime/aws-lambda-adapter.js +108 -0
- package/dist/core/runtime/aws-lambda-adapter.js.map +1 -0
- package/dist/core/runtime/base-adapter.d.ts +16 -0
- package/dist/core/runtime/base-adapter.js +105 -0
- package/dist/core/runtime/base-adapter.js.map +1 -0
- package/dist/core/runtime/cloudflare-workers-adapter.d.ts +18 -0
- package/dist/core/runtime/cloudflare-workers-adapter.js +131 -0
- package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -0
- package/dist/core/runtime/index.d.ts +14 -0
- package/dist/core/runtime/index.js +56 -0
- package/dist/core/runtime/index.js.map +1 -0
- package/dist/core/runtime/node-adapter.d.ts +15 -0
- package/dist/core/runtime/node-adapter.js +204 -0
- package/dist/core/runtime/node-adapter.js.map +1 -0
- package/dist/core/runtime/vercel-edge-adapter.d.ts +10 -0
- package/dist/core/runtime/vercel-edge-adapter.js +106 -0
- package/dist/core/runtime/vercel-edge-adapter.js.map +1 -0
- package/dist/core/utilities/circuit-breaker.d.ts +14 -0
- package/dist/core/utilities/circuit-breaker.js +42 -0
- package/dist/core/utilities/circuit-breaker.js.map +1 -0
- package/dist/core/utilities/container.d.ts +116 -0
- package/dist/core/utilities/container.js +529 -0
- package/dist/core/utilities/container.js.map +1 -0
- package/dist/core/utilities/hooks.d.ts +24 -0
- package/dist/core/utilities/hooks.js +131 -0
- package/dist/core/utilities/hooks.js.map +1 -0
- package/dist/core/utilities/index.d.ts +4 -0
- package/dist/core/utilities/index.js +22 -0
- package/dist/core/utilities/index.js.map +1 -0
- package/dist/core/validation/index.d.ts +30 -0
- package/dist/core/validation/index.js +144 -0
- package/dist/core/validation/index.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/dist/moro.d.ts +82 -0
- package/dist/moro.js +679 -0
- package/dist/moro.js.map +1 -0
- package/dist/types/cache.d.ts +34 -0
- package/dist/types/cache.js +3 -0
- package/dist/types/cache.js.map +1 -0
- package/dist/types/cdn.d.ts +19 -0
- package/dist/types/cdn.js +3 -0
- package/dist/types/cdn.js.map +1 -0
- package/dist/types/core.d.ts +13 -0
- package/dist/types/core.js +3 -0
- package/dist/types/core.js.map +1 -0
- package/dist/types/database.d.ts +29 -0
- package/dist/types/database.js +3 -0
- package/dist/types/database.js.map +1 -0
- package/dist/types/discovery.d.ts +6 -0
- package/dist/types/discovery.js +3 -0
- package/dist/types/discovery.js.map +1 -0
- package/dist/types/events.d.ts +116 -0
- package/dist/types/events.js +3 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/hooks.d.ts +38 -0
- package/dist/types/hooks.js +3 -0
- package/dist/types/hooks.js.map +1 -0
- package/dist/types/http.d.ts +51 -0
- package/dist/types/http.js +3 -0
- package/dist/types/http.js.map +1 -0
- package/dist/types/logger.d.ts +77 -0
- package/dist/types/logger.js +3 -0
- package/dist/types/logger.js.map +1 -0
- package/dist/types/module.d.ts +91 -0
- package/dist/types/module.js +3 -0
- package/dist/types/module.js.map +1 -0
- package/dist/types/runtime.d.ts +48 -0
- package/dist/types/runtime.js +3 -0
- package/dist/types/runtime.js.map +1 -0
- package/dist/types/session.d.ts +66 -0
- package/dist/types/session.js +3 -0
- package/dist/types/session.js.map +1 -0
- package/package.json +176 -0
- package/src/core/config/index.ts +47 -0
- package/src/core/config/loader.ts +366 -0
- package/src/core/config/schema.ts +346 -0
- package/src/core/config/utils.ts +220 -0
- package/src/core/database/README.md +228 -0
- package/src/core/database/adapters/drizzle.ts +425 -0
- package/src/core/database/adapters/index.ts +45 -0
- package/src/core/database/adapters/mongodb.ts +292 -0
- package/src/core/database/adapters/mysql.ts +217 -0
- package/src/core/database/adapters/postgresql.ts +211 -0
- package/src/core/database/adapters/redis.ts +331 -0
- package/src/core/database/adapters/sqlite.ts +255 -0
- package/src/core/database/index.ts +3 -0
- package/src/core/docs/index.ts +245 -0
- package/src/core/docs/openapi-generator.ts +588 -0
- package/src/core/docs/simple-docs.ts +305 -0
- package/src/core/docs/swagger-ui.ts +370 -0
- package/src/core/docs/zod-to-openapi.ts +532 -0
- package/src/core/events/event-bus.ts +249 -0
- package/src/core/events/index.ts +12 -0
- package/src/core/framework.ts +621 -0
- package/src/core/http/http-server.ts +1421 -0
- package/src/core/http/index.ts +11 -0
- package/src/core/http/router.ts +153 -0
- package/src/core/logger/filters.ts +148 -0
- package/src/core/logger/index.ts +20 -0
- package/src/core/logger/logger.ts +434 -0
- package/src/core/logger/outputs.ts +136 -0
- package/src/core/middleware/built-in/adapters/cache/file.ts +106 -0
- package/src/core/middleware/built-in/adapters/cache/index.ts +26 -0
- package/src/core/middleware/built-in/adapters/cache/memory.ts +73 -0
- package/src/core/middleware/built-in/adapters/cache/redis.ts +103 -0
- package/src/core/middleware/built-in/adapters/cdn/azure.ts +68 -0
- package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +100 -0
- package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +92 -0
- package/src/core/middleware/built-in/adapters/cdn/index.ts +23 -0
- package/src/core/middleware/built-in/adapters/index.ts +7 -0
- package/src/core/middleware/built-in/auth.ts +39 -0
- package/src/core/middleware/built-in/cache.ts +228 -0
- package/src/core/middleware/built-in/cdn.ts +151 -0
- package/src/core/middleware/built-in/cookie.ts +90 -0
- package/src/core/middleware/built-in/cors.ts +38 -0
- package/src/core/middleware/built-in/csp.ts +107 -0
- package/src/core/middleware/built-in/csrf.ts +87 -0
- package/src/core/middleware/built-in/error-tracker.ts +16 -0
- package/src/core/middleware/built-in/index.ts +57 -0
- package/src/core/middleware/built-in/performance-monitor.ts +25 -0
- package/src/core/middleware/built-in/rate-limit.ts +60 -0
- package/src/core/middleware/built-in/request-logger.ts +14 -0
- package/src/core/middleware/built-in/session.ts +311 -0
- package/src/core/middleware/built-in/sse.ts +91 -0
- package/src/core/middleware/built-in/validation.ts +33 -0
- package/src/core/middleware/index.ts +188 -0
- package/src/core/modules/auto-discovery.ts +265 -0
- package/src/core/modules/index.ts +6 -0
- package/src/core/modules/modules.ts +125 -0
- package/src/core/networking/index.ts +7 -0
- package/src/core/networking/service-discovery.ts +309 -0
- package/src/core/networking/websocket-manager.ts +259 -0
- package/src/core/routing/app-integration.ts +229 -0
- package/src/core/routing/index.ts +519 -0
- package/src/core/runtime/aws-lambda-adapter.ts +157 -0
- package/src/core/runtime/base-adapter.ts +140 -0
- package/src/core/runtime/cloudflare-workers-adapter.ts +166 -0
- package/src/core/runtime/index.ts +74 -0
- package/src/core/runtime/node-adapter.ts +210 -0
- package/src/core/runtime/vercel-edge-adapter.ts +125 -0
- package/src/core/utilities/circuit-breaker.ts +46 -0
- package/src/core/utilities/container.ts +760 -0
- package/src/core/utilities/hooks.ts +148 -0
- package/src/core/utilities/index.ts +16 -0
- package/src/core/validation/index.ts +216 -0
- package/src/index.ts +120 -0
- package/src/moro.ts +842 -0
- package/src/types/cache.ts +38 -0
- package/src/types/cdn.ts +22 -0
- package/src/types/core.ts +17 -0
- package/src/types/database.ts +40 -0
- package/src/types/discovery.ts +7 -0
- package/src/types/events.ts +90 -0
- package/src/types/hooks.ts +47 -0
- package/src/types/http.ts +70 -0
- package/src/types/logger.ts +109 -0
- package/src/types/module.ts +87 -0
- package/src/types/runtime.ts +91 -0
- package/src/types/session.ts +89 -0
- package/tsconfig.json +21 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 Moro Framework Team
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
# Moro
|
|
2
|
+
|
|
3
|
+
<div align="center">
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
**High-performance multi-runtime framework with intelligent routing**
|
|
8
|
+
*Functional • Type-safe • Multi-environment • Production-ready*
|
|
9
|
+
|
|
10
|
+
[](https://badge.fury.io/js/@morojs%2Fmoro)
|
|
11
|
+
[](https://opensource.org/licenses/MIT)
|
|
12
|
+
[](https://nodejs.org/)
|
|
13
|
+
[](https://www.typescriptlang.org/)
|
|
14
|
+
|
|
15
|
+
[**Documentation**](./docs/) • [**Quick Start**](#quick-start) • [**Examples**](#examples) • [**API Reference**](./docs/API.md)
|
|
16
|
+
|
|
17
|
+
</div>
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Why Moro?
|
|
22
|
+
|
|
23
|
+
Moro eliminates the pain points of traditional Node.js frameworks with **intelligent routing** and **automatic middleware ordering**. No more debugging middleware order issues or wrestling with type safety!
|
|
24
|
+
|
|
25
|
+
- **Multi-Runtime Support** - Deploy to Node.js, Vercel Edge, AWS Lambda, Cloudflare Workers
|
|
26
|
+
- **Intelligent Routing** - Chainable + schema-first APIs with automatic middleware ordering
|
|
27
|
+
- **Zod Validation** - Type-safe, functional validation with full TypeScript inference
|
|
28
|
+
- **Native Performance** - Zero framework overhead, optimized for each runtime
|
|
29
|
+
- **Functional Architecture** - No decorators, pure functional patterns
|
|
30
|
+
- **Zero Order Dependencies** - Framework handles optimal middleware execution
|
|
31
|
+
|
|
32
|
+
## Superior Performance
|
|
33
|
+
|
|
34
|
+
| Framework | Req/sec | Latency | Memory |
|
|
35
|
+
|-----------|---------|---------|--------|
|
|
36
|
+
| **Moro** | **52,400** | **1.8ms** | **24MB** |
|
|
37
|
+
| Express | 28,540 | 3.8ms | 45MB |
|
|
38
|
+
| Fastify | 38,120 | 2.9ms | 35MB |
|
|
39
|
+
| NestJS | 22,100 | 4.5ms | 58MB |
|
|
40
|
+
|
|
41
|
+
## Quick Start
|
|
42
|
+
|
|
43
|
+
### Installation
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npm install @morojs/moro
|
|
47
|
+
# or
|
|
48
|
+
yarn add @morojs/moro
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Hello World
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
import { createApp, z } from 'moro';
|
|
55
|
+
|
|
56
|
+
const app = createApp();
|
|
57
|
+
|
|
58
|
+
// Intelligent routing - order doesn't matter!
|
|
59
|
+
app.post('/users')
|
|
60
|
+
.body(z.object({
|
|
61
|
+
name: z.string().min(2).max(50),
|
|
62
|
+
email: z.string().email()
|
|
63
|
+
}))
|
|
64
|
+
.rateLimit({ requests: 10, window: 60000 })
|
|
65
|
+
.describe('Create a new user')
|
|
66
|
+
.handler((req, res) => {
|
|
67
|
+
// req.body is fully typed and validated!
|
|
68
|
+
return { success: true, data: req.body };
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
app.get('/health', () => ({ status: 'healthy' }));
|
|
72
|
+
|
|
73
|
+
app.listen(3000, () => {
|
|
74
|
+
console.log('Moro server running on http://localhost:3000');
|
|
75
|
+
});
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Multi-Runtime Support
|
|
79
|
+
|
|
80
|
+
Deploy the **same code** everywhere:
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
// Node.js (default)
|
|
84
|
+
import { createApp } from 'moro';
|
|
85
|
+
const app = createApp();
|
|
86
|
+
app.listen(3000);
|
|
87
|
+
|
|
88
|
+
// Vercel Edge Functions
|
|
89
|
+
import { createAppEdge } from 'moro';
|
|
90
|
+
const app = createAppEdge();
|
|
91
|
+
export default app.getHandler();
|
|
92
|
+
|
|
93
|
+
// AWS Lambda
|
|
94
|
+
import { createAppLambda } from 'moro';
|
|
95
|
+
const app = createAppLambda();
|
|
96
|
+
export const handler = app.getHandler();
|
|
97
|
+
|
|
98
|
+
// Cloudflare Workers
|
|
99
|
+
import { createAppWorker } from 'moro';
|
|
100
|
+
const app = createAppWorker();
|
|
101
|
+
export default { fetch: app.getHandler() };
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## What Makes Moro Different?
|
|
105
|
+
|
|
106
|
+
### **No More Middleware Order Hell**
|
|
107
|
+
|
|
108
|
+
**Traditional frameworks:**
|
|
109
|
+
```typescript
|
|
110
|
+
// Express - Order matters, easy to break
|
|
111
|
+
app.use(cors()); // Must be first
|
|
112
|
+
app.use(helmet()); // Must be early
|
|
113
|
+
app.use(bodyParser()); // Must be before validation
|
|
114
|
+
app.use(rateLimit()); // Must be before routes
|
|
115
|
+
app.use(validation()); // Must be before handler
|
|
116
|
+
app.post('/users', handler); // Must be last
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**Moro - Order independent:**
|
|
120
|
+
```typescript
|
|
121
|
+
// Moro - Framework handles optimal ordering
|
|
122
|
+
app.post('/users')
|
|
123
|
+
.body(UserSchema) // Framework places in validation phase
|
|
124
|
+
.rateLimit({ requests: 10, window: 60000 }) // Rate limit phase
|
|
125
|
+
.auth({ roles: ['user'] }) // Auth phase
|
|
126
|
+
.handler(createUser); // Always executed last
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### **Full Type Safety with Zod**
|
|
130
|
+
|
|
131
|
+
```typescript
|
|
132
|
+
const UserSchema = z.object({
|
|
133
|
+
name: z.string().min(2).max(50),
|
|
134
|
+
email: z.string().email(),
|
|
135
|
+
age: z.number().min(18).optional()
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
app.post('/users')
|
|
139
|
+
.body(UserSchema)
|
|
140
|
+
.handler((req, res) => {
|
|
141
|
+
// req.body is typed as z.infer<typeof UserSchema>
|
|
142
|
+
// Full IDE support, no type assertions needed!
|
|
143
|
+
const user = req.body; // ✨ Fully typed
|
|
144
|
+
return { success: true, data: user };
|
|
145
|
+
});
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Examples
|
|
149
|
+
|
|
150
|
+
### API Styles
|
|
151
|
+
|
|
152
|
+
```typescript
|
|
153
|
+
// Chainable API (complex routes)
|
|
154
|
+
app.post('/orders')
|
|
155
|
+
.body(OrderSchema)
|
|
156
|
+
.auth({ roles: ['user'] })
|
|
157
|
+
.rateLimit({ requests: 5, window: 60000 })
|
|
158
|
+
.cache({ ttl: 300 })
|
|
159
|
+
.handler(createOrder);
|
|
160
|
+
|
|
161
|
+
// Schema-first (simple routes)
|
|
162
|
+
app.route({
|
|
163
|
+
method: 'GET',
|
|
164
|
+
path: '/users/:id',
|
|
165
|
+
validation: { params: z.object({ id: z.string().uuid() }) },
|
|
166
|
+
handler: getUserById
|
|
167
|
+
});
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Functional Modules
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
export default defineModule({
|
|
174
|
+
name: 'users',
|
|
175
|
+
routes: [
|
|
176
|
+
{
|
|
177
|
+
method: 'GET',
|
|
178
|
+
path: '/',
|
|
179
|
+
validation: {
|
|
180
|
+
query: z.object({ limit: z.coerce.number().default(10) })
|
|
181
|
+
},
|
|
182
|
+
handler: async (req, res) => {
|
|
183
|
+
return { users: await getUsers(req.query) };
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
]
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
await app.loadModule(UsersModule);
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Documentation
|
|
193
|
+
|
|
194
|
+
### **Complete Guides**
|
|
195
|
+
- [**Getting Started**](./docs/GETTING_STARTED.md) - Detailed setup and first app
|
|
196
|
+
- [**API Reference**](./docs/API.md) - Complete framework API documentation
|
|
197
|
+
- [**Migration Guide**](./docs/MIGRATION.md) - From Express, Fastify, NestJS
|
|
198
|
+
- [**Performance Guide**](./docs/PERFORMANCE.md) - Optimization and benchmarks
|
|
199
|
+
- [**Runtime System**](./docs/RUNTIME.md) - Multi-runtime deployment guide
|
|
200
|
+
- [**Examples Repository**](../MoroJS%20Examples/) - Working examples
|
|
201
|
+
|
|
202
|
+
### **Key Concepts**
|
|
203
|
+
- **Multi-Runtime Support** - Same API works on Node.js, Edge, Lambda, and Workers
|
|
204
|
+
- **Intelligent Routing** - Automatic middleware ordering eliminates Express.js pain points
|
|
205
|
+
- **Functional Architecture** - No decorators, pure functions, better performance
|
|
206
|
+
- **Type Safety** - Zod provides compile-time and runtime type safety
|
|
207
|
+
|
|
208
|
+
## Why Choose Moro?
|
|
209
|
+
|
|
210
|
+
**Same API everywhere** - Write once, deploy to any runtime
|
|
211
|
+
**No middleware dependencies** - Framework handles optimal ordering
|
|
212
|
+
**Full type safety** - Zod provides end-to-end TypeScript inference
|
|
213
|
+
**Clean APIs** - Chainable and schema-first approaches
|
|
214
|
+
**Production ready** - Circuit breakers, rate limiting, events
|
|
215
|
+
**Performance optimized** - Runtime-specific adapters
|
|
216
|
+
|
|
217
|
+
## Contributing
|
|
218
|
+
|
|
219
|
+
We welcome contributions! See our [Contributing Guide](./docs/CONTRIBUTING.md) for details.
|
|
220
|
+
|
|
221
|
+
## License
|
|
222
|
+
|
|
223
|
+
MIT © [Moro Framework Team](https://morojs.com)
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
<div align="center">
|
|
228
|
+
|
|
229
|
+
**Ready to deploy everywhere with one codebase?**
|
|
230
|
+
|
|
231
|
+
[Get Started](./docs/GETTING_STARTED.md) • [GitHub](https://github.com/MoroJS/moro) • [npm](https://www.npmjs.com/package/@morojs/moro)
|
|
232
|
+
|
|
233
|
+
</div>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export * from "./schema";
|
|
2
|
+
export * from "./loader";
|
|
3
|
+
export * from "./utils";
|
|
4
|
+
export { z } from "zod";
|
|
5
|
+
import type { AppConfig } from "./schema";
|
|
6
|
+
/**
|
|
7
|
+
* Initialize and load the global application configuration
|
|
8
|
+
* This should be called once at application startup
|
|
9
|
+
*/
|
|
10
|
+
export declare function initializeConfig(): AppConfig;
|
|
11
|
+
/**
|
|
12
|
+
* Get the current global configuration
|
|
13
|
+
* Throws if configuration hasn't been initialized
|
|
14
|
+
*/
|
|
15
|
+
export declare function getGlobalConfig(): AppConfig;
|
|
16
|
+
/**
|
|
17
|
+
* Check if configuration has been initialized
|
|
18
|
+
*/
|
|
19
|
+
export declare function isConfigInitialized(): boolean;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.z = void 0;
|
|
18
|
+
exports.initializeConfig = initializeConfig;
|
|
19
|
+
exports.getGlobalConfig = getGlobalConfig;
|
|
20
|
+
exports.isConfigInitialized = isConfigInitialized;
|
|
21
|
+
// Configuration System - Main Exports and Utilities
|
|
22
|
+
__exportStar(require("./schema"), exports);
|
|
23
|
+
__exportStar(require("./loader"), exports);
|
|
24
|
+
__exportStar(require("./utils"), exports);
|
|
25
|
+
// Re-export common Zod utilities for configuration
|
|
26
|
+
var zod_1 = require("zod");
|
|
27
|
+
Object.defineProperty(exports, "z", { enumerable: true, get: function () { return zod_1.z; } });
|
|
28
|
+
// Main configuration loading function
|
|
29
|
+
const loader_1 = require("./loader");
|
|
30
|
+
// Global configuration instance
|
|
31
|
+
let globalConfig = null;
|
|
32
|
+
/**
|
|
33
|
+
* Initialize and load the global application configuration
|
|
34
|
+
* This should be called once at application startup
|
|
35
|
+
*/
|
|
36
|
+
function initializeConfig() {
|
|
37
|
+
if (globalConfig) {
|
|
38
|
+
return globalConfig;
|
|
39
|
+
}
|
|
40
|
+
globalConfig = (0, loader_1.loadConfig)();
|
|
41
|
+
return globalConfig;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get the current global configuration
|
|
45
|
+
* Throws if configuration hasn't been initialized
|
|
46
|
+
*/
|
|
47
|
+
function getGlobalConfig() {
|
|
48
|
+
if (!globalConfig) {
|
|
49
|
+
throw new Error("Configuration not initialized. Call initializeConfig() first.");
|
|
50
|
+
}
|
|
51
|
+
return globalConfig;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Check if configuration has been initialized
|
|
55
|
+
*/
|
|
56
|
+
function isConfigInitialized() {
|
|
57
|
+
return globalConfig !== null;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/config/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAmBA,4CAOC;AAMD,0CAOC;AAKD,kDAEC;AA9CD,oDAAoD;AACpD,2CAAyB;AACzB,2CAAyB;AACzB,0CAAwB;AAExB,mDAAmD;AACnD,2BAAwB;AAAf,wFAAA,CAAC,OAAA;AAEV,sCAAsC;AACtC,qCAAsC;AAGtC,gCAAgC;AAChC,IAAI,YAAY,GAAqB,IAAI,CAAC;AAE1C;;;GAGG;AACH,SAAgB,gBAAgB;IAC9B,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,YAAY,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC5B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe;IAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,+DAA+D,CAChE,CAAC;IACJ,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB;IACjC,OAAO,YAAY,KAAK,IAAI,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loadConfig = loadConfig;
|
|
4
|
+
// Configuration Loader - Environment Variable Mapping and Validation
|
|
5
|
+
const zod_1 = require("zod");
|
|
6
|
+
const schema_1 = require("./schema");
|
|
7
|
+
const logger_1 = require("../logger");
|
|
8
|
+
const logger = (0, logger_1.createFrameworkLogger)("Config");
|
|
9
|
+
/**
|
|
10
|
+
* Load and validate configuration from environment variables
|
|
11
|
+
* @returns Validated and typed application configuration
|
|
12
|
+
*/
|
|
13
|
+
function loadConfig() {
|
|
14
|
+
logger.debug("Loading configuration from environment variables");
|
|
15
|
+
// Map environment variables to configuration structure
|
|
16
|
+
const envConfig = {
|
|
17
|
+
server: {
|
|
18
|
+
port: process.env.PORT || process.env.MORO_PORT,
|
|
19
|
+
host: process.env.HOST || process.env.MORO_HOST,
|
|
20
|
+
environment: process.env.NODE_ENV || process.env.MORO_ENV,
|
|
21
|
+
maxConnections: process.env.MAX_CONNECTIONS || process.env.MORO_MAX_CONNECTIONS,
|
|
22
|
+
timeout: process.env.REQUEST_TIMEOUT || process.env.MORO_TIMEOUT,
|
|
23
|
+
},
|
|
24
|
+
serviceDiscovery: {
|
|
25
|
+
enabled: process.env.SERVICE_DISCOVERY_ENABLED ||
|
|
26
|
+
process.env.MORO_SERVICE_DISCOVERY,
|
|
27
|
+
type: process.env.DISCOVERY_TYPE || process.env.MORO_DISCOVERY_TYPE,
|
|
28
|
+
consulUrl: process.env.CONSUL_URL || process.env.MORO_CONSUL_URL,
|
|
29
|
+
kubernetesNamespace: process.env.K8S_NAMESPACE || process.env.MORO_K8S_NAMESPACE,
|
|
30
|
+
healthCheckInterval: process.env.HEALTH_CHECK_INTERVAL || process.env.MORO_HEALTH_INTERVAL,
|
|
31
|
+
retryAttempts: process.env.DISCOVERY_RETRY_ATTEMPTS ||
|
|
32
|
+
process.env.MORO_DISCOVERY_RETRIES,
|
|
33
|
+
},
|
|
34
|
+
database: {
|
|
35
|
+
url: process.env.DATABASE_URL || process.env.MORO_DATABASE_URL,
|
|
36
|
+
redis: {
|
|
37
|
+
url: process.env.REDIS_URL || process.env.MORO_REDIS_URL,
|
|
38
|
+
maxRetries: process.env.REDIS_MAX_RETRIES || process.env.MORO_REDIS_RETRIES,
|
|
39
|
+
retryDelay: process.env.REDIS_RETRY_DELAY || process.env.MORO_REDIS_DELAY,
|
|
40
|
+
keyPrefix: process.env.REDIS_KEY_PREFIX || process.env.MORO_REDIS_PREFIX,
|
|
41
|
+
},
|
|
42
|
+
mysql: process.env.MYSQL_HOST
|
|
43
|
+
? {
|
|
44
|
+
host: process.env.MYSQL_HOST || process.env.MORO_MYSQL_HOST,
|
|
45
|
+
port: process.env.MYSQL_PORT || process.env.MORO_MYSQL_PORT,
|
|
46
|
+
database: process.env.MYSQL_DATABASE || process.env.MORO_MYSQL_DB,
|
|
47
|
+
username: process.env.MYSQL_USERNAME || process.env.MORO_MYSQL_USER,
|
|
48
|
+
password: process.env.MYSQL_PASSWORD || process.env.MORO_MYSQL_PASS,
|
|
49
|
+
connectionLimit: process.env.MYSQL_CONNECTION_LIMIT ||
|
|
50
|
+
process.env.MORO_MYSQL_CONNECTIONS,
|
|
51
|
+
acquireTimeout: process.env.MYSQL_ACQUIRE_TIMEOUT ||
|
|
52
|
+
process.env.MORO_MYSQL_ACQUIRE_TIMEOUT,
|
|
53
|
+
timeout: process.env.MYSQL_TIMEOUT || process.env.MORO_MYSQL_TIMEOUT,
|
|
54
|
+
}
|
|
55
|
+
: undefined,
|
|
56
|
+
},
|
|
57
|
+
modules: {
|
|
58
|
+
cache: {
|
|
59
|
+
enabled: process.env.CACHE_ENABLED || process.env.MORO_CACHE_ENABLED,
|
|
60
|
+
defaultTtl: process.env.DEFAULT_CACHE_TTL || process.env.MORO_CACHE_TTL,
|
|
61
|
+
maxSize: process.env.CACHE_MAX_SIZE || process.env.MORO_CACHE_SIZE,
|
|
62
|
+
strategy: process.env.CACHE_STRATEGY || process.env.MORO_CACHE_STRATEGY,
|
|
63
|
+
},
|
|
64
|
+
rateLimit: {
|
|
65
|
+
enabled: process.env.RATE_LIMIT_ENABLED || process.env.MORO_RATE_LIMIT_ENABLED,
|
|
66
|
+
defaultRequests: process.env.DEFAULT_RATE_LIMIT_REQUESTS ||
|
|
67
|
+
process.env.MORO_RATE_LIMIT_REQUESTS,
|
|
68
|
+
defaultWindow: process.env.DEFAULT_RATE_LIMIT_WINDOW ||
|
|
69
|
+
process.env.MORO_RATE_LIMIT_WINDOW,
|
|
70
|
+
skipSuccessfulRequests: process.env.RATE_LIMIT_SKIP_SUCCESS ||
|
|
71
|
+
process.env.MORO_RATE_LIMIT_SKIP_SUCCESS,
|
|
72
|
+
skipFailedRequests: process.env.RATE_LIMIT_SKIP_FAILED ||
|
|
73
|
+
process.env.MORO_RATE_LIMIT_SKIP_FAILED,
|
|
74
|
+
},
|
|
75
|
+
validation: {
|
|
76
|
+
enabled: process.env.VALIDATION_ENABLED || process.env.MORO_VALIDATION_ENABLED,
|
|
77
|
+
stripUnknown: process.env.VALIDATION_STRIP_UNKNOWN ||
|
|
78
|
+
process.env.MORO_VALIDATION_STRIP,
|
|
79
|
+
abortEarly: process.env.VALIDATION_ABORT_EARLY ||
|
|
80
|
+
process.env.MORO_VALIDATION_ABORT,
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
logging: {
|
|
84
|
+
level: process.env.LOG_LEVEL || process.env.MORO_LOG_LEVEL,
|
|
85
|
+
format: process.env.LOG_FORMAT || process.env.MORO_LOG_FORMAT,
|
|
86
|
+
enableColors: process.env.NO_COLOR
|
|
87
|
+
? false
|
|
88
|
+
: process.env.LOG_COLORS !== "false",
|
|
89
|
+
enableTimestamp: process.env.LOG_TIMESTAMP !== "false",
|
|
90
|
+
enableContext: process.env.LOG_CONTEXT !== "false",
|
|
91
|
+
outputs: {
|
|
92
|
+
console: process.env.LOG_CONSOLE !== "false",
|
|
93
|
+
file: {
|
|
94
|
+
enabled: process.env.LOG_FILE_ENABLED === "true" ||
|
|
95
|
+
process.env.MORO_LOG_FILE === "true",
|
|
96
|
+
path: process.env.LOG_FILE_PATH || process.env.MORO_LOG_PATH,
|
|
97
|
+
maxSize: process.env.LOG_FILE_MAX_SIZE || process.env.MORO_LOG_MAX_SIZE,
|
|
98
|
+
maxFiles: process.env.LOG_FILE_MAX_FILES || process.env.MORO_LOG_MAX_FILES,
|
|
99
|
+
},
|
|
100
|
+
webhook: {
|
|
101
|
+
enabled: process.env.LOG_WEBHOOK_ENABLED === "true" ||
|
|
102
|
+
process.env.MORO_LOG_WEBHOOK === "true",
|
|
103
|
+
url: process.env.LOG_WEBHOOK_URL || process.env.MORO_LOG_WEBHOOK_URL,
|
|
104
|
+
headers: parseJsonEnv(process.env.LOG_WEBHOOK_HEADERS ||
|
|
105
|
+
process.env.MORO_LOG_WEBHOOK_HEADERS, {}),
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
security: {
|
|
110
|
+
cors: {
|
|
111
|
+
enabled: process.env.CORS_ENABLED !== "false",
|
|
112
|
+
origin: parseArrayOrString(process.env.CORS_ORIGIN || process.env.MORO_CORS_ORIGIN),
|
|
113
|
+
methods: parseArrayEnv(process.env.CORS_METHODS || process.env.MORO_CORS_METHODS),
|
|
114
|
+
allowedHeaders: parseArrayEnv(process.env.CORS_HEADERS || process.env.MORO_CORS_HEADERS),
|
|
115
|
+
credentials: process.env.CORS_CREDENTIALS === "true",
|
|
116
|
+
},
|
|
117
|
+
helmet: {
|
|
118
|
+
enabled: process.env.HELMET_ENABLED !== "false",
|
|
119
|
+
contentSecurityPolicy: process.env.HELMET_CSP !== "false",
|
|
120
|
+
hsts: process.env.HELMET_HSTS !== "false",
|
|
121
|
+
noSniff: process.env.HELMET_NO_SNIFF !== "false",
|
|
122
|
+
frameguard: process.env.HELMET_FRAMEGUARD !== "false",
|
|
123
|
+
},
|
|
124
|
+
rateLimit: {
|
|
125
|
+
global: {
|
|
126
|
+
enabled: process.env.GLOBAL_RATE_LIMIT_ENABLED === "true",
|
|
127
|
+
requests: process.env.GLOBAL_RATE_LIMIT_REQUESTS ||
|
|
128
|
+
process.env.MORO_GLOBAL_RATE_REQUESTS,
|
|
129
|
+
window: process.env.GLOBAL_RATE_LIMIT_WINDOW ||
|
|
130
|
+
process.env.MORO_GLOBAL_RATE_WINDOW,
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
external: {
|
|
135
|
+
stripe: process.env.STRIPE_SECRET_KEY || process.env.MORO_STRIPE_SECRET
|
|
136
|
+
? {
|
|
137
|
+
secretKey: process.env.STRIPE_SECRET_KEY || process.env.MORO_STRIPE_SECRET,
|
|
138
|
+
publishableKey: process.env.STRIPE_PUBLISHABLE_KEY ||
|
|
139
|
+
process.env.MORO_STRIPE_PUBLIC,
|
|
140
|
+
webhookSecret: process.env.STRIPE_WEBHOOK_SECRET ||
|
|
141
|
+
process.env.MORO_STRIPE_WEBHOOK,
|
|
142
|
+
apiVersion: process.env.STRIPE_API_VERSION ||
|
|
143
|
+
process.env.MORO_STRIPE_VERSION,
|
|
144
|
+
}
|
|
145
|
+
: undefined,
|
|
146
|
+
paypal: process.env.PAYPAL_CLIENT_ID || process.env.MORO_PAYPAL_CLIENT
|
|
147
|
+
? {
|
|
148
|
+
clientId: process.env.PAYPAL_CLIENT_ID || process.env.MORO_PAYPAL_CLIENT,
|
|
149
|
+
clientSecret: process.env.PAYPAL_CLIENT_SECRET ||
|
|
150
|
+
process.env.MORO_PAYPAL_SECRET,
|
|
151
|
+
webhookId: process.env.PAYPAL_WEBHOOK_ID ||
|
|
152
|
+
process.env.MORO_PAYPAL_WEBHOOK,
|
|
153
|
+
environment: process.env.PAYPAL_ENVIRONMENT || process.env.MORO_PAYPAL_ENV,
|
|
154
|
+
}
|
|
155
|
+
: undefined,
|
|
156
|
+
smtp: process.env.SMTP_HOST || process.env.MORO_SMTP_HOST
|
|
157
|
+
? {
|
|
158
|
+
host: process.env.SMTP_HOST || process.env.MORO_SMTP_HOST,
|
|
159
|
+
port: process.env.SMTP_PORT || process.env.MORO_SMTP_PORT,
|
|
160
|
+
secure: process.env.SMTP_SECURE === "true",
|
|
161
|
+
username: process.env.SMTP_USERNAME || process.env.MORO_SMTP_USER,
|
|
162
|
+
password: process.env.SMTP_PASSWORD || process.env.MORO_SMTP_PASS,
|
|
163
|
+
}
|
|
164
|
+
: undefined,
|
|
165
|
+
},
|
|
166
|
+
performance: {
|
|
167
|
+
compression: {
|
|
168
|
+
enabled: process.env.COMPRESSION_ENABLED !== "false",
|
|
169
|
+
level: process.env.COMPRESSION_LEVEL || process.env.MORO_COMPRESSION_LEVEL,
|
|
170
|
+
threshold: process.env.COMPRESSION_THRESHOLD ||
|
|
171
|
+
process.env.MORO_COMPRESSION_THRESHOLD,
|
|
172
|
+
},
|
|
173
|
+
circuitBreaker: {
|
|
174
|
+
enabled: process.env.CIRCUIT_BREAKER_ENABLED !== "false",
|
|
175
|
+
failureThreshold: process.env.CIRCUIT_BREAKER_THRESHOLD ||
|
|
176
|
+
process.env.MORO_CB_THRESHOLD,
|
|
177
|
+
resetTimeout: process.env.CIRCUIT_BREAKER_RESET || process.env.MORO_CB_RESET,
|
|
178
|
+
monitoringPeriod: process.env.CIRCUIT_BREAKER_MONITOR || process.env.MORO_CB_MONITOR,
|
|
179
|
+
},
|
|
180
|
+
clustering: {
|
|
181
|
+
enabled: process.env.CLUSTERING_ENABLED === "true",
|
|
182
|
+
workers: process.env.CLUSTER_WORKERS || process.env.MORO_WORKERS,
|
|
183
|
+
},
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
// Validate and transform configuration using Zod
|
|
187
|
+
try {
|
|
188
|
+
const validatedConfig = schema_1.ConfigSchema.parse(envConfig);
|
|
189
|
+
logger.info("Configuration loaded and validated successfully");
|
|
190
|
+
logger.debug("Configuration details:", JSON.stringify({
|
|
191
|
+
server: {
|
|
192
|
+
port: validatedConfig.server.port,
|
|
193
|
+
environment: validatedConfig.server.environment,
|
|
194
|
+
},
|
|
195
|
+
serviceDiscovery: {
|
|
196
|
+
enabled: validatedConfig.serviceDiscovery.enabled,
|
|
197
|
+
type: validatedConfig.serviceDiscovery.type,
|
|
198
|
+
},
|
|
199
|
+
modules: {
|
|
200
|
+
cacheEnabled: validatedConfig.modules.cache.enabled,
|
|
201
|
+
rateLimitEnabled: validatedConfig.modules.rateLimit.enabled,
|
|
202
|
+
},
|
|
203
|
+
}));
|
|
204
|
+
return validatedConfig;
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
logger.error("❌ Configuration validation failed");
|
|
208
|
+
if (error instanceof zod_1.ZodError) {
|
|
209
|
+
logger.error("Configuration errors:");
|
|
210
|
+
error.issues.forEach((err) => {
|
|
211
|
+
const path = err.path.join(".");
|
|
212
|
+
logger.error(` - ${path}: ${err.message}`);
|
|
213
|
+
// Provide helpful hints for common errors
|
|
214
|
+
if (path.includes("port") && err.code === "invalid_type") {
|
|
215
|
+
logger.error(` Hint: PORT must be a number between 1 and 65535`);
|
|
216
|
+
}
|
|
217
|
+
if (path.includes("url") && err.code === "invalid_string") {
|
|
218
|
+
logger.error(` Hint: URLs must include protocol (http:// or https://)`);
|
|
219
|
+
}
|
|
220
|
+
if (path.includes("environment") && err.code === "invalid_enum_value") {
|
|
221
|
+
logger.error(` Hint: NODE_ENV must be one of: development, staging, production`);
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
logger.error("\nConfiguration Help:");
|
|
225
|
+
logger.error(" - Use MORO_* prefixed environment variables for framework-specific config");
|
|
226
|
+
logger.error(" - Check .env.example for available configuration options");
|
|
227
|
+
logger.error(" - See documentation for detailed configuration guide");
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
logger.error("Unexpected configuration error:", String(error));
|
|
231
|
+
}
|
|
232
|
+
process.exit(1);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Parse JSON environment variable safely
|
|
237
|
+
*/
|
|
238
|
+
function parseJsonEnv(value, defaultValue) {
|
|
239
|
+
if (!value)
|
|
240
|
+
return defaultValue;
|
|
241
|
+
try {
|
|
242
|
+
return JSON.parse(value);
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
logger.warn(`Invalid JSON in environment variable, using default:`, value);
|
|
246
|
+
return defaultValue;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Parse comma-separated array environment variable
|
|
251
|
+
*/
|
|
252
|
+
function parseArrayEnv(value) {
|
|
253
|
+
if (!value)
|
|
254
|
+
return undefined;
|
|
255
|
+
return value
|
|
256
|
+
.split(",")
|
|
257
|
+
.map((item) => item.trim())
|
|
258
|
+
.filter(Boolean);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Parse array or string environment variable
|
|
262
|
+
*/
|
|
263
|
+
function parseArrayOrString(value) {
|
|
264
|
+
if (!value)
|
|
265
|
+
return undefined;
|
|
266
|
+
// If it contains commas, treat as array
|
|
267
|
+
if (value.includes(",")) {
|
|
268
|
+
return parseArrayEnv(value);
|
|
269
|
+
}
|
|
270
|
+
// Special boolean values
|
|
271
|
+
if (value === "true")
|
|
272
|
+
return true;
|
|
273
|
+
if (value === "false")
|
|
274
|
+
return false;
|
|
275
|
+
return value;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Get environment variable with multiple possible names
|
|
279
|
+
*/
|
|
280
|
+
function getEnvVar(...names) {
|
|
281
|
+
for (const name of names) {
|
|
282
|
+
if (name && process.env[name]) {
|
|
283
|
+
return process.env[name];
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return undefined;
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/core/config/loader.ts"],"names":[],"mappings":"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"}
|