@morojs/moro 1.6.0 → 1.6.1

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 (388) hide show
  1. package/README.md +256 -74
  2. package/dist/core/auth/morojs-adapter.js +20 -20
  3. package/dist/core/auth/morojs-adapter.js.map +1 -1
  4. package/dist/core/config/file-loader.d.ts +6 -1
  5. package/dist/core/config/file-loader.js +249 -19
  6. package/dist/core/config/file-loader.js.map +1 -1
  7. package/dist/core/config/index.d.ts +12 -41
  8. package/dist/core/config/index.js +54 -65
  9. package/dist/core/config/index.js.map +1 -1
  10. package/dist/core/config/loader.d.ts +7 -0
  11. package/dist/core/config/loader.js +269 -0
  12. package/dist/core/config/loader.js.map +1 -0
  13. package/dist/core/config/schema.d.ts +2 -2
  14. package/dist/core/config/schema.js +44 -52
  15. package/dist/core/config/schema.js.map +1 -1
  16. package/dist/core/config/utils.d.ts +3 -10
  17. package/dist/core/config/utils.js +58 -31
  18. package/dist/core/config/utils.js.map +1 -1
  19. package/dist/core/config/validation.d.ts +17 -0
  20. package/dist/core/config/validation.js +131 -0
  21. package/dist/core/config/validation.js.map +1 -0
  22. package/dist/core/database/adapters/drizzle.d.ts +1 -1
  23. package/dist/core/database/adapters/drizzle.js +11 -18
  24. package/dist/core/database/adapters/drizzle.js.map +1 -1
  25. package/dist/core/database/adapters/index.d.ts +7 -7
  26. package/dist/core/database/adapters/index.js +29 -19
  27. package/dist/core/database/adapters/index.js.map +1 -1
  28. package/dist/core/database/adapters/mongodb.d.ts +1 -13
  29. package/dist/core/database/adapters/mongodb.js +10 -46
  30. package/dist/core/database/adapters/mongodb.js.map +1 -1
  31. package/dist/core/database/adapters/mysql.d.ts +1 -14
  32. package/dist/core/database/adapters/mysql.js +9 -19
  33. package/dist/core/database/adapters/mysql.js.map +1 -1
  34. package/dist/core/database/adapters/postgresql.d.ts +2 -12
  35. package/dist/core/database/adapters/postgresql.js +9 -19
  36. package/dist/core/database/adapters/postgresql.js.map +1 -1
  37. package/dist/core/database/adapters/redis.d.ts +1 -12
  38. package/dist/core/database/adapters/redis.js +13 -48
  39. package/dist/core/database/adapters/redis.js.map +1 -1
  40. package/dist/core/database/adapters/sqlite.d.ts +1 -3
  41. package/dist/core/database/adapters/sqlite.js +8 -19
  42. package/dist/core/database/adapters/sqlite.js.map +1 -1
  43. package/dist/core/database/index.d.ts +2 -2
  44. package/dist/core/database/index.js +18 -2
  45. package/dist/core/database/index.js.map +1 -1
  46. package/dist/core/docs/index.d.ts +9 -9
  47. package/dist/core/docs/index.js +35 -14
  48. package/dist/core/docs/index.js.map +1 -1
  49. package/dist/core/docs/openapi-generator.d.ts +2 -2
  50. package/dist/core/docs/openapi-generator.js +16 -11
  51. package/dist/core/docs/openapi-generator.js.map +1 -1
  52. package/dist/core/docs/schema-to-openapi.d.ts +2 -2
  53. package/dist/core/docs/schema-to-openapi.js +11 -5
  54. package/dist/core/docs/schema-to-openapi.js.map +1 -1
  55. package/dist/core/docs/simple-docs.d.ts +1 -1
  56. package/dist/core/docs/simple-docs.js +9 -4
  57. package/dist/core/docs/simple-docs.js.map +1 -1
  58. package/dist/core/docs/swagger-ui.d.ts +2 -2
  59. package/dist/core/docs/swagger-ui.js +29 -26
  60. package/dist/core/docs/swagger-ui.js.map +1 -1
  61. package/dist/core/docs/zod-to-openapi.js +28 -31
  62. package/dist/core/docs/zod-to-openapi.js.map +1 -1
  63. package/dist/core/events/event-bus.d.ts +1 -1
  64. package/dist/core/events/event-bus.js +10 -6
  65. package/dist/core/events/event-bus.js.map +1 -1
  66. package/dist/core/events/index.d.ts +2 -2
  67. package/dist/core/events/index.js +5 -1
  68. package/dist/core/events/index.js.map +1 -1
  69. package/dist/core/framework.d.ts +12 -19
  70. package/dist/core/framework.js +100 -277
  71. package/dist/core/framework.js.map +1 -1
  72. package/dist/core/http/http-server.d.ts +1 -13
  73. package/dist/core/http/http-server.js +85 -175
  74. package/dist/core/http/http-server.js.map +1 -1
  75. package/dist/core/http/index.d.ts +3 -4
  76. package/dist/core/http/index.js +8 -3
  77. package/dist/core/http/index.js.map +1 -1
  78. package/dist/core/http/router.d.ts +1 -13
  79. package/dist/core/http/router.js +43 -117
  80. package/dist/core/http/router.js.map +1 -1
  81. package/dist/core/logger/filters.d.ts +1 -1
  82. package/dist/core/logger/filters.js +23 -20
  83. package/dist/core/logger/filters.js.map +1 -1
  84. package/dist/core/logger/index.d.ts +3 -3
  85. package/dist/core/logger/index.js +24 -2
  86. package/dist/core/logger/index.js.map +1 -1
  87. package/dist/core/logger/logger.d.ts +14 -30
  88. package/dist/core/logger/logger.js +223 -398
  89. package/dist/core/logger/logger.js.map +1 -1
  90. package/dist/core/logger/outputs.d.ts +1 -1
  91. package/dist/core/logger/outputs.js +17 -8
  92. package/dist/core/logger/outputs.js.map +1 -1
  93. package/dist/core/middleware/built-in/adapters/cache/file.d.ts +1 -1
  94. package/dist/core/middleware/built-in/adapters/cache/file.js +47 -10
  95. package/dist/core/middleware/built-in/adapters/cache/file.js.map +1 -1
  96. package/dist/core/middleware/built-in/adapters/cache/index.d.ts +4 -4
  97. package/dist/core/middleware/built-in/adapters/cache/index.js +17 -10
  98. package/dist/core/middleware/built-in/adapters/cache/index.js.map +1 -1
  99. package/dist/core/middleware/built-in/adapters/cache/memory.d.ts +1 -1
  100. package/dist/core/middleware/built-in/adapters/cache/memory.js +7 -3
  101. package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -1
  102. package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +1 -3
  103. package/dist/core/middleware/built-in/adapters/cache/redis.js +9 -11
  104. package/dist/core/middleware/built-in/adapters/cache/redis.js.map +1 -1
  105. package/dist/core/middleware/built-in/adapters/cdn/azure.d.ts +1 -1
  106. package/dist/core/middleware/built-in/adapters/cdn/azure.js +7 -3
  107. package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +1 -1
  108. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.d.ts +1 -1
  109. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js +7 -3
  110. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -1
  111. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +1 -3
  112. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +10 -12
  113. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +1 -1
  114. package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +4 -4
  115. package/dist/core/middleware/built-in/adapters/cdn/index.js +17 -10
  116. package/dist/core/middleware/built-in/adapters/cdn/index.js.map +1 -1
  117. package/dist/core/middleware/built-in/adapters/index.d.ts +4 -4
  118. package/dist/core/middleware/built-in/adapters/index.js +23 -4
  119. package/dist/core/middleware/built-in/adapters/index.js.map +1 -1
  120. package/dist/core/middleware/built-in/auth-helpers.js +22 -11
  121. package/dist/core/middleware/built-in/auth-helpers.js.map +1 -1
  122. package/dist/core/middleware/built-in/auth-providers.d.ts +1 -1
  123. package/dist/core/middleware/built-in/auth-providers.js +9 -4
  124. package/dist/core/middleware/built-in/auth-providers.js.map +1 -1
  125. package/dist/core/middleware/built-in/auth.d.ts +2 -2
  126. package/dist/core/middleware/built-in/auth.js +26 -93
  127. package/dist/core/middleware/built-in/auth.js.map +1 -1
  128. package/dist/core/middleware/built-in/cache.d.ts +2 -2
  129. package/dist/core/middleware/built-in/cache.js +12 -11
  130. package/dist/core/middleware/built-in/cache.js.map +1 -1
  131. package/dist/core/middleware/built-in/cdn.d.ts +2 -2
  132. package/dist/core/middleware/built-in/cdn.js +9 -5
  133. package/dist/core/middleware/built-in/cdn.js.map +1 -1
  134. package/dist/core/middleware/built-in/cookie.d.ts +1 -1
  135. package/dist/core/middleware/built-in/cookie.js +7 -3
  136. package/dist/core/middleware/built-in/cookie.js.map +1 -1
  137. package/dist/core/middleware/built-in/cors.d.ts +1 -1
  138. package/dist/core/middleware/built-in/cors.js +7 -3
  139. package/dist/core/middleware/built-in/cors.js.map +1 -1
  140. package/dist/core/middleware/built-in/csp.d.ts +1 -1
  141. package/dist/core/middleware/built-in/csp.js +8 -5
  142. package/dist/core/middleware/built-in/csp.js.map +1 -1
  143. package/dist/core/middleware/built-in/csrf.d.ts +1 -1
  144. package/dist/core/middleware/built-in/csrf.js +8 -5
  145. package/dist/core/middleware/built-in/csrf.js.map +1 -1
  146. package/dist/core/middleware/built-in/error-tracker.js +7 -3
  147. package/dist/core/middleware/built-in/error-tracker.js.map +1 -1
  148. package/dist/core/middleware/built-in/index.d.ts +27 -28
  149. package/dist/core/middleware/built-in/index.js +78 -48
  150. package/dist/core/middleware/built-in/index.js.map +1 -1
  151. package/dist/core/middleware/built-in/performance-monitor.js +7 -3
  152. package/dist/core/middleware/built-in/performance-monitor.js.map +1 -1
  153. package/dist/core/middleware/built-in/rate-limit.d.ts +1 -1
  154. package/dist/core/middleware/built-in/rate-limit.js +7 -3
  155. package/dist/core/middleware/built-in/rate-limit.js.map +1 -1
  156. package/dist/core/middleware/built-in/request-logger.js +8 -5
  157. package/dist/core/middleware/built-in/request-logger.js.map +1 -1
  158. package/dist/core/middleware/built-in/session.d.ts +2 -2
  159. package/dist/core/middleware/built-in/session.js +15 -11
  160. package/dist/core/middleware/built-in/session.js.map +1 -1
  161. package/dist/core/middleware/built-in/sse.d.ts +1 -1
  162. package/dist/core/middleware/built-in/sse.js +14 -12
  163. package/dist/core/middleware/built-in/sse.js.map +1 -1
  164. package/dist/core/middleware/built-in/validation.d.ts +1 -1
  165. package/dist/core/middleware/built-in/validation.js +7 -3
  166. package/dist/core/middleware/built-in/validation.js.map +1 -1
  167. package/dist/core/middleware/index.d.ts +4 -4
  168. package/dist/core/middleware/index.js +28 -8
  169. package/dist/core/middleware/index.js.map +1 -1
  170. package/dist/core/modules/auto-discovery.d.ts +2 -19
  171. package/dist/core/modules/auto-discovery.js +74 -391
  172. package/dist/core/modules/auto-discovery.js.map +1 -1
  173. package/dist/core/modules/index.d.ts +2 -2
  174. package/dist/core/modules/index.js +9 -2
  175. package/dist/core/modules/index.js.map +1 -1
  176. package/dist/core/modules/modules.d.ts +3 -3
  177. package/dist/core/modules/modules.js +54 -23
  178. package/dist/core/modules/modules.js.map +1 -1
  179. package/dist/core/networking/adapters/index.d.ts +3 -4
  180. package/dist/core/networking/adapters/index.js +7 -3
  181. package/dist/core/networking/adapters/index.js.map +1 -1
  182. package/dist/core/networking/adapters/socketio-adapter.d.ts +1 -1
  183. package/dist/core/networking/adapters/socketio-adapter.js +40 -5
  184. package/dist/core/networking/adapters/socketio-adapter.js.map +1 -1
  185. package/dist/core/networking/adapters/ws-adapter.d.ts +2 -2
  186. package/dist/core/networking/adapters/ws-adapter.js +43 -8
  187. package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
  188. package/dist/core/networking/index.d.ts +2 -3
  189. package/dist/core/networking/index.js +7 -2
  190. package/dist/core/networking/index.js.map +1 -1
  191. package/dist/core/networking/service-discovery.js +12 -8
  192. package/dist/core/networking/service-discovery.js.map +1 -1
  193. package/dist/core/networking/websocket-adapter.js +2 -1
  194. package/dist/core/networking/websocket-adapter.js.map +1 -1
  195. package/dist/core/networking/websocket-manager.d.ts +3 -3
  196. package/dist/core/networking/websocket-manager.js +11 -9
  197. package/dist/core/networking/websocket-manager.js.map +1 -1
  198. package/dist/core/routing/app-integration.d.ts +2 -2
  199. package/dist/core/routing/app-integration.js +12 -7
  200. package/dist/core/routing/app-integration.js.map +1 -1
  201. package/dist/core/routing/index.d.ts +2 -22
  202. package/dist/core/routing/index.js +27 -185
  203. package/dist/core/routing/index.js.map +1 -1
  204. package/dist/core/runtime/aws-lambda-adapter.d.ts +3 -3
  205. package/dist/core/runtime/aws-lambda-adapter.js +6 -2
  206. package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
  207. package/dist/core/runtime/base-adapter.d.ts +2 -2
  208. package/dist/core/runtime/base-adapter.js +7 -3
  209. package/dist/core/runtime/base-adapter.js.map +1 -1
  210. package/dist/core/runtime/cloudflare-workers-adapter.d.ts +3 -3
  211. package/dist/core/runtime/cloudflare-workers-adapter.js +6 -2
  212. package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
  213. package/dist/core/runtime/index.d.ts +12 -12
  214. package/dist/core/runtime/index.js +35 -22
  215. package/dist/core/runtime/index.js.map +1 -1
  216. package/dist/core/runtime/node-adapter.d.ts +4 -4
  217. package/dist/core/runtime/node-adapter.js +49 -18
  218. package/dist/core/runtime/node-adapter.js.map +1 -1
  219. package/dist/core/runtime/vercel-edge-adapter.d.ts +3 -3
  220. package/dist/core/runtime/vercel-edge-adapter.js +6 -2
  221. package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
  222. package/dist/core/utilities/circuit-breaker.js +5 -1
  223. package/dist/core/utilities/circuit-breaker.js.map +1 -1
  224. package/dist/core/utilities/container.js +22 -12
  225. package/dist/core/utilities/container.js.map +1 -1
  226. package/dist/core/utilities/hooks.d.ts +2 -2
  227. package/dist/core/utilities/hooks.js +12 -7
  228. package/dist/core/utilities/hooks.js.map +1 -1
  229. package/dist/core/utilities/index.d.ts +4 -5
  230. package/dist/core/utilities/index.js +19 -5
  231. package/dist/core/utilities/index.js.map +1 -1
  232. package/dist/core/validation/adapters.d.ts +1 -1
  233. package/dist/core/validation/adapters.js +26 -15
  234. package/dist/core/validation/adapters.js.map +1 -1
  235. package/dist/core/validation/index.d.ts +4 -6
  236. package/dist/core/validation/index.js +28 -57
  237. package/dist/core/validation/index.js.map +1 -1
  238. package/dist/core/validation/schema-interface.js +9 -3
  239. package/dist/core/validation/schema-interface.js.map +1 -1
  240. package/dist/index.d.ts +52 -51
  241. package/dist/index.js +132 -23
  242. package/dist/index.js.map +1 -1
  243. package/dist/moro.d.ts +10 -61
  244. package/dist/moro.js +237 -575
  245. package/dist/moro.js.map +1 -1
  246. package/dist/types/auth.js +9 -3
  247. package/dist/types/auth.js.map +1 -1
  248. package/dist/types/cache.js +2 -1
  249. package/dist/types/cdn.js +2 -1
  250. package/dist/types/config.d.ts +2 -70
  251. package/dist/types/config.js +2 -1
  252. package/dist/types/config.js.map +1 -1
  253. package/dist/types/core.d.ts +42 -36
  254. package/dist/types/core.js +2 -1
  255. package/dist/types/database.js +2 -1
  256. package/dist/types/discovery.js +2 -1
  257. package/dist/types/events.js +2 -1
  258. package/dist/types/hooks.d.ts +1 -1
  259. package/dist/types/hooks.js +2 -1
  260. package/dist/types/http.d.ts +1 -16
  261. package/dist/types/http.js +2 -1
  262. package/dist/types/logger.d.ts +0 -7
  263. package/dist/types/logger.js +2 -1
  264. package/dist/types/module.d.ts +0 -11
  265. package/dist/types/module.js +2 -1
  266. package/dist/types/runtime.d.ts +1 -1
  267. package/dist/types/runtime.js +2 -1
  268. package/dist/types/session.js +2 -1
  269. package/package.json +52 -19
  270. package/src/core/auth/morojs-adapter.ts +13 -18
  271. package/src/core/config/file-loader.ts +273 -13
  272. package/src/core/config/index.ts +34 -83
  273. package/src/core/config/loader.ts +633 -0
  274. package/src/core/config/schema.ts +33 -44
  275. package/src/core/config/utils.ts +31 -24
  276. package/src/core/config/validation.ts +140 -0
  277. package/src/core/database/README.md +16 -26
  278. package/src/core/database/adapters/drizzle.ts +6 -18
  279. package/src/core/database/adapters/index.ts +13 -13
  280. package/src/core/database/adapters/mongodb.ts +5 -53
  281. package/src/core/database/adapters/mysql.ts +4 -32
  282. package/src/core/database/adapters/postgresql.ts +5 -30
  283. package/src/core/database/adapters/redis.ts +8 -61
  284. package/src/core/database/adapters/sqlite.ts +3 -19
  285. package/src/core/database/index.ts +2 -2
  286. package/src/core/docs/index.ts +8 -8
  287. package/src/core/docs/openapi-generator.ts +4 -4
  288. package/src/core/docs/schema-to-openapi.ts +6 -3
  289. package/src/core/docs/simple-docs.ts +2 -2
  290. package/src/core/docs/swagger-ui.ts +16 -19
  291. package/src/core/docs/zod-to-openapi.ts +34 -34
  292. package/src/core/events/event-bus.ts +2 -2
  293. package/src/core/events/index.ts +2 -2
  294. package/src/core/framework.ts +67 -311
  295. package/src/core/http/http-server.ts +45 -190
  296. package/src/core/http/index.ts +3 -4
  297. package/src/core/http/router.ts +40 -129
  298. package/src/core/logger/filters.ts +5 -13
  299. package/src/core/logger/index.ts +3 -4
  300. package/src/core/logger/logger.ts +216 -435
  301. package/src/core/logger/outputs.ts +3 -1
  302. package/src/core/middleware/built-in/adapters/cache/file.ts +3 -3
  303. package/src/core/middleware/built-in/adapters/cache/index.ts +7 -7
  304. package/src/core/middleware/built-in/adapters/cache/memory.ts +2 -2
  305. package/src/core/middleware/built-in/adapters/cache/redis.ts +4 -18
  306. package/src/core/middleware/built-in/adapters/cdn/azure.ts +2 -2
  307. package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +2 -2
  308. package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +5 -16
  309. package/src/core/middleware/built-in/adapters/cdn/index.ts +7 -7
  310. package/src/core/middleware/built-in/adapters/index.ts +4 -4
  311. package/src/core/middleware/built-in/auth-helpers.ts +1 -1
  312. package/src/core/middleware/built-in/auth-providers.ts +1 -1
  313. package/src/core/middleware/built-in/auth.ts +21 -102
  314. package/src/core/middleware/built-in/cache.ts +6 -8
  315. package/src/core/middleware/built-in/cdn.ts +4 -4
  316. package/src/core/middleware/built-in/cookie.ts +2 -2
  317. package/src/core/middleware/built-in/cors.ts +2 -2
  318. package/src/core/middleware/built-in/csp.ts +3 -3
  319. package/src/core/middleware/built-in/csrf.ts +3 -3
  320. package/src/core/middleware/built-in/error-tracker.ts +1 -1
  321. package/src/core/middleware/built-in/index.ts +30 -38
  322. package/src/core/middleware/built-in/performance-monitor.ts +1 -1
  323. package/src/core/middleware/built-in/rate-limit.ts +2 -2
  324. package/src/core/middleware/built-in/request-logger.ts +1 -3
  325. package/src/core/middleware/built-in/session.ts +8 -7
  326. package/src/core/middleware/built-in/sse.ts +9 -11
  327. package/src/core/middleware/built-in/validation.ts +2 -2
  328. package/src/core/middleware/index.ts +6 -6
  329. package/src/core/modules/auto-discovery.ts +15 -478
  330. package/src/core/modules/index.ts +2 -2
  331. package/src/core/modules/modules.ts +12 -23
  332. package/src/core/networking/adapters/index.ts +3 -4
  333. package/src/core/networking/adapters/socketio-adapter.ts +3 -5
  334. package/src/core/networking/adapters/ws-adapter.ts +9 -8
  335. package/src/core/networking/index.ts +2 -3
  336. package/src/core/networking/service-discovery.ts +7 -6
  337. package/src/core/networking/websocket-manager.ts +7 -7
  338. package/src/core/routing/app-integration.ts +3 -3
  339. package/src/core/routing/index.ts +17 -201
  340. package/src/core/runtime/aws-lambda-adapter.ts +3 -3
  341. package/src/core/runtime/base-adapter.ts +2 -2
  342. package/src/core/runtime/cloudflare-workers-adapter.ts +3 -3
  343. package/src/core/runtime/index.ts +13 -13
  344. package/src/core/runtime/node-adapter.ts +10 -16
  345. package/src/core/runtime/vercel-edge-adapter.ts +3 -3
  346. package/src/core/utilities/hooks.ts +3 -3
  347. package/src/core/utilities/index.ts +4 -5
  348. package/src/core/validation/adapters.ts +1 -1
  349. package/src/core/validation/index.ts +16 -68
  350. package/src/index.ts +66 -73
  351. package/src/moro.ts +204 -685
  352. package/src/types/config.ts +2 -71
  353. package/src/types/core.ts +47 -49
  354. package/src/types/hooks.ts +1 -1
  355. package/src/types/http.ts +1 -23
  356. package/src/types/logger.ts +0 -9
  357. package/src/types/module.ts +0 -12
  358. package/src/types/runtime.ts +1 -1
  359. package/tsconfig.json +2 -4
  360. package/dist/core/config/config-manager.d.ts +0 -44
  361. package/dist/core/config/config-manager.js +0 -104
  362. package/dist/core/config/config-manager.js.map +0 -1
  363. package/dist/core/config/config-sources.d.ts +0 -21
  364. package/dist/core/config/config-sources.js +0 -499
  365. package/dist/core/config/config-sources.js.map +0 -1
  366. package/dist/core/config/config-validator.d.ts +0 -21
  367. package/dist/core/config/config-validator.js +0 -788
  368. package/dist/core/config/config-validator.js.map +0 -1
  369. package/dist/core/http/uws-http-server.d.ts +0 -64
  370. package/dist/core/http/uws-http-server.js +0 -688
  371. package/dist/core/http/uws-http-server.js.map +0 -1
  372. package/dist/core/middleware/built-in/jwt-helpers.d.ts +0 -118
  373. package/dist/core/middleware/built-in/jwt-helpers.js +0 -218
  374. package/dist/core/middleware/built-in/jwt-helpers.js.map +0 -1
  375. package/dist/core/networking/adapters/uws-adapter.d.ts +0 -44
  376. package/dist/core/networking/adapters/uws-adapter.js +0 -513
  377. package/dist/core/networking/adapters/uws-adapter.js.map +0 -1
  378. package/dist/core/utilities/package-utils.d.ts +0 -38
  379. package/dist/core/utilities/package-utils.js +0 -57
  380. package/dist/core/utilities/package-utils.js.map +0 -1
  381. package/jest.config.mjs +0 -41
  382. package/src/core/config/config-manager.ts +0 -133
  383. package/src/core/config/config-sources.ts +0 -596
  384. package/src/core/config/config-validator.ts +0 -1113
  385. package/src/core/http/uws-http-server.ts +0 -794
  386. package/src/core/middleware/built-in/jwt-helpers.ts +0 -243
  387. package/src/core/networking/adapters/uws-adapter.ts +0 -619
  388. package/src/core/utilities/package-utils.ts +0 -59
