@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
package/src/core/http/index.ts
CHANGED
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
// HTTP System - Centralized Exports
|
|
2
|
-
export { MoroHttpServer, middleware } from
|
|
3
|
-
export { Router } from
|
|
2
|
+
export { MoroHttpServer, middleware } from './http-server';
|
|
3
|
+
export { Router } from './router';
|
|
4
4
|
|
|
5
5
|
// Type exports
|
|
6
|
-
export type {
|
|
7
|
-
HttpRequest,
|
|
8
|
-
HttpResponse,
|
|
9
|
-
HttpHandler,
|
|
10
|
-
Middleware,
|
|
11
|
-
} from "../../types/http";
|
|
6
|
+
export type { HttpRequest, HttpResponse, HttpHandler, Middleware } from '../../types/http';
|
package/src/core/http/router.ts
CHANGED
|
@@ -5,38 +5,34 @@ import {
|
|
|
5
5
|
HttpHandler,
|
|
6
6
|
Middleware,
|
|
7
7
|
RouteDefinition,
|
|
8
|
-
} from
|
|
9
|
-
import { createFrameworkLogger } from
|
|
8
|
+
} from '../../types/http';
|
|
9
|
+
import { createFrameworkLogger } from '../logger';
|
|
10
10
|
|
|
11
11
|
export class Router {
|
|
12
12
|
private routes: RouteDefinition[] = [];
|
|
13
|
-
private logger = createFrameworkLogger(
|
|
13
|
+
private logger = createFrameworkLogger('Router');
|
|
14
14
|
|
|
15
15
|
get(path: string, ...handlers: (Middleware | HttpHandler)[]): void {
|
|
16
|
-
this.addRoute(
|
|
16
|
+
this.addRoute('GET', path, handlers);
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
post(path: string, ...handlers: (Middleware | HttpHandler)[]): void {
|
|
20
|
-
this.addRoute(
|
|
20
|
+
this.addRoute('POST', path, handlers);
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
put(path: string, ...handlers: (Middleware | HttpHandler)[]): void {
|
|
24
|
-
this.addRoute(
|
|
24
|
+
this.addRoute('PUT', path, handlers);
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
delete(path: string, ...handlers: (Middleware | HttpHandler)[]): void {
|
|
28
|
-
this.addRoute(
|
|
28
|
+
this.addRoute('DELETE', path, handlers);
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
patch(path: string, ...handlers: (Middleware | HttpHandler)[]): void {
|
|
32
|
-
this.addRoute(
|
|
32
|
+
this.addRoute('PATCH', path, handlers);
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
private addRoute(
|
|
36
|
-
method: string,
|
|
37
|
-
path: string,
|
|
38
|
-
handlers: (Middleware | HttpHandler)[],
|
|
39
|
-
): void {
|
|
35
|
+
private addRoute(method: string, path: string, handlers: (Middleware | HttpHandler)[]): void {
|
|
40
36
|
const { pattern, paramNames } = this.pathToRegex(path);
|
|
41
37
|
const handler = handlers.pop() as HttpHandler;
|
|
42
38
|
const middleware = handlers as Middleware[];
|
|
@@ -58,9 +54,9 @@ export class Router {
|
|
|
58
54
|
const regexPattern = path
|
|
59
55
|
.replace(/\/:([^/]+)/g, (match, paramName) => {
|
|
60
56
|
paramNames.push(paramName);
|
|
61
|
-
return
|
|
57
|
+
return '/([^/]+)';
|
|
62
58
|
})
|
|
63
|
-
.replace(/\//g,
|
|
59
|
+
.replace(/\//g, '\\/');
|
|
64
60
|
|
|
65
61
|
return {
|
|
66
62
|
pattern: new RegExp(`^${regexPattern}$`),
|
|
@@ -68,32 +64,24 @@ export class Router {
|
|
|
68
64
|
};
|
|
69
65
|
}
|
|
70
66
|
|
|
71
|
-
async handle(
|
|
72
|
-
req:
|
|
73
|
-
res: HttpResponse,
|
|
74
|
-
basePath: string = "",
|
|
75
|
-
): Promise<boolean> {
|
|
76
|
-
let path = req.path.startsWith(basePath)
|
|
77
|
-
? req.path.substring(basePath.length)
|
|
78
|
-
: req.path;
|
|
67
|
+
async handle(req: HttpRequest, res: HttpResponse, basePath: string = ''): Promise<boolean> {
|
|
68
|
+
let path = req.path.startsWith(basePath) ? req.path.substring(basePath.length) : req.path;
|
|
79
69
|
|
|
80
70
|
// If removing basePath results in empty string, default to '/'
|
|
81
|
-
if (path ===
|
|
82
|
-
path =
|
|
71
|
+
if (path === '' || path === undefined) {
|
|
72
|
+
path = '/';
|
|
83
73
|
}
|
|
84
74
|
|
|
85
75
|
this.logger.debug(
|
|
86
76
|
`Router processing: originalPath="${req.path}", basePath="${basePath}", processedPath="${path}"`,
|
|
87
|
-
|
|
77
|
+
'Processing'
|
|
88
78
|
);
|
|
89
79
|
|
|
90
|
-
const route = this.routes.find(
|
|
91
|
-
(r) => r.method === req.method && r.pattern.test(path),
|
|
92
|
-
);
|
|
80
|
+
const route = this.routes.find(r => r.method === req.method && r.pattern.test(path));
|
|
93
81
|
|
|
94
82
|
this.logger.debug(
|
|
95
|
-
`Found route: ${!!route}${route ? ` ${route.method} ${route.path}` :
|
|
96
|
-
|
|
83
|
+
`Found route: ${!!route}${route ? ` ${route.method} ${route.path}` : ' none'}`,
|
|
84
|
+
'RouteMatch'
|
|
97
85
|
);
|
|
98
86
|
|
|
99
87
|
if (!route) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Advanced Logger Filters
|
|
2
|
-
import { LogEntry, LogFilter } from
|
|
2
|
+
import { LogEntry, LogFilter } from '../../types/logger';
|
|
3
3
|
|
|
4
4
|
// Level-based filter
|
|
5
5
|
export const levelFilter = (minLevel: string): LogFilter => ({
|
|
@@ -12,10 +12,10 @@ export const levelFilter = (minLevel: string): LogFilter => ({
|
|
|
12
12
|
|
|
13
13
|
// Context-based filter
|
|
14
14
|
export const contextFilter = (allowedContexts: string[]): LogFilter => ({
|
|
15
|
-
name:
|
|
15
|
+
name: 'context-filter',
|
|
16
16
|
filter: (entry: LogEntry) => {
|
|
17
17
|
if (!entry.context) return true;
|
|
18
|
-
return allowedContexts.some(
|
|
18
|
+
return allowedContexts.some(ctx => entry.context!.includes(ctx));
|
|
19
19
|
},
|
|
20
20
|
});
|
|
21
21
|
|
|
@@ -24,7 +24,7 @@ export const rateLimitFilter = (maxPerSecond: number): LogFilter => {
|
|
|
24
24
|
const timestamps: number[] = [];
|
|
25
25
|
|
|
26
26
|
return {
|
|
27
|
-
name:
|
|
27
|
+
name: 'rate-limit',
|
|
28
28
|
filter: (entry: LogEntry) => {
|
|
29
29
|
const now = Date.now();
|
|
30
30
|
const oneSecondAgo = now - 1000;
|
|
@@ -47,16 +47,16 @@ export const rateLimitFilter = (maxPerSecond: number): LogFilter => {
|
|
|
47
47
|
|
|
48
48
|
// Sensitive data filter
|
|
49
49
|
export const sanitizeFilter = (
|
|
50
|
-
sensitiveKeys: string[] = [
|
|
50
|
+
sensitiveKeys: string[] = ['password', 'token', 'key', 'secret']
|
|
51
51
|
): LogFilter => ({
|
|
52
|
-
name:
|
|
52
|
+
name: 'sanitize',
|
|
53
53
|
filter: (entry: LogEntry) => {
|
|
54
54
|
if (entry.metadata) {
|
|
55
55
|
const sanitized = { ...entry.metadata };
|
|
56
56
|
|
|
57
57
|
for (const key of sensitiveKeys) {
|
|
58
58
|
if (sanitized[key]) {
|
|
59
|
-
sanitized[key] =
|
|
59
|
+
sanitized[key] = '[REDACTED]';
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
|
|
@@ -66,8 +66,8 @@ export const sanitizeFilter = (
|
|
|
66
66
|
// Also sanitize message content
|
|
67
67
|
let sanitizedMessage = entry.message;
|
|
68
68
|
for (const key of sensitiveKeys) {
|
|
69
|
-
const regex = new RegExp(`(${key}["\\s]*[:=]["\\s]*)([^"\\s]+)`,
|
|
70
|
-
sanitizedMessage = sanitizedMessage.replace(regex,
|
|
69
|
+
const regex = new RegExp(`(${key}["\\s]*[:=]["\\s]*)([^"\\s]+)`, 'gi');
|
|
70
|
+
sanitizedMessage = sanitizedMessage.replace(regex, '$1[REDACTED]');
|
|
71
71
|
}
|
|
72
72
|
entry.message = sanitizedMessage;
|
|
73
73
|
|
|
@@ -77,7 +77,7 @@ export const sanitizeFilter = (
|
|
|
77
77
|
|
|
78
78
|
// Performance filter - only log slow operations
|
|
79
79
|
export const performanceFilter = (minDuration: number): LogFilter => ({
|
|
80
|
-
name:
|
|
80
|
+
name: 'performance',
|
|
81
81
|
filter: (entry: LogEntry) => {
|
|
82
82
|
if (!entry.performance?.duration) return true;
|
|
83
83
|
return entry.performance.duration >= minDuration;
|
|
@@ -87,16 +87,16 @@ export const performanceFilter = (minDuration: number): LogFilter => ({
|
|
|
87
87
|
// Error aggregation filter - prevent spam
|
|
88
88
|
export const errorAggregationFilter = (
|
|
89
89
|
maxSameErrors: number = 5,
|
|
90
|
-
timeWindow: number = 60000
|
|
90
|
+
timeWindow: number = 60000
|
|
91
91
|
): LogFilter => {
|
|
92
92
|
const errorCounts = new Map<string, { count: number; firstSeen: number }>();
|
|
93
93
|
|
|
94
94
|
return {
|
|
95
|
-
name:
|
|
95
|
+
name: 'error-aggregation',
|
|
96
96
|
filter: (entry: LogEntry) => {
|
|
97
|
-
if (entry.level !==
|
|
97
|
+
if (entry.level !== 'error' && entry.level !== 'fatal') return true;
|
|
98
98
|
|
|
99
|
-
const errorKey = `${entry.message}:${entry.context ||
|
|
99
|
+
const errorKey = `${entry.message}:${entry.context || ''}`;
|
|
100
100
|
const now = Date.now();
|
|
101
101
|
const existing = errorCounts.get(errorKey);
|
|
102
102
|
|
|
@@ -123,16 +123,13 @@ export const errorAggregationFilter = (
|
|
|
123
123
|
};
|
|
124
124
|
|
|
125
125
|
// Development vs Production filter
|
|
126
|
-
export const environmentFilter = (
|
|
127
|
-
environment: "development" | "production",
|
|
128
|
-
): LogFilter => ({
|
|
126
|
+
export const environmentFilter = (environment: 'development' | 'production'): LogFilter => ({
|
|
129
127
|
name: `env-${environment}`,
|
|
130
128
|
filter: (entry: LogEntry) => {
|
|
131
|
-
if (environment ===
|
|
129
|
+
if (environment === 'production') {
|
|
132
130
|
// In production, filter out debug logs and sensitive development info
|
|
133
|
-
if (entry.level ===
|
|
134
|
-
if (entry.context?.includes(
|
|
135
|
-
return false;
|
|
131
|
+
if (entry.level === 'debug') return false;
|
|
132
|
+
if (entry.context?.includes('dev') || entry.context?.includes('test')) return false;
|
|
136
133
|
}
|
|
137
134
|
return true;
|
|
138
135
|
},
|
|
@@ -140,7 +137,7 @@ export const environmentFilter = (
|
|
|
140
137
|
|
|
141
138
|
// Module-specific filter
|
|
142
139
|
export const moduleFilter = (allowedModules: string[]): LogFilter => ({
|
|
143
|
-
name:
|
|
140
|
+
name: 'module-filter',
|
|
144
141
|
filter: (entry: LogEntry) => {
|
|
145
142
|
if (!entry.moduleId) return true;
|
|
146
143
|
return allowedModules.includes(entry.moduleId);
|
package/src/core/logger/index.ts
CHANGED
|
@@ -5,8 +5,8 @@ export {
|
|
|
5
5
|
createFrameworkLogger,
|
|
6
6
|
configureGlobalLogger,
|
|
7
7
|
applyLoggingConfiguration,
|
|
8
|
-
} from
|
|
9
|
-
export * from
|
|
8
|
+
} from './logger';
|
|
9
|
+
export * from './filters';
|
|
10
10
|
|
|
11
11
|
export type {
|
|
12
12
|
LogLevel,
|
|
@@ -17,4 +17,4 @@ export type {
|
|
|
17
17
|
LogFilter,
|
|
18
18
|
LogMetrics,
|
|
19
19
|
ColorScheme,
|
|
20
|
-
} from
|
|
20
|
+
} from '../../types/logger';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Moro Logger - Beautiful, Fast, Feature-Rich
|
|
2
|
-
import { performance } from
|
|
2
|
+
import { performance } from 'perf_hooks';
|
|
3
3
|
import {
|
|
4
4
|
LogLevel,
|
|
5
5
|
LogEntry,
|
|
@@ -9,10 +9,10 @@ import {
|
|
|
9
9
|
LogFilter,
|
|
10
10
|
LogMetrics,
|
|
11
11
|
ColorScheme,
|
|
12
|
-
} from
|
|
12
|
+
} from '../../types/logger';
|
|
13
13
|
|
|
14
14
|
export class MoroLogger implements Logger {
|
|
15
|
-
private level: LogLevel =
|
|
15
|
+
private level: LogLevel = 'info';
|
|
16
16
|
private options: LoggerOptions;
|
|
17
17
|
private outputs: Map<string, LogOutput> = new Map();
|
|
18
18
|
private filters: Map<string, LogFilter> = new Map();
|
|
@@ -39,108 +39,84 @@ export class MoroLogger implements Logger {
|
|
|
39
39
|
};
|
|
40
40
|
|
|
41
41
|
private static readonly COLORS: ColorScheme = {
|
|
42
|
-
debug:
|
|
43
|
-
info:
|
|
44
|
-
warn:
|
|
45
|
-
error:
|
|
46
|
-
fatal:
|
|
47
|
-
timestamp:
|
|
48
|
-
context:
|
|
49
|
-
metadata:
|
|
50
|
-
performance:
|
|
42
|
+
debug: '\x1b[36m', // Cyan
|
|
43
|
+
info: '\x1b[32m', // Green
|
|
44
|
+
warn: '\x1b[33m', // Yellow
|
|
45
|
+
error: '\x1b[31m', // Red
|
|
46
|
+
fatal: '\x1b[35m', // Magenta
|
|
47
|
+
timestamp: '\x1b[90m', // Gray
|
|
48
|
+
context: '\x1b[34m', // Blue
|
|
49
|
+
metadata: '\x1b[37m', // White
|
|
50
|
+
performance: '\x1b[36m', // Cyan
|
|
51
51
|
};
|
|
52
52
|
|
|
53
|
-
private static readonly RESET =
|
|
54
|
-
private static readonly BOLD =
|
|
53
|
+
private static readonly RESET = '\x1b[0m';
|
|
54
|
+
private static readonly BOLD = '\x1b[1m';
|
|
55
55
|
|
|
56
56
|
constructor(options: LoggerOptions = {}) {
|
|
57
57
|
this.options = {
|
|
58
|
-
level:
|
|
58
|
+
level: 'info',
|
|
59
59
|
enableColors: true,
|
|
60
60
|
enableTimestamp: true,
|
|
61
61
|
enableContext: true,
|
|
62
62
|
enableMetadata: true,
|
|
63
63
|
enablePerformance: true,
|
|
64
|
-
format:
|
|
64
|
+
format: 'pretty',
|
|
65
65
|
outputs: [],
|
|
66
66
|
filters: [],
|
|
67
67
|
maxEntries: 1000,
|
|
68
68
|
...options,
|
|
69
69
|
};
|
|
70
70
|
|
|
71
|
-
this.level = this.options.level ||
|
|
71
|
+
this.level = this.options.level || 'info';
|
|
72
72
|
|
|
73
73
|
// Add default console output
|
|
74
74
|
this.addOutput({
|
|
75
|
-
name:
|
|
75
|
+
name: 'console',
|
|
76
76
|
write: this.writeToConsole.bind(this),
|
|
77
77
|
format: this.options.format,
|
|
78
78
|
});
|
|
79
79
|
|
|
80
80
|
// Add custom outputs
|
|
81
|
-
this.options.outputs?.forEach(
|
|
82
|
-
this.options.filters?.forEach(
|
|
81
|
+
this.options.outputs?.forEach(output => this.addOutput(output));
|
|
82
|
+
this.options.filters?.forEach(filter => this.addFilter(filter));
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
-
debug(
|
|
86
|
-
message
|
|
87
|
-
context?: string,
|
|
88
|
-
metadata?: Record<string, any>,
|
|
89
|
-
): void {
|
|
90
|
-
this.log("debug", message, context, metadata);
|
|
85
|
+
debug(message: string, context?: string, metadata?: Record<string, any>): void {
|
|
86
|
+
this.log('debug', message, context, metadata);
|
|
91
87
|
}
|
|
92
88
|
|
|
93
|
-
info(
|
|
94
|
-
message
|
|
95
|
-
context?: string,
|
|
96
|
-
metadata?: Record<string, any>,
|
|
97
|
-
): void {
|
|
98
|
-
this.log("info", message, context, metadata);
|
|
89
|
+
info(message: string, context?: string, metadata?: Record<string, any>): void {
|
|
90
|
+
this.log('info', message, context, metadata);
|
|
99
91
|
}
|
|
100
92
|
|
|
101
|
-
warn(
|
|
102
|
-
message
|
|
103
|
-
context?: string,
|
|
104
|
-
metadata?: Record<string, any>,
|
|
105
|
-
): void {
|
|
106
|
-
this.log("warn", message, context, metadata);
|
|
93
|
+
warn(message: string, context?: string, metadata?: Record<string, any>): void {
|
|
94
|
+
this.log('warn', message, context, metadata);
|
|
107
95
|
}
|
|
108
96
|
|
|
109
|
-
error(
|
|
110
|
-
message: string | Error,
|
|
111
|
-
context?: string,
|
|
112
|
-
metadata?: Record<string, any>,
|
|
113
|
-
): void {
|
|
97
|
+
error(message: string | Error, context?: string, metadata?: Record<string, any>): void {
|
|
114
98
|
const msg = message instanceof Error ? message.message : message;
|
|
115
99
|
const stack = message instanceof Error ? message.stack : undefined;
|
|
116
|
-
this.log(
|
|
100
|
+
this.log('error', msg, context, { ...metadata, stack });
|
|
117
101
|
}
|
|
118
102
|
|
|
119
|
-
fatal(
|
|
120
|
-
message: string | Error,
|
|
121
|
-
context?: string,
|
|
122
|
-
metadata?: Record<string, any>,
|
|
123
|
-
): void {
|
|
103
|
+
fatal(message: string | Error, context?: string, metadata?: Record<string, any>): void {
|
|
124
104
|
const msg = message instanceof Error ? message.message : message;
|
|
125
105
|
const stack = message instanceof Error ? message.stack : undefined;
|
|
126
|
-
this.log(
|
|
106
|
+
this.log('fatal', msg, context, { ...metadata, stack });
|
|
127
107
|
}
|
|
128
108
|
|
|
129
109
|
time(label: string): void {
|
|
130
110
|
this.timers.set(label, performance.now());
|
|
131
111
|
}
|
|
132
112
|
|
|
133
|
-
timeEnd(
|
|
134
|
-
label: string,
|
|
135
|
-
context?: string,
|
|
136
|
-
metadata?: Record<string, any>,
|
|
137
|
-
): void {
|
|
113
|
+
timeEnd(label: string, context?: string, metadata?: Record<string, any>): void {
|
|
138
114
|
const startTime = this.timers.get(label);
|
|
139
115
|
if (startTime !== undefined) {
|
|
140
116
|
const duration = performance.now() - startTime;
|
|
141
117
|
this.timers.delete(label);
|
|
142
118
|
|
|
143
|
-
this.log(
|
|
119
|
+
this.log('info', `Timer: ${label}`, context, {
|
|
144
120
|
...metadata,
|
|
145
121
|
performance: { duration: Math.round(duration * 100) / 100 },
|
|
146
122
|
});
|
|
@@ -149,9 +125,7 @@ export class MoroLogger implements Logger {
|
|
|
149
125
|
|
|
150
126
|
child(context: string, metadata?: Record<string, any>): Logger {
|
|
151
127
|
const childLogger = new MoroLogger(this.options);
|
|
152
|
-
childLogger.contextPrefix = this.contextPrefix
|
|
153
|
-
? `${this.contextPrefix}:${context}`
|
|
154
|
-
: context;
|
|
128
|
+
childLogger.contextPrefix = this.contextPrefix ? `${this.contextPrefix}:${context}` : context;
|
|
155
129
|
childLogger.contextMetadata = { ...this.contextMetadata, ...metadata };
|
|
156
130
|
childLogger.outputs = this.outputs;
|
|
157
131
|
childLogger.filters = this.filters;
|
|
@@ -187,12 +161,8 @@ export class MoroLogger implements Logger {
|
|
|
187
161
|
const now = Date.now();
|
|
188
162
|
const uptime = (now - this.startTime) / 1000; // seconds
|
|
189
163
|
const avgRate = uptime > 0 ? this.metrics.totalLogs / uptime : 0;
|
|
190
|
-
const errorCount =
|
|
191
|
-
|
|
192
|
-
const errorRate =
|
|
193
|
-
this.metrics.totalLogs > 0
|
|
194
|
-
? (errorCount / this.metrics.totalLogs) * 100
|
|
195
|
-
: 0;
|
|
164
|
+
const errorCount = this.metrics.logsByLevel.error + this.metrics.logsByLevel.fatal;
|
|
165
|
+
const errorRate = this.metrics.totalLogs > 0 ? (errorCount / this.metrics.totalLogs) * 100 : 0;
|
|
196
166
|
|
|
197
167
|
return {
|
|
198
168
|
...this.metrics,
|
|
@@ -218,7 +188,7 @@ export class MoroLogger implements Logger {
|
|
|
218
188
|
level: LogLevel,
|
|
219
189
|
message: string,
|
|
220
190
|
context?: string,
|
|
221
|
-
metadata?: Record<string, any
|
|
191
|
+
metadata?: Record<string, any>
|
|
222
192
|
): void {
|
|
223
193
|
// Check level threshold
|
|
224
194
|
if (MoroLogger.LEVELS[level] < MoroLogger.LEVELS[this.level]) {
|
|
@@ -261,14 +231,11 @@ export class MoroLogger implements Logger {
|
|
|
261
231
|
|
|
262
232
|
// Write to outputs
|
|
263
233
|
for (const output of this.outputs.values()) {
|
|
264
|
-
if (
|
|
265
|
-
!output.level ||
|
|
266
|
-
MoroLogger.LEVELS[level] >= MoroLogger.LEVELS[output.level]
|
|
267
|
-
) {
|
|
234
|
+
if (!output.level || MoroLogger.LEVELS[level] >= MoroLogger.LEVELS[output.level]) {
|
|
268
235
|
try {
|
|
269
236
|
output.write(entry);
|
|
270
237
|
} catch (error) {
|
|
271
|
-
console.error(
|
|
238
|
+
console.error('Logger output error:', error);
|
|
272
239
|
}
|
|
273
240
|
}
|
|
274
241
|
}
|
|
@@ -285,16 +252,16 @@ export class MoroLogger implements Logger {
|
|
|
285
252
|
}
|
|
286
253
|
|
|
287
254
|
private writeToConsole(entry: LogEntry): void {
|
|
288
|
-
const format = this.options.format ||
|
|
255
|
+
const format = this.options.format || 'pretty';
|
|
289
256
|
|
|
290
|
-
if (format ===
|
|
257
|
+
if (format === 'json') {
|
|
291
258
|
console.log(JSON.stringify(entry));
|
|
292
259
|
return;
|
|
293
260
|
}
|
|
294
261
|
|
|
295
|
-
if (format ===
|
|
262
|
+
if (format === 'compact') {
|
|
296
263
|
const level = entry.level.toUpperCase().padEnd(5);
|
|
297
|
-
const context = entry.context ? `[${entry.context}] ` :
|
|
264
|
+
const context = entry.context ? `[${entry.context}] ` : '';
|
|
298
265
|
console.log(`${level} ${context}${entry.message}`);
|
|
299
266
|
return;
|
|
300
267
|
}
|
|
@@ -309,26 +276,21 @@ export class MoroLogger implements Logger {
|
|
|
309
276
|
|
|
310
277
|
// Timestamp
|
|
311
278
|
if (this.options.enableTimestamp !== false) {
|
|
312
|
-
const timestamp = entry.timestamp
|
|
313
|
-
.toISOString()
|
|
314
|
-
.replace("T", " ")
|
|
315
|
-
.slice(0, 19);
|
|
279
|
+
const timestamp = entry.timestamp.toISOString().replace('T', ' ').slice(0, 19);
|
|
316
280
|
parts.push(
|
|
317
|
-
colors
|
|
318
|
-
? `${MoroLogger.COLORS.timestamp}${timestamp}${MoroLogger.RESET}`
|
|
319
|
-
: timestamp,
|
|
281
|
+
colors ? `${MoroLogger.COLORS.timestamp}${timestamp}${MoroLogger.RESET}` : timestamp
|
|
320
282
|
);
|
|
321
283
|
}
|
|
322
284
|
|
|
323
285
|
// Level with color (remove icons)
|
|
324
|
-
const levelColor = colors ? MoroLogger.COLORS[entry.level] :
|
|
325
|
-
const levelReset = colors ? MoroLogger.RESET :
|
|
286
|
+
const levelColor = colors ? MoroLogger.COLORS[entry.level] : '';
|
|
287
|
+
const levelReset = colors ? MoroLogger.RESET : '';
|
|
326
288
|
const levelText = entry.level.toUpperCase();
|
|
327
289
|
parts.push(`${levelColor}${MoroLogger.BOLD}${levelText}${levelReset}`);
|
|
328
290
|
|
|
329
291
|
// Context
|
|
330
292
|
if (entry.context && this.options.enableContext !== false) {
|
|
331
|
-
const contextColor = colors ? MoroLogger.COLORS.context :
|
|
293
|
+
const contextColor = colors ? MoroLogger.COLORS.context : '';
|
|
332
294
|
parts.push(`${contextColor}[${entry.context}]${levelReset}`);
|
|
333
295
|
}
|
|
334
296
|
|
|
@@ -337,7 +299,7 @@ export class MoroLogger implements Logger {
|
|
|
337
299
|
|
|
338
300
|
// Performance info
|
|
339
301
|
if (entry.performance && this.options.enablePerformance !== false) {
|
|
340
|
-
const perfColor = colors ? MoroLogger.COLORS.performance :
|
|
302
|
+
const perfColor = colors ? MoroLogger.COLORS.performance : '';
|
|
341
303
|
const perfParts: string[] = [];
|
|
342
304
|
|
|
343
305
|
if (entry.performance.duration !== undefined) {
|
|
@@ -348,7 +310,7 @@ export class MoroLogger implements Logger {
|
|
|
348
310
|
}
|
|
349
311
|
|
|
350
312
|
if (perfParts.length > 0) {
|
|
351
|
-
parts.push(`${perfColor}(${perfParts.join(
|
|
313
|
+
parts.push(`${perfColor}(${perfParts.join(', ')})${levelReset}`);
|
|
352
314
|
}
|
|
353
315
|
}
|
|
354
316
|
|
|
@@ -358,7 +320,7 @@ export class MoroLogger implements Logger {
|
|
|
358
320
|
Object.keys(entry.metadata).length > 0 &&
|
|
359
321
|
this.options.enableMetadata !== false
|
|
360
322
|
) {
|
|
361
|
-
const metaColor = colors ? MoroLogger.COLORS.metadata :
|
|
323
|
+
const metaColor = colors ? MoroLogger.COLORS.metadata : '';
|
|
362
324
|
const cleanMetadata = { ...entry.metadata };
|
|
363
325
|
delete cleanMetadata.stack; // Handle stack separately
|
|
364
326
|
|
|
@@ -368,14 +330,11 @@ export class MoroLogger implements Logger {
|
|
|
368
330
|
}
|
|
369
331
|
|
|
370
332
|
// Output main log line
|
|
371
|
-
console.log(parts.join(
|
|
333
|
+
console.log(parts.join(' '));
|
|
372
334
|
|
|
373
335
|
// Stack trace for errors
|
|
374
|
-
if (
|
|
375
|
-
|
|
376
|
-
(entry.level === "error" || entry.level === "fatal")
|
|
377
|
-
) {
|
|
378
|
-
const stackColor = colors ? MoroLogger.COLORS.error : "";
|
|
336
|
+
if (entry.metadata?.stack && (entry.level === 'error' || entry.level === 'fatal')) {
|
|
337
|
+
const stackColor = colors ? MoroLogger.COLORS.error : '';
|
|
379
338
|
console.log(`${stackColor}${entry.metadata.stack}${levelReset}`);
|
|
380
339
|
}
|
|
381
340
|
}
|
|
@@ -385,12 +344,12 @@ export class MoroLogger implements Logger {
|
|
|
385
344
|
const initialLogLevel =
|
|
386
345
|
process.env.LOG_LEVEL ||
|
|
387
346
|
process.env.MORO_LOG_LEVEL ||
|
|
388
|
-
(process.env.NODE_ENV ===
|
|
347
|
+
(process.env.NODE_ENV === 'production' ? 'warn' : 'debug');
|
|
389
348
|
|
|
390
349
|
export const logger = new MoroLogger({
|
|
391
350
|
level: initialLogLevel as LogLevel,
|
|
392
351
|
enableColors: !process.env.NO_COLOR,
|
|
393
|
-
format: (process.env.LOG_FORMAT as any) ||
|
|
352
|
+
format: (process.env.LOG_FORMAT as any) || 'pretty',
|
|
394
353
|
});
|
|
395
354
|
|
|
396
355
|
/**
|
|
@@ -410,7 +369,7 @@ export function configureGlobalLogger(options: Partial<LoggerOptions>): void {
|
|
|
410
369
|
*/
|
|
411
370
|
export function applyLoggingConfiguration(
|
|
412
371
|
configLogging?: any,
|
|
413
|
-
appOptions?: Partial<LoggerOptions> | boolean
|
|
372
|
+
appOptions?: Partial<LoggerOptions> | boolean
|
|
414
373
|
): void {
|
|
415
374
|
// First apply config system settings (from environment variables)
|
|
416
375
|
if (configLogging?.level) {
|
|
@@ -421,8 +380,8 @@ export function applyLoggingConfiguration(
|
|
|
421
380
|
if (appOptions !== undefined) {
|
|
422
381
|
if (appOptions === false) {
|
|
423
382
|
// Disable logging by setting to fatal level
|
|
424
|
-
configureGlobalLogger({ level:
|
|
425
|
-
} else if (typeof appOptions ===
|
|
383
|
+
configureGlobalLogger({ level: 'fatal' });
|
|
384
|
+
} else if (typeof appOptions === 'object') {
|
|
426
385
|
configureGlobalLogger(appOptions);
|
|
427
386
|
}
|
|
428
387
|
}
|
|
@@ -430,5 +389,5 @@ export function applyLoggingConfiguration(
|
|
|
430
389
|
|
|
431
390
|
// Framework-specific logger
|
|
432
391
|
export const createFrameworkLogger = (context: string) => {
|
|
433
|
-
return logger.child(
|
|
392
|
+
return logger.child('Moro', { framework: 'moro', context });
|
|
434
393
|
};
|