@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
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "@morojs/moro",
3
- "version": "1.6.0",
4
- "description": "High-performance Node.js framework with intelligent routing, automatic middleware ordering, enterprise authentication (Auth.js), type-safe validation, and functional architecture",
5
- "type": "module",
3
+ "version": "1.6.1",
4
+ "description": "High-performance Node.js framework with intelligent routing, automatic middleware ordering, enterprise authentication (Auth.js), type-safe Zod validation, and functional architecture",
6
5
  "main": "dist/index.js",
7
6
  "types": "dist/index.d.ts",
8
7
  "exports": {
9
8
  ".": {
10
9
  "development": "./src/index.ts",
11
10
  "import": "./dist/index.js",
11
+ "require": "./dist/index.js",
12
12
  "types": "./dist/index.d.ts"
13
13
  }
14
14
  },
@@ -29,22 +29,20 @@
29
29
  "test:ci": "jest --coverage --watchAll=false --ci --forceExit",
30
30
  "test:force": "jest --forceExit",
31
31
  "test:all": "npm run test:unit && npm run test:integration && npm run test:e2e",
32
- "test:dist": "npm run build && node scripts/validate-dist.mjs",
33
- "test:package": "npm run build && node scripts/validate-package.mjs",
34
32
  "lint": "eslint src --ext .ts",
35
33
  "lint:fix": "eslint src --ext .ts --fix",
36
- "format": "prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"",
37
- "format:check": "prettier --check \"src/**/*.ts\" \"tests/**/*.ts\"",
34
+ "format": "prettier --write \"src/**/*.ts\"",
35
+ "format:check": "prettier --check \"src/**/*.ts\"",
38
36
  "lint-staged": "lint-staged",
39
37
  "docs:build": "typedoc --out docs-html src/index.ts",
40
38
  "docs:serve": "http-server docs-html -p 8080",
41
39
  "docs:json": "typedoc --json docs-json/api.json src/index.ts",
42
40
  "docs:markdown": "typedoc --plugin typedoc-plugin-markdown --out docs-md src/index.ts",
43
41
  "docs:all": "npm run docs:build && npm run docs:json && npm run docs:markdown",
44
- "prerelease": "npm run build && npm test && npm run test:package && node scripts/release.js",
45
- "prerelease:patch": "npm run build && npm test && npm run test:package && node scripts/release.js patch",
46
- "prerelease:minor": "npm run build && npm test && npm run test:package && node scripts/release.js minor",
47
- "prerelease:major": "npm run build && npm test && npm run test:package && node scripts/release.js major"
42
+ "prerelease": "node scripts/release.js",
43
+ "prerelease:patch": "node scripts/release.js patch",
44
+ "prerelease:minor": "node scripts/release.js minor",
45
+ "prerelease:major": "node scripts/release.js major"
48
46
  },
49
47
  "keywords": [
50
48
  "nodejs",
@@ -91,9 +89,8 @@
91
89
  "pg": "^8.16.3",
92
90
  "socket.io": "^4.8.1",
93
91
  "swagger-ui-dist": "^5.28.1",
94
- "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.52.0",
95
92
  "ws": "^8.18.0",
96
- "yup": "^1.7.1"
93
+ "yup": "^1.0.0"
97
94
  },
98
95
  "peerDependenciesMeta": {
99
96
  "@auth/core": {
@@ -123,9 +120,6 @@
123
120
  "socket.io": {
124
121
  "optional": true
125
122
  },
126
- "uWebSockets.js": {
127
- "optional": true
128
- },
129
123
  "ws": {
130
124
  "optional": true
131
125
  },
@@ -171,7 +165,6 @@
171
165
  "typedoc-plugin-markdown": "^4.8.1",
172
166
  "typedoc-theme-hierarchy": "^6.0.0",
173
167
  "typescript": "^5.9.2",
174
- "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.52.0",
175
168
  "ws": "^8.18.3",
176
169
  "zod": "^4.1.8"
177
170
  },
@@ -181,9 +174,49 @@
181
174
  "README.md",
182
175
  "LICENSE",
183
176
  "API.md",
184
- "tsconfig.json",
185
- "jest.config.mjs"
177
+ "tsconfig.json"
186
178
  ],
