@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,19 +1,19 @@
1
1
  // Advanced Logger Outputs
2
- import { writeFile, appendFile, mkdir } from "fs/promises";
3
- import { join, dirname } from "path";
4
- import { LogEntry, LogOutput } from "../../types/logger";
2
+ import { writeFile, appendFile, mkdir } from 'fs/promises';
3
+ import { join, dirname } from 'path';
4
+ import { LogEntry, LogOutput } from '../../types/logger';
5
5
 
6
6
  // File output for persistent logging
7
7
  export class FileOutput implements LogOutput {
8
- name = "file";
8
+ name = 'file';
9
9
 
10
10
  constructor(
11
11
  private filePath: string,
12
12
  private options: {
13
- format?: "json" | "pretty";
13
+ format?: 'json' | 'pretty';
14
14
  maxSize?: number; // MB
15
15
  rotate?: boolean;
16
- } = {},
16
+ } = {}
17
17
  ) {}
18
18
 
19
19
  async write(entry: LogEntry): Promise<void> {
@@ -21,28 +21,26 @@ export class FileOutput implements LogOutput {
21
21
  // Ensure directory exists
22
22
  await mkdir(dirname(this.filePath), { recursive: true });
23
23
 
24
- const format = this.options.format || "json";
24
+ const format = this.options.format || 'json';
25
25
  const line =
26
- format === "json"
27
- ? JSON.stringify(entry) + "\n"
28
- : this.formatPretty(entry) + "\n";
26
+ format === 'json' ? JSON.stringify(entry) + '\n' : this.formatPretty(entry) + '\n';
29
27
 
30
- await appendFile(this.filePath, line, "utf8");
28
+ await appendFile(this.filePath, line, 'utf8');
31
29
 
32
30
  // TODO: Implement log rotation if needed
33
31
  } catch (error) {
34
- console.error("File logger error:", error);
32
+ console.error('File logger error:', error);
35
33
  }
36
34
  }
37
35
 
38
36
  private formatPretty(entry: LogEntry): string {
39
37
  const timestamp = entry.timestamp.toISOString();
40
38
  const level = entry.level.toUpperCase().padEnd(5);
41
- const context = entry.context ? `[${entry.context}] ` : "";
39
+ const context = entry.context ? `[${entry.context}] ` : '';
42
40
  const metadata =
43
41
  entry.metadata && Object.keys(entry.metadata).length > 0
44
42
  ? ` ${JSON.stringify(entry.metadata)}`
45
- : "";
43
+ : '';
46
44
 
47
45
  return `${timestamp} ${level} ${context}${entry.message}${metadata}`;
48
46
  }
