@morojs/moro 1.0.0 → 1.0.1
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 +1 -1
- package/dist/core/config/index.d.ts +5 -5
- package/dist/core/config/index.js +1 -1
- package/dist/core/config/index.js.map +1 -1
- package/dist/core/config/loader.d.ts +1 -1
- package/dist/core/config/loader.js +58 -82
- package/dist/core/config/loader.js.map +1 -1
- package/dist/core/config/schema.d.ts +1 -1
- package/dist/core/config/schema.js +52 -111
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/config/utils.d.ts +2 -2
- package/dist/core/config/utils.js +18 -18
- 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 +39 -55
- 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 +11 -11
- package/dist/core/database/adapters/index.js.map +1 -1
- package/dist/core/database/adapters/mongodb.d.ts +1 -1
- package/dist/core/database/adapters/mongodb.js +19 -23
- package/dist/core/database/adapters/mongodb.js.map +1 -1
- package/dist/core/database/adapters/mysql.d.ts +1 -1
- package/dist/core/database/adapters/mysql.js +31 -27
- package/dist/core/database/adapters/mysql.js.map +1 -1
- package/dist/core/database/adapters/postgresql.d.ts +1 -1
- package/dist/core/database/adapters/postgresql.js +27 -35
- package/dist/core/database/adapters/postgresql.js.map +1 -1
- package/dist/core/database/adapters/redis.d.ts +1 -1
- package/dist/core/database/adapters/redis.js +24 -24
- package/dist/core/database/adapters/redis.js.map +1 -1
- package/dist/core/database/adapters/sqlite.d.ts +1 -1
- package/dist/core/database/adapters/sqlite.js +36 -36
- package/dist/core/database/adapters/sqlite.js.map +1 -1
- package/dist/core/database/index.d.ts +2 -2
- package/dist/core/docs/index.d.ts +7 -7
- package/dist/core/docs/index.js +13 -15
- package/dist/core/docs/index.js.map +1 -1
- package/dist/core/docs/openapi-generator.d.ts +5 -5
- package/dist/core/docs/openapi-generator.js +93 -94
- package/dist/core/docs/openapi-generator.js.map +1 -1
- package/dist/core/docs/simple-docs.d.ts +1 -1
- package/dist/core/docs/simple-docs.js +25 -28
- 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 +46 -51
- package/dist/core/docs/swagger-ui.js.map +1 -1
- package/dist/core/docs/zod-to-openapi.d.ts +1 -1
- package/dist/core/docs/zod-to-openapi.js +115 -125
- 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 +15 -21
- package/dist/core/events/event-bus.js.map +1 -1
- package/dist/core/events/index.d.ts +2 -2
- package/dist/core/framework.d.ts +5 -5
- package/dist/core/framework.js +55 -60
- package/dist/core/framework.js.map +1 -1
- package/dist/core/http/http-server.d.ts +2 -2
- package/dist/core/http/http-server.js +228 -261
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/index.d.ts +3 -3
- package/dist/core/http/router.d.ts +1 -1
- package/dist/core/http/router.js +15 -17
- package/dist/core/http/router.js.map +1 -1
- package/dist/core/logger/filters.d.ts +1 -1
- package/dist/core/logger/filters.js +16 -16
- package/dist/core/logger/filters.js.map +1 -1
- package/dist/core/logger/index.d.ts +3 -3
- package/dist/core/logger/logger.d.ts +1 -1
- package/dist/core/logger/logger.js +48 -59
- package/dist/core/logger/logger.js.map +1 -1
- package/dist/core/logger/outputs.d.ts +4 -4
- package/dist/core/logger/outputs.js +16 -20
- 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 +19 -19
- 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 +3 -3
- 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 +5 -5
- package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.js +18 -18
- 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 +8 -8
- 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 +14 -14
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +13 -15
- 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 +3 -3
- package/dist/core/middleware/built-in/adapters/index.d.ts +4 -4
- package/dist/core/middleware/built-in/auth.d.ts +1 -1
- package/dist/core/middleware/built-in/auth.js +14 -14
- package/dist/core/middleware/built-in/cache.d.ts +2 -2
- package/dist/core/middleware/built-in/cache.js +43 -45
- 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 +27 -29
- package/dist/core/middleware/built-in/cdn.js.map +1 -1
- package/dist/core/middleware/built-in/cookie.d.ts +2 -2
- package/dist/core/middleware/built-in/cookie.js +17 -17
- 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 +13 -13
- package/dist/core/middleware/built-in/csp.d.ts +1 -1
- package/dist/core/middleware/built-in/csp.js +22 -25
- 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 +21 -24
- package/dist/core/middleware/built-in/csrf.js.map +1 -1
- package/dist/core/middleware/built-in/error-tracker.js +2 -2
- package/dist/core/middleware/built-in/index.d.ts +14 -14
- package/dist/core/middleware/built-in/performance-monitor.js +2 -2
- package/dist/core/middleware/built-in/rate-limit.d.ts +1 -1
- package/dist/core/middleware/built-in/rate-limit.js +12 -12
- package/dist/core/middleware/built-in/request-logger.js.map +1 -1
- package/dist/core/middleware/built-in/session.d.ts +5 -5
- package/dist/core/middleware/built-in/session.js +35 -38
- 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 +20 -22
- 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 +13 -13
- package/dist/core/middleware/index.d.ts +5 -5
- package/dist/core/middleware/index.js +16 -16
- package/dist/core/middleware/index.js.map +1 -1
- package/dist/core/modules/auto-discovery.d.ts +2 -2
- package/dist/core/modules/auto-discovery.js +12 -13
- 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.map +1 -1
- package/dist/core/modules/modules.d.ts +3 -3
- package/dist/core/modules/modules.js +3 -6
- package/dist/core/modules/modules.js.map +1 -1
- package/dist/core/networking/index.d.ts +2 -2
- package/dist/core/networking/index.js.map +1 -1
- package/dist/core/networking/service-discovery.d.ts +2 -2
- package/dist/core/networking/service-discovery.js +27 -27
- package/dist/core/networking/service-discovery.js.map +1 -1
- package/dist/core/networking/websocket-manager.d.ts +3 -3
- package/dist/core/networking/websocket-manager.js +15 -16
- package/dist/core/networking/websocket-manager.js.map +1 -1
- package/dist/core/routing/app-integration.d.ts +2 -2
- package/dist/core/routing/app-integration.js +13 -13
- package/dist/core/routing/app-integration.js.map +1 -1
- package/dist/core/routing/index.d.ts +3 -3
- package/dist/core/routing/index.js +43 -52
- package/dist/core/routing/index.js.map +1 -1
- package/dist/core/runtime/aws-lambda-adapter.d.ts +3 -3
- package/dist/core/runtime/aws-lambda-adapter.js +14 -16
- 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 +11 -12
- 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 +20 -21
- package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
- package/dist/core/runtime/index.d.ts +9 -9
- package/dist/core/runtime/index.js +4 -4
- package/dist/core/runtime/index.js.map +1 -1
- package/dist/core/runtime/node-adapter.d.ts +5 -5
- package/dist/core/runtime/node-adapter.js +35 -35
- 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 +12 -15
- package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
- package/dist/core/utilities/circuit-breaker.js +6 -6
- package/dist/core/utilities/container.d.ts +1 -1
- package/dist/core/utilities/container.js +17 -22
- package/dist/core/utilities/container.js.map +1 -1
- package/dist/core/utilities/hooks.d.ts +3 -3
- package/dist/core/utilities/hooks.js +11 -11
- package/dist/core/utilities/hooks.js.map +1 -1
- package/dist/core/utilities/index.d.ts +4 -4
- package/dist/core/validation/index.d.ts +3 -3
- package/dist/core/validation/index.js +15 -15
- package/dist/core/validation/index.js.map +1 -1
- package/dist/index.d.ts +31 -30
- package/dist/index.js +28 -1
- package/dist/index.js.map +1 -1
- package/dist/moro.d.ts +14 -14
- package/dist/moro.js +79 -88
- package/dist/moro.js.map +1 -1
- package/dist/types/cache.d.ts +1 -1
- package/dist/types/core.d.ts +2 -2
- package/dist/types/events.d.ts +19 -19
- package/dist/types/hooks.d.ts +1 -1
- package/dist/types/http.d.ts +2 -2
- package/dist/types/logger.d.ts +3 -3
- package/dist/types/module.d.ts +2 -2
- package/dist/types/runtime.d.ts +2 -2
- package/dist/types/session.d.ts +4 -4
- package/package.json +180 -164
- package/src/core/config/index.ts +7 -9
- package/src/core/config/loader.ts +86 -158
- package/src/core/config/schema.ts +59 -122
- package/src/core/config/utils.ts +27 -45
- package/src/core/database/adapters/drizzle.ts +53 -75
- package/src/core/database/adapters/index.ts +26 -29
- package/src/core/database/adapters/mongodb.ts +31 -54
- package/src/core/database/adapters/mysql.ts +40 -50
- package/src/core/database/adapters/postgresql.ts +32 -42
- package/src/core/database/adapters/redis.ts +31 -36
- package/src/core/database/adapters/sqlite.ts +43 -51
- package/src/core/database/index.ts +2 -2
- package/src/core/docs/index.ts +25 -39
- package/src/core/docs/openapi-generator.ts +104 -117
- package/src/core/docs/simple-docs.ts +29 -39
- package/src/core/docs/swagger-ui.ts +57 -76
- package/src/core/docs/zod-to-openapi.ts +121 -153
- package/src/core/events/event-bus.ts +22 -45
- package/src/core/events/index.ts +2 -2
- package/src/core/framework.ts +119 -197
- package/src/core/http/http-server.ts +260 -360
- package/src/core/http/index.ts +3 -8
- package/src/core/http/router.ts +19 -31
- package/src/core/logger/filters.ts +19 -22
- package/src/core/logger/index.ts +3 -3
- package/src/core/logger/logger.ts +59 -100
- package/src/core/logger/outputs.ts +23 -27
- package/src/core/middleware/built-in/adapters/cache/file.ts +21 -23
- package/src/core/middleware/built-in/adapters/cache/index.ts +11 -14
- package/src/core/middleware/built-in/adapters/cache/memory.ts +7 -7
- package/src/core/middleware/built-in/adapters/cache/redis.ts +21 -24
- package/src/core/middleware/built-in/adapters/cdn/azure.ts +10 -18
- package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +19 -36
- package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +17 -26
- package/src/core/middleware/built-in/adapters/cdn/index.ts +10 -10
- package/src/core/middleware/built-in/adapters/index.ts +4 -4
- package/src/core/middleware/built-in/auth.ts +16 -16
- package/src/core/middleware/built-in/cache.ts +50 -67
- package/src/core/middleware/built-in/cdn.ts +34 -61
- package/src/core/middleware/built-in/cookie.ts +23 -28
- package/src/core/middleware/built-in/cors.ts +17 -17
- package/src/core/middleware/built-in/csp.ts +25 -31
- package/src/core/middleware/built-in/csrf.ts +24 -29
- package/src/core/middleware/built-in/error-tracker.ts +3 -3
- package/src/core/middleware/built-in/index.ts +28 -28
- package/src/core/middleware/built-in/performance-monitor.ts +4 -4
- package/src/core/middleware/built-in/rate-limit.ts +15 -15
- package/src/core/middleware/built-in/request-logger.ts +1 -3
- package/src/core/middleware/built-in/session.ts +47 -70
- package/src/core/middleware/built-in/sse.ts +23 -28
- package/src/core/middleware/built-in/validation.ts +15 -15
- package/src/core/middleware/index.ts +26 -37
- package/src/core/modules/auto-discovery.ts +21 -31
- package/src/core/modules/index.ts +2 -5
- package/src/core/modules/modules.ts +11 -20
- package/src/core/networking/index.ts +2 -6
- package/src/core/networking/service-discovery.ts +41 -61
- package/src/core/networking/websocket-manager.ts +27 -36
- package/src/core/routing/app-integration.ts +19 -32
- package/src/core/routing/index.ts +57 -88
- package/src/core/runtime/aws-lambda-adapter.ts +20 -30
- package/src/core/runtime/base-adapter.ts +17 -27
- package/src/core/runtime/cloudflare-workers-adapter.ts +28 -42
- package/src/core/runtime/index.ts +21 -33
- package/src/core/runtime/node-adapter.ts +59 -73
- package/src/core/runtime/vercel-edge-adapter.ts +18 -29
- package/src/core/utilities/circuit-breaker.ts +7 -7
- package/src/core/utilities/container.ts +52 -89
- package/src/core/utilities/hooks.ts +17 -23
- package/src/core/utilities/index.ts +4 -4
- package/src/core/validation/index.ts +25 -51
- package/src/index.ts +58 -60
- package/src/moro.ts +119 -191
- package/src/types/cache.ts +1 -1
- package/src/types/core.ts +2 -2
- package/src/types/database.ts +2 -10
- package/src/types/events.ts +23 -31
- package/src/types/hooks.ts +1 -1
- package/src/types/http.ts +5 -8
- package/src/types/logger.ts +7 -23
- package/src/types/module.ts +2 -2
- package/src/types/runtime.ts +6 -21
- package/src/types/session.ts +4 -4
|
@@ -1,99 +1,85 @@
|
|
|
1
1
|
// Core Configuration Schema for Moro Framework
|
|
2
|
-
import { z } from
|
|
2
|
+
import { z } from 'zod';
|
|
3
3
|
|
|
4
4
|
// Server Configuration Schema
|
|
5
5
|
const ServerConfigSchema = z.object({
|
|
6
6
|
port: z.coerce
|
|
7
7
|
.number()
|
|
8
|
-
.min(1,
|
|
9
|
-
.max(65535,
|
|
8
|
+
.min(1, 'Port must be at least 1')
|
|
9
|
+
.max(65535, 'Port must be at most 65535')
|
|
10
10
|
.default(3001)
|
|
11
|
-
.describe(
|
|
11
|
+
.describe('Server port to listen on'),
|
|
12
12
|
|
|
13
|
-
host: z.string().default(
|
|
13
|
+
host: z.string().default('localhost').describe('Server host to bind to'),
|
|
14
14
|
|
|
15
15
|
environment: z
|
|
16
|
-
.enum([
|
|
17
|
-
.default(
|
|
18
|
-
.describe(
|
|
16
|
+
.enum(['development', 'staging', 'production'])
|
|
17
|
+
.default('development')
|
|
18
|
+
.describe('Application environment'),
|
|
19
19
|
|
|
20
|
-
maxConnections: z.coerce
|
|
21
|
-
.number()
|
|
22
|
-
.min(1)
|
|
23
|
-
.default(1000)
|
|
24
|
-
.describe("Maximum concurrent connections"),
|
|
20
|
+
maxConnections: z.coerce.number().min(1).default(1000).describe('Maximum concurrent connections'),
|
|
25
21
|
|
|
26
|
-
timeout: z.coerce
|
|
27
|
-
.number()
|
|
28
|
-
.min(1000)
|
|
29
|
-
.default(30000)
|
|
30
|
-
.describe("Request timeout in milliseconds"),
|
|
22
|
+
timeout: z.coerce.number().min(1000).default(30000).describe('Request timeout in milliseconds'),
|
|
31
23
|
});
|
|
32
24
|
|
|
33
25
|
// Service Discovery Configuration Schema
|
|
34
26
|
const ServiceDiscoveryConfigSchema = z.object({
|
|
35
|
-
enabled: z.coerce
|
|
36
|
-
.boolean()
|
|
37
|
-
.default(false)
|
|
38
|
-
.describe("Enable service discovery"),
|
|
27
|
+
enabled: z.coerce.boolean().default(false).describe('Enable service discovery'),
|
|
39
28
|
|
|
40
29
|
type: z
|
|
41
|
-
.enum([
|
|
42
|
-
.default(
|
|
43
|
-
.describe(
|
|
30
|
+
.enum(['memory', 'consul', 'kubernetes'])
|
|
31
|
+
.default('memory')
|
|
32
|
+
.describe('Service discovery backend type'),
|
|
44
33
|
|
|
45
34
|
consulUrl: z
|
|
46
35
|
.string()
|
|
47
|
-
.url(
|
|
48
|
-
.default(
|
|
49
|
-
.describe(
|
|
36
|
+
.url('Must be a valid URL')
|
|
37
|
+
.default('http://localhost:8500')
|
|
38
|
+
.describe('Consul server URL'),
|
|
50
39
|
|
|
51
40
|
kubernetesNamespace: z
|
|
52
41
|
.string()
|
|
53
|
-
.default(
|
|
54
|
-
.describe(
|
|
42
|
+
.default('default')
|
|
43
|
+
.describe('Kubernetes namespace for service discovery'),
|
|
55
44
|
|
|
56
45
|
healthCheckInterval: z.coerce
|
|
57
46
|
.number()
|
|
58
47
|
.min(1000)
|
|
59
48
|
.default(30000)
|
|
60
|
-
.describe(
|
|
49
|
+
.describe('Health check interval in milliseconds'),
|
|
61
50
|
|
|
62
51
|
retryAttempts: z.coerce
|
|
63
52
|
.number()
|
|
64
53
|
.min(0)
|
|
65
54
|
.default(3)
|
|
66
|
-
.describe(
|
|
55
|
+
.describe('Number of retry attempts for failed health checks'),
|
|
67
56
|
});
|
|
68
57
|
|
|
69
58
|
// Database Configuration Schema
|
|
70
59
|
const DatabaseConfigSchema = z.object({
|
|
71
|
-
url: z.string().optional().describe(
|
|
60
|
+
url: z.string().optional().describe('Primary database connection URL'),
|
|
72
61
|
|
|
73
62
|
redis: z.object({
|
|
74
|
-
url: z
|
|
75
|
-
.string()
|
|
76
|
-
.default("redis://localhost:6379")
|
|
77
|
-
.describe("Redis connection URL"),
|
|
63
|
+
url: z.string().default('redis://localhost:6379').describe('Redis connection URL'),
|
|
78
64
|
|
|
79
65
|
maxRetries: z.coerce
|
|
80
66
|
.number()
|
|
81
67
|
.min(0)
|
|
82
68
|
.default(3)
|
|
83
|
-
.describe(
|
|
69
|
+
.describe('Maximum Redis connection retry attempts'),
|
|
84
70
|
|
|
85
71
|
retryDelay: z.coerce
|
|
86
72
|
.number()
|
|
87
73
|
.min(100)
|
|
88
74
|
.default(1000)
|
|
89
|
-
.describe(
|
|
75
|
+
.describe('Redis retry delay in milliseconds'),
|
|
90
76
|
|
|
91
|
-
keyPrefix: z.string().default(
|
|
77
|
+
keyPrefix: z.string().default('moro:').describe('Redis key prefix'),
|
|
92
78
|
}),
|
|
93
79
|
|
|
94
80
|
mysql: z
|
|
95
81
|
.object({
|
|
96
|
-
host: z.string().default(
|
|
82
|
+
host: z.string().default('localhost'),
|
|
97
83
|
port: z.coerce.number().min(1).max(65535).default(3306),
|
|
98
84
|
database: z.string().optional(),
|
|
99
85
|
username: z.string().optional(),
|
|
@@ -108,109 +94,70 @@ const DatabaseConfigSchema = z.object({
|
|
|
108
94
|
// Module Defaults Configuration Schema
|
|
109
95
|
const ModuleDefaultsConfigSchema = z.object({
|
|
110
96
|
cache: z.object({
|
|
111
|
-
enabled: z.coerce
|
|
112
|
-
.boolean()
|
|
113
|
-
.default(true)
|
|
114
|
-
.describe("Enable caching by default"),
|
|
97
|
+
enabled: z.coerce.boolean().default(true).describe('Enable caching by default'),
|
|
115
98
|
|
|
116
|
-
defaultTtl: z.coerce
|
|
117
|
-
.number()
|
|
118
|
-
.min(0)
|
|
119
|
-
.default(300)
|
|
120
|
-
.describe("Default cache TTL in seconds"),
|
|
99
|
+
defaultTtl: z.coerce.number().min(0).default(300).describe('Default cache TTL in seconds'),
|
|
121
100
|
|
|
122
|
-
maxSize: z.coerce
|
|
123
|
-
.number()
|
|
124
|
-
.min(1)
|
|
125
|
-
.default(1000)
|
|
126
|
-
.describe("Maximum cache entries"),
|
|
101
|
+
maxSize: z.coerce.number().min(1).default(1000).describe('Maximum cache entries'),
|
|
127
102
|
|
|
128
|
-
strategy: z
|
|
129
|
-
.enum(["lru", "lfu", "fifo"])
|
|
130
|
-
.default("lru")
|
|
131
|
-
.describe("Cache eviction strategy"),
|
|
103
|
+
strategy: z.enum(['lru', 'lfu', 'fifo']).default('lru').describe('Cache eviction strategy'),
|
|
132
104
|
}),
|
|
133
105
|
|
|
134
106
|
rateLimit: z.object({
|
|
135
|
-
enabled: z.coerce
|
|
136
|
-
.boolean()
|
|
137
|
-
.default(true)
|
|
138
|
-
.describe("Enable rate limiting by default"),
|
|
107
|
+
enabled: z.coerce.boolean().default(true).describe('Enable rate limiting by default'),
|
|
139
108
|
|
|
140
|
-
defaultRequests: z.coerce
|
|
141
|
-
.number()
|
|
142
|
-
.min(1)
|
|
143
|
-
.default(100)
|
|
144
|
-
.describe("Default requests per window"),
|
|
109
|
+
defaultRequests: z.coerce.number().min(1).default(100).describe('Default requests per window'),
|
|
145
110
|
|
|
146
111
|
defaultWindow: z.coerce
|
|
147
112
|
.number()
|
|
148
113
|
.min(1000)
|
|
149
114
|
.default(60000)
|
|
150
|
-
.describe(
|
|
115
|
+
.describe('Default rate limit window in milliseconds'),
|
|
151
116
|
|
|
152
117
|
skipSuccessfulRequests: z.coerce
|
|
153
118
|
.boolean()
|
|
154
119
|
.default(false)
|
|
155
|
-
.describe(
|
|
120
|
+
.describe('Skip successful requests in rate limit counting'),
|
|
156
121
|
|
|
157
122
|
skipFailedRequests: z.coerce
|
|
158
123
|
.boolean()
|
|
159
124
|
.default(false)
|
|
160
|
-
.describe(
|
|
125
|
+
.describe('Skip failed requests in rate limit counting'),
|
|
161
126
|
}),
|
|
162
127
|
|
|
163
128
|
validation: z.object({
|
|
164
|
-
enabled: z.coerce
|
|
165
|
-
.boolean()
|
|
166
|
-
.default(true)
|
|
167
|
-
.describe("Enable validation by default"),
|
|
129
|
+
enabled: z.coerce.boolean().default(true).describe('Enable validation by default'),
|
|
168
130
|
|
|
169
131
|
stripUnknown: z.coerce
|
|
170
132
|
.boolean()
|
|
171
133
|
.default(true)
|
|
172
|
-
.describe(
|
|
134
|
+
.describe('Strip unknown properties from validated data'),
|
|
173
135
|
|
|
174
|
-
abortEarly: z.coerce
|
|
175
|
-
.boolean()
|
|
176
|
-
.default(false)
|
|
177
|
-
.describe("Stop validation on first error"),
|
|
136
|
+
abortEarly: z.coerce.boolean().default(false).describe('Stop validation on first error'),
|
|
178
137
|
}),
|
|
179
138
|
});
|
|
180
139
|
|
|
181
140
|
// Logging Configuration Schema
|
|
182
141
|
const LoggingConfigSchema = z.object({
|
|
183
142
|
level: z
|
|
184
|
-
.enum([
|
|
185
|
-
.default(
|
|
186
|
-
.describe(
|
|
187
|
-
|
|
188
|
-
format: z
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
.default(true)
|
|
196
|
-
.describe("Enable colored log output"),
|
|
197
|
-
|
|
198
|
-
enableTimestamp: z.coerce
|
|
199
|
-
.boolean()
|
|
200
|
-
.default(true)
|
|
201
|
-
.describe("Include timestamp in logs"),
|
|
202
|
-
|
|
203
|
-
enableContext: z.coerce
|
|
204
|
-
.boolean()
|
|
205
|
-
.default(true)
|
|
206
|
-
.describe("Include context information in logs"),
|
|
143
|
+
.enum(['debug', 'info', 'warn', 'error', 'fatal'])
|
|
144
|
+
.default('info')
|
|
145
|
+
.describe('Minimum log level'),
|
|
146
|
+
|
|
147
|
+
format: z.enum(['pretty', 'json', 'compact']).default('pretty').describe('Log output format'),
|
|
148
|
+
|
|
149
|
+
enableColors: z.coerce.boolean().default(true).describe('Enable colored log output'),
|
|
150
|
+
|
|
151
|
+
enableTimestamp: z.coerce.boolean().default(true).describe('Include timestamp in logs'),
|
|
152
|
+
|
|
153
|
+
enableContext: z.coerce.boolean().default(true).describe('Include context information in logs'),
|
|
207
154
|
|
|
208
155
|
outputs: z.object({
|
|
209
156
|
console: z.coerce.boolean().default(true),
|
|
210
157
|
file: z.object({
|
|
211
158
|
enabled: z.coerce.boolean().default(false),
|
|
212
|
-
path: z.string().default(
|
|
213
|
-
maxSize: z.string().default(
|
|
159
|
+
path: z.string().default('./logs/moro.log'),
|
|
160
|
+
maxSize: z.string().default('10MB'),
|
|
214
161
|
maxFiles: z.coerce.number().default(5),
|
|
215
162
|
}),
|
|
216
163
|
webhook: z.object({
|
|
@@ -225,15 +172,9 @@ const LoggingConfigSchema = z.object({
|
|
|
225
172
|
const SecurityConfigSchema = z.object({
|
|
226
173
|
cors: z.object({
|
|
227
174
|
enabled: z.coerce.boolean().default(true),
|
|
228
|
-
origin: z
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
methods: z
|
|
232
|
-
.array(z.string())
|
|
233
|
-
.default(["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"]),
|
|
234
|
-
allowedHeaders: z
|
|
235
|
-
.array(z.string())
|
|
236
|
-
.default(["Content-Type", "Authorization"]),
|
|
175
|
+
origin: z.union([z.string(), z.array(z.string()), z.boolean()]).default('*'),
|
|
176
|
+
methods: z.array(z.string()).default(['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS']),
|
|
177
|
+
allowedHeaders: z.array(z.string()).default(['Content-Type', 'Authorization']),
|
|
237
178
|
credentials: z.coerce.boolean().default(false),
|
|
238
179
|
}),
|
|
239
180
|
|
|
@@ -261,7 +202,7 @@ const ExternalServicesConfigSchema = z.object({
|
|
|
261
202
|
secretKey: z.string().optional(),
|
|
262
203
|
publishableKey: z.string().optional(),
|
|
263
204
|
webhookSecret: z.string().optional(),
|
|
264
|
-
apiVersion: z.string().default(
|
|
205
|
+
apiVersion: z.string().default('2023-10-16'),
|
|
265
206
|
})
|
|
266
207
|
.optional(),
|
|
267
208
|
|
|
@@ -270,7 +211,7 @@ const ExternalServicesConfigSchema = z.object({
|
|
|
270
211
|
clientId: z.string().optional(),
|
|
271
212
|
clientSecret: z.string().optional(),
|
|
272
213
|
webhookId: z.string().optional(),
|
|
273
|
-
environment: z.enum([
|
|
214
|
+
environment: z.enum(['sandbox', 'production']).default('sandbox'),
|
|
274
215
|
})
|
|
275
216
|
.optional(),
|
|
276
217
|
|
|
@@ -321,16 +262,12 @@ export const ConfigSchema = z.object({
|
|
|
321
262
|
// Inferred TypeScript types
|
|
322
263
|
export type AppConfig = z.infer<typeof ConfigSchema>;
|
|
323
264
|
export type ServerConfig = z.infer<typeof ServerConfigSchema>;
|
|
324
|
-
export type ServiceDiscoveryConfig = z.infer<
|
|
325
|
-
typeof ServiceDiscoveryConfigSchema
|
|
326
|
-
>;
|
|
265
|
+
export type ServiceDiscoveryConfig = z.infer<typeof ServiceDiscoveryConfigSchema>;
|
|
327
266
|
export type DatabaseConfig = z.infer<typeof DatabaseConfigSchema>;
|
|
328
267
|
export type ModuleDefaultsConfig = z.infer<typeof ModuleDefaultsConfigSchema>;
|
|
329
268
|
export type LoggingConfig = z.infer<typeof LoggingConfigSchema>;
|
|
330
269
|
export type SecurityConfig = z.infer<typeof SecurityConfigSchema>;
|
|
331
|
-
export type ExternalServicesConfig = z.infer<
|
|
332
|
-
typeof ExternalServicesConfigSchema
|
|
333
|
-
>;
|
|
270
|
+
export type ExternalServicesConfig = z.infer<typeof ExternalServicesConfigSchema>;
|
|
334
271
|
export type PerformanceConfig = z.infer<typeof PerformanceConfigSchema>;
|
|
335
272
|
|
|
336
273
|
// Export individual schemas for module-specific configuration
|
package/src/core/config/utils.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// Configuration Utilities for Modules and Environment Handling
|
|
2
|
-
import { z } from
|
|
3
|
-
import { AppConfig } from
|
|
4
|
-
import { createFrameworkLogger } from
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { AppConfig } from './schema';
|
|
4
|
+
import { createFrameworkLogger } from '../logger';
|
|
5
5
|
|
|
6
|
-
const logger = createFrameworkLogger(
|
|
6
|
+
const logger = createFrameworkLogger('ConfigUtils');
|
|
7
7
|
|
|
8
8
|
// Global configuration store
|
|
9
9
|
let appConfig: AppConfig | null = null;
|
|
@@ -13,7 +13,7 @@ let appConfig: AppConfig | null = null;
|
|
|
13
13
|
*/
|
|
14
14
|
export function setConfig(config: AppConfig): void {
|
|
15
15
|
appConfig = config;
|
|
16
|
-
logger.debug(
|
|
16
|
+
logger.debug('Global configuration updated');
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
/**
|
|
@@ -21,7 +21,7 @@ export function setConfig(config: AppConfig): void {
|
|
|
21
21
|
*/
|
|
22
22
|
export function getConfig(): AppConfig {
|
|
23
23
|
if (!appConfig) {
|
|
24
|
-
throw new Error(
|
|
24
|
+
throw new Error('Configuration not initialized. Call loadConfig() first.');
|
|
25
25
|
}
|
|
26
26
|
return appConfig;
|
|
27
27
|
}
|
|
@@ -32,7 +32,7 @@ export function getConfig(): AppConfig {
|
|
|
32
32
|
export function createModuleConfig<T>(
|
|
33
33
|
schema: z.ZodSchema<T>,
|
|
34
34
|
defaultConfig: Partial<T>,
|
|
35
|
-
envPrefix?: string
|
|
35
|
+
envPrefix?: string
|
|
36
36
|
): T {
|
|
37
37
|
const globalConfig = getConfig();
|
|
38
38
|
|
|
@@ -41,7 +41,7 @@ export function createModuleConfig<T>(
|
|
|
41
41
|
|
|
42
42
|
if (envPrefix) {
|
|
43
43
|
// Extract environment variables with the given prefix
|
|
44
|
-
Object.keys(process.env).forEach(
|
|
44
|
+
Object.keys(process.env).forEach(key => {
|
|
45
45
|
if (key.startsWith(envPrefix)) {
|
|
46
46
|
const configKey = key
|
|
47
47
|
.substring(envPrefix.length)
|
|
@@ -62,10 +62,7 @@ export function createModuleConfig<T>(
|
|
|
62
62
|
try {
|
|
63
63
|
return schema.parse(mergedConfig);
|
|
64
64
|
} catch (error) {
|
|
65
|
-
logger.error(
|
|
66
|
-
`Module configuration validation failed for prefix ${envPrefix}:`,
|
|
67
|
-
String(error),
|
|
68
|
-
);
|
|
65
|
+
logger.error(`Module configuration validation failed for prefix ${envPrefix}:`, String(error));
|
|
69
66
|
throw error;
|
|
70
67
|
}
|
|
71
68
|
}
|
|
@@ -73,11 +70,7 @@ export function createModuleConfig<T>(
|
|
|
73
70
|
/**
|
|
74
71
|
* Get environment variable with type conversion
|
|
75
72
|
*/
|
|
76
|
-
export function getEnvVar<T>(
|
|
77
|
-
key: string,
|
|
78
|
-
defaultValue: T,
|
|
79
|
-
converter?: (value: string) => T,
|
|
80
|
-
): T {
|
|
73
|
+
export function getEnvVar<T>(key: string, defaultValue: T, converter?: (value: string) => T): T {
|
|
81
74
|
const value = process.env[key];
|
|
82
75
|
|
|
83
76
|
if (value === undefined) {
|
|
@@ -88,20 +81,17 @@ export function getEnvVar<T>(
|
|
|
88
81
|
try {
|
|
89
82
|
return converter(value);
|
|
90
83
|
} catch (error) {
|
|
91
|
-
logger.warn(
|
|
92
|
-
`Failed to convert environment variable ${key}:`,
|
|
93
|
-
String(error),
|
|
94
|
-
);
|
|
84
|
+
logger.warn(`Failed to convert environment variable ${key}:`, String(error));
|
|
95
85
|
return defaultValue;
|
|
96
86
|
}
|
|
97
87
|
}
|
|
98
88
|
|
|
99
89
|
// Default type conversions
|
|
100
|
-
if (typeof defaultValue ===
|
|
101
|
-
return (value.toLowerCase() ===
|
|
90
|
+
if (typeof defaultValue === 'boolean') {
|
|
91
|
+
return (value.toLowerCase() === 'true') as T;
|
|
102
92
|
}
|
|
103
93
|
|
|
104
|
-
if (typeof defaultValue ===
|
|
94
|
+
if (typeof defaultValue === 'number') {
|
|
105
95
|
const num = Number(value);
|
|
106
96
|
return (isNaN(num) ? defaultValue : num) as T;
|
|
107
97
|
}
|
|
@@ -112,10 +102,7 @@ export function getEnvVar<T>(
|
|
|
112
102
|
/**
|
|
113
103
|
* Parse comma-separated environment variable as array
|
|
114
104
|
*/
|
|
115
|
-
export function getEnvArray(
|
|
116
|
-
key: string,
|
|
117
|
-
defaultValue: string[] = [],
|
|
118
|
-
): string[] {
|
|
105
|
+
export function getEnvArray(key: string, defaultValue: string[] = []): string[] {
|
|
119
106
|
const value = process.env[key];
|
|
120
107
|
|
|
121
108
|
if (!value) {
|
|
@@ -123,8 +110,8 @@ export function getEnvArray(
|
|
|
123
110
|
}
|
|
124
111
|
|
|
125
112
|
return value
|
|
126
|
-
.split(
|
|
127
|
-
.map(
|
|
113
|
+
.split(',')
|
|
114
|
+
.map(item => item.trim())
|
|
128
115
|
.filter(Boolean);
|
|
129
116
|
}
|
|
130
117
|
|
|
@@ -141,10 +128,7 @@ export function getEnvJson<T>(key: string, defaultValue: T): T {
|
|
|
141
128
|
try {
|
|
142
129
|
return JSON.parse(value);
|
|
143
130
|
} catch (error) {
|
|
144
|
-
logger.warn(
|
|
145
|
-
`Failed to parse JSON environment variable ${key}:`,
|
|
146
|
-
String(error),
|
|
147
|
-
);
|
|
131
|
+
logger.warn(`Failed to parse JSON environment variable ${key}:`, String(error));
|
|
148
132
|
return defaultValue;
|
|
149
133
|
}
|
|
150
134
|
}
|
|
@@ -155,16 +139,14 @@ export function getEnvJson<T>(key: string, defaultValue: T): T {
|
|
|
155
139
|
export function requireEnvVars(...keys: string[]): void {
|
|
156
140
|
const missing: string[] = [];
|
|
157
141
|
|
|
158
|
-
keys.forEach(
|
|
142
|
+
keys.forEach(key => {
|
|
159
143
|
if (!process.env[key]) {
|
|
160
144
|
missing.push(key);
|
|
161
145
|
}
|
|
162
146
|
});
|
|
163
147
|
|
|
164
148
|
if (missing.length > 0) {
|
|
165
|
-
throw new Error(
|
|
166
|
-
`Missing required environment variables: ${missing.join(", ")}`,
|
|
167
|
-
);
|
|
149
|
+
throw new Error(`Missing required environment variables: ${missing.join(', ')}`);
|
|
168
150
|
}
|
|
169
151
|
}
|
|
170
152
|
|
|
@@ -181,7 +163,7 @@ export function envVar(prefix: string, name: string): string {
|
|
|
181
163
|
export function getConfigValue(path: string): any {
|
|
182
164
|
const config = getConfig();
|
|
183
165
|
|
|
184
|
-
return path.split(
|
|
166
|
+
return path.split('.').reduce((obj, key) => {
|
|
185
167
|
return obj && obj[key] !== undefined ? obj[key] : undefined;
|
|
186
168
|
}, config as any);
|
|
187
169
|
}
|
|
@@ -191,9 +173,9 @@ export function getConfigValue(path: string): any {
|
|
|
191
173
|
*/
|
|
192
174
|
export function isDevelopment(): boolean {
|
|
193
175
|
try {
|
|
194
|
-
return getConfig().server.environment ===
|
|
176
|
+
return getConfig().server.environment === 'development';
|
|
195
177
|
} catch {
|
|
196
|
-
return process.env.NODE_ENV ===
|
|
178
|
+
return process.env.NODE_ENV === 'development';
|
|
197
179
|
}
|
|
198
180
|
}
|
|
199
181
|
|
|
@@ -202,9 +184,9 @@ export function isDevelopment(): boolean {
|
|
|
202
184
|
*/
|
|
203
185
|
export function isProduction(): boolean {
|
|
204
186
|
try {
|
|
205
|
-
return getConfig().server.environment ===
|
|
187
|
+
return getConfig().server.environment === 'production';
|
|
206
188
|
} catch {
|
|
207
|
-
return process.env.NODE_ENV ===
|
|
189
|
+
return process.env.NODE_ENV === 'production';
|
|
208
190
|
}
|
|
209
191
|
}
|
|
210
192
|
|
|
@@ -213,8 +195,8 @@ export function isProduction(): boolean {
|
|
|
213
195
|
*/
|
|
214
196
|
export function isStaging(): boolean {
|
|
215
197
|
try {
|
|
216
|
-
return getConfig().server.environment ===
|
|
198
|
+
return getConfig().server.environment === 'staging';
|
|
217
199
|
} catch {
|
|
218
|
-
return process.env.NODE_ENV ===
|
|
200
|
+
return process.env.NODE_ENV === 'staging';
|
|
219
201
|
}
|
|
220
202
|
}
|