@morojs/moro 1.5.16 → 1.6.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 (373) hide show
  1. package/README.md +70 -269
  2. package/dist/core/auth/morojs-adapter.js +5 -9
  3. package/dist/core/auth/morojs-adapter.js.map +1 -1
  4. package/dist/core/config/config-manager.d.ts +1 -1
  5. package/dist/core/config/config-manager.js +10 -20
  6. package/dist/core/config/config-manager.js.map +1 -1
  7. package/dist/core/config/config-sources.d.ts +2 -2
  8. package/dist/core/config/config-sources.js +17 -20
  9. package/dist/core/config/config-sources.js.map +1 -1
  10. package/dist/core/config/config-validator.d.ts +1 -1
  11. package/dist/core/config/config-validator.js +33 -10
  12. package/dist/core/config/config-validator.js.map +1 -1
  13. package/dist/core/config/file-loader.d.ts +1 -1
  14. package/dist/core/config/file-loader.js +19 -78
  15. package/dist/core/config/file-loader.js.map +1 -1
  16. package/dist/core/config/index.d.ts +8 -8
  17. package/dist/core/config/index.js +25 -51
  18. package/dist/core/config/index.js.map +1 -1
  19. package/dist/core/config/schema.d.ts +2 -2
  20. package/dist/core/config/schema.js +11 -13
  21. package/dist/core/config/schema.js.map +1 -1
  22. package/dist/core/config/utils.d.ts +1 -1
  23. package/dist/core/config/utils.js +18 -32
  24. package/dist/core/config/utils.js.map +1 -1
  25. package/dist/core/database/adapters/drizzle.d.ts +1 -1
  26. package/dist/core/database/adapters/drizzle.js +18 -11
  27. package/dist/core/database/adapters/drizzle.js.map +1 -1
  28. package/dist/core/database/adapters/index.d.ts +7 -7
  29. package/dist/core/database/adapters/index.js +19 -29
  30. package/dist/core/database/adapters/index.js.map +1 -1
  31. package/dist/core/database/adapters/mongodb.d.ts +3 -1
  32. package/dist/core/database/adapters/mongodb.js +23 -8
  33. package/dist/core/database/adapters/mongodb.js.map +1 -1
  34. package/dist/core/database/adapters/mysql.d.ts +3 -1
  35. package/dist/core/database/adapters/mysql.js +18 -9
  36. package/dist/core/database/adapters/mysql.js.map +1 -1
  37. package/dist/core/database/adapters/postgresql.d.ts +3 -1
  38. package/dist/core/database/adapters/postgresql.js +18 -8
  39. package/dist/core/database/adapters/postgresql.js.map +1 -1
  40. package/dist/core/database/adapters/redis.d.ts +3 -1
  41. package/dist/core/database/adapters/redis.js +34 -9
  42. package/dist/core/database/adapters/redis.js.map +1 -1
  43. package/dist/core/database/adapters/sqlite.d.ts +3 -1
  44. package/dist/core/database/adapters/sqlite.js +19 -8
  45. package/dist/core/database/adapters/sqlite.js.map +1 -1
  46. package/dist/core/database/index.d.ts +2 -2
  47. package/dist/core/database/index.js +2 -18
  48. package/dist/core/database/index.js.map +1 -1
  49. package/dist/core/docs/index.d.ts +9 -9
  50. package/dist/core/docs/index.js +14 -35
  51. package/dist/core/docs/index.js.map +1 -1
  52. package/dist/core/docs/openapi-generator.d.ts +2 -2
  53. package/dist/core/docs/openapi-generator.js +11 -16
  54. package/dist/core/docs/openapi-generator.js.map +1 -1
  55. package/dist/core/docs/schema-to-openapi.d.ts +2 -2
  56. package/dist/core/docs/schema-to-openapi.js +5 -11
  57. package/dist/core/docs/schema-to-openapi.js.map +1 -1
  58. package/dist/core/docs/simple-docs.d.ts +1 -1
  59. package/dist/core/docs/simple-docs.js +4 -9
  60. package/dist/core/docs/simple-docs.js.map +1 -1
  61. package/dist/core/docs/swagger-ui.d.ts +2 -2
  62. package/dist/core/docs/swagger-ui.js +26 -29
  63. package/dist/core/docs/swagger-ui.js.map +1 -1
  64. package/dist/core/docs/zod-to-openapi.js +31 -28
  65. package/dist/core/docs/zod-to-openapi.js.map +1 -1
  66. package/dist/core/events/event-bus.d.ts +1 -1
  67. package/dist/core/events/event-bus.js +6 -10
  68. package/dist/core/events/event-bus.js.map +1 -1
  69. package/dist/core/events/index.d.ts +2 -2
  70. package/dist/core/events/index.js +1 -5
  71. package/dist/core/events/index.js.map +1 -1
  72. package/dist/core/framework.d.ts +16 -6
  73. package/dist/core/framework.js +182 -92
  74. package/dist/core/framework.js.map +1 -1
  75. package/dist/core/http/http-server.d.ts +1 -1
  76. package/dist/core/http/http-server.js +26 -209
  77. package/dist/core/http/http-server.js.map +1 -1
  78. package/dist/core/http/index.d.ts +4 -3
  79. package/dist/core/http/index.js +3 -8
  80. package/dist/core/http/index.js.map +1 -1
  81. package/dist/core/http/router.d.ts +1 -1
  82. package/dist/core/http/router.js +3 -7
  83. package/dist/core/http/router.js.map +1 -1
  84. package/dist/core/http/uws-http-server.d.ts +64 -0
  85. package/dist/core/http/uws-http-server.js +688 -0
  86. package/dist/core/http/uws-http-server.js.map +1 -0
  87. package/dist/core/logger/filters.d.ts +1 -1
  88. package/dist/core/logger/filters.js +8 -19
  89. package/dist/core/logger/filters.js.map +1 -1
  90. package/dist/core/logger/index.d.ts +3 -3
  91. package/dist/core/logger/index.js +2 -25
  92. package/dist/core/logger/index.js.map +1 -1
  93. package/dist/core/logger/logger.d.ts +1 -1
  94. package/dist/core/logger/logger.js +21 -23
  95. package/dist/core/logger/logger.js.map +1 -1
  96. package/dist/core/logger/outputs.d.ts +1 -1
  97. package/dist/core/logger/outputs.js +8 -15
  98. package/dist/core/logger/outputs.js.map +1 -1
  99. package/dist/core/middleware/built-in/adapters/cache/file.d.ts +1 -1
  100. package/dist/core/middleware/built-in/adapters/cache/file.js +10 -47
  101. package/dist/core/middleware/built-in/adapters/cache/file.js.map +1 -1
  102. package/dist/core/middleware/built-in/adapters/cache/index.d.ts +4 -4
  103. package/dist/core/middleware/built-in/adapters/cache/index.js +10 -17
  104. package/dist/core/middleware/built-in/adapters/cache/index.js.map +1 -1
  105. package/dist/core/middleware/built-in/adapters/cache/memory.d.ts +1 -1
  106. package/dist/core/middleware/built-in/adapters/cache/memory.js +3 -7
  107. package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -1
  108. package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +3 -1
  109. package/dist/core/middleware/built-in/adapters/cache/redis.js +11 -9
  110. package/dist/core/middleware/built-in/adapters/cache/redis.js.map +1 -1
  111. package/dist/core/middleware/built-in/adapters/cdn/azure.d.ts +1 -1
  112. package/dist/core/middleware/built-in/adapters/cdn/azure.js +3 -7
  113. package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +1 -1
  114. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.d.ts +1 -1
  115. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js +3 -7
  116. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -1
  117. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +3 -1
  118. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +12 -10
  119. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +1 -1
  120. package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +4 -4
  121. package/dist/core/middleware/built-in/adapters/cdn/index.js +10 -17
  122. package/dist/core/middleware/built-in/adapters/cdn/index.js.map +1 -1
  123. package/dist/core/middleware/built-in/adapters/index.d.ts +4 -4
  124. package/dist/core/middleware/built-in/adapters/index.js +4 -23
  125. package/dist/core/middleware/built-in/adapters/index.js.map +1 -1
  126. package/dist/core/middleware/built-in/auth-helpers.js +11 -22
  127. package/dist/core/middleware/built-in/auth-helpers.js.map +1 -1
  128. package/dist/core/middleware/built-in/auth-providers.d.ts +1 -1
  129. package/dist/core/middleware/built-in/auth-providers.js +4 -9
  130. package/dist/core/middleware/built-in/auth-providers.js.map +1 -1
  131. package/dist/core/middleware/built-in/auth.d.ts +2 -2
  132. package/dist/core/middleware/built-in/auth.js +51 -44
  133. package/dist/core/middleware/built-in/auth.js.map +1 -1
  134. package/dist/core/middleware/built-in/cache.d.ts +2 -2
  135. package/dist/core/middleware/built-in/cache.js +8 -11
  136. package/dist/core/middleware/built-in/cache.js.map +1 -1
  137. package/dist/core/middleware/built-in/cdn.d.ts +2 -2
  138. package/dist/core/middleware/built-in/cdn.js +5 -9
  139. package/dist/core/middleware/built-in/cdn.js.map +1 -1
  140. package/dist/core/middleware/built-in/cookie.d.ts +1 -1
  141. package/dist/core/middleware/built-in/cookie.js +3 -7
  142. package/dist/core/middleware/built-in/cookie.js.map +1 -1
  143. package/dist/core/middleware/built-in/cors.d.ts +1 -1
  144. package/dist/core/middleware/built-in/cors.js +3 -7
  145. package/dist/core/middleware/built-in/cors.js.map +1 -1
  146. package/dist/core/middleware/built-in/csp.d.ts +1 -1
  147. package/dist/core/middleware/built-in/csp.js +5 -8
  148. package/dist/core/middleware/built-in/csp.js.map +1 -1
  149. package/dist/core/middleware/built-in/csrf.d.ts +1 -1
  150. package/dist/core/middleware/built-in/csrf.js +5 -8
  151. package/dist/core/middleware/built-in/csrf.js.map +1 -1
  152. package/dist/core/middleware/built-in/error-tracker.js +3 -7
  153. package/dist/core/middleware/built-in/error-tracker.js.map +1 -1
  154. package/dist/core/middleware/built-in/index.d.ts +28 -28
  155. package/dist/core/middleware/built-in/index.js +47 -82
  156. package/dist/core/middleware/built-in/index.js.map +1 -1
  157. package/dist/core/middleware/built-in/jwt-helpers.d.ts +27 -2
  158. package/dist/core/middleware/built-in/jwt-helpers.js +32 -10
  159. package/dist/core/middleware/built-in/jwt-helpers.js.map +1 -1
  160. package/dist/core/middleware/built-in/performance-monitor.js +3 -7
  161. package/dist/core/middleware/built-in/performance-monitor.js.map +1 -1
  162. package/dist/core/middleware/built-in/rate-limit.d.ts +1 -1
  163. package/dist/core/middleware/built-in/rate-limit.js +3 -7
  164. package/dist/core/middleware/built-in/rate-limit.js.map +1 -1
  165. package/dist/core/middleware/built-in/request-logger.js +3 -7
  166. package/dist/core/middleware/built-in/request-logger.js.map +1 -1
  167. package/dist/core/middleware/built-in/session.d.ts +2 -2
  168. package/dist/core/middleware/built-in/session.js +11 -15
  169. package/dist/core/middleware/built-in/session.js.map +1 -1
  170. package/dist/core/middleware/built-in/sse.d.ts +1 -1
  171. package/dist/core/middleware/built-in/sse.js +3 -7
  172. package/dist/core/middleware/built-in/sse.js.map +1 -1
  173. package/dist/core/middleware/built-in/validation.d.ts +1 -1
  174. package/dist/core/middleware/built-in/validation.js +3 -7
  175. package/dist/core/middleware/built-in/validation.js.map +1 -1
  176. package/dist/core/middleware/index.d.ts +4 -4
  177. package/dist/core/middleware/index.js +8 -28
  178. package/dist/core/middleware/index.js.map +1 -1
  179. package/dist/core/modules/auto-discovery.d.ts +3 -3
  180. package/dist/core/modules/auto-discovery.js +43 -81
  181. package/dist/core/modules/auto-discovery.js.map +1 -1
  182. package/dist/core/modules/index.d.ts +2 -2
  183. package/dist/core/modules/index.js +2 -9
  184. package/dist/core/modules/index.js.map +1 -1
  185. package/dist/core/modules/modules.d.ts +3 -3
  186. package/dist/core/modules/modules.js +11 -52
  187. package/dist/core/modules/modules.js.map +1 -1
  188. package/dist/core/networking/adapters/index.d.ts +4 -3
  189. package/dist/core/networking/adapters/index.js +3 -7
  190. package/dist/core/networking/adapters/index.js.map +1 -1
  191. package/dist/core/networking/adapters/socketio-adapter.d.ts +1 -1
  192. package/dist/core/networking/adapters/socketio-adapter.js +5 -40
  193. package/dist/core/networking/adapters/socketio-adapter.js.map +1 -1
  194. package/dist/core/networking/adapters/uws-adapter.d.ts +44 -0
  195. package/dist/core/networking/adapters/uws-adapter.js +513 -0
  196. package/dist/core/networking/adapters/uws-adapter.js.map +1 -0
  197. package/dist/core/networking/adapters/ws-adapter.d.ts +1 -1
  198. package/dist/core/networking/adapters/ws-adapter.js +7 -42
  199. package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
  200. package/dist/core/networking/index.d.ts +3 -2
  201. package/dist/core/networking/index.js +2 -7
  202. package/dist/core/networking/index.js.map +1 -1
  203. package/dist/core/networking/service-discovery.js +3 -7
  204. package/dist/core/networking/service-discovery.js.map +1 -1
  205. package/dist/core/networking/websocket-adapter.js +1 -2
  206. package/dist/core/networking/websocket-adapter.js.map +1 -1
  207. package/dist/core/networking/websocket-manager.d.ts +3 -3
  208. package/dist/core/networking/websocket-manager.js +9 -11
  209. package/dist/core/networking/websocket-manager.js.map +1 -1
  210. package/dist/core/routing/app-integration.d.ts +2 -2
  211. package/dist/core/routing/app-integration.js +7 -12
  212. package/dist/core/routing/app-integration.js.map +1 -1
  213. package/dist/core/routing/index.d.ts +2 -2
  214. package/dist/core/routing/index.js +7 -14
  215. package/dist/core/routing/index.js.map +1 -1
  216. package/dist/core/runtime/aws-lambda-adapter.d.ts +3 -3
  217. package/dist/core/runtime/aws-lambda-adapter.js +2 -6
  218. package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
  219. package/dist/core/runtime/base-adapter.d.ts +2 -2
  220. package/dist/core/runtime/base-adapter.js +3 -7
  221. package/dist/core/runtime/base-adapter.js.map +1 -1
  222. package/dist/core/runtime/cloudflare-workers-adapter.d.ts +3 -3
  223. package/dist/core/runtime/cloudflare-workers-adapter.js +2 -6
  224. package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
  225. package/dist/core/runtime/index.d.ts +12 -12
  226. package/dist/core/runtime/index.js +22 -35
  227. package/dist/core/runtime/index.js.map +1 -1
  228. package/dist/core/runtime/node-adapter.d.ts +4 -4
  229. package/dist/core/runtime/node-adapter.js +6 -43
  230. package/dist/core/runtime/node-adapter.js.map +1 -1
  231. package/dist/core/runtime/vercel-edge-adapter.d.ts +3 -3
  232. package/dist/core/runtime/vercel-edge-adapter.js +2 -6
  233. package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
  234. package/dist/core/utilities/circuit-breaker.js +1 -5
  235. package/dist/core/utilities/circuit-breaker.js.map +1 -1
  236. package/dist/core/utilities/container.js +12 -22
  237. package/dist/core/utilities/container.js.map +1 -1
  238. package/dist/core/utilities/hooks.d.ts +2 -2
  239. package/dist/core/utilities/hooks.js +7 -12
  240. package/dist/core/utilities/hooks.js.map +1 -1
  241. package/dist/core/utilities/index.d.ts +5 -4
  242. package/dist/core/utilities/index.js +5 -19
  243. package/dist/core/utilities/index.js.map +1 -1
  244. package/dist/core/utilities/package-utils.d.ts +38 -0
  245. package/dist/core/utilities/package-utils.js +57 -0
  246. package/dist/core/utilities/package-utils.js.map +1 -0
  247. package/dist/core/validation/adapters.d.ts +1 -1
  248. package/dist/core/validation/adapters.js +15 -26
  249. package/dist/core/validation/adapters.js.map +1 -1
  250. package/dist/core/validation/index.d.ts +6 -4
  251. package/dist/core/validation/index.js +57 -28
  252. package/dist/core/validation/index.js.map +1 -1
  253. package/dist/core/validation/schema-interface.js +3 -9
  254. package/dist/core/validation/schema-interface.js.map +1 -1
  255. package/dist/index.d.ts +51 -52
  256. package/dist/index.js +23 -132
  257. package/dist/index.js.map +1 -1
  258. package/dist/moro.d.ts +30 -10
  259. package/dist/moro.js +262 -126
  260. package/dist/moro.js.map +1 -1
  261. package/dist/types/auth.js +3 -9
  262. package/dist/types/auth.js.map +1 -1
  263. package/dist/types/cache.js +1 -2
  264. package/dist/types/cdn.js +1 -2
  265. package/dist/types/config.d.ts +13 -1
  266. package/dist/types/config.js +1 -2
  267. package/dist/types/config.js.map +1 -1
  268. package/dist/types/core.d.ts +3 -3
  269. package/dist/types/core.js +1 -2
  270. package/dist/types/database.js +1 -2
  271. package/dist/types/discovery.js +1 -2
  272. package/dist/types/events.js +1 -2
  273. package/dist/types/hooks.d.ts +1 -1
  274. package/dist/types/hooks.js +1 -2
  275. package/dist/types/http.js +1 -2
  276. package/dist/types/logger.js +1 -2
  277. package/dist/types/module.js +1 -2
  278. package/dist/types/runtime.d.ts +1 -1
  279. package/dist/types/runtime.js +1 -2
  280. package/dist/types/session.js +1 -2
  281. package/jest.config.mjs +41 -0
  282. package/package.json +18 -51
  283. package/src/core/auth/morojs-adapter.ts +1 -1
  284. package/src/core/config/config-manager.ts +2 -2
  285. package/src/core/config/config-sources.ts +6 -6
  286. package/src/core/config/config-validator.ts +38 -3
  287. package/src/core/config/file-loader.ts +13 -40
  288. package/src/core/config/index.ts +15 -11
  289. package/src/core/config/schema.ts +3 -2
  290. package/src/core/config/utils.ts +3 -3
  291. package/src/core/database/adapters/drizzle.ts +18 -6
  292. package/src/core/database/adapters/index.ts +13 -13
  293. package/src/core/database/adapters/mongodb.ts +23 -3
  294. package/src/core/database/adapters/mysql.ts +18 -4
  295. package/src/core/database/adapters/postgresql.ts +18 -3
  296. package/src/core/database/adapters/redis.ts +34 -4
  297. package/src/core/database/adapters/sqlite.ts +19 -3
  298. package/src/core/database/index.ts +2 -2
  299. package/src/core/docs/index.ts +8 -8
  300. package/src/core/docs/openapi-generator.ts +4 -4
  301. package/src/core/docs/schema-to-openapi.ts +3 -6
  302. package/src/core/docs/simple-docs.ts +2 -2
  303. package/src/core/docs/swagger-ui.ts +19 -16
  304. package/src/core/docs/zod-to-openapi.ts +34 -34
  305. package/src/core/events/event-bus.ts +2 -2
  306. package/src/core/events/index.ts +2 -2
  307. package/src/core/framework.ts +190 -49
  308. package/src/core/http/http-server.ts +16 -159
  309. package/src/core/http/index.ts +4 -3
  310. package/src/core/http/router.ts +2 -2
  311. package/src/core/http/uws-http-server.ts +794 -0
  312. package/src/core/logger/filters.ts +1 -1
  313. package/src/core/logger/index.ts +3 -3
  314. package/src/core/logger/logger.ts +9 -1
  315. package/src/core/logger/outputs.ts +1 -1
  316. package/src/core/middleware/built-in/adapters/cache/file.ts +3 -3
  317. package/src/core/middleware/built-in/adapters/cache/index.ts +7 -7
  318. package/src/core/middleware/built-in/adapters/cache/memory.ts +2 -2
  319. package/src/core/middleware/built-in/adapters/cache/redis.ts +18 -4
  320. package/src/core/middleware/built-in/adapters/cdn/azure.ts +2 -2
  321. package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +2 -2
  322. package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +16 -5
  323. package/src/core/middleware/built-in/adapters/cdn/index.ts +7 -7
  324. package/src/core/middleware/built-in/adapters/index.ts +4 -4
  325. package/src/core/middleware/built-in/auth-helpers.ts +1 -1
  326. package/src/core/middleware/built-in/auth-providers.ts +1 -1
  327. package/src/core/middleware/built-in/auth.ts +64 -41
  328. package/src/core/middleware/built-in/cache.ts +5 -5
  329. package/src/core/middleware/built-in/cdn.ts +4 -4
  330. package/src/core/middleware/built-in/cookie.ts +2 -2
  331. package/src/core/middleware/built-in/cors.ts +2 -2
  332. package/src/core/middleware/built-in/csp.ts +3 -3
  333. package/src/core/middleware/built-in/csrf.ts +3 -3
  334. package/src/core/middleware/built-in/error-tracker.ts +1 -1
  335. package/src/core/middleware/built-in/index.ts +31 -31
  336. package/src/core/middleware/built-in/jwt-helpers.ts +32 -4
  337. package/src/core/middleware/built-in/performance-monitor.ts +1 -1
  338. package/src/core/middleware/built-in/rate-limit.ts +2 -2
  339. package/src/core/middleware/built-in/request-logger.ts +1 -1
  340. package/src/core/middleware/built-in/session.ts +7 -8
  341. package/src/core/middleware/built-in/sse.ts +2 -2
  342. package/src/core/middleware/built-in/validation.ts +2 -2
  343. package/src/core/middleware/index.ts +6 -6
  344. package/src/core/modules/auto-discovery.ts +4 -4
  345. package/src/core/modules/index.ts +2 -2
  346. package/src/core/modules/modules.ts +4 -4
  347. package/src/core/networking/adapters/index.ts +4 -3
  348. package/src/core/networking/adapters/socketio-adapter.ts +5 -3
  349. package/src/core/networking/adapters/uws-adapter.ts +619 -0
  350. package/src/core/networking/adapters/ws-adapter.ts +6 -4
  351. package/src/core/networking/index.ts +3 -2
  352. package/src/core/networking/service-discovery.ts +1 -1
  353. package/src/core/networking/websocket-manager.ts +7 -7
  354. package/src/core/routing/app-integration.ts +3 -3
  355. package/src/core/routing/index.ts +3 -3
  356. package/src/core/runtime/aws-lambda-adapter.ts +3 -3
  357. package/src/core/runtime/base-adapter.ts +2 -2
  358. package/src/core/runtime/cloudflare-workers-adapter.ts +3 -3
  359. package/src/core/runtime/index.ts +13 -13
  360. package/src/core/runtime/node-adapter.ts +4 -4
  361. package/src/core/runtime/vercel-edge-adapter.ts +3 -3
  362. package/src/core/utilities/hooks.ts +3 -3
  363. package/src/core/utilities/index.ts +5 -4
  364. package/src/core/utilities/package-utils.ts +59 -0
  365. package/src/core/validation/adapters.ts +1 -1
  366. package/src/core/validation/index.ts +68 -16
  367. package/src/index.ts +73 -66
  368. package/src/moro.ts +303 -75
  369. package/src/types/config.ts +13 -1
  370. package/src/types/core.ts +3 -3
  371. package/src/types/hooks.ts +1 -1
  372. package/src/types/runtime.ts +1 -1
  373. package/tsconfig.json +4 -2
