@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.
Files changed (284) hide show
  1. package/README.md +1 -1
  2. package/dist/core/config/index.d.ts +5 -5
  3. package/dist/core/config/index.js +1 -1
  4. package/dist/core/config/index.js.map +1 -1
  5. package/dist/core/config/loader.d.ts +1 -1
  6. package/dist/core/config/loader.js +58 -82
  7. package/dist/core/config/loader.js.map +1 -1
  8. package/dist/core/config/schema.d.ts +1 -1
  9. package/dist/core/config/schema.js +52 -111
  10. package/dist/core/config/schema.js.map +1 -1
  11. package/dist/core/config/utils.d.ts +2 -2
  12. package/dist/core/config/utils.js +18 -18
  13. package/dist/core/config/utils.js.map +1 -1
  14. package/dist/core/database/adapters/drizzle.d.ts +1 -1
  15. package/dist/core/database/adapters/drizzle.js +39 -55
  16. package/dist/core/database/adapters/drizzle.js.map +1 -1
  17. package/dist/core/database/adapters/index.d.ts +7 -7
  18. package/dist/core/database/adapters/index.js +11 -11
  19. package/dist/core/database/adapters/index.js.map +1 -1
  20. package/dist/core/database/adapters/mongodb.d.ts +1 -1
  21. package/dist/core/database/adapters/mongodb.js +19 -23
  22. package/dist/core/database/adapters/mongodb.js.map +1 -1
  23. package/dist/core/database/adapters/mysql.d.ts +1 -1
  24. package/dist/core/database/adapters/mysql.js +31 -27
  25. package/dist/core/database/adapters/mysql.js.map +1 -1
  26. package/dist/core/database/adapters/postgresql.d.ts +1 -1
  27. package/dist/core/database/adapters/postgresql.js +27 -35
  28. package/dist/core/database/adapters/postgresql.js.map +1 -1
  29. package/dist/core/database/adapters/redis.d.ts +1 -1
  30. package/dist/core/database/adapters/redis.js +24 -24
  31. package/dist/core/database/adapters/redis.js.map +1 -1
  32. package/dist/core/database/adapters/sqlite.d.ts +1 -1
  33. package/dist/core/database/adapters/sqlite.js +36 -36
  34. package/dist/core/database/adapters/sqlite.js.map +1 -1
  35. package/dist/core/database/index.d.ts +2 -2
  36. package/dist/core/docs/index.d.ts +7 -7
  37. package/dist/core/docs/index.js +13 -15
  38. package/dist/core/docs/index.js.map +1 -1
  39. package/dist/core/docs/openapi-generator.d.ts +5 -5
  40. package/dist/core/docs/openapi-generator.js +93 -94
  41. package/dist/core/docs/openapi-generator.js.map +1 -1
  42. package/dist/core/docs/simple-docs.d.ts +1 -1
  43. package/dist/core/docs/simple-docs.js +25 -28
  44. package/dist/core/docs/simple-docs.js.map +1 -1
  45. package/dist/core/docs/swagger-ui.d.ts +2 -2
  46. package/dist/core/docs/swagger-ui.js +46 -51
  47. package/dist/core/docs/swagger-ui.js.map +1 -1
  48. package/dist/core/docs/zod-to-openapi.d.ts +1 -1
  49. package/dist/core/docs/zod-to-openapi.js +115 -125
  50. package/dist/core/docs/zod-to-openapi.js.map +1 -1
  51. package/dist/core/events/event-bus.d.ts +1 -1
  52. package/dist/core/events/event-bus.js +15 -21
  53. package/dist/core/events/event-bus.js.map +1 -1
  54. package/dist/core/events/index.d.ts +2 -2
  55. package/dist/core/framework.d.ts +5 -5
  56. package/dist/core/framework.js +55 -60
  57. package/dist/core/framework.js.map +1 -1
  58. package/dist/core/http/http-server.d.ts +2 -2
  59. package/dist/core/http/http-server.js +228 -261
  60. package/dist/core/http/http-server.js.map +1 -1
  61. package/dist/core/http/index.d.ts +3 -3
  62. package/dist/core/http/router.d.ts +1 -1
  63. package/dist/core/http/router.js +15 -17
  64. package/dist/core/http/router.js.map +1 -1
  65. package/dist/core/logger/filters.d.ts +1 -1
  66. package/dist/core/logger/filters.js +16 -16
  67. package/dist/core/logger/filters.js.map +1 -1
  68. package/dist/core/logger/index.d.ts +3 -3
  69. package/dist/core/logger/logger.d.ts +1 -1
  70. package/dist/core/logger/logger.js +48 -59
  71. package/dist/core/logger/logger.js.map +1 -1
  72. package/dist/core/logger/outputs.d.ts +4 -4
  73. package/dist/core/logger/outputs.js +16 -20
  74. package/dist/core/logger/outputs.js.map +1 -1
  75. package/dist/core/middleware/built-in/adapters/cache/file.d.ts +1 -1
  76. package/dist/core/middleware/built-in/adapters/cache/file.js +19 -19
  77. package/dist/core/middleware/built-in/adapters/cache/file.js.map +1 -1
  78. package/dist/core/middleware/built-in/adapters/cache/index.d.ts +4 -4
  79. package/dist/core/middleware/built-in/adapters/cache/index.js +3 -3
  80. package/dist/core/middleware/built-in/adapters/cache/index.js.map +1 -1
  81. package/dist/core/middleware/built-in/adapters/cache/memory.d.ts +1 -1
  82. package/dist/core/middleware/built-in/adapters/cache/memory.js +5 -5
  83. package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -1
  84. package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +1 -1
  85. package/dist/core/middleware/built-in/adapters/cache/redis.js +18 -18
  86. package/dist/core/middleware/built-in/adapters/cache/redis.js.map +1 -1
  87. package/dist/core/middleware/built-in/adapters/cdn/azure.d.ts +1 -1
  88. package/dist/core/middleware/built-in/adapters/cdn/azure.js +8 -8
  89. package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +1 -1
  90. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.d.ts +1 -1
  91. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js +14 -14
  92. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -1
  93. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +1 -1
  94. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +13 -15
  95. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +1 -1
  96. package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +4 -4
  97. package/dist/core/middleware/built-in/adapters/cdn/index.js +3 -3
  98. package/dist/core/middleware/built-in/adapters/index.d.ts +4 -4
  99. package/dist/core/middleware/built-in/auth.d.ts +1 -1
  100. package/dist/core/middleware/built-in/auth.js +14 -14
  101. package/dist/core/middleware/built-in/cache.d.ts +2 -2
  102. package/dist/core/middleware/built-in/cache.js +43 -45
  103. package/dist/core/middleware/built-in/cache.js.map +1 -1
  104. package/dist/core/middleware/built-in/cdn.d.ts +2 -2
  105. package/dist/core/middleware/built-in/cdn.js +27 -29
  106. package/dist/core/middleware/built-in/cdn.js.map +1 -1
  107. package/dist/core/middleware/built-in/cookie.d.ts +2 -2
  108. package/dist/core/middleware/built-in/cookie.js +17 -17
  109. package/dist/core/middleware/built-in/cookie.js.map +1 -1
  110. package/dist/core/middleware/built-in/cors.d.ts +1 -1
  111. package/dist/core/middleware/built-in/cors.js +13 -13
  112. package/dist/core/middleware/built-in/csp.d.ts +1 -1
  113. package/dist/core/middleware/built-in/csp.js +22 -25
  114. package/dist/core/middleware/built-in/csp.js.map +1 -1
  115. package/dist/core/middleware/built-in/csrf.d.ts +1 -1
  116. package/dist/core/middleware/built-in/csrf.js +21 -24
  117. package/dist/core/middleware/built-in/csrf.js.map +1 -1
  118. package/dist/core/middleware/built-in/error-tracker.js +2 -2
  119. package/dist/core/middleware/built-in/index.d.ts +14 -14
  120. package/dist/core/middleware/built-in/performance-monitor.js +2 -2
  121. package/dist/core/middleware/built-in/rate-limit.d.ts +1 -1
  122. package/dist/core/middleware/built-in/rate-limit.js +12 -12
  123. package/dist/core/middleware/built-in/request-logger.js.map +1 -1
  124. package/dist/core/middleware/built-in/session.d.ts +5 -5
  125. package/dist/core/middleware/built-in/session.js +35 -38
  126. package/dist/core/middleware/built-in/session.js.map +1 -1
  127. package/dist/core/middleware/built-in/sse.d.ts +1 -1
  128. package/dist/core/middleware/built-in/sse.js +20 -22
  129. package/dist/core/middleware/built-in/sse.js.map +1 -1
  130. package/dist/core/middleware/built-in/validation.d.ts +1 -1
  131. package/dist/core/middleware/built-in/validation.js +13 -13
  132. package/dist/core/middleware/index.d.ts +5 -5
  133. package/dist/core/middleware/index.js +16 -16
  134. package/dist/core/middleware/index.js.map +1 -1
  135. package/dist/core/modules/auto-discovery.d.ts +2 -2
  136. package/dist/core/modules/auto-discovery.js +12 -13
  137. package/dist/core/modules/auto-discovery.js.map +1 -1
  138. package/dist/core/modules/index.d.ts +2 -2
  139. package/dist/core/modules/index.js.map +1 -1
  140. package/dist/core/modules/modules.d.ts +3 -3
  141. package/dist/core/modules/modules.js +3 -6
  142. package/dist/core/modules/modules.js.map +1 -1
  143. package/dist/core/networking/index.d.ts +2 -2
  144. package/dist/core/networking/index.js.map +1 -1
  145. package/dist/core/networking/service-discovery.d.ts +2 -2
  146. package/dist/core/networking/service-discovery.js +27 -27
  147. package/dist/core/networking/service-discovery.js.map +1 -1
  148. package/dist/core/networking/websocket-manager.d.ts +3 -3
  149. package/dist/core/networking/websocket-manager.js +15 -16
  150. package/dist/core/networking/websocket-manager.js.map +1 -1
  151. package/dist/core/routing/app-integration.d.ts +2 -2
  152. package/dist/core/routing/app-integration.js +13 -13
  153. package/dist/core/routing/app-integration.js.map +1 -1
  154. package/dist/core/routing/index.d.ts +3 -3
  155. package/dist/core/routing/index.js +43 -52
  156. package/dist/core/routing/index.js.map +1 -1
  157. package/dist/core/runtime/aws-lambda-adapter.d.ts +3 -3
  158. package/dist/core/runtime/aws-lambda-adapter.js +14 -16
  159. package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
  160. package/dist/core/runtime/base-adapter.d.ts +2 -2
  161. package/dist/core/runtime/base-adapter.js +11 -12
  162. package/dist/core/runtime/base-adapter.js.map +1 -1
  163. package/dist/core/runtime/cloudflare-workers-adapter.d.ts +3 -3
  164. package/dist/core/runtime/cloudflare-workers-adapter.js +20 -21
  165. package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
  166. package/dist/core/runtime/index.d.ts +9 -9
  167. package/dist/core/runtime/index.js +4 -4
  168. package/dist/core/runtime/index.js.map +1 -1
  169. package/dist/core/runtime/node-adapter.d.ts +5 -5
  170. package/dist/core/runtime/node-adapter.js +35 -35
  171. package/dist/core/runtime/node-adapter.js.map +1 -1
  172. package/dist/core/runtime/vercel-edge-adapter.d.ts +3 -3
  173. package/dist/core/runtime/vercel-edge-adapter.js +12 -15
  174. package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
  175. package/dist/core/utilities/circuit-breaker.js +6 -6
  176. package/dist/core/utilities/container.d.ts +1 -1
  177. package/dist/core/utilities/container.js +17 -22
  178. package/dist/core/utilities/container.js.map +1 -1
  179. package/dist/core/utilities/hooks.d.ts +3 -3
  180. package/dist/core/utilities/hooks.js +11 -11
  181. package/dist/core/utilities/hooks.js.map +1 -1
  182. package/dist/core/utilities/index.d.ts +4 -4
  183. package/dist/core/validation/index.d.ts +3 -3
  184. package/dist/core/validation/index.js +15 -15
  185. package/dist/core/validation/index.js.map +1 -1
  186. package/dist/index.d.ts +31 -30
  187. package/dist/index.js +28 -1
  188. package/dist/index.js.map +1 -1
  189. package/dist/moro.d.ts +14 -14
  190. package/dist/moro.js +79 -88
  191. package/dist/moro.js.map +1 -1
  192. package/dist/types/cache.d.ts +1 -1
  193. package/dist/types/core.d.ts +2 -2
  194. package/dist/types/events.d.ts +19 -19
  195. package/dist/types/hooks.d.ts +1 -1
  196. package/dist/types/http.d.ts +2 -2
  197. package/dist/types/logger.d.ts +3 -3
  198. package/dist/types/module.d.ts +2 -2
  199. package/dist/types/runtime.d.ts +2 -2
  200. package/dist/types/session.d.ts +4 -4
  201. package/package.json +180 -164
  202. package/src/core/config/index.ts +7 -9
  203. package/src/core/config/loader.ts +86 -158
  204. package/src/core/config/schema.ts +59 -122
  205. package/src/core/config/utils.ts +27 -45
  206. package/src/core/database/adapters/drizzle.ts +53 -75
  207. package/src/core/database/adapters/index.ts +26 -29
  208. package/src/core/database/adapters/mongodb.ts +31 -54
  209. package/src/core/database/adapters/mysql.ts +40 -50
  210. package/src/core/database/adapters/postgresql.ts +32 -42
  211. package/src/core/database/adapters/redis.ts +31 -36
  212. package/src/core/database/adapters/sqlite.ts +43 -51
  213. package/src/core/database/index.ts +2 -2
  214. package/src/core/docs/index.ts +25 -39
  215. package/src/core/docs/openapi-generator.ts +104 -117
  216. package/src/core/docs/simple-docs.ts +29 -39
  217. package/src/core/docs/swagger-ui.ts +57 -76
  218. package/src/core/docs/zod-to-openapi.ts +121 -153
  219. package/src/core/events/event-bus.ts +22 -45
  220. package/src/core/events/index.ts +2 -2
  221. package/src/core/framework.ts +119 -197
  222. package/src/core/http/http-server.ts +260 -360
  223. package/src/core/http/index.ts +3 -8
  224. package/src/core/http/router.ts +19 -31
  225. package/src/core/logger/filters.ts +19 -22
  226. package/src/core/logger/index.ts +3 -3
  227. package/src/core/logger/logger.ts +59 -100
  228. package/src/core/logger/outputs.ts +23 -27
  229. package/src/core/middleware/built-in/adapters/cache/file.ts +21 -23
  230. package/src/core/middleware/built-in/adapters/cache/index.ts +11 -14
  231. package/src/core/middleware/built-in/adapters/cache/memory.ts +7 -7
  232. package/src/core/middleware/built-in/adapters/cache/redis.ts +21 -24
  233. package/src/core/middleware/built-in/adapters/cdn/azure.ts +10 -18
  234. package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +19 -36
  235. package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +17 -26
  236. package/src/core/middleware/built-in/adapters/cdn/index.ts +10 -10
  237. package/src/core/middleware/built-in/adapters/index.ts +4 -4
  238. package/src/core/middleware/built-in/auth.ts +16 -16
  239. package/src/core/middleware/built-in/cache.ts +50 -67
  240. package/src/core/middleware/built-in/cdn.ts +34 -61
  241. package/src/core/middleware/built-in/cookie.ts +23 -28
  242. package/src/core/middleware/built-in/cors.ts +17 -17
  243. package/src/core/middleware/built-in/csp.ts +25 -31
  244. package/src/core/middleware/built-in/csrf.ts +24 -29
  245. package/src/core/middleware/built-in/error-tracker.ts +3 -3
  246. package/src/core/middleware/built-in/index.ts +28 -28
  247. package/src/core/middleware/built-in/performance-monitor.ts +4 -4
  248. package/src/core/middleware/built-in/rate-limit.ts +15 -15
  249. package/src/core/middleware/built-in/request-logger.ts +1 -3
  250. package/src/core/middleware/built-in/session.ts +47 -70
  251. package/src/core/middleware/built-in/sse.ts +23 -28
  252. package/src/core/middleware/built-in/validation.ts +15 -15
  253. package/src/core/middleware/index.ts +26 -37
  254. package/src/core/modules/auto-discovery.ts +21 -31
  255. package/src/core/modules/index.ts +2 -5
  256. package/src/core/modules/modules.ts +11 -20
  257. package/src/core/networking/index.ts +2 -6
  258. package/src/core/networking/service-discovery.ts +41 -61
  259. package/src/core/networking/websocket-manager.ts +27 -36
  260. package/src/core/routing/app-integration.ts +19 -32
  261. package/src/core/routing/index.ts +57 -88
  262. package/src/core/runtime/aws-lambda-adapter.ts +20 -30
  263. package/src/core/runtime/base-adapter.ts +17 -27
  264. package/src/core/runtime/cloudflare-workers-adapter.ts +28 -42
  265. package/src/core/runtime/index.ts +21 -33
  266. package/src/core/runtime/node-adapter.ts +59 -73
  267. package/src/core/runtime/vercel-edge-adapter.ts +18 -29
  268. package/src/core/utilities/circuit-breaker.ts +7 -7
  269. package/src/core/utilities/container.ts +52 -89
  270. package/src/core/utilities/hooks.ts +17 -23
  271. package/src/core/utilities/index.ts +4 -4
  272. package/src/core/validation/index.ts +25 -51
  273. package/src/index.ts +58 -60
  274. package/src/moro.ts +119 -191
  275. package/src/types/cache.ts +1 -1
  276. package/src/types/core.ts +2 -2
  277. package/src/types/database.ts +2 -10
  278. package/src/types/events.ts +23 -31
  279. package/src/types/hooks.ts +1 -1
  280. package/src/types/http.ts +5 -8
  281. package/src/types/logger.ts +7 -23
  282. package/src/types/module.ts +2 -2
  283. package/src/types/runtime.ts +6 -21
  284. package/src/types/session.ts +4 -4
