@morojs/moro 1.6.8 → 1.7.0

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 (300) hide show
  1. package/README.md +3 -1
  2. package/dist/core/auth/morojs-adapter.js +16 -6
  3. package/dist/core/auth/morojs-adapter.js.map +1 -1
  4. package/dist/core/config/config-sources.js +27 -15
  5. package/dist/core/config/config-sources.js.map +1 -1
  6. package/dist/core/config/config-validator.js +201 -6
  7. package/dist/core/config/config-validator.js.map +1 -1
  8. package/dist/core/docs/openapi-generator.js +8 -9
  9. package/dist/core/docs/openapi-generator.js.map +1 -1
  10. package/dist/core/events/event-bus.js +1 -1
  11. package/dist/core/events/event-bus.js.map +1 -1
  12. package/dist/core/framework.d.ts +4 -2
  13. package/dist/core/framework.js +25 -24
  14. package/dist/core/framework.js.map +1 -1
  15. package/dist/core/graphql/core.js +34 -8
  16. package/dist/core/graphql/core.js.map +1 -1
  17. package/dist/core/grpc/adapters/grpc-js-adapter.d.ts +28 -0
  18. package/dist/core/grpc/adapters/grpc-js-adapter.js +449 -0
  19. package/dist/core/grpc/adapters/grpc-js-adapter.js.map +1 -0
  20. package/dist/core/grpc/adapters/index.d.ts +1 -0
  21. package/dist/core/grpc/adapters/index.js +6 -0
  22. package/dist/core/grpc/adapters/index.js.map +1 -0
  23. package/dist/core/grpc/grpc-adapter.d.ts +47 -0
  24. package/dist/core/grpc/grpc-adapter.js +4 -0
  25. package/dist/core/grpc/grpc-adapter.js.map +1 -0
  26. package/dist/core/grpc/grpc-manager.d.ts +59 -0
  27. package/dist/core/grpc/grpc-manager.js +218 -0
  28. package/dist/core/grpc/grpc-manager.js.map +1 -0
  29. package/dist/core/grpc/index.d.ts +7 -0
  30. package/dist/core/grpc/index.js +10 -0
  31. package/dist/core/grpc/index.js.map +1 -0
  32. package/dist/core/grpc/middleware/auth.d.ts +22 -0
  33. package/dist/core/grpc/middleware/auth.js +126 -0
  34. package/dist/core/grpc/middleware/auth.js.map +1 -0
  35. package/dist/core/grpc/middleware/logging.d.ts +19 -0
  36. package/dist/core/grpc/middleware/logging.js +57 -0
  37. package/dist/core/grpc/middleware/logging.js.map +1 -0
  38. package/dist/core/grpc/middleware/validation.d.ts +18 -0
  39. package/dist/core/grpc/middleware/validation.js +126 -0
  40. package/dist/core/grpc/middleware/validation.js.map +1 -0
  41. package/dist/core/grpc/types.d.ts +233 -0
  42. package/dist/core/grpc/types.js +36 -0
  43. package/dist/core/grpc/types.js.map +1 -0
  44. package/dist/core/http/http-server.d.ts +13 -84
  45. package/dist/core/http/http-server.js +205 -792
  46. package/dist/core/http/http-server.js.map +1 -1
  47. package/dist/core/http/http2-server.d.ts +131 -0
  48. package/dist/core/http/http2-server.js +803 -0
  49. package/dist/core/http/http2-server.js.map +1 -0
  50. package/dist/core/http/index.d.ts +3 -1
  51. package/dist/core/http/index.js +2 -1
  52. package/dist/core/http/index.js.map +1 -1
  53. package/dist/core/http/uws-http-server.js +21 -26
  54. package/dist/core/http/uws-http-server.js.map +1 -1
  55. package/dist/core/jobs/job-executor.js +6 -1
  56. package/dist/core/jobs/job-executor.js.map +1 -1
  57. package/dist/core/jobs/job-scheduler.js +4 -1
  58. package/dist/core/jobs/job-scheduler.js.map +1 -1
  59. package/dist/core/jobs/leader-election.js +2 -1
  60. package/dist/core/jobs/leader-election.js.map +1 -1
  61. package/dist/core/logger/logger.js +41 -18
  62. package/dist/core/logger/logger.js.map +1 -1
  63. package/dist/core/logger/outputs.js +9 -3
  64. package/dist/core/logger/outputs.js.map +1 -1
  65. package/dist/core/mail/adapters/console-adapter.d.ts +14 -0
  66. package/dist/core/mail/adapters/console-adapter.js +89 -0
  67. package/dist/core/mail/adapters/console-adapter.js.map +1 -0
  68. package/dist/core/mail/adapters/index.d.ts +5 -0
  69. package/dist/core/mail/adapters/index.js +8 -0
  70. package/dist/core/mail/adapters/index.js.map +1 -0
  71. package/dist/core/mail/adapters/nodemailer-adapter.d.ts +18 -0
  72. package/dist/core/mail/adapters/nodemailer-adapter.js +188 -0
  73. package/dist/core/mail/adapters/nodemailer-adapter.js.map +1 -0
  74. package/dist/core/mail/adapters/resend-adapter.d.ts +18 -0
  75. package/dist/core/mail/adapters/resend-adapter.js +169 -0
  76. package/dist/core/mail/adapters/resend-adapter.js.map +1 -0
  77. package/dist/core/mail/adapters/sendgrid-adapter.d.ts +19 -0
  78. package/dist/core/mail/adapters/sendgrid-adapter.js +186 -0
  79. package/dist/core/mail/adapters/sendgrid-adapter.js.map +1 -0
  80. package/dist/core/mail/adapters/ses-adapter.d.ts +18 -0
  81. package/dist/core/mail/adapters/ses-adapter.js +167 -0
  82. package/dist/core/mail/adapters/ses-adapter.js.map +1 -0
  83. package/dist/core/mail/index.d.ts +5 -0
  84. package/dist/core/mail/index.js +8 -0
  85. package/dist/core/mail/index.js.map +1 -0
  86. package/dist/core/mail/mail-adapter.d.ts +62 -0
  87. package/dist/core/mail/mail-adapter.js +83 -0
  88. package/dist/core/mail/mail-adapter.js.map +1 -0
  89. package/dist/core/mail/mail-manager.d.ts +63 -0
  90. package/dist/core/mail/mail-manager.js +302 -0
  91. package/dist/core/mail/mail-manager.js.map +1 -0
  92. package/dist/core/mail/template-engine.d.ts +43 -0
  93. package/dist/core/mail/template-engine.js +239 -0
  94. package/dist/core/mail/template-engine.js.map +1 -0
  95. package/dist/core/mail/types.d.ts +237 -0
  96. package/dist/core/mail/types.js +4 -0
  97. package/dist/core/mail/types.js.map +1 -0
  98. package/dist/core/middleware/built-in/body-size/core.d.ts +12 -0
  99. package/dist/core/middleware/built-in/body-size/core.js +52 -0
  100. package/dist/core/middleware/built-in/body-size/core.js.map +1 -0
  101. package/dist/core/middleware/built-in/body-size/hook.d.ts +2 -0
  102. package/dist/core/middleware/built-in/body-size/hook.js +12 -0
  103. package/dist/core/middleware/built-in/body-size/hook.js.map +1 -0
  104. package/dist/core/middleware/built-in/body-size/index.d.ts +6 -0
  105. package/dist/core/middleware/built-in/body-size/index.js +7 -0
  106. package/dist/core/middleware/built-in/body-size/index.js.map +1 -0
  107. package/dist/core/middleware/built-in/body-size/middleware.d.ts +14 -0
  108. package/dist/core/middleware/built-in/body-size/middleware.js +22 -0
  109. package/dist/core/middleware/built-in/body-size/middleware.js.map +1 -0
  110. package/dist/core/middleware/built-in/cache/core.d.ts +20 -1
  111. package/dist/core/middleware/built-in/cache/core.js.map +1 -1
  112. package/dist/core/middleware/built-in/cache/hook.d.ts +38 -1
  113. package/dist/core/middleware/built-in/cache/hook.js +202 -16
  114. package/dist/core/middleware/built-in/cache/hook.js.map +1 -1
  115. package/dist/core/middleware/built-in/cache/index.js +1 -1
  116. package/dist/core/middleware/built-in/cache/index.js.map +1 -1
  117. package/dist/core/middleware/built-in/compression/core.d.ts +16 -0
  118. package/dist/core/middleware/built-in/compression/core.js +75 -0
  119. package/dist/core/middleware/built-in/compression/core.js.map +1 -0
  120. package/dist/core/middleware/built-in/compression/hook.d.ts +2 -0
  121. package/dist/core/middleware/built-in/compression/hook.js +14 -0
  122. package/dist/core/middleware/built-in/compression/hook.js.map +1 -0
  123. package/dist/core/middleware/built-in/compression/index.d.ts +6 -0
  124. package/dist/core/middleware/built-in/compression/index.js +7 -0
  125. package/dist/core/middleware/built-in/compression/index.js.map +1 -0
  126. package/dist/core/middleware/built-in/compression/middleware.d.ts +20 -0
  127. package/dist/core/middleware/built-in/compression/middleware.js +28 -0
  128. package/dist/core/middleware/built-in/compression/middleware.js.map +1 -0
  129. package/dist/core/middleware/built-in/cookie/core.js +37 -9
  130. package/dist/core/middleware/built-in/cookie/core.js.map +1 -1
  131. package/dist/core/middleware/built-in/helmet/core.d.ts +19 -0
  132. package/dist/core/middleware/built-in/helmet/core.js +70 -0
  133. package/dist/core/middleware/built-in/helmet/core.js.map +1 -0
  134. package/dist/core/middleware/built-in/helmet/hook.d.ts +2 -0
  135. package/dist/core/middleware/built-in/helmet/hook.js +12 -0
  136. package/dist/core/middleware/built-in/helmet/hook.js.map +1 -0
  137. package/dist/core/middleware/built-in/helmet/index.d.ts +6 -0
  138. package/dist/core/middleware/built-in/helmet/index.js +7 -0
  139. package/dist/core/middleware/built-in/helmet/index.js.map +1 -0
  140. package/dist/core/middleware/built-in/helmet/middleware.d.ts +22 -0
  141. package/dist/core/middleware/built-in/helmet/middleware.js +28 -0
  142. package/dist/core/middleware/built-in/helmet/middleware.js.map +1 -0
  143. package/dist/core/middleware/built-in/http2/core.d.ts +35 -0
  144. package/dist/core/middleware/built-in/http2/core.js +128 -0
  145. package/dist/core/middleware/built-in/http2/core.js.map +1 -0
  146. package/dist/core/middleware/built-in/http2/hook.d.ts +5 -0
  147. package/dist/core/middleware/built-in/http2/hook.js +34 -0
  148. package/dist/core/middleware/built-in/http2/hook.js.map +1 -0
  149. package/dist/core/middleware/built-in/http2/index.d.ts +8 -0
  150. package/dist/core/middleware/built-in/http2/index.js +10 -0
  151. package/dist/core/middleware/built-in/http2/index.js.map +1 -0
  152. package/dist/core/middleware/built-in/http2/middleware.d.ts +20 -0
  153. package/dist/core/middleware/built-in/http2/middleware.js +31 -0
  154. package/dist/core/middleware/built-in/http2/middleware.js.map +1 -0
  155. package/dist/core/middleware/built-in/index.d.ts +18 -0
  156. package/dist/core/middleware/built-in/index.js +28 -0
  157. package/dist/core/middleware/built-in/index.js.map +1 -1
  158. package/dist/core/middleware/built-in/range/core.d.ts +16 -0
  159. package/dist/core/middleware/built-in/range/core.js +112 -0
  160. package/dist/core/middleware/built-in/range/core.js.map +1 -0
  161. package/dist/core/middleware/built-in/range/hook.d.ts +2 -0
  162. package/dist/core/middleware/built-in/range/hook.js +12 -0
  163. package/dist/core/middleware/built-in/range/hook.js.map +1 -0
  164. package/dist/core/middleware/built-in/range/index.d.ts +6 -0
  165. package/dist/core/middleware/built-in/range/index.js +7 -0
  166. package/dist/core/middleware/built-in/range/index.js.map +1 -0
  167. package/dist/core/middleware/built-in/range/middleware.d.ts +21 -0
  168. package/dist/core/middleware/built-in/range/middleware.js +27 -0
  169. package/dist/core/middleware/built-in/range/middleware.js.map +1 -0
  170. package/dist/core/middleware/built-in/session/core.js +14 -1
  171. package/dist/core/middleware/built-in/session/core.js.map +1 -1
  172. package/dist/core/middleware/built-in/static/core.d.ts +20 -0
  173. package/dist/core/middleware/built-in/static/core.js +143 -0
  174. package/dist/core/middleware/built-in/static/core.js.map +1 -0
  175. package/dist/core/middleware/built-in/static/hook.d.ts +2 -0
  176. package/dist/core/middleware/built-in/static/hook.js +12 -0
  177. package/dist/core/middleware/built-in/static/hook.js.map +1 -0
  178. package/dist/core/middleware/built-in/static/index.d.ts +6 -0
  179. package/dist/core/middleware/built-in/static/index.js +7 -0
  180. package/dist/core/middleware/built-in/static/index.js.map +1 -0
  181. package/dist/core/middleware/built-in/static/middleware.d.ts +18 -0
  182. package/dist/core/middleware/built-in/static/middleware.js +26 -0
  183. package/dist/core/middleware/built-in/static/middleware.js.map +1 -0
  184. package/dist/core/middleware/built-in/template/core.d.ts +19 -0
  185. package/dist/core/middleware/built-in/template/core.js +108 -0
  186. package/dist/core/middleware/built-in/template/core.js.map +1 -0
  187. package/dist/core/middleware/built-in/template/hook.d.ts +2 -0
  188. package/dist/core/middleware/built-in/template/hook.js +12 -0
  189. package/dist/core/middleware/built-in/template/hook.js.map +1 -0
  190. package/dist/core/middleware/built-in/template/index.d.ts +6 -0
  191. package/dist/core/middleware/built-in/template/index.js +7 -0
  192. package/dist/core/middleware/built-in/template/index.js.map +1 -0
  193. package/dist/core/middleware/built-in/template/middleware.d.ts +21 -0
  194. package/dist/core/middleware/built-in/template/middleware.js +27 -0
  195. package/dist/core/middleware/built-in/template/middleware.js.map +1 -0
  196. package/dist/core/middleware/built-in/upload/core.d.ts +29 -0
  197. package/dist/core/middleware/built-in/upload/core.js +66 -0
  198. package/dist/core/middleware/built-in/upload/core.js.map +1 -0
  199. package/dist/core/middleware/built-in/upload/hook.d.ts +2 -0
  200. package/dist/core/middleware/built-in/upload/hook.js +25 -0
  201. package/dist/core/middleware/built-in/upload/hook.js.map +1 -0
  202. package/dist/core/middleware/built-in/upload/index.d.ts +6 -0
  203. package/dist/core/middleware/built-in/upload/index.js +7 -0
  204. package/dist/core/middleware/built-in/upload/index.js.map +1 -0
  205. package/dist/core/middleware/built-in/upload/middleware.d.ts +18 -0
  206. package/dist/core/middleware/built-in/upload/middleware.js +41 -0
  207. package/dist/core/middleware/built-in/upload/middleware.js.map +1 -0
  208. package/dist/core/middleware/built-in/validation/middleware.js +2 -1
  209. package/dist/core/middleware/built-in/validation/middleware.js.map +1 -1
  210. package/dist/core/networking/adapters/uws-adapter.js +54 -6
  211. package/dist/core/networking/adapters/uws-adapter.js.map +1 -1
  212. package/dist/core/networking/adapters/ws-adapter.js +56 -17
  213. package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
  214. package/dist/core/pooling/object-pool-manager.js +9 -1
  215. package/dist/core/pooling/object-pool-manager.js.map +1 -1
  216. package/dist/core/queue/adapters/bull-adapter.d.ts +86 -0
  217. package/dist/core/queue/adapters/bull-adapter.js +330 -0
  218. package/dist/core/queue/adapters/bull-adapter.js.map +1 -0
  219. package/dist/core/queue/adapters/index.d.ts +9 -0
  220. package/dist/core/queue/adapters/index.js +10 -0
  221. package/dist/core/queue/adapters/index.js.map +1 -0
  222. package/dist/core/queue/adapters/kafka-adapter.d.ts +86 -0
  223. package/dist/core/queue/adapters/kafka-adapter.js +462 -0
  224. package/dist/core/queue/adapters/kafka-adapter.js.map +1 -0
  225. package/dist/core/queue/adapters/memory-adapter.d.ts +87 -0
  226. package/dist/core/queue/adapters/memory-adapter.js +415 -0
  227. package/dist/core/queue/adapters/memory-adapter.js.map +1 -0
  228. package/dist/core/queue/adapters/rabbitmq-adapter.d.ts +86 -0
  229. package/dist/core/queue/adapters/rabbitmq-adapter.js +436 -0
  230. package/dist/core/queue/adapters/rabbitmq-adapter.js.map +1 -0
  231. package/dist/core/queue/adapters/sqs-adapter.d.ts +102 -0
  232. package/dist/core/queue/adapters/sqs-adapter.js +522 -0
  233. package/dist/core/queue/adapters/sqs-adapter.js.map +1 -0
  234. package/dist/core/queue/index.d.ts +11 -0
  235. package/dist/core/queue/index.js +14 -0
  236. package/dist/core/queue/index.js.map +1 -0
  237. package/dist/core/queue/middleware/index.d.ts +7 -0
  238. package/dist/core/queue/middleware/index.js +8 -0
  239. package/dist/core/queue/middleware/index.js.map +1 -0
  240. package/dist/core/queue/middleware/monitoring.d.ts +84 -0
  241. package/dist/core/queue/middleware/monitoring.js +145 -0
  242. package/dist/core/queue/middleware/monitoring.js.map +1 -0
  243. package/dist/core/queue/middleware/priority.d.ts +61 -0
  244. package/dist/core/queue/middleware/priority.js +90 -0
  245. package/dist/core/queue/middleware/priority.js.map +1 -0
  246. package/dist/core/queue/middleware/rate-limit.d.ts +34 -0
  247. package/dist/core/queue/middleware/rate-limit.js +109 -0
  248. package/dist/core/queue/middleware/rate-limit.js.map +1 -0
  249. package/dist/core/queue/queue-adapter.d.ts +73 -0
  250. package/dist/core/queue/queue-adapter.js +20 -0
  251. package/dist/core/queue/queue-adapter.js.map +1 -0
  252. package/dist/core/queue/queue-manager.d.ts +92 -0
  253. package/dist/core/queue/queue-manager.js +327 -0
  254. package/dist/core/queue/queue-manager.js.map +1 -0
  255. package/dist/core/queue/types.d.ts +205 -0
  256. package/dist/core/queue/types.js +6 -0
  257. package/dist/core/queue/types.js.map +1 -0
  258. package/dist/core/routing/index.js +41 -10
  259. package/dist/core/routing/index.js.map +1 -1
  260. package/dist/core/routing/radix-tree.d.ts +48 -0
  261. package/dist/core/routing/radix-tree.js +211 -0
  262. package/dist/core/routing/radix-tree.js.map +1 -0
  263. package/dist/core/routing/router.d.ts +10 -9
  264. package/dist/core/routing/router.js +3 -1
  265. package/dist/core/routing/router.js.map +1 -1
  266. package/dist/core/routing/unified-router.d.ts +18 -12
  267. package/dist/core/routing/unified-router.js +220 -163
  268. package/dist/core/routing/unified-router.js.map +1 -1
  269. package/dist/core/runtime/aws-lambda-adapter.js +21 -10
  270. package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
  271. package/dist/core/runtime/base-adapter.js +15 -5
  272. package/dist/core/runtime/base-adapter.js.map +1 -1
  273. package/dist/core/runtime/cloudflare-workers-adapter.js +35 -12
  274. package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
  275. package/dist/core/runtime/vercel-edge-adapter.js +16 -6
  276. package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
  277. package/dist/core/utilities/container.js +3 -1
  278. package/dist/core/utilities/container.js.map +1 -1
  279. package/dist/core/workers/facade.d.ts +74 -0
  280. package/dist/core/workers/facade.js +98 -0
  281. package/dist/core/workers/facade.js.map +1 -0
  282. package/dist/core/workers/index.d.ts +2 -0
  283. package/dist/core/workers/index.js +6 -0
  284. package/dist/core/workers/index.js.map +1 -0
  285. package/dist/core/workers/worker-manager.d.ts +124 -0
  286. package/dist/core/workers/worker-manager.js +299 -0
  287. package/dist/core/workers/worker-manager.js.map +1 -0
  288. package/dist/core/workers/worker.d.ts +1 -0
  289. package/dist/core/workers/worker.js +225 -0
  290. package/dist/core/workers/worker.js.map +1 -0
  291. package/dist/index.d.ts +8 -1
  292. package/dist/index.js +6 -1
  293. package/dist/index.js.map +1 -1
  294. package/dist/moro.d.ts +345 -13
  295. package/dist/moro.js +803 -214
  296. package/dist/moro.js.map +1 -1
  297. package/dist/types/cache.d.ts +4 -0
  298. package/dist/types/config.d.ts +42 -0
  299. package/dist/types/core.d.ts +18 -1
  300. package/package.json +94 -20