@@ -50,7 +48,7 @@ export class FileOutput implements LogOutput {
50
48
 
51
49
  // HTTP webhook output for external logging services
52
50
  export class WebhookOutput implements LogOutput {
53
- name = "webhook";
51
+ name = 'webhook';
54
52
 
55
53
  constructor(
56
54
  private url: string,
@@ -59,15 +57,15 @@ export class WebhookOutput implements LogOutput {
59
57
  batch?: boolean;
60
58
  batchSize?: number;
61
59
  timeout?: number;
62
- } = {},
60
+ } = {}
63
61
  ) {}
64
62
 
65
63
  async write(entry: LogEntry): Promise<void> {
66
64
  try {
67
65
  const response = await fetch(this.url, {
68
- method: "POST",
66
+ method: 'POST',
69
67
  headers: {
70
- "Content-Type": "application/json",
68
+ 'Content-Type': 'application/json',
71
69
  ...this.options.headers,
72
70
  },
73
71
  body: JSON.stringify(entry),
@@ -78,14 +76,14 @@ export class WebhookOutput implements LogOutput {
78
76
  throw new Error(`Webhook failed: ${response.status}`);
79
77
  }
80
78
  } catch (error) {
81
- console.error("Webhook logger error:", error);
79
+ console.error('Webhook logger error:', error);
82
80
  }
83
81
  }
84
82
  }
85
83
 
86
84
  // Memory buffer output for testing and debugging
87
85
  export class MemoryOutput implements LogOutput {
88
- name = "memory";
86
+ name = 'memory';
89
87
  private buffer: LogEntry[] = [];
90
88
 
91
89
  constructor(private maxSize: number = 1000) {}
@@ -108,21 +106,19 @@ export class MemoryOutput implements LogOutput {
108
106
 
109
107
  // Stream output for custom processing
110
108
  export class StreamOutput implements LogOutput {
111
- name = "stream";
112
- format?: "pretty" | "json" | "compact";
109
+ name = 'stream';
110
+ format?: 'pretty' | 'json' | 'compact';
113
111
 
114
112
  constructor(
115
113
  private stream: NodeJS.WritableStream,
116
- format: "json" | "pretty" = "json",
114
+ format: 'json' | 'pretty' = 'json'
117
115
  ) {
118
116
  this.format = format;
119
117
  }
120
118
 
121
119
  write(entry: LogEntry): void {
122
120
  const data =
123
- this.format === "json"
124
- ? JSON.stringify(entry) + "\n"
125
- : this.formatPretty(entry) + "\n";
121
+ this.format === 'json' ? JSON.stringify(entry) + '\n' : this.formatPretty(entry) + '\n';
126
122
 
127
123
  this.stream.write(data);
128
124
  }
@@ -130,7 +126,7 @@ export class StreamOutput implements LogOutput {
130
126
  private formatPretty(entry: LogEntry): string {
131
127
  const timestamp = entry.timestamp.toISOString();
132
128
  const level = entry.level.toUpperCase().padEnd(5);
133
- const context = entry.context ? `[${entry.context}] ` : "";
129
+ const context = entry.context ? `[${entry.context}] ` : '';
134
130
  return `${timestamp} ${level} ${context}${entry.message}`;
135
131
  }
136
132
  }
@@ -1,37 +1,37 @@
1
1
  // File System Cache Adapter
2
- import { CacheAdapter } from "../../../../../types/cache";
3
- import { createFrameworkLogger } from "../../../../logger";
2
+ import { CacheAdapter } from '../../../../../types/cache';
3
+ import { createFrameworkLogger } from '../../../../logger';
4
4
 
5
- const logger = createFrameworkLogger("FileCacheAdapter");
5
+ const logger = createFrameworkLogger('FileCacheAdapter');
6
6
 
7
7
  export class FileCacheAdapter implements CacheAdapter {
8
8
  private cacheDir: string;
9
9
 
10
10
  constructor(options: { cacheDir?: string } = {}) {
11
- this.cacheDir = options.cacheDir || "./cache";
11
+ this.cacheDir = options.cacheDir || './cache';
12
12
  this.ensureCacheDir();
13
13
  }
14
14
 
15
15
  private async ensureCacheDir(): Promise<void> {
16
- const fs = await import("fs/promises");
16
+ const fs = await import('fs/promises');
17
17
  try {
18
18
  await fs.mkdir(this.cacheDir, { recursive: true });
19
19
  } catch (error) {
20
- logger.error("Failed to create cache directory", "FileCache", { error });
20
+ logger.error('Failed to create cache directory', 'FileCache', { error });
21
21
  }
22
22
  }
23
23
 
24
24
  private getFilePath(key: string): string {
25
- const crypto = require("crypto");
26
- const hash = crypto.createHash("md5").update(key).digest("hex");
25
+ const crypto = require('crypto');
26
+ const hash = crypto.createHash('md5').update(key).digest('hex');
27
27
  return `${this.cacheDir}/${hash}.json`;
28
28
  }
29
29
 
30
30
  async get(key: string): Promise<any> {
31
31
  try {
32
- const fs = await import("fs/promises");
32
+ const fs = await import('fs/promises');
33
33
  const filePath = this.getFilePath(key);
34
- const data = await fs.readFile(filePath, "utf-8");
34
+ const data = await fs.readFile(filePath, 'utf-8');
35
35
  const parsed = JSON.parse(data);
36
36
 
37
37
  if (Date.now() > parsed.expires) {
@@ -47,24 +47,24 @@ export class FileCacheAdapter implements CacheAdapter {
47
47
 
48
48
  async set(key: string, value: any, ttl: number = 3600): Promise<void> {
49
49
  try {
50
- const fs = await import("fs/promises");
50
+ const fs = await import('fs/promises');
51
51
  const filePath = this.getFilePath(key);
52
52
  const expires = Date.now() + ttl * 1000;
53
53
  const data = JSON.stringify({ value, expires });
54
54
 
55
55
  await fs.writeFile(filePath, data);
56
- logger.debug(`Cached item to file: ${key} (TTL: ${ttl}s)`, "FileCache");
56
+ logger.debug(`Cached item to file: ${key} (TTL: ${ttl}s)`, 'FileCache');
57
57
  } catch (error) {
58
- logger.error("File cache set error", "FileCache", { key, error });
58
+ logger.error('File cache set error', 'FileCache', { key, error });
59
59
  }
60
60
  }
61
61
 
62
62
  async del(key: string): Promise<void> {
63
63
  try {
64
- const fs = await import("fs/promises");
64
+ const fs = await import('fs/promises');
65
65
  const filePath = this.getFilePath(key);
66
66
  await fs.unlink(filePath);
67
- logger.debug(`Deleted file cache item: ${key}`, "FileCache");
67
+ logger.debug(`Deleted file cache item: ${key}`, 'FileCache');
68
68
  } catch (error) {
69
69
  // File might not exist, which is okay
70
70
  }
@@ -72,16 +72,14 @@ export class FileCacheAdapter implements CacheAdapter {
72
72
 
73
73
  async clear(): Promise<void> {
74
74
  try {
75
- const fs = await import("fs/promises");
75
+ const fs = await import('fs/promises');
76
76
  const files = await fs.readdir(this.cacheDir);
77
77
 
78
- await Promise.all(
79
- files.map((file) => fs.unlink(`${this.cacheDir}/${file}`)),
80
- );
78
+ await Promise.all(files.map(file => fs.unlink(`${this.cacheDir}/${file}`)));
81
79
 
82
- logger.debug("Cleared all file cache items", "FileCache");
80
+ logger.debug('Cleared all file cache items', 'FileCache');
83
81
  } catch (error) {
84
- logger.error("File cache clear error", "FileCache", { error });
82
+ logger.error('File cache clear error', 'FileCache', { error });
85
83
  }
86
84
  }
87
85
 
@@ -92,9 +90,9 @@ export class FileCacheAdapter implements CacheAdapter {
92
90
 
93
91
  async ttl(key: string): Promise<number> {
94
92
  try {
95
- const fs = await import("fs/promises");
93
+ const fs = await import('fs/promises');
96
94
  const filePath = this.getFilePath(key);
97
- const data = await fs.readFile(filePath, "utf-8");
95
+ const data = await fs.readFile(filePath, 'utf-8');
98
96
  const parsed = JSON.parse(data);
99
97
 
100
98
  const remaining = Math.floor((parsed.expires - Date.now()) / 1000);
@@ -1,24 +1,21 @@
1
1
  // Cache Adapters
2
- export { MemoryCacheAdapter } from "./memory";
3
- export { RedisCacheAdapter } from "./redis";
4
- export { FileCacheAdapter } from "./file";
2
+ export { MemoryCacheAdapter } from './memory';
3
+ export { RedisCacheAdapter } from './redis';
4
+ export { FileCacheAdapter } from './file';
5
5
 
6
- import { MemoryCacheAdapter } from "./memory";
7
- import { RedisCacheAdapter } from "./redis";
8
- import { FileCacheAdapter } from "./file";
9
- import { CacheAdapter } from "../../../../../types/cache";
6
+ import { MemoryCacheAdapter } from './memory';
7
+ import { RedisCacheAdapter } from './redis';
8
+ import { FileCacheAdapter } from './file';
9
+ import { CacheAdapter } from '../../../../../types/cache';
10
10
 
11
11
  // Adapter factory function for auto-loading
12
- export function createCacheAdapter(
13
- type: string,
14
- options: any = {},
15
- ): CacheAdapter {
12
+ export function createCacheAdapter(type: string, options: any = {}): CacheAdapter {
16
13
  switch (type.toLowerCase()) {
17
- case "memory":
14
+ case 'memory':
18
15
  return new MemoryCacheAdapter();
19
- case "redis":
16
+ case 'redis':
20
17
  return new RedisCacheAdapter(options);
21
- case "file":
18
+ case 'file':
22
19
  return new FileCacheAdapter(options);
23
20
  default:
24
21
  throw new Error(`Unknown cache adapter type: ${type}`);
@@ -1,8 +1,8 @@
1
1
  // Memory Cache Adapter
2
- import { CacheAdapter } from "../../../../../types/cache";
3
- import { createFrameworkLogger } from "../../../../logger";
2
+ import { CacheAdapter } from '../../../../../types/cache';
3
+ import { createFrameworkLogger } from '../../../../logger';
4
4
 
5
- const logger = createFrameworkLogger("MemoryCacheAdapter");
5
+ const logger = createFrameworkLogger('MemoryCacheAdapter');
6
6
 
7
7
  export class MemoryCacheAdapter implements CacheAdapter {
8
8
  private cache = new Map<string, { value: any; expires: number }>();
@@ -39,7 +39,7 @@ export class MemoryCacheAdapter implements CacheAdapter {
39
39
  }, ttl * 1000);
40
40
 
41
41
  this.timers.set(key, timer);
42
- logger.debug(`Cached item: ${key} (TTL: ${ttl}s)`, "MemoryCache");
42
+ logger.debug(`Cached item: ${key} (TTL: ${ttl}s)`, 'MemoryCache');
43
43
  }
44
44
 
45
45
  async del(key: string): Promise<void> {
@@ -49,14 +49,14 @@ export class MemoryCacheAdapter implements CacheAdapter {
49
49
  clearTimeout(timer);
50
50
  this.timers.delete(key);
51
51
  }
52
- logger.debug(`Deleted cache item: ${key}`, "MemoryCache");
52
+ logger.debug(`Deleted cache item: ${key}`, 'MemoryCache');
53
53
  }
54
54
 
55
55
  async clear(): Promise<void> {
56
56
  this.cache.clear();
57
- this.timers.forEach((timer) => clearTimeout(timer));
57
+ this.timers.forEach(timer => clearTimeout(timer));
58
58
  this.timers.clear();
59
- logger.debug("Cleared all cache items", "MemoryCache");
59
+ logger.debug('Cleared all cache items', 'MemoryCache');
60
60
  }
61
61
 
62
62
  async exists(key: string): Promise<boolean> {
@@ -1,8 +1,8 @@
1
1
  // Redis Cache Adapter
2
- import { CacheAdapter } from "../../../../../types/cache";
3
- import { createFrameworkLogger } from "../../../../logger";
2
+ import { CacheAdapter } from '../../../../../types/cache';
3
+ import { createFrameworkLogger } from '../../../../logger';
4
4
 
5
- const logger = createFrameworkLogger("RedisCacheAdapter");
5
+ const logger = createFrameworkLogger('RedisCacheAdapter');
6
6
 
7
7
  export class RedisCacheAdapter implements CacheAdapter {
8
8
  private client: any;
@@ -14,29 +14,26 @@ export class RedisCacheAdapter implements CacheAdapter {
14
14
  password?: string;
15
15
  db?: number;
16
16
  keyPrefix?: string;
17
- } = {},
17
+ } = {}
18
18
  ) {
19
19
  try {
20
- const redis = require("redis");
20
+ const redis = require('redis');
21
21
  this.client = redis.createClient({
22
- host: options.host || "localhost",
22
+ host: options.host || 'localhost',
23
23
  port: options.port || 6379,
24
24
  password: options.password,
25
25
  db: options.db || 0,
26
- key_prefix: options.keyPrefix || "moro:cache:",
26
+ key_prefix: options.keyPrefix || 'moro:cache:',
27
27
  });
28
28
 
29
- this.client.on("error", (err: Error) => {
30
- logger.error("Redis cache error", "RedisCache", { error: err.message });
29
+ this.client.on('error', (err: Error) => {
30
+ logger.error('Redis cache error', 'RedisCache', { error: err.message });
31
31
  });
32
32
 
33
- logger.info("Redis cache adapter initialized", "RedisCache");
33
+ logger.info('Redis cache adapter initialized', 'RedisCache');
34
34
  } catch (error) {
35
- logger.error(
36
- "Redis not available, falling back to memory cache",
37
- "RedisCache",
38
- );
39
- throw new Error("Redis package not installed. Run: npm install redis");
35
+ logger.error('Redis not available, falling back to memory cache', 'RedisCache');
36
+ throw new Error('Redis package not installed. Run: npm install redis');
40
37
  }
41
38
  }
42
39
 
@@ -45,7 +42,7 @@ export class RedisCacheAdapter implements CacheAdapter {
45
42
  const value = await this.client.get(key);
46
43
  return value ? JSON.parse(value) : null;
47
44
  } catch (error) {
48
- logger.error("Redis get error", "RedisCache", { key, error });
45
+ logger.error('Redis get error', 'RedisCache', { key, error });
49
46
  return null;
50
47
  }
51
48
  }
@@ -58,27 +55,27 @@ export class RedisCacheAdapter implements CacheAdapter {
58
55
  } else {
59
56
  await this.client.set(key, serialized);
60
57
  }
61
- logger.debug(`Cached item in Redis: ${key} (TTL: ${ttl}s)`, "RedisCache");
58
+ logger.debug(`Cached item in Redis: ${key} (TTL: ${ttl}s)`, 'RedisCache');
62
59
  } catch (error) {
63
- logger.error("Redis set error", "RedisCache", { key, error });
60
+ logger.error('Redis set error', 'RedisCache', { key, error });
64
61
  }
65
62
  }
66
63
 
67
64
  async del(key: string): Promise<void> {
68
65
  try {
69
66
  await this.client.del(key);
70
- logger.debug(`Deleted Redis cache item: ${key}`, "RedisCache");
67
+ logger.debug(`Deleted Redis cache item: ${key}`, 'RedisCache');
71
68
  } catch (error) {
72
- logger.error("Redis del error", "RedisCache", { key, error });
69
+ logger.error('Redis del error', 'RedisCache', { key, error });
73
70
  }
74
71
  }
75
72
 
76
73
  async clear(): Promise<void> {
77
74
  try {
78
75
  await this.client.flushdb();
79
- logger.debug("Cleared all Redis cache items", "RedisCache");
76
+ logger.debug('Cleared all Redis cache items', 'RedisCache');
80
77
  } catch (error) {
81
- logger.error("Redis clear error", "RedisCache", { error });
78
+ logger.error('Redis clear error', 'RedisCache', { error });
82
79
  }
83
80
  }
84
81
 
@@ -87,7 +84,7 @@ export class RedisCacheAdapter implements CacheAdapter {
87
84
  const exists = await this.client.exists(key);
88
85
  return exists === 1;
89
86
  } catch (error) {
90
- logger.error("Redis exists error", "RedisCache", { key, error });
87
+ logger.error('Redis exists error', 'RedisCache', { key, error });
91
88
  return false;
92
89
  }
93
90
  }
@@ -96,7 +93,7 @@ export class RedisCacheAdapter implements CacheAdapter {
96
93
  try {
97
94
  return await this.client.ttl(key);
98
95
  } catch (error) {
99
- logger.error("Redis TTL error", "RedisCache", { key, error });
96
+ logger.error('Redis TTL error', 'RedisCache', { key, error });
100
97
  return -1;
101
98
  }
102
99
  }
@@ -1,8 +1,8 @@
1
1
  // Azure CDN Adapter
2
- import { CDNAdapter } from "../../../../../types/cdn";
3
- import { createFrameworkLogger } from "../../../../logger";
2
+ import { CDNAdapter } from '../../../../../types/cdn';
3
+ import { createFrameworkLogger } from '../../../../logger';
4
4
 
5
- const logger = createFrameworkLogger("AzureCDNAdapter");
5
+ const logger = createFrameworkLogger('AzureCDNAdapter');
6
6
 
7
7
  export class AzureCDNAdapter implements CDNAdapter {
8
8
  private endpoint: string;
@@ -27,7 +27,7 @@ export class AzureCDNAdapter implements CDNAdapter {
27
27
  this.endpointName = options.endpointName;
28
28
  this.endpoint = options.endpoint;
29
29
 
30
- logger.info("Azure CDN adapter initialized", "AzureCDN");
30
+ logger.info('Azure CDN adapter initialized', 'AzureCDN');
31
31
  }
32
32
 
33
33
  async purge(urls: string[]): Promise<void> {
@@ -35,34 +35,26 @@ export class AzureCDNAdapter implements CDNAdapter {
35
35
  const purgeUrl = `https://management.azure.com/subscriptions/${this.subscriptionId}/resourceGroups/${this.resourceGroup}/providers/Microsoft.Cdn/profiles/${this.profileName}/endpoints/${this.endpointName}/purge`;
36
36
 
37
37
  const purgeData = {
38
- contentPaths: urls.map((url) =>
39
- url.startsWith("/") ? url : `/${url}`,
40
- ),
38
+ contentPaths: urls.map(url => (url.startsWith('/') ? url : `/${url}`)),
41
39
  };
42
40
 
43
- logger.info(
44
- `Azure CDN cache purge requested: ${urls.length} URLs`,
45
- "AzureCDN",
46
- );
41
+ logger.info(`Azure CDN cache purge requested: ${urls.length} URLs`, 'AzureCDN');
47
42
 
48
43
  // Implementation would use Azure SDK or REST API calls
49
44
  // const response = await fetch(purgeUrl, { method: 'POST', body: JSON.stringify(purgeData) });
50
45
  } catch (error) {
51
- logger.error("Azure CDN purge failed", "AzureCDN", { error, urls });
46
+ logger.error('Azure CDN purge failed', 'AzureCDN', { error, urls });
52
47
  throw error;
53
48
  }
54
49
  }
55
50
 
56
51
  async prefetch(urls: string[]): Promise<void> {
57
- logger.debug(
58
- `Azure CDN prefetch requested for ${urls.length} URLs`,
59
- "AzureCDN",
60
- );
52
+ logger.debug(`Azure CDN prefetch requested for ${urls.length} URLs`, 'AzureCDN');
61
53
  // Azure CDN prefetch implementation
62
54
  }
63
55
 
64
56
  setHeaders(response: any): void {
65
- response.setHeader("Cache-Control", "public, max-age=3600");
66
- response.setHeader("Azure-CDN-Edge-Location", "US-East");
57
+ response.setHeader('Cache-Control', 'public, max-age=3600');
58
+ response.setHeader('Azure-CDN-Edge-Location', 'US-East');
67
59
  }
68
60
  }
@@ -1,8 +1,8 @@
1
1
  // Cloudflare CDN Adapter
2
- import { CDNAdapter } from "../../../../../types/cdn";
3
- import { createFrameworkLogger } from "../../../../logger";
2
+ import { CDNAdapter } from '../../../../../types/cdn';
3
+ import { createFrameworkLogger } from '../../../../logger';
4
4
 
5
- const logger = createFrameworkLogger("CloudflareCDNAdapter");
5
+ const logger = createFrameworkLogger('CloudflareCDNAdapter');
6
6
 
7
7
  export class CloudflareCDNAdapter implements CDNAdapter {
8
8
  private apiToken: string;
@@ -12,72 +12,55 @@ export class CloudflareCDNAdapter implements CDNAdapter {
12
12
  this.apiToken = options.apiToken;
13
13
  this.zoneId = options.zoneId;
14
14
 
15
- logger.info("Cloudflare CDN adapter initialized", "Cloudflare");
15
+ logger.info('Cloudflare CDN adapter initialized', 'Cloudflare');
16
16
  }
17
17
 
18
18
  async purge(urls: string[]): Promise<void> {
19
19
  try {
20
- const response = await this.cfRequest(
21
- "POST",
22
- `/zones/${this.zoneId}/purge_cache`,
23
- {
24
- files: urls,
25
- },
26
- );
20
+ const response = await this.cfRequest('POST', `/zones/${this.zoneId}/purge_cache`, {
21
+ files: urls,
22
+ });
27
23
 
28
24
  if (response.success) {
29
- logger.info(
30
- `Cloudflare cache purged: ${urls.length} URLs`,
31
- "Cloudflare",
32
- );
25
+ logger.info(`Cloudflare cache purged: ${urls.length} URLs`, 'Cloudflare');
33
26
  } else {
34
- throw new Error("Cloudflare purge failed");
27
+ throw new Error('Cloudflare purge failed');
35
28
  }
36
29
  } catch (error) {
37
- logger.error("Cloudflare purge failed", "Cloudflare", { error, urls });
30
+ logger.error('Cloudflare purge failed', 'Cloudflare', { error, urls });
38
31
  throw error;
39
32
  }
40
33
  }
41
34
 
42
35
  async prefetch(urls: string[]): Promise<void> {
43
36
  try {
44
- logger.debug(
45
- `Cloudflare prefetch requested for ${urls.length} URLs`,
46
- "Cloudflare",
47
- );
37
+ logger.debug(`Cloudflare prefetch requested for ${urls.length} URLs`, 'Cloudflare');
48
38
  // Cloudflare doesn't have direct prefetch, but we can use preload links
49
39
  for (const url of urls) {
50
40
  // Implementation would depend on Cloudflare Workers or edge functions
51
41
  }
52
42
  } catch (error) {
53
- logger.error("Cloudflare prefetch failed", "Cloudflare", { error, urls });
43
+ logger.error('Cloudflare prefetch failed', 'Cloudflare', { error, urls });
54
44
  }
55
45
  }
56
46
 
57
47
  async getStats(): Promise<any> {
58
48
  try {
59
- const response = await this.cfRequest(
60
- "GET",
61
- `/zones/${this.zoneId}/analytics/dashboard`,
62
- );
49
+ const response = await this.cfRequest('GET', `/zones/${this.zoneId}/analytics/dashboard`);
63
50
  return response.result;
64
51
  } catch (error) {
65
- logger.error("Cloudflare stats failed", "Cloudflare", { error });
52
+ logger.error('Cloudflare stats failed', 'Cloudflare', { error });
66
53
  return null;
67
54
  }
68
55
  }
69
56
 
70
57
  setHeaders(response: any): void {
71
- response.setHeader("Cache-Control", "public, max-age=3600");
72
- response.setHeader("CF-Cache-Status", "DYNAMIC");
73
- response.setHeader("CF-Ray", `${Math.random().toString(36)}-DFW`);
58
+ response.setHeader('Cache-Control', 'public, max-age=3600');
59
+ response.setHeader('CF-Cache-Status', 'DYNAMIC');
60
+ response.setHeader('CF-Ray', `${Math.random().toString(36)}-DFW`);
74
61
  }
75
62
 
76
- private async cfRequest(
77
- method: string,
78
- endpoint: string,
79
- data?: any,
80
- ): Promise<any> {
63
+ private async cfRequest(method: string, endpoint: string, data?: any): Promise<any> {
81
64
  const url = `https://api.cloudflare.com/client/v4${endpoint}`;
82
65
 
83
66
  try {
@@ -89,7 +72,7 @@ export class CloudflareCDNAdapter implements CDNAdapter {
89
72
 
90
73
  return response;
91
74
  } catch (error) {
92
- logger.error("Cloudflare API request failed", "Cloudflare", {
75
+ logger.error('Cloudflare API request failed', 'Cloudflare', {
93
76
  error,
94
77
  method,
95
78
  endpoint,