@morojs/moro 1.6.2 → 1.6.3

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 (366) hide show
  1. package/dist/core/http/http-server.js +12 -9
  2. package/dist/core/http/http-server.js.map +1 -1
  3. package/dist/core/http/uws-http-server.js +1 -1
  4. package/dist/core/http/uws-http-server.js.map +1 -1
  5. package/dist/core/middleware/built-in/auth/core.d.ts +78 -0
  6. package/dist/core/middleware/built-in/auth/core.js +358 -0
  7. package/dist/core/middleware/built-in/auth/core.js.map +1 -0
  8. package/dist/core/middleware/built-in/{auth-helpers.js → auth/helpers.js} +1 -1
  9. package/dist/core/middleware/built-in/auth/helpers.js.map +1 -0
  10. package/dist/core/middleware/built-in/auth/hook.d.ts +30 -0
  11. package/dist/core/middleware/built-in/auth/hook.js +99 -0
  12. package/dist/core/middleware/built-in/auth/hook.js.map +1 -0
  13. package/dist/core/middleware/built-in/auth/index.d.ts +7 -0
  14. package/dist/core/middleware/built-in/auth/index.js +15 -0
  15. package/dist/core/middleware/built-in/auth/index.js.map +1 -0
  16. package/dist/core/middleware/built-in/{jwt-helpers.js → auth/jwt-helpers.js} +1 -1
  17. package/dist/core/middleware/built-in/auth/jwt-helpers.js.map +1 -0
  18. package/dist/core/middleware/built-in/auth/middleware.d.ts +23 -0
  19. package/dist/core/middleware/built-in/auth/middleware.js +71 -0
  20. package/dist/core/middleware/built-in/auth/middleware.js.map +1 -0
  21. package/dist/core/middleware/built-in/{auth-providers.d.ts → auth/providers.d.ts} +1 -1
  22. package/dist/core/middleware/built-in/{auth-providers.js → auth/providers.js} +1 -1
  23. package/dist/core/middleware/built-in/auth/providers.js.map +1 -0
  24. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/file.d.ts +1 -1
  25. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/file.js +1 -1
  26. package/dist/core/middleware/built-in/cache/adapters/cache/file.js.map +1 -0
  27. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/index.d.ts +1 -1
  28. package/dist/core/middleware/built-in/cache/adapters/cache/index.js.map +1 -0
  29. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/memory.d.ts +1 -1
  30. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/memory.js +1 -1
  31. package/dist/core/middleware/built-in/cache/adapters/cache/memory.js.map +1 -0
  32. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/redis.d.ts +1 -1
  33. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/redis.js +2 -2
  34. package/dist/core/middleware/built-in/cache/adapters/cache/redis.js.map +1 -0
  35. package/dist/core/middleware/built-in/{adapters → cache/adapters}/index.d.ts +0 -2
  36. package/{src/core/middleware/built-in/adapters/index.ts → dist/core/middleware/built-in/cache/adapters/index.js} +1 -3
  37. package/dist/core/middleware/built-in/cache/adapters/index.js.map +1 -0
  38. package/dist/core/middleware/built-in/cache/core.d.ts +37 -0
  39. package/dist/core/middleware/built-in/cache/core.js +87 -0
  40. package/dist/core/middleware/built-in/cache/core.js.map +1 -0
  41. package/dist/core/middleware/built-in/cache/hook.d.ts +20 -0
  42. package/dist/core/middleware/built-in/{cache.js → cache/hook.js} +22 -5
  43. package/dist/core/middleware/built-in/cache/hook.js.map +1 -0
  44. package/dist/core/middleware/built-in/cache/index.d.ts +3 -0
  45. package/dist/core/middleware/built-in/cache/index.js +9 -0
  46. package/dist/core/middleware/built-in/cache/index.js.map +1 -0
  47. package/dist/core/middleware/built-in/cache/middleware.d.ts +17 -0
  48. package/dist/core/middleware/built-in/cache/middleware.js +44 -0
  49. package/dist/core/middleware/built-in/cache/middleware.js.map +1 -0
  50. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/azure.d.ts +1 -1
  51. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/azure.js +1 -1
  52. package/dist/core/middleware/built-in/cdn/adapters/cdn/azure.js.map +1 -0
  53. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudflare.d.ts +1 -1
  54. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudflare.js +1 -1
  55. package/dist/core/middleware/built-in/cdn/adapters/cdn/cloudflare.js.map +1 -0
  56. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudfront.d.ts +1 -1
  57. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudfront.js +2 -2
  58. package/dist/core/middleware/built-in/cdn/adapters/cdn/cloudfront.js.map +1 -0
  59. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/index.d.ts +1 -1
  60. package/dist/core/middleware/built-in/cdn/adapters/cdn/index.js.map +1 -0
  61. package/dist/core/middleware/built-in/cdn/adapters/index.d.ts +2 -0
  62. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/index.js +0 -2
  63. package/dist/core/middleware/built-in/cdn/adapters/index.js.map +1 -0
  64. package/dist/core/middleware/built-in/cdn/core.d.ts +43 -0
  65. package/dist/core/middleware/built-in/cdn/core.js +144 -0
  66. package/dist/core/middleware/built-in/cdn/core.js.map +1 -0
  67. package/dist/core/middleware/built-in/cdn/hook.d.ts +22 -0
  68. package/dist/core/middleware/built-in/cdn/hook.js +70 -0
  69. package/dist/core/middleware/built-in/cdn/hook.js.map +1 -0
  70. package/dist/core/middleware/built-in/cdn/index.d.ts +5 -0
  71. package/dist/core/middleware/built-in/cdn/index.js +11 -0
  72. package/dist/core/middleware/built-in/cdn/index.js.map +1 -0
  73. package/dist/core/middleware/built-in/cdn/middleware.d.ts +21 -0
  74. package/dist/core/middleware/built-in/cdn/middleware.js +52 -0
  75. package/dist/core/middleware/built-in/cdn/middleware.js.map +1 -0
  76. package/dist/core/middleware/built-in/cookie/core.d.ts +37 -0
  77. package/dist/core/middleware/built-in/cookie/core.js +83 -0
  78. package/dist/core/middleware/built-in/cookie/core.js.map +1 -0
  79. package/dist/core/middleware/built-in/cookie/hook.d.ts +20 -0
  80. package/dist/core/middleware/built-in/cookie/hook.js +47 -0
  81. package/dist/core/middleware/built-in/cookie/hook.js.map +1 -0
  82. package/dist/core/middleware/built-in/cookie/index.d.ts +3 -0
  83. package/dist/core/middleware/built-in/cookie/index.js +9 -0
  84. package/dist/core/middleware/built-in/cookie/index.js.map +1 -0
  85. package/dist/core/middleware/built-in/cookie/middleware.d.ts +17 -0
  86. package/dist/core/middleware/built-in/cookie/middleware.js +36 -0
  87. package/dist/core/middleware/built-in/cookie/middleware.js.map +1 -0
  88. package/dist/core/middleware/built-in/cors/core.d.ts +23 -0
  89. package/dist/core/middleware/built-in/cors/core.js +51 -0
  90. package/dist/core/middleware/built-in/cors/core.js.map +1 -0
  91. package/dist/core/middleware/built-in/cors/hook.d.ts +17 -0
  92. package/dist/core/middleware/built-in/cors/hook.js +37 -0
  93. package/dist/core/middleware/built-in/cors/hook.js.map +1 -0
  94. package/dist/core/middleware/built-in/cors/index.d.ts +3 -0
  95. package/dist/core/middleware/built-in/cors/index.js +9 -0
  96. package/dist/core/middleware/built-in/cors/index.js.map +1 -0
  97. package/dist/core/middleware/built-in/cors/middleware.d.ts +16 -0
  98. package/dist/core/middleware/built-in/cors/middleware.js +22 -0
  99. package/dist/core/middleware/built-in/cors/middleware.js.map +1 -0
  100. package/dist/core/middleware/built-in/csp/core.d.ts +45 -0
  101. package/dist/core/middleware/built-in/csp/core.js +88 -0
  102. package/dist/core/middleware/built-in/csp/core.js.map +1 -0
  103. package/dist/core/middleware/built-in/csp/hook.d.ts +22 -0
  104. package/dist/core/middleware/built-in/csp/hook.js +47 -0
  105. package/dist/core/middleware/built-in/csp/hook.js.map +1 -0
  106. package/dist/core/middleware/built-in/csp/index.d.ts +3 -0
  107. package/dist/core/middleware/built-in/csp/index.js +9 -0
  108. package/dist/core/middleware/built-in/csp/index.js.map +1 -0
  109. package/dist/core/middleware/built-in/csp/middleware.d.ts +19 -0
  110. package/dist/core/middleware/built-in/csp/middleware.js +29 -0
  111. package/dist/core/middleware/built-in/csp/middleware.js.map +1 -0
  112. package/dist/core/middleware/built-in/csrf/core.d.ts +28 -0
  113. package/dist/core/middleware/built-in/csrf/core.js +69 -0
  114. package/dist/core/middleware/built-in/csrf/core.js.map +1 -0
  115. package/dist/core/middleware/built-in/csrf/hook.d.ts +17 -0
  116. package/dist/core/middleware/built-in/csrf/hook.js +45 -0
  117. package/dist/core/middleware/built-in/csrf/hook.js.map +1 -0
  118. package/dist/core/middleware/built-in/csrf/index.d.ts +3 -0
  119. package/dist/core/middleware/built-in/csrf/index.js +9 -0
  120. package/dist/core/middleware/built-in/csrf/index.js.map +1 -0
  121. package/dist/core/middleware/built-in/csrf/middleware.d.ts +16 -0
  122. package/dist/core/middleware/built-in/csrf/middleware.js +34 -0
  123. package/dist/core/middleware/built-in/csrf/middleware.js.map +1 -0
  124. package/dist/core/middleware/built-in/error-tracker/index.d.ts +1 -0
  125. package/dist/core/middleware/built-in/error-tracker/index.js +4 -0
  126. package/dist/core/middleware/built-in/error-tracker/index.js.map +1 -0
  127. package/dist/core/middleware/built-in/error-tracker/middleware.d.ts +12 -0
  128. package/dist/core/middleware/built-in/{error-tracker.js → error-tracker/middleware.js} +14 -3
  129. package/dist/core/middleware/built-in/error-tracker/middleware.js.map +1 -0
  130. package/dist/core/middleware/built-in/index.d.ts +25 -59
  131. package/dist/core/middleware/built-in/index.js +31 -31
  132. package/dist/core/middleware/built-in/index.js.map +1 -1
  133. package/dist/core/middleware/built-in/performance-monitor/index.d.ts +1 -0
  134. package/dist/core/middleware/built-in/performance-monitor/index.js +4 -0
  135. package/dist/core/middleware/built-in/performance-monitor/index.js.map +1 -0
  136. package/dist/core/middleware/built-in/performance-monitor/middleware.d.ts +12 -0
  137. package/dist/core/middleware/built-in/{performance-monitor.js → performance-monitor/middleware.js} +14 -3
  138. package/dist/core/middleware/built-in/performance-monitor/middleware.js.map +1 -0
  139. package/dist/core/middleware/built-in/rate-limit/core.d.ts +33 -0
  140. package/dist/core/middleware/built-in/rate-limit/core.js +86 -0
  141. package/dist/core/middleware/built-in/rate-limit/core.js.map +1 -0
  142. package/dist/core/middleware/built-in/rate-limit/hook.d.ts +20 -0
  143. package/dist/core/middleware/built-in/{rate-limit.js → rate-limit/hook.js} +22 -16
  144. package/dist/core/middleware/built-in/rate-limit/hook.js.map +1 -0
  145. package/dist/core/middleware/built-in/rate-limit/index.d.ts +3 -0
  146. package/dist/core/middleware/built-in/rate-limit/index.js +9 -0
  147. package/dist/core/middleware/built-in/rate-limit/index.js.map +1 -0
  148. package/dist/core/middleware/built-in/rate-limit/middleware.d.ts +16 -0
  149. package/dist/core/middleware/built-in/rate-limit/middleware.js +35 -0
  150. package/dist/core/middleware/built-in/rate-limit/middleware.js.map +1 -0
  151. package/dist/core/middleware/built-in/request-logger/index.d.ts +1 -0
  152. package/dist/core/middleware/built-in/request-logger/index.js +4 -0
  153. package/dist/core/middleware/built-in/request-logger/index.js.map +1 -0
  154. package/dist/core/middleware/built-in/request-logger/middleware.d.ts +12 -0
  155. package/dist/core/middleware/built-in/{request-logger.js → request-logger/middleware.js} +14 -3
  156. package/dist/core/middleware/built-in/request-logger/middleware.js.map +1 -0
  157. package/dist/core/middleware/built-in/session/core.d.ts +73 -0
  158. package/dist/core/middleware/built-in/session/core.js +227 -0
  159. package/dist/core/middleware/built-in/session/core.js.map +1 -0
  160. package/dist/core/middleware/built-in/session/hook.d.ts +17 -0
  161. package/dist/core/middleware/built-in/session/hook.js +53 -0
  162. package/dist/core/middleware/built-in/session/hook.js.map +1 -0
  163. package/dist/core/middleware/built-in/session/index.d.ts +3 -0
  164. package/dist/core/middleware/built-in/session/index.js +9 -0
  165. package/dist/core/middleware/built-in/session/index.js.map +1 -0
  166. package/dist/core/middleware/built-in/session/middleware.d.ts +17 -0
  167. package/dist/core/middleware/built-in/session/middleware.js +38 -0
  168. package/dist/core/middleware/built-in/session/middleware.js.map +1 -0
  169. package/dist/core/middleware/built-in/sse/core.d.ts +44 -0
  170. package/dist/core/middleware/built-in/sse/core.js +117 -0
  171. package/dist/core/middleware/built-in/sse/core.js.map +1 -0
  172. package/dist/core/middleware/built-in/sse/hook.d.ts +18 -0
  173. package/dist/core/middleware/built-in/sse/hook.js +60 -0
  174. package/dist/core/middleware/built-in/sse/hook.js.map +1 -0
  175. package/dist/core/middleware/built-in/sse/index.d.ts +3 -0
  176. package/dist/core/middleware/built-in/sse/index.js +9 -0
  177. package/dist/core/middleware/built-in/sse/index.js.map +1 -0
  178. package/dist/core/middleware/built-in/sse/middleware.d.ts +18 -0
  179. package/dist/core/middleware/built-in/sse/middleware.js +43 -0
  180. package/dist/core/middleware/built-in/sse/middleware.js.map +1 -0
  181. package/dist/core/middleware/built-in/validation/core.d.ts +23 -0
  182. package/dist/core/middleware/built-in/validation/core.js +93 -0
  183. package/dist/core/middleware/built-in/validation/core.js.map +1 -0
  184. package/dist/core/middleware/built-in/validation/hook.d.ts +13 -0
  185. package/dist/core/middleware/built-in/{validation.js → validation/hook.js} +14 -3
  186. package/dist/core/middleware/built-in/validation/hook.js.map +1 -0
  187. package/dist/core/middleware/built-in/validation/index.d.ts +3 -0
  188. package/dist/core/middleware/built-in/validation/index.js +9 -0
  189. package/dist/core/middleware/built-in/validation/index.js.map +1 -0
  190. package/dist/core/middleware/built-in/validation/middleware.d.ts +16 -0
  191. package/dist/core/middleware/built-in/validation/middleware.js +27 -0
  192. package/dist/core/middleware/built-in/validation/middleware.js.map +1 -0
  193. package/dist/core/middleware/index.js +6 -0
  194. package/dist/core/middleware/index.js.map +1 -1
  195. package/dist/core/routing/unified-router.d.ts +4 -20
  196. package/dist/core/routing/unified-router.js +61 -106
  197. package/dist/core/routing/unified-router.js.map +1 -1
  198. package/dist/index.d.ts +3 -2
  199. package/dist/index.js +3 -2
  200. package/dist/index.js.map +1 -1
  201. package/dist/moro.js +12 -18
  202. package/dist/moro.js.map +1 -1
  203. package/dist/types/hooks.d.ts +3 -0
  204. package/package.json +2 -6
  205. package/dist/core/middleware/built-in/adapters/cache/file.js.map +0 -1
  206. package/dist/core/middleware/built-in/adapters/cache/index.js.map +0 -1
  207. package/dist/core/middleware/built-in/adapters/cache/memory.js.map +0 -1
  208. package/dist/core/middleware/built-in/adapters/cache/redis.js.map +0 -1
  209. package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +0 -1
  210. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +0 -1
  211. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +0 -1
  212. package/dist/core/middleware/built-in/adapters/cdn/index.js.map +0 -1
  213. package/dist/core/middleware/built-in/adapters/index.js.map +0 -1
  214. package/dist/core/middleware/built-in/auth-helpers.js.map +0 -1
  215. package/dist/core/middleware/built-in/auth-providers.js.map +0 -1
  216. package/dist/core/middleware/built-in/auth.d.ts +0 -30
  217. package/dist/core/middleware/built-in/auth.js +0 -348
  218. package/dist/core/middleware/built-in/auth.js.map +0 -1
  219. package/dist/core/middleware/built-in/cache.d.ts +0 -3
  220. package/dist/core/middleware/built-in/cache.js.map +0 -1
  221. package/dist/core/middleware/built-in/cdn.d.ts +0 -3
  222. package/dist/core/middleware/built-in/cdn.js +0 -109
  223. package/dist/core/middleware/built-in/cdn.js.map +0 -1
  224. package/dist/core/middleware/built-in/cookie.d.ts +0 -14
  225. package/dist/core/middleware/built-in/cookie.js +0 -64
  226. package/dist/core/middleware/built-in/cookie.js.map +0 -1
  227. package/dist/core/middleware/built-in/cors.d.ts +0 -2
  228. package/dist/core/middleware/built-in/cors.js +0 -25
  229. package/dist/core/middleware/built-in/cors.js.map +0 -1
  230. package/dist/core/middleware/built-in/csp.d.ts +0 -22
  231. package/dist/core/middleware/built-in/csp.js +0 -68
  232. package/dist/core/middleware/built-in/csp.js.map +0 -1
  233. package/dist/core/middleware/built-in/csrf.d.ts +0 -9
  234. package/dist/core/middleware/built-in/csrf.js +0 -60
  235. package/dist/core/middleware/built-in/csrf.js.map +0 -1
  236. package/dist/core/middleware/built-in/error-tracker.d.ts +0 -1
  237. package/dist/core/middleware/built-in/error-tracker.js.map +0 -1
  238. package/dist/core/middleware/built-in/jwt-helpers.js.map +0 -1
  239. package/dist/core/middleware/built-in/performance-monitor.d.ts +0 -1
  240. package/dist/core/middleware/built-in/performance-monitor.js.map +0 -1
  241. package/dist/core/middleware/built-in/rate-limit.d.ts +0 -6
  242. package/dist/core/middleware/built-in/rate-limit.js.map +0 -1
  243. package/dist/core/middleware/built-in/request-logger.d.ts +0 -1
  244. package/dist/core/middleware/built-in/request-logger.js.map +0 -1
  245. package/dist/core/middleware/built-in/session.d.ts +0 -41
  246. package/dist/core/middleware/built-in/session.js +0 -205
  247. package/dist/core/middleware/built-in/session.js.map +0 -1
  248. package/dist/core/middleware/built-in/sse.d.ts +0 -6
  249. package/dist/core/middleware/built-in/sse.js +0 -69
  250. package/dist/core/middleware/built-in/sse.js.map +0 -1
  251. package/dist/core/middleware/built-in/validation.d.ts +0 -2
  252. package/dist/core/middleware/built-in/validation.js.map +0 -1
  253. package/jest.config.mjs +0 -41
  254. package/src/core/auth/README.md +0 -339
  255. package/src/core/auth/morojs-adapter.ts +0 -415
  256. package/src/core/config/config-manager.ts +0 -133
  257. package/src/core/config/config-sources.ts +0 -600
  258. package/src/core/config/config-validator.ts +0 -1116
  259. package/src/core/config/file-loader.ts +0 -150
  260. package/src/core/config/index.ts +0 -109
  261. package/src/core/config/schema.ts +0 -164
  262. package/src/core/config/utils.ts +0 -244
  263. package/src/core/database/README.md +0 -238
  264. package/src/core/database/adapters/drizzle.ts +0 -415
  265. package/src/core/database/adapters/index.ts +0 -42
  266. package/src/core/database/adapters/mongodb.ts +0 -317
  267. package/src/core/database/adapters/mysql.ts +0 -235
  268. package/src/core/database/adapters/postgresql.ts +0 -226
  269. package/src/core/database/adapters/redis.ts +0 -379
  270. package/src/core/database/adapters/sqlite.ts +0 -263
  271. package/src/core/database/index.ts +0 -3
  272. package/src/core/docs/index.ts +0 -231
  273. package/src/core/docs/openapi-generator.ts +0 -576
  274. package/src/core/docs/schema-to-openapi.ts +0 -145
  275. package/src/core/docs/simple-docs.ts +0 -295
  276. package/src/core/docs/swagger-ui.ts +0 -354
  277. package/src/core/docs/zod-to-openapi.ts +0 -532
  278. package/src/core/events/event-bus.ts +0 -231
  279. package/src/core/events/index.ts +0 -12
  280. package/src/core/framework.ts +0 -885
  281. package/src/core/http/http-server.ts +0 -1847
  282. package/src/core/http/index.ts +0 -7
  283. package/src/core/http/uws-http-server.ts +0 -591
  284. package/src/core/logger/filters.ts +0 -153
  285. package/src/core/logger/index.ts +0 -21
  286. package/src/core/logger/logger.ts +0 -1033
  287. package/src/core/logger/outputs.ts +0 -132
  288. package/src/core/middleware/built-in/adapters/cache/file.ts +0 -104
  289. package/src/core/middleware/built-in/adapters/cache/index.ts +0 -23
  290. package/src/core/middleware/built-in/adapters/cache/memory.ts +0 -73
  291. package/src/core/middleware/built-in/adapters/cache/redis.ts +0 -114
  292. package/src/core/middleware/built-in/adapters/cdn/azure.ts +0 -60
  293. package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +0 -83
  294. package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +0 -94
  295. package/src/core/middleware/built-in/adapters/cdn/index.ts +0 -23
  296. package/src/core/middleware/built-in/auth-helpers.ts +0 -401
  297. package/src/core/middleware/built-in/auth-providers.ts +0 -480
  298. package/src/core/middleware/built-in/auth.ts +0 -410
  299. package/src/core/middleware/built-in/cache.ts +0 -213
  300. package/src/core/middleware/built-in/cdn.ts +0 -124
  301. package/src/core/middleware/built-in/cookie.ts +0 -85
  302. package/src/core/middleware/built-in/cors.ts +0 -38
  303. package/src/core/middleware/built-in/csp.ts +0 -101
  304. package/src/core/middleware/built-in/csrf.ts +0 -82
  305. package/src/core/middleware/built-in/error-tracker.ts +0 -16
  306. package/src/core/middleware/built-in/index.ts +0 -87
  307. package/src/core/middleware/built-in/jwt-helpers.ts +0 -243
  308. package/src/core/middleware/built-in/performance-monitor.ts +0 -25
  309. package/src/core/middleware/built-in/rate-limit.ts +0 -60
  310. package/src/core/middleware/built-in/request-logger.ts +0 -16
  311. package/src/core/middleware/built-in/session.ts +0 -287
  312. package/src/core/middleware/built-in/sse.ts +0 -88
  313. package/src/core/middleware/built-in/validation.ts +0 -33
  314. package/src/core/middleware/index.ts +0 -177
  315. package/src/core/modules/auto-discovery.ts +0 -726
  316. package/src/core/modules/index.ts +0 -3
  317. package/src/core/modules/modules.ts +0 -135
  318. package/src/core/networking/adapters/index.ts +0 -17
  319. package/src/core/networking/adapters/socketio-adapter.ts +0 -254
  320. package/src/core/networking/adapters/uws-adapter.ts +0 -619
  321. package/src/core/networking/adapters/ws-adapter.ts +0 -429
  322. package/src/core/networking/index.ts +0 -4
  323. package/src/core/networking/service-discovery.ts +0 -303
  324. package/src/core/networking/websocket-adapter.ts +0 -217
  325. package/src/core/networking/websocket-manager.ts +0 -308
  326. package/src/core/pooling/object-pool-manager.ts +0 -630
  327. package/src/core/routing/app-integration.ts +0 -164
  328. package/src/core/routing/index.ts +0 -261
  329. package/src/core/routing/path-matcher.ts +0 -222
  330. package/src/core/routing/router.ts +0 -97
  331. package/src/core/routing/unified-router.ts +0 -870
  332. package/src/core/runtime/aws-lambda-adapter.ts +0 -147
  333. package/src/core/runtime/base-adapter.ts +0 -130
  334. package/src/core/runtime/cloudflare-workers-adapter.ts +0 -152
  335. package/src/core/runtime/index.ts +0 -62
  336. package/src/core/runtime/node-adapter.ts +0 -202
  337. package/src/core/runtime/vercel-edge-adapter.ts +0 -114
  338. package/src/core/utilities/circuit-breaker.ts +0 -46
  339. package/src/core/utilities/container.ts +0 -736
  340. package/src/core/utilities/hooks.ts +0 -142
  341. package/src/core/utilities/index.ts +0 -17
  342. package/src/core/utilities/package-utils.ts +0 -59
  343. package/src/core/validation/adapters.ts +0 -147
  344. package/src/core/validation/index.ts +0 -258
  345. package/src/core/validation/schema-interface.ts +0 -100
  346. package/src/index.ts +0 -233
  347. package/src/moro.ts +0 -1728
  348. package/src/types/auth.ts +0 -440
  349. package/src/types/cache.ts +0 -38
  350. package/src/types/cdn.ts +0 -22
  351. package/src/types/config.ts +0 -229
  352. package/src/types/core.ts +0 -58
  353. package/src/types/database.ts +0 -32
  354. package/src/types/discovery.ts +0 -7
  355. package/src/types/events.ts +0 -82
  356. package/src/types/hooks.ts +0 -47
  357. package/src/types/http.ts +0 -89
  358. package/src/types/logger.ts +0 -102
  359. package/src/types/module.ts +0 -99
  360. package/src/types/runtime.ts +0 -76
  361. package/src/types/session.ts +0 -89
  362. package/tsconfig.json +0 -23
  363. /package/dist/core/middleware/built-in/{auth-helpers.d.ts → auth/helpers.d.ts} +0 -0
  364. /package/dist/core/middleware/built-in/{jwt-helpers.d.ts → auth/jwt-helpers.d.ts} +0 -0
  365. /package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/index.js +0 -0
  366. /package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/index.js +0 -0