@@ -0,0 +1,239 @@
1
+ // Email Template Engine
2
+ // ESM-first module with support for Moro, Handlebars, and EJS
3
+ import fs from 'fs/promises';
4
+ import path from 'path';
5
+ import { isPackageAvailable, resolveUserPackage } from '../utilities/package-utils.js';
6
+ /**
7
+ * Moro built-in template engine
8
+ * Supports: {{variable}}, {{#if}}, {{#each}}, partials
9
+ */
10
+ class MoroTemplateEngine {
11
+ compiled = new Map();
12
+ partials = new Map();
13
+ async render(template, data) {
14
+ // Replace partials first
15
+ let processed = this.processPartials(template);
16
+ // Process conditionals
17
+ processed = this.processConditionals(processed, data);
18
+ // Process loops
19
+ processed = this.processLoops(processed, data);
20
+ // Process variables
21
+ processed = this.processVariables(processed, data);
22
+ return processed;
23
+ }
24
+ compile(template) {
25
+ return (data) => {
26
+ let processed = this.processPartials(template);
27
+ processed = this.processConditionals(processed, data);
28
+ processed = this.processLoops(processed, data);
29
+ processed = this.processVariables(processed, data);
30
+ return processed;
31
+ };
32
+ }
33
+ registerPartial(name, template) {
34
+ this.partials.set(name, template);
35
+ }
36
+ processPartials(template) {
37
+ return template.replace(/\{\{>\s*(\w+)\s*\}\}/g, (_, name) => {
38
+ return this.partials.get(name) || '';
39
+ });
40
+ }
41
+ processConditionals(template, data) {
42
+ return template.replace(/\{\{#if\s+(\w+)\}\}([\s\S]*?)(?:\{\{else\}\}([\s\S]*?))?\{\{\/if\}\}/g, (_, condition, truthy, falsy = '') => {
43
+ const value = this.getValue(data, condition);
44
+ return value ? truthy : falsy;
45
+ });
46
+ }
47
+ processLoops(template, data) {
48
+ return template.replace(/\{\{#each\s+(\w+)\}\}([\s\S]*?)\{\{\/each\}\}/g, (_, arrayName, body) => {
49
+ const array = this.getValue(data, arrayName);
50
+ if (!Array.isArray(array)) {
51
+ return '';
52
+ }
53
+ return array
54
+ .map((item) => {
55
+ let itemBody = body;
56
+ if (typeof item === 'object') {
57
+ for (const [key, value] of Object.entries(item)) {
58
+ const regex = new RegExp(`\\{\\{${key}\\}\\}`, 'g');
59
+ itemBody = itemBody.replace(regex, String(value));
60
+ }
61
+ }
62
+ else {
63
+ itemBody = itemBody.replace(/\{\{this\}\}/g, String(item));
64
+ }
65
+ return itemBody;
66
+ })
67
+ .join('');
68
+ });
69
+ }
70
+ processVariables(template, data) {
71
+ return template.replace(/\{\{(\w+(?:\.\w+)*)\}\}/g, (_, key) => {
72
+ const value = this.getValue(data, key);
73
+ return value !== undefined && value !== null ? String(value) : '';
74
+ });
75
+ }
76
+ getValue(data, path) {
77
+ const keys = path.split('.');
78
+ let value = data;
79
+ for (const key of keys) {
80
+ if (!value || typeof value !== 'object') {
81
+ return undefined;
82
+ }
83
+ value = value[key];
84
+ }
85
+ return value;
86
+ }
87
+ }
88
+ /**
89
+ * Main template engine manager
90
+ */
91
+ export class TemplateEngineManager {
92
+ config;
93
+ engine;
94
+ cache = new Map();
95
+ engineType;
96
+ constructor(config = {}) {
97
+ this.config = {
98
+ engine: 'moro',
99
+ cache: true,
100
+ ...config,
101
+ };
102
+ this.engineType = this.config.engine || 'moro';
103
+ this.engine = this.createEngine(this.engineType);
104
+ }
105
+ /**
106
+ * Create template engine instance
107
+ */
108
+ createEngine(type) {
109
+ if (type === 'moro') {
110
+ return new MoroTemplateEngine();
111
+ }
112
+ throw new Error(`Template engine "${type}" will be lazy loaded when needed`);
113
+ }
114
+ /**
115
+ * Render a template file with data
116
+ */
117
+ async renderFile(templateName, data) {
118
+ if (!this.config.path) {
119
+ throw new Error('Template path not configured');
120
+ }
121
+ const cacheKey = `${templateName}:${this.engineType}`;
122
+ if (!this.config.cache || !this.cache.has(cacheKey)) {
123
+ const templatePath = path.join(this.config.path, `${templateName}.html`);
124
+ try {
125
+ const template = await fs.readFile(templatePath, 'utf-8');
126
+ if (this.config.cache && this.engine.compile) {
127
+ this.cache.set(cacheKey, this.engine.compile(template));
128
+ }
129
+ }
130
+ catch {
131
+ throw new Error(`Template file not found: ${templatePath}`);
132
+ }
133
+ }
134
+ if (this.config.cache && this.cache.has(cacheKey)) {
135
+ const compiled = this.cache.get(cacheKey);
136
+ const html = compiled(data);
137
+ return { html };
138
+ }
139
+ const templatePath = path.join(this.config.path, `${templateName}.html`);
140
+ const template = await fs.readFile(templatePath, 'utf-8');
141
+ const html = await this.engine.render(template, data);
142
+ return { html };
143
+ }
144
+ /**
145
+ * Render a template string with data
146
+ */
147
+ async renderString(template, data) {
148
+ return await this.engine.render(template, data);
149
+ }
150
+ /**
151
+ * Load external template engine (Handlebars, EJS)
152
+ */
153
+ async loadExternalEngine(type) {
154
+ if (type === 'moro') {
155
+ return;
156
+ }
157
+ if (type === 'handlebars') {
158
+ if (!isPackageAvailable('handlebars')) {
159
+ throw new Error('Handlebars is not installed.\n' + 'Install it with: npm install handlebars');
160
+ }
161
+ const handlebarsPath = resolveUserPackage('handlebars');
162
+ const Handlebars = await import(handlebarsPath);
163
+ this.engine = {
164
+ render: async (template, data) => {
165
+ const compiledTemplate = Handlebars.default.compile(template);
166
+ return compiledTemplate(data);
167
+ },
168
+ compile: (template) => {
169
+ return Handlebars.default.compile(template);
170
+ },
171
+ registerHelper: (name, fn) => {
172
+ Handlebars.default.registerHelper(name, fn);
173
+ },
174
+ registerPartial: (name, template) => {
175
+ Handlebars.default.registerPartial(name, template);
176
+ },
177
+ };
178
+ }
179
+ else if (type === 'ejs') {
180
+ if (!isPackageAvailable('ejs')) {
181
+ throw new Error('EJS is not installed.\n' + 'Install it with: npm install ejs');
182
+ }
183
+ const ejsPath = resolveUserPackage('ejs');
184
+ const ejs = await import(ejsPath);
185
+ this.engine = {
186
+ render: async (template, data) => {
187
+ return ejs.default.render(template, data);
188
+ },
189
+ compile: (template) => {
190
+ return ejs.default.compile(template);
191
+ },
192
+ };
193
+ }
194
+ }
195
+ /**
196
+ * Register a helper function
197
+ */
198
+ registerHelper(name, fn) {
199
+ if (this.engine.registerHelper) {
200
+ this.engine.registerHelper(name, fn);
201
+ }
202
+ }
203
+ /**
204
+ * Register a partial template
205
+ */
206
+ registerPartial(name, template) {
207
+ if (this.engine.registerPartial) {
208
+ this.engine.registerPartial(name, template);
209
+ }
210
+ }
211
+ /**
212
+ * Clear template cache
213
+ */
214
+ clearCache() {
215
+ this.cache.clear();
216
+ }
217
+ /**
218
+ * Load partials from directory
219
+ */
220
+ async loadPartials() {
221
+ if (!this.config.partials) {
222
+ return;
223
+ }
224
+ try {
225
+ const files = await fs.readdir(this.config.partials);
226
+ for (const file of files) {
227
+ if (file.endsWith('.html')) {
228
+ const name = file.replace('.html', '');
229
+ const content = await fs.readFile(path.join(this.config.partials, file), 'utf-8');
230
+ this.registerPartial(name, content);
231
+ }
232
+ }
233
+ }
234
+ catch {
235
+ // Partials directory doesn't exist or can't be read
236
+ }
237
+ }
238
+ }
239
+ //# sourceMappingURL=template-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-engine.js","sourceRoot":"","sources":["../../../src/core/mail/template-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,237 @@
1
+ /**
2
+ * Email address representation
3
+ */
4
+ export interface EmailAddress {
5
+ name?: string;
6
+ email: string;
7
+ }
8
+ /**
9
+ * Email attachment
10
+ */
11
+ export interface EmailAttachment {
12
+ filename: string;
13
+ content: Buffer | string;
14
+ encoding?: string;
15
+ contentType?: string;
16
+ cid?: string;
17
+ }
18
+ /**
19
+ * Core email options
20
+ */
21
+ export interface MailOptions {
22
+ to: string | string[] | EmailAddress | EmailAddress[];
23
+ from?: string | EmailAddress;
24
+ subject: string;
25
+ text?: string;
26
+ html?: string;
27
+ template?: string;
28
+ data?: Record<string, any>;
29
+ cc?: string | string[] | EmailAddress | EmailAddress[];
30
+ bcc?: string | string[] | EmailAddress | EmailAddress[];
31
+ replyTo?: string | EmailAddress;
32
+ attachments?: EmailAttachment[];
33
+ headers?: Record<string, string>;
34
+ priority?: 'high' | 'normal' | 'low';
35
+ messageId?: string;
36
+ references?: string | string[];
37
+ inReplyTo?: string;
38
+ sender?: string | EmailAddress;
39
+ returnPath?: string;
40
+ listUnsubscribe?: string | string[];
41
+ listUnsubscribePost?: string;
42
+ listId?: string;
43
+ listHelp?: string;
44
+ listSubscribe?: string;
45
+ listOwner?: string;
46
+ listArchive?: string;
47
+ dsn?: {
48
+ notify?: 'never' | 'success' | 'failure' | 'delay';
49
+ returnFull?: boolean;
50
+ returnHeaders?: boolean;
51
+ };
52
+ encoding?: string;
53
+ textEncoding?: string;
54
+ date?: Date;
55
+ messageIdDomain?: string;
56
+ tags?: string[];
57
+ metadata?: Record<string, string>;
58
+ scheduledAt?: Date;
59
+ }
60
+ /**
61
+ * Email send result
62
+ */
63
+ export interface MailResult {
64
+ success: boolean;
65
+ messageId?: string;
66
+ error?: string;
67
+ accepted?: string[];
68
+ rejected?: string[];
69
+ response?: string;
70
+ }
71
+ /**
72
+ * Adapter types
73
+ */
74
+ export type MailAdapterType = 'nodemailer' | 'sendgrid' | 'ses' | 'resend' | 'console';
75
+ /**
76
+ * Template engine types
77
+ */
78
+ export type TemplateEngine = 'moro' | 'handlebars' | 'ejs';
79
+ /**
80
+ * Template configuration
81
+ */
82
+ export interface TemplateConfig {
83
+ path?: string;
84
+ engine?: TemplateEngine;
85
+ cache?: boolean;
86
+ partials?: string;
87
+ layouts?: string;
88
+ helpers?: Record<string, (...args: any[]) => any>;
89
+ }
90
+ /**
91
+ * Queue configuration for async email sending
92
+ */
93
+ export interface MailQueueConfig {
94
+ enabled?: boolean;
95
+ name?: string;
96
+ priority?: number;
97
+ delay?: number;
98
+ attempts?: number;
99
+ }
100
+ /**
101
+ * Mail manager configuration
102
+ */
103
+ export interface MailConfig {
104
+ adapter?: MailAdapterType | string;
105
+ from?: string | EmailAddress;
106
+ connection?: any;
107
+ templates?: TemplateConfig;
108
+ queue?: MailQueueConfig;
109
+ debug?: boolean;
110
+ }
111
+ /**
112
+ * Nodemailer-specific connection options
113
+ */
114
+ export interface NodemailerConnection {
115
+ host?: string;
116
+ port?: number;
117
+ secure?: boolean;
118
+ auth?: {
119
+ user: string;
120
+ pass: string;
121
+ };
122
+ service?: string;
123
+ pool?: boolean;
124
+ maxConnections?: number;
125
+ maxMessages?: number;
126
+ }
127
+ /**
128
+ * SendGrid-specific connection options
129
+ */
130
+ export interface SendGridConnection {
131
+ apiKey: string;
132
+ sandboxMode?: boolean;
133
+ }
134
+ /**
135
+ * AWS SES-specific connection options
136
+ */
137
+ export interface SESConnection {
138
+ region: string;
139
+ accessKeyId?: string;
140
+ secretAccessKey?: string;
141
+ credentials?: any;
142
+ configurationSet?: string;
143
+ }
144
+ /**
145
+ * Resend-specific connection options
146
+ */
147
+ export interface ResendConnection {
148
+ apiKey: string;
149
+ }
150
+ /**
151
+ * Template render result
152
+ */
153
+ export interface TemplateResult {
154
+ html?: string;
155
+ text?: string;
156
+ }
157
+ /**
158
+ * Base mail adapter interface
159
+ */
160
+ export interface MailAdapter {
161
+ /**
162
+ * Initialize the adapter with configuration
163
+ */
164
+ initialize(config: any): Promise<void>;
165
+ /**
166
+ * Send an email
167
+ */
168
+ send(options: MailOptions): Promise<MailResult>;
169
+ /**
170
+ * Send multiple emails in bulk
171
+ */
172
+ sendBulk?(options: MailOptions[]): Promise<MailResult[]>;
173
+ /**
174
+ * Verify adapter connection
175
+ */
176
+ verify?(): Promise<boolean>;
177
+ /**
178
+ * Close adapter connections
179
+ */
180
+ close?(): Promise<void>;
181
+ /**
182
+ * Get adapter name
183
+ */
184
+ getName(): string;
185
+ }
186
+ /**
187
+ * Template engine interface
188
+ */
189
+ export interface TemplateEngineInterface {
190
+ /**
191
+ * Render a template with data
192
+ */
193
+ render(template: string, data: Record<string, any>): Promise<string>;
194
+ /**
195
+ * Compile a template for caching
196
+ */
197
+ compile?(template: string): any;
198
+ /**
199
+ * Register a helper function
200
+ */
201
+ registerHelper?(name: string, fn: (...args: any[]) => any): void;
202
+ /**
203
+ * Register a partial template
204
+ */
205
+ registerPartial?(name: string, template: string): void;
206
+ }
207
+ /**
208
+ * Mail events
209
+ */
210
+ export interface MailEvents {
211
+ 'mail:configured': {
212
+ config: MailConfig;
213
+ };
214
+ 'mail:sending': {
215
+ options: MailOptions;
216
+ };
217
+ 'mail:sent': {
218
+ result: MailResult;
219
+ options: MailOptions;
220
+ };
221
+ 'mail:failed': {
222
+ error: Error;
223
+ options: MailOptions;
224
+ };
225
+ 'mail:queued': {
226
+ jobId: string;
227
+ options: MailOptions;
228
+ };
229
+ 'template:rendered': {
230
+ template: string;
231
+ data: Record<string, any>;
232
+ };
233
+ 'template:error': {
234
+ error: Error;
235
+ template: string;
236
+ };
237
+ }
@@ -0,0 +1,4 @@
1
+ // Email System Types
2
+ // ESM-first module with full TypeScript support
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/mail/types.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,gDAAgD"}
@@ -0,0 +1,12 @@
1
+ import { HttpRequest, HttpResponse } from '../../../../types/http.js';
2
+ export interface BodySizeOptions {
3
+ limit?: string | number;
4
+ }
5
+ export declare class BodySizeCore {
6
+ private limitBytes;
7
+ constructor(options?: BodySizeOptions);
8
+ private parseSize;
9
+ checkBodySize(req: HttpRequest, res: HttpResponse): boolean;
10
+ private formatSize;
11
+ getLimit(): number;
12
+ }
@@ -0,0 +1,52 @@
1
+ export class BodySizeCore {
2
+ limitBytes;
3
+ constructor(options = {}) {
4
+ this.limitBytes = this.parseSize(options.limit || '10mb');
5
+ }
6
+ parseSize(size) {
7
+ if (typeof size === 'number') {
8
+ return size;
9
+ }
10
+ const units = {
11
+ b: 1,
12
+ kb: 1024,
13
+ mb: 1024 * 1024,
14
+ gb: 1024 * 1024 * 1024,
15
+ };
16
+ const match = size.toLowerCase().match(/^(\d+(?:\.\d+)?)\s*(b|kb|mb|gb)?$/);
17
+ if (!match)
18
+ return 10 * 1024 * 1024; // Default 10MB
19
+ const value = parseFloat(match[1]);
20
+ const unit = match[2] || 'b';
21
+ return Math.round(value * units[unit]);
22
+ }
23
+ checkBodySize(req, res) {
24
+ const contentLength = parseInt(req.headers['content-length'] || '0');
25
+ if (contentLength > this.limitBytes) {
26
+ res.status(413).json({
27
+ success: false,
28
+ error: 'Request entity too large',
29
+ limit: this.formatSize(this.limitBytes),
30
+ received: this.formatSize(contentLength),
31
+ });
32
+ return false;
33
+ }
34
+ return true;
35
+ }
36
+ formatSize(bytes) {
37
+ if (bytes >= 1024 * 1024 * 1024) {
38
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)}GB`;
39
+ }
40
+ else if (bytes >= 1024 * 1024) {
41
+ return `${(bytes / (1024 * 1024)).toFixed(2)}MB`;
42
+ }
43
+ else if (bytes >= 1024) {
44
+ return `${(bytes / 1024).toFixed(2)}KB`;
45
+ }
46
+ return `${bytes}B`;
47
+ }
48
+ getLimit() {
49
+ return this.limitBytes;
50
+ }
51
+ }
52
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/body-size/core.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,YAAY;IACf,UAAU,CAAS;IAE3B,YAAY,UAA2B,EAAE;QACvC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC;IAC5D,CAAC;IAEO,SAAS,CAAC,IAAqB;QACrC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAA8B;YACvC,CAAC,EAAE,CAAC;YACJ,EAAE,EAAE,IAAI;YACR,EAAE,EAAE,IAAI,GAAG,IAAI;YACf,EAAE,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI;SACvB,CAAC;QAEF,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAC5E,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,eAAe;QAEpD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;QAE7B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,aAAa,CAAC,GAAgB,EAAE,GAAiB;QAC/C,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,CAAC;QAErE,IAAI,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACpC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,0BAA0B;gBACjC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;gBACvC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;aACzC,CAAC,CAAC;YACH,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,UAAU,CAAC,KAAa;QAC9B,IAAI,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;YAChC,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1D,CAAC;aAAM,IAAI,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;YAChC,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QACnD,CAAC;aAAM,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YACzB,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1C,CAAC;QACD,OAAO,GAAG,KAAK,GAAG,CAAC;IACrB,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ import { BodySizeOptions } from './core.js';
2
+ export declare function registerBodySizeHooks(hookManager: any, options?: BodySizeOptions): void;
@@ -0,0 +1,12 @@
1
+ // Body Size Hook Integration
2
+ import { BodySizeCore } from './core.js';
3
+ export function registerBodySizeHooks(hookManager, options = {}) {
4
+ const core = new BodySizeCore(options);
5
+ hookManager.on('request', async (context) => {
6
+ const { request, response } = context;
7
+ if (!request || !response)
8
+ return;
9
+ core.checkBodySize(request, response);
10
+ });
11
+ }
12
+ //# sourceMappingURL=hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/body-size/hook.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,EAAE,YAAY,EAAmB,MAAM,WAAW,CAAC;AAE1D,MAAM,UAAU,qBAAqB,CAAC,WAAgB,EAAE,UAA2B,EAAE;IACnF,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;IAEvC,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,OAAY,EAAE,EAAE;QAC/C,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QACtC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;YAAE,OAAO;QAElC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { BodySizeCore } from './core.js';
2
+ export type { BodySizeOptions } from './core.js';
3
+ export { createBodySizeMiddleware } from './middleware.js';
4
+ export { registerBodySizeHooks } from './hook.js';
5
+ import { createBodySizeMiddleware } from './middleware.js';
6
+ export declare const bodySize: typeof createBodySizeMiddleware;
@@ -0,0 +1,7 @@
1
+ // Body Size Middleware - Centralized Exports
2
+ export { BodySizeCore } from './core.js';
3
+ export { createBodySizeMiddleware } from './middleware.js';
4
+ export { registerBodySizeHooks } from './hook.js';
5
+ import { createBodySizeMiddleware } from './middleware.js';
6
+ export const bodySize = createBodySizeMiddleware;
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/body-size/index.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAElD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAE3D,MAAM,CAAC,MAAM,QAAQ,GAAG,wBAAwB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { Middleware } from '../../../../types/http.js';
2
+ import { BodySizeOptions } from './core.js';
3
+ /**
4
+ * Create body size limit middleware
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { bodySize } from '@morojs/moro';
9
+ *
10
+ * app.use(bodySize({ limit: '10mb' }));
11
+ * app.use(bodySize({ limit: 1024 * 1024 * 5 })); // 5MB
12
+ * ```
13
+ */
14
+ export declare function createBodySizeMiddleware(options?: BodySizeOptions): Middleware;
@@ -0,0 +1,22 @@
1
+ import { BodySizeCore } from './core.js';
2
+ /**
3
+ * Create body size limit middleware
4
+ *
5
+ * @example
6
+ * ```typescript
7
+ * import { bodySize } from '@morojs/moro';
8
+ *
9
+ * app.use(bodySize({ limit: '10mb' }));
10
+ * app.use(bodySize({ limit: 1024 * 1024 * 5 })); // 5MB
11
+ * ```
12
+ */
13
+ export function createBodySizeMiddleware(options = {}) {
14
+ const core = new BodySizeCore(options);
15
+ return (req, res, next) => {
16
+ if (!core.checkBodySize(req, res)) {
17
+ return; // Request rejected
18
+ }
19
+ next();
20
+ };
21
+ }
22
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/body-size/middleware.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAmB,MAAM,WAAW,CAAC;AAE1D;;;;;;;;;;GAUG;AACH,MAAM,UAAU,wBAAwB,CAAC,UAA2B,EAAE;IACpE,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;IAEvC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACxB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,mBAAmB;QAC7B,CAAC;QACD,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC"}
@@ -1,5 +1,24 @@
1
1
  import { HttpRequest, HttpResponse } from '../../../../types/http.js';
2
- export interface CacheConfig {
2
+ /**
3
+ * HTTP Caching Options for Cache-Control, ETags, etc.
4
+ */
5
+ export interface HttpCachingOptions {
6
+ /** Enable HTTP caching headers (default: true) */
7
+ httpCaching?: boolean;
8
+ /** Default max-age for Cache-Control header (seconds) */
9
+ maxAge?: number;
10
+ /** Cache-Control header (overrides maxAge if provided) */
11
+ cacheControl?: string;
12
+ /** Vary header for proper caching */
13
+ vary?: string[];
14
+ /** Enable ETag generation (default: true) */
15
+ etag?: boolean | 'strong' | 'weak';
16
+ /** Enable conditional request handling (default: true) */
17
+ conditionalRequests?: boolean;
18
+ /** Custom ETag generator function */
19
+ generateETag?: (content: string, type?: string) => string;
20
+ }
21
+ export interface CacheConfig extends HttpCachingOptions {
3
22
  ttl: number;
4
23
  key?: string;
5
24
  tags?: string[];