@@ -1,11 +1,6 @@
1
1
  // HTTP System - Centralized Exports
2
- export { MoroHttpServer, middleware } from "./http-server";
3
- export { Router } from "./router";
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';
@@ -5,38 +5,34 @@ import {
5
5
  HttpHandler,
6
6
  Middleware,
7
7
  RouteDefinition,
8
- } from "../../types/http";
9
- import { createFrameworkLogger } from "../logger";
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("Router");
13
+ private logger = createFrameworkLogger('Router');
14
14
 
15
15
  get(path: string, ...handlers: (Middleware | HttpHandler)[]): void {
16
- this.addRoute("GET", path, handlers);
16
+ this.addRoute('GET', path, handlers);
17
17
  }
18
18
 
19
19
  post(path: string, ...handlers: (Middleware | HttpHandler)[]): void {
20
- this.addRoute("POST", path, handlers);
20
+ this.addRoute('POST', path, handlers);
21
21
  }
22
22
 
23
23
  put(path: string, ...handlers: (Middleware | HttpHandler)[]): void {
24
- this.addRoute("PUT", path, handlers);
24
+ this.addRoute('PUT', path, handlers);
25
25
  }
26
26
 
27
27
  delete(path: string, ...handlers: (Middleware | HttpHandler)[]): void {
28
- this.addRoute("DELETE", path, handlers);
28
+ this.addRoute('DELETE', path, handlers);
29
29
  }