@@ -1,6 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createFrameworkLogger = exports.logger = exports.MoroLogger = void 0;
4
+ exports.configureGlobalLogger = configureGlobalLogger;
5
+ exports.applyLoggingConfiguration = applyLoggingConfiguration;
1
6
  // Moro Logger - Beautiful, Fast, Feature-Rich
2
- import { performance } from 'perf_hooks';
3
- export class MoroLogger {
7
+ const perf_hooks_1 = require("perf_hooks");
8
+ class MoroLogger {
4
9
  level = 'info';
5
10
  options;
6
11
  outputs = new Map();
@@ -27,23 +32,12 @@ export class MoroLogger {
27
32
  cachedTimestamp = '';
28
33
  lastTimestamp = 0;
29
34
  timestampCacheInterval = 100; // 100ms for better precision
30
- // Object pooling for LogEntry objects (Pino's technique)
31
- static ENTRY_POOL = [];
32
- static MAX_POOL_SIZE = 100;
33
- static poolIndex = 0;
34
- // String builder for efficient concatenation
35
- static stringBuilder = [];
36
- static stringBuilderIndex = 0;
37
- // Buffered output for performance
35
+ // Buffered output for micro-batching
38
36
  outputBuffer = [];
39
37
  bufferSize = 0;
40
- maxBufferSize = 1000;
38
+ maxBufferSize = 1024; // 1KB buffer
41
39
  flushTimeout = null;
42
40
  flushInterval = 1; // 1ms micro-batching
43
- // Buffer overflow protection
44
- bufferOverflowThreshold;
45
- emergencyFlushInProgress = false;
46
- isDestroyed = false;
47
41
  // High-performance output methods
48
42
  static LEVELS = {
49
43
  debug: 0,
@@ -52,6 +46,76 @@ export class MoroLogger {
52
46
  error: 3,
53
47
  fatal: 4,
54
48
  };
49
+ // Static pre-allocated strings for maximum performance
50
+ static LEVEL_STRINGS = {
51
+ debug: 'DEBUG',
52
+ info: 'INFO',
53
+ warn: 'WARN',
54
+ error: 'ERROR',
55
+ fatal: 'FATAL',
56
+ };
57
+ // Pre-allocated ANSI color codes
58
+ static ANSI_COLORS = {
59
+ reset: '\x1b[0m',
60
+ bold: '\x1b[1m',
61
+ dim: '\x1b[2m',
62
+ red: '\x1b[31m',
63
+ green: '\x1b[32m',
64
+ yellow: '\x1b[33m',
65
+ blue: '\x1b[34m',
66
+ magenta: '\x1b[35m',
67
+ cyan: '\x1b[36m',
68
+ white: '\x1b[37m',
69
+ gray: '\x1b[90m',
70
+ };
71
+ // Object pool for LogEntry reuse
72
+ static ENTRY_POOL = [];
73
+ static MAX_POOL_SIZE = 100;
74
+ static poolIndex = 0;
75
+ // Object pool management
76
+ static getPooledEntry() {
77
+ if (MoroLogger.poolIndex > 0) {
78
+ return MoroLogger.ENTRY_POOL[--MoroLogger.poolIndex];
79
+ }
80
+ return {
81
+ timestamp: new Date(),
82
+ level: 'info',
83
+ message: '',
84
+ context: undefined,
85
+ metadata: undefined,
86
+ };
87
+ }
88
+ static returnPooledEntry(entry) {
89
+ if (MoroLogger.poolIndex < MoroLogger.MAX_POOL_SIZE) {
90
+ // Reset the entry
91
+ entry.timestamp = new Date();
92
+ entry.level = 'info';
93
+ entry.message = '';
94
+ entry.context = undefined;
95
+ entry.metadata = undefined;
96
+ MoroLogger.ENTRY_POOL[MoroLogger.poolIndex++] = entry;
97
+ }
98
+ }
99
+ // String builder for efficient concatenation
100
+ static stringBuilder = [];
101
+ static stringBuilderIndex = 0;
102
+ static resetStringBuilder() {
103
+ MoroLogger.stringBuilderIndex = 0;
104
+ }
105
+ static appendToBuilder(str) {
106
+ if (MoroLogger.stringBuilderIndex < MoroLogger.stringBuilder.length) {
107
+ MoroLogger.stringBuilder[MoroLogger.stringBuilderIndex++] = str;
108
+ }
109
+ else {
110
+ MoroLogger.stringBuilder.push(str);
111
+ MoroLogger.stringBuilderIndex++;
112
+ }
113
+ }
114
+ static buildString() {
115
+ const result = MoroLogger.stringBuilder.slice(0, MoroLogger.stringBuilderIndex).join('');
116
+ MoroLogger.resetStringBuilder();
117
+ return result;
118
+ }
55
119
  static COLORS = {
56
120
  debug: '\x1b[36m', // Cyan
57
121
  info: '\x1b[32m', // Green
@@ -62,20 +126,11 @@ export class MoroLogger {
62
126
  context: '\x1b[34m', // Blue
63
127
  metadata: '\x1b[37m', // White
64
128
  performance: '\x1b[36m', // Cyan
65
- reset: '\x1b[0m', // Reset
66
129
  };
67
130
  static RESET = '\x1b[0m';
68
131
  static BOLD = '\x1b[1m';
69
- // Static pre-allocated strings for performance
70
- static LEVEL_STRINGS = {
71
- debug: 'DEBUG',
72
- info: 'INFO ',
73
- warn: 'WARN ',
74
- error: 'ERROR',
75
- fatal: 'FATAL',
76
- };
77
132
  constructor(options = {}) {
78
- this.options = this.validateOptions({
133
+ this.options = {
79
134
  level: 'info',
80
135
  enableColors: true,
81
136
  enableTimestamp: true,
@@ -86,14 +141,9 @@ export class MoroLogger {
86
141
  outputs: [],
87
142
  filters: [],
88
143
  maxEntries: 1000,
89
- maxBufferSize: 1000,
90
144
  ...options,
91
- });
145
+ };
92
146
  this.level = this.options.level || 'info';
93
- // Initialize buffer size from options
94
- this.maxBufferSize = this.options.maxBufferSize || 1000;
95
- // Initialize buffer overflow protection
96
- this.bufferOverflowThreshold = this.maxBufferSize * 2;
97
147
  // Add default console output
98
148
  this.addOutput({
99
149
  name: 'console',
@@ -104,52 +154,6 @@ export class MoroLogger {
104
154
  this.options.outputs?.forEach(output => this.addOutput(output));
105
155
  this.options.filters?.forEach(filter => this.addFilter(filter));
106
156
  }
107
- // Object pooling methods
108
- static getPooledEntry() {
109
- if (MoroLogger.ENTRY_POOL.length > 0) {
110
- const entry = MoroLogger.ENTRY_POOL.pop();
111
- // Properly reset ALL properties to prevent memory leaks
112
- entry.timestamp = new Date();
113
- entry.level = 'info';
114
- entry.message = '';
115
- entry.context = undefined;
116
- entry.metadata = undefined;
117
- entry.performance = undefined;
118
- entry.moduleId = undefined;
119
- return entry;
120
- }
121
- return MoroLogger.createFreshEntry();
122
- }
123
- // ADD this new method:
124
- static createFreshEntry() {
125
- return {
126
- timestamp: new Date(),
127
- level: 'info',
128
- message: '',
129
- context: undefined,
130
- metadata: undefined,
131
- performance: undefined,
132
- moduleId: undefined,
133
- };
134
- }
135
- static returnPooledEntry(entry) {
136
- if (MoroLogger.ENTRY_POOL.length < MoroLogger.MAX_POOL_SIZE) {
137
- MoroLogger.ENTRY_POOL.push(entry);
138
- }
139
- }
140
- // String builder methods
141
- static resetStringBuilder() {
142
- MoroLogger.stringBuilder.length = 0;
143
- MoroLogger.stringBuilderIndex = 0;
144
- }
145
- static appendToBuilder(str) {
146
- MoroLogger.stringBuilder[MoroLogger.stringBuilderIndex++] = str;
147
- }
148
- static buildString() {
149
- const result = MoroLogger.stringBuilder.join('');
150
- MoroLogger.resetStringBuilder();
151
- return result;
152
- }
153
157
  debug(message, context, metadata) {
154
158
  this.log('debug', message, context, metadata);
155
159
  }
@@ -170,12 +174,12 @@ export class MoroLogger {
170
174
  this.log('fatal', msg, context, { ...metadata, stack });
171
175
  }
172
176
  time(label) {
173
- this.timers.set(label, performance.now());
177
+ this.timers.set(label, perf_hooks_1.performance.now());
174
178
  }
175
179
  timeEnd(label, context, metadata) {
176
180
  const startTime = this.timers.get(label);
177
181
  if (startTime !== undefined) {
178
- const duration = performance.now() - startTime;
182
+ const duration = perf_hooks_1.performance.now() - startTime;
179
183
  this.timers.delete(label);
180
184
  this.log('info', `Timer: ${label}`, context, {
181
185
  ...metadata,
@@ -184,9 +188,7 @@ export class MoroLogger {
184
188
  }
185
189
  }
186
190
  child(context, metadata) {
187
- // Create child logger with current parent level (not original options level)
188
- const childOptions = { ...this.options, level: this.level };
189
- const childLogger = new MoroLogger(childOptions);
191
+ const childLogger = new MoroLogger(this.options);
190
192
  childLogger.contextPrefix = this.contextPrefix ? `${this.contextPrefix}:${context}` : context;
191
193
  childLogger.contextMetadata = { ...this.contextMetadata, ...metadata };
192
194
  childLogger.outputs = this.outputs;
@@ -198,9 +200,6 @@ export class MoroLogger {
198
200
  setLevel(level) {
199
201
  this.level = level;
200
202
  }
201
- getLevel() {
202
- return this.level;
203
- }
204
203
  addOutput(output) {
205
204
  this.outputs.set(output.name, output);
206
205
  }
@@ -243,16 +242,6 @@ export class MoroLogger {
243
242
  }
244
243
  return this.cachedTimestamp;
245
244
  }
246
- // Cached timestamp generation (updates once per second)
247
- getFastCachedTimestamp() {
248
- const now = Date.now();
249
- if (now - this.lastTimestamp > 1000) {
250
- // Update every second
251
- this.lastTimestamp = now;
252
- this.cachedTimestamp = new Date(now).toISOString().slice(0, 19).replace('T', ' ');
253
- }
254
- return this.cachedTimestamp;
255
- }
256
245
  getMetrics() {
257
246
  const now = Date.now();
258
247
  const uptime = (now - this.startTime) / 1000; // seconds
@@ -277,38 +266,47 @@ export class MoroLogger {
277
266
  memoryUsage: 0,
278
267
  };
279
268
  }
280
- // Optimized logging method
269
+ // Optimized logging method with aggressive level checking
281
270
  log(level, message, context, metadata) {
282
- // Prevent logging after destroy() is called (important for test cleanup)
283
- if (this.isDestroyed) {
284
- return;
285
- }
286
- // Quick level check - use parent level if available (for child loggers)
287
- const effectiveLevel = this.parent ? this.parent.level : this.level;
288
- if (MoroLogger.LEVELS[level] < MoroLogger.LEVELS[effectiveLevel]) {
289
- return;
290
- }
291
- // Absolute minimal path for simple logs - pure speed
271
+ // AGGRESSIVE LEVEL CHECK - numeric comparison for maximum speed
272
+ const levelNum = MoroLogger.LEVELS[level];
273
+ const effectiveLevelNum = this.parent
274
+ ? MoroLogger.LEVELS[this.parent.level]
275
+ : MoroLogger.LEVELS[this.level];
276
+ if (levelNum < effectiveLevelNum) {
277
+ return; // Exit immediately if level is too low
278
+ }
279
+ // ULTRA-FAST PATH: Just message, no context, no metadata
292
280
  if (!metadata && !context && !this.contextPrefix && !this.contextMetadata) {
293
- this.writeSimpleLog(level, message);
281
+ const levelStr = MoroLogger.LEVEL_STRINGS[level];
282
+ this.output(`${levelStr} ${message}\n`, level);
294
283
  return;
295
284
  }
296
- // Minimal path for logs with context but no metadata
285
+ // FAST PATH: Message + context, no metadata
297
286
  if (!metadata && !this.contextMetadata) {
298
- this.writeSimpleLog(level, message, context);
287
+ const levelStr = MoroLogger.LEVEL_STRINGS[level];
288
+ if (context) {
289
+ this.output(`${levelStr} [${context}] ${message}\n`, level);
290
+ }
291
+ else {
292
+ this.output(`${levelStr} ${message}\n`, level);
293
+ }
299
294
  return;
300
295
  }
301
- // Path for complex logs
302
- if (metadata && Object.keys(metadata).length > 0) {
303
- this.complexLog(level, message, context, metadata);
296
+ // MEDIUM PATH: Message + context + simple metadata
297
+ if (metadata && Object.keys(metadata).length <= 3 && !this.contextMetadata) {
298
+ const levelStr = MoroLogger.LEVEL_STRINGS[level];
299
+ const contextStr = context ? `[${context}] ` : '';
300
+ const metaStr = this.stringify(metadata);
301
+ this.output(`${levelStr} ${contextStr}${message} ${metaStr}\n`, level);
304
302
  return;
305
303
  }
306
- // Full logging path for complex logs
304
+ // FULL PATH: All features enabled
307
305
  this.fullLog(level, message, context, metadata);
308
306
  }
309
- // Full logging with all features
307
+ // Full logging with all features using object pooling
310
308
  fullLog(level, message, context, metadata) {
311
- // Use object pooling for LogEntry (Pino's technique)
309
+ // Get pooled entry to avoid allocation
312
310
  const entry = MoroLogger.getPooledEntry();
313
311
  const now = Date.now();
314
312
  entry.timestamp = new Date(now);
@@ -325,7 +323,6 @@ export class MoroLogger {
325
323
  if (this.filters.size > 0) {
326
324
  for (const filter of this.filters.values()) {
327
325
  if (!filter.filter(entry)) {
328
- MoroLogger.returnPooledEntry(entry);
329
326
  return;
330
327
  }
331
328
  }
@@ -336,76 +333,8 @@ export class MoroLogger {
336
333
  this.addToHistory(entry);
337
334
  // Write to outputs with batched processing
338
335
  this.writeToOutputs(entry, level);
339
- // Return entry to pool
340
- MoroLogger.returnPooledEntry(entry);
341
- }
342
- // Absolute minimal logging - pure speed, no overhead
343
- complexLog(level, message, context, metadata) {
344
- // Use object pooling for LogEntry (Pino's technique)
345
- const entry = MoroLogger.getPooledEntry();
346
- const now = Date.now();
347
- entry.timestamp = new Date(now);
348
- entry.level = level;
349
- entry.message = message;
350
- entry.context = this.contextPrefix
351
- ? context
352
- ? `${this.contextPrefix}:${context}`
353
- : this.contextPrefix
354
- : context;
355
- entry.metadata = this.createMetadata(metadata);
356
- entry.performance = this.options.enablePerformance ? this.getPerformanceData(now) : undefined;
357
- // Write to outputs with batched processing
358
- this.writeToOutputs(entry, level);
359
- // Return entry to pool
360
- MoroLogger.returnPooledEntry(entry);
361
- }
362
- // Simple log writer with colors for minimal overhead cases
363
- writeSimpleLog(level, message, context) {
364
- const colors = this.options.enableColors !== false;
365
- const levelReset = colors ? MoroLogger.RESET : '';
366
- MoroLogger.resetStringBuilder();
367
- // Timestamp with caching optimization
368
- if (this.options.enableTimestamp !== false) {
369
- const timestamp = this.getFastCachedTimestamp();
370
- if (colors) {
371
- MoroLogger.appendToBuilder(MoroLogger.COLORS.timestamp);
372
- MoroLogger.appendToBuilder(timestamp);
373
- MoroLogger.appendToBuilder(levelReset);
374
- }
375
- else {
376
- MoroLogger.appendToBuilder(timestamp);
377
- }
378
- MoroLogger.appendToBuilder(' ');
379
- }
380
- // Level with pre-allocated strings
381
- const levelStr = MoroLogger.LEVEL_STRINGS[level];
382
- if (colors) {
383
- MoroLogger.appendToBuilder(MoroLogger.COLORS[level]);
384
- MoroLogger.appendToBuilder(MoroLogger.BOLD);
385
- MoroLogger.appendToBuilder(levelStr);
386
- MoroLogger.appendToBuilder(levelReset);
387
- }
388
- else {
389
- MoroLogger.appendToBuilder(levelStr);
390
- }
391
- // Context
392
- if (context && this.options.enableContext !== false) {
393
- MoroLogger.appendToBuilder(' ');
394
- if (colors) {
395
- MoroLogger.appendToBuilder(MoroLogger.COLORS.context);
396
- MoroLogger.appendToBuilder(`[${context}]`);
397
- MoroLogger.appendToBuilder(levelReset);
398
- }
399
- else {
400
- MoroLogger.appendToBuilder(`[${context}]`);
401
- }
402
- }
403
- // Message
404
- MoroLogger.appendToBuilder(' ');
405
- MoroLogger.appendToBuilder(message);
406
- // Output main log line with high-performance method
407
- const finalMessage = MoroLogger.buildString();
408
- this.output(`${finalMessage}\n`, level);
336
+ // Return entry to pool after a short delay to allow async operations
337
+ setTimeout(() => MoroLogger.returnPooledEntry(entry), 0);
409
338
  }
410
339
  updateMetrics(entry) {
411
340
  this.metrics.totalLogs++;
@@ -453,35 +382,23 @@ export class MoroLogger {
453
382
  writeToOutputs(entry, level) {
454
383
  if (this.outputs.size === 0)
455
384
  return;
456
- let successCount = 0;
457
- const errors = [];
458
385
  for (const output of this.outputs.values()) {
459
386
  if (!output.level || MoroLogger.LEVELS[level] >= MoroLogger.LEVELS[output.level]) {
460
387
  try {
461
388
  output.write(entry);
462
- successCount++;
463
389
  }
464
390
  catch (error) {
465
- errors.push({ outputName: output.name, error });
466
- this.handleOutputError(output.name, error);
391
+ // Fallback to console.error for logger errors
392
+ // eslint-disable-next-line no-console
393
+ console.error('Logger output error:', error);
467
394
  }
468
395
  }
469
396
  }
470
- // If all outputs fail, use emergency console
471
- if (successCount === 0 && this.outputs.size > 0) {
472
- this.emergencyConsoleWrite(entry);
473
- }
474
- // Log output errors (but avoid infinite loops)
475
- if (errors.length > 0 && level !== 'error') {
476
- this.error(`Logger output errors: ${errors.length} failed`, 'MoroLogger', {
477
- errors: errors.map(e => e.outputName),
478
- });
479
- }
480
397
  }
481
398
  writeToConsole(entry) {
482
399
  const format = this.options.format || 'pretty';
483
400
  if (format === 'json') {
484
- this.output(`${this.safeStringify(entry)}\n`, entry.level);
401
+ this.output(JSON.stringify(entry) + '\n', entry.level);
485
402
  return;
486
403
  }
487
404
  if (format === 'compact') {
@@ -495,7 +412,6 @@ export class MoroLogger {
495
412
  }
496
413
  writePrettyLog(entry) {
497
414
  const colors = this.options.enableColors !== false;
498
- const levelReset = colors ? MoroLogger.RESET : '';
499
415
  MoroLogger.resetStringBuilder();
500
416
  // Timestamp with caching optimization
501
417
  if (this.options.enableTimestamp !== false) {
@@ -503,29 +419,35 @@ export class MoroLogger {
503
419
  if (colors) {
504
420
  MoroLogger.appendToBuilder(MoroLogger.COLORS.timestamp);
505
421
  MoroLogger.appendToBuilder(timestamp);
506
- MoroLogger.appendToBuilder(levelReset);
422
+ MoroLogger.appendToBuilder(MoroLogger.RESET);
507
423
  }
508
424
  else {
509
425
  MoroLogger.appendToBuilder(timestamp);
510
426
  }
427
+ }
428
+ // Level with color using pre-allocated strings
429
+ const levelColor = colors ? MoroLogger.COLORS[entry.level] : '';
430
+ const levelReset = colors ? MoroLogger.RESET : '';
431
+ const levelText = MoroLogger.LEVEL_STRINGS[entry.level];
432
+ // Add space after timestamp if present
433
+ if (this.options.enableTimestamp !== false) {
511
434
  MoroLogger.appendToBuilder(' ');
512
435
  }
513
- // Level with pre-allocated strings
514
- const levelStr = MoroLogger.LEVEL_STRINGS[entry.level];
515
436
  if (colors) {
516
- MoroLogger.appendToBuilder(MoroLogger.COLORS[entry.level]);
437
+ MoroLogger.appendToBuilder(levelColor);
517
438
  MoroLogger.appendToBuilder(MoroLogger.BOLD);
518
- MoroLogger.appendToBuilder(levelStr);
439
+ MoroLogger.appendToBuilder(levelText);
519
440
  MoroLogger.appendToBuilder(levelReset);
520
441
  }
521
442
  else {
522
- MoroLogger.appendToBuilder(levelStr);
443
+ MoroLogger.appendToBuilder(levelText);
523
444
  }
524
445
  // Context
525
446
  if (entry.context && this.options.enableContext !== false) {
526
- MoroLogger.appendToBuilder(' ');
447
+ const contextColor = colors ? MoroLogger.COLORS.context : '';
448
+ MoroLogger.appendToBuilder(' '); // Space before context
527
449
  if (colors) {
528
- MoroLogger.appendToBuilder(MoroLogger.COLORS.context);
450
+ MoroLogger.appendToBuilder(contextColor);
529
451
  MoroLogger.appendToBuilder(`[${entry.context}]`);
530
452
  MoroLogger.appendToBuilder(levelReset);
531
453
  }
@@ -534,7 +456,7 @@ export class MoroLogger {
534
456
  }
535
457
  }
536
458
  // Message
537
- MoroLogger.appendToBuilder(' ');
459
+ MoroLogger.appendToBuilder(' '); // Space before message
538
460
  MoroLogger.appendToBuilder(entry.message);
539
461
  // Performance info
540
462
  if (entry.performance && this.options.enablePerformance !== false) {
@@ -547,7 +469,7 @@ export class MoroLogger {
547
469
  perfParts.push(`${Math.round(entry.performance.memory)}MB`);
548
470
  }
549
471
  if (perfParts.length > 0) {
550
- MoroLogger.appendToBuilder(' ');
472
+ MoroLogger.appendToBuilder(' '); // Space before performance info
551
473
  if (colors) {
552
474
  MoroLogger.appendToBuilder(perfColor);
553
475
  MoroLogger.appendToBuilder(`(${perfParts.join(', ')})`);
@@ -565,20 +487,19 @@ export class MoroLogger {
565
487
  const metaColor = colors ? MoroLogger.COLORS.metadata : '';
566
488
  const cleanMetadata = this.cleanMetadata(entry.metadata);
567
489
  if (Object.keys(cleanMetadata).length > 0) {
568
- MoroLogger.appendToBuilder(' ');
569
490
  if (colors) {
570
491
  MoroLogger.appendToBuilder(metaColor);
571
- MoroLogger.appendToBuilder(this.safeStringify(cleanMetadata));
492
+ MoroLogger.appendToBuilder(this.stringify(cleanMetadata));
572
493
  MoroLogger.appendToBuilder(levelReset);
573
494
  }
574
495
  else {
575
- MoroLogger.appendToBuilder(this.safeStringify(cleanMetadata));
496
+ MoroLogger.appendToBuilder(this.stringify(cleanMetadata));
576
497
  }
577
498
  }
578
499
  }
579
500
  // Output main log line with high-performance method
580
501
  const finalMessage = MoroLogger.buildString();
581
- this.output(`${finalMessage}\n`, entry.level);
502
+ this.output(finalMessage + '\n', entry.level);
582
503
  // Stack trace for errors
583
504
  if (entry.metadata?.stack && (entry.level === 'error' || entry.level === 'fatal')) {
584
505
  const stackColor = colors ? MoroLogger.COLORS.error : '';
@@ -595,181 +516,77 @@ export class MoroLogger {
595
516
  }
596
517
  return clean;
597
518
  }
598
- // High-performance output with buffering
599
- output(message, level = 'info') {
600
- // Prevent memory exhaustion
601
- if (this.outputBuffer.length >= this.bufferOverflowThreshold &&
602
- !this.emergencyFlushInProgress) {
603
- this.emergencyFlushInProgress = true;
604
- this.forceFlushBuffer();
605
- this.emergencyFlushInProgress = false;
519
+ // Fast JSON stringify with error handling
520
+ stringify(obj) {
521
+ try {
522
+ return JSON.stringify(obj);
606
523
  }
524
+ catch {
525
+ return '[Circular Reference]';
526
+ }
527
+ }
528
+ // High-performance output with micro-batching
529
+ output(message, level = 'info') {
530
+ // Add to buffer
607
531
  this.outputBuffer.push(message);
608
- this.bufferSize++;
609
- // Immediate flush for critical levels or full buffer
610
- if (level === 'fatal' || level === 'error' || this.bufferSize >= this.maxBufferSize) {
532
+ this.bufferSize += message.length;
533
+ // Flush immediately if buffer is full or for errors
534
+ if (this.bufferSize >= this.maxBufferSize || level === 'error' || level === 'fatal') {
611
535
  this.flushBuffer();
612
536
  }
613
537
  else {
538
+ // Schedule flush with micro-batching
614
539
  this.scheduleFlush();
615
540
  }
616
541
  }
617
542
  scheduleFlush() {
618
- if (this.flushTimeout || this.isDestroyed) {
619
- return; // Already scheduled or destroyed
620
- }
543
+ if (this.flushTimeout)
544
+ return; // Already scheduled
621
545
  this.flushTimeout = setTimeout(() => {
622
546
  this.flushBuffer();
547
+ this.flushTimeout = null;
623
548
  }, this.flushInterval);
624
- // Unref the timeout so it doesn't prevent process exit (important for tests)
625
- this.flushTimeout.unref();
626
549
  }
627
550
  flushBuffer() {
628
- if (this.outputBuffer.length === 0) {
551
+ if (this.outputBuffer.length === 0)
629
552
  return;
630
- }
631
- // Group messages by stream type
632
- const stdoutMessages = [];
633
- const stderrMessages = [];
634
- for (const message of this.outputBuffer) {
635
- // Determine stream based on message content or level
636
- if (message.includes('ERROR') || message.includes('FATAL')) {
637
- stderrMessages.push(message);
638
- }
639
- else {
640
- stdoutMessages.push(message);
641
- }
642
- }
643
- // Write to appropriate streams with error handling
644
553
  try {
645
- if (stdoutMessages.length > 0 && process.stdout.writable) {
554
+ // Group by stream type for efficiency
555
+ const stdoutMessages = [];
556
+ const stderrMessages = [];
557
+ for (const message of this.outputBuffer) {
558
+ // Determine stream based on message content (simple heuristic)
559
+ if (message.includes('ERROR') || message.includes('FATAL')) {
560
+ stderrMessages.push(message);
561
+ }
562
+ else {
563
+ stdoutMessages.push(message);
564
+ }
565
+ }
566
+ // Write to streams
567
+ if (stdoutMessages.length > 0) {
646
568
  process.stdout.write(stdoutMessages.join(''));
647
569
  }
648
- if (stderrMessages.length > 0 && process.stderr.writable) {
570
+ if (stderrMessages.length > 0) {
649
571
  process.stderr.write(stderrMessages.join(''));
650
572
  }
651
573
  }
652
574
  catch {
653
- // Fallback to console if streams fail
654
- try {
655
- // eslint-disable-next-line no-console
656
- console.log(this.outputBuffer.join(''));
657
- }
658
- catch {
659
- // If even console.log fails, just ignore
660
- }
661
- }
662
- // Clear buffer
663
- this.outputBuffer.length = 0;
664
- this.bufferSize = 0;
665
- // Clear timeout
666
- if (this.flushTimeout) {
667
- clearTimeout(this.flushTimeout);
668
- this.flushTimeout = null;
669
- }
670
- }
671
- // Emergency flush for buffer overflow protection
672
- forceFlushBuffer() {
673
- if (this.outputBuffer.length === 0)
674
- return;
675
- try {
676
- const message = this.outputBuffer.join('');
677
- process.stdout.write(message);
678
- }
679
- catch (error) {
680
- // Emergency fallback - write individual messages
681
- for (const msg of this.outputBuffer) {
682
- try {
683
- process.stdout.write(msg);
684
- }
685
- catch {
686
- // If even this fails, give up on this batch
687
- break;
575
+ // Fallback to console methods if stream write fails
576
+ for (const message of this.outputBuffer) {
577
+ if (message.includes('ERROR') || message.includes('FATAL')) {
578
+ // eslint-disable-next-line no-console
579
+ console.error(message.trim());
688
580
  }
689
- }
690
- }
691
- finally {
692
- this.outputBuffer.length = 0;
693
- this.bufferSize = 0;
694
- }
695
- }
696
- // Safe stringify with circular reference detection
697
- safeStringify(obj, maxDepth = 3) {
698
- const seen = new WeakSet();
699
- const stringify = (value, depth) => {
700
- if (depth > maxDepth)
701
- return '[Max Depth Reached]';
702
- if (value === null || typeof value !== 'object')
703
- return value;
704
- if (seen.has(value))
705
- return '[Circular Reference]';
706
- seen.add(value);
707
- if (Array.isArray(value)) {
708
- return value.map(item => stringify(item, depth + 1));
709
- }
710
- const result = {};
711
- for (const [key, val] of Object.entries(value)) {
712
- if (typeof val !== 'function') {
713
- // Skip functions
714
- result[key] = stringify(val, depth + 1);
581
+ else {
582
+ // eslint-disable-next-line no-console
583
+ console.log(message.trim());
715
584
  }
716
585
  }
717
- return result;
718
- };
719
- try {
720
- return JSON.stringify(stringify(obj, 0));
721
- }
722
- catch (error) {
723
- return '[Stringify Error]';
724
- }
725
- }
726
- // Configuration validation
727
- validateOptions(options) {
728
- const validated = { ...options };
729
- // Validate log level
730
- const validLevels = ['debug', 'info', 'warn', 'error', 'fatal'];
731
- if (validated.level && !validLevels.includes(validated.level)) {
732
- console.warn(`[MoroLogger] Invalid log level: ${validated.level}, defaulting to 'info'`);
733
- validated.level = 'info';
734
- }
735
- // Validate max entries
736
- if (validated.maxEntries !== undefined) {
737
- if (validated.maxEntries < 1 || validated.maxEntries > 100000) {
738
- console.warn(`[MoroLogger] Invalid maxEntries: ${validated.maxEntries}, defaulting to 1000`);
739
- validated.maxEntries = 1000;
740
- }
741
- }
742
- // Validate buffer size
743
- if (validated.maxBufferSize !== undefined) {
744
- if (validated.maxBufferSize < 10 || validated.maxBufferSize > 10000) {
745
- console.warn(`[MoroLogger] Invalid maxBufferSize: ${validated.maxBufferSize}, defaulting to 1000`);
746
- validated.maxBufferSize = 1000;
747
- }
748
- }
749
- return validated;
750
- }
751
- // Error handling methods
752
- handleOutputError(outputName, error) {
753
- // Could implement output retry logic, circuit breaker, etc.
754
- // For now, just track the error
755
- if (!this.metrics.outputErrors) {
756
- this.metrics.outputErrors = {};
757
- }
758
- this.metrics.outputErrors[outputName] = (this.metrics.outputErrors[outputName] || 0) + 1;
759
- }
760
- emergencyConsoleWrite(entry) {
761
- const message = `${entry.timestamp.toISOString()} ${entry.level.toUpperCase()} ${entry.message}`;
762
- try {
763
- if (entry.level === 'error' || entry.level === 'fatal') {
764
- process.stderr.write(`[EMERGENCY] ${message}\n`);
765
- }
766
- else {
767
- process.stdout.write(`[EMERGENCY] ${message}\n`);
768
- }
769
- }
770
- catch {
771
- // If even emergency write fails, there's nothing more we can do
772
586
  }
587
+ // Reset buffer
588
+ this.outputBuffer.length = 0;
589
+ this.bufferSize = 0;
773
590
  }
774
591
  // Force flush streams (useful for shutdown)
775
592
  flush() {
@@ -781,69 +598,76 @@ export class MoroLogger {
781
598
  // Flush any remaining buffer
782
599
  this.flushBuffer();
783
600
  try {
784
- // Force flush streams without ending them
601
+ // Force flush streams
785
602
  if (process.stdout.writable) {
786
- process.stdout.write(''); // Force flush without ending
603
+ process.stdout.end();
787
604
  }
788
605
  if (process.stderr.writable) {
789
- process.stderr.write(''); // Force flush without ending
606
+ process.stderr.end();
790
607
  }
791
608
  }
792
609
  catch {
793
610
  // Ignore flush errors
794
611
  }
795
612
  }
796
- // Destroy logger and clean up all resources (for testing)
797
- destroy() {
798
- // Mark as destroyed to prevent new timeouts
799
- this.isDestroyed = true;
800
- // Clear any remaining timeouts
613
+ // Cleanup method to clear all timeouts and handles
614
+ cleanup() {
615
+ // Clear any pending flush timeout
801
616
  if (this.flushTimeout) {
802
617
  clearTimeout(this.flushTimeout);
803
618
  this.flushTimeout = null;
804
619
  }
805
- // Flush any remaining buffer
620
+ // Flush any remaining output
806
621
  this.flushBuffer();
807
- // Clear outputs and filters
808
- this.outputs.clear();
809
- this.filters.clear();
810
- // Clear history
811
- this.history.length = 0;
812
- this.historyIndex = 0;
813
- this.historySize = 0;
814
622
  }
815
623
  }
624
+ exports.MoroLogger = MoroLogger;
816
625
  // Global logger instance
817
626
  const initialLogLevel = process.env.LOG_LEVEL ||
818
627
  process.env.MORO_LOG_LEVEL ||
819
628
  (process.env.NODE_ENV === 'production' ? 'warn' : 'debug');
820
- export const logger = new MoroLogger({
629
+ exports.logger = new MoroLogger({
821
630
  level: initialLogLevel,
822
631
  enableColors: !process.env.NO_COLOR,
823
632
  format: process.env.LOG_FORMAT || 'pretty',
824
633
  });
634
+ // Add cleanup handlers for Jest and other test runners
635
+ if (typeof process !== 'undefined') {
636
+ // Cleanup on process exit
637
+ process.on('beforeExit', () => {
638
+ exports.logger.cleanup();
639
+ });
640
+ process.on('SIGINT', () => {
641
+ exports.logger.cleanup();
642
+ process.exit(0);
643
+ });
644
+ process.on('SIGTERM', () => {
645
+ exports.logger.cleanup();
646
+ process.exit(0);
647
+ });
648
+ // For Jest and other test runners - cleanup on uncaught exceptions
649
+ process.on('uncaughtException', () => {
650
+ exports.logger.cleanup();
651
+ });
652
+ process.on('unhandledRejection', () => {
653
+ exports.logger.cleanup();
654
+ });
655
+ }
825
656
  /**
826
657
  * Configure the global logger with new settings
827
658
  * This allows runtime configuration of the logger
828
659
  */
829
- export function configureGlobalLogger(options) {
660
+ function configureGlobalLogger(options) {
830
661
  if (options.level) {
831
- logger.setLevel(options.level);
662
+ exports.logger.setLevel(options.level);
832
663
  }
833
664
  // Additional configuration options can be added here as needed
834
665
  // For now, focusing on level which is the most critical
835
666
  }
836
- /**
837
- * Destroy the global logger and clean up resources (for testing)
838
- * @internal
839
- */
840
- export function destroyGlobalLogger() {
841
- logger.destroy();
842
- }
843
667
  /**
844
668
  * Apply logging configuration from the config system and/or createApp options
845
669
  */
846
- export function applyLoggingConfiguration(configLogging, appOptions) {
670
+ function applyLoggingConfiguration(configLogging, appOptions) {
847
671
  // First apply config system settings (from environment variables)
848
672
  if (configLogging?.level) {
849
673
  configureGlobalLogger({ level: configLogging.level });
@@ -860,19 +684,20 @@ export function applyLoggingConfiguration(configLogging, appOptions) {
860
684
  }
861
685
  }
862
686
  // Framework-specific logger
863
- export const createFrameworkLogger = (context) => {
864
- return logger.child('Moro', { framework: 'moro', context });
687
+ const createFrameworkLogger = (context) => {
688
+ return exports.logger.child('Moro', { framework: 'moro', context });
865
689
  };
690
+ exports.createFrameworkLogger = createFrameworkLogger;
866
691
  // Graceful shutdown handler to flush any pending logs
867
692
  process.on('SIGINT', () => {
868
- logger.flush();
693
+ exports.logger.flush();
869
694
  process.exit(0);
870
695
  });
871
696
  process.on('SIGTERM', () => {
872
- logger.flush();
697
+ exports.logger.flush();
873
698
  process.exit(0);
874
699
  });
875
700
  process.on('beforeExit', () => {
876
- logger.flush();
701
+ exports.logger.flush();
877
702
  });
878
703
  //# sourceMappingURL=logger.js.map