179
+ "jest": {
180
+ "preset": "ts-jest",
181
+ "testEnvironment": "node",
182
+ "roots": [
183
+ "<rootDir>/src",
184
+ "<rootDir>/tests"
185
+ ],
186
+ "testMatch": [
187
+ "**/tests/**/*.test.ts",
188
+ "**/src/**/*.test.ts"
189
+ ],
190
+ "transform": {
191
+ "^.+\\.ts$": [
192
+ "ts-jest",
193
+ {}
194
+ ]
195
+ },
196
+ "collectCoverageFrom": [
197
+ "src/**/*.ts",
198
+ "!src/**/*.d.ts",
199
+ "!src/**/*.test.ts",
200
+ "!src/**/index.ts"
201
+ ],
202
+ "coverageDirectory": "coverage",
203
+ "coverageReporters": [
204
+ "text",
205
+ "lcov",
206
+ "html"
207
+ ],
208
+ "setupFilesAfterEnv": [
209
+ "<rootDir>/tests/setup.ts"
210
+ ],
211
+ "testTimeout": 15000,
212
+ "maxWorkers": 1,
213
+ "forceExit": false,
214
+ "detectOpenHandles": true,
215
+ "openHandlesTimeout": 1000,
216
+ "extensionsToTreatAsEsm": [
217
+ ".ts"
218
+ ]
219
+ },
187
220
  "lint-staged": {
188
221
  "src/**/*.ts": [
189
222
  "prettier --write",
@@ -8,9 +8,7 @@
8
8
  * @see https://github.com/nextauthjs/next-auth/tree/main/packages
9
9
  */
10
10
 
11
- import { createFrameworkLogger } from '../logger/index.js';
12
-
13
- const logger = createFrameworkLogger('AuthAdapter');
11
+ import { logger } from '../logger';
14
12
 
15
13
  // Mock Auth.js types until we have the actual package
16
14
  // These would come from @auth/core in a real implementation
@@ -251,7 +249,7 @@ export async function MoroJSAuth(config: MoroJSAuthConfig): Promise<{
251
249
  basePath,
252
250
  raw: (code: any, ...message: any[]) => {
253
251
  if (config.morojs?.debug) {
254
- logger.debug(`[MoroJS Auth] ${code}:`, 'AuthAdapter', { message });
252
+ logger.debug(`[MoroJS Auth] ${code}:`, 'AuthAdapter', { code, message });
255
253
  }
256
254
  },
257
255
  });
@@ -265,7 +263,7 @@ export async function MoroJSAuth(config: MoroJSAuthConfig): Promise<{
265
263
  // Convert Web API response to MoroJS response
266
264
  await fromWebResponse(finalResponse, res);
267
265
  } catch (error) {
268
- logger.error('[MoroJS Auth] Error', 'AuthAdapter', {
266
+ logger.error('[MoroJS Auth] Error:', 'AuthAdapter', {
269
267
  error: error instanceof Error ? error.message : String(error),
270
268
  });
271
269
  // Robust error handling - check if response methods exist
@@ -314,7 +312,7 @@ export async function MoroJSAuth(config: MoroJSAuthConfig): Promise<{
314
312
  return null;
315
313
  } catch (error) {
316
314
  if (config.morojs?.debug) {
317
- logger.error('[MoroJS Auth] Session error', 'AuthAdapter', {
315
+ logger.error('[MoroJS Auth] Session error:', 'AuthAdapter', {
318
316
  error: error instanceof Error ? error.message : String(error),
319
317
  });
320
318
  }
@@ -330,21 +328,18 @@ export async function MoroJSAuth(config: MoroJSAuthConfig): Promise<{
330
328
  * This creates a MoroJS-compatible middleware for authentication
331
329
  */
332
330
  export function createAuthMiddleware(config: MoroJSAuthConfig) {
333
- logger.info('createAuthMiddleware called - creating middleware function', 'AuthAdapter');
331
+ logger.info('🏭 createAuthMiddleware called - creating middleware function', 'AuthAdapter');
334
332
  // Return a function that MoroJS can call directly
335
333
  return async (app: any) => {
336
- logger.info('Installing Auth.js middleware...', 'AuthAdapter');
337
- logger.debug('App object received', 'AuthAdapter', {
338
- appType: typeof app,
339
- appConstructor: app.constructor.name,
340
- });
334
+ logger.info('🔧 Installing Auth.js middleware...', 'AuthAdapter');
335
+ logger.info(`📦 App object received: ${typeof app} ${app.constructor.name}`, 'AuthAdapter');
341
336
 
342
337
  // Get the hooks from the app's middleware system
343
338
  const hooks =
344
339
  (app as any).coreFramework?.middlewareManager?.hooks || (app as any).middlewareManager?.hooks;
345
340
 
346
341
  if (!hooks) {
347
- logger.error('Could not access MoroJS hooks system', 'AuthAdapter');
342
+ logger.error('Could not access MoroJS hooks system', 'AuthAdapter');
348
343
  return;
349
344
  }
350
345
 
@@ -355,9 +350,9 @@ export function createAuthMiddleware(config: MoroJSAuthConfig) {
355
350
 
356
351
  // Register request hook
357
352
  hooks.before('request', async (context: any) => {
358
- logger.debug('Native adapter hook starting', 'AuthAdapter');
353
+ logger.debug('🔒 Native adapter hook starting...', 'AuthAdapter');
359
354
  const req = context.request;
360
- logger.debug('Request path', 'AuthAdapter', { path: req.path || req.url });
355
+ logger.debug(`📝 Request path: ${req.path || req.url}`, 'AuthAdapter');
361
356
 
362
357
  try {
363
358
  // Just add auth object to request - don't touch response
@@ -394,16 +389,16 @@ export function createAuthMiddleware(config: MoroJSAuthConfig) {
394
389
  return { url: signOutUrl };
395
390
  },
396
391
  };
397
- logger.debug('Native adapter hook completed successfully', 'AuthAdapter');
392
+ logger.debug('Native adapter hook completed successfully', 'AuthAdapter');
398
393
  } catch (error) {
399
- logger.error('Error in native adapter hook', 'AuthAdapter', {
394
+ logger.error('Error in native adapter hook:', 'AuthAdapter', {
400
395
  error: error instanceof Error ? error.message : String(error),
401
396
  });
402
397
  throw error;
403
398
  }
404
399
  });
405
400
 
406
- logger.info('Auth.js middleware installed successfully!', 'AuthAdapter');
401
+ logger.info('Auth.js middleware installed successfully!', 'AuthAdapter');
407
402
  };
408
403
  }
409
404
 
@@ -1,16 +1,11 @@
1
1
  // Configuration File Loader - Load moro.config.js/ts files
2
2
  import { existsSync } from 'fs';
3
3
  import { join } from 'path';
4
- import { createRequire } from 'module';
5
- import { AppConfig } from './schema.js';
6
- import { createFrameworkLogger } from '../logger/index.js';
4
+ import { AppConfig } from './schema';
5
+ import { createFrameworkLogger } from '../logger';
7
6
 
8
7
  const logger = createFrameworkLogger('ConfigFile');
9
8
 
10
- // Create require function for ESM to enable synchronous config loading
11
- // Use process.cwd() as base since we're loading with absolute paths anyway
12
- const moduleRequire = createRequire(join(process.cwd(), 'index.js'));
13
-
14
9
  /**
15
10
  * Supported configuration file names in order of preference
16
11
  */
@@ -28,23 +23,55 @@ export function loadConfigFileSync(cwd: string = process.cwd()): Partial<AppConf
28
23
  logger.debug('No configuration file found');
29
24
  return null;
30
25
  }
26
+ // Handle TypeScript files by trying dynamic import (works with tsx/ts-node runtimes)
27
+ if (configFile.endsWith('.ts')) {
28
+ logger.debug('Found TypeScript config file, attempting to load with dynamic import');
29
+ try {
30
+ // When running under tsx/ts-node, dynamic imports work synchronously for TypeScript
31
+ // We can use require() with the current environment that already has TypeScript support
32
+ const config = require(configFile);
33
+ const configData = config.default || config;
34
+
35
+ if (!configData || typeof configData !== 'object') {
36
+ logger.warn(`Configuration file ${configFile} did not export a valid configuration object`);
37
+ return null;
38
+ }
39
+
40
+ logger.info(`TypeScript configuration loaded from: ${configFile}`);
41
+ return configData;
42
+ } catch (error) {
43
+ logger.debug(
44
+ 'TypeScript config loading failed in sync mode, this is expected if not running with tsx/ts-node'
45
+ );
46
+ logger.debug('Error details:', String(error));
47
+ return null;
48
+ }
49
+ }
50
+
51
+ // Only .js files use the standard synchronous loading
52
+ if (!configFile.endsWith('.js')) {
53
+ logger.debug(
54
+ 'Found config file with unsupported extension. Only .js and .ts files are supported.'
55
+ );
56
+ return null;
57
+ }
31
58
 
32
59
  logger.debug(`Loading configuration from: ${configFile}`);
33
60
 
34
61
  try {
35
- // Use createRequire to enable synchronous loading in ESM
36
- // Clear the require cache to ensure fresh config on each load
37
- delete moduleRequire.cache[moduleRequire.resolve(configFile)];
62
+ // Clear module cache to ensure fresh load
63
+ delete require.cache[require.resolve(configFile)];
38
64
 
39
- const config = moduleRequire(configFile);
65
+ const config = require(configFile);
66
+ const configData = config.default || config;
40
67
 
41
- if (!config || typeof config !== 'object') {
68
+ if (!configData || typeof configData !== 'object') {
42
69
  logger.warn(`Configuration file ${configFile} did not export a valid configuration object`);
43
70
  return null;
44
71
  }
45
72
 
46
73
  logger.info(`Configuration loaded from: ${configFile}`);
47
- return config;
74
+ return configData;
48
75
  } catch (error) {
49
76
  logger.error(`Failed to load configuration file ${configFile}:`, String(error));
50
77
  logger.warn('Falling back to environment variable configuration');
@@ -145,3 +172,236 @@ async function setupTypeScriptLoader(): Promise<void> {
145
172
  // the TypeScript transpilation is already handled by those tools.
146
173
  logger.debug('TypeScript config loading delegated to runtime environment');
147
174
  }
175
+
176
+ /**
177
+ * Convert a configuration object to environment variable mappings
178
+ * This function flattens the config object and sets corresponding environment variables
179
+ */
180
+ export function applyConfigAsEnvironmentVariables(config: Partial<AppConfig>): void {
181
+ if (!config || typeof config !== 'object') {
182
+ return;
183
+ }
184
+
185
+ // Apply server configuration
186
+ if (config.server) {
187
+ setEnvIfNotSet('PORT', config.server.port?.toString());
188
+ setEnvIfNotSet('HOST', config.server.host);
189
+ setEnvIfNotSet('NODE_ENV', config.server.environment);
190
+ setEnvIfNotSet('MAX_CONNECTIONS', config.server.maxConnections?.toString());
191
+ setEnvIfNotSet('REQUEST_TIMEOUT', config.server.timeout?.toString());
192
+ }
193
+
194
+ // Apply database configuration
195
+ if (config.database) {
196
+ setEnvIfNotSet('DATABASE_URL', config.database.url);
197
+
198
+ if (config.database.redis) {
199
+ setEnvIfNotSet('REDIS_URL', config.database.redis.url);
200
+ setEnvIfNotSet('REDIS_MAX_RETRIES', config.database.redis.maxRetries?.toString());
201
+ setEnvIfNotSet('REDIS_RETRY_DELAY', config.database.redis.retryDelay?.toString());
202
+ setEnvIfNotSet('REDIS_KEY_PREFIX', config.database.redis.keyPrefix);
203
+ }
204
+
205
+ if (config.database.mysql) {
206
+ setEnvIfNotSet('MYSQL_HOST', config.database.mysql.host);
207
+ setEnvIfNotSet('MYSQL_PORT', config.database.mysql.port?.toString());
208
+ setEnvIfNotSet('MYSQL_DATABASE', config.database.mysql.database);
209
+ setEnvIfNotSet('MYSQL_USERNAME', config.database.mysql.username);
210
+ setEnvIfNotSet('MYSQL_PASSWORD', config.database.mysql.password);
211
+ setEnvIfNotSet('MYSQL_CONNECTION_LIMIT', config.database.mysql.connectionLimit?.toString());
212
+ setEnvIfNotSet('MYSQL_ACQUIRE_TIMEOUT', config.database.mysql.acquireTimeout?.toString());
213
+ setEnvIfNotSet('MYSQL_TIMEOUT', config.database.mysql.timeout?.toString());
214
+ }
215
+ }
216
+
217
+ // Apply service discovery configuration
218
+ if (config.serviceDiscovery) {
219
+ setEnvIfNotSet('SERVICE_DISCOVERY_ENABLED', config.serviceDiscovery.enabled?.toString());
220
+ setEnvIfNotSet('DISCOVERY_TYPE', config.serviceDiscovery.type);
221
+ setEnvIfNotSet('CONSUL_URL', config.serviceDiscovery.consulUrl);
222
+ setEnvIfNotSet('K8S_NAMESPACE', config.serviceDiscovery.kubernetesNamespace);
223
+ setEnvIfNotSet(
224
+ 'HEALTH_CHECK_INTERVAL',
225
+ config.serviceDiscovery.healthCheckInterval?.toString()
226
+ );
227
+ setEnvIfNotSet('DISCOVERY_RETRY_ATTEMPTS', config.serviceDiscovery.retryAttempts?.toString());
228
+ }
229
+
230
+ // Apply logging configuration
231
+ if (config.logging) {
232
+ setEnvIfNotSet('LOG_LEVEL', config.logging.level);
233
+ setEnvIfNotSet('LOG_FORMAT', config.logging.format);
234
+ setEnvIfNotSet('LOG_COLORS', config.logging.enableColors?.toString());
235
+ setEnvIfNotSet('LOG_TIMESTAMP', config.logging.enableTimestamp?.toString());
236
+ setEnvIfNotSet('LOG_CONTEXT', config.logging.enableContext?.toString());
237
+
238
+ if (config.logging.outputs) {
239
+ setEnvIfNotSet('LOG_CONSOLE', config.logging.outputs.console?.toString());
240
+
241
+ if (config.logging.outputs.file) {
242
+ setEnvIfNotSet('LOG_FILE_ENABLED', config.logging.outputs.file.enabled?.toString());
243
+ setEnvIfNotSet('LOG_FILE_PATH', config.logging.outputs.file.path);
244
+ setEnvIfNotSet('LOG_FILE_MAX_SIZE', config.logging.outputs.file.maxSize);
245
+ setEnvIfNotSet('LOG_FILE_MAX_FILES', config.logging.outputs.file.maxFiles?.toString());
246
+ }
247
+
248
+ if (config.logging.outputs.webhook) {
249
+ setEnvIfNotSet('LOG_WEBHOOK_ENABLED', config.logging.outputs.webhook.enabled?.toString());
250
+ setEnvIfNotSet('LOG_WEBHOOK_URL', config.logging.outputs.webhook.url);
251
+ if (config.logging.outputs.webhook.headers) {
252
+ setEnvIfNotSet(
253
+ 'LOG_WEBHOOK_HEADERS',
254
+ JSON.stringify(config.logging.outputs.webhook.headers)
255
+ );
256
+ }
257
+ }
258
+ }
259
+ }
260
+
261
+ // Apply module defaults
262
+ if (config.modules) {
263
+ if (config.modules.cache) {
264
+ setEnvIfNotSet('CACHE_ENABLED', config.modules.cache.enabled?.toString());
265
+ setEnvIfNotSet('DEFAULT_CACHE_TTL', config.modules.cache.defaultTtl?.toString());
266
+ setEnvIfNotSet('CACHE_MAX_SIZE', config.modules.cache.maxSize?.toString());
267
+ setEnvIfNotSet('CACHE_STRATEGY', config.modules.cache.strategy);
268
+ }
269
+
270
+ if (config.modules.rateLimit) {
271
+ setEnvIfNotSet('RATE_LIMIT_ENABLED', config.modules.rateLimit.enabled?.toString());
272
+ setEnvIfNotSet(
273
+ 'DEFAULT_RATE_LIMIT_REQUESTS',
274
+ config.modules.rateLimit.defaultRequests?.toString()
275
+ );
276
+ setEnvIfNotSet(
277
+ 'DEFAULT_RATE_LIMIT_WINDOW',
278
+ config.modules.rateLimit.defaultWindow?.toString()
279
+ );
280
+ setEnvIfNotSet(
281
+ 'RATE_LIMIT_SKIP_SUCCESS',
282
+ config.modules.rateLimit.skipSuccessfulRequests?.toString()
283
+ );
284
+ setEnvIfNotSet(
285
+ 'RATE_LIMIT_SKIP_FAILED',
286
+ config.modules.rateLimit.skipFailedRequests?.toString()
287
+ );
288
+ }
289
+
290
+ if (config.modules.validation) {
291
+ setEnvIfNotSet('VALIDATION_ENABLED', config.modules.validation.enabled?.toString());
292
+ setEnvIfNotSet(
293
+ 'VALIDATION_STRIP_UNKNOWN',
294
+ config.modules.validation.stripUnknown?.toString()
295
+ );
296
+ setEnvIfNotSet('VALIDATION_ABORT_EARLY', config.modules.validation.abortEarly?.toString());
297
+ }
298
+ }
299
+
300
+ // Apply security configuration
301
+ if (config.security) {
302
+ if (config.security.cors) {
303
+ setEnvIfNotSet('CORS_ENABLED', config.security.cors.enabled?.toString());
304
+ if (typeof config.security.cors.origin === 'string') {
305
+ setEnvIfNotSet('CORS_ORIGIN', config.security.cors.origin);
306
+ } else if (Array.isArray(config.security.cors.origin)) {
307
+ setEnvIfNotSet('CORS_ORIGIN', config.security.cors.origin.join(','));
308
+ } else if (typeof config.security.cors.origin === 'boolean') {
309
+ setEnvIfNotSet('CORS_ORIGIN', config.security.cors.origin.toString());
310
+ }
311
+ setEnvIfNotSet('CORS_METHODS', config.security.cors.methods?.join(','));
312
+ setEnvIfNotSet('CORS_HEADERS', config.security.cors.allowedHeaders?.join(','));
313
+ setEnvIfNotSet('CORS_CREDENTIALS', config.security.cors.credentials?.toString());
314
+ }
315
+
316
+ if (config.security.helmet) {
317
+ setEnvIfNotSet('HELMET_ENABLED', config.security.helmet.enabled?.toString());
318
+ setEnvIfNotSet('HELMET_CSP', config.security.helmet.contentSecurityPolicy?.toString());
319
+ setEnvIfNotSet('HELMET_HSTS', config.security.helmet.hsts?.toString());
320
+ setEnvIfNotSet('HELMET_NO_SNIFF', config.security.helmet.noSniff?.toString());
321
+ setEnvIfNotSet('HELMET_FRAMEGUARD', config.security.helmet.frameguard?.toString());
322
+ }
323
+
324
+ if (config.security.rateLimit?.global) {
325
+ setEnvIfNotSet(
326
+ 'GLOBAL_RATE_LIMIT_ENABLED',
327
+ config.security.rateLimit.global.enabled?.toString()
328
+ );
329
+ setEnvIfNotSet(
330
+ 'GLOBAL_RATE_LIMIT_REQUESTS',
331
+ config.security.rateLimit.global.requests?.toString()
332
+ );
333
+ setEnvIfNotSet(
334
+ 'GLOBAL_RATE_LIMIT_WINDOW',
335
+ config.security.rateLimit.global.window?.toString()
336
+ );
337
+ }
338
+ }
339
+
340
+ // Apply external services configuration
341
+ if (config.external) {
342
+ if (config.external.stripe) {
343
+ setEnvIfNotSet('STRIPE_SECRET_KEY', config.external.stripe.secretKey);
344
+ setEnvIfNotSet('STRIPE_PUBLISHABLE_KEY', config.external.stripe.publishableKey);
345
+ setEnvIfNotSet('STRIPE_WEBHOOK_SECRET', config.external.stripe.webhookSecret);
346
+ setEnvIfNotSet('STRIPE_API_VERSION', config.external.stripe.apiVersion);
347
+ }
348
+
349
+ if (config.external.paypal) {
350
+ setEnvIfNotSet('PAYPAL_CLIENT_ID', config.external.paypal.clientId);
351
+ setEnvIfNotSet('PAYPAL_CLIENT_SECRET', config.external.paypal.clientSecret);
352
+ setEnvIfNotSet('PAYPAL_WEBHOOK_ID', config.external.paypal.webhookId);
353
+ setEnvIfNotSet('PAYPAL_ENVIRONMENT', config.external.paypal.environment);
354
+ }
355
+
356
+ if (config.external.smtp) {
357
+ setEnvIfNotSet('SMTP_HOST', config.external.smtp.host);
358
+ setEnvIfNotSet('SMTP_PORT', config.external.smtp.port?.toString());
359
+ setEnvIfNotSet('SMTP_SECURE', config.external.smtp.secure?.toString());
360
+ setEnvIfNotSet('SMTP_USERNAME', config.external.smtp.username);
361
+ setEnvIfNotSet('SMTP_PASSWORD', config.external.smtp.password);
362
+ }
363
+ }
364
+
365
+ // Apply performance configuration
366
+ if (config.performance) {
367
+ if (config.performance.compression) {
368
+ setEnvIfNotSet('COMPRESSION_ENABLED', config.performance.compression.enabled?.toString());
369
+ setEnvIfNotSet('COMPRESSION_LEVEL', config.performance.compression.level?.toString());
370
+ setEnvIfNotSet('COMPRESSION_THRESHOLD', config.performance.compression.threshold?.toString());
371
+ }
372
+
373
+ if (config.performance.circuitBreaker) {
374
+ setEnvIfNotSet(
375
+ 'CIRCUIT_BREAKER_ENABLED',
376
+ config.performance.circuitBreaker.enabled?.toString()
377
+ );
378
+ setEnvIfNotSet(
379
+ 'CIRCUIT_BREAKER_THRESHOLD',
380
+ config.performance.circuitBreaker.failureThreshold?.toString()
381
+ );
382
+ setEnvIfNotSet(
383
+ 'CIRCUIT_BREAKER_RESET',
384
+ config.performance.circuitBreaker.resetTimeout?.toString()
385
+ );
386
+ setEnvIfNotSet(
387
+ 'CIRCUIT_BREAKER_MONITOR',
388
+ config.performance.circuitBreaker.monitoringPeriod?.toString()
389
+ );
390
+ }
391
+
392
+ if (config.performance.clustering) {
393
+ setEnvIfNotSet('CLUSTERING_ENABLED', config.performance.clustering.enabled?.toString());
394
+ setEnvIfNotSet('CLUSTER_WORKERS', config.performance.clustering.workers?.toString());
395
+ }
396
+ }
397
+ }
398
+
399
+ /**
400
+ * Set environment variable only if it's not already set
401
+ * This ensures environment variables take precedence over config file values
402
+ */
403
+ function setEnvIfNotSet(key: string, value: string | undefined): void {
404
+ if (value !== undefined && process.env[key] === undefined) {
405
+ process.env[key] = value;
406
+ }
407
+ }