@morojs/moro 1.0.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 (345) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +233 -0
  3. package/dist/core/config/index.d.ts +19 -0
  4. package/dist/core/config/index.js +59 -0
  5. package/dist/core/config/index.js.map +1 -0
  6. package/dist/core/config/loader.d.ts +6 -0
  7. package/dist/core/config/loader.js +288 -0
  8. package/dist/core/config/loader.js.map +1 -0
  9. package/dist/core/config/schema.d.ts +335 -0
  10. package/dist/core/config/schema.js +286 -0
  11. package/dist/core/config/schema.js.map +1 -0
  12. package/dist/core/config/utils.d.ts +50 -0
  13. package/dist/core/config/utils.js +185 -0
  14. package/dist/core/config/utils.js.map +1 -0
  15. package/dist/core/database/adapters/drizzle.d.ts +29 -0
  16. package/dist/core/database/adapters/drizzle.js +366 -0
  17. package/dist/core/database/adapters/drizzle.js.map +1 -0
  18. package/dist/core/database/adapters/index.d.ts +8 -0
  19. package/dist/core/database/adapters/index.js +48 -0
  20. package/dist/core/database/adapters/index.js.map +1 -0
  21. package/dist/core/database/adapters/mongodb.d.ts +35 -0
  22. package/dist/core/database/adapters/mongodb.js +215 -0
  23. package/dist/core/database/adapters/mongodb.js.map +1 -0
  24. package/dist/core/database/adapters/mysql.d.ts +23 -0
  25. package/dist/core/database/adapters/mysql.js +149 -0
  26. package/dist/core/database/adapters/mysql.js.map +1 -0
  27. package/dist/core/database/adapters/postgresql.d.ts +24 -0
  28. package/dist/core/database/adapters/postgresql.js +160 -0
  29. package/dist/core/database/adapters/postgresql.js.map +1 -0
  30. package/dist/core/database/adapters/redis.d.ts +50 -0
  31. package/dist/core/database/adapters/redis.js +266 -0
  32. package/dist/core/database/adapters/redis.js.map +1 -0
  33. package/dist/core/database/adapters/sqlite.d.ts +23 -0
  34. package/dist/core/database/adapters/sqlite.js +194 -0
  35. package/dist/core/database/adapters/sqlite.js.map +1 -0
  36. package/dist/core/database/index.d.ts +2 -0
  37. package/dist/core/database/index.js +20 -0
  38. package/dist/core/database/index.js.map +1 -0
  39. package/dist/core/docs/index.d.ts +63 -0
  40. package/dist/core/docs/index.js +170 -0
  41. package/dist/core/docs/index.js.map +1 -0
  42. package/dist/core/docs/openapi-generator.d.ts +124 -0
  43. package/dist/core/docs/openapi-generator.js +413 -0
  44. package/dist/core/docs/openapi-generator.js.map +1 -0
  45. package/dist/core/docs/simple-docs.d.ts +21 -0
  46. package/dist/core/docs/simple-docs.js +268 -0
  47. package/dist/core/docs/simple-docs.js.map +1 -0
  48. package/dist/core/docs/swagger-ui.d.ts +28 -0
  49. package/dist/core/docs/swagger-ui.js +317 -0
  50. package/dist/core/docs/swagger-ui.js.map +1 -0
  51. package/dist/core/docs/zod-to-openapi.d.ts +29 -0
  52. package/dist/core/docs/zod-to-openapi.js +414 -0
  53. package/dist/core/docs/zod-to-openapi.js.map +1 -0
  54. package/dist/core/events/event-bus.d.ts +27 -0
  55. package/dist/core/events/event-bus.js +193 -0
  56. package/dist/core/events/event-bus.js.map +1 -0
  57. package/dist/core/events/index.d.ts +2 -0
  58. package/dist/core/events/index.js +7 -0
  59. package/dist/core/events/index.js.map +1 -0
  60. package/dist/core/framework.d.ts +57 -0
  61. package/dist/core/framework.js +432 -0
  62. package/dist/core/framework.js.map +1 -0
  63. package/dist/core/http/http-server.d.ts +114 -0
  64. package/dist/core/http/http-server.js +1154 -0
  65. package/dist/core/http/http-server.js.map +1 -0
  66. package/dist/core/http/index.d.ts +3 -0
  67. package/dist/core/http/index.js +10 -0
  68. package/dist/core/http/index.js.map +1 -0
  69. package/dist/core/http/router.d.ts +14 -0
  70. package/dist/core/http/router.js +113 -0
  71. package/dist/core/http/router.js.map +1 -0
  72. package/dist/core/logger/filters.d.ts +9 -0
  73. package/dist/core/logger/filters.js +134 -0
  74. package/dist/core/logger/filters.js.map +1 -0
  75. package/dist/core/logger/index.d.ts +3 -0
  76. package/dist/core/logger/index.js +26 -0
  77. package/dist/core/logger/index.js.map +1 -0
  78. package/dist/core/logger/logger.d.ts +49 -0
  79. package/dist/core/logger/logger.js +332 -0
  80. package/dist/core/logger/logger.js.map +1 -0
  81. package/dist/core/logger/outputs.d.ts +42 -0
  82. package/dist/core/logger/outputs.js +110 -0
  83. package/dist/core/logger/outputs.js.map +1 -0
  84. package/dist/core/middleware/built-in/adapters/cache/file.d.ts +15 -0
  85. package/dist/core/middleware/built-in/adapters/cache/file.js +128 -0
  86. package/dist/core/middleware/built-in/adapters/cache/file.js.map +1 -0
  87. package/dist/core/middleware/built-in/adapters/cache/index.d.ts +5 -0
  88. package/dist/core/middleware/built-in/adapters/cache/index.js +28 -0
  89. package/dist/core/middleware/built-in/adapters/cache/index.js.map +1 -0
  90. package/dist/core/middleware/built-in/adapters/cache/memory.d.ts +11 -0
  91. package/dist/core/middleware/built-in/adapters/cache/memory.js +65 -0
  92. package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -0
  93. package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +17 -0
  94. package/dist/core/middleware/built-in/adapters/cache/redis.js +91 -0
  95. package/dist/core/middleware/built-in/adapters/cache/redis.js.map +1 -0
  96. package/dist/core/middleware/built-in/adapters/cdn/azure.d.ts +21 -0
  97. package/dist/core/middleware/built-in/adapters/cdn/azure.js +40 -0
  98. package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +1 -0
  99. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.d.ts +14 -0
  100. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js +77 -0
  101. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -0
  102. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +15 -0
  103. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +73 -0
  104. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +1 -0
  105. package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +5 -0
  106. package/dist/core/middleware/built-in/adapters/cdn/index.js +28 -0
  107. package/dist/core/middleware/built-in/adapters/cdn/index.js.map +1 -0
  108. package/dist/core/middleware/built-in/adapters/index.d.ts +4 -0
  109. package/dist/core/middleware/built-in/adapters/index.js +26 -0
  110. package/dist/core/middleware/built-in/adapters/index.js.map +1 -0
  111. package/dist/core/middleware/built-in/auth.d.ts +2 -0
  112. package/dist/core/middleware/built-in/auth.js +38 -0
  113. package/dist/core/middleware/built-in/auth.js.map +1 -0
  114. package/dist/core/middleware/built-in/cache.d.ts +3 -0
  115. package/dist/core/middleware/built-in/cache.js +188 -0
  116. package/dist/core/middleware/built-in/cache.js.map +1 -0
  117. package/dist/core/middleware/built-in/cdn.d.ts +3 -0
  118. package/dist/core/middleware/built-in/cdn.js +115 -0
  119. package/dist/core/middleware/built-in/cdn.js.map +1 -0
  120. package/dist/core/middleware/built-in/cookie.d.ts +14 -0
  121. package/dist/core/middleware/built-in/cookie.js +68 -0
  122. package/dist/core/middleware/built-in/cookie.js.map +1 -0
  123. package/dist/core/middleware/built-in/cors.d.ts +2 -0
  124. package/dist/core/middleware/built-in/cors.js +29 -0
  125. package/dist/core/middleware/built-in/cors.js.map +1 -0
  126. package/dist/core/middleware/built-in/csp.d.ts +22 -0
  127. package/dist/core/middleware/built-in/csp.js +74 -0
  128. package/dist/core/middleware/built-in/csp.js.map +1 -0
  129. package/dist/core/middleware/built-in/csrf.d.ts +9 -0
  130. package/dist/core/middleware/built-in/csrf.js +66 -0
  131. package/dist/core/middleware/built-in/csrf.js.map +1 -0
  132. package/dist/core/middleware/built-in/error-tracker.d.ts +1 -0
  133. package/dist/core/middleware/built-in/error-tracker.js +19 -0
  134. package/dist/core/middleware/built-in/error-tracker.js.map +1 -0
  135. package/dist/core/middleware/built-in/index.d.ts +70 -0
  136. package/dist/core/middleware/built-in/index.js +70 -0
  137. package/dist/core/middleware/built-in/index.js.map +1 -0
  138. package/dist/core/middleware/built-in/performance-monitor.d.ts +1 -0
  139. package/dist/core/middleware/built-in/performance-monitor.js +22 -0
  140. package/dist/core/middleware/built-in/performance-monitor.js.map +1 -0
  141. package/dist/core/middleware/built-in/rate-limit.d.ts +6 -0
  142. package/dist/core/middleware/built-in/rate-limit.js +47 -0
  143. package/dist/core/middleware/built-in/rate-limit.js.map +1 -0
  144. package/dist/core/middleware/built-in/request-logger.d.ts +1 -0
  145. package/dist/core/middleware/built-in/request-logger.js +15 -0
  146. package/dist/core/middleware/built-in/request-logger.js.map +1 -0
  147. package/dist/core/middleware/built-in/session.d.ts +41 -0
  148. package/dist/core/middleware/built-in/session.js +209 -0
  149. package/dist/core/middleware/built-in/session.js.map +1 -0
  150. package/dist/core/middleware/built-in/sse.d.ts +6 -0
  151. package/dist/core/middleware/built-in/sse.js +73 -0
  152. package/dist/core/middleware/built-in/sse.js.map +1 -0
  153. package/dist/core/middleware/built-in/validation.d.ts +2 -0
  154. package/dist/core/middleware/built-in/validation.js +31 -0
  155. package/dist/core/middleware/built-in/validation.js.map +1 -0
  156. package/dist/core/middleware/index.d.ts +21 -0
  157. package/dist/core/middleware/index.js +152 -0
  158. package/dist/core/middleware/index.js.map +1 -0
  159. package/dist/core/modules/auto-discovery.d.ts +27 -0
  160. package/dist/core/modules/auto-discovery.js +255 -0
  161. package/dist/core/modules/auto-discovery.js.map +1 -0
  162. package/dist/core/modules/index.d.ts +2 -0
  163. package/dist/core/modules/index.js +11 -0
  164. package/dist/core/modules/index.js.map +1 -0
  165. package/dist/core/modules/modules.d.ts +10 -0
  166. package/dist/core/modules/modules.js +137 -0
  167. package/dist/core/modules/modules.js.map +1 -0
  168. package/dist/core/networking/index.d.ts +2 -0
  169. package/dist/core/networking/index.js +9 -0
  170. package/dist/core/networking/index.js.map +1 -0
  171. package/dist/core/networking/service-discovery.d.ts +38 -0
  172. package/dist/core/networking/service-discovery.js +233 -0
  173. package/dist/core/networking/service-discovery.js.map +1 -0
  174. package/dist/core/networking/websocket-manager.d.ts +27 -0
  175. package/dist/core/networking/websocket-manager.js +211 -0
  176. package/dist/core/networking/websocket-manager.js.map +1 -0
  177. package/dist/core/routing/app-integration.d.ts +42 -0
  178. package/dist/core/routing/app-integration.js +152 -0
  179. package/dist/core/routing/app-integration.js.map +1 -0
  180. package/dist/core/routing/index.d.ts +106 -0
  181. package/dist/core/routing/index.js +343 -0
  182. package/dist/core/routing/index.js.map +1 -0
  183. package/dist/core/runtime/aws-lambda-adapter.d.ts +43 -0
  184. package/dist/core/runtime/aws-lambda-adapter.js +108 -0
  185. package/dist/core/runtime/aws-lambda-adapter.js.map +1 -0
  186. package/dist/core/runtime/base-adapter.d.ts +16 -0
  187. package/dist/core/runtime/base-adapter.js +105 -0
  188. package/dist/core/runtime/base-adapter.js.map +1 -0
  189. package/dist/core/runtime/cloudflare-workers-adapter.d.ts +18 -0
  190. package/dist/core/runtime/cloudflare-workers-adapter.js +131 -0
  191. package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -0
  192. package/dist/core/runtime/index.d.ts +14 -0
  193. package/dist/core/runtime/index.js +56 -0
  194. package/dist/core/runtime/index.js.map +1 -0
  195. package/dist/core/runtime/node-adapter.d.ts +15 -0
  196. package/dist/core/runtime/node-adapter.js +204 -0
  197. package/dist/core/runtime/node-adapter.js.map +1 -0
  198. package/dist/core/runtime/vercel-edge-adapter.d.ts +10 -0
  199. package/dist/core/runtime/vercel-edge-adapter.js +106 -0
  200. package/dist/core/runtime/vercel-edge-adapter.js.map +1 -0
  201. package/dist/core/utilities/circuit-breaker.d.ts +14 -0
  202. package/dist/core/utilities/circuit-breaker.js +42 -0
  203. package/dist/core/utilities/circuit-breaker.js.map +1 -0
  204. package/dist/core/utilities/container.d.ts +116 -0
  205. package/dist/core/utilities/container.js +529 -0
  206. package/dist/core/utilities/container.js.map +1 -0
  207. package/dist/core/utilities/hooks.d.ts +24 -0
  208. package/dist/core/utilities/hooks.js +131 -0
  209. package/dist/core/utilities/hooks.js.map +1 -0
  210. package/dist/core/utilities/index.d.ts +4 -0
  211. package/dist/core/utilities/index.js +22 -0
  212. package/dist/core/utilities/index.js.map +1 -0
  213. package/dist/core/validation/index.d.ts +30 -0
  214. package/dist/core/validation/index.js +144 -0
  215. package/dist/core/validation/index.js.map +1 -0
  216. package/dist/index.d.ts +30 -0
  217. package/dist/index.js +72 -0
  218. package/dist/index.js.map +1 -0
  219. package/dist/moro.d.ts +82 -0
  220. package/dist/moro.js +679 -0
  221. package/dist/moro.js.map +1 -0
  222. package/dist/types/cache.d.ts +34 -0
  223. package/dist/types/cache.js +3 -0
  224. package/dist/types/cache.js.map +1 -0
  225. package/dist/types/cdn.d.ts +19 -0
  226. package/dist/types/cdn.js +3 -0
  227. package/dist/types/cdn.js.map +1 -0
  228. package/dist/types/core.d.ts +13 -0
  229. package/dist/types/core.js +3 -0
  230. package/dist/types/core.js.map +1 -0
  231. package/dist/types/database.d.ts +29 -0
  232. package/dist/types/database.js +3 -0
  233. package/dist/types/database.js.map +1 -0
  234. package/dist/types/discovery.d.ts +6 -0
  235. package/dist/types/discovery.js +3 -0
  236. package/dist/types/discovery.js.map +1 -0
  237. package/dist/types/events.d.ts +116 -0
  238. package/dist/types/events.js +3 -0
  239. package/dist/types/events.js.map +1 -0
  240. package/dist/types/hooks.d.ts +38 -0
  241. package/dist/types/hooks.js +3 -0
  242. package/dist/types/hooks.js.map +1 -0
  243. package/dist/types/http.d.ts +51 -0
  244. package/dist/types/http.js +3 -0
  245. package/dist/types/http.js.map +1 -0
  246. package/dist/types/logger.d.ts +77 -0
  247. package/dist/types/logger.js +3 -0
  248. package/dist/types/logger.js.map +1 -0
  249. package/dist/types/module.d.ts +91 -0
  250. package/dist/types/module.js +3 -0
  251. package/dist/types/module.js.map +1 -0
  252. package/dist/types/runtime.d.ts +48 -0
  253. package/dist/types/runtime.js +3 -0
  254. package/dist/types/runtime.js.map +1 -0
  255. package/dist/types/session.d.ts +66 -0
  256. package/dist/types/session.js +3 -0
  257. package/dist/types/session.js.map +1 -0
  258. package/package.json +176 -0
  259. package/src/core/config/index.ts +47 -0
  260. package/src/core/config/loader.ts +366 -0
  261. package/src/core/config/schema.ts +346 -0
  262. package/src/core/config/utils.ts +220 -0
  263. package/src/core/database/README.md +228 -0
  264. package/src/core/database/adapters/drizzle.ts +425 -0
  265. package/src/core/database/adapters/index.ts +45 -0
  266. package/src/core/database/adapters/mongodb.ts +292 -0
  267. package/src/core/database/adapters/mysql.ts +217 -0
  268. package/src/core/database/adapters/postgresql.ts +211 -0
  269. package/src/core/database/adapters/redis.ts +331 -0
  270. package/src/core/database/adapters/sqlite.ts +255 -0
  271. package/src/core/database/index.ts +3 -0
  272. package/src/core/docs/index.ts +245 -0
  273. package/src/core/docs/openapi-generator.ts +588 -0
  274. package/src/core/docs/simple-docs.ts +305 -0
  275. package/src/core/docs/swagger-ui.ts +370 -0
  276. package/src/core/docs/zod-to-openapi.ts +532 -0
  277. package/src/core/events/event-bus.ts +249 -0
  278. package/src/core/events/index.ts +12 -0
  279. package/src/core/framework.ts +621 -0
  280. package/src/core/http/http-server.ts +1421 -0
  281. package/src/core/http/index.ts +11 -0
  282. package/src/core/http/router.ts +153 -0
  283. package/src/core/logger/filters.ts +148 -0
  284. package/src/core/logger/index.ts +20 -0
  285. package/src/core/logger/logger.ts +434 -0
  286. package/src/core/logger/outputs.ts +136 -0
  287. package/src/core/middleware/built-in/adapters/cache/file.ts +106 -0
  288. package/src/core/middleware/built-in/adapters/cache/index.ts +26 -0
  289. package/src/core/middleware/built-in/adapters/cache/memory.ts +73 -0
  290. package/src/core/middleware/built-in/adapters/cache/redis.ts +103 -0
  291. package/src/core/middleware/built-in/adapters/cdn/azure.ts +68 -0
  292. package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +100 -0
  293. package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +92 -0
  294. package/src/core/middleware/built-in/adapters/cdn/index.ts +23 -0
  295. package/src/core/middleware/built-in/adapters/index.ts +7 -0
  296. package/src/core/middleware/built-in/auth.ts +39 -0
  297. package/src/core/middleware/built-in/cache.ts +228 -0
  298. package/src/core/middleware/built-in/cdn.ts +151 -0
  299. package/src/core/middleware/built-in/cookie.ts +90 -0
  300. package/src/core/middleware/built-in/cors.ts +38 -0
  301. package/src/core/middleware/built-in/csp.ts +107 -0
  302. package/src/core/middleware/built-in/csrf.ts +87 -0
  303. package/src/core/middleware/built-in/error-tracker.ts +16 -0
  304. package/src/core/middleware/built-in/index.ts +57 -0
  305. package/src/core/middleware/built-in/performance-monitor.ts +25 -0
  306. package/src/core/middleware/built-in/rate-limit.ts +60 -0
  307. package/src/core/middleware/built-in/request-logger.ts +14 -0
  308. package/src/core/middleware/built-in/session.ts +311 -0
  309. package/src/core/middleware/built-in/sse.ts +91 -0
  310. package/src/core/middleware/built-in/validation.ts +33 -0
  311. package/src/core/middleware/index.ts +188 -0
  312. package/src/core/modules/auto-discovery.ts +265 -0
  313. package/src/core/modules/index.ts +6 -0
  314. package/src/core/modules/modules.ts +125 -0
  315. package/src/core/networking/index.ts +7 -0
  316. package/src/core/networking/service-discovery.ts +309 -0
  317. package/src/core/networking/websocket-manager.ts +259 -0
  318. package/src/core/routing/app-integration.ts +229 -0
  319. package/src/core/routing/index.ts +519 -0
  320. package/src/core/runtime/aws-lambda-adapter.ts +157 -0
  321. package/src/core/runtime/base-adapter.ts +140 -0
  322. package/src/core/runtime/cloudflare-workers-adapter.ts +166 -0
  323. package/src/core/runtime/index.ts +74 -0
  324. package/src/core/runtime/node-adapter.ts +210 -0
  325. package/src/core/runtime/vercel-edge-adapter.ts +125 -0
  326. package/src/core/utilities/circuit-breaker.ts +46 -0
  327. package/src/core/utilities/container.ts +760 -0
  328. package/src/core/utilities/hooks.ts +148 -0
  329. package/src/core/utilities/index.ts +16 -0
  330. package/src/core/validation/index.ts +216 -0
  331. package/src/index.ts +120 -0
  332. package/src/moro.ts +842 -0
  333. package/src/types/cache.ts +38 -0
  334. package/src/types/cdn.ts +22 -0
  335. package/src/types/core.ts +17 -0
  336. package/src/types/database.ts +40 -0
  337. package/src/types/discovery.ts +7 -0
  338. package/src/types/events.ts +90 -0
  339. package/src/types/hooks.ts +47 -0
  340. package/src/types/http.ts +70 -0
  341. package/src/types/logger.ts +109 -0
  342. package/src/types/module.ts +87 -0
  343. package/src/types/runtime.ts +91 -0
  344. package/src/types/session.ts +89 -0
  345. package/tsconfig.json +21 -0