package/dist/moro.js CHANGED
@@ -1,59 +1,21 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.Moro = void 0;
37
- exports.createApp = createApp;
38
- exports.createAppNode = createAppNode;
39
- exports.createAppEdge = createAppEdge;
40
- exports.createAppLambda = createAppLambda;
41
- exports.createAppWorker = createAppWorker;
42
1
  // Moro Framework - Modern TypeScript API Framework
43
2
  // Built for developers who demand performance, elegance, and zero compromises
44
3
  // Event-driven • Modular • Enterprise-ready • Developer-first
45
- const framework_1 = require("./core/framework");
46
- const http_1 = require("./core/http");
47
- const logger_1 = require("./core/logger");
48
- const middleware_1 = require("./core/middleware");
49
- const app_integration_1 = require("./core/routing/app-integration");
50
- const docs_1 = require("./core/docs");
51
- const events_1 = require("events");
4
+ import { Moro as MoroCore } from './core/framework.js';
5
+ import { middleware } from './core/http/index.js';
6
+ import { createFrameworkLogger, applyLoggingConfiguration } from './core/logger/index.js';
7
+ import { MiddlewareManager } from './core/middleware/index.js';
8
+ import { IntelligentRoutingManager } from './core/routing/app-integration.js';
9
+ import { AppDocumentationManager } from './core/docs/index.js';
10
+ import { EventEmitter } from 'events';
11
+ import cluster from 'cluster';
12
+ import os from 'os';
13
+ import { normalizeValidationError } from './core/validation/schema-interface.js';
52
14
  // Configuration System Integration
