@morojs/moro 1.6.2 → 1.6.3

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