@@ -1,726 +0,0 @@
1
- // Auto-discovery system for Moro modules
2
- import { readdirSync, statSync } from 'fs';
3
- import { join, extname, relative, isAbsolute } from 'path';
4
- import { ModuleConfig } from '../../types/module.js';
5
- import { DiscoveryOptions } from '../../types/discovery.js';
6
- import { ModuleDefaultsConfig } from '../../types/config.js';
7
- import { createFrameworkLogger } from '../logger/index.js';
8
-
9
- export class ModuleDiscovery {
10
- private baseDir: string;
11
- private options: DiscoveryOptions;
12
- private discoveryLogger = createFrameworkLogger('MODULE_DISCOVERY');
13
- private watchers: any[] = []; // Store file watchers for cleanup
14
-
15
- constructor(baseDir: string = process.cwd(), options: DiscoveryOptions = {}) {
16
- this.baseDir = baseDir;
17
- this.options = {
18
- pattern: /\.(module|config)\.(ts|js)$/,
19
- recursive: true,
20
- extensions: ['.ts', '.js'],
21
- ...options,
22
- };
23
- }
24
-
25
- // Auto-discover modules in the filesystem
26
- async discoverModules(): Promise<ModuleConfig[]> {
27
- const modules: ModuleConfig[] = [];
28
- const modulePaths = this.findModuleFiles();
29
-
30
- for (const modulePath of modulePaths) {
31
- try {
32
- const module = await this.loadModule(modulePath);
33
- if (module) {
34
- modules.push(module);
35
- this.discoveryLogger.info(
36
- `Auto-discovered module: ${module.name}@${module.version} from ${modulePath}`
37
- );
38
- }
39
- } catch (error) {
40
- this.discoveryLogger.warn(`Failed to load module from ${modulePath}`, 'MODULE_DISCOVERY', {
41
- error: error instanceof Error ? error.message : String(error),
42
- });
43
- }
44
- }
45
-
46
- return modules;
47
- }
48
-
49
- // Find modules by directory structure
50
- async discoverModuleDirectories(modulesDir: string = 'src/modules'): Promise<ModuleConfig[]> {
51
- const modules: ModuleConfig[] = [];
52
- const fullPath = join(this.baseDir, modulesDir);
53
-
54
- try {
55
- if (!statSync(fullPath).isDirectory()) {
56
- return modules;
57
- }
58
-
59
- const items = readdirSync(fullPath);
60
-
61
- for (const item of items) {
62
- const itemPath = join(fullPath, item);
63
-
64
- if (statSync(itemPath).isDirectory()) {
65
- const indexPath = join(itemPath, 'index.ts');
66
-
67
- try {
68
- if (statSync(indexPath).isFile()) {
69
- const module = await this.loadModule(indexPath);
70
- if (module) {
71
- modules.push(module);
72
- this.discoveryLogger.info(
73
- `Auto-discovered module directory: ${module.name} from ${item}/`
74
- );
75
- }
76
- }
77
- } catch {
78
- // Try alternate patterns
79
- const alternates = ['module.ts', `${item}.module.ts`, 'config.ts'];
80
-
81
- for (const alt of alternates) {
82
- const altPath = join(itemPath, alt);
83
- try {
84
- if (statSync(altPath).isFile()) {
85
- const module = await this.loadModule(altPath);
86
- if (module) {
87
- modules.push(module);
88
- this.discoveryLogger.info(
89
- `Auto-discovered module: ${module.name} from ${item}/${alt}`
90
- );
91
- break;
92
- }
93
- }
94
- } catch {
95
- // Continue trying
96
- }
97
- }
98
- }
99
- }
100
- }
101
- } catch {
102
- // Directory doesn't exist, that's fine
103
- }
104
-
105
- return modules;
106
- }
107
-
108
- // Find all module files matching the pattern
109
- private findModuleFiles(): string[] {
110
- const files: string[] = [];
111
- this.scanDirectory(this.baseDir, files);
112
- return files.filter(file => this.options.pattern?.test(file));
113
- }
114
-
115
- // Recursively scan directories for module files
116
- private scanDirectory(dir: string, files: string[]): void {
117
- try {
118
- const items = readdirSync(dir);
119
-
120
- for (const item of items) {
121
- const fullPath = join(dir, item);
122
- const stat = statSync(fullPath);
123
-
124
- if (stat.isDirectory()) {
125
- // Skip node_modules and other common directories
126
- if (!['node_modules', '.git', 'dist', 'build'].includes(item) && this.options.recursive) {
127
- this.scanDirectory(fullPath, files);
128
- }
129
- } else if (stat.isFile()) {
130
- const ext = extname(item);
131
- if (this.options.extensions?.includes(ext)) {
132
- files.push(fullPath);
133
- }
134
- }
135
- }
136
- } catch {
137
- // Directory not accessible, skip
138
- }
139
- }
140
-
141
- // Load a module from a file path
142
- private async loadModule(modulePath: string): Promise<ModuleConfig | null> {
143
- try {
144
- const module = await import(modulePath);
145
-
146
- // Try different export patterns
147
- const candidates = [
148
- module.default,
149
- module.module,
150
- module.config,
151
- module,
152
- ...Object.values(module).filter(
153
- exp => exp && typeof exp === 'object' && 'name' in exp && 'version' in exp
154
- ),
155
- ];
156
-
157
- for (const candidate of candidates) {
158
- if (this.isValidModule(candidate)) {
159
- return candidate as ModuleConfig;
160
- }
161
- }
162
-
163
- return null;
164
- } catch (error) {
165
- throw new Error(`Failed to import module: ${(error as Error).message}`);
166
- }
167
- }
168
-
169
- // Validate that an object is a valid ModuleConfig
170
- private isValidModule(obj: any): boolean {
171
- return (
172
- obj &&
173
- typeof obj === 'object' &&
174
- typeof obj.name === 'string' &&
175
- typeof obj.version === 'string' &&
176
- (obj.routes === undefined || Array.isArray(obj.routes)) &&
177
- (obj.websockets === undefined || Array.isArray(obj.websockets)) &&
178
- (obj.services === undefined || Array.isArray(obj.services))
179
- );
180
- }
181
-
182
- // Enhanced auto-discovery with advanced configuration
183
- async discoverModulesAdvanced(
184
- config: ModuleDefaultsConfig['autoDiscovery']
185
- ): Promise<ModuleConfig[]> {
186
- if (!config.enabled) {
187
- return [];
188
- }
189
-
190
- const allModules: ModuleConfig[] = [];
191
-
192
- // Discover from all configured paths
193
- for (const searchPath of config.paths) {
194
- const modules = await this.discoverFromPath(searchPath, config);
195
- allModules.push(...modules);
196
- }
197
-
198
- // Remove duplicates based on name@version
199
- const uniqueModules = this.deduplicateModules(allModules);
200
-
201
- // Sort modules based on load order strategy
202
- const sortedModules = this.sortModules(uniqueModules, config.loadOrder);
203
-
204
- // Validate dependencies if using dependency order
205
- if (config.loadOrder === 'dependency') {
206
- return this.resolveDependencyOrder(sortedModules);
207
- }
208
-
209
- return sortedModules;
210
- }
211
-
212
- // Discover modules from a specific path with advanced filtering
213
- private async discoverFromPath(
214
- searchPath: string,
215
- config: ModuleDefaultsConfig['autoDiscovery']
216
- ): Promise<ModuleConfig[]> {
217
- const modules: ModuleConfig[] = [];
218
- const fullPath = join(this.baseDir, searchPath);
219
-
220
- try {
221
- const stat = statSync(fullPath);
222
-
223
- if (!stat.isDirectory()) {
224
- return modules;
225
- }
226
- } catch (error) {
227
- return modules;
228
- }
229
-
230
- try {
231
- const files = await this.findMatchingFilesWithGlob(
232
- fullPath,
233
- config.patterns,
234
- config.ignorePatterns,
235
- config.maxDepth
236
- );
237
-
238
- for (const filePath of files) {
239
- try {
240
- // Convert relative path to absolute path for import
241
- const absolutePath = join(this.baseDir, filePath);
242
- const module = await this.loadModule(absolutePath);
243
- if (module && this.validateAdvancedModule(module, config)) {
244
- modules.push(module);
245
- this.discoveryLogger.info(
246
- `Auto-discovered module: ${module.name}@${module.version} from ${filePath}`
247
- );
248
- }
249
- } catch (error) {
250
- const errorMsg = error instanceof Error ? error.message : String(error);
251
-
252
- if (config.failOnError) {
253
- throw new Error(`Failed to load module from ${filePath}: ${errorMsg}`);
254
- } else {
255
- this.discoveryLogger.warn(
256
- `Failed to load module from ${filePath}`,
257
- 'MODULE_DISCOVERY',
258
- {
259
- error: errorMsg,
260
- }
261
- );
262
- }
263
- }
264
- }
265
- } catch (error) {
266
- if (config.failOnError) {
267
- throw error;
268
- }
269
- // Directory doesn't exist or other error, continue silently
270
- }
271
-
272
- return modules;
273
- }
274
-
275
- // Find files matching patterns with ignore support
276
- private findMatchingFiles(
277
- basePath: string,
278
- config: ModuleDefaultsConfig['autoDiscovery'],
279
- currentDepth: number = 0
280
- ): string[] {
281
- const files: string[] = [];
282
-
283
- if (currentDepth >= config.maxDepth) {
284
- return files;
285
- }
286
-
287
- try {
288
- const items = readdirSync(basePath);
289
-
290
- for (const item of items) {
291
- const fullPath = join(basePath, item);
292
- const relativePath = relative(this.baseDir, fullPath);
293
-
294
- // Check ignore patterns
295
- if (this.shouldIgnore(relativePath, config.ignorePatterns)) {
296
- continue;
297
- }
298
-
299
- const stat = statSync(fullPath);
300
-
301
- if (stat.isDirectory() && config.recursive) {
302
- files.push(...this.findMatchingFiles(fullPath, config, currentDepth + 1));
303
- } else if (stat.isFile()) {
304
- // Check if file matches any pattern
305
- if (this.matchesPatterns(relativePath, config.patterns)) {
306
- files.push(fullPath);
307
- }
308
- }
309
- }
310
- } catch {
311
- // Directory not accessible, skip
312
- }
313
-
314
- return files;
315
- }
316
-
317
- // Use native Node.js glob to find matching files
318
- private async findMatchingFilesWithGlob(
319
- searchPath: string,
320
- patterns: string[],
321
- ignorePatterns: string[],
322
- maxDepth: number = 5
323
- ): Promise<string[]> {
324
- // Force fallback in CI environments or if Node.js version is uncertain
325
- const isCI = process.env.CI === 'true' || process.env.GITHUB_ACTIONS === 'true';
326
-
327
- if (isCI) {
328
- return this.findMatchingFilesFallback(searchPath, patterns, ignorePatterns, maxDepth);
329
- }
330
-
331
- const allFiles: string[] = [];
332
-
333
- try {
334
- // Try to use native fs.glob if available (Node.js 20+)
335
- const { glob } = await import('fs/promises');
336
-
337
- // Check if glob is actually a function and test it
338
- if (typeof glob !== 'function') {
339
- return this.findMatchingFilesFallback(searchPath, patterns, ignorePatterns, maxDepth);
340
- }
341
-
342
- // Test glob with a simple pattern first
343
- try {
344
- const testIterator = glob(join(searchPath, '*'));
345
- let testCount = 0;
346
- for await (const _ of testIterator) {
347
- testCount++;
348
- if (testCount > 0) break; // Just test that it works
349
- }
350
- } catch (testError) {
351
- return this.findMatchingFilesFallback(searchPath, patterns, ignorePatterns, maxDepth);
352
- }
353
-
354
- for (const pattern of patterns) {
355
- const fullPattern = join(searchPath, pattern);
356
- try {
357
- // fs.glob returns an AsyncIterator, need to collect results
358
- const globIterator = glob(fullPattern);
359
- const files: string[] = [];
360
-
361
- for await (const file of globIterator) {
362
- const filePath = typeof file === 'string' ? file : (file as any).name || String(file);
363
- const relativePath = relative(this.baseDir, filePath);
364
-
365
- // Check if file should be ignored and within max depth
366
- if (
367
- !this.shouldIgnore(relativePath, ignorePatterns) &&
368
- this.isWithinMaxDepth(relativePath, searchPath, maxDepth)
369
- ) {
370
- files.push(relativePath);
371
- }
372
- }
373
-
374
- allFiles.push(...files);
375
- } catch (error) {
376
- // If any glob call fails, fall back to manual discovery
377
- this.discoveryLogger.warn(`Glob pattern failed: ${pattern}`, String(error));
378
- return this.findMatchingFilesFallback(searchPath, patterns, ignorePatterns, maxDepth);
379
- }
380
- }
381
- } catch (error) {
382
- // fs.glob not available, fall back to manual file discovery
383
- this.discoveryLogger.debug('Native fs.glob not available, using fallback');
384
- return this.findMatchingFilesFallback(searchPath, patterns, ignorePatterns, maxDepth);
385
- }
386
-
387
- return [...new Set(allFiles)]; // Remove duplicates
388
- }
389
-
390
- // Fallback for Node.js versions without fs.glob
391
- private async findMatchingFilesFallback(
392
- searchPath: string,
393
- patterns: string[],
394
- ignorePatterns: string[],
395
- maxDepth: number = 5
396
- ): Promise<string[]> {
397
- const config = {
398
- patterns,
399
- ignorePatterns,
400
- maxDepth,
401
- recursive: true,
402
- } as ModuleDefaultsConfig['autoDiscovery'];
403
-
404
- // Handle both absolute and relative paths
405
- const fullSearchPath = isAbsolute(searchPath) ? searchPath : join(this.baseDir, searchPath);
406
-
407
- // Check if search path exists
408
- try {
409
- const { access } = await import('fs/promises');
410
- await access(fullSearchPath);
411
- } catch (e) {
412
- return [];
413
- }
414
-
415
- // Get files and convert to relative paths
416
- const files = this.findMatchingFiles(fullSearchPath, config);
417
- const relativeFiles = files.map(file => relative(this.baseDir, file));
418
-
419
- return relativeFiles;
420
- }
421
-
422
- // Simple pattern matching for fallback (basic glob support)
423
- private matchesSimplePattern(path: string, pattern: string): boolean {
424
- try {
425
- // Normalize path separators
426
- const normalizedPath = path.replace(/\\/g, '/');
427
- const normalizedPattern = pattern.replace(/\\/g, '/');
428
-
429
- // Convert simple glob patterns to regex
430
- const regexPattern = normalizedPattern
431
- .replace(/\*\*/g, '___DOUBLESTAR___') // Temporarily replace ** BEFORE escaping
432
- .replace(/[.+^${}()|[\]\\]/g, '\\$&') // Escape regex chars
433
- .replace(/\\\*/g, '[^/]*') // * matches anything except /
434
- .replace(/___DOUBLESTAR___/g, '.*') // ** matches anything including /
435
- .replace(/\\\?/g, '[^/]') // ? matches single character except /
436
- .replace(/\\\{([^}]+)\\\}/g, '($1)') // {ts,js} -> (ts|js)
437
- .replace(/,/g, '|'); // Convert comma to OR
438
-
439
- const regex = new RegExp(`^${regexPattern}$`, 'i');
440
- const result = regex.test(normalizedPath);
441
-
442
- return result;
443
- } catch (error) {
444
- this.discoveryLogger.warn(`Pattern matching error for "${pattern}": ${String(error)}`);
445
- return false;
446
- }
447
- }
448
-
449
- // Check if path should be ignored
450
- private shouldIgnore(path: string, ignorePatterns: string[]): boolean {
451
- return ignorePatterns.some(pattern => this.matchesSimplePattern(path, pattern));
452
- }
453
-
454
- // Check if path matches any of the patterns
455
- private matchesPatterns(path: string, patterns: string[]): boolean {
456
- return patterns.some(pattern => this.matchesSimplePattern(path, pattern));
457
- }
458
-
459
- // Check if file is within max depth (for glob results)
460
- private isWithinMaxDepth(relativePath: string, searchPath: string, maxDepth: number): boolean {
461
- // Count directory separators to determine depth
462
- const pathFromSearch = relative(searchPath, join(this.baseDir, relativePath));
463
- const depth = pathFromSearch.split('/').length - 1; // -1 because file itself doesn't count as depth
464
- return depth <= maxDepth;
465
- }
466
-
467
- // Remove duplicate modules
468
- private deduplicateModules(modules: ModuleConfig[]): ModuleConfig[] {
469
- const seen = new Set<string>();
470
- return modules.filter(module => {
471
- const key = `${module.name}@${module.version}`;
472
- if (seen.has(key)) {
473
- this.discoveryLogger.warn(`Duplicate module found: ${key}`, 'MODULE_DISCOVERY');
474
- return false;
475
- }
476
- seen.add(key);
477
- return true;
478
- });
479
- }
480
-
481
- // Sort modules based on strategy
482
- private sortModules(
483
- modules: ModuleConfig[],
484
- strategy: ModuleDefaultsConfig['autoDiscovery']['loadOrder']
485
- ): ModuleConfig[] {
486
- switch (strategy) {
487
- case 'alphabetical':
488
- return modules.sort((a, b) => a.name.localeCompare(b.name));
489
-
490
- case 'dependency':
491
- // Will be handled by resolveDependencyOrder
492
- return modules;
493
-
494
- case 'custom':
495
- // Allow custom sorting via module priority (if defined)
496
- return modules.sort((a, b) => {
497
- const aPriority = (a.config as any)?.priority || 0;
498
- const bPriority = (b.config as any)?.priority || 0;
499
- return bPriority - aPriority; // Higher priority first
500
- });
501
-
502
- default:
503
- return modules;
504
- }
505
- }
506
-
507
- // Resolve dependency order using topological sort
508
- private resolveDependencyOrder(modules: ModuleConfig[]): ModuleConfig[] {
509
- const moduleMap = new Map<string, ModuleConfig>();
510
- const dependencyGraph = new Map<string, string[]>();
511
-
512
- // Build module map and dependency graph
513
- modules.forEach(module => {
514
- const key = `${module.name}@${module.version}`;
515
- moduleMap.set(key, module);
516
- dependencyGraph.set(key, module.dependencies || []);
517
- });
518
-
519
- // Topological sort
520
- const visited = new Set<string>();
521
- const visiting = new Set<string>();
522
- const sorted: ModuleConfig[] = [];
523
-
524
- const visit = (moduleKey: string): void => {
525
- if (visiting.has(moduleKey)) {
526
- throw new Error(`Circular dependency detected involving ${moduleKey}`);
527
- }
528
-
529
- if (visited.has(moduleKey)) {
530
- return;
531
- }
532
-
533
- visiting.add(moduleKey);
534
-
535
- const dependencies = dependencyGraph.get(moduleKey) || [];
536
- dependencies.forEach(dep => {
537
- // Find the dependency in our modules
538
- const depModule = Array.from(moduleMap.keys()).find(key =>
539
- key.startsWith(`${dep.split('@')[0]}@`)
540
- );
541
- if (depModule) {
542
- visit(depModule);
543
- }
544
- });
545
-
546
- visiting.delete(moduleKey);
547
- visited.add(moduleKey);
548
-
549
- const module = moduleMap.get(moduleKey);
550
- if (module) {
551
- sorted.push(module);
552
- }
553
- };
554
-
555
- // Visit all modules
556
- Array.from(moduleMap.keys()).forEach(key => {
557
- if (!visited.has(key)) {
558
- visit(key);
559
- }
560
- });
561
-
562
- return sorted;
563
- }
564
-
565
- // Enhanced module validation
566
- private validateAdvancedModule(
567
- module: ModuleConfig,
568
- _config: ModuleDefaultsConfig['autoDiscovery']
569
- ): boolean {
570
- // Basic validation
571
- if (!this.isValidModule(module)) {
572
- return false;
573
- }
574
-
575
- // Additional validation can be added here
576
- // For example, checking module compatibility, version constraints, etc.
577
-
578
- return true;
579
- }
580
-
581
- // Watch for module changes (for development)
582
- watchModules(callback: (modules: ModuleConfig[]) => void): void {
583
- // Use dynamic import for fs to avoid require()
584
- import('fs')
585
- .then(fs => {
586
- const modulePaths = this.findModuleFiles();
587
-
588
- modulePaths.forEach(path => {
589
- try {
590
- fs.watchFile(path, async () => {
591
- this.discoveryLogger.info(`Module file changed: ${path}`);
592
- const modules = await this.discoverModules();
593
- callback(modules);
594
- });
595
- } catch {
596
- // File watching not supported or failed
597
- }
598
- });
599
- })
600
- .catch(() => {
601
- // fs module not available
602
- });
603
- }
604
-
605
- // Watch modules with advanced configuration
606
- watchModulesAdvanced(
607
- config: ModuleDefaultsConfig['autoDiscovery'],
608
- callback: (modules: ModuleConfig[]) => void
609
- ): void {
610
- if (!config.watchForChanges) {
611
- return;
612
- }
613
-
614
- import('fs')
615
- .then(fs => {
616
- const watchedPaths = new Set<string>();
617
-
618
- // Watch all configured paths
619
- config.paths.forEach(searchPath => {
620
- const fullPath = join(this.baseDir, searchPath);
621
-
622
- try {
623
- if (statSync(fullPath).isDirectory() && !watchedPaths.has(fullPath)) {
624
- watchedPaths.add(fullPath);
625
-
626
- const watcher = fs.watch(
627
- fullPath,
628
- { recursive: config.recursive },
629
- async (eventType: string, filename: string | null) => {
630
- if (filename && this.matchesPatterns(filename, config.patterns)) {
631
- this.discoveryLogger.info(`Module file changed: ${filename}`);
632
- const modules = await this.discoverModulesAdvanced(config);
633
- callback(modules);
634
- }
635
- }
636
- );
637
-
638
- // Store watcher for cleanup
639
- this.watchers.push(watcher);
640
- }
641
- } catch {
642
- // Path doesn't exist or not accessible
643
- }
644
- });
645
- })
646
- .catch(() => {
647
- // fs module not available
648
- });
649
- }
650
-
651
- // Clean up file watchers
652
- cleanup(): void {
653
- this.watchers.forEach(watcher => {
654
- if (watcher && typeof watcher.close === 'function') {
655
- watcher.close();
656
- }
657
- });
658
- this.watchers = [];
659
- }
660
- }
661
-
662
- // Convenience functions
663
- export async function autoDiscoverModules(
664
- baseDir?: string,
665
- options?: DiscoveryOptions
666
- ): Promise<ModuleConfig[]> {
667
- const discovery = new ModuleDiscovery(baseDir, options);
668
- return discovery.discoverModules();
669
- }
670
-
671
- export async function autoDiscoverModuleDirectories(
672
- baseDir?: string,
673
- modulesDir?: string
674
- ): Promise<ModuleConfig[]> {
675
- const discovery = new ModuleDiscovery(baseDir);
676
- return discovery.discoverModuleDirectories(modulesDir);
677
- }
678
-
679
- // Module registry for tracking loaded modules
680
- export class ModuleRegistry {
681
- private modules = new Map<string, ModuleConfig>();
682
- private loadedModules = new Set<string>();
683
-
684
- register(module: ModuleConfig): void {
685
- const key = `${module.name}@${module.version}`;
686
- this.modules.set(key, module);
687
- }
688
-
689
- markLoaded(moduleName: string, version: string): void {
690
- const key = `${moduleName}@${version}`;
691
- this.loadedModules.add(key);
692
- }
693
-
694
- isLoaded(moduleName: string, version: string): boolean {
695
- const key = `${moduleName}@${version}`;
696
- return this.loadedModules.has(key);
697
- }
698
-
699
- getModule(moduleName: string, version?: string): ModuleConfig | undefined {
700
- if (version) {
701
- return this.modules.get(`${moduleName}@${version}`);
702
- }
703
-
704
- // Find latest version if no version specified
705
- const modules = Array.from(this.modules.entries())
706
- .filter(([key]) => key.startsWith(`${moduleName}@`))
707
- .sort(([a], [b]) => b.localeCompare(a)); // Sort by version desc
708
-
709
- return modules[0]?.[1];
710
- }
711
-
712
- getAllModules(): ModuleConfig[] {
713
- return Array.from(this.modules.values());
714
- }
715
-
716
- getLoadedModules(): ModuleConfig[] {
717
- return Array.from(this.modules.entries())
718
- .filter(([key]) => this.loadedModules.has(key))
719
- .map(([, module]) => module);
720
- }
721
-
722
- clear(): void {
723
- this.modules.clear();
724
- this.loadedModules.clear();
725
- }
726
- }