53
- const config_1 = require("./core/config");
15
+ import { initializeConfig } from './core/config/index.js';
54
16
  // Runtime System Integration
55
- const runtime_1 = require("./core/runtime");
56
- class Moro extends events_1.EventEmitter {
17
+ import { createRuntimeAdapter } from './core/runtime/index.js';
18
+ export class Moro extends EventEmitter {
57
19
  coreFramework;
58
20
  routes = [];
59
21
  moduleCounter = 0;
@@ -61,14 +23,17 @@ class Moro extends events_1.EventEmitter {
61
23
  lazyModules = new Map();
62
24
  routeHandlers = {};
63
25
  moduleDiscovery; // Store for cleanup
26
+ autoDiscoveryOptions = null;
27
+ autoDiscoveryInitialized = false;
28
+ autoDiscoveryPromise = null;
64
29
  // Enterprise event system integration
65
30
  eventBus;
66
31
  // Application logger
67
32
  logger;
68
33
  // Intelligent routing system
69
- intelligentRouting = new app_integration_1.IntelligentRoutingManager();
34
+ intelligentRouting = new IntelligentRoutingManager();
70
35
  // Documentation system
71
- documentation = new docs_1.AppDocumentationManager();
36
+ documentation = new AppDocumentationManager();
72
37
  // Configuration system
73
38
  config;
74
39
  // Runtime system
@@ -76,43 +41,48 @@ class Moro extends events_1.EventEmitter {
76
41
  runtimeType;
77
42
  // Middleware system
78
43
  middlewareManager;
44
+ // Queued WebSocket registrations (for async adapter detection)
45
+ queuedWebSocketRegistrations = [];
79
46
  constructor(options = {}) {
80
47
  super(); // Call EventEmitter constructor
81
48
  // Apply logging configuration BEFORE config loading to avoid DEBUG spam
82
49
  // 1. Environment variables (base level)
83
50
  const envLogLevel = process.env.LOG_LEVEL || process.env.MORO_LOG_LEVEL;
84
51
  if (envLogLevel) {
85
- (0, logger_1.applyLoggingConfiguration)({ level: envLogLevel }, undefined);
52
+ applyLoggingConfiguration({ level: envLogLevel }, undefined);
86
53
  }
87
54
  // 2. createApp logger options (highest precedence)
88
55
  if (options.logger !== undefined) {
89
- (0, logger_1.applyLoggingConfiguration)(undefined, options.logger);
56
+ applyLoggingConfiguration(undefined, options.logger);
90
57
  }
91
58
  // Create logger AFTER initial configuration
92
- this.logger = (0, logger_1.createFrameworkLogger)('App');
59
+ this.logger = createFrameworkLogger('App');
93
60
  // Use simplified global configuration system
94
- this.config = (0, config_1.initializeConfig)(options);
61
+ this.config = initializeConfig(options);
95
62
  // Apply config file logging if it exists (may override createApp options if needed)
96
63
  if (this.config.logging && !options.logger) {
97
- (0, logger_1.applyLoggingConfiguration)(this.config.logging, undefined);
64
+ applyLoggingConfiguration(this.config.logging, undefined);
98
65
  // Recreate logger with updated config
99
- this.logger = (0, logger_1.createFrameworkLogger)('App');
66
+ this.logger = createFrameworkLogger('App');
100
67
  }
101
68
  this.logger.info(`Configuration system initialized: ${process.env.NODE_ENV || 'development'}:${this.config.server.port}`);
102
69
  // Initialize runtime system
103
70
  this.runtimeType = options.runtime?.type || 'node';
104
- this.runtimeAdapter = options.runtime?.adapter || (0, runtime_1.createRuntimeAdapter)(this.runtimeType);
71
+ this.runtimeAdapter = options.runtime?.adapter || createRuntimeAdapter(this.runtimeType);
105
72
  this.logger.info(`Runtime system initialized: ${this.runtimeType}`, 'Runtime');
106
73
  // Pass configuration from config to framework
107
74
  const frameworkOptions = {
108
75
  ...options,
109
76
  logger: this.config.logging,
110
- websocket: this.config.websocket.enabled ? options.websocket || {} : false,
77
+ // Enable websockets if either config has it enabled OR user passed websocket options
78
+ websocket: this.config.websocket.enabled || options.websocket
79
+ ? options.websocket || this.config.websocket || {}
80
+ : false,
111
81
  config: this.config,
112
82
  };
113
- this.coreFramework = new framework_1.Moro(frameworkOptions);
83
+ this.coreFramework = new MoroCore(frameworkOptions);
114
84
  // Initialize middleware system
115
- this.middlewareManager = new middleware_1.MiddlewareManager();
85
+ this.middlewareManager = new MiddlewareManager();
116
86
  // Integrate hooks system with HTTP server
117
87
  const httpServer = this.coreFramework.httpServer;
118
88
  if (httpServer && httpServer.setHookManager) {
@@ -133,15 +103,10 @@ class Moro extends events_1.EventEmitter {
133
103
  ...this.getDefaultOptionsFromConfig(),
134
104
  ...options,
135
105
  });
136
- // Auto-discover modules if enabled
137
- if (options.autoDiscover !== false) {
138
- // Initialize auto-discovery asynchronously
139
- this.initializeAutoDiscovery(options).catch(error => {
140
- this.logger.error('Auto-discovery initialization failed', 'Framework', {
141
- error: error instanceof Error ? error.message : String(error),
142
- });
143
- });
144
- }
106
+ // Store auto-discovery options for later initialization
107
+ // IMPORTANT: Auto-discovery is deferred to ensure user middleware (like auth)
108
+ // is registered before module middleware that might bypass it
109
+ this.autoDiscoveryOptions = options.autoDiscover !== false ? options : null;
145
110
  // Emit initialization event through enterprise event bus
146
111
  this.eventBus.emit('framework:initialized', {
147
112
  options,
@@ -307,6 +272,11 @@ class Moro extends events_1.EventEmitter {
307
272
  version: moduleOrPath.version || '1.0.0',
308
273
  });
309
274
  }
275
+ // IMPORTANT: If modules are loaded manually after auto-discovery,
276
+ // ensure the final module handler is set up to maintain middleware order
277
+ if (this.autoDiscoveryInitialized) {
278
+ this.coreFramework.setupFinalModuleHandler();
279
+ }
310
280
  return this;
311
281
  }
312
282
  // Database helper with events
@@ -320,29 +290,36 @@ class Moro extends events_1.EventEmitter {
320
290
  }
321
291
  // WebSocket helper with events
322
292
  websocket(namespace, handlers) {
293
+ // Queue the registration to be processed after adapter initialization
294
+ const registration = { namespace, handlers, processed: false };
295
+ this.queuedWebSocketRegistrations.push(registration);
296
+ // Try to process immediately if adapter is already ready
323
297
  const adapter = this.coreFramework.getWebSocketAdapter();
324
- if (!adapter) {
325
- throw new Error('WebSocket features require a WebSocket adapter. Install socket.io or configure an adapter:\n' +
326
- 'npm install socket.io\n' +
327
- 'or\n' +
328
- 'new Moro({ websocket: { adapter: new SocketIOAdapter() } })');
298
+ if (adapter && !registration.processed) {
299
+ // Adapter is ready, process immediately
300
+ this.processWebSocketRegistration(namespace, handlers, adapter);
301
+ registration.processed = true;
329
302
  }
303
+ // Otherwise, it will be processed when the server starts
304
+ return this;
305
+ }
306
+ processWebSocketRegistration(namespace, handlers, adapter) {
330
307
  this.emit('websocket:registering', { namespace, handlers });
331
308
  const ns = adapter.createNamespace(namespace);
332
309
  Object.entries(handlers).forEach(([event, handler]) => {
333
- ns.on('connection', socket => {
310
+ ns.on('connection', (socket) => {
334
311
  this.emit('websocket:connection', { namespace, event, socket });
335
312
  socket.on(event, (data, callback) => {
336
313
  this.emit('websocket:event', { namespace, event, data });
337
314
  Promise.resolve(handler(socket, data))
338
- .then(result => {
315
+ .then((result) => {
339
316
  this.emit('websocket:response', { namespace, event, result });
340
317
  if (callback)
341
318
  callback(result);
342
319
  else if (result)
343
320
  socket.emit(`${event}:response`, result);
344
321
  })
345
- .catch(error => {
322
+ .catch((error) => {
346
323
  this.emit('websocket:error', { namespace, event, error });
347
324
  const errorResponse = { success: false, error: error.message };
348
325
  if (callback)
@@ -354,7 +331,33 @@ class Moro extends events_1.EventEmitter {
354
331
  });
355
332
  });
356
333
  this.emit('websocket:registered', { namespace, handlers });
357
- return this;
334
+ }
335
+ async processQueuedWebSocketRegistrations() {
336
+ // Wait for WebSocket adapter to be ready
337
+ await this.coreFramework.ensureWebSocketReady();
338
+ const adapter = this.coreFramework.getWebSocketAdapter();
339
+ // Check if any unprocessed registrations exist
340
+ const unprocessedRegistrations = this.queuedWebSocketRegistrations.filter(r => !r.processed);
341
+ if (!adapter && unprocessedRegistrations.length > 0) {
342
+ throw new Error('WebSocket features require a WebSocket adapter.\n\n' +
343
+ 'Option 1: Install socket.io (auto-detected):\n' +
344
+ ' npm install socket.io\n' +
345
+ ' const app = new Moro({ websocket: {} });\n\n' +
346
+ 'Option 2: Configure a specific adapter:\n' +
347
+ " import { SocketIOAdapter } from '@morojs/moro';\n" +
348
+ ' const app = new Moro({ websocket: { adapter: new SocketIOAdapter() } });\n\n' +
349
+ 'Option 3: Enable in config file (moro.config.js):\n' +
350
+ ' export default { websocket: { enabled: true } };');
351
+ }
352
+ if (adapter) {
353
+ // Process all unprocessed registrations
354
+ for (const registration of this.queuedWebSocketRegistrations) {
355
+ if (!registration.processed) {
356
+ this.processWebSocketRegistration(registration.namespace, registration.handlers, adapter);
357
+ registration.processed = true;
358
+ }
359
+ }
360
+ }
358
361
  }
359
362
  listen(portOrCallback, hostOrCallback, callback) {
360
363
  // Only available for Node.js runtime
@@ -396,9 +399,18 @@ class Moro extends events_1.EventEmitter {
396
399
  throw new Error('Port not specified and not found in configuration. Please provide a port number or configure it in moro.config.js/ts');
397
400
  }
398
401
  // Check if clustering is enabled for massive performance gains
402
+ // NOTE: uWebSockets.js does NOT support Node.js clustering - it's single-threaded only
403
+ const usingUWebSockets = this.config.server?.useUWebSockets || false;
399
404
  if (this.config.performance?.clustering?.enabled) {
400
- this.startWithClustering(port, host, callback);
401
- return;
405
+ if (usingUWebSockets) {
406
+ this.logger.warn('Clustering is not supported with uWebSockets.js - running in single-threaded mode. ' +
407
+ 'uWebSockets is so fast that single-threaded performance often exceeds multi-threaded Node.js!', 'Cluster');
408
+ // Continue without clustering
409
+ }
410
+ else {
411
+ this.startWithClustering(port, host, callback);
412
+ return;
413
+ }
402
414
  }
403
415
  this.eventBus.emit('server:starting', { port, runtime: this.runtimeType });
404
416
  // Add documentation middleware first (if enabled)
@@ -423,33 +435,139 @@ class Moro extends events_1.EventEmitter {
423
435
  if (this.routes.length > 0) {
424
436
  this.registerDirectRoutes();
425
437
  }
426
- const actualCallback = () => {
427
- const displayHost = host || 'localhost';
428
- this.logger.info('Moro Server Started', 'Server');
429
- this.logger.info(`Runtime: ${this.runtimeType}`, 'Server');
430
- this.logger.info(`HTTP API: http://${displayHost}:${port}`, 'Server');
431
- if (this.config.websocket.enabled) {
432
- this.logger.info(`WebSocket: ws://${displayHost}:${port}`, 'Server');
438
+ const startServer = () => {
439
+ const actualCallback = () => {
440
+ const displayHost = host || 'localhost';
441
+ this.logger.info('Moro Server Started', 'Server');
442
+ this.logger.info(`Runtime: ${this.runtimeType}`, 'Server');
443
+ this.logger.info(`HTTP API: http://${displayHost}:${port}`, 'Server');
444
+ if (this.config.websocket.enabled) {
445
+ this.logger.info(`WebSocket: ws://${displayHost}:${port}`, 'Server');
446
+ }
447
+ this.logger.info('Learn more at https://morojs.com', 'Server');
448
+ // Log intelligent routes info
449
+ const intelligentRoutes = this.intelligentRouting.getIntelligentRoutes();
450
+ if (intelligentRoutes.length > 0) {
451
+ this.logger.info(`Intelligent Routes: ${intelligentRoutes.length} registered`, 'Server');
452
+ }
453
+ this.eventBus.emit('server:started', { port, runtime: this.runtimeType });
454
+ if (callback)
455
+ callback();
456
+ };
457
+ if (host && typeof host === 'string') {
458
+ this.coreFramework.listen(port, host, actualCallback);
433
459
  }
434
- this.logger.info('Learn more at https://morojs.com', 'Server');
435
- // Log intelligent routes info
436
- const intelligentRoutes = this.intelligentRouting.getIntelligentRoutes();
437
- if (intelligentRoutes.length > 0) {
438
- this.logger.info(`Intelligent Routes: ${intelligentRoutes.length} registered`, 'Server');
460
+ else {
461
+ this.coreFramework.listen(port, actualCallback);
439
462
  }
440
- this.eventBus.emit('server:started', { port, runtime: this.runtimeType });
441
- if (callback)
442
- callback();
443
463
  };
444
- if (host && typeof host === 'string') {
445
- this.coreFramework.listen(port, host, actualCallback);
464
+ // Ensure auto-discovery and WebSocket setup is complete before starting server
465
+ Promise.all([this.ensureAutoDiscoveryComplete(), this.processQueuedWebSocketRegistrations()])
466
+ .then(() => {
467
+ startServer();
468
+ })
469
+ .catch(error => {
470
+ this.logger.error('Initialization failed during server start', 'Framework', {
471
+ error: error instanceof Error ? error.message : String(error),
472
+ });
473
+ // For auto-discovery failures, start server anyway
474
+ // For WebSocket failures with queued registrations, error will propagate
475
+ if (error instanceof Error &&
476
+ error.message.includes('WebSocket features require a WebSocket adapter')) {
477
+ throw error;
478
+ }
479
+ startServer();
480
+ });
481
+ }
482
+ // Public method to manually initialize auto-discovery
483
+ // Useful for ensuring auth middleware is registered before auto-discovery
484
+ async initializeAutoDiscoveryNow() {
485
+ return this.ensureAutoDiscoveryComplete();
486
+ }
487
+ // Public API: Initialize modules explicitly after middleware setup
488
+ // This provides users with explicit control over module loading timing
489
+ // IMPORTANT: This forces module loading even if autoDiscovery.enabled is false
490
+ // Usage: app.initModules() or app.initModules({ paths: ['./my-modules'] })
491
+ initModules(options) {
492
+ this.logger.info('User-requested module initialization', 'ModuleSystem');
493
+ // If already initialized, do nothing
494
+ if (this.autoDiscoveryInitialized) {
495
+ this.logger.debug('Auto-discovery already completed, skipping', 'ModuleSystem');
496
+ return;
446
497
  }
447
- else {
448
- this.coreFramework.listen(port, actualCallback);
498
+ // Store the options and mark that we want to force initialization
499
+ this.autoDiscoveryOptions = {
500
+ autoDiscover: {
501
+ enabled: true, // Force enabled regardless of original config
502
+ paths: options?.paths || ['./modules', './src/modules'],
503
+ patterns: options?.patterns || [
504
+ '**/*.module.{ts,js}',
505
+ '**/index.{ts,js}',
506
+ '**/*.config.{ts,js}',
507
+ ],
508
+ recursive: options?.recursive ?? true,
509
+ loadingStrategy: options?.loadingStrategy || 'eager',
510
+ watchForChanges: options?.watchForChanges ?? false,
511
+ ignorePatterns: options?.ignorePatterns || [
512
+ '**/*.test.{ts,js}',
513
+ '**/*.spec.{ts,js}',
514
+ '**/node_modules/**',
515
+ ],
516
+ loadOrder: options?.loadOrder || 'dependency',
517
+ failOnError: options?.failOnError ?? false,
518
+ maxDepth: options?.maxDepth ?? 5,
519
+ },
520
+ };
521
+ this.logger.debug('Module initialization options stored, will execute on next listen/getHandler call', 'ModuleSystem');
522
+ }
523
+ // Robust method to ensure auto-discovery is complete, handling race conditions
524
+ async ensureAutoDiscoveryComplete() {
525
+ // If already initialized, nothing to do
526
+ if (this.autoDiscoveryInitialized) {
527
+ return;
528
+ }
529
+ // If auto-discovery is disabled, mark as initialized
530
+ if (!this.autoDiscoveryOptions) {
531
+ this.autoDiscoveryInitialized = true;
532
+ return;
533
+ }
534
+ // If already in progress, wait for it to complete
535
+ if (this.autoDiscoveryPromise) {
536
+ return this.autoDiscoveryPromise;
537
+ }
538
+ // Start auto-discovery
539
+ this.autoDiscoveryPromise = this.performAutoDiscovery();
540
+ try {
541
+ await this.autoDiscoveryPromise;
542
+ this.autoDiscoveryInitialized = true;
543
+ }
544
+ catch (error) {
545
+ // Reset promise on error so it can be retried
546
+ this.autoDiscoveryPromise = null;
547
+ throw error;
548
+ }
549
+ finally {
550
+ this.autoDiscoveryOptions = null; // Clear after attempt
449
551
  }
450
552
  }
553
+ // Perform the actual auto-discovery work
554
+ async performAutoDiscovery(optionsOverride) {
555
+ const optionsToUse = optionsOverride || this.autoDiscoveryOptions;
556
+ if (!optionsToUse)
557
+ return;
558
+ this.logger.debug('Starting auto-discovery initialization', 'AutoDiscovery');
559
+ await this.initializeAutoDiscovery(optionsToUse);
560
+ this.logger.debug('Auto-discovery initialization completed', 'AutoDiscovery');
561
+ }
451
562
  // Get handler for non-Node.js runtimes
452
563
  getHandler() {
564
+ // Ensure auto-discovery is complete for non-Node.js runtimes
565
+ // This handles the case where users call getHandler() immediately after createApp()
566
+ this.ensureAutoDiscoveryComplete().catch(error => {
567
+ this.logger.error('Auto-discovery initialization failed for runtime handler', 'Framework', {
568
+ error: error instanceof Error ? error.message : String(error),
569
+ });
570
+ });
453
571
  // Create a unified request handler that works with the runtime adapter
454
572
  const handler = async (req, res) => {
455
573
  // Add documentation middleware first (if enabled)
@@ -667,7 +785,6 @@ class Moro extends events_1.EventEmitter {
667
785
  }
668
786
  catch (error) {
669
787
  // Handle universal validation errors
670
- const { normalizeValidationError } = require('./core/validation/schema-interface');
671
788
  const normalizedError = normalizeValidationError(error);
672
789
  res.status(400).json({
673
790
  success: false,
@@ -744,11 +861,11 @@ class Moro extends events_1.EventEmitter {
744
861
  : this.config.security.cors
745
862
  ? this.config.security.cors
746
863
  : {};
747
- this.use(http_1.middleware.cors(corsOptions));
864
+ this.use(middleware.cors(corsOptions));
748
865
  }
749
866
  // Helmet - check config enabled property OR options.security.helmet.enabled === true
750
867
  if (this.config.security.helmet.enabled || options.security?.helmet?.enabled === true) {
751
- this.use(http_1.middleware.helmet());
868
+ this.use(middleware.helmet());
752
869
  }
753
870
  // Compression - check config enabled property OR options.performance.compression.enabled === true
754
871
  if (this.config.performance.compression.enabled ||
@@ -758,14 +875,14 @@ class Moro extends events_1.EventEmitter {
758
875
  : this.config.performance.compression
759
876
  ? this.config.performance.compression
760
877
  : {};
761
- this.use(http_1.middleware.compression(compressionOptions));
878
+ this.use(middleware.compression(compressionOptions));
762
879
  }
763
880
  // Body size limiting
764
- this.use(http_1.middleware.bodySize({ limit: '10mb' }));
881
+ this.use(middleware.bodySize({ limit: '10mb' }));
765
882
  }
766
883
  // Enhanced auto-discovery initialization
767
884
  async initializeAutoDiscovery(options) {
768
- const { ModuleDiscovery } = await Promise.resolve().then(() => __importStar(require('./core/modules/auto-discovery')));
885
+ const { ModuleDiscovery } = await import('./core/modules/auto-discovery.js');
769
886
  // Merge auto-discovery configuration
770
887
  const autoDiscoveryConfig = this.mergeAutoDiscoveryConfig(options);
771
888
  if (!autoDiscoveryConfig.enabled) {
@@ -777,6 +894,8 @@ class Moro extends events_1.EventEmitter {
777
894
  const modules = await this.moduleDiscovery.discoverModulesAdvanced(autoDiscoveryConfig);
778
895
  // Load modules based on strategy
779
896
  await this.loadDiscoveredModules(modules, autoDiscoveryConfig);
897
+ // Setup final module handler to run after user middleware (like auth)
898
+ this.coreFramework.setupFinalModuleHandler();
780
899
  // Setup file watching if enabled
781
900
  if (autoDiscoveryConfig.watchForChanges) {
782
901
  this.moduleDiscovery.watchModulesAdvanced(autoDiscoveryConfig, async (updatedModules) => {
@@ -930,7 +1049,7 @@ class Moro extends events_1.EventEmitter {
930
1049
  });
931
1050
  }
932
1051
  async importModule(modulePath) {
933
- const module = await Promise.resolve(`${modulePath}`).then(s => __importStar(require(s)));
1052
+ const module = await import(modulePath);
934
1053
  return module.default || module;
935
1054
  }
936
1055
  /**
@@ -952,8 +1071,6 @@ class Moro extends events_1.EventEmitter {
952
1071
  */
953
1072
  clusterWorkers = new Map();
954
1073
  startWithClustering(port, host, callback) {
955
- const cluster = require('cluster');
956
- const os = require('os');
957
1074
  // Worker count calculation - respect user choice
958
1075
  let workerCount = this.config.performance?.clustering?.workers || os.cpus().length;
959
1076
  // Only auto-optimize if user hasn't specified a number or set it to 'auto'
@@ -1045,12 +1162,11 @@ class Moro extends events_1.EventEmitter {
1045
1162
  // Multiple workers writing to same log files creates I/O contention
1046
1163
  if (this.config.logging) {
1047
1164
  // Workers log less frequently to reduce I/O contention
1048
- (0, logger_1.applyLoggingConfiguration)(undefined, { level: 'warn' }); // Only warnings and errors
1165
+ applyLoggingConfiguration(undefined, { level: 'warn' }); // Only warnings and errors
1049
1166
  }
1050
1167
  // Research-based memory optimization for workers
1051
- const os = require('os');
1052
1168
  const totalMemoryGB = os.totalmem() / (1024 * 1024 * 1024);
1053
- const workerCount = Object.keys(require('cluster').workers || {}).length || 1;
1169
+ const workerCount = Object.keys(cluster.workers || {}).length || 1;
1054
1170
  // Conservative memory allocation
1055
1171
  const heapSizePerWorkerMB = Math.min(Math.floor(((totalMemoryGB * 1024) / workerCount) * 0.8), // 80% of available memory
1056
1172
  1536 // Cap at 1.5GB (GC efficiency threshold from research)
@@ -1132,12 +1248,33 @@ class Moro extends events_1.EventEmitter {
1132
1248
  worker: process.pid,
1133
1249
  });
1134
1250
  };
1135
- if (host) {
1136
- this.coreFramework.listen(port, host, workerCallback);
1137
- }
1138
- else {
1139
- this.coreFramework.listen(port, workerCallback);
1140
- }
1251
+ // Ensure WebSocket setup is complete before starting worker
1252
+ this.processQueuedWebSocketRegistrations()
1253
+ .then(() => {
1254
+ if (host) {
1255
+ this.coreFramework.listen(port, host, workerCallback);
1256
+ }
1257
+ else {
1258
+ this.coreFramework.listen(port, workerCallback);
1259
+ }
1260
+ })
1261
+ .catch(error => {
1262
+ this.logger.error('WebSocket initialization failed in worker', 'Worker', {
1263
+ error: error instanceof Error ? error.message : String(error),
1264
+ });
1265
+ // For WebSocket failures with queued registrations, error will propagate
1266
+ if (error instanceof Error &&
1267
+ error.message.includes('WebSocket features require a WebSocket adapter')) {
1268
+ throw error;
1269
+ }
1270
+ // Start anyway for other errors
1271
+ if (host) {
1272
+ this.coreFramework.listen(port, host, workerCallback);
1273
+ }
1274
+ else {
1275
+ this.coreFramework.listen(port, workerCallback);
1276
+ }
1277
+ });
1141
1278
  }
1142
1279
  }
1143
1280
  // Simple worker message handler
@@ -1201,31 +1338,30 @@ class Moro extends events_1.EventEmitter {
1201
1338
  this.logger.debug('Moro application closed successfully');
1202
1339
  }
1203
1340
  }
1204
- exports.Moro = Moro;
1205
1341
  // Export convenience function
1206
- function createApp(options) {
1342
+ export function createApp(options) {
1207
1343
  return new Moro(options);
1208
1344
  }
1209
1345
  // Runtime-specific convenience functions
1210
- function createAppNode(options) {
1346
+ export function createAppNode(options) {
1211
1347
  return new Moro({
1212
1348
  ...options,
1213
1349
  runtime: { type: 'node' },
1214
1350
  });
1215
1351
  }
1216
- function createAppEdge(options) {
1352
+ export function createAppEdge(options) {
1217
1353
  return new Moro({
1218
1354
  ...options,
1219
1355
  runtime: { type: 'vercel-edge' },
1220
1356
  });
1221
1357
  }
1222
- function createAppLambda(options) {
1358
+ export function createAppLambda(options) {
1223
1359
  return new Moro({
1224
1360
  ...options,
1225
1361
  runtime: { type: 'aws-lambda' },
1226
1362
  });
1227
1363
  }
1228
- function createAppWorker(options) {
1364
+ export function createAppWorker(options) {
1229
1365
  return new Moro({
1230
1366
  ...options,
1231
1367
  runtime: { type: 'cloudflare-workers' },