@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
@@ -0,0 +1,633 @@
1
+ // Configuration Loader - Environment Variable Mapping and Validation
2
+ import { ConfigSchema, AppConfig, DEFAULT_CONFIG } from './schema';
3
+ import {
4
+ validatePort,
5
+ validateBoolean,
6
+ validateNumber,
7
+ validateString,
8
+ validateUrl,
9
+ validateEnum,
10
+ validateStringArray,
11
+ validateOptional,
12
+ coerceEnvValue,
13
+ ConfigValidationError,
14
+ } from './validation';
15
+ import { createFrameworkLogger } from '../logger';
16
+ import { loadConfigFileSync, applyConfigAsEnvironmentVariables } from './file-loader';
17
+
18
+ const logger = createFrameworkLogger('Config');
19
+
20
+ /**
21
+ * Load and validate configuration from config files and environment variables
22
+ * Priority: Environment Variables > Config File > Schema Defaults
23
+ * @returns Validated and typed application configuration
24
+ */
25
+ export function loadConfig(): AppConfig {
26
+ logger.debug('Loading configuration with TypeScript validation');
27
+
28
+ // First, try to load from config file and apply as environment variables
29
+ try {
30
+ const fileConfig = loadConfigFileSync();
31
+ if (fileConfig) {
32
+ logger.debug('Applying config file values as environment variables');
33
+ applyConfigAsEnvironmentVariables(fileConfig);
34
+ }
35
+ } catch (error) {
36
+ logger.warn(
37
+ 'Config file loading failed, continuing with environment variables only:',
38
+ String(error)
39
+ );
40
+ }
41
+
42
+ try {
43
+ // Build configuration using robust validation functions
44
+ const config: AppConfig = {
45
+ server: {
46
+ port: validatePort(
47
+ coerceEnvValue(process.env.PORT || process.env.MORO_PORT || '') ||
48
+ DEFAULT_CONFIG.server.port,
49
+ 'server.port'
50
+ ),
51
+ host: validateString(
52
+ process.env.HOST || process.env.MORO_HOST || DEFAULT_CONFIG.server.host,
53
+ 'server.host'
54
+ ),
55
+ environment: validateEnum(
56
+ process.env.NODE_ENV || process.env.MORO_ENV || DEFAULT_CONFIG.server.environment,
57
+ ['development', 'staging', 'production'] as const,
58
+ 'server.environment'
59
+ ),
60
+ maxConnections: validateNumber(
61
+ coerceEnvValue(process.env.MAX_CONNECTIONS || process.env.MORO_MAX_CONNECTIONS || '') ||
62
+ DEFAULT_CONFIG.server.maxConnections,
63
+ 'server.maxConnections',
64
+ { min: 1 }
65
+ ),
66
+ timeout: validateNumber(
67
+ coerceEnvValue(process.env.REQUEST_TIMEOUT || process.env.MORO_TIMEOUT || '') ||
68
+ DEFAULT_CONFIG.server.timeout,
69
+ 'server.timeout',
70
+ { min: 1000 }
71
+ ),
72
+ },
73
+
74
+ serviceDiscovery: {
75
+ enabled: validateBoolean(
76
+ coerceEnvValue(
77
+ process.env.SERVICE_DISCOVERY_ENABLED || process.env.MORO_SERVICE_DISCOVERY || ''
78
+ ) ?? DEFAULT_CONFIG.serviceDiscovery.enabled,
79
+ 'serviceDiscovery.enabled'
80
+ ),
81
+ type: validateEnum(
82
+ process.env.DISCOVERY_TYPE ||
83
+ process.env.MORO_DISCOVERY_TYPE ||
84
+ DEFAULT_CONFIG.serviceDiscovery.type,
85
+ ['memory', 'consul', 'kubernetes'] as const,
86
+ 'serviceDiscovery.type'
87
+ ),
88
+ consulUrl: validateUrl(
89
+ process.env.CONSUL_URL ||
90
+ process.env.MORO_CONSUL_URL ||
91
+ DEFAULT_CONFIG.serviceDiscovery.consulUrl,
92
+ 'serviceDiscovery.consulUrl'
93
+ ),
94
+ kubernetesNamespace: validateString(
95
+ process.env.KUBERNETES_NAMESPACE ||
96
+ process.env.MORO_KUBERNETES_NAMESPACE ||
97
+ DEFAULT_CONFIG.serviceDiscovery.kubernetesNamespace,
98
+ 'serviceDiscovery.kubernetesNamespace'
99
+ ),
100
+ healthCheckInterval: validateNumber(
101
+ coerceEnvValue(
102
+ process.env.HEALTH_CHECK_INTERVAL || process.env.MORO_HEALTH_CHECK_INTERVAL || ''
103
+ ) || DEFAULT_CONFIG.serviceDiscovery.healthCheckInterval,
104
+ 'serviceDiscovery.healthCheckInterval',
105
+ { min: 1000 }
106
+ ),
107
+ retryAttempts: validateNumber(
108
+ coerceEnvValue(process.env.RETRY_ATTEMPTS || process.env.MORO_RETRY_ATTEMPTS || '') ||
109
+ DEFAULT_CONFIG.serviceDiscovery.retryAttempts,
110
+ 'serviceDiscovery.retryAttempts',
111
+ { min: 0 }
112
+ ),
113
+ },
114
+
115
+ database: {
116
+ url: validateOptional(process.env.DATABASE_URL, validateString, 'database.url'),
117
+ redis: {
118
+ url: validateString(
119
+ process.env.REDIS_URL ||
120
+ process.env.MORO_REDIS_URL ||
121
+ DEFAULT_CONFIG.database.redis.url,
122
+ 'database.redis.url'
123
+ ),
124
+ maxRetries: validateNumber(
125
+ coerceEnvValue(process.env.REDIS_MAX_RETRIES || process.env.MORO_REDIS_RETRIES || '') ||
126
+ DEFAULT_CONFIG.database.redis.maxRetries,
127
+ 'database.redis.maxRetries',
128
+ { min: 0 }
129
+ ),
130
+ retryDelay: validateNumber(
131
+ coerceEnvValue(process.env.REDIS_RETRY_DELAY || process.env.MORO_REDIS_DELAY || '') ||
132
+ DEFAULT_CONFIG.database.redis.retryDelay,
133
+ 'database.redis.retryDelay',
134
+ { min: 100 }
135
+ ),
136
+ keyPrefix: validateString(
137
+ process.env.REDIS_KEY_PREFIX ||
138
+ process.env.MORO_REDIS_PREFIX ||
139
+ DEFAULT_CONFIG.database.redis.keyPrefix,
140
+ 'database.redis.keyPrefix'
141
+ ),
142
+ },
143
+ mysql: process.env.MYSQL_HOST
144
+ ? {
145
+ host: validateString(process.env.MYSQL_HOST, 'database.mysql.host'),
146
+ port: validatePort(
147
+ process.env.MYSQL_PORT || process.env.MORO_MYSQL_PORT || '3306',
148
+ 'database.mysql.port'
149
+ ),
150
+ database: validateOptional(
151
+ process.env.MYSQL_DATABASE || process.env.MORO_MYSQL_DB,
152
+ validateString,
153
+ 'database.mysql.database'
154
+ ),
155
+ username: validateOptional(
156
+ process.env.MYSQL_USERNAME || process.env.MORO_MYSQL_USER,
157
+ validateString,
158
+ 'database.mysql.username'
159
+ ),
160
+ password: validateOptional(
161
+ process.env.MYSQL_PASSWORD || process.env.MORO_MYSQL_PASS,
162
+ validateString,
163
+ 'database.mysql.password'
164
+ ),
165
+ connectionLimit: validateNumber(
166
+ coerceEnvValue(
167
+ process.env.MYSQL_CONNECTION_LIMIT || process.env.MORO_MYSQL_CONNECTIONS || ''
168
+ ) || 10,
169
+ 'database.mysql.connectionLimit',
170
+ { min: 1 }
171
+ ),
172
+ acquireTimeout: validateNumber(
173
+ coerceEnvValue(
174
+ process.env.MYSQL_ACQUIRE_TIMEOUT || process.env.MORO_MYSQL_ACQUIRE_TIMEOUT || ''
175
+ ) || 60000,
176
+ 'database.mysql.acquireTimeout',
177
+ { min: 1000 }
178
+ ),
179
+ timeout: validateNumber(
180
+ coerceEnvValue(process.env.MYSQL_TIMEOUT || process.env.MORO_MYSQL_TIMEOUT || '') ||
181
+ 60000,
182
+ 'database.mysql.timeout',
183
+ { min: 1000 }
184
+ ),
185
+ }
186
+ : undefined,
187
+ },
188
+
189
+ modules: {
190
+ cache: {
191
+ enabled: validateBoolean(
192
+ coerceEnvValue(process.env.CACHE_ENABLED || process.env.MORO_CACHE_ENABLED || '') ??
193
+ DEFAULT_CONFIG.modules.cache.enabled,
194
+ 'modules.cache.enabled'
195
+ ),
196
+ defaultTtl: validateNumber(
197
+ coerceEnvValue(process.env.CACHE_TTL || process.env.MORO_CACHE_TTL || '') ||
198
+ DEFAULT_CONFIG.modules.cache.defaultTtl,
199
+ 'modules.cache.defaultTtl',
200
+ { min: 0 }
201
+ ),
202
+ maxSize: validateNumber(
203
+ coerceEnvValue(process.env.CACHE_MAX_SIZE || process.env.MORO_CACHE_MAX_SIZE || '') ||
204
+ DEFAULT_CONFIG.modules.cache.maxSize,
205
+ 'modules.cache.maxSize',
206
+ { min: 1 }
207
+ ),
208
+ strategy: validateEnum(
209
+ process.env.CACHE_STRATEGY ||
210
+ process.env.MORO_CACHE_STRATEGY ||
211
+ DEFAULT_CONFIG.modules.cache.strategy,
212
+ ['lru', 'lfu', 'fifo'] as const,
213
+ 'modules.cache.strategy'
214
+ ),
215
+ },
216
+ rateLimit: {
217
+ enabled: validateBoolean(
218
+ coerceEnvValue(
219
+ process.env.RATE_LIMIT_ENABLED || process.env.MORO_RATE_LIMIT_ENABLED || ''
220
+ ) ?? DEFAULT_CONFIG.modules.rateLimit.enabled,
221
+ 'modules.rateLimit.enabled'
222
+ ),
223
+ defaultRequests: validateNumber(
224
+ coerceEnvValue(
225
+ process.env.RATE_LIMIT_REQUESTS || process.env.MORO_RATE_LIMIT_REQUESTS || ''
226
+ ) || DEFAULT_CONFIG.modules.rateLimit.defaultRequests,
227
+ 'modules.rateLimit.defaultRequests',
228
+ { min: 1 }
229
+ ),
230
+ defaultWindow: validateNumber(
231
+ coerceEnvValue(
232
+ process.env.RATE_LIMIT_WINDOW || process.env.MORO_RATE_LIMIT_WINDOW || ''
233
+ ) || DEFAULT_CONFIG.modules.rateLimit.defaultWindow,
234
+ 'modules.rateLimit.defaultWindow',
235
+ { min: 1000 }
236
+ ),
237
+ skipSuccessfulRequests: validateBoolean(
238
+ coerceEnvValue(
239
+ process.env.RATE_LIMIT_SKIP_SUCCESS || process.env.MORO_RATE_LIMIT_SKIP_SUCCESS || ''
240
+ ) ?? DEFAULT_CONFIG.modules.rateLimit.skipSuccessfulRequests,
241
+ 'modules.rateLimit.skipSuccessfulRequests'
242
+ ),
243
+ skipFailedRequests: validateBoolean(
244
+ coerceEnvValue(
245
+ process.env.RATE_LIMIT_SKIP_FAILED || process.env.MORO_RATE_LIMIT_SKIP_FAILED || ''
246
+ ) ?? DEFAULT_CONFIG.modules.rateLimit.skipFailedRequests,
247
+ 'modules.rateLimit.skipFailedRequests'
248
+ ),
249
+ },
250
+ validation: {
251
+ enabled: validateBoolean(
252
+ coerceEnvValue(
253
+ process.env.VALIDATION_ENABLED || process.env.MORO_VALIDATION_ENABLED || ''
254
+ ) ?? DEFAULT_CONFIG.modules.validation.enabled,
255
+ 'modules.validation.enabled'
256
+ ),
257
+ stripUnknown: validateBoolean(
258
+ coerceEnvValue(
259
+ process.env.VALIDATION_STRIP_UNKNOWN ||
260
+ process.env.MORO_VALIDATION_STRIP_UNKNOWN ||
261
+ ''
262
+ ) ?? DEFAULT_CONFIG.modules.validation.stripUnknown,
263
+ 'modules.validation.stripUnknown'
264
+ ),
265
+ abortEarly: validateBoolean(
266
+ coerceEnvValue(
267
+ process.env.VALIDATION_ABORT_EARLY || process.env.MORO_VALIDATION_ABORT_EARLY || ''
268
+ ) ?? DEFAULT_CONFIG.modules.validation.abortEarly,
269
+ 'modules.validation.abortEarly'
270
+ ),
271
+ },
272
+ },
273
+
274
+ logging: {
275
+ level: validateEnum(
276
+ process.env.LOG_LEVEL || process.env.MORO_LOG_LEVEL || DEFAULT_CONFIG.logging.level,
277
+ ['debug', 'info', 'warn', 'error', 'fatal'] as const,
278
+ 'logging.level'
279
+ ),
280
+ format: validateEnum(
281
+ process.env.LOG_FORMAT || process.env.MORO_LOG_FORMAT || DEFAULT_CONFIG.logging.format,
282
+ ['pretty', 'json', 'compact'] as const,
283
+ 'logging.format'
284
+ ),
285
+ enableColors: validateBoolean(
286
+ coerceEnvValue(process.env.LOG_COLORS || process.env.MORO_LOG_COLORS || '') ??
287
+ DEFAULT_CONFIG.logging.enableColors,
288
+ 'logging.enableColors'
289
+ ),
290
+ enableTimestamp: validateBoolean(
291
+ coerceEnvValue(process.env.LOG_TIMESTAMP || process.env.MORO_LOG_TIMESTAMP || '') ??
292
+ DEFAULT_CONFIG.logging.enableTimestamp,
293
+ 'logging.enableTimestamp'
294
+ ),
295
+ enableContext: validateBoolean(
296
+ coerceEnvValue(process.env.LOG_CONTEXT || process.env.MORO_LOG_CONTEXT || '') ??
297
+ DEFAULT_CONFIG.logging.enableContext,
298
+ 'logging.enableContext'
299
+ ),
300
+ outputs: {
301
+ console: validateBoolean(
302
+ coerceEnvValue(process.env.LOG_CONSOLE || process.env.MORO_LOG_CONSOLE || '') ??
303
+ DEFAULT_CONFIG.logging.outputs.console,
304
+ 'logging.outputs.console'
305
+ ),
306
+ file: {
307
+ enabled: validateBoolean(
308
+ coerceEnvValue(
309
+ process.env.LOG_FILE_ENABLED || process.env.MORO_LOG_FILE_ENABLED || ''
310
+ ) ?? DEFAULT_CONFIG.logging.outputs.file.enabled,
311
+ 'logging.outputs.file.enabled'
312
+ ),
313
+ path: validateString(
314
+ process.env.LOG_FILE_PATH ||
315
+ process.env.MORO_LOG_FILE_PATH ||
316
+ DEFAULT_CONFIG.logging.outputs.file.path,
317
+ 'logging.outputs.file.path'
318
+ ),
319
+ maxSize: validateString(
320
+ process.env.LOG_FILE_MAX_SIZE ||
321
+ process.env.MORO_LOG_FILE_MAX_SIZE ||
322
+ DEFAULT_CONFIG.logging.outputs.file.maxSize,
323
+ 'logging.outputs.file.maxSize'
324
+ ),
325
+ maxFiles: validateNumber(
326
+ coerceEnvValue(
327
+ process.env.LOG_FILE_MAX_FILES || process.env.MORO_LOG_FILE_MAX_FILES || ''
328
+ ) || DEFAULT_CONFIG.logging.outputs.file.maxFiles,
329
+ 'logging.outputs.file.maxFiles',
330
+ { min: 1 }
331
+ ),
332
+ },
333
+ webhook: {
334
+ enabled: validateBoolean(
335
+ coerceEnvValue(
336
+ process.env.LOG_WEBHOOK_ENABLED || process.env.MORO_LOG_WEBHOOK_ENABLED || ''
337
+ ) ?? DEFAULT_CONFIG.logging.outputs.webhook.enabled,
338
+ 'logging.outputs.webhook.enabled'
339
+ ),
340
+ url: validateOptional(
341
+ process.env.LOG_WEBHOOK_URL || process.env.MORO_LOG_WEBHOOK_URL,
342
+ validateUrl,
343
+ 'logging.outputs.webhook.url'
344
+ ),
345
+ headers: DEFAULT_CONFIG.logging.outputs.webhook.headers,
346
+ },
347
+ },
348
+ },
349
+
350
+ security: {
351
+ cors: {
352
+ enabled: validateBoolean(
353
+ coerceEnvValue(process.env.CORS_ENABLED || process.env.MORO_CORS_ENABLED || '') ??
354
+ DEFAULT_CONFIG.security.cors.enabled,
355
+ 'security.cors.enabled'
356
+ ),
357
+ origin:
358
+ process.env.CORS_ORIGIN ||
359
+ process.env.MORO_CORS_ORIGIN ||
360
+ DEFAULT_CONFIG.security.cors.origin,
361
+ methods: validateStringArray(
362
+ process.env.CORS_METHODS ||
363
+ process.env.MORO_CORS_METHODS ||
364
+ DEFAULT_CONFIG.security.cors.methods,
365
+ 'security.cors.methods'
366
+ ),
367
+ allowedHeaders: validateStringArray(
368
+ process.env.CORS_HEADERS ||
369
+ process.env.MORO_CORS_HEADERS ||
370
+ DEFAULT_CONFIG.security.cors.allowedHeaders,
371
+ 'security.cors.allowedHeaders'
372
+ ),
373
+ credentials: validateBoolean(
374
+ coerceEnvValue(
375
+ process.env.CORS_CREDENTIALS || process.env.MORO_CORS_CREDENTIALS || ''
376
+ ) ?? DEFAULT_CONFIG.security.cors.credentials,
377
+ 'security.cors.credentials'
378
+ ),
379
+ },
380
+ helmet: {
381
+ enabled: validateBoolean(
382
+ coerceEnvValue(process.env.HELMET_ENABLED || process.env.MORO_HELMET_ENABLED || '') ??
383
+ DEFAULT_CONFIG.security.helmet.enabled,
384
+ 'security.helmet.enabled'
385
+ ),
386
+ contentSecurityPolicy: validateBoolean(
387
+ coerceEnvValue(process.env.HELMET_CSP || process.env.MORO_HELMET_CSP || '') ??
388
+ DEFAULT_CONFIG.security.helmet.contentSecurityPolicy,
389
+ 'security.helmet.contentSecurityPolicy'
390
+ ),
391
+ hsts: validateBoolean(
392
+ coerceEnvValue(process.env.HELMET_HSTS || process.env.MORO_HELMET_HSTS || '') ??
393
+ DEFAULT_CONFIG.security.helmet.hsts,
394
+ 'security.helmet.hsts'
395
+ ),
396
+ noSniff: validateBoolean(
397
+ coerceEnvValue(process.env.HELMET_NO_SNIFF || process.env.MORO_HELMET_NO_SNIFF || '') ??
398
+ DEFAULT_CONFIG.security.helmet.noSniff,
399
+ 'security.helmet.noSniff'
400
+ ),
401
+ frameguard: validateBoolean(
402
+ coerceEnvValue(
403
+ process.env.HELMET_FRAMEGUARD || process.env.MORO_HELMET_FRAMEGUARD || ''
404
+ ) ?? DEFAULT_CONFIG.security.helmet.frameguard,
405
+ 'security.helmet.frameguard'
406
+ ),
407
+ },
408
+ rateLimit: {
409
+ global: {
410
+ enabled: validateBoolean(
411
+ coerceEnvValue(
412
+ process.env.GLOBAL_RATE_LIMIT_ENABLED ||
413
+ process.env.MORO_GLOBAL_RATE_LIMIT_ENABLED ||
414
+ ''
415
+ ) ?? DEFAULT_CONFIG.security.rateLimit.global.enabled,
416
+ 'security.rateLimit.global.enabled'
417
+ ),
418
+ requests: validateNumber(
419
+ coerceEnvValue(
420
+ process.env.GLOBAL_RATE_LIMIT_REQUESTS ||
421
+ process.env.MORO_GLOBAL_RATE_LIMIT_REQUESTS ||
422
+ ''
423
+ ) || DEFAULT_CONFIG.security.rateLimit.global.requests,
424
+ 'security.rateLimit.global.requests',
425
+ { min: 1 }
426
+ ),
427
+ window: validateNumber(
428
+ coerceEnvValue(
429
+ process.env.GLOBAL_RATE_LIMIT_WINDOW ||
430
+ process.env.MORO_GLOBAL_RATE_LIMIT_WINDOW ||
431
+ ''
432
+ ) || DEFAULT_CONFIG.security.rateLimit.global.window,
433
+ 'security.rateLimit.global.window',
434
+ { min: 1000 }
435
+ ),
436
+ },
437
+ },
438
+ },
439
+
440
+ external: {
441
+ stripe: {
442
+ secretKey: validateOptional(
443
+ process.env.STRIPE_SECRET_KEY,
444
+ validateString,
445
+ 'external.stripe.secretKey'
446
+ ),
447
+ publishableKey: validateOptional(
448
+ process.env.STRIPE_PUBLISHABLE_KEY,
449
+ validateString,
450
+ 'external.stripe.publishableKey'
451
+ ),
452
+ webhookSecret: validateOptional(
453
+ process.env.STRIPE_WEBHOOK_SECRET,
454
+ validateString,
455
+ 'external.stripe.webhookSecret'
456
+ ),
457
+ apiVersion: validateString(
458
+ process.env.STRIPE_API_VERSION ||
459
+ DEFAULT_CONFIG.external.stripe?.apiVersion ||
460
+ '2023-10-16',
461
+ 'external.stripe.apiVersion'
462
+ ),
463
+ },
464
+ paypal: {
465
+ clientId: validateOptional(
466
+ process.env.PAYPAL_CLIENT_ID,
467
+ validateString,
468
+ 'external.paypal.clientId'
469
+ ),
470
+ clientSecret: validateOptional(
471
+ process.env.PAYPAL_CLIENT_SECRET,
472
+ validateString,
473
+ 'external.paypal.clientSecret'
474
+ ),
475
+ webhookId: validateOptional(
476
+ process.env.PAYPAL_WEBHOOK_ID,
477
+ validateString,
478
+ 'external.paypal.webhookId'
479
+ ),
480
+ environment: validateEnum(
481
+ process.env.PAYPAL_ENVIRONMENT ||
482
+ DEFAULT_CONFIG.external.paypal?.environment ||
483
+ 'sandbox',
484
+ ['sandbox', 'production'] as const,
485
+ 'external.paypal.environment'
486
+ ),
487
+ },
488
+ smtp: {
489
+ host: validateOptional(process.env.SMTP_HOST, validateString, 'external.smtp.host'),
490
+ port: validatePort(
491
+ process.env.SMTP_PORT || (DEFAULT_CONFIG.external.smtp?.port || 587).toString(),
492
+ 'external.smtp.port'
493
+ ),
494
+ secure: validateBoolean(
495
+ coerceEnvValue(process.env.SMTP_SECURE || '') ??
496
+ (DEFAULT_CONFIG.external.smtp?.secure || false),
497
+ 'external.smtp.secure'
498
+ ),
499
+ username: validateOptional(
500
+ process.env.SMTP_USERNAME,
501
+ validateString,
502
+ 'external.smtp.username'
503
+ ),
504
+ password: validateOptional(
505
+ process.env.SMTP_PASSWORD,
506
+ validateString,
507
+ 'external.smtp.password'
508
+ ),
509
+ },
510
+ },
511
+
512
+ performance: {
513
+ compression: {
514
+ enabled: validateBoolean(
515
+ coerceEnvValue(
516
+ process.env.COMPRESSION_ENABLED || process.env.MORO_COMPRESSION_ENABLED || ''
517
+ ) ?? DEFAULT_CONFIG.performance.compression.enabled,
518
+ 'performance.compression.enabled'
519
+ ),
520
+ level: validateNumber(
521
+ coerceEnvValue(
522
+ process.env.COMPRESSION_LEVEL || process.env.MORO_COMPRESSION_LEVEL || ''
523
+ ) || DEFAULT_CONFIG.performance.compression.level,
524
+ 'performance.compression.level',
525
+ { min: 1, max: 9 }
526
+ ),
527
+ threshold: validateNumber(
528
+ coerceEnvValue(
529
+ process.env.COMPRESSION_THRESHOLD || process.env.MORO_COMPRESSION_THRESHOLD || ''
530
+ ) || DEFAULT_CONFIG.performance.compression.threshold,
531
+ 'performance.compression.threshold',
532
+ { min: 0 }
533
+ ),
534
+ },
535
+ circuitBreaker: {
536
+ enabled: validateBoolean(
537
+ coerceEnvValue(
538
+ process.env.CIRCUIT_BREAKER_ENABLED || process.env.MORO_CIRCUIT_BREAKER_ENABLED || ''
539
+ ) ?? DEFAULT_CONFIG.performance.circuitBreaker.enabled,
540
+ 'performance.circuitBreaker.enabled'
541
+ ),
542
+ failureThreshold: validateNumber(
543
+ coerceEnvValue(
544
+ process.env.CIRCUIT_BREAKER_THRESHOLD ||
545
+ process.env.MORO_CIRCUIT_BREAKER_THRESHOLD ||
546
+ ''
547
+ ) || DEFAULT_CONFIG.performance.circuitBreaker.failureThreshold,
548
+ 'performance.circuitBreaker.failureThreshold',
549
+ { min: 1 }
550
+ ),
551
+ resetTimeout: validateNumber(
552
+ coerceEnvValue(
553
+ process.env.CIRCUIT_BREAKER_RESET || process.env.MORO_CIRCUIT_BREAKER_RESET || ''
554
+ ) || DEFAULT_CONFIG.performance.circuitBreaker.resetTimeout,
555
+ 'performance.circuitBreaker.resetTimeout',
556
+ { min: 1000 }
557
+ ),
558
+ monitoringPeriod: validateNumber(
559
+ coerceEnvValue(
560
+ process.env.CIRCUIT_BREAKER_MONITOR || process.env.MORO_CIRCUIT_BREAKER_MONITOR || ''
561
+ ) || DEFAULT_CONFIG.performance.circuitBreaker.monitoringPeriod,
562
+ 'performance.circuitBreaker.monitoringPeriod',
563
+ { min: 1000 }
564
+ ),
565
+ },
566
+ clustering: {
567
+ enabled: validateBoolean(
568
+ coerceEnvValue(
569
+ process.env.CLUSTERING_ENABLED || process.env.MORO_CLUSTERING_ENABLED || ''
570
+ ) ?? DEFAULT_CONFIG.performance.clustering.enabled,
571
+ 'performance.clustering.enabled'
572
+ ),
573
+ workers:
574
+ process.env.CLUSTER_WORKERS === 'auto' || process.env.MORO_CLUSTER_WORKERS === 'auto'
575
+ ? 'auto'
576
+ : validateNumber(
577
+ coerceEnvValue(
578
+ process.env.CLUSTER_WORKERS || process.env.MORO_CLUSTER_WORKERS || ''
579
+ ) || DEFAULT_CONFIG.performance.clustering.workers,
580
+ 'performance.clustering.workers',
581
+ { min: 1 }
582
+ ),
583
+ },
584
+ },
585
+ };
586
+
587
+ logger.info('Configuration loaded and validated successfully with TypeScript');
588
+ logger.debug(
589
+ 'Configuration summary:',
590
+ JSON.stringify({
591
+ server: { port: config.server.port, environment: config.server.environment },
592
+ serviceDiscovery: {
593
+ enabled: config.serviceDiscovery.enabled,
594
+ type: config.serviceDiscovery.type,
595
+ },
596
+ modules: {
597
+ cache: config.modules.cache.enabled,
598
+ rateLimit: config.modules.rateLimit.enabled,
599
+ validation: config.modules.validation.enabled,
600
+ },
601
+ })
602
+ );
603
+
604
+ return config;
605
+ } catch (error) {
606
+ logger.error('❌ Configuration validation failed');
607
+
608
+ if (error instanceof ConfigValidationError) {
609
+ logger.error(`Configuration error in '${error.field}': ${error.message}`);
610
+ logger.error(` Value: ${JSON.stringify(error.value)}`);
611
+
612
+ // Provide helpful hints
613
+ if (error.field.includes('port')) {
614
+ logger.error(' Hint: Ports must be numbers between 1 and 65535');
615
+ }
616
+ if (error.field.includes('url')) {
617
+ logger.error(' Hint: URLs must include protocol (http:// or https://)');
618
+ }
619
+ if (error.field.includes('environment')) {
620
+ logger.error(' Hint: NODE_ENV must be one of: development, staging, production');
621
+ }
622
+ } else {
623
+ logger.error('Unexpected configuration error:', String(error));
624
+ }
625
+
626
+ logger.error('\nConfiguration Help:');
627
+ logger.error(' - Use MORO_* prefixed environment variables for framework-specific config');
628
+ logger.error(' - Check .env.example for available configuration options');
629
+ logger.error(' - See documentation for detailed configuration guide');
630
+
631
+ process.exit(1);
632
+ }
633
+ }