30
30
 
31
31
  patch(path: string, ...handlers: (Middleware | HttpHandler)[]): void {
32
- this.addRoute("PATCH", path, handlers);
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: HttpRequest,
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 === "" || path === undefined) {
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
- "Processing",
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}` : " none"}`,
96
- "RouteMatch",
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 "../../types/logger";
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: "context-filter",
15
+ name: 'context-filter',
16
16
  filter: (entry: LogEntry) => {
17
17
  if (!entry.context) return true;
18
- return allowedContexts.some((ctx) => entry.context!.includes(ctx));
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: "rate-limit",
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[] = ["password", "token", "key", "secret"],
50
+ sensitiveKeys: string[] = ['password', 'token', 'key', 'secret']
51
51
  ): LogFilter => ({
52
- name: "sanitize",
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] = "[REDACTED]";
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]+)`, "gi");
70
- sanitizedMessage = sanitizedMessage.replace(regex, "$1[REDACTED]");
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: "performance",
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: "error-aggregation",
95
+ name: 'error-aggregation',
96
96
  filter: (entry: LogEntry) => {
97
- if (entry.level !== "error" && entry.level !== "fatal") return true;
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 === "production") {
129
+ if (environment === 'production') {
132
130
  // In production, filter out debug logs and sensitive development info
133
- if (entry.level === "debug") return false;
134
- if (entry.context?.includes("dev") || entry.context?.includes("test"))
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: "module-filter",
140
+ name: 'module-filter',
144
141
  filter: (entry: LogEntry) => {
145
142
  if (!entry.moduleId) return true;
146
143
  return allowedModules.includes(entry.moduleId);
@@ -5,8 +5,8 @@ export {
5
5
  createFrameworkLogger,
6
6
  configureGlobalLogger,
7
7
  applyLoggingConfiguration,
8
- } from "./logger";
9
- export * from "./filters";
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 "../../types/logger";
20
+ } from '../../types/logger';
@@ -1,5 +1,5 @@
1
1
  // Moro Logger - Beautiful, Fast, Feature-Rich
2
- import { performance } from "perf_hooks";
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 "../../types/logger";
12
+ } from '../../types/logger';
13
13
 
14
14
  export class MoroLogger implements Logger {
15
- private level: LogLevel = "info";
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: "\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
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 = "\x1b[0m";
54
- private static readonly BOLD = "\x1b[1m";
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: "info",
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: "pretty",
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 || "info";
71
+ this.level = this.options.level || 'info';
72
72
 
73
73
  // Add default console output
74
74
  this.addOutput({
75
- name: "console",
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((output) => this.addOutput(output));
82
- this.options.filters?.forEach((filter) => this.addFilter(filter));
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: string,
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: string,
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: string,
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("error", msg, context, { ...metadata, stack });
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("fatal", msg, context, { ...metadata, stack });
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("info", `Timer: ${label}`, context, {
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
- this.metrics.logsByLevel.error + this.metrics.logsByLevel.fatal;
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("Logger output error:", 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 || "pretty";
255
+ const format = this.options.format || 'pretty';
289
256
 
290
- if (format === "json") {
257
+ if (format === 'json') {
291
258
  console.log(JSON.stringify(entry));
292
259
  return;
293
260
  }
294
261
 
295
- if (format === "compact") {
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(", ")})${levelReset}`);
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
- entry.metadata?.stack &&
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 === "production" ? "warn" : "debug");
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) || "pretty",
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: "fatal" });
425
- } else if (typeof appOptions === "object") {
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("Moro", { framework: "moro", context });
392
+ return logger.child('Moro', { framework: 'moro', context });
434
393
  };