@@ -0,0 +1,148 @@
1
+ // Hook System for Moro
2
+ import { EventEmitter } from "events";
3
+ import { HookFunction, HookContext, MoroMiddleware } from "../../types/hooks";
4
+ import { createFrameworkLogger } from "../logger";
5
+
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",
12
+ } as const;
13
+
14
+ export class HookManager extends EventEmitter {
15
+ private hooks = new Map<string, HookFunction[]>();
16
+ private beforeHooks = new Map<string, HookFunction[]>();
17
+ private afterHooks = new Map<string, HookFunction[]>();
18
+ private logger = createFrameworkLogger("Hooks");
19
+
20
+ constructor() {
21
+ super();
22
+ // Initialize hook arrays
23
+ Object.values(HOOK_EVENTS).forEach((event) => {
24
+ this.hooks.set(event, []);
25
+ this.beforeHooks.set(event, []);
26
+ this.afterHooks.set(event, []);
27
+ });
28
+ }
29
+
30
+ // Register a hook for a specific event
31
+ hook(event: string, fn: HookFunction): this {
32
+ if (!this.hooks.has(event)) {
33
+ this.hooks.set(event, []);
34
+ }
35
+ this.hooks.get(event)!.push(fn);
36
+ return this;
37
+ }
38
+
39
+ // Register a before hook
40
+ before(event: string, fn: HookFunction): this {
41
+ if (!this.beforeHooks.has(event)) {
42
+ this.beforeHooks.set(event, []);
43
+ }
44
+ this.beforeHooks.get(event)!.push(fn);
45
+ return this;
46
+ }
47
+
48
+ // Register an after hook
49
+ after(event: string, fn: HookFunction): this {
50
+ if (!this.afterHooks.has(event)) {
51
+ this.afterHooks.set(event, []);
52
+ }
53
+ this.afterHooks.get(event)!.push(fn);
54
+ return this;
55
+ }
56
+
57
+ // Execute hooks for an event
58
+ async execute(
59
+ event: string,
60
+ context: HookContext = {},
61
+ ): Promise<HookContext> {
62
+ // Execute before hooks
63
+ const beforeHooks = this.beforeHooks.get(event) || [];
64
+ for (const hook of beforeHooks) {
65
+ await this.executeHook(hook, context);
66
+ }
67
+
68
+ // Execute main hooks
69
+ const hooks = this.hooks.get(event) || [];
70
+ for (const hook of hooks) {
71
+ await this.executeHook(hook, context);
72
+ }
73
+
74
+ // Execute after hooks
75
+ const afterHooks = this.afterHooks.get(event) || [];
76
+ for (const hook of afterHooks) {
77
+ await this.executeHook(hook, context);
78
+ }
79
+
80
+ // Emit event for listeners
81
+ this.emit(event, context);
82
+
83
+ return context;
84
+ }
85
+
86
+ // Execute a single hook with error handling
87
+ private async executeHook(
88
+ hook: HookFunction,
89
+ context: HookContext,
90
+ ): Promise<void> {
91
+ try {
92
+ await hook(context);
93
+ } catch (error) {
94
+ this.logger.error("Hook execution error", "HookExecution", {
95
+ error: error instanceof Error ? error.message : String(error),
96
+ context: context.request?.method || "unknown",
97
+ });
98
+ throw error;
99
+ }
100
+ }
101
+
102
+ // Remove hooks
103
+ removeHook(event: string, fn?: HookFunction): this {
104
+ if (!fn) {
105
+ this.hooks.delete(event);
106
+ this.beforeHooks.delete(event);
107
+ this.afterHooks.delete(event);
108
+ } else {
109
+ [this.hooks, this.beforeHooks, this.afterHooks].forEach((map) => {
110
+ const hooks = map.get(event);
111
+ if (hooks) {
112
+ const index = hooks.indexOf(fn);
113
+ if (index !== -1) {
114
+ hooks.splice(index, 1);
115
+ }
116
+ }
117
+ });
118
+ }
119
+ return this;
120
+ }
121
+
122
+ // Get all registered hooks for debugging
123
+ getHooks(event?: string): Record<string, any> {
124
+ if (event) {
125
+ return {
126
+ before: this.beforeHooks.get(event) || [],
127
+ main: this.hooks.get(event) || [],
128
+ after: this.afterHooks.get(event) || [],
129
+ };
130
+ }
131
+
132
+ const allHooks: Record<string, any> = {};
133
+ const allEvents = new Set([
134
+ ...this.hooks.keys(),
135
+ ...this.beforeHooks.keys(),
136
+ ...this.afterHooks.keys(),
137
+ ]);
138
+
139
+ allEvents.forEach((event) => {
140
+ allHooks[event] = this.getHooks(event);
141
+ });
142
+
143
+ return allHooks;
144
+ }
145
+ }
146
+
147
+ // Built-in middleware - now organized in individual files
148
+ export { simpleMiddleware as middleware } from "../middleware/index";
@@ -0,0 +1,16 @@
1
+ // Core Utilities - Centralized Exports
2
+ export {
3
+ Container,
4
+ FunctionalContainer,
5
+ ServiceScope,
6
+ ServiceLifecycle,
7
+ withLogging,
8
+ withCaching,
9
+ withRetry,
10
+ withTimeout,
11
+ } from "./container";
12
+ export { CircuitBreaker } from "./circuit-breaker";
13
+ export { HookManager, HOOK_EVENTS } from "./hooks";
14
+
15
+ // Re-export middleware from hooks
16
+ export { middleware } from "./hooks";
@@ -0,0 +1,216 @@
1
+ // Functional Validation System for Moro Framework
2
+ // Elegant, type-safe validation using Zod with functional composition
3
+
4
+ import { z, ZodSchema, ZodError } from "zod";
5
+ import { HttpRequest, HttpResponse } from "../http";
6
+ import { createFrameworkLogger } from "../logger";
7
+
8
+ const logger = createFrameworkLogger("Validation");
9
+
10
+ // Validation configuration interface
11
+ export interface ValidationConfig {
12
+ body?: ZodSchema;
13
+ query?: ZodSchema;
14
+ params?: ZodSchema;
15
+ headers?: ZodSchema;
16
+ }
17
+
18
+ // Validation result types
19
+ export interface ValidationResult<T = any> {
20
+ success: boolean;
21
+ data?: T;
22
+ errors?: ValidationError[];
23
+ }
24
+
25
+ export interface ValidationError {
26
+ field: string;
27
+ message: string;
28
+ code: string;
29
+ }
30
+
31
+ // Enhanced request type with validated data
32
+ export interface ValidatedRequest<T = any> extends HttpRequest {
33
+ validatedBody?: T;
34
+ validatedQuery?: any;
35
+ validatedParams?: any;
36
+ validatedHeaders?: any;
37
+ }
38
+
39
+ // Main validation wrapper function
40
+ export function validate<TBody = any, TQuery = any, TParams = any>(
41
+ config: ValidationConfig,
42
+ handler: (
43
+ req: ValidatedRequest<TBody>,
44
+ res: HttpResponse,
45
+ ) => any | Promise<any>,
46
+ ) {
47
+ return async (req: HttpRequest, res: HttpResponse): Promise<any> => {
48
+ try {
49
+ const validatedReq = req as ValidatedRequest<TBody>;
50
+
51
+ // Validate body
52
+ if (config.body) {
53
+ const result = await validateField(config.body, req.body, "body");
54
+ if (!result.success) {
55
+ return sendValidationError(res, result.errors!, "body");
56
+ }
57
+ validatedReq.validatedBody = result.data;
58
+ validatedReq.body = result.data; // Also update original body for compatibility
59
+ }
60
+
61
+ // Validate query parameters
62
+ if (config.query) {
63
+ const result = await validateField(config.query, req.query, "query");
64
+ if (!result.success) {
65
+ return sendValidationError(res, result.errors!, "query");
66
+ }
67
+ validatedReq.validatedQuery = result.data;
68
+ validatedReq.query = result.data; // Also update original query for compatibility
69
+ }
70
+
71
+ // Validate path parameters
72
+ if (config.params) {
73
+ const result = await validateField(config.params, req.params, "params");
74
+ if (!result.success) {
75
+ return sendValidationError(res, result.errors!, "params");
76
+ }
77
+ validatedReq.validatedParams = result.data;
78
+ validatedReq.params = result.data; // Also update original params for compatibility
79
+ }
80
+
81
+ // Validate headers
82
+ if (config.headers) {
83
+ const result = await validateField(
84
+ config.headers,
85
+ req.headers,
86
+ "headers",
87
+ );
88
+ if (!result.success) {
89
+ return sendValidationError(res, result.errors!, "headers");
90
+ }
91
+ validatedReq.validatedHeaders = result.data;
92
+ }
93
+
94
+ logger.debug("Request validation passed", "ValidationSuccess", {
95
+ path: req.path,
96
+ method: req.method,
97
+ validatedFields: Object.keys(config),
98
+ });
99
+
100
+ // Execute the handler with validated request
101
+ return await handler(validatedReq, res);
102
+ } catch (error) {
103
+ logger.error("Validation wrapper error", "ValidationError", {
104
+ error: error instanceof Error ? error.message : String(error),
105
+ path: req.path,
106
+ method: req.method,
107
+ });
108
+
109
+ if (!res.headersSent) {
110
+ res.status(500).json({
111
+ success: false,
112
+ error: "Internal validation error",
113
+ requestId: req.requestId,
114
+ });
115
+ }
116
+ }
117
+ };
118
+ }
119
+
120
+ // Validate individual field
121
+ async function validateField(
122
+ schema: ZodSchema,
123
+ data: any,
124
+ fieldName: string,
125
+ ): Promise<ValidationResult> {
126
+ try {
127
+ const validated = await schema.parseAsync(data);
128
+ return {
129
+ success: true,
130
+ data: validated,
131
+ };
132
+ } catch (error) {
133
+ if (error instanceof ZodError) {
134
+ const errors: ValidationError[] = error.issues.map((err: any) => ({
135
+ field: err.path.length > 0 ? err.path.join(".") : fieldName,
136
+ message: err.message,
137
+ code: err.code,
138
+ }));
139
+
140
+ logger.debug("Field validation failed", "ValidationFailed", {
141
+ field: fieldName,
142
+ errors: errors.length,
143
+ details: errors,
144
+ });
145
+
146
+ return {
147
+ success: false,
148
+ errors,
149
+ };
150
+ }
151
+
152
+ // Re-throw unexpected errors
153
+ throw error;
154
+ }
155
+ }
156
+
157
+ // Send validation error response
158
+ function sendValidationError(
159
+ res: HttpResponse,
160
+ errors: ValidationError[],
161
+ field: string,
162
+ ): void {
163
+ logger.debug("Sending validation error response", "ValidationResponse", {
164
+ field,
165
+ errorCount: errors.length,
166
+ });
167
+
168
+ res.status(400).json({
169
+ success: false,
170
+ error: `Validation failed for ${field}`,
171
+ details: errors,
172
+ requestId: (res as any).req?.requestId,
173
+ });
174
+ }
175
+
176
+ // Convenience functions for single-field validation
177
+ export function body<T>(schema: ZodSchema<T>) {
178
+ return (
179
+ handler: (
180
+ req: ValidatedRequest<T>,
181
+ res: HttpResponse,
182
+ ) => any | Promise<any>,
183
+ ) => {
184
+ return validate({ body: schema }, handler);
185
+ };
186
+ }
187
+
188
+ export function query<T>(schema: ZodSchema<T>) {
189
+ return (
190
+ handler: (
191
+ req: ValidatedRequest<any>,
192
+ res: HttpResponse,
193
+ ) => any | Promise<any>,
194
+ ) => {
195
+ return validate({ query: schema }, handler);
196
+ };
197
+ }
198
+
199
+ export function params<T>(schema: ZodSchema<T>) {
200
+ return (
201
+ handler: (
202
+ req: ValidatedRequest<any>,
203
+ res: HttpResponse,
204
+ ) => any | Promise<any>,
205
+ ) => {
206
+ return validate({ params: schema }, handler);
207
+ };
208
+ }
209
+
210
+ // Schema composition helpers
211
+ export function combineSchemas(schemas: ValidationConfig): ValidationConfig {
212
+ return schemas;
213
+ }
214
+
215
+ // Re-export Zod for convenience
216
+ export { z } from "zod";
package/src/index.ts ADDED
@@ -0,0 +1,120 @@
1
+ // MoroJS Framework - Main Entry Point
2
+ export {
3
+ Moro,
4
+ createApp,
5
+ createAppNode,
6
+ createAppEdge,
7
+ createAppLambda,
8
+ createAppWorker,
9
+ } from "./moro";
10
+
11
+ export type { MoroOptions } from "./core/framework";
12
+
13
+ // Runtime system exports
14
+ export type {
15
+ RuntimeType,
16
+ RuntimeAdapter,
17
+ RuntimeConfig,
18
+ RuntimeHttpResponse,
19
+ } from "./types/runtime";
20
+
21
+ export {
22
+ NodeRuntimeAdapter,
23
+ VercelEdgeAdapter,
24
+ AWSLambdaAdapter,
25
+ CloudflareWorkersAdapter,
26
+ createRuntimeAdapter,
27
+ createNodeHandler,
28
+ createEdgeHandler,
29
+ createLambdaHandler,
30
+ createWorkerHandler,
31
+ } from "./core/runtime";
32
+
33
+ // Runtime-specific types
34
+ export type {
35
+ LambdaEvent,
36
+ LambdaContext,
37
+ LambdaResponse,
38
+ } from "./core/runtime/aws-lambda-adapter";
39
+ export type {
40
+ WorkersEnv,
41
+ WorkersContext,
42
+ } from "./core/runtime/cloudflare-workers-adapter";
43
+
44
+ // Core exports
45
+ export { MoroHttpServer, middleware as httpMiddleware } from "./core/http";
46
+ export {
47
+ builtInMiddleware,
48
+ simpleMiddleware,
49
+ } from "./core/middleware/built-in";
50
+ export { WebSocketManager } from "./core/networking";
51
+ export { Container } from "./core/utilities";
52
+ export { createFrameworkLogger, logger } from "./core/logger";
53
+
54
+ // Validation System (Zod-based)
55
+ export {
56
+ validate,
57
+ body,
58
+ query,
59
+ params,
60
+ combineSchemas,
61
+ z,
62
+ } from "./core/validation";
63
+ export type {
64
+ ValidationConfig,
65
+ ValidationResult,
66
+ ValidationError,
67
+ ValidatedRequest,
68
+ } from "./core/validation";
69
+
70
+ // Module System
71
+ export { defineModule } from "./core/modules";
72
+ export type {
73
+ ModuleDefinition,
74
+ ModuleRoute,
75
+ ModuleSocket,
76
+ ModuleConfig,
77
+ } from "./types/module";
78
+
79
+ // Intelligent Routing System
80
+ export { createRoute, defineRoute, EXECUTION_PHASES } from "./core/routing";
81
+ export {
82
+ IntelligentRoutingManager,
83
+ RouteRegistry,
84
+ } from "./core/routing/app-integration";
85
+ export type {
86
+ RouteBuilder,
87
+ RouteSchema,
88
+ CompiledRoute,
89
+ HttpMethod,
90
+ AuthConfig,
91
+ RateLimitConfig,
92
+ CacheConfig,
93
+ MiddlewarePhases,
94
+ ExecutionPhase,
95
+ } from "./core/routing";
96
+
97
+ // Additional exports if needed
98
+ // export { Moro as MoroCore } from './core/framework';
99
+
100
+ // Types
101
+ export type * from "./types/core";
102
+ export type * from "./types/http";
103
+ export type * from "./types/hooks";
104
+ export type * from "./types/cache";
105
+ export type * from "./types/cdn";
106
+ export type * from "./types/database";
107
+
108
+ // Adapters
109
+ export * from "./core/middleware/built-in/adapters";
110
+ export * from "./core/database/adapters";
111
+
112
+ // Re-export commonly used types for convenience
113
+ export type { CacheAdapter, CacheOptions, CacheStrategy } from "./types/cache";
114
+ export type { CDNAdapter, CDNOptions } from "./types/cdn";
115
+ export type {
116
+ DatabaseAdapter,
117
+ DatabaseTransaction,
118
+ DatabaseConfig,
119
+ } from "./types/database";
120
+ export type { CookieOptions } from "./types/http";