@morojs/moro 1.6.1 → 1.6.2

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 (404) hide show
  1. package/README.md +74 -256
  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/config-manager.d.ts +44 -0
  5. package/dist/core/config/config-manager.js +104 -0
  6. package/dist/core/config/config-manager.js.map +1 -0
  7. package/dist/core/config/config-sources.d.ts +21 -0
  8. package/dist/core/config/config-sources.js +503 -0
  9. package/dist/core/config/config-sources.js.map +1 -0
  10. package/dist/core/config/config-validator.d.ts +21 -0
  11. package/dist/core/config/config-validator.js +791 -0
  12. package/dist/core/config/config-validator.js.map +1 -0
  13. package/dist/core/config/file-loader.d.ts +1 -6
  14. package/dist/core/config/file-loader.js +21 -249
  15. package/dist/core/config/file-loader.js.map +1 -1
  16. package/dist/core/config/index.d.ts +41 -12
  17. package/dist/core/config/index.js +65 -54
  18. package/dist/core/config/index.js.map +1 -1
  19. package/dist/core/config/schema.d.ts +2 -2
  20. package/dist/core/config/schema.js +55 -44
  21. package/dist/core/config/schema.js.map +1 -1
  22. package/dist/core/config/utils.d.ts +10 -3
  23. package/dist/core/config/utils.js +31 -58
  24. package/dist/core/config/utils.js.map +1 -1
  25. package/dist/core/database/adapters/drizzle.d.ts +1 -1
  26. package/dist/core/database/adapters/drizzle.js +18 -11
  27. package/dist/core/database/adapters/drizzle.js.map +1 -1
  28. package/dist/core/database/adapters/index.d.ts +7 -7
  29. package/dist/core/database/adapters/index.js +19 -29
  30. package/dist/core/database/adapters/index.js.map +1 -1
  31. package/dist/core/database/adapters/mongodb.d.ts +13 -1
  32. package/dist/core/database/adapters/mongodb.js +46 -10
  33. package/dist/core/database/adapters/mongodb.js.map +1 -1
  34. package/dist/core/database/adapters/mysql.d.ts +14 -1
  35. package/dist/core/database/adapters/mysql.js +19 -9
  36. package/dist/core/database/adapters/mysql.js.map +1 -1
  37. package/dist/core/database/adapters/postgresql.d.ts +12 -2
  38. package/dist/core/database/adapters/postgresql.js +19 -9
  39. package/dist/core/database/adapters/postgresql.js.map +1 -1
  40. package/dist/core/database/adapters/redis.d.ts +12 -1
  41. package/dist/core/database/adapters/redis.js +48 -13
  42. package/dist/core/database/adapters/redis.js.map +1 -1
  43. package/dist/core/database/adapters/sqlite.d.ts +3 -1
  44. package/dist/core/database/adapters/sqlite.js +19 -8
  45. package/dist/core/database/adapters/sqlite.js.map +1 -1
  46. package/dist/core/database/index.d.ts +2 -2
  47. package/dist/core/database/index.js +2 -18
  48. package/dist/core/database/index.js.map +1 -1
  49. package/dist/core/docs/index.d.ts +9 -9
  50. package/dist/core/docs/index.js +14 -35
  51. package/dist/core/docs/index.js.map +1 -1
  52. package/dist/core/docs/openapi-generator.d.ts +2 -2
  53. package/dist/core/docs/openapi-generator.js +11 -16
  54. package/dist/core/docs/openapi-generator.js.map +1 -1
  55. package/dist/core/docs/schema-to-openapi.d.ts +2 -2
  56. package/dist/core/docs/schema-to-openapi.js +5 -11
  57. package/dist/core/docs/schema-to-openapi.js.map +1 -1
  58. package/dist/core/docs/simple-docs.d.ts +1 -1
  59. package/dist/core/docs/simple-docs.js +4 -9
  60. package/dist/core/docs/simple-docs.js.map +1 -1
  61. package/dist/core/docs/swagger-ui.d.ts +2 -2
  62. package/dist/core/docs/swagger-ui.js +26 -29
  63. package/dist/core/docs/swagger-ui.js.map +1 -1
  64. package/dist/core/docs/zod-to-openapi.js +31 -28
  65. package/dist/core/docs/zod-to-openapi.js.map +1 -1
  66. package/dist/core/events/event-bus.d.ts +1 -1
  67. package/dist/core/events/event-bus.js +7 -11
  68. package/dist/core/events/event-bus.js.map +1 -1
  69. package/dist/core/events/index.d.ts +2 -2
  70. package/dist/core/events/index.js +1 -5
  71. package/dist/core/events/index.js.map +1 -1
  72. package/dist/core/framework.d.ts +20 -13
  73. package/dist/core/framework.js +285 -102
  74. package/dist/core/framework.js.map +1 -1
  75. package/dist/core/http/http-server.d.ts +59 -7
  76. package/dist/core/http/http-server.js +190 -176
  77. package/dist/core/http/http-server.js.map +1 -1
  78. package/dist/core/http/index.d.ts +4 -3
  79. package/dist/core/http/index.js +3 -8
  80. package/dist/core/http/index.js.map +1 -1
  81. package/dist/core/http/uws-http-server.d.ts +46 -0
  82. package/dist/core/http/uws-http-server.js +523 -0
  83. package/dist/core/http/uws-http-server.js.map +1 -0
  84. package/dist/core/logger/filters.d.ts +1 -1
  85. package/dist/core/logger/filters.js +20 -23
  86. package/dist/core/logger/filters.js.map +1 -1
  87. package/dist/core/logger/index.d.ts +3 -3
  88. package/dist/core/logger/index.js +2 -24
  89. package/dist/core/logger/index.js.map +1 -1
  90. package/dist/core/logger/logger.d.ts +30 -14
  91. package/dist/core/logger/logger.js +398 -223
  92. package/dist/core/logger/logger.js.map +1 -1
  93. package/dist/core/logger/outputs.d.ts +1 -1
  94. package/dist/core/logger/outputs.js +8 -17
  95. package/dist/core/logger/outputs.js.map +1 -1
  96. package/dist/core/middleware/built-in/adapters/cache/file.d.ts +1 -1
  97. package/dist/core/middleware/built-in/adapters/cache/file.js +10 -47
  98. package/dist/core/middleware/built-in/adapters/cache/file.js.map +1 -1
  99. package/dist/core/middleware/built-in/adapters/cache/index.d.ts +4 -4
  100. package/dist/core/middleware/built-in/adapters/cache/index.js +10 -17
  101. package/dist/core/middleware/built-in/adapters/cache/index.js.map +1 -1
  102. package/dist/core/middleware/built-in/adapters/cache/memory.d.ts +1 -1
  103. package/dist/core/middleware/built-in/adapters/cache/memory.js +3 -7
  104. package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -1
  105. package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +3 -1
  106. package/dist/core/middleware/built-in/adapters/cache/redis.js +11 -9
  107. package/dist/core/middleware/built-in/adapters/cache/redis.js.map +1 -1
  108. package/dist/core/middleware/built-in/adapters/cdn/azure.d.ts +1 -1
  109. package/dist/core/middleware/built-in/adapters/cdn/azure.js +3 -7
  110. package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +1 -1
  111. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.d.ts +1 -1
  112. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js +3 -7
  113. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -1
  114. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +3 -1
  115. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +12 -10
  116. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +1 -1
  117. package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +4 -4
  118. package/dist/core/middleware/built-in/adapters/cdn/index.js +10 -17
  119. package/dist/core/middleware/built-in/adapters/cdn/index.js.map +1 -1
  120. package/dist/core/middleware/built-in/adapters/index.d.ts +4 -4
  121. package/dist/core/middleware/built-in/adapters/index.js +4 -23
  122. package/dist/core/middleware/built-in/adapters/index.js.map +1 -1
  123. package/dist/core/middleware/built-in/auth-helpers.js +11 -22
  124. package/dist/core/middleware/built-in/auth-helpers.js.map +1 -1
  125. package/dist/core/middleware/built-in/auth-providers.d.ts +1 -1
  126. package/dist/core/middleware/built-in/auth-providers.js +4 -9
  127. package/dist/core/middleware/built-in/auth-providers.js.map +1 -1
  128. package/dist/core/middleware/built-in/auth.d.ts +2 -2
  129. package/dist/core/middleware/built-in/auth.js +93 -26
  130. package/dist/core/middleware/built-in/auth.js.map +1 -1
  131. package/dist/core/middleware/built-in/cache.d.ts +2 -2
  132. package/dist/core/middleware/built-in/cache.js +11 -12
  133. package/dist/core/middleware/built-in/cache.js.map +1 -1
  134. package/dist/core/middleware/built-in/cdn.d.ts +2 -2
  135. package/dist/core/middleware/built-in/cdn.js +5 -9
  136. package/dist/core/middleware/built-in/cdn.js.map +1 -1
  137. package/dist/core/middleware/built-in/cookie.d.ts +1 -1
  138. package/dist/core/middleware/built-in/cookie.js +3 -7
  139. package/dist/core/middleware/built-in/cookie.js.map +1 -1
  140. package/dist/core/middleware/built-in/cors.d.ts +1 -1
  141. package/dist/core/middleware/built-in/cors.js +3 -7
  142. package/dist/core/middleware/built-in/cors.js.map +1 -1
  143. package/dist/core/middleware/built-in/csp.d.ts +1 -1
  144. package/dist/core/middleware/built-in/csp.js +5 -8
  145. package/dist/core/middleware/built-in/csp.js.map +1 -1
  146. package/dist/core/middleware/built-in/csrf.d.ts +1 -1
  147. package/dist/core/middleware/built-in/csrf.js +5 -8
  148. package/dist/core/middleware/built-in/csrf.js.map +1 -1
  149. package/dist/core/middleware/built-in/error-tracker.js +3 -7
  150. package/dist/core/middleware/built-in/error-tracker.js.map +1 -1
  151. package/dist/core/middleware/built-in/index.d.ts +28 -27
  152. package/dist/core/middleware/built-in/index.js +48 -78
  153. package/dist/core/middleware/built-in/index.js.map +1 -1
  154. package/dist/core/middleware/built-in/jwt-helpers.d.ts +118 -0
  155. package/dist/core/middleware/built-in/jwt-helpers.js +218 -0
  156. package/dist/core/middleware/built-in/jwt-helpers.js.map +1 -0
  157. package/dist/core/middleware/built-in/performance-monitor.js +3 -7
  158. package/dist/core/middleware/built-in/performance-monitor.js.map +1 -1
  159. package/dist/core/middleware/built-in/rate-limit.d.ts +1 -1
  160. package/dist/core/middleware/built-in/rate-limit.js +3 -7
  161. package/dist/core/middleware/built-in/rate-limit.js.map +1 -1
  162. package/dist/core/middleware/built-in/request-logger.js +5 -8
  163. package/dist/core/middleware/built-in/request-logger.js.map +1 -1
  164. package/dist/core/middleware/built-in/session.d.ts +2 -2
  165. package/dist/core/middleware/built-in/session.js +11 -15
  166. package/dist/core/middleware/built-in/session.js.map +1 -1
  167. package/dist/core/middleware/built-in/sse.d.ts +1 -1
  168. package/dist/core/middleware/built-in/sse.js +12 -14
  169. package/dist/core/middleware/built-in/sse.js.map +1 -1
  170. package/dist/core/middleware/built-in/validation.d.ts +1 -1
  171. package/dist/core/middleware/built-in/validation.js +3 -7
  172. package/dist/core/middleware/built-in/validation.js.map +1 -1
  173. package/dist/core/middleware/index.d.ts +4 -4
  174. package/dist/core/middleware/index.js +8 -28
  175. package/dist/core/middleware/index.js.map +1 -1
  176. package/dist/core/modules/auto-discovery.d.ts +19 -2
  177. package/dist/core/modules/auto-discovery.js +391 -74
  178. package/dist/core/modules/auto-discovery.js.map +1 -1
  179. package/dist/core/modules/index.d.ts +2 -2
  180. package/dist/core/modules/index.js +2 -9
  181. package/dist/core/modules/index.js.map +1 -1
  182. package/dist/core/modules/modules.d.ts +3 -3
  183. package/dist/core/modules/modules.js +23 -54
  184. package/dist/core/modules/modules.js.map +1 -1
  185. package/dist/core/networking/adapters/index.d.ts +4 -3
  186. package/dist/core/networking/adapters/index.js +3 -7
  187. package/dist/core/networking/adapters/index.js.map +1 -1
  188. package/dist/core/networking/adapters/socketio-adapter.d.ts +1 -1
  189. package/dist/core/networking/adapters/socketio-adapter.js +5 -40
  190. package/dist/core/networking/adapters/socketio-adapter.js.map +1 -1
  191. package/dist/core/networking/adapters/uws-adapter.d.ts +44 -0
  192. package/dist/core/networking/adapters/uws-adapter.js +513 -0
  193. package/dist/core/networking/adapters/uws-adapter.js.map +1 -0
  194. package/dist/core/networking/adapters/ws-adapter.d.ts +2 -2
  195. package/dist/core/networking/adapters/ws-adapter.js +8 -43
  196. package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
  197. package/dist/core/networking/index.d.ts +3 -2
  198. package/dist/core/networking/index.js +2 -7
  199. package/dist/core/networking/index.js.map +1 -1
  200. package/dist/core/networking/service-discovery.js +8 -12
  201. package/dist/core/networking/service-discovery.js.map +1 -1
  202. package/dist/core/networking/websocket-adapter.js +1 -2
  203. package/dist/core/networking/websocket-adapter.js.map +1 -1
  204. package/dist/core/networking/websocket-manager.d.ts +3 -3
  205. package/dist/core/networking/websocket-manager.js +9 -11
  206. package/dist/core/networking/websocket-manager.js.map +1 -1
  207. package/dist/core/pooling/object-pool-manager.d.ts +140 -0
  208. package/dist/core/pooling/object-pool-manager.js +502 -0
  209. package/dist/core/pooling/object-pool-manager.js.map +1 -0
  210. package/dist/core/routing/app-integration.d.ts +14 -12
  211. package/dist/core/routing/app-integration.js +49 -85
  212. package/dist/core/routing/app-integration.js.map +1 -1
  213. package/dist/core/routing/index.d.ts +17 -11
  214. package/dist/core/routing/index.js +48 -237
  215. package/dist/core/routing/index.js.map +1 -1
  216. package/dist/core/routing/path-matcher.d.ts +67 -0
  217. package/dist/core/routing/path-matcher.js +182 -0
  218. package/dist/core/routing/path-matcher.js.map +1 -0
  219. package/dist/core/routing/router.d.ts +38 -0
  220. package/dist/core/routing/router.js +68 -0
  221. package/dist/core/routing/router.js.map +1 -0
  222. package/dist/core/routing/unified-router.d.ts +148 -0
  223. package/dist/core/routing/unified-router.js +684 -0
  224. package/dist/core/routing/unified-router.js.map +1 -0
  225. package/dist/core/runtime/aws-lambda-adapter.d.ts +3 -3
  226. package/dist/core/runtime/aws-lambda-adapter.js +2 -6
  227. package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
  228. package/dist/core/runtime/base-adapter.d.ts +2 -2
  229. package/dist/core/runtime/base-adapter.js +3 -7
  230. package/dist/core/runtime/base-adapter.js.map +1 -1
  231. package/dist/core/runtime/cloudflare-workers-adapter.d.ts +3 -3
  232. package/dist/core/runtime/cloudflare-workers-adapter.js +2 -6
  233. package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
  234. package/dist/core/runtime/index.d.ts +12 -12
  235. package/dist/core/runtime/index.js +22 -35
  236. package/dist/core/runtime/index.js.map +1 -1
  237. package/dist/core/runtime/node-adapter.d.ts +4 -4
  238. package/dist/core/runtime/node-adapter.js +18 -49
  239. package/dist/core/runtime/node-adapter.js.map +1 -1
  240. package/dist/core/runtime/vercel-edge-adapter.d.ts +3 -3
  241. package/dist/core/runtime/vercel-edge-adapter.js +2 -6
  242. package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
  243. package/dist/core/utilities/circuit-breaker.js +1 -5
  244. package/dist/core/utilities/circuit-breaker.js.map +1 -1
  245. package/dist/core/utilities/container.js +12 -22
  246. package/dist/core/utilities/container.js.map +1 -1
  247. package/dist/core/utilities/hooks.d.ts +2 -2
  248. package/dist/core/utilities/hooks.js +7 -12
  249. package/dist/core/utilities/hooks.js.map +1 -1
  250. package/dist/core/utilities/index.d.ts +5 -4
  251. package/dist/core/utilities/index.js +5 -19
  252. package/dist/core/utilities/index.js.map +1 -1
  253. package/dist/core/utilities/package-utils.d.ts +38 -0
  254. package/dist/core/utilities/package-utils.js +57 -0
  255. package/dist/core/utilities/package-utils.js.map +1 -0
  256. package/dist/core/validation/adapters.d.ts +1 -1
  257. package/dist/core/validation/adapters.js +15 -26
  258. package/dist/core/validation/adapters.js.map +1 -1
  259. package/dist/core/validation/index.d.ts +6 -4
  260. package/dist/core/validation/index.js +57 -28
  261. package/dist/core/validation/index.js.map +1 -1
  262. package/dist/core/validation/schema-interface.js +3 -9
  263. package/dist/core/validation/schema-interface.js.map +1 -1
  264. package/dist/index.d.ts +51 -52
  265. package/dist/index.js +23 -132
  266. package/dist/index.js.map +1 -1
  267. package/dist/moro.d.ts +70 -16
  268. package/dist/moro.js +658 -271
  269. package/dist/moro.js.map +1 -1
  270. package/dist/types/auth.js +3 -9
  271. package/dist/types/auth.js.map +1 -1
  272. package/dist/types/cache.js +1 -2
  273. package/dist/types/cdn.js +1 -2
  274. package/dist/types/config.d.ts +73 -2
  275. package/dist/types/config.js +1 -2
  276. package/dist/types/config.js.map +1 -1
  277. package/dist/types/core.d.ts +36 -42
  278. package/dist/types/core.js +1 -2
  279. package/dist/types/database.js +1 -2
  280. package/dist/types/discovery.js +1 -2
  281. package/dist/types/events.js +1 -2
  282. package/dist/types/hooks.d.ts +1 -1
  283. package/dist/types/hooks.js +1 -2
  284. package/dist/types/http.d.ts +16 -1
  285. package/dist/types/http.js +1 -2
  286. package/dist/types/logger.d.ts +7 -0
  287. package/dist/types/logger.js +1 -2
  288. package/dist/types/module.d.ts +11 -0
  289. package/dist/types/module.js +1 -2
  290. package/dist/types/runtime.d.ts +1 -1
  291. package/dist/types/runtime.js +1 -2
  292. package/dist/types/session.js +1 -2
  293. package/jest.config.mjs +41 -0
  294. package/package.json +19 -52
  295. package/src/core/auth/morojs-adapter.ts +18 -13
  296. package/src/core/config/config-manager.ts +133 -0
  297. package/src/core/config/config-sources.ts +600 -0
  298. package/src/core/config/config-validator.ts +1116 -0
  299. package/src/core/config/file-loader.ts +16 -273
  300. package/src/core/config/index.ts +83 -34
  301. package/src/core/config/schema.ts +47 -33
  302. package/src/core/config/utils.ts +24 -31
  303. package/src/core/database/README.md +26 -16
  304. package/src/core/database/adapters/drizzle.ts +18 -6
  305. package/src/core/database/adapters/index.ts +13 -13
  306. package/src/core/database/adapters/mongodb.ts +53 -5
  307. package/src/core/database/adapters/mysql.ts +32 -4
  308. package/src/core/database/adapters/postgresql.ts +30 -5
  309. package/src/core/database/adapters/redis.ts +61 -8
  310. package/src/core/database/adapters/sqlite.ts +19 -3
  311. package/src/core/database/index.ts +2 -2
  312. package/src/core/docs/index.ts +8 -8
  313. package/src/core/docs/openapi-generator.ts +4 -4
  314. package/src/core/docs/schema-to-openapi.ts +3 -6
  315. package/src/core/docs/simple-docs.ts +2 -2
  316. package/src/core/docs/swagger-ui.ts +19 -16
  317. package/src/core/docs/zod-to-openapi.ts +34 -34
  318. package/src/core/events/event-bus.ts +3 -3
  319. package/src/core/events/index.ts +2 -2
  320. package/src/core/framework.ts +320 -71
  321. package/src/core/http/http-server.ts +203 -143
  322. package/src/core/http/index.ts +4 -3
  323. package/src/core/http/uws-http-server.ts +591 -0
  324. package/src/core/logger/filters.ts +13 -5
  325. package/src/core/logger/index.ts +4 -3
  326. package/src/core/logger/logger.ts +435 -216
  327. package/src/core/logger/outputs.ts +1 -3
  328. package/src/core/middleware/built-in/adapters/cache/file.ts +3 -3
  329. package/src/core/middleware/built-in/adapters/cache/index.ts +7 -7
  330. package/src/core/middleware/built-in/adapters/cache/memory.ts +2 -2
  331. package/src/core/middleware/built-in/adapters/cache/redis.ts +18 -4
  332. package/src/core/middleware/built-in/adapters/cdn/azure.ts +2 -2
  333. package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +2 -2
  334. package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +16 -5
  335. package/src/core/middleware/built-in/adapters/cdn/index.ts +7 -7
  336. package/src/core/middleware/built-in/adapters/index.ts +4 -4
  337. package/src/core/middleware/built-in/auth-helpers.ts +1 -1
  338. package/src/core/middleware/built-in/auth-providers.ts +1 -1
  339. package/src/core/middleware/built-in/auth.ts +102 -21
  340. package/src/core/middleware/built-in/cache.ts +8 -6
  341. package/src/core/middleware/built-in/cdn.ts +4 -4
  342. package/src/core/middleware/built-in/cookie.ts +2 -2
  343. package/src/core/middleware/built-in/cors.ts +2 -2
  344. package/src/core/middleware/built-in/csp.ts +3 -3
  345. package/src/core/middleware/built-in/csrf.ts +3 -3
  346. package/src/core/middleware/built-in/error-tracker.ts +1 -1
  347. package/src/core/middleware/built-in/index.ts +38 -30
  348. package/src/core/middleware/built-in/jwt-helpers.ts +243 -0
  349. package/src/core/middleware/built-in/performance-monitor.ts +1 -1
  350. package/src/core/middleware/built-in/rate-limit.ts +2 -2
  351. package/src/core/middleware/built-in/request-logger.ts +3 -1
  352. package/src/core/middleware/built-in/session.ts +7 -8
  353. package/src/core/middleware/built-in/sse.ts +11 -9
  354. package/src/core/middleware/built-in/validation.ts +2 -2
  355. package/src/core/middleware/index.ts +6 -6
  356. package/src/core/modules/auto-discovery.ts +478 -15
  357. package/src/core/modules/index.ts +2 -2
  358. package/src/core/modules/modules.ts +23 -12
  359. package/src/core/networking/adapters/index.ts +4 -3
  360. package/src/core/networking/adapters/socketio-adapter.ts +5 -3
  361. package/src/core/networking/adapters/uws-adapter.ts +619 -0
  362. package/src/core/networking/adapters/ws-adapter.ts +8 -9
  363. package/src/core/networking/index.ts +3 -2
  364. package/src/core/networking/service-discovery.ts +6 -7
  365. package/src/core/networking/websocket-manager.ts +7 -7
  366. package/src/core/pooling/object-pool-manager.ts +630 -0
  367. package/src/core/routing/app-integration.ts +60 -112
  368. package/src/core/routing/index.ts +66 -293
  369. package/src/core/routing/path-matcher.ts +222 -0
  370. package/src/core/routing/router.ts +97 -0
  371. package/src/core/routing/unified-router.ts +870 -0
  372. package/src/core/runtime/aws-lambda-adapter.ts +3 -3
  373. package/src/core/runtime/base-adapter.ts +2 -2
  374. package/src/core/runtime/cloudflare-workers-adapter.ts +3 -3
  375. package/src/core/runtime/index.ts +13 -13
  376. package/src/core/runtime/node-adapter.ts +16 -10
  377. package/src/core/runtime/vercel-edge-adapter.ts +3 -3
  378. package/src/core/utilities/hooks.ts +3 -3
  379. package/src/core/utilities/index.ts +5 -4
  380. package/src/core/utilities/package-utils.ts +59 -0
  381. package/src/core/validation/adapters.ts +1 -1
  382. package/src/core/validation/index.ts +68 -16
  383. package/src/index.ts +73 -66
  384. package/src/moro.ts +784 -253
  385. package/src/types/config.ts +74 -2
  386. package/src/types/core.ts +49 -47
  387. package/src/types/hooks.ts +1 -1
  388. package/src/types/http.ts +23 -1
  389. package/src/types/logger.ts +9 -0
  390. package/src/types/module.ts +12 -0
  391. package/src/types/runtime.ts +1 -1
  392. package/tsconfig.json +4 -2
  393. package/dist/core/config/loader.d.ts +0 -7
  394. package/dist/core/config/loader.js +0 -269
  395. package/dist/core/config/loader.js.map +0 -1
  396. package/dist/core/config/validation.d.ts +0 -17
  397. package/dist/core/config/validation.js +0 -131
  398. package/dist/core/config/validation.js.map +0 -1
  399. package/dist/core/http/router.d.ts +0 -14
  400. package/dist/core/http/router.js +0 -109
  401. package/dist/core/http/router.js.map +0 -1
  402. package/src/core/config/loader.ts +0 -633
  403. package/src/core/config/validation.ts +0 -140
  404. package/src/core/http/router.ts +0 -141
