@morojs/moro 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +41 -30
  187. package/dist/index.js +50 -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 +183 -165
  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 +104 -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,10 +1,10 @@
1
1
  // Vercel Edge runtime adapter
2
- import { BaseRuntimeAdapter } from "./base-adapter";
3
- import { HttpRequest, HttpResponse } from "../../types/http";
4
- import { RuntimeHttpResponse } from "../../types/runtime";
2
+ import { BaseRuntimeAdapter } from './base-adapter';
3
+ import { HttpRequest, HttpResponse } from '../../types/http';
4
+ import { RuntimeHttpResponse } from '../../types/runtime';
5
5
 
6
6
  export class VercelEdgeAdapter extends BaseRuntimeAdapter {
7
- readonly type = "vercel-edge" as const;
7
+ readonly type = 'vercel-edge' as const;
8
8
 
9
9
  async adaptRequest(request: Request): Promise<HttpRequest> {
10
10
  const url = new URL(request.url);
@@ -12,9 +12,9 @@ export class VercelEdgeAdapter extends BaseRuntimeAdapter {
12
12
 
13
13
  // Parse body for POST/PUT/PATCH requests
14
14
  let body: any;
15
- if (["POST", "PUT", "PATCH"].includes(request.method)) {
16
- const contentType = request.headers.get("content-type") || "";
17
- if (contentType.includes("application/json")) {
15
+ if (['POST', 'PUT', 'PATCH'].includes(request.method)) {
16
+ const contentType = request.headers.get('content-type') || '';
17
+ if (contentType.includes('application/json')) {
18
18
  try {
19
19
  body = await request.json();
20
20
  } catch {
@@ -40,7 +40,7 @@ export class VercelEdgeAdapter extends BaseRuntimeAdapter {
40
40
  headers,
41
41
  ip: this.getClientIP(headers),
42
42
  params: {},
43
- requestId: "",
43
+ requestId: '',
44
44
  cookies: {},
45
45
  files: {},
46
46
  } as Partial<HttpRequest>;
@@ -48,9 +48,7 @@ export class VercelEdgeAdapter extends BaseRuntimeAdapter {
48
48
  return this.enhanceRequest(baseRequest);
49
49
  }
50
50
 
51
- async adaptResponse(
52
- moroResponse: HttpResponse | RuntimeHttpResponse,
53
- ): Promise<Response> {
51
+ async adaptResponse(moroResponse: HttpResponse | RuntimeHttpResponse): Promise<Response> {
54
52
  const runtimeResponse = moroResponse as RuntimeHttpResponse;
55
53
 
56
54
  // Handle different response states
@@ -59,10 +57,7 @@ export class VercelEdgeAdapter extends BaseRuntimeAdapter {
59
57
  const headers = runtimeResponse.headers || {};
60
58
 
61
59
  // If it's a real HttpResponse, we need to extract the data differently
62
- if (
63
- "statusCode" in moroResponse &&
64
- typeof moroResponse.statusCode === "number"
65
- ) {
60
+ if ('statusCode' in moroResponse && typeof moroResponse.statusCode === 'number') {
66
61
  status = moroResponse.statusCode;
67
62
  }
68
63
 
@@ -73,9 +68,9 @@ export class VercelEdgeAdapter extends BaseRuntimeAdapter {
73
68
  });
74
69
 
75
70
  // Handle different body types
76
- if (typeof body === "object" && body !== null) {
71
+ if (typeof body === 'object' && body !== null) {
77
72
  body = JSON.stringify(body);
78
- responseHeaders.set("Content-Type", "application/json");
73
+ responseHeaders.set('Content-Type', 'application/json');
79
74
  }
80
75
 
81
76
  return new Response(body, {
@@ -84,9 +79,7 @@ export class VercelEdgeAdapter extends BaseRuntimeAdapter {
84
79
  });
85
80
  }
86
81
 
87
- createServer(
88
- handler: (req: HttpRequest, res: HttpResponse) => Promise<void>,
89
- ) {
82
+ createServer(handler: (req: HttpRequest, res: HttpResponse) => Promise<void>) {
90
83
  // Return a Vercel Edge-compatible handler function
91
84
  return async (request: Request) => {
92
85
  try {
@@ -100,13 +93,13 @@ export class VercelEdgeAdapter extends BaseRuntimeAdapter {
100
93
  return new Response(
101
94
  JSON.stringify({
102
95
  success: false,
103
- error: "Internal server error",
104
- message: error instanceof Error ? error.message : "Unknown error",
96
+ error: 'Internal server error',
97
+ message: error instanceof Error ? error.message : 'Unknown error',
105
98
  }),
106
99
  {
107
100
  status: 500,
108
- headers: { "Content-Type": "application/json" },
109
- },
101
+ headers: { 'Content-Type': 'application/json' },
102
+ }
110
103
  );
111
104
  }
112
105
  };
@@ -116,10 +109,6 @@ export class VercelEdgeAdapter extends BaseRuntimeAdapter {
116
109
  // listen method is optional in the interface
117
110
 
118
111
  private getClientIP(headers: Record<string, string>): string {
119
- return (
120
- headers["x-forwarded-for"]?.split(",")[0]?.trim() ||
121
- headers["x-real-ip"] ||
122
- "unknown"
123
- );
112
+ return headers['x-forwarded-for']?.split(',')[0]?.trim() || headers['x-real-ip'] || 'unknown';
124
113
  }
125
114
  }
@@ -2,22 +2,22 @@
2
2
  export class CircuitBreaker {
3
3
  private failures = 0;
4
4
  private lastFailTime = 0;
5
- private state: "CLOSED" | "OPEN" | "HALF_OPEN" = "CLOSED";
5
+ private state: 'CLOSED' | 'OPEN' | 'HALF_OPEN' = 'CLOSED';
6
6
 
7
7
  constructor(
8
8
  private options: {
9
9
  failureThreshold: number;
10
10
  resetTimeout: number;
11
11
  monitoringPeriod: number;
12
- },
12
+ }
13
13
  ) {}
14
14
 
15
15
  async execute<T>(fn: () => Promise<T>): Promise<T> {
16
- if (this.state === "OPEN") {
16
+ if (this.state === 'OPEN') {
17
17
  if (Date.now() - this.lastFailTime < this.options.resetTimeout) {
18
- throw new Error("Circuit breaker is OPEN");
18
+ throw new Error('Circuit breaker is OPEN');
19
19
  }
20
- this.state = "HALF_OPEN";
20
+ this.state = 'HALF_OPEN';
21
21
  }
22
22
 
23
23
  try {
@@ -32,7 +32,7 @@ export class CircuitBreaker {
32
32
 
33
33
  private onSuccess() {
34
34
  this.failures = 0;
35
- this.state = "CLOSED";
35
+ this.state = 'CLOSED';
36
36
  }
37
37
 
38
38
  private onFailure() {
@@ -40,7 +40,7 @@ export class CircuitBreaker {
40
40
  this.lastFailTime = Date.now();
41
41
 
42
42
  if (this.failures >= this.options.failureThreshold) {
43
- this.state = "OPEN";
43
+ this.state = 'OPEN';
44
44
  }
45
45
  }
46
46
  }
@@ -1,22 +1,22 @@
1
1
  // Enhanced Functional Dependency Injection Container
2
- import { EventEmitter } from "events";
2
+ import { EventEmitter } from 'events';
3
3
 
4
4
  // Service lifecycle states
5
5
  export enum ServiceLifecycle {
6
- UNINITIALIZED = "uninitialized",
7
- INITIALIZING = "initializing",
8
- INITIALIZED = "initialized",
9
- DISPOSING = "disposing",
10
- DISPOSED = "disposed",
11
- ERROR = "error",
6
+ UNINITIALIZED = 'uninitialized',
7
+ INITIALIZING = 'initializing',
8
+ INITIALIZED = 'initialized',
9
+ DISPOSING = 'disposing',
10
+ DISPOSED = 'disposed',
11
+ ERROR = 'error',
12
12
  }
13
13
 
14
14
  // Service scopes
15
15
  export enum ServiceScope {
16
- SINGLETON = "singleton", // One instance per container
17
- TRANSIENT = "transient", // New instance every time
18
- REQUEST = "request", // One instance per request context
19
- MODULE = "module", // One instance per module
16
+ SINGLETON = 'singleton', // One instance per container
17
+ TRANSIENT = 'transient', // New instance every time
18
+ REQUEST = 'request', // One instance per request context
19
+ MODULE = 'module', // One instance per module
20
20
  }
21
21
 
22
22
  // Service metadata and configuration
@@ -46,7 +46,7 @@ export interface ServiceDefinition<T = any> {
46
46
  // Functional factory type
47
47
  export type ServiceFactory<T> = (
48
48
  dependencies: Record<string, any>,
49
- context?: ServiceContext,
49
+ context?: ServiceContext
50
50
  ) => T | Promise<T>;
51
51
 
52
52
  // Service interceptor for AOP patterns
@@ -54,14 +54,11 @@ export type ServiceInterceptor = (
54
54
  serviceName: string,
55
55
  dependencies: Record<string, any>,
56
56
  context: ServiceContext,
57
- next: () => any,
57
+ next: () => any
58
58
  ) => any | Promise<any>;
59
59
 
60
60
  // Service decorator for functional composition
61
- export type ServiceDecorator<T> = (
62
- instance: T,
63
- context: ServiceContext,
64
- ) => T | Promise<T>;
61
+ export type ServiceDecorator<T> = (instance: T, context: ServiceContext) => T | Promise<T>;
65
62
 
66
63
  // Service context for request-scoped services
67
64
  export interface ServiceContext {
@@ -86,9 +83,7 @@ export const withLogging =
86
83
  <T>(logger: any) =>
87
84
  (factory: ServiceFactory<T>): ServiceFactory<T> =>
88
85
  (deps, ctx) => {
89
- logger.debug(
90
- `Creating service with dependencies: ${Object.keys(deps).join(", ")}`,
91
- );
86
+ logger.debug(`Creating service with dependencies: ${Object.keys(deps).join(', ')}`);
92
87
  const start = Date.now();
93
88
  const result = factory(deps, ctx);
94
89
  logger.debug(`Service created in ${Date.now() - start}ms`);
@@ -100,7 +95,7 @@ export const withCaching =
100
95
  (factory: ServiceFactory<T>): ServiceFactory<T> => {
101
96
  const cache = new Map<string, { value: T; expires: number }>();
102
97
  return async (deps, ctx) => {
103
- const key = `${ctx?.requestId || "global"}_${JSON.stringify(deps)}`;
98
+ const key = `${ctx?.requestId || 'global'}_${JSON.stringify(deps)}`;
104
99
  const cached = cache.get(key);
105
100
  if (cached && cached.expires > Date.now()) {
106
101
  return cached.value;
@@ -122,9 +117,7 @@ export const withRetry =
122
117
  } catch (error) {
123
118
  lastError = error as Error;
124
119
  if (i < maxRetries) {
125
- await new Promise((resolve) =>
126
- setTimeout(resolve, delay * Math.pow(2, i)),
127
- );
120
+ await new Promise(resolve => setTimeout(resolve, delay * Math.pow(2, i)));
128
121
  }
129
122
  }
130
123
  }
@@ -139,10 +132,9 @@ export const withTimeout =
139
132
  factory(deps, ctx),
140
133
  new Promise<never>((_, reject) =>
141
134
  setTimeout(
142
- () =>
143
- reject(new Error(`Service creation timeout after ${timeoutMs}ms`)),
144
- timeoutMs,
145
- ),
135
+ () => reject(new Error(`Service creation timeout after ${timeoutMs}ms`)),
136
+ timeoutMs
137
+ )
146
138
  ),
147
139
  ]);
148
140
  };
@@ -296,9 +288,7 @@ export class FunctionalContainer extends EventEmitter {
296
288
  tags: service.metadata.tags,
297
289
  lifecycle: instance?.lifecycle || ServiceLifecycle.UNINITIALIZED,
298
290
  accessCount: instance?.accessCount || 0,
299
- lastAccessed: instance?.lastAccessed
300
- ? new Date(instance.lastAccessed).toISOString()
301
- : null,
291
+ lastAccessed: instance?.lastAccessed ? new Date(instance.lastAccessed).toISOString() : null,
302
292
  };
303
293
  }
304
294
 
@@ -319,7 +309,7 @@ export class FunctionalContainer extends EventEmitter {
319
309
  instance.lifecycle = ServiceLifecycle.DISPOSED;
320
310
  } catch (error) {
321
311
  instance.lifecycle = ServiceLifecycle.ERROR;
322
- this.emit("disposeError", { name, error });
312
+ this.emit('disposeError', { name, error });
323
313
  }
324
314
  }
325
315
  }
@@ -333,7 +323,7 @@ export class FunctionalContainer extends EventEmitter {
333
323
  private async createInstance<T>(
334
324
  name: string,
335
325
  service: ServiceDefinition<T>,
336
- context?: ServiceContext,
326
+ context?: ServiceContext
337
327
  ): Promise<ServiceInstance<T>> {
338
328
  const instance: ServiceInstance<T> = {
339
329
  value: undefined as any,
@@ -346,28 +336,21 @@ export class FunctionalContainer extends EventEmitter {
346
336
 
347
337
  try {
348
338
  // Resolve dependencies
349
- const dependencies = await this.resolveDependencies(
350
- service.metadata,
351
- context,
352
- );
339
+ const dependencies = await this.resolveDependencies(service.metadata, context);
353
340
 
354
341
  // Apply interceptors
355
342
  const interceptedFactory = this.applyInterceptors(
356
343
  name,
357
344
  service.factory,
358
345
  dependencies,
359
- context,
346
+ context
360
347
  );
361
348
 
362
349
  // Create instance
363
350
  instance.value = await interceptedFactory();
364
351
 
365
352
  // Apply decorators
366
- instance.value = await this.applyDecorators(
367
- instance.value,
368
- service.decorators,
369
- context,
370
- );
353
+ instance.value = await this.applyDecorators(instance.value, service.decorators, context);
371
354
 
372
355
  // Run initialization lifecycle
373
356
  if (service.metadata.lifecycle?.init) {
@@ -375,10 +358,10 @@ export class FunctionalContainer extends EventEmitter {
375
358
  }
376
359
 
377
360
  instance.lifecycle = ServiceLifecycle.INITIALIZED;
378
- this.emit("serviceCreated", { name, instance });
361
+ this.emit('serviceCreated', { name, instance });
379
362
  } catch (error) {
380
363
  instance.lifecycle = ServiceLifecycle.ERROR;
381
- this.emit("serviceError", { name, error });
364
+ this.emit('serviceError', { name, error });
382
365
 
383
366
  // Try fallback if available
384
367
  if (service.metadata.fallback) {
@@ -395,19 +378,16 @@ export class FunctionalContainer extends EventEmitter {
395
378
  private createInstanceSync<T>(
396
379
  name: string,
397
380
  service: ServiceDefinition<T>,
398
- context?: ServiceContext,
381
+ context?: ServiceContext
399
382
  ): T {
400
383
  // Simplified sync version - no async dependencies or lifecycle
401
- const dependencies = this.resolveDependenciesSync(
402
- service.metadata,
403
- context,
404
- );
384
+ const dependencies = this.resolveDependenciesSync(service.metadata, context);
405
385
  return service.factory(dependencies, context) as T;
406
386
  }
407
387
 
408
388
  private async resolveDependencies(
409
389
  metadata: ServiceMetadata,
410
- context?: ServiceContext,
390
+ context?: ServiceContext
411
391
  ): Promise<Record<string, any>> {
412
392
  const dependencies: Record<string, any> = {};
413
393
 
@@ -428,7 +408,7 @@ export class FunctionalContainer extends EventEmitter {
428
408
 
429
409
  private resolveDependenciesSync(
430
410
  metadata: ServiceMetadata,
431
- context?: ServiceContext,
411
+ context?: ServiceContext
432
412
  ): Record<string, any> {
433
413
  const dependencies: Record<string, any> = {};
434
414
 
@@ -451,24 +431,19 @@ export class FunctionalContainer extends EventEmitter {
451
431
  name: string,
452
432
  factory: ServiceFactory<any>,
453
433
  dependencies: Record<string, any>,
454
- context?: ServiceContext,
434
+ context?: ServiceContext
455
435
  ): () => any {
456
436
  return [...this.globalInterceptors].reduceRight(
457
437
  (next: () => any, interceptor: ServiceInterceptor) => () =>
458
- interceptor(
459
- name,
460
- dependencies,
461
- context || this.createDefaultContext(),
462
- next,
463
- ),
464
- () => factory(dependencies, context),
438
+ interceptor(name, dependencies, context || this.createDefaultContext(), next),
439
+ () => factory(dependencies, context)
465
440
  );
466
441
  }
467
442
 
468
443
  private async applyDecorators<T>(
469
444
  instance: T,
470
445
  decorators: ServiceDecorator<T>[],
471
- context?: ServiceContext,
446
+ context?: ServiceContext
472
447
  ): Promise<T> {
473
448
  let result = instance;
474
449
  for (const decorator of decorators) {
@@ -477,16 +452,12 @@ export class FunctionalContainer extends EventEmitter {
477
452
  return result;
478
453
  }
479
454
 
480
- private getScopeKey(
481
- serviceName: string,
482
- scope: ServiceScope,
483
- context?: ServiceContext,
484
- ): string {
455
+ private getScopeKey(serviceName: string, scope: ServiceScope, context?: ServiceContext): string {
485
456
  switch (scope) {
486
457
  case ServiceScope.REQUEST:
487
- return `${serviceName}:${context?.requestId || "default-request"}`;
458
+ return `${serviceName}:${context?.requestId || 'default-request'}`;
488
459
  case ServiceScope.MODULE:
489
- return `${serviceName}:${context?.moduleId || "default-module"}`;
460
+ return `${serviceName}:${context?.moduleId || 'default-module'}`;
490
461
  default:
491
462
  return serviceName; // Each singleton service gets its own key
492
463
  }
@@ -494,11 +465,11 @@ export class FunctionalContainer extends EventEmitter {
494
465
 
495
466
  private getInstanceMap(
496
467
  scope: ServiceScope,
497
- context?: ServiceContext,
468
+ context?: ServiceContext
498
469
  ): Map<string, ServiceInstance> {
499
470
  switch (scope) {
500
471
  case ServiceScope.REQUEST: {
501
- const requestId = context?.requestId || "default-request";
472
+ const requestId = context?.requestId || 'default-request';
502
473
  if (!this.requestScopes.has(requestId)) {
503
474
  this.requestScopes.set(requestId, new Map());
504
475
  }
@@ -506,7 +477,7 @@ export class FunctionalContainer extends EventEmitter {
506
477
  }
507
478
 
508
479
  case ServiceScope.MODULE: {
509
- const moduleId = context?.moduleId || "default-module";
480
+ const moduleId = context?.moduleId || 'default-module';
510
481
  if (!this.moduleScopes.has(moduleId)) {
511
482
  this.moduleScopes.set(moduleId, new Map());
512
483
  }
@@ -518,10 +489,7 @@ export class FunctionalContainer extends EventEmitter {
518
489
  }
519
490
  }
520
491
 
521
- private shouldRecreate(
522
- instance: ServiceInstance,
523
- metadata: ServiceMetadata,
524
- ): boolean {
492
+ private shouldRecreate(instance: ServiceInstance, metadata: ServiceMetadata): boolean {
525
493
  return (
526
494
  metadata.scope === ServiceScope.TRANSIENT ||
527
495
  instance.lifecycle === ServiceLifecycle.ERROR ||
@@ -545,7 +513,7 @@ export class FunctionalContainer extends EventEmitter {
545
513
 
546
514
  for (const [requestId, scope] of this.requestScopes) {
547
515
  const hasRecentActivity = Array.from(scope.values()).some(
548
- (instance) => now - instance.lastAccessed < timeout,
516
+ instance => now - instance.lastAccessed < timeout
549
517
  );
550
518
 
551
519
  if (!hasRecentActivity) {
@@ -553,7 +521,7 @@ export class FunctionalContainer extends EventEmitter {
553
521
  }
554
522
  }
555
523
  },
556
- 5 * 60 * 1000,
524
+ 5 * 60 * 1000
557
525
  ); // Check every 5 minutes
558
526
 
559
527
  // Unref the interval so it doesn't keep the process alive during testing
@@ -573,13 +541,13 @@ export class FunctionalContainer extends EventEmitter {
573
541
  this.instances.clear();
574
542
  this.services.clear();
575
543
 
576
- this.emit("containerDestroyed");
544
+ this.emit('containerDestroyed');
577
545
  }
578
546
 
579
547
  // Internal registration method
580
548
  _registerService<T>(name: string, definition: ServiceDefinition<T>): this {
581
549
  this.services.set(name, definition);
582
- this.emit("serviceRegistered", { name, metadata: definition.metadata });
550
+ this.emit('serviceRegistered', { name, metadata: definition.metadata });
583
551
  return this;
584
552
  }
585
553
 
@@ -603,7 +571,7 @@ export class ServiceRegistrationBuilder<T> {
603
571
 
604
572
  constructor(
605
573
  private container: FunctionalContainer,
606
- private name: string,
574
+ private name: string
607
575
  ) {}
608
576
 
609
577
  // Scope configuration
@@ -629,10 +597,7 @@ export class ServiceRegistrationBuilder<T> {
629
597
 
630
598
  // Dependencies
631
599
  dependsOn(...deps: string[]): this {
632
- this.metadata.dependencies = [
633
- ...(this.metadata.dependencies || []),
634
- ...deps,
635
- ];
600
+ this.metadata.dependencies = [...(this.metadata.dependencies || []), ...deps];
636
601
  return this;
637
602
  }
638
603
 
@@ -685,11 +650,9 @@ export class ServiceRegistrationBuilder<T> {
685
650
  return this;
686
651
  }
687
652
 
688
- compose(
689
- ...compositionFns: Array<(factory: ServiceFactory<T>) => ServiceFactory<T>>
690
- ): this {
653
+ compose(...compositionFns: Array<(factory: ServiceFactory<T>) => ServiceFactory<T>>): this {
691
654
  if (!this._factory) {
692
- throw new Error("Factory must be set before composition");
655
+ throw new Error('Factory must be set before composition');
693
656
  }
694
657
 
695
658
  this._factory = compositionFns.reduce((acc, fn) => fn(acc), this._factory);
@@ -741,7 +704,7 @@ export class Container {
741
704
  this.functionalContainer
742
705
  .register<T>(name)
743
706
  .factory(() => factory())
744
- [singleton ? "singleton" : "transient"]()
707
+ [singleton ? 'singleton' : 'transient']()
745
708
  .build();
746
709
  }
747
710
 
@@ -1,26 +1,26 @@
1
1
  // Hook System for Moro
2
- import { EventEmitter } from "events";
3
- import { HookFunction, HookContext, MoroMiddleware } from "../../types/hooks";
4
- import { createFrameworkLogger } from "../logger";
2
+ import { EventEmitter } from 'events';
3
+ import { HookFunction, HookContext, MoroMiddleware } from '../../types/hooks';
4
+ import { createFrameworkLogger } from '../logger';
5
5
 
6
6
  export const HOOK_EVENTS = {
7
- BEFORE_REQUEST: "before:request",
8
- AFTER_REQUEST: "after:request",
9
- BEFORE_RESPONSE: "before:response",
10
- AFTER_RESPONSE: "after:response",
11
- ERROR: "error",
7
+ BEFORE_REQUEST: 'before:request',
8
+ AFTER_REQUEST: 'after:request',
9
+ BEFORE_RESPONSE: 'before:response',
10
+ AFTER_RESPONSE: 'after:response',
11
+ ERROR: 'error',
12
12
  } as const;
13
13
 
14
14
  export class HookManager extends EventEmitter {
15
15
  private hooks = new Map<string, HookFunction[]>();
16
16
  private beforeHooks = new Map<string, HookFunction[]>();
17
17
  private afterHooks = new Map<string, HookFunction[]>();
18
- private logger = createFrameworkLogger("Hooks");
18
+ private logger = createFrameworkLogger('Hooks');
19
19
 
20
20
  constructor() {
21
21
  super();
22
22
  // Initialize hook arrays
23
- Object.values(HOOK_EVENTS).forEach((event) => {
23
+ Object.values(HOOK_EVENTS).forEach(event => {
24
24
  this.hooks.set(event, []);
25
25
  this.beforeHooks.set(event, []);
26
26
  this.afterHooks.set(event, []);
@@ -55,10 +55,7 @@ export class HookManager extends EventEmitter {
55
55
  }
56
56
 
57
57
  // Execute hooks for an event
58
- async execute(
59
- event: string,
60
- context: HookContext = {},
61
- ): Promise<HookContext> {
58
+ async execute(event: string, context: HookContext = {}): Promise<HookContext> {
62
59
  // Execute before hooks
63
60
  const beforeHooks = this.beforeHooks.get(event) || [];
64
61
  for (const hook of beforeHooks) {
@@ -84,16 +81,13 @@ export class HookManager extends EventEmitter {
84
81
  }
85
82
 
86
83
  // Execute a single hook with error handling
87
- private async executeHook(
88
- hook: HookFunction,
89
- context: HookContext,
90
- ): Promise<void> {
84
+ private async executeHook(hook: HookFunction, context: HookContext): Promise<void> {
91
85
  try {
92
86
  await hook(context);
93
87
  } catch (error) {
94
- this.logger.error("Hook execution error", "HookExecution", {
88
+ this.logger.error('Hook execution error', 'HookExecution', {
95
89
  error: error instanceof Error ? error.message : String(error),
96
- context: context.request?.method || "unknown",
90
+ context: context.request?.method || 'unknown',
97
91
  });
98
92
  throw error;
99
93
  }
@@ -106,7 +100,7 @@ export class HookManager extends EventEmitter {
106
100
  this.beforeHooks.delete(event);
107
101
  this.afterHooks.delete(event);
108
102
  } else {
109
- [this.hooks, this.beforeHooks, this.afterHooks].forEach((map) => {
103
+ [this.hooks, this.beforeHooks, this.afterHooks].forEach(map => {
110
104
  const hooks = map.get(event);
111
105
  if (hooks) {
112
106
  const index = hooks.indexOf(fn);
@@ -136,7 +130,7 @@ export class HookManager extends EventEmitter {
136
130
  ...this.afterHooks.keys(),
137
131
  ]);
138
132
 
139
- allEvents.forEach((event) => {
133
+ allEvents.forEach(event => {
140
134
  allHooks[event] = this.getHooks(event);
141
135
  });
142
136
 
@@ -145,4 +139,4 @@ export class HookManager extends EventEmitter {
145
139
  }
146
140
 
147
141
  // Built-in middleware - now organized in individual files
148
- export { simpleMiddleware as middleware } from "../middleware/index";
142
+ export { simpleMiddleware as middleware } from '../middleware/index';
@@ -8,9 +8,9 @@ export {
8
8
  withCaching,
9
9
  withRetry,
10
10
  withTimeout,
11
- } from "./container";
12
- export { CircuitBreaker } from "./circuit-breaker";
13
- export { HookManager, HOOK_EVENTS } from "./hooks";
11
+ } from './container';
12
+ export { CircuitBreaker } from './circuit-breaker';
13
+ export { HookManager, HOOK_EVENTS } from './hooks';
14
14
 
15
15
  // Re-export middleware from hooks
16
- export { middleware } from "./hooks";
16
+ export { middleware } from './hooks';