@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,228 @@
1
+ # Database Adapters
2
+
3
+ The MoroJS database module provides a pluggable adapter system for different database backends, similar to the middleware adapter pattern.
4
+
5
+ ## Available Adapters
6
+
7
+ ### SQL Databases
8
+
9
+ #### MySQL Adapter
10
+ - **Package Required**: `mysql2`
11
+ - **Usage**: Production-ready with connection pooling
12
+ - **Type**: `mysql`
13
+
14
+ #### PostgreSQL Adapter
15
+ - **Package Required**: `pg` and `@types/pg`
16
+ - **Usage**: Full PostgreSQL feature support
17
+ - **Type**: `postgresql`, `postgres`, or `pg`
18
+
19
+ #### SQLite Adapter
20
+ - **Package Required**: `better-sqlite3`
21
+ - **Usage**: Lightweight, file-based database
22
+ - **Type**: `sqlite` or `sqlite3`
23
+
24
+ ### NoSQL Databases
25
+
26
+ #### MongoDB Adapter
27
+ - **Package Required**: `mongodb`
28
+ - **Usage**: Document database with aggregation support
29
+ - **Type**: `mongodb` or `mongo`
30
+
31
+ #### Redis Adapter
32
+ - **Package Required**: `ioredis`
33
+ - **Usage**: In-memory key-value store with pub/sub
34
+ - **Type**: `redis`
35
+
36
+ ### ORM
37
+
38
+ #### Drizzle Adapter
39
+ - **Package Required**: `drizzle-orm` + database driver
40
+ - **Usage**: Type-safe ORM with schema validation
41
+ - **Type**: `drizzle` or `orm`
42
+
43
+ ## Factory Pattern (Recommended)
44
+
45
+ ```typescript
46
+ import { createDatabaseAdapter } from 'moro';
47
+
48
+ // SQL Databases
49
+ const mysql = createDatabaseAdapter('mysql', {
50
+ host: 'localhost',
51
+ port: 3306,
52
+ user: 'root',
53
+ password: 'password',
54
+ database: 'my_app',
55
+ connectionLimit: 10
56
+ });
57
+
58
+ const postgres = createDatabaseAdapter('postgresql', {
59
+ host: 'localhost',
60
+ port: 5432,
61
+ user: 'postgres',
62
+ password: 'password',
63
+ database: 'my_app',
64
+ connectionLimit: 10,
65
+ ssl: false
66
+ });
67
+
68
+ const sqlite = createDatabaseAdapter('sqlite', {
69
+ filename: 'app.db',
70
+ memory: false
71
+ });
72
+
73
+ // NoSQL Databases
74
+ const mongodb = createDatabaseAdapter('mongodb', {
75
+ host: 'localhost',
76
+ port: 27017,
77
+ database: 'my_app',
78
+ username: 'user',
79
+ password: 'password'
80
+ });
81
+
82
+ const redis = createDatabaseAdapter('redis', {
83
+ host: 'localhost',
84
+ port: 6379,
85
+ password: 'password',
86
+ keyPrefix: 'myapp:'
87
+ });
88
+
89
+ // ORM
90
+ const drizzle = createDatabaseAdapter('drizzle', {
91
+ database: drizzleInstance,
92
+ schema: schemaObject
93
+ });
94
+ ```
95
+
96
+ ## Direct Instantiation
97
+
98
+ ```typescript
99
+ import {
100
+ MySQLAdapter,
101
+ PostgreSQLAdapter,
102
+ SQLiteAdapter,
103
+ MongoDBAdapter,
104
+ RedisAdapter,
105
+ DrizzleAdapter
106
+ } from 'moro';
107
+
108
+ // SQL
109
+ const mysql = new MySQLAdapter({ host: 'localhost', ... });
110
+ const postgres = new PostgreSQLAdapter({ host: 'localhost', ... });
111
+ const sqlite = new SQLiteAdapter({ filename: 'app.db' });
112
+
113
+ // NoSQL
114
+ const mongodb = new MongoDBAdapter({ host: 'localhost', ... });
115
+ const redis = new RedisAdapter({ host: 'localhost', ... });
116
+
117
+ // ORM
118
+ const drizzle = new DrizzleAdapter({ database: drizzleInstance, schema });
119
+ ```
120
+
121
+ ## Common Interface
122
+
123
+ All adapters implement the same `DatabaseAdapter` interface:
124
+
125
+ ```typescript
126
+ interface DatabaseAdapter {
127
+ connect(): Promise<void>;
128
+ disconnect(): Promise<void>;
129
+ query<T>(sql: string, params?: any[]): Promise<T[]>;
130
+ queryOne<T>(sql: string, params?: any[]): Promise<T | null>;
131
+ insert<T>(table: string, data: Record<string, any>): Promise<T>;
132
+ update<T>(table: string, data: Record<string, any>, where: Record<string, any>): Promise<T>;
133
+ delete(table: string, where: Record<string, any>): Promise<number>;
134
+ transaction<T>(callback: (tx: DatabaseTransaction) => Promise<T>): Promise<T>;
135
+ }
136
+ ```
137
+
138
+ ## Usage Example
139
+
140
+ ```typescript
141
+ // Initialize
142
+ await db.connect();
143
+
144
+ // Basic operations
145
+ const users = await db.query('SELECT * FROM users');
146
+ const user = await db.queryOne('SELECT * FROM users WHERE id = ?', [1]);
147
+
148
+ // ORM-like helpers
149
+ const newUser = await db.insert('users', { name: 'John', email: 'john@example.com' });
150
+ const updated = await db.update('users', { name: 'Jane' }, { id: 1 });
151
+ const deleted = await db.delete('users', { id: 1 });
152
+
153
+ // Transactions
154
+ const result = await db.transaction(async (tx) => {
155
+ const user = await tx.insert('users', userData);
156
+ await tx.insert('profiles', { user_id: user.id, ...profileData });
157
+ return user;
158
+ });
159
+ ```
160
+
161
+ ## Usage Examples
162
+
163
+ ### SQL Operations
164
+ ```typescript
165
+ // Standard CRUD operations work across all SQL adapters
166
+ const users = await db.query('SELECT * FROM users WHERE age > ?', [18]);
167
+ const user = await db.queryOne('SELECT * FROM users WHERE id = ?', [1]);
168
+ const newUser = await db.insert('users', { name: 'John', email: 'john@example.com' });
169
+ const updated = await db.update('users', { name: 'Jane' }, { id: 1 });
170
+ const deleted = await db.delete('users', { id: 1 });
171
+ ```
172
+
173
+ ### MongoDB Operations
174
+ ```typescript
175
+ // MongoDB uses collections instead of tables
176
+ const users = await mongoDb.query('users'); // Get all
177
+ const users = await mongoDb.query('users', { age: { $gte: 18 } }); // Query
178
+ const user = await mongoDb.queryOne('users', { email: 'john@example.com' });
179
+
180
+ // MongoDB-specific methods
181
+ const stats = await mongoDb.aggregate('users', [
182
+ { $group: { _id: null, avgAge: { $avg: '$age' } } }
183
+ ]);
184
+ await mongoDb.createIndex('users', { email: 1 }, { unique: true });
185
+ ```
186
+
187
+ ### Redis Operations
188
+ ```typescript
189
+ // Key-value operations
190
+ await redisDb.set('user:123', userData, 3600); // with TTL
191
+ const user = await redisDb.get('user:123');
192
+
193
+ // Redis-specific methods
194
+ await redisDb.incr('page:views');
195
+ await redisDb.lpush('tasks', taskData);
196
+ await redisDb.publish('notifications', message);
197
+ ```
198
+
199
+ ### Drizzle ORM Operations
200
+ ```typescript
201
+ // Type-safe queries (requires schema setup)
202
+ const users = await drizzleDb.select('users').where(eq(schema.users.age, 25));
203
+ const newUser = await drizzleDb.insertInto('users').values(userData).returning();
204
+
205
+ // Raw SQL fallback
206
+ const users = await drizzleDb.query('SELECT * FROM users WHERE age > ?', [18]);
207
+ ```
208
+
209
+ ## Installation
210
+
211
+ Choose and install the appropriate database package:
212
+
213
+ ```bash
214
+ # SQL Databases
215
+ npm install mysql2 # MySQL
216
+ npm install pg @types/pg # PostgreSQL
217
+ npm install better-sqlite3 # SQLite
218
+
219
+ # NoSQL Databases
220
+ npm install mongodb # MongoDB
221
+ npm install ioredis # Redis
222
+
223
+ # ORM
224
+ npm install drizzle-orm # Drizzle ORM
225
+ # Plus the appropriate driver (mysql2, pg, better-sqlite3, etc.)
226
+ ```
227
+
228
+ The adapters will gracefully handle missing packages with helpful error messages.
@@ -0,0 +1,425 @@
1
+ // Database Drizzle ORM Adapter
2
+ import { DatabaseAdapter, DatabaseTransaction } from "../../../types/database";
3
+ import { createFrameworkLogger } from "../../logger";
4
+
5
+ interface DrizzleConfig {
6
+ database: any; // Drizzle database instance
7
+ schema?: any; // Optional schema for additional type safety
8
+ logger?: boolean;
9
+ }
10
+
11
+ export class DrizzleAdapter implements DatabaseAdapter {
12
+ private db: any;
13
+ private schema: any;
14
+ private logger = createFrameworkLogger("Drizzle");
15
+
16
+ constructor(config: DrizzleConfig) {
17
+ try {
18
+ if (!config.database) {
19
+ throw new Error("Drizzle database instance is required");
20
+ }
21
+
22
+ this.db = config.database;
23
+ this.schema = config.schema;
24
+
25
+ this.logger.info("Drizzle ORM adapter initialized", "Drizzle");
26
+ } catch (error) {
27
+ this.logger.error("Drizzle ORM initialization failed", "Drizzle");
28
+ throw new Error(
29
+ "Drizzle ORM configuration error. Ensure you have a valid Drizzle database instance.",
30
+ );
31
+ }
32
+ }
33
+
34
+ async connect(): Promise<void> {
35
+ // Drizzle doesn't have an explicit connect method
36
+ // Connection is handled by the underlying driver
37
+ this.logger.info("Drizzle ORM adapter ready", "Connection");
38
+ }
39
+
40
+ async disconnect(): Promise<void> {
41
+ // Drizzle doesn't have an explicit disconnect method
42
+ // This would be handled by the underlying driver
43
+ this.logger.info("Drizzle ORM adapter disconnected", "Connection");
44
+ }
45
+
46
+ // Raw SQL query support
47
+ async query<T = any>(sql: string, params?: any[]): Promise<T[]> {
48
+ try {
49
+ // Using Drizzle's execute method for raw SQL
50
+ const result = await this.db.execute(sql, params);
51
+
52
+ // Handle different result formats from different drivers
53
+ if (Array.isArray(result)) {
54
+ return result;
55
+ } else if (result.rows) {
56
+ return result.rows;
57
+ } else if (result.recordset) {
58
+ return result.recordset;
59
+ } else {
60
+ return [result];
61
+ }
62
+ } catch (error) {
63
+ this.logger.error("Drizzle query failed", "Query", {
64
+ sql,
65
+ error: error instanceof Error ? error.message : String(error),
66
+ });
67
+ throw error;
68
+ }
69
+ }
70
+
71
+ async queryOne<T = any>(sql: string, params?: any[]): Promise<T | null> {
72
+ const results = await this.query<T>(sql, params);
73
+ return results.length > 0 ? results[0] : null;
74
+ }
75
+
76
+ // ORM-style operations (requires schema)
77
+ async insert<T = any>(table: string, data: Record<string, any>): Promise<T> {
78
+ try {
79
+ if (this.schema && this.schema[table]) {
80
+ // Use schema-based insert
81
+ const result = await this.db
82
+ .insert(this.schema[table])
83
+ .values(data)
84
+ .returning();
85
+ return result[0] as T;
86
+ } else {
87
+ // Fallback to raw SQL
88
+ const keys = Object.keys(data);
89
+ const values = Object.values(data);
90
+ const placeholders = keys.map((_, i) => `$${i + 1}`).join(", ");
91
+
92
+ const sql = `INSERT INTO ${table} (${keys.join(", ")}) VALUES (${placeholders}) RETURNING *`;
93
+ const result = await this.query<T>(sql, values);
94
+ return result[0];
95
+ }
96
+ } catch (error) {
97
+ this.logger.error("Drizzle insert failed", "Insert", {
98
+ table,
99
+ error: error instanceof Error ? error.message : String(error),
100
+ });
101
+ throw error;
102
+ }
103
+ }
104
+
105
+ async update<T = any>(
106
+ table: string,
107
+ data: Record<string, any>,
108
+ where: Record<string, any>,
109
+ ): Promise<T> {
110
+ try {
111
+ if (this.schema && this.schema[table]) {
112
+ // Use schema-based update
113
+ try {
114
+ const { eq, and } = require("drizzle-orm");
115
+
116
+ // Build where conditions
117
+ const conditions = Object.entries(where).map(([key, value]) =>
118
+ eq(this.schema[table][key], value),
119
+ );
120
+ const whereClause =
121
+ conditions.length === 1 ? conditions[0] : and(...conditions);
122
+
123
+ const result = await this.db
124
+ .update(this.schema[table])
125
+ .set(data)
126
+ .where(whereClause)
127
+ .returning();
128
+
129
+ return result[0] as T;
130
+ } catch (importError) {
131
+ // Fallback to raw SQL if drizzle-orm is not available
132
+ const setClause = Object.keys(data)
133
+ .map((key, i) => `${key} = $${i + 1}`)
134
+ .join(", ");
135
+ const whereClause = Object.keys(where)
136
+ .map((key, i) => `${key} = $${Object.keys(data).length + i + 1}`)
137
+ .join(" AND ");
138
+
139
+ const sql = `UPDATE ${table} SET ${setClause} WHERE ${whereClause} RETURNING *`;
140
+ const params = [...Object.values(data), ...Object.values(where)];
141
+ const result = await this.query<T>(sql, params);
142
+ return result[0];
143
+ }
144
+ } else {
145
+ // Fallback to raw SQL
146
+ const setClause = Object.keys(data)
147
+ .map((key, i) => `${key} = $${i + 1}`)
148
+ .join(", ");
149
+ const whereClause = Object.keys(where)
150
+ .map((key, i) => `${key} = $${Object.keys(data).length + i + 1}`)
151
+ .join(" AND ");
152
+
153
+ const sql = `UPDATE ${table} SET ${setClause} WHERE ${whereClause} RETURNING *`;
154
+ const params = [...Object.values(data), ...Object.values(where)];
155
+ const result = await this.query<T>(sql, params);
156
+ return result[0];
157
+ }
158
+ } catch (error) {
159
+ this.logger.error("Drizzle update failed", "Update", {
160
+ table,
161
+ error: error instanceof Error ? error.message : String(error),
162
+ });
163
+ throw error;
164
+ }
165
+ }
166
+
167
+ async delete(table: string, where: Record<string, any>): Promise<number> {
168
+ try {
169
+ if (this.schema && this.schema[table]) {
170
+ // Use schema-based delete
171
+ try {
172
+ const { eq, and } = require("drizzle-orm");
173
+
174
+ const conditions = Object.entries(where).map(([key, value]) =>
175
+ eq(this.schema[table][key], value),
176
+ );
177
+ const whereClause =
178
+ conditions.length === 1 ? conditions[0] : and(...conditions);
179
+
180
+ const result = await this.db
181
+ .delete(this.schema[table])
182
+ .where(whereClause);
183
+
184
+ return (
185
+ (result as any).changes ||
186
+ (result as any).rowCount ||
187
+ (result as any).affectedRows ||
188
+ 0
189
+ );
190
+ } catch (importError) {
191
+ // Fallback to raw SQL if drizzle-orm is not available
192
+ const whereClause = Object.keys(where)
193
+ .map((key, i) => `${key} = $${i + 1}`)
194
+ .join(" AND ");
195
+ const sql = `DELETE FROM ${table} WHERE ${whereClause}`;
196
+ await this.query(sql, Object.values(where));
197
+ return 1; // Can't determine exact count without result metadata
198
+ }
199
+ } else {
200
+ // Fallback to raw SQL
201
+ const whereClause = Object.keys(where)
202
+ .map((key, i) => `${key} = $${i + 1}`)
203
+ .join(" AND ");
204
+ const sql = `DELETE FROM ${table} WHERE ${whereClause}`;
205
+ await this.query(sql, Object.values(where));
206
+ return 1; // Can't determine exact count without result metadata
207
+ }
208
+ } catch (error) {
209
+ this.logger.error("Drizzle delete failed", "Delete", {
210
+ table,
211
+ error: error instanceof Error ? error.message : String(error),
212
+ });
213
+ throw error;
214
+ }
215
+ }
216
+
217
+ async transaction<T>(
218
+ callback: (tx: DatabaseTransaction) => Promise<T>,
219
+ ): Promise<T> {
220
+ return await this.db.transaction(async (tx: any) => {
221
+ const transaction = new DrizzleTransaction(tx, this.schema, this.logger);
222
+ return await callback(transaction);
223
+ });
224
+ }
225
+
226
+ // Drizzle-specific methods
227
+ select(table?: string) {
228
+ if (table && this.schema && this.schema[table]) {
229
+ return this.db.select().from(this.schema[table]);
230
+ }
231
+ return this.db.select();
232
+ }
233
+
234
+ insertInto(table: string) {
235
+ if (this.schema && this.schema[table]) {
236
+ return this.db.insert(this.schema[table]);
237
+ }
238
+ throw new Error(`Table ${table} not found in schema`);
239
+ }
240
+
241
+ updateTable(table: string) {
242
+ if (this.schema && this.schema[table]) {
243
+ return this.db.update(this.schema[table]);
244
+ }
245
+ throw new Error(`Table ${table} not found in schema`);
246
+ }
247
+
248
+ deleteFrom(table: string) {
249
+ if (this.schema && this.schema[table]) {
250
+ return this.db.delete(this.schema[table]);
251
+ }
252
+ throw new Error(`Table ${table} not found in schema`);
253
+ }
254
+
255
+ getSchema() {
256
+ return this.schema;
257
+ }
258
+
259
+ getDb() {
260
+ return this.db;
261
+ }
262
+
263
+ // Schema introspection helpers
264
+ getTableNames(): string[] {
265
+ return this.schema ? Object.keys(this.schema) : [];
266
+ }
267
+
268
+ hasTable(tableName: string): boolean {
269
+ return this.schema ? !!this.schema[tableName] : false;
270
+ }
271
+ }
272
+
273
+ class DrizzleTransaction implements DatabaseTransaction {
274
+ constructor(
275
+ private tx: any,
276
+ private schema: any,
277
+ private logger: any,
278
+ ) {}
279
+
280
+ async query<T = any>(sql: string, params?: any[]): Promise<T[]> {
281
+ try {
282
+ const result = await this.tx.execute(sql, params);
283
+
284
+ if (Array.isArray(result)) {
285
+ return result;
286
+ } else if (result.rows) {
287
+ return result.rows;
288
+ } else if (result.recordset) {
289
+ return result.recordset;
290
+ } else {
291
+ return [result];
292
+ }
293
+ } catch (error) {
294
+ this.logger.error("Drizzle transaction query failed", "Query", {
295
+ sql,
296
+ error: error instanceof Error ? error.message : String(error),
297
+ });
298
+ throw error;
299
+ }
300
+ }
301
+
302
+ async queryOne<T = any>(sql: string, params?: any[]): Promise<T | null> {
303
+ const results = await this.query<T>(sql, params);
304
+ return results.length > 0 ? results[0] : null;
305
+ }
306
+
307
+ async insert<T = any>(table: string, data: Record<string, any>): Promise<T> {
308
+ if (this.schema && this.schema[table]) {
309
+ const result = await this.tx
310
+ .insert(this.schema[table])
311
+ .values(data)
312
+ .returning();
313
+ return result[0] as T;
314
+ } else {
315
+ const keys = Object.keys(data);
316
+ const values = Object.values(data);
317
+ const placeholders = keys.map((_, i) => `$${i + 1}`).join(", ");
318
+
319
+ const sql = `INSERT INTO ${table} (${keys.join(", ")}) VALUES (${placeholders}) RETURNING *`;
320
+ const result = await this.query<T>(sql, values);
321
+ return result[0];
322
+ }
323
+ }
324
+
325
+ async update<T = any>(
326
+ table: string,
327
+ data: Record<string, any>,
328
+ where: Record<string, any>,
329
+ ): Promise<T> {
330
+ if (this.schema && this.schema[table]) {
331
+ try {
332
+ const { eq, and } = require("drizzle-orm");
333
+
334
+ const conditions = Object.entries(where).map(([key, value]) =>
335
+ eq(this.schema[table][key], value),
336
+ );
337
+ const whereClause =
338
+ conditions.length === 1 ? conditions[0] : and(...conditions);
339
+
340
+ const result = await this.tx
341
+ .update(this.schema[table])
342
+ .set(data)
343
+ .where(whereClause)
344
+ .returning();
345
+
346
+ return result[0] as T;
347
+ } catch (importError) {
348
+ // Fallback to raw SQL
349
+ const setClause = Object.keys(data)
350
+ .map((key, i) => `${key} = $${i + 1}`)
351
+ .join(", ");
352
+ const whereClause = Object.keys(where)
353
+ .map((key, i) => `${key} = $${Object.keys(data).length + i + 1}`)
354
+ .join(" AND ");
355
+
356
+ const sql = `UPDATE ${table} SET ${setClause} WHERE ${whereClause} RETURNING *`;
357
+ const params = [...Object.values(data), ...Object.values(where)];
358
+ const result = await this.query<T>(sql, params);
359
+ return result[0];
360
+ }
361
+ } else {
362
+ const setClause = Object.keys(data)
363
+ .map((key, i) => `${key} = $${i + 1}`)
364
+ .join(", ");
365
+ const whereClause = Object.keys(where)
366
+ .map((key, i) => `${key} = $${Object.keys(data).length + i + 1}`)
367
+ .join(" AND ");
368
+
369
+ const sql = `UPDATE ${table} SET ${setClause} WHERE ${whereClause} RETURNING *`;
370
+ const params = [...Object.values(data), ...Object.values(where)];
371
+ const result = await this.query<T>(sql, params);
372
+ return result[0];
373
+ }
374
+ }
375
+
376
+ async delete(table: string, where: Record<string, any>): Promise<number> {
377
+ if (this.schema && this.schema[table]) {
378
+ try {
379
+ const { eq, and } = require("drizzle-orm");
380
+
381
+ const conditions = Object.entries(where).map(([key, value]) =>
382
+ eq(this.schema[table][key], value),
383
+ );
384
+ const whereClause =
385
+ conditions.length === 1 ? conditions[0] : and(...conditions);
386
+
387
+ const result = await this.tx
388
+ .delete(this.schema[table])
389
+ .where(whereClause);
390
+
391
+ return (
392
+ (result as any).changes ||
393
+ (result as any).rowCount ||
394
+ (result as any).affectedRows ||
395
+ 0
396
+ );
397
+ } catch (importError) {
398
+ // Fallback to raw SQL
399
+ const whereClause = Object.keys(where)
400
+ .map((key, i) => `${key} = $${i + 1}`)
401
+ .join(" AND ");
402
+ const sql = `DELETE FROM ${table} WHERE ${whereClause}`;
403
+ await this.query(sql, Object.values(where));
404
+ return 1; // Can't determine exact count
405
+ }
406
+ } else {
407
+ const whereClause = Object.keys(where)
408
+ .map((key, i) => `${key} = $${i + 1}`)
409
+ .join(" AND ");
410
+ const sql = `DELETE FROM ${table} WHERE ${whereClause}`;
411
+ await this.query(sql, Object.values(where));
412
+ return 1; // Can't determine exact count
413
+ }
414
+ }
415
+
416
+ async commit(): Promise<void> {
417
+ // Drizzle transactions are auto-committed
418
+ // This is just for interface compatibility
419
+ }
420
+
421
+ async rollback(): Promise<void> {
422
+ // Drizzle transactions will auto-rollback on error
423
+ throw new Error("Transaction rollback");
424
+ }
425
+ }
@@ -0,0 +1,45 @@
1
+ // Database Adapters
2
+ export { MySQLAdapter } from "./mysql";
3
+ export { PostgreSQLAdapter } from "./postgresql";
4
+ export { SQLiteAdapter } from "./sqlite";
5
+ export { MongoDBAdapter } from "./mongodb";
6
+ export { RedisAdapter } from "./redis";
7
+ export { DrizzleAdapter } from "./drizzle";
8
+
9
+ import { MySQLAdapter } from "./mysql";
10
+ import { PostgreSQLAdapter } from "./postgresql";
11
+ import { SQLiteAdapter } from "./sqlite";
12
+ import { MongoDBAdapter } from "./mongodb";
13
+ import { RedisAdapter } from "./redis";
14
+ import { DrizzleAdapter } from "./drizzle";
15
+ import { DatabaseAdapter } from "../../../types/database";
16
+
17
+ // Adapter factory function for auto-loading
18
+ export function createDatabaseAdapter(
19
+ type: string,
20
+ options: any = {},
21
+ ): DatabaseAdapter {
22
+ switch (type.toLowerCase()) {
23
+ case "mysql":
24
+ return new MySQLAdapter(options);
25
+ case "postgresql":
26
+ case "postgres":
27
+ case "pg":
28
+ return new PostgreSQLAdapter(options);
29
+ case "sqlite":
30
+ case "sqlite3":
31
+ return new SQLiteAdapter(options);
32
+ case "mongodb":
33
+ case "mongo":
34
+ return new MongoDBAdapter(options);
35
+ case "redis":
36
+ return new RedisAdapter(options);
37
+ case "drizzle":
38
+ case "orm":
39
+ return new DrizzleAdapter(options);
40
+ default:
41
+ throw new Error(
42
+ `Unknown database adapter type: ${type}. Available types: mysql, postgresql, sqlite, mongodb, redis, drizzle`,
43
+ );
44
+ }
45
+ }