@@ -0,0 +1,600 @@
1
+ /**
2
+ * Configuration Sources - Load from Environment, Files, and Options
3
+ *
4
+ * This module handles loading configuration from different sources with clear precedence:
5
+ * Environment Variables > createApp Options > Config File > Schema Defaults
6
+ */
7
+
8
+ import { AppConfig } from '../../types/config.js';
9
+ import { MoroOptions } from '../../types/core.js';
10
+ import { DEFAULT_CONFIG } from './schema.js';
11
+ import { loadConfigFileSync } from './file-loader.js';
12
+ import { createFrameworkLogger } from '../logger/index.js';
13
+ import { validateConfig } from './config-validator.js';
14
+
15
+ const logger = createFrameworkLogger('ConfigSources');
16
+
17
+ /**
18
+ * Configuration source metadata for debugging
19
+ */
20
+ export interface ConfigSourceInfo {
21
+ source: 'environment' | 'createApp' | 'configFile' | 'default';
22
+ path: string;
23
+ value: any;
24
+ }
25
+
26
+ /**
27
+ * Load configuration from all sources with proper precedence
28
+ * Returns a validated, complete configuration object
29
+ */
30
+ export function loadConfigFromAllSources(createAppOptions?: MoroOptions): AppConfig {
31
+ logger.debug('Loading configuration from all sources');
32
+
33
+ // 1. Start with schema defaults
34
+ let config = JSON.parse(JSON.stringify(DEFAULT_CONFIG)) as AppConfig;
35
+ const sourceMap = new Map<string, ConfigSourceInfo>();
36
+
37
+ // Track default values
38
+ trackConfigSource(config, sourceMap, 'default', 'schema');
39
+
40
+ // 2. Load and merge config file (if exists)
41
+ try {
42
+ const fileConfig = loadConfigFileSync();
43
+ if (fileConfig) {
44
+ config = deepMerge(config, fileConfig);
45
+ trackConfigSource(fileConfig, sourceMap, 'configFile', 'moro.config.js/ts');
46
+ logger.debug('Config file loaded and merged');
47
+ }
48
+ } catch (error) {
49
+ logger.warn('Config file loading failed, continuing without it:', String(error));
50
+ }
51
+
52
+ // 3. Load and merge environment variables
53
+ const envConfig = loadEnvironmentConfig();
54
+ config = deepMerge(config, envConfig);
55
+ trackConfigSource(envConfig, sourceMap, 'environment', 'process.env');
56
+
57
+ // 4. Load and merge createApp options (highest precedence)
58
+ if (createAppOptions) {
59
+ const normalizedOptions = normalizeCreateAppOptions(createAppOptions);
60
+ config = deepMerge(config, normalizedOptions);
61
+ trackConfigSource(normalizedOptions, sourceMap, 'createApp', 'createApp()');
62
+ logger.debug('createApp options merged');
63
+ }
64
+
65
+ // 5. Validate the final configuration
66
+ const validatedConfig = validateConfig(config);
67
+
68
+ // Log configuration sources for debugging
69
+ logConfigurationSources(sourceMap);
70
+
71
+ return validatedConfig;
72
+ }
73
+
74
+ /**
75
+ * Load configuration from environment variables
76
+ * Handles both standard and MORO_ prefixed variables
77
+ */
78
+ function loadEnvironmentConfig(): Partial<AppConfig> {
79
+ const config: Partial<AppConfig> = {};
80
+
81
+ // Server configuration
82
+ if (process.env.PORT || process.env.MORO_PORT) {
83
+ if (!config.server) config.server = {} as any;
84
+ config.server!.port = parseInt(process.env.PORT || process.env.MORO_PORT || '3001', 10);
85
+ }
86
+
87
+ if (process.env.HOST || process.env.MORO_HOST) {
88
+ if (!config.server) config.server = {} as any;
89
+ config.server!.host = process.env.HOST || process.env.MORO_HOST || 'localhost';
90
+ }
91
+
92
+ if (process.env.MAX_CONNECTIONS || process.env.MORO_MAX_CONNECTIONS) {
93
+ if (!config.server) config.server = {} as any;
94
+ config.server!.maxConnections = parseInt(
95
+ process.env.MAX_CONNECTIONS || process.env.MORO_MAX_CONNECTIONS || '1000',
96
+ 10
97
+ );
98
+ }
99
+
100
+ if (process.env.REQUEST_TIMEOUT || process.env.MORO_TIMEOUT) {
101
+ if (!config.server) config.server = {} as any;
102
+ config.server!.timeout = parseInt(
103
+ process.env.REQUEST_TIMEOUT || process.env.MORO_TIMEOUT || '30000',
104
+ 10
105
+ );
106
+ }
107
+
108
+ // Database configuration
109
+ if (process.env.DATABASE_URL || process.env.MORO_DATABASE_URL) {
110
+ if (!config.database) config.database = {} as any;
111
+ config.database!.url = process.env.DATABASE_URL || process.env.MORO_DATABASE_URL;
112
+ }
113
+
114
+ // Redis configuration
115
+ if (process.env.REDIS_URL || process.env.MORO_REDIS_URL) {
116
+ if (!config.database) config.database = {} as any;
117
+ if (!config.database!.redis) config.database!.redis = {} as any;
118
+ config.database!.redis!.url =
119
+ process.env.REDIS_URL || process.env.MORO_REDIS_URL || 'redis://localhost:6379';
120
+ config.database!.redis!.maxRetries = parseInt(
121
+ process.env.REDIS_MAX_RETRIES || process.env.MORO_REDIS_MAX_RETRIES || '3',
122
+ 10
123
+ );
124
+ config.database!.redis!.retryDelay = parseInt(
125
+ process.env.REDIS_RETRY_DELAY || process.env.MORO_REDIS_RETRY_DELAY || '1000',
126
+ 10
127
+ );
128
+ config.database!.redis!.keyPrefix =
129
+ process.env.REDIS_KEY_PREFIX || process.env.MORO_REDIS_KEY_PREFIX || 'moro:';
130
+ }
131
+
132
+ // MySQL configuration - only include if MYSQL_HOST is set
133
+ if (process.env.MYSQL_HOST || process.env.MORO_MYSQL_HOST) {
134
+ if (!config.database) config.database = {} as any;
135
+ config.database!.mysql = {
136
+ host: process.env.MYSQL_HOST || process.env.MORO_MYSQL_HOST || 'localhost',
137
+ port: parseInt(process.env.MYSQL_PORT || process.env.MORO_MYSQL_PORT || '3306', 10),
138
+ database: process.env.MYSQL_DATABASE || process.env.MORO_MYSQL_DB,
139
+ username: process.env.MYSQL_USERNAME || process.env.MORO_MYSQL_USER,
140
+ password: process.env.MYSQL_PASSWORD || process.env.MORO_MYSQL_PASS,
141
+ connectionLimit: parseInt(
142
+ process.env.MYSQL_CONNECTION_LIMIT || process.env.MORO_MYSQL_CONNECTIONS || '10',
143
+ 10
144
+ ),
145
+ acquireTimeout: parseInt(
146
+ process.env.MYSQL_ACQUIRE_TIMEOUT || process.env.MORO_MYSQL_ACQUIRE || '60000',
147
+ 10
148
+ ),
149
+ timeout: parseInt(process.env.MYSQL_TIMEOUT || process.env.MORO_MYSQL_TIMEOUT || '60000', 10),
150
+ } as any;
151
+ }
152
+
153
+ // Logging configuration
154
+ if (process.env.LOG_LEVEL || process.env.MORO_LOG_LEVEL) {
155
+ const level = process.env.LOG_LEVEL || process.env.MORO_LOG_LEVEL;
156
+ if (
157
+ level === 'debug' ||
158
+ level === 'info' ||
159
+ level === 'warn' ||
160
+ level === 'error' ||
161
+ level === 'fatal'
162
+ ) {
163
+ if (!config.logging) config.logging = {} as any;
164
+ config.logging!.level = level;
165
+ }
166
+ }
167
+
168
+ // External services - only include if configured
169
+ const externalConfig: Partial<AppConfig['external']> = {};
170
+
171
+ // Stripe
172
+ if (process.env.STRIPE_SECRET_KEY || process.env.MORO_STRIPE_SECRET) {
173
+ externalConfig.stripe = {
174
+ secretKey: process.env.STRIPE_SECRET_KEY || process.env.MORO_STRIPE_SECRET,
175
+ publishableKey: process.env.STRIPE_PUBLISHABLE_KEY || process.env.MORO_STRIPE_PUBLIC,
176
+ webhookSecret: process.env.STRIPE_WEBHOOK_SECRET || process.env.MORO_STRIPE_WEBHOOK,
177
+ apiVersion: process.env.STRIPE_API_VERSION || process.env.MORO_STRIPE_VERSION || '2023-10-16',
178
+ };
179
+ }
180
+
181
+ // PayPal
182
+ if (process.env.PAYPAL_CLIENT_ID || process.env.MORO_PAYPAL_CLIENT) {
183
+ externalConfig.paypal = {
184
+ clientId: process.env.PAYPAL_CLIENT_ID || process.env.MORO_PAYPAL_CLIENT,
185
+ clientSecret: process.env.PAYPAL_CLIENT_SECRET || process.env.MORO_PAYPAL_SECRET,
186
+ webhookId: process.env.PAYPAL_WEBHOOK_ID || process.env.MORO_PAYPAL_WEBHOOK,
187
+ environment:
188
+ (process.env.PAYPAL_ENVIRONMENT || process.env.MORO_PAYPAL_ENV) === 'production'
189
+ ? 'production'
190
+ : 'sandbox',
191
+ };
192
+ }
193
+
194
+ // SMTP
195
+ if (process.env.SMTP_HOST || process.env.MORO_SMTP_HOST) {
196
+ externalConfig.smtp = {
197
+ host: process.env.SMTP_HOST || process.env.MORO_SMTP_HOST,
198
+ port: parseInt(process.env.SMTP_PORT || process.env.MORO_SMTP_PORT || '587', 10),
199
+ secure: (process.env.SMTP_SECURE || 'false').toLowerCase() === 'true',
200
+ username: process.env.SMTP_USERNAME || process.env.MORO_SMTP_USER,
201
+ password: process.env.SMTP_PASSWORD || process.env.MORO_SMTP_PASS,
202
+ };
203
+ }
204
+
205
+ if (Object.keys(externalConfig).length > 0) {
206
+ config.external = externalConfig;
207
+ }
208
+
209
+ // Module configuration
210
+ const moduleEnvVars = [
211
+ // Cache
212
+ 'CACHE_ENABLED',
213
+ 'MORO_CACHE_ENABLED',
214
+ 'DEFAULT_CACHE_TTL',
215
+ 'MORO_CACHE_TTL',
216
+ 'CACHE_MAX_SIZE',
217
+ 'MORO_CACHE_SIZE',
218
+ 'CACHE_STRATEGY',
219
+ 'MORO_CACHE_STRATEGY',
220
+ // Rate Limit
221
+ 'RATE_LIMIT_ENABLED',
222
+ 'MORO_RATE_LIMIT_ENABLED',
223
+ 'DEFAULT_RATE_LIMIT_REQUESTS',
224
+ 'MORO_RATE_LIMIT_REQUESTS',
225
+ 'DEFAULT_RATE_LIMIT_WINDOW',
226
+ 'MORO_RATE_LIMIT_WINDOW',
227
+ // Validation
228
+ 'VALIDATION_ENABLED',
229
+ 'MORO_VALIDATION_ENABLED',
230
+ // Auto-Discovery
231
+ 'AUTO_DISCOVERY_ENABLED',
232
+ 'MORO_AUTO_DISCOVERY_ENABLED',
233
+ 'AUTO_DISCOVERY_PATHS',
234
+ 'MORO_AUTO_DISCOVERY_PATHS',
235
+ 'AUTO_DISCOVERY_PATTERNS',
236
+ 'MORO_AUTO_DISCOVERY_PATTERNS',
237
+ 'AUTO_DISCOVERY_LOADING_STRATEGY',
238
+ 'MORO_AUTO_DISCOVERY_LOADING_STRATEGY',
239
+ 'AUTO_DISCOVERY_WATCH_FOR_CHANGES',
240
+ 'MORO_AUTO_DISCOVERY_WATCH_FOR_CHANGES',
241
+ 'AUTO_DISCOVERY_LOAD_ORDER',
242
+ 'MORO_AUTO_DISCOVERY_LOAD_ORDER',
243
+ 'AUTO_DISCOVERY_FAIL_ON_ERROR',
244
+ 'MORO_AUTO_DISCOVERY_FAIL_ON_ERROR',
245
+ 'AUTO_DISCOVERY_MAX_DEPTH',
246
+ 'MORO_AUTO_DISCOVERY_MAX_DEPTH',
247
+ ];
248
+
249
+ if (moduleEnvVars.some(envVar => process.env[envVar])) {
250
+ if (!config.modules) config.modules = {} as any;
251
+
252
+ // Cache configuration
253
+ if (process.env.CACHE_ENABLED || process.env.MORO_CACHE_ENABLED) {
254
+ if (!config.modules!.cache) config.modules!.cache = {} as any;
255
+ config.modules!.cache!.enabled =
256
+ (process.env.CACHE_ENABLED || process.env.MORO_CACHE_ENABLED) === 'true';
257
+ }
258
+ if (process.env.DEFAULT_CACHE_TTL || process.env.MORO_CACHE_TTL) {
259
+ if (!config.modules!.cache) config.modules!.cache = {} as any;
260
+ config.modules!.cache!.defaultTtl = parseInt(
261
+ process.env.DEFAULT_CACHE_TTL || process.env.MORO_CACHE_TTL || '300',
262
+ 10
263
+ );
264
+ }
265
+ if (process.env.CACHE_MAX_SIZE || process.env.MORO_CACHE_SIZE) {
266
+ if (!config.modules!.cache) config.modules!.cache = {} as any;
267
+ config.modules!.cache!.maxSize = parseInt(
268
+ process.env.CACHE_MAX_SIZE || process.env.MORO_CACHE_SIZE || '1000',
269
+ 10
270
+ );
271
+ }
272
+ if (process.env.CACHE_STRATEGY || process.env.MORO_CACHE_STRATEGY) {
273
+ if (!config.modules!.cache) config.modules!.cache = {} as any;
274
+ const strategy = process.env.CACHE_STRATEGY || process.env.MORO_CACHE_STRATEGY;
275
+ if (['lru', 'lfu', 'fifo'].includes(strategy || '')) {
276
+ config.modules!.cache!.strategy = strategy as 'lru' | 'lfu' | 'fifo';
277
+ }
278
+ }
279
+
280
+ // Rate limit configuration
281
+ if (process.env.RATE_LIMIT_ENABLED || process.env.MORO_RATE_LIMIT_ENABLED) {
282
+ if (!config.modules!.rateLimit) config.modules!.rateLimit = {} as any;
283
+ config.modules!.rateLimit!.enabled =
284
+ (process.env.RATE_LIMIT_ENABLED || process.env.MORO_RATE_LIMIT_ENABLED) === 'true';
285
+ }
286
+ if (process.env.DEFAULT_RATE_LIMIT_REQUESTS || process.env.MORO_RATE_LIMIT_REQUESTS) {
287
+ if (!config.modules!.rateLimit) config.modules!.rateLimit = {} as any;
288
+ config.modules!.rateLimit!.defaultRequests = parseInt(
289
+ process.env.DEFAULT_RATE_LIMIT_REQUESTS || process.env.MORO_RATE_LIMIT_REQUESTS || '100',
290
+ 10
291
+ );
292
+ }
293
+ if (process.env.DEFAULT_RATE_LIMIT_WINDOW || process.env.MORO_RATE_LIMIT_WINDOW) {
294
+ if (!config.modules!.rateLimit) config.modules!.rateLimit = {} as any;
295
+ config.modules!.rateLimit!.defaultWindow = parseInt(
296
+ process.env.DEFAULT_RATE_LIMIT_WINDOW || process.env.MORO_RATE_LIMIT_WINDOW || '60000',
297
+ 10
298
+ );
299
+ }
300
+
301
+ // Validation configuration
302
+ if (process.env.VALIDATION_ENABLED || process.env.MORO_VALIDATION_ENABLED) {
303
+ if (!config.modules!.validation) config.modules!.validation = {} as any;
304
+ config.modules!.validation!.enabled =
305
+ (process.env.VALIDATION_ENABLED || process.env.MORO_VALIDATION_ENABLED) === 'true';
306
+ }
307
+
308
+ // Auto-Discovery configuration
309
+ if (process.env.AUTO_DISCOVERY_ENABLED || process.env.MORO_AUTO_DISCOVERY_ENABLED) {
310
+ if (!config.modules!.autoDiscovery) config.modules!.autoDiscovery = {} as any;
311
+ config.modules!.autoDiscovery!.enabled =
312
+ (process.env.AUTO_DISCOVERY_ENABLED || process.env.MORO_AUTO_DISCOVERY_ENABLED) === 'true';
313
+ }
314
+ if (process.env.AUTO_DISCOVERY_PATHS || process.env.MORO_AUTO_DISCOVERY_PATHS) {
315
+ if (!config.modules!.autoDiscovery) config.modules!.autoDiscovery = {} as any;
316
+ const paths = (
317
+ process.env.AUTO_DISCOVERY_PATHS ||
318
+ process.env.MORO_AUTO_DISCOVERY_PATHS ||
319
+ ''
320
+ )
321
+ .split(',')
322
+ .map(p => p.trim())
323
+ .filter(Boolean);
324
+ if (paths.length > 0) {
325
+ config.modules!.autoDiscovery!.paths = paths;
326
+ }
327
+ }
328
+ if (process.env.AUTO_DISCOVERY_PATTERNS || process.env.MORO_AUTO_DISCOVERY_PATTERNS) {
329
+ if (!config.modules!.autoDiscovery) config.modules!.autoDiscovery = {} as any;
330
+ const patterns = (
331
+ process.env.AUTO_DISCOVERY_PATTERNS ||
332
+ process.env.MORO_AUTO_DISCOVERY_PATTERNS ||
333
+ ''
334
+ )
335
+ .split(',')
336
+ .map(p => p.trim())
337
+ .filter(Boolean);
338
+ if (patterns.length > 0) {
339
+ config.modules!.autoDiscovery!.patterns = patterns;
340
+ }
341
+ }
342
+ if (
343
+ process.env.AUTO_DISCOVERY_LOADING_STRATEGY ||
344
+ process.env.MORO_AUTO_DISCOVERY_LOADING_STRATEGY
345
+ ) {
346
+ if (!config.modules!.autoDiscovery) config.modules!.autoDiscovery = {} as any;
347
+ const strategy =
348
+ process.env.AUTO_DISCOVERY_LOADING_STRATEGY ||
349
+ process.env.MORO_AUTO_DISCOVERY_LOADING_STRATEGY;
350
+ if (['eager', 'lazy', 'conditional'].includes(strategy || '')) {
351
+ config.modules!.autoDiscovery!.loadingStrategy = strategy as
352
+ | 'eager'
353
+ | 'lazy'
354
+ | 'conditional';
355
+ }
356
+ }
357
+ if (
358
+ process.env.AUTO_DISCOVERY_WATCH_FOR_CHANGES ||
359
+ process.env.MORO_AUTO_DISCOVERY_WATCH_FOR_CHANGES
360
+ ) {
361
+ if (!config.modules!.autoDiscovery) config.modules!.autoDiscovery = {} as any;
362
+ config.modules!.autoDiscovery!.watchForChanges =
363
+ (process.env.AUTO_DISCOVERY_WATCH_FOR_CHANGES ||
364
+ process.env.MORO_AUTO_DISCOVERY_WATCH_FOR_CHANGES) === 'true';
365
+ }
366
+ if (process.env.AUTO_DISCOVERY_LOAD_ORDER || process.env.MORO_AUTO_DISCOVERY_LOAD_ORDER) {
367
+ if (!config.modules!.autoDiscovery) config.modules!.autoDiscovery = {} as any;
368
+ const loadOrder =
369
+ process.env.AUTO_DISCOVERY_LOAD_ORDER || process.env.MORO_AUTO_DISCOVERY_LOAD_ORDER;
370
+ if (['alphabetical', 'dependency', 'custom'].includes(loadOrder || '')) {
371
+ config.modules!.autoDiscovery!.loadOrder = loadOrder as
372
+ | 'alphabetical'
373
+ | 'dependency'
374
+ | 'custom';
375
+ }
376
+ }
377
+ if (process.env.AUTO_DISCOVERY_FAIL_ON_ERROR || process.env.MORO_AUTO_DISCOVERY_FAIL_ON_ERROR) {
378
+ if (!config.modules!.autoDiscovery) config.modules!.autoDiscovery = {} as any;
379
+ config.modules!.autoDiscovery!.failOnError =
380
+ (process.env.AUTO_DISCOVERY_FAIL_ON_ERROR ||
381
+ process.env.MORO_AUTO_DISCOVERY_FAIL_ON_ERROR) === 'true';
382
+ }
383
+ if (process.env.AUTO_DISCOVERY_MAX_DEPTH || process.env.MORO_AUTO_DISCOVERY_MAX_DEPTH) {
384
+ if (!config.modules!.autoDiscovery) config.modules!.autoDiscovery = {} as any;
385
+ config.modules!.autoDiscovery!.maxDepth = parseInt(
386
+ process.env.AUTO_DISCOVERY_MAX_DEPTH || process.env.MORO_AUTO_DISCOVERY_MAX_DEPTH || '5',
387
+ 10
388
+ );
389
+ }
390
+ }
391
+
392
+ return config;
393
+ }
394
+
395
+ /**
396
+ * Normalize createApp options to match AppConfig structure
397
+ * This handles the flexible createApp API while converting to structured config
398
+ */
399
+ function normalizeCreateAppOptions(options: MoroOptions): Partial<AppConfig> {
400
+ const config: Partial<AppConfig> = {};
401
+
402
+ // Direct config section overrides - merge with existing config
403
+ if (options.server) {
404
+ config.server = { ...config.server, ...options.server } as any;
405
+ }
406
+ if (options.database) {
407
+ config.database = { ...config.database, ...options.database } as any;
408
+ }
409
+ if (options.modules) {
410
+ config.modules = { ...config.modules, ...options.modules } as any;
411
+ }
412
+
413
+ // Handle autoDiscover option (maps to modules.autoDiscovery)
414
+ if (options.autoDiscover !== undefined) {
415
+ const autoDiscoveryConfig =
416
+ typeof options.autoDiscover === 'boolean'
417
+ ? { enabled: options.autoDiscover }
418
+ : options.autoDiscover;
419
+
420
+ config.modules = {
421
+ ...config.modules,
422
+ autoDiscovery: {
423
+ ...DEFAULT_CONFIG.modules.autoDiscovery,
424
+ ...autoDiscoveryConfig,
425
+ },
426
+ } as any;
427
+ }
428
+
429
+ // Handle legacy modulesPath option (maps to modules.autoDiscovery.paths)
430
+ if (options.modulesPath) {
431
+ config.modules = {
432
+ ...config.modules,
433
+ autoDiscovery: {
434
+ ...DEFAULT_CONFIG.modules.autoDiscovery,
435
+ ...(config.modules as any)?.autoDiscovery,
436
+ enabled: true,
437
+ paths: [options.modulesPath],
438
+ },
439
+ } as any;
440
+ }
441
+ // Handle both 'logger' and 'logging' options (logger is an alias)
442
+ if (options.logging) {
443
+ config.logging = { ...config.logging, ...options.logging } as any;
444
+ }
445
+ if ((options as any).logger) {
446
+ config.logging = { ...config.logging, ...(options as any).logger } as any;
447
+ }
448
+ if (options.security) {
449
+ config.security = { ...config.security, ...options.security } as any;
450
+ }
451
+ if (options.external) {
452
+ config.external = { ...config.external, ...options.external } as any;
453
+ }
454
+ if (options.performance) {
455
+ config.performance = { ...config.performance, ...options.performance } as any;
456
+ }
457
+
458
+ // Handle shorthand boolean/object options
459
+ if (options.cors !== undefined) {
460
+ config.security = {
461
+ ...config.security,
462
+ cors:
463
+ typeof options.cors === 'boolean'
464
+ ? { ...DEFAULT_CONFIG.security.cors, enabled: options.cors }
465
+ : { ...DEFAULT_CONFIG.security.cors, ...options.cors },
466
+ } as any;
467
+ }
468
+
469
+ if (options.compression !== undefined) {
470
+ config.performance = {
471
+ ...config.performance,
472
+ compression:
473
+ typeof options.compression === 'boolean'
474
+ ? { ...DEFAULT_CONFIG.performance.compression, enabled: options.compression }
475
+ : { ...DEFAULT_CONFIG.performance.compression, ...options.compression },
476
+ } as any;
477
+ }
478
+
479
+ if (options.helmet !== undefined) {
480
+ config.security = {
481
+ ...config.security,
482
+ helmet:
483
+ typeof options.helmet === 'boolean'
484
+ ? { ...DEFAULT_CONFIG.security.helmet, enabled: options.helmet }
485
+ : { ...DEFAULT_CONFIG.security.helmet, ...options.helmet },
486
+ } as any;
487
+ }
488
+
489
+ return config;
490
+ }
491
+
492
+ /**
493
+ * Check if a config field contains sensitive information
494
+ */
495
+ function isSensitiveField(path: string): boolean {
496
+ const sensitivePatterns = [
497
+ 'password',
498
+ 'secret',
499
+ 'key',
500
+ 'token',
501
+ 'auth',
502
+ 'stripe',
503
+ 'paypal',
504
+ 'smtp.password',
505
+ 'smtp.username',
506
+ 'database.url',
507
+ 'redis.url',
508
+ 'mysql.password',
509
+ ];
510
+
511
+ return sensitivePatterns.some(pattern => path.toLowerCase().includes(pattern.toLowerCase()));
512
+ }
513
+
514
+ /**
515
+ * Deep merge two configuration objects
516
+ * Later object properties override earlier ones
517
+ */
518
+ function deepMerge<T>(target: T, source: Partial<T>): T {
519
+ const result = { ...target };
520
+
521
+ for (const key in source) {
522
+ const sourceValue = source[key];
523
+ const targetValue = result[key];
524
+
525
+ if (
526
+ sourceValue &&
527
+ typeof sourceValue === 'object' &&
528
+ !Array.isArray(sourceValue) &&
529
+ targetValue &&
530
+ typeof targetValue === 'object' &&
531
+ !Array.isArray(targetValue)
532
+ ) {
533
+ (result as any)[key] = deepMerge(targetValue, sourceValue);
534
+ } else if (sourceValue !== undefined) {
535
+ (result as any)[key] = sourceValue;
536
+ }
537
+ }
538
+
539
+ return result;
540
+ }
541
+
542
+ /**
543
+ * Track configuration sources for debugging
544
+ */
545
+ function trackConfigSource(
546
+ config: any,
547
+ sourceMap: Map<string, ConfigSourceInfo>,
548
+ source: ConfigSourceInfo['source'],
549
+ path: string
550
+ ): void {
551
+ function traverse(obj: any, currentPath: string): void {
552
+ for (const key in obj) {
553
+ const value = obj[key];
554
+ const fullPath = currentPath ? `${currentPath}.${key}` : key;
555
+
556
+ if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
557
+ traverse(value, fullPath);
558
+ } else {
559
+ sourceMap.set(fullPath, { source, path, value });
560
+ }
561
+ }
562
+ }
563
+
564
+ traverse(config, '');
565
+ }
566
+
567
+ /**
568
+ * Log configuration sources for debugging
569
+ */
570
+ function logConfigurationSources(sourceMap: Map<string, ConfigSourceInfo>): void {
571
+ const allSources = Array.from(sourceMap.entries()).sort(([a], [b]) => a.localeCompare(b));
572
+ const nonDefaultSources = allSources.filter(([_, info]) => info.source !== 'default');
573
+
574
+ if (process.env.NODE_ENV === 'production') {
575
+ // In production, only show non-default values with sensitive data obfuscated
576
+ if (nonDefaultSources.length > 0) {
577
+ logger.debug(`Configuration overrides loaded (${nonDefaultSources.length} total)`);
578
+
579
+ nonDefaultSources.forEach(([path, info]) => {
580
+ const valueStr = isSensitiveField(path)
581
+ ? '***'
582
+ : typeof info.value === 'object'
583
+ ? JSON.stringify(info.value)
584
+ : String(info.value);
585
+ logger.debug(` ${path}: ${valueStr} (from ${info.source})`);
586
+ });
587
+ } else {
588
+ logger.debug('Using default configuration (no overrides)');
589
+ }
590
+ } else {
591
+ // In development, show all sources for debugging
592
+ logger.debug(`Configuration sources loaded (${allSources.length} total)`);
593
+
594
+ allSources.forEach(([path, info]) => {
595
+ const valueStr =
596
+ typeof info.value === 'object' ? JSON.stringify(info.value) : String(info.value);
597
+ logger.debug(` ${path}: ${valueStr} (from ${info.source})`);
598
+ });
599
+ }
600
+ }