@morojs/moro 1.6.1 → 1.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (575) 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 +202 -185
  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/auth/core.d.ts +78 -0
  97. package/dist/core/middleware/built-in/auth/core.js +358 -0
  98. package/dist/core/middleware/built-in/auth/core.js.map +1 -0
  99. package/dist/core/middleware/built-in/{auth-helpers.js → auth/helpers.js} +12 -23
  100. package/dist/core/middleware/built-in/auth/helpers.js.map +1 -0
  101. package/dist/core/middleware/built-in/auth/hook.d.ts +30 -0
  102. package/dist/core/middleware/built-in/auth/hook.js +99 -0
  103. package/dist/core/middleware/built-in/auth/hook.js.map +1 -0
  104. package/dist/core/middleware/built-in/auth/index.d.ts +7 -0
  105. package/dist/core/middleware/built-in/auth/index.js +15 -0
  106. package/dist/core/middleware/built-in/auth/index.js.map +1 -0
  107. package/dist/core/middleware/built-in/auth/jwt-helpers.d.ts +118 -0
  108. package/dist/core/middleware/built-in/auth/jwt-helpers.js +218 -0
  109. package/dist/core/middleware/built-in/auth/jwt-helpers.js.map +1 -0
  110. package/dist/core/middleware/built-in/auth/middleware.d.ts +23 -0
  111. package/dist/core/middleware/built-in/auth/middleware.js +71 -0
  112. package/dist/core/middleware/built-in/auth/middleware.js.map +1 -0
  113. package/dist/core/middleware/built-in/{auth-providers.d.ts → auth/providers.d.ts} +1 -1
  114. package/dist/core/middleware/built-in/{auth-providers.js → auth/providers.js} +5 -10
  115. package/dist/core/middleware/built-in/auth/providers.js.map +1 -0
  116. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/file.d.ts +1 -1
  117. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/file.js +10 -47
  118. package/dist/core/middleware/built-in/cache/adapters/cache/file.js.map +1 -0
  119. package/dist/core/middleware/built-in/cache/adapters/cache/index.d.ts +5 -0
  120. package/dist/core/middleware/built-in/cache/adapters/cache/index.js +21 -0
  121. package/dist/core/middleware/built-in/cache/adapters/cache/index.js.map +1 -0
  122. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/memory.d.ts +1 -1
  123. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/memory.js +3 -7
  124. package/dist/core/middleware/built-in/cache/adapters/cache/memory.js.map +1 -0
  125. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/redis.d.ts +3 -1
  126. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/redis.js +11 -9
  127. package/dist/core/middleware/built-in/cache/adapters/cache/redis.js.map +1 -0
  128. package/dist/core/middleware/built-in/cache/adapters/index.d.ts +2 -0
  129. package/dist/core/middleware/built-in/cache/adapters/index.js +5 -0
  130. package/dist/core/middleware/built-in/cache/adapters/index.js.map +1 -0
  131. package/dist/core/middleware/built-in/cache/core.d.ts +37 -0
  132. package/dist/core/middleware/built-in/cache/core.js +87 -0
  133. package/dist/core/middleware/built-in/cache/core.js.map +1 -0
  134. package/dist/core/middleware/built-in/cache/hook.d.ts +20 -0
  135. package/dist/core/middleware/built-in/{cache.js → cache/hook.js} +30 -14
  136. package/dist/core/middleware/built-in/cache/hook.js.map +1 -0
  137. package/dist/core/middleware/built-in/cache/index.d.ts +3 -0
  138. package/dist/core/middleware/built-in/cache/index.js +9 -0
  139. package/dist/core/middleware/built-in/cache/index.js.map +1 -0
  140. package/dist/core/middleware/built-in/cache/middleware.d.ts +17 -0
  141. package/dist/core/middleware/built-in/cache/middleware.js +44 -0
  142. package/dist/core/middleware/built-in/cache/middleware.js.map +1 -0
  143. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/azure.d.ts +1 -1
  144. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/azure.js +3 -7
  145. package/dist/core/middleware/built-in/cdn/adapters/cdn/azure.js.map +1 -0
  146. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudflare.d.ts +1 -1
  147. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudflare.js +3 -7
  148. package/dist/core/middleware/built-in/cdn/adapters/cdn/cloudflare.js.map +1 -0
  149. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudfront.d.ts +3 -1
  150. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudfront.js +12 -10
  151. package/dist/core/middleware/built-in/cdn/adapters/cdn/cloudfront.js.map +1 -0
  152. package/dist/core/middleware/built-in/cdn/adapters/cdn/index.d.ts +5 -0
  153. package/dist/core/middleware/built-in/cdn/adapters/cdn/index.js +21 -0
  154. package/dist/core/middleware/built-in/cdn/adapters/cdn/index.js.map +1 -0
  155. package/dist/core/middleware/built-in/cdn/adapters/index.d.ts +2 -0
  156. package/dist/core/middleware/built-in/cdn/adapters/index.js +5 -0
  157. package/dist/core/middleware/built-in/cdn/adapters/index.js.map +1 -0
  158. package/dist/core/middleware/built-in/cdn/core.d.ts +43 -0
  159. package/dist/core/middleware/built-in/cdn/core.js +144 -0
  160. package/dist/core/middleware/built-in/cdn/core.js.map +1 -0
  161. package/dist/core/middleware/built-in/cdn/hook.d.ts +22 -0
  162. package/dist/core/middleware/built-in/cdn/hook.js +70 -0
  163. package/dist/core/middleware/built-in/cdn/hook.js.map +1 -0
  164. package/dist/core/middleware/built-in/cdn/index.d.ts +5 -0
  165. package/dist/core/middleware/built-in/cdn/index.js +11 -0
  166. package/dist/core/middleware/built-in/cdn/index.js.map +1 -0
  167. package/dist/core/middleware/built-in/cdn/middleware.d.ts +21 -0
  168. package/dist/core/middleware/built-in/cdn/middleware.js +52 -0
  169. package/dist/core/middleware/built-in/cdn/middleware.js.map +1 -0
  170. package/dist/core/middleware/built-in/cookie/core.d.ts +37 -0
  171. package/dist/core/middleware/built-in/cookie/core.js +83 -0
  172. package/dist/core/middleware/built-in/cookie/core.js.map +1 -0
  173. package/dist/core/middleware/built-in/cookie/hook.d.ts +20 -0
  174. package/dist/core/middleware/built-in/cookie/hook.js +47 -0
  175. package/dist/core/middleware/built-in/cookie/hook.js.map +1 -0
  176. package/dist/core/middleware/built-in/cookie/index.d.ts +3 -0
  177. package/dist/core/middleware/built-in/cookie/index.js +9 -0
  178. package/dist/core/middleware/built-in/cookie/index.js.map +1 -0
  179. package/dist/core/middleware/built-in/cookie/middleware.d.ts +17 -0
  180. package/dist/core/middleware/built-in/cookie/middleware.js +36 -0
  181. package/dist/core/middleware/built-in/cookie/middleware.js.map +1 -0
  182. package/dist/core/middleware/built-in/cors/core.d.ts +23 -0
  183. package/dist/core/middleware/built-in/cors/core.js +51 -0
  184. package/dist/core/middleware/built-in/cors/core.js.map +1 -0
  185. package/dist/core/middleware/built-in/cors/hook.d.ts +17 -0
  186. package/dist/core/middleware/built-in/cors/hook.js +37 -0
  187. package/dist/core/middleware/built-in/cors/hook.js.map +1 -0
  188. package/dist/core/middleware/built-in/cors/index.d.ts +3 -0
  189. package/dist/core/middleware/built-in/cors/index.js +9 -0
  190. package/dist/core/middleware/built-in/cors/index.js.map +1 -0
  191. package/dist/core/middleware/built-in/cors/middleware.d.ts +16 -0
  192. package/dist/core/middleware/built-in/cors/middleware.js +22 -0
  193. package/dist/core/middleware/built-in/cors/middleware.js.map +1 -0
  194. package/dist/core/middleware/built-in/csp/core.d.ts +45 -0
  195. package/dist/core/middleware/built-in/csp/core.js +88 -0
  196. package/dist/core/middleware/built-in/csp/core.js.map +1 -0
  197. package/dist/core/middleware/built-in/csp/hook.d.ts +22 -0
  198. package/dist/core/middleware/built-in/csp/hook.js +47 -0
  199. package/dist/core/middleware/built-in/csp/hook.js.map +1 -0
  200. package/dist/core/middleware/built-in/csp/index.d.ts +3 -0
  201. package/dist/core/middleware/built-in/csp/index.js +9 -0
  202. package/dist/core/middleware/built-in/csp/index.js.map +1 -0
  203. package/dist/core/middleware/built-in/csp/middleware.d.ts +19 -0
  204. package/dist/core/middleware/built-in/csp/middleware.js +29 -0
  205. package/dist/core/middleware/built-in/csp/middleware.js.map +1 -0
  206. package/dist/core/middleware/built-in/csrf/core.d.ts +28 -0
  207. package/dist/core/middleware/built-in/csrf/core.js +69 -0
  208. package/dist/core/middleware/built-in/csrf/core.js.map +1 -0
  209. package/dist/core/middleware/built-in/csrf/hook.d.ts +17 -0
  210. package/dist/core/middleware/built-in/csrf/hook.js +45 -0
  211. package/dist/core/middleware/built-in/csrf/hook.js.map +1 -0
  212. package/dist/core/middleware/built-in/csrf/index.d.ts +3 -0
  213. package/dist/core/middleware/built-in/csrf/index.js +9 -0
  214. package/dist/core/middleware/built-in/csrf/index.js.map +1 -0
  215. package/dist/core/middleware/built-in/csrf/middleware.d.ts +16 -0
  216. package/dist/core/middleware/built-in/csrf/middleware.js +34 -0
  217. package/dist/core/middleware/built-in/csrf/middleware.js.map +1 -0
  218. package/dist/core/middleware/built-in/error-tracker/index.d.ts +1 -0
  219. package/dist/core/middleware/built-in/error-tracker/index.js +4 -0
  220. package/dist/core/middleware/built-in/error-tracker/index.js.map +1 -0
  221. package/dist/core/middleware/built-in/error-tracker/middleware.d.ts +12 -0
  222. package/dist/core/middleware/built-in/error-tracker/middleware.js +26 -0
  223. package/dist/core/middleware/built-in/error-tracker/middleware.js.map +1 -0
  224. package/dist/core/middleware/built-in/index.d.ts +28 -61
  225. package/dist/core/middleware/built-in/index.js +48 -78
  226. package/dist/core/middleware/built-in/index.js.map +1 -1
  227. package/dist/core/middleware/built-in/performance-monitor/index.d.ts +1 -0
  228. package/dist/core/middleware/built-in/performance-monitor/index.js +4 -0
  229. package/dist/core/middleware/built-in/performance-monitor/index.js.map +1 -0
  230. package/dist/core/middleware/built-in/performance-monitor/middleware.d.ts +12 -0
  231. package/dist/core/middleware/built-in/performance-monitor/middleware.js +29 -0
  232. package/dist/core/middleware/built-in/performance-monitor/middleware.js.map +1 -0
  233. package/dist/core/middleware/built-in/rate-limit/core.d.ts +33 -0
  234. package/dist/core/middleware/built-in/rate-limit/core.js +86 -0
  235. package/dist/core/middleware/built-in/rate-limit/core.js.map +1 -0
  236. package/dist/core/middleware/built-in/rate-limit/hook.d.ts +20 -0
  237. package/dist/core/middleware/built-in/{rate-limit.js → rate-limit/hook.js} +24 -22
  238. package/dist/core/middleware/built-in/rate-limit/hook.js.map +1 -0
  239. package/dist/core/middleware/built-in/rate-limit/index.d.ts +3 -0
  240. package/dist/core/middleware/built-in/rate-limit/index.js +9 -0
  241. package/dist/core/middleware/built-in/rate-limit/index.js.map +1 -0
  242. package/dist/core/middleware/built-in/rate-limit/middleware.d.ts +16 -0
  243. package/dist/core/middleware/built-in/rate-limit/middleware.js +35 -0
  244. package/dist/core/middleware/built-in/rate-limit/middleware.js.map +1 -0
  245. package/dist/core/middleware/built-in/request-logger/index.d.ts +1 -0
  246. package/dist/core/middleware/built-in/request-logger/index.js +4 -0
  247. package/dist/core/middleware/built-in/request-logger/index.js.map +1 -0
  248. package/dist/core/middleware/built-in/request-logger/middleware.d.ts +12 -0
  249. package/dist/core/middleware/built-in/request-logger/middleware.js +24 -0
  250. package/dist/core/middleware/built-in/request-logger/middleware.js.map +1 -0
  251. package/dist/core/middleware/built-in/session/core.d.ts +73 -0
  252. package/dist/core/middleware/built-in/session/core.js +227 -0
  253. package/dist/core/middleware/built-in/session/core.js.map +1 -0
  254. package/dist/core/middleware/built-in/session/hook.d.ts +17 -0
  255. package/dist/core/middleware/built-in/session/hook.js +53 -0
  256. package/dist/core/middleware/built-in/session/hook.js.map +1 -0
  257. package/dist/core/middleware/built-in/session/index.d.ts +3 -0
  258. package/dist/core/middleware/built-in/session/index.js +9 -0
  259. package/dist/core/middleware/built-in/session/index.js.map +1 -0
  260. package/dist/core/middleware/built-in/session/middleware.d.ts +17 -0
  261. package/dist/core/middleware/built-in/session/middleware.js +38 -0
  262. package/dist/core/middleware/built-in/session/middleware.js.map +1 -0
  263. package/dist/core/middleware/built-in/sse/core.d.ts +44 -0
  264. package/dist/core/middleware/built-in/sse/core.js +117 -0
  265. package/dist/core/middleware/built-in/sse/core.js.map +1 -0
  266. package/dist/core/middleware/built-in/sse/hook.d.ts +18 -0
  267. package/dist/core/middleware/built-in/sse/hook.js +60 -0
  268. package/dist/core/middleware/built-in/sse/hook.js.map +1 -0
  269. package/dist/core/middleware/built-in/sse/index.d.ts +3 -0
  270. package/dist/core/middleware/built-in/sse/index.js +9 -0
  271. package/dist/core/middleware/built-in/sse/index.js.map +1 -0
  272. package/dist/core/middleware/built-in/sse/middleware.d.ts +18 -0
  273. package/dist/core/middleware/built-in/sse/middleware.js +43 -0
  274. package/dist/core/middleware/built-in/sse/middleware.js.map +1 -0
  275. package/dist/core/middleware/built-in/validation/core.d.ts +23 -0
  276. package/dist/core/middleware/built-in/validation/core.js +93 -0
  277. package/dist/core/middleware/built-in/validation/core.js.map +1 -0
  278. package/dist/core/middleware/built-in/validation/hook.d.ts +13 -0
  279. package/dist/core/middleware/built-in/{validation.js → validation/hook.js} +16 -9
  280. package/dist/core/middleware/built-in/validation/hook.js.map +1 -0
  281. package/dist/core/middleware/built-in/validation/index.d.ts +3 -0
  282. package/dist/core/middleware/built-in/validation/index.js +9 -0
  283. package/dist/core/middleware/built-in/validation/index.js.map +1 -0
  284. package/dist/core/middleware/built-in/validation/middleware.d.ts +16 -0
  285. package/dist/core/middleware/built-in/validation/middleware.js +27 -0
  286. package/dist/core/middleware/built-in/validation/middleware.js.map +1 -0
  287. package/dist/core/middleware/index.d.ts +4 -4
  288. package/dist/core/middleware/index.js +14 -28
  289. package/dist/core/middleware/index.js.map +1 -1
  290. package/dist/core/modules/auto-discovery.d.ts +19 -2
  291. package/dist/core/modules/auto-discovery.js +391 -74
  292. package/dist/core/modules/auto-discovery.js.map +1 -1
  293. package/dist/core/modules/index.d.ts +2 -2
  294. package/dist/core/modules/index.js +2 -9
  295. package/dist/core/modules/index.js.map +1 -1
  296. package/dist/core/modules/modules.d.ts +3 -3
  297. package/dist/core/modules/modules.js +23 -54
  298. package/dist/core/modules/modules.js.map +1 -1
  299. package/dist/core/networking/adapters/index.d.ts +4 -3
  300. package/dist/core/networking/adapters/index.js +3 -7
  301. package/dist/core/networking/adapters/index.js.map +1 -1
  302. package/dist/core/networking/adapters/socketio-adapter.d.ts +1 -1
  303. package/dist/core/networking/adapters/socketio-adapter.js +5 -40
  304. package/dist/core/networking/adapters/socketio-adapter.js.map +1 -1
  305. package/dist/core/networking/adapters/uws-adapter.d.ts +44 -0
  306. package/dist/core/networking/adapters/uws-adapter.js +513 -0
  307. package/dist/core/networking/adapters/uws-adapter.js.map +1 -0
  308. package/dist/core/networking/adapters/ws-adapter.d.ts +2 -2
  309. package/dist/core/networking/adapters/ws-adapter.js +8 -43
  310. package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
  311. package/dist/core/networking/index.d.ts +3 -2
  312. package/dist/core/networking/index.js +2 -7
  313. package/dist/core/networking/index.js.map +1 -1
  314. package/dist/core/networking/service-discovery.js +8 -12
  315. package/dist/core/networking/service-discovery.js.map +1 -1
  316. package/dist/core/networking/websocket-adapter.js +1 -2
  317. package/dist/core/networking/websocket-adapter.js.map +1 -1
  318. package/dist/core/networking/websocket-manager.d.ts +3 -3
  319. package/dist/core/networking/websocket-manager.js +9 -11
  320. package/dist/core/networking/websocket-manager.js.map +1 -1
  321. package/dist/core/pooling/object-pool-manager.d.ts +140 -0
  322. package/dist/core/pooling/object-pool-manager.js +502 -0
  323. package/dist/core/pooling/object-pool-manager.js.map +1 -0
  324. package/dist/core/routing/app-integration.d.ts +14 -12
  325. package/dist/core/routing/app-integration.js +49 -85
  326. package/dist/core/routing/app-integration.js.map +1 -1
  327. package/dist/core/routing/index.d.ts +17 -11
  328. package/dist/core/routing/index.js +48 -237
  329. package/dist/core/routing/index.js.map +1 -1
  330. package/dist/core/routing/path-matcher.d.ts +67 -0
  331. package/dist/core/routing/path-matcher.js +182 -0
  332. package/dist/core/routing/path-matcher.js.map +1 -0
  333. package/dist/core/routing/router.d.ts +38 -0
  334. package/dist/core/routing/router.js +68 -0
  335. package/dist/core/routing/router.js.map +1 -0
  336. package/dist/core/routing/unified-router.d.ts +132 -0
  337. package/dist/core/routing/unified-router.js +639 -0
  338. package/dist/core/routing/unified-router.js.map +1 -0
  339. package/dist/core/runtime/aws-lambda-adapter.d.ts +3 -3
  340. package/dist/core/runtime/aws-lambda-adapter.js +2 -6
  341. package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
  342. package/dist/core/runtime/base-adapter.d.ts +2 -2
  343. package/dist/core/runtime/base-adapter.js +3 -7
  344. package/dist/core/runtime/base-adapter.js.map +1 -1
  345. package/dist/core/runtime/cloudflare-workers-adapter.d.ts +3 -3
  346. package/dist/core/runtime/cloudflare-workers-adapter.js +2 -6
  347. package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
  348. package/dist/core/runtime/index.d.ts +12 -12
  349. package/dist/core/runtime/index.js +22 -35
  350. package/dist/core/runtime/index.js.map +1 -1
  351. package/dist/core/runtime/node-adapter.d.ts +4 -4
  352. package/dist/core/runtime/node-adapter.js +18 -49
  353. package/dist/core/runtime/node-adapter.js.map +1 -1
  354. package/dist/core/runtime/vercel-edge-adapter.d.ts +3 -3
  355. package/dist/core/runtime/vercel-edge-adapter.js +2 -6
  356. package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
  357. package/dist/core/utilities/circuit-breaker.js +1 -5
  358. package/dist/core/utilities/circuit-breaker.js.map +1 -1
  359. package/dist/core/utilities/container.js +12 -22
  360. package/dist/core/utilities/container.js.map +1 -1
  361. package/dist/core/utilities/hooks.d.ts +2 -2
  362. package/dist/core/utilities/hooks.js +7 -12
  363. package/dist/core/utilities/hooks.js.map +1 -1
  364. package/dist/core/utilities/index.d.ts +5 -4
  365. package/dist/core/utilities/index.js +5 -19
  366. package/dist/core/utilities/index.js.map +1 -1
  367. package/dist/core/utilities/package-utils.d.ts +38 -0
  368. package/dist/core/utilities/package-utils.js +57 -0
  369. package/dist/core/utilities/package-utils.js.map +1 -0
  370. package/dist/core/validation/adapters.d.ts +1 -1
  371. package/dist/core/validation/adapters.js +15 -26
  372. package/dist/core/validation/adapters.js.map +1 -1
  373. package/dist/core/validation/index.d.ts +6 -4
  374. package/dist/core/validation/index.js +57 -28
  375. package/dist/core/validation/index.js.map +1 -1
  376. package/dist/core/validation/schema-interface.js +3 -9
  377. package/dist/core/validation/schema-interface.js.map +1 -1
  378. package/dist/index.d.ts +52 -52
  379. package/dist/index.js +24 -132
  380. package/dist/index.js.map +1 -1
  381. package/dist/moro.d.ts +70 -16
  382. package/dist/moro.js +650 -269
  383. package/dist/moro.js.map +1 -1
  384. package/dist/types/auth.js +3 -9
  385. package/dist/types/auth.js.map +1 -1
  386. package/dist/types/cache.js +1 -2
  387. package/dist/types/cdn.js +1 -2
  388. package/dist/types/config.d.ts +73 -2
  389. package/dist/types/config.js +1 -2
  390. package/dist/types/config.js.map +1 -1
  391. package/dist/types/core.d.ts +36 -42
  392. package/dist/types/core.js +1 -2
  393. package/dist/types/database.js +1 -2
  394. package/dist/types/discovery.js +1 -2
  395. package/dist/types/events.js +1 -2
  396. package/dist/types/hooks.d.ts +4 -1
  397. package/dist/types/hooks.js +1 -2
  398. package/dist/types/http.d.ts +16 -1
  399. package/dist/types/http.js +1 -2
  400. package/dist/types/logger.d.ts +7 -0
  401. package/dist/types/logger.js +1 -2
  402. package/dist/types/module.d.ts +11 -0
  403. package/dist/types/module.js +1 -2
  404. package/dist/types/runtime.d.ts +1 -1
  405. package/dist/types/runtime.js +1 -2
  406. package/dist/types/session.js +1 -2
  407. package/package.json +18 -55
  408. package/dist/core/config/loader.d.ts +0 -7
  409. package/dist/core/config/loader.js +0 -269
  410. package/dist/core/config/loader.js.map +0 -1
  411. package/dist/core/config/validation.d.ts +0 -17
  412. package/dist/core/config/validation.js +0 -131
  413. package/dist/core/config/validation.js.map +0 -1
  414. package/dist/core/http/router.d.ts +0 -14
  415. package/dist/core/http/router.js +0 -109
  416. package/dist/core/http/router.js.map +0 -1
  417. package/dist/core/middleware/built-in/adapters/cache/file.js.map +0 -1
  418. package/dist/core/middleware/built-in/adapters/cache/index.d.ts +0 -5
  419. package/dist/core/middleware/built-in/adapters/cache/index.js +0 -28
  420. package/dist/core/middleware/built-in/adapters/cache/index.js.map +0 -1
  421. package/dist/core/middleware/built-in/adapters/cache/memory.js.map +0 -1
  422. package/dist/core/middleware/built-in/adapters/cache/redis.js.map +0 -1
  423. package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +0 -1
  424. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +0 -1
  425. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +0 -1
  426. package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +0 -5
  427. package/dist/core/middleware/built-in/adapters/cdn/index.js +0 -28
  428. package/dist/core/middleware/built-in/adapters/cdn/index.js.map +0 -1
  429. package/dist/core/middleware/built-in/adapters/index.d.ts +0 -4
  430. package/dist/core/middleware/built-in/adapters/index.js +0 -26
  431. package/dist/core/middleware/built-in/adapters/index.js.map +0 -1
  432. package/dist/core/middleware/built-in/auth-helpers.js.map +0 -1
  433. package/dist/core/middleware/built-in/auth-providers.js.map +0 -1
  434. package/dist/core/middleware/built-in/auth.d.ts +0 -30
  435. package/dist/core/middleware/built-in/auth.js +0 -281
  436. package/dist/core/middleware/built-in/auth.js.map +0 -1
  437. package/dist/core/middleware/built-in/cache.d.ts +0 -3
  438. package/dist/core/middleware/built-in/cache.js.map +0 -1
  439. package/dist/core/middleware/built-in/cdn.d.ts +0 -3
  440. package/dist/core/middleware/built-in/cdn.js +0 -113
  441. package/dist/core/middleware/built-in/cdn.js.map +0 -1
  442. package/dist/core/middleware/built-in/cookie.d.ts +0 -14
  443. package/dist/core/middleware/built-in/cookie.js +0 -68
  444. package/dist/core/middleware/built-in/cookie.js.map +0 -1
  445. package/dist/core/middleware/built-in/cors.d.ts +0 -2
  446. package/dist/core/middleware/built-in/cors.js +0 -29
  447. package/dist/core/middleware/built-in/cors.js.map +0 -1
  448. package/dist/core/middleware/built-in/csp.d.ts +0 -22
  449. package/dist/core/middleware/built-in/csp.js +0 -71
  450. package/dist/core/middleware/built-in/csp.js.map +0 -1
  451. package/dist/core/middleware/built-in/csrf.d.ts +0 -9
  452. package/dist/core/middleware/built-in/csrf.js +0 -63
  453. package/dist/core/middleware/built-in/csrf.js.map +0 -1
  454. package/dist/core/middleware/built-in/error-tracker.d.ts +0 -1
  455. package/dist/core/middleware/built-in/error-tracker.js +0 -19
  456. package/dist/core/middleware/built-in/error-tracker.js.map +0 -1
  457. package/dist/core/middleware/built-in/performance-monitor.d.ts +0 -1
  458. package/dist/core/middleware/built-in/performance-monitor.js +0 -22
  459. package/dist/core/middleware/built-in/performance-monitor.js.map +0 -1
  460. package/dist/core/middleware/built-in/rate-limit.d.ts +0 -6
  461. package/dist/core/middleware/built-in/rate-limit.js.map +0 -1
  462. package/dist/core/middleware/built-in/request-logger.d.ts +0 -1
  463. package/dist/core/middleware/built-in/request-logger.js +0 -16
  464. package/dist/core/middleware/built-in/request-logger.js.map +0 -1
  465. package/dist/core/middleware/built-in/session.d.ts +0 -41
  466. package/dist/core/middleware/built-in/session.js +0 -209
  467. package/dist/core/middleware/built-in/session.js.map +0 -1
  468. package/dist/core/middleware/built-in/sse.d.ts +0 -6
  469. package/dist/core/middleware/built-in/sse.js +0 -71
  470. package/dist/core/middleware/built-in/sse.js.map +0 -1
  471. package/dist/core/middleware/built-in/validation.d.ts +0 -2
  472. package/dist/core/middleware/built-in/validation.js.map +0 -1
  473. package/src/core/auth/README.md +0 -339
  474. package/src/core/auth/morojs-adapter.ts +0 -410
  475. package/src/core/config/file-loader.ts +0 -407
  476. package/src/core/config/index.ts +0 -60
  477. package/src/core/config/loader.ts +0 -633
  478. package/src/core/config/schema.ts +0 -150
  479. package/src/core/config/utils.ts +0 -251
  480. package/src/core/config/validation.ts +0 -140
  481. package/src/core/database/README.md +0 -228
  482. package/src/core/database/adapters/drizzle.ts +0 -403
  483. package/src/core/database/adapters/index.ts +0 -42
  484. package/src/core/database/adapters/mongodb.ts +0 -269
  485. package/src/core/database/adapters/mysql.ts +0 -207
  486. package/src/core/database/adapters/postgresql.ts +0 -201
  487. package/src/core/database/adapters/redis.ts +0 -326
  488. package/src/core/database/adapters/sqlite.ts +0 -247
  489. package/src/core/database/index.ts +0 -3
  490. package/src/core/docs/index.ts +0 -231
  491. package/src/core/docs/openapi-generator.ts +0 -576
  492. package/src/core/docs/schema-to-openapi.ts +0 -148
  493. package/src/core/docs/simple-docs.ts +0 -295
  494. package/src/core/docs/swagger-ui.ts +0 -351
  495. package/src/core/docs/zod-to-openapi.ts +0 -532
  496. package/src/core/events/event-bus.ts +0 -231
  497. package/src/core/events/index.ts +0 -12
  498. package/src/core/framework.ts +0 -636
  499. package/src/core/http/http-server.ts +0 -1787
  500. package/src/core/http/index.ts +0 -6
  501. package/src/core/http/router.ts +0 -141
  502. package/src/core/logger/filters.ts +0 -145
  503. package/src/core/logger/index.ts +0 -20
  504. package/src/core/logger/logger.ts +0 -814
  505. package/src/core/logger/outputs.ts +0 -134
  506. package/src/core/middleware/built-in/adapters/cache/file.ts +0 -104
  507. package/src/core/middleware/built-in/adapters/cache/index.ts +0 -23
  508. package/src/core/middleware/built-in/adapters/cache/memory.ts +0 -73
  509. package/src/core/middleware/built-in/adapters/cache/redis.ts +0 -100
  510. package/src/core/middleware/built-in/adapters/cdn/azure.ts +0 -60
  511. package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +0 -83
  512. package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +0 -83
  513. package/src/core/middleware/built-in/adapters/cdn/index.ts +0 -23
  514. package/src/core/middleware/built-in/adapters/index.ts +0 -7
  515. package/src/core/middleware/built-in/auth-helpers.ts +0 -401
  516. package/src/core/middleware/built-in/auth-providers.ts +0 -480
  517. package/src/core/middleware/built-in/auth.ts +0 -329
  518. package/src/core/middleware/built-in/cache.ts +0 -211
  519. package/src/core/middleware/built-in/cdn.ts +0 -124
  520. package/src/core/middleware/built-in/cookie.ts +0 -85
  521. package/src/core/middleware/built-in/cors.ts +0 -38
  522. package/src/core/middleware/built-in/csp.ts +0 -101
  523. package/src/core/middleware/built-in/csrf.ts +0 -82
  524. package/src/core/middleware/built-in/error-tracker.ts +0 -16
  525. package/src/core/middleware/built-in/index.ts +0 -79
  526. package/src/core/middleware/built-in/performance-monitor.ts +0 -25
  527. package/src/core/middleware/built-in/rate-limit.ts +0 -60
  528. package/src/core/middleware/built-in/request-logger.ts +0 -14
  529. package/src/core/middleware/built-in/session.ts +0 -288
  530. package/src/core/middleware/built-in/sse.ts +0 -86
  531. package/src/core/middleware/built-in/validation.ts +0 -33
  532. package/src/core/middleware/index.ts +0 -177
  533. package/src/core/modules/auto-discovery.ts +0 -263
  534. package/src/core/modules/index.ts +0 -3
  535. package/src/core/modules/modules.ts +0 -124
  536. package/src/core/networking/adapters/index.ts +0 -16
  537. package/src/core/networking/adapters/socketio-adapter.ts +0 -252
  538. package/src/core/networking/adapters/ws-adapter.ts +0 -430
  539. package/src/core/networking/index.ts +0 -3
  540. package/src/core/networking/service-discovery.ts +0 -304
  541. package/src/core/networking/websocket-adapter.ts +0 -217
  542. package/src/core/networking/websocket-manager.ts +0 -308
  543. package/src/core/routing/app-integration.ts +0 -216
  544. package/src/core/routing/index.ts +0 -488
  545. package/src/core/runtime/aws-lambda-adapter.ts +0 -147
  546. package/src/core/runtime/base-adapter.ts +0 -130
  547. package/src/core/runtime/cloudflare-workers-adapter.ts +0 -152
  548. package/src/core/runtime/index.ts +0 -62
  549. package/src/core/runtime/node-adapter.ts +0 -196
  550. package/src/core/runtime/vercel-edge-adapter.ts +0 -114
  551. package/src/core/utilities/circuit-breaker.ts +0 -46
  552. package/src/core/utilities/container.ts +0 -736
  553. package/src/core/utilities/hooks.ts +0 -142
  554. package/src/core/utilities/index.ts +0 -16
  555. package/src/core/validation/adapters.ts +0 -147
  556. package/src/core/validation/index.ts +0 -206
  557. package/src/core/validation/schema-interface.ts +0 -100
  558. package/src/index.ts +0 -226
  559. package/src/moro.ts +0 -1197
  560. package/src/types/auth.ts +0 -440
  561. package/src/types/cache.ts +0 -38
  562. package/src/types/cdn.ts +0 -22
  563. package/src/types/config.ts +0 -157
  564. package/src/types/core.ts +0 -56
  565. package/src/types/database.ts +0 -32
  566. package/src/types/discovery.ts +0 -7
  567. package/src/types/events.ts +0 -82
  568. package/src/types/hooks.ts +0 -47
  569. package/src/types/http.ts +0 -67
  570. package/src/types/logger.ts +0 -93
  571. package/src/types/module.ts +0 -87
  572. package/src/types/runtime.ts +0 -76
  573. package/src/types/session.ts +0 -89
  574. package/tsconfig.json +0 -21
  575. /package/dist/core/middleware/built-in/{auth-helpers.d.ts → auth/helpers.d.ts} +0 -0
@@ -0,0 +1,791 @@
1
+ /**
2
+ * Configuration Validator - Type-Safe Schema Validation
3
+ *
4
+ * This module provides runtime validation for configuration objects using
5
+ * simple TypeScript functions that match the type definitions exactly.
6
+ */
7
+ import { createFrameworkLogger } from '../logger/index.js';
8
+ const logger = createFrameworkLogger('ConfigValidator');
9
+ /**
10
+ * Configuration validation error with detailed context
11
+ */
12
+ export class ConfigValidationError extends Error {
13
+ field;
14
+ value;
15
+ expectedType;
16
+ constructor(field, value, expectedType, message) {
17
+ super(`Configuration validation failed for '${field}': ${message}`);
18
+ this.field = field;
19
+ this.value = value;
20
+ this.expectedType = expectedType;
21
+ this.name = 'ConfigValidationError';
22
+ }
23
+ }
24
+ /**
25
+ * Validate and normalize a complete configuration object
26
+ * This ensures type safety and provides helpful error messages
27
+ */
28
+ export function validateConfig(config) {
29
+ logger.debug('Validating configuration');
30
+ try {
31
+ const validatedConfig = {
32
+ server: validateServerConfig(config.server, 'server'),
33
+ serviceDiscovery: validateServiceDiscoveryConfig(config.serviceDiscovery, 'serviceDiscovery'),
34
+ database: validateDatabaseConfig(config.database, 'database'),
35
+ modules: validateModuleDefaultsConfig(config.modules, 'modules'),
36
+ logging: validateLoggingConfig(config.logging, 'logging'),
37
+ security: validateSecurityConfig(config.security, 'security'),
38
+ external: validateExternalServicesConfig(config.external, 'external'),
39
+ performance: validatePerformanceConfig(config.performance, 'performance'),
40
+ websocket: validateWebSocketConfig(config.websocket, 'websocket'),
41
+ };
42
+ logger.debug('Configuration validation successful');
43
+ return validatedConfig;
44
+ }
45
+ catch (error) {
46
+ if (error instanceof ConfigValidationError) {
47
+ logger.error(`❌ Configuration validation failed for '${error.field}':`, error.message);
48
+ // Provide helpful hints
49
+ provideValidationHints(error);
50
+ throw error;
51
+ }
52
+ logger.error('❌ Unexpected configuration validation error:', String(error));
53
+ throw new Error(`Configuration validation failed: ${String(error)}`);
54
+ }
55
+ }
56
+ /**
57
+ * Validate server configuration
58
+ */
59
+ function validateServerConfig(config, path) {
60
+ if (!config || typeof config !== 'object') {
61
+ throw new ConfigValidationError(path, config, 'object', 'Server configuration must be an object');
62
+ }
63
+ const result = {
64
+ port: validatePort(config.port, `${path}.port`),
65
+ host: validateString(config.host, `${path}.host`),
66
+ maxConnections: validateNumber(config.maxConnections, `${path}.maxConnections`, { min: 1 }),
67
+ timeout: validateNumber(config.timeout, `${path}.timeout`, { min: 1000 }),
68
+ bodySizeLimit: validateString(config.bodySizeLimit, `${path}.bodySizeLimit`),
69
+ requestTracking: {
70
+ enabled: validateBoolean(config.requestTracking?.enabled, `${path}.requestTracking.enabled`),
71
+ },
72
+ requestLogging: {
73
+ enabled: validateBoolean(config.requestLogging?.enabled, `${path}.requestLogging.enabled`),
74
+ },
75
+ errorBoundary: {
76
+ enabled: validateBoolean(config.errorBoundary?.enabled, `${path}.errorBoundary.enabled`),
77
+ },
78
+ };
79
+ // Optional uWebSockets configuration
80
+ if (config.useUWebSockets !== undefined) {
81
+ result.useUWebSockets = validateBoolean(config.useUWebSockets, `${path}.useUWebSockets`);
82
+ }
83
+ // Optional SSL configuration
84
+ if (config.ssl !== undefined) {
85
+ result.ssl = validateSSLConfig(config.ssl, `${path}.ssl`);
86
+ }
87
+ return result;
88
+ }
89
+ /**
90
+ * Validate SSL configuration
91
+ */
92
+ function validateSSLConfig(config, path) {
93
+ if (!config || typeof config !== 'object') {
94
+ throw new ConfigValidationError(path, config, 'object', 'SSL configuration must be an object');
95
+ }
96
+ const result = {};
97
+ if (config.key_file_name !== undefined) {
98
+ result.key_file_name = validateString(config.key_file_name, `${path}.key_file_name`);
99
+ }
100
+ if (config.cert_file_name !== undefined) {
101
+ result.cert_file_name = validateString(config.cert_file_name, `${path}.cert_file_name`);
102
+ }
103
+ if (config.passphrase !== undefined) {
104
+ result.passphrase = validateString(config.passphrase, `${path}.passphrase`);
105
+ }
106
+ return result;
107
+ }
108
+ /**
109
+ * Validate service discovery configuration
110
+ */
111
+ function validateServiceDiscoveryConfig(config, path) {
112
+ if (!config || typeof config !== 'object') {
113
+ throw new ConfigValidationError(path, config, 'object', 'Service discovery configuration must be an object');
114
+ }
115
+ return {
116
+ enabled: validateBoolean(config.enabled, `${path}.enabled`),
117
+ type: validateEnum(config.type, ['memory', 'consul', 'kubernetes'], `${path}.type`),
118
+ consulUrl: validateString(config.consulUrl, `${path}.consulUrl`),
119
+ kubernetesNamespace: validateString(config.kubernetesNamespace, `${path}.kubernetesNamespace`),
120
+ healthCheckInterval: validateNumber(config.healthCheckInterval, `${path}.healthCheckInterval`, {
121
+ min: 1000,
122
+ }),
123
+ retryAttempts: validateNumber(config.retryAttempts, `${path}.retryAttempts`, { min: 0 }),
124
+ };
125
+ }
126
+ /**
127
+ * Validate database configuration
128
+ */
129
+ function validateDatabaseConfig(config, path) {
130
+ if (!config || typeof config !== 'object') {
131
+ throw new ConfigValidationError(path, config, 'object', 'Database configuration must be an object');
132
+ }
133
+ const result = {};
134
+ // Optional URL
135
+ if (config.url !== undefined) {
136
+ result.url = validateString(config.url, `${path}.url`);
137
+ }
138
+ // Optional Redis - only validate if present
139
+ if (config.redis !== undefined) {
140
+ result.redis = validateRedisConfig(config.redis, `${path}.redis`);
141
+ }
142
+ // Optional MySQL - only validate if present
143
+ if (config.mysql !== undefined) {
144
+ result.mysql = validateMySQLConfig(config.mysql, `${path}.mysql`);
145
+ }
146
+ // Optional PostgreSQL - only validate if present
147
+ if (config.postgresql !== undefined) {
148
+ result.postgresql = validatePostgreSQLConfig(config.postgresql, `${path}.postgresql`);
149
+ }
150
+ // Optional SQLite - only validate if present
151
+ if (config.sqlite !== undefined) {
152
+ result.sqlite = validateSQLiteConfig(config.sqlite, `${path}.sqlite`);
153
+ }
154
+ // Optional MongoDB - only validate if present
155
+ if (config.mongodb !== undefined) {
156
+ result.mongodb = validateMongoDBConfig(config.mongodb, `${path}.mongodb`);
157
+ }
158
+ return result;
159
+ }
160
+ /**
161
+ * Validate Redis configuration
162
+ */
163
+ function validateRedisConfig(config, path) {
164
+ if (!config || typeof config !== 'object') {
165
+ throw new ConfigValidationError(path, config, 'object', 'Redis configuration must be an object');
166
+ }
167
+ return {
168
+ url: validateString(config.url, `${path}.url`),
169
+ maxRetries: validateNumber(config.maxRetries, `${path}.maxRetries`, { min: 0 }),
170
+ retryDelay: validateNumber(config.retryDelay, `${path}.retryDelay`, { min: 0 }),
171
+ keyPrefix: validateString(config.keyPrefix, `${path}.keyPrefix`),
172
+ };
173
+ }
174
+ /**
175
+ * Validate MySQL configuration
176
+ */
177
+ function validateMySQLConfig(config, path) {
178
+ if (!config || typeof config !== 'object') {
179
+ throw new ConfigValidationError(path, config, 'object', 'MySQL configuration must be an object');
180
+ }
181
+ const result = {
182
+ host: validateString(config.host, `${path}.host`),
183
+ port: validatePort(config.port, `${path}.port`),
184
+ connectionLimit: validateNumber(config.connectionLimit, `${path}.connectionLimit`, { min: 1 }),
185
+ acquireTimeout: validateNumber(config.acquireTimeout, `${path}.acquireTimeout`, { min: 1000 }),
186
+ timeout: validateNumber(config.timeout, `${path}.timeout`, { min: 1000 }),
187
+ };
188
+ // Optional fields
189
+ if (config.database !== undefined) {
190
+ result.database = validateString(config.database, `${path}.database`);
191
+ }
192
+ if (config.username !== undefined) {
193
+ result.username = validateString(config.username, `${path}.username`);
194
+ }
195
+ if (config.password !== undefined) {
196
+ result.password = validateString(config.password, `${path}.password`);
197
+ }
198
+ return result;
199
+ }
200
+ /**
201
+ * Validate PostgreSQL configuration
202
+ */
203
+ function validatePostgreSQLConfig(config, path) {
204
+ if (!config || typeof config !== 'object') {
205
+ throw new ConfigValidationError(path, config, 'object', 'PostgreSQL configuration must be an object');
206
+ }
207
+ const result = {
208
+ host: validateString(config.host, `${path}.host`),
209
+ port: validatePort(config.port, `${path}.port`),
210
+ connectionLimit: validateNumber(config.connectionLimit, `${path}.connectionLimit`, { min: 1 }),
211
+ };
212
+ // Optional fields
213
+ if (config.database !== undefined) {
214
+ result.database = validateString(config.database, `${path}.database`);
215
+ }
216
+ if (config.user !== undefined) {
217
+ result.user = validateString(config.user, `${path}.user`);
218
+ }
219
+ if (config.password !== undefined) {
220
+ result.password = validateString(config.password, `${path}.password`);
221
+ }
222
+ if (config.ssl !== undefined) {
223
+ result.ssl = validateBoolean(config.ssl, `${path}.ssl`);
224
+ }
225
+ return result;
226
+ }
227
+ /**
228
+ * Validate SQLite configuration
229
+ */
230
+ function validateSQLiteConfig(config, path) {
231
+ if (!config || typeof config !== 'object') {
232
+ throw new ConfigValidationError(path, config, 'object', 'SQLite configuration must be an object');
233
+ }
234
+ const result = {
235
+ filename: validateString(config.filename, `${path}.filename`),
236
+ };
237
+ // Optional fields
238
+ if (config.memory !== undefined) {
239
+ result.memory = validateBoolean(config.memory, `${path}.memory`);
240
+ }
241
+ if (config.verbose !== undefined) {
242
+ result.verbose = validateBoolean(config.verbose, `${path}.verbose`);
243
+ }
244
+ return result;
245
+ }
246
+ /**
247
+ * Validate MongoDB configuration
248
+ */
249
+ function validateMongoDBConfig(config, path) {
250
+ if (!config || typeof config !== 'object') {
251
+ throw new ConfigValidationError(path, config, 'object', 'MongoDB configuration must be an object');
252
+ }
253
+ const result = {};
254
+ // Either url or host+port
255
+ if (config.url !== undefined) {
256
+ result.url = validateString(config.url, `${path}.url`);
257
+ }
258
+ if (config.host !== undefined) {
259
+ result.host = validateString(config.host, `${path}.host`);
260
+ }
261
+ if (config.port !== undefined) {
262
+ result.port = validatePort(config.port, `${path}.port`);
263
+ }
264
+ if (config.database !== undefined) {
265
+ result.database = validateString(config.database, `${path}.database`);
266
+ }
267
+ if (config.username !== undefined) {
268
+ result.username = validateString(config.username, `${path}.username`);
269
+ }
270
+ if (config.password !== undefined) {
271
+ result.password = validateString(config.password, `${path}.password`);
272
+ }
273
+ return result;
274
+ }
275
+ /**
276
+ * Validate module defaults configuration
277
+ */
278
+ function validateModuleDefaultsConfig(config, path) {
279
+ if (!config || typeof config !== 'object') {
280
+ throw new ConfigValidationError(path, config, 'object', 'Module defaults configuration must be an object');
281
+ }
282
+ return {
283
+ cache: validateCacheConfig(config.cache, `${path}.cache`),
284
+ rateLimit: validateRateLimitConfig(config.rateLimit, `${path}.rateLimit`),
285
+ validation: validateValidationConfig(config.validation, `${path}.validation`),
286
+ autoDiscovery: validateAutoDiscoveryConfig(config.autoDiscovery, `${path}.autoDiscovery`),
287
+ };
288
+ }
289
+ /**
290
+ * Validate auto-discovery configuration
291
+ */
292
+ function validateAutoDiscoveryConfig(config, path) {
293
+ if (!config || typeof config !== 'object') {
294
+ throw new ConfigValidationError(path, config, 'object', 'Auto-discovery configuration must be an object');
295
+ }
296
+ return {
297
+ enabled: validateBoolean(config.enabled, `${path}.enabled`),
298
+ paths: validateStringArray(config.paths, `${path}.paths`),
299
+ patterns: validateStringArray(config.patterns, `${path}.patterns`),
300
+ recursive: validateBoolean(config.recursive, `${path}.recursive`),
301
+ loadingStrategy: validateEnum(config.loadingStrategy, ['eager', 'lazy', 'conditional'], `${path}.loadingStrategy`),
302
+ watchForChanges: validateBoolean(config.watchForChanges, `${path}.watchForChanges`),
303
+ ignorePatterns: validateStringArray(config.ignorePatterns, `${path}.ignorePatterns`),
304
+ loadOrder: validateEnum(config.loadOrder, ['alphabetical', 'dependency', 'custom'], `${path}.loadOrder`),
305
+ failOnError: validateBoolean(config.failOnError, `${path}.failOnError`),
306
+ maxDepth: validateNumber(config.maxDepth, `${path}.maxDepth`),
307
+ };
308
+ }
309
+ /**
310
+ * Validate cache configuration
311
+ */
312
+ function validateCacheConfig(config, path) {
313
+ if (!config || typeof config !== 'object') {
314
+ throw new ConfigValidationError(path, config, 'object', 'Cache configuration must be an object');
315
+ }
316
+ return {
317
+ enabled: validateBoolean(config.enabled, `${path}.enabled`),
318
+ defaultTtl: validateNumber(config.defaultTtl, `${path}.defaultTtl`, { min: 0 }),
319
+ maxSize: validateNumber(config.maxSize, `${path}.maxSize`, { min: 1 }),
320
+ strategy: validateEnum(config.strategy, ['lru', 'lfu', 'fifo'], `${path}.strategy`),
321
+ };
322
+ }
323
+ /**
324
+ * Validate rate limit configuration
325
+ */
326
+ function validateRateLimitConfig(config, path) {
327
+ if (!config || typeof config !== 'object') {
328
+ throw new ConfigValidationError(path, config, 'object', 'Rate limit configuration must be an object');
329
+ }
330
+ return {
331
+ enabled: validateBoolean(config.enabled, `${path}.enabled`),
332
+ defaultRequests: validateNumber(config.defaultRequests, `${path}.defaultRequests`, { min: 1 }),
333
+ defaultWindow: validateNumber(config.defaultWindow, `${path}.defaultWindow`, { min: 1000 }),
334
+ skipSuccessfulRequests: validateBoolean(config.skipSuccessfulRequests, `${path}.skipSuccessfulRequests`),
335
+ skipFailedRequests: validateBoolean(config.skipFailedRequests, `${path}.skipFailedRequests`),
336
+ };
337
+ }
338
+ /**
339
+ * Validate validation configuration
340
+ */
341
+ function validateValidationConfig(config, path) {
342
+ if (!config || typeof config !== 'object') {
343
+ throw new ConfigValidationError(path, config, 'object', 'Validation configuration must be an object');
344
+ }
345
+ return {
346
+ enabled: validateBoolean(config.enabled, `${path}.enabled`),
347
+ stripUnknown: validateBoolean(config.stripUnknown, `${path}.stripUnknown`),
348
+ abortEarly: validateBoolean(config.abortEarly, `${path}.abortEarly`),
349
+ };
350
+ }
351
+ /**
352
+ * Validate logging configuration
353
+ */
354
+ function validateLoggingConfig(config, path) {
355
+ if (!config || typeof config !== 'object') {
356
+ throw new ConfigValidationError(path, config, 'object', 'Logging configuration must be an object');
357
+ }
358
+ return {
359
+ level: validateEnum(config.level, ['debug', 'info', 'warn', 'error', 'fatal'], `${path}.level`),
360
+ format: validateEnum(config.format, ['pretty', 'json', 'compact'], `${path}.format`),
361
+ enableColors: validateBoolean(config.enableColors, `${path}.enableColors`),
362
+ enableTimestamp: validateBoolean(config.enableTimestamp, `${path}.enableTimestamp`),
363
+ enableContext: validateBoolean(config.enableContext, `${path}.enableContext`),
364
+ outputs: validateLoggingOutputsConfig(config.outputs, `${path}.outputs`),
365
+ };
366
+ }
367
+ /**
368
+ * Validate logging outputs configuration
369
+ */
370
+ function validateLoggingOutputsConfig(config, path) {
371
+ if (!config || typeof config !== 'object') {
372
+ throw new ConfigValidationError(path, config, 'object', 'Logging outputs configuration must be an object');
373
+ }
374
+ return {
375
+ console: validateBoolean(config.console, `${path}.console`),
376
+ file: validateLoggingFileConfig(config.file, `${path}.file`),
377
+ webhook: validateLoggingWebhookConfig(config.webhook, `${path}.webhook`),
378
+ };
379
+ }
380
+ /**
381
+ * Validate logging file configuration
382
+ */
383
+ function validateLoggingFileConfig(config, path) {
384
+ if (!config || typeof config !== 'object') {
385
+ throw new ConfigValidationError(path, config, 'object', 'Logging file configuration must be an object');
386
+ }
387
+ return {
388
+ enabled: validateBoolean(config.enabled, `${path}.enabled`),
389
+ path: validateString(config.path, `${path}.path`),
390
+ maxSize: validateString(config.maxSize, `${path}.maxSize`),
391
+ maxFiles: validateNumber(config.maxFiles, `${path}.maxFiles`, { min: 1 }),
392
+ };
393
+ }
394
+ /**
395
+ * Validate logging webhook configuration
396
+ */
397
+ function validateLoggingWebhookConfig(config, path) {
398
+ if (!config || typeof config !== 'object') {
399
+ throw new ConfigValidationError(path, config, 'object', 'Logging webhook configuration must be an object');
400
+ }
401
+ const result = {
402
+ enabled: validateBoolean(config.enabled, `${path}.enabled`),
403
+ headers: validateObject(config.headers, `${path}.headers`),
404
+ };
405
+ // Optional URL
406
+ if (config.url !== undefined) {
407
+ result.url = validateString(config.url, `${path}.url`);
408
+ }
409
+ return result;
410
+ }
411
+ /**
412
+ * Validate security configuration
413
+ */
414
+ function validateSecurityConfig(config, path) {
415
+ if (!config || typeof config !== 'object') {
416
+ throw new ConfigValidationError(path, config, 'object', 'Security configuration must be an object');
417
+ }
418
+ return {
419
+ cors: validateCorsConfig(config.cors, `${path}.cors`),
420
+ helmet: validateHelmetConfig(config.helmet, `${path}.helmet`),
421
+ rateLimit: validateSecurityRateLimitConfig(config.rateLimit, `${path}.rateLimit`),
422
+ };
423
+ }
424
+ /**
425
+ * Validate CORS configuration
426
+ */
427
+ function validateCorsConfig(config, path) {
428
+ if (!config || typeof config !== 'object') {
429
+ throw new ConfigValidationError(path, config, 'object', 'CORS configuration must be an object');
430
+ }
431
+ return {
432
+ enabled: validateBoolean(config.enabled, `${path}.enabled`),
433
+ origin: validateCorsOrigin(config.origin, `${path}.origin`),
434
+ methods: validateStringArray(config.methods, `${path}.methods`),
435
+ allowedHeaders: validateStringArray(config.allowedHeaders, `${path}.allowedHeaders`),
436
+ credentials: validateBoolean(config.credentials, `${path}.credentials`),
437
+ };
438
+ }
439
+ /**
440
+ * Validate CORS origin (can be string, array, or boolean)
441
+ */
442
+ function validateCorsOrigin(value, path) {
443
+ if (typeof value === 'boolean' || typeof value === 'string') {
444
+ return value;
445
+ }
446
+ if (Array.isArray(value)) {
447
+ return validateStringArray(value, path);
448
+ }
449
+ throw new ConfigValidationError(path, value, 'string | string[] | boolean', 'Must be a string, array of strings, or boolean');
450
+ }
451
+ /**
452
+ * Validate helmet configuration
453
+ */
454
+ function validateHelmetConfig(config, path) {
455
+ if (!config || typeof config !== 'object') {
456
+ throw new ConfigValidationError(path, config, 'object', 'Helmet configuration must be an object');
457
+ }
458
+ return {
459
+ enabled: validateBoolean(config.enabled, `${path}.enabled`),
460
+ contentSecurityPolicy: validateBoolean(config.contentSecurityPolicy, `${path}.contentSecurityPolicy`),
461
+ hsts: validateBoolean(config.hsts, `${path}.hsts`),
462
+ noSniff: validateBoolean(config.noSniff, `${path}.noSniff`),
463
+ frameguard: validateBoolean(config.frameguard, `${path}.frameguard`),
464
+ };
465
+ }
466
+ /**
467
+ * Validate security rate limit configuration
468
+ */
469
+ function validateSecurityRateLimitConfig(config, path) {
470
+ if (!config || typeof config !== 'object') {
471
+ throw new ConfigValidationError(path, config, 'object', 'Security rate limit configuration must be an object');
472
+ }
473
+ return {
474
+ global: validateGlobalRateLimitConfig(config.global, `${path}.global`),
475
+ };
476
+ }
477
+ /**
478
+ * Validate global rate limit configuration
479
+ */
480
+ function validateGlobalRateLimitConfig(config, path) {
481
+ if (!config || typeof config !== 'object') {
482
+ throw new ConfigValidationError(path, config, 'object', 'Global rate limit configuration must be an object');
483
+ }
484
+ return {
485
+ enabled: validateBoolean(config.enabled, `${path}.enabled`),
486
+ requests: validateNumber(config.requests, `${path}.requests`, { min: 1 }),
487
+ window: validateNumber(config.window, `${path}.window`, { min: 1000 }),
488
+ };
489
+ }
490
+ /**
491
+ * Validate external services configuration
492
+ */
493
+ function validateExternalServicesConfig(config, path) {
494
+ if (!config || typeof config !== 'object') {
495
+ throw new ConfigValidationError(path, config, 'object', 'External services configuration must be an object');
496
+ }
497
+ const result = {};
498
+ // Optional services - only validate if present
499
+ if (config.stripe !== undefined) {
500
+ result.stripe = validateStripeConfig(config.stripe, `${path}.stripe`);
501
+ }
502
+ if (config.paypal !== undefined) {
503
+ result.paypal = validatePayPalConfig(config.paypal, `${path}.paypal`);
504
+ }
505
+ if (config.smtp !== undefined) {
506
+ result.smtp = validateSMTPConfig(config.smtp, `${path}.smtp`);
507
+ }
508
+ return result;
509
+ }
510
+ /**
511
+ * Validate Stripe configuration
512
+ */
513
+ function validateStripeConfig(config, path) {
514
+ if (!config || typeof config !== 'object') {
515
+ throw new ConfigValidationError(path, config, 'object', 'Stripe configuration must be an object');
516
+ }
517
+ const result = {};
518
+ // Optional fields
519
+ if (config.secretKey !== undefined) {
520
+ result.secretKey = validateString(config.secretKey, `${path}.secretKey`);
521
+ }
522
+ if (config.publishableKey !== undefined) {
523
+ result.publishableKey = validateString(config.publishableKey, `${path}.publishableKey`);
524
+ }
525
+ if (config.webhookSecret !== undefined) {
526
+ result.webhookSecret = validateString(config.webhookSecret, `${path}.webhookSecret`);
527
+ }
528
+ if (config.apiVersion !== undefined) {
529
+ result.apiVersion = validateString(config.apiVersion, `${path}.apiVersion`);
530
+ }
531
+ else {
532
+ result.apiVersion = '2023-10-16'; // Default API version
533
+ }
534
+ return result;
535
+ }
536
+ /**
537
+ * Validate PayPal configuration
538
+ */
539
+ function validatePayPalConfig(config, path) {
540
+ if (!config || typeof config !== 'object') {
541
+ throw new ConfigValidationError(path, config, 'object', 'PayPal configuration must be an object');
542
+ }
543
+ const result = {
544
+ environment: validateEnum(config.environment, ['sandbox', 'production'], `${path}.environment`),
545
+ };
546
+ // Optional fields
547
+ if (config.clientId !== undefined) {
548
+ result.clientId = validateString(config.clientId, `${path}.clientId`);
549
+ }
550
+ if (config.clientSecret !== undefined) {
551
+ result.clientSecret = validateString(config.clientSecret, `${path}.clientSecret`);
552
+ }
553
+ if (config.webhookId !== undefined) {
554
+ result.webhookId = validateString(config.webhookId, `${path}.webhookId`);
555
+ }
556
+ return result;
557
+ }
558
+ /**
559
+ * Validate SMTP configuration
560
+ */
561
+ function validateSMTPConfig(config, path) {
562
+ if (!config || typeof config !== 'object') {
563
+ throw new ConfigValidationError(path, config, 'object', 'SMTP configuration must be an object');
564
+ }
565
+ const result = {
566
+ port: validatePort(config.port, `${path}.port`),
567
+ secure: validateBoolean(config.secure, `${path}.secure`),
568
+ };
569
+ // Optional fields
570
+ if (config.host !== undefined) {
571
+ result.host = validateString(config.host, `${path}.host`);
572
+ }
573
+ if (config.username !== undefined) {
574
+ result.username = validateString(config.username, `${path}.username`);
575
+ }
576
+ if (config.password !== undefined) {
577
+ result.password = validateString(config.password, `${path}.password`);
578
+ }
579
+ return result;
580
+ }
581
+ /**
582
+ * Validate performance configuration
583
+ */
584
+ function validatePerformanceConfig(config, path) {
585
+ if (!config || typeof config !== 'object') {
586
+ throw new ConfigValidationError(path, config, 'object', 'Performance configuration must be an object');
587
+ }
588
+ return {
589
+ compression: validateCompressionConfig(config.compression, `${path}.compression`),
590
+ circuitBreaker: validateCircuitBreakerConfig(config.circuitBreaker, `${path}.circuitBreaker`),
591
+ clustering: validateClusteringConfig(config.clustering, `${path}.clustering`),
592
+ };
593
+ }
594
+ /**
595
+ * Validate compression configuration
596
+ */
597
+ function validateCompressionConfig(config, path) {
598
+ if (!config || typeof config !== 'object') {
599
+ throw new ConfigValidationError(path, config, 'object', 'Compression configuration must be an object');
600
+ }
601
+ return {
602
+ enabled: validateBoolean(config.enabled, `${path}.enabled`),
603
+ level: validateNumber(config.level, `${path}.level`, { min: 1, max: 9 }),
604
+ threshold: validateNumber(config.threshold, `${path}.threshold`, { min: 0 }),
605
+ };
606
+ }
607
+ /**
608
+ * Validate circuit breaker configuration
609
+ */
610
+ function validateCircuitBreakerConfig(config, path) {
611
+ if (!config || typeof config !== 'object') {
612
+ throw new ConfigValidationError(path, config, 'object', 'Circuit breaker configuration must be an object');
613
+ }
614
+ return {
615
+ enabled: validateBoolean(config.enabled, `${path}.enabled`),
616
+ failureThreshold: validateNumber(config.failureThreshold, `${path}.failureThreshold`, {
617
+ min: 1,
618
+ }),
619
+ resetTimeout: validateNumber(config.resetTimeout, `${path}.resetTimeout`, { min: 1000 }),
620
+ monitoringPeriod: validateNumber(config.monitoringPeriod, `${path}.monitoringPeriod`, {
621
+ min: 1000,
622
+ }),
623
+ };
624
+ }
625
+ /**
626
+ * Validate clustering configuration
627
+ */
628
+ function validateClusteringConfig(config, path) {
629
+ if (!config || typeof config !== 'object') {
630
+ throw new ConfigValidationError(path, config, 'object', 'Clustering configuration must be an object');
631
+ }
632
+ const result = {
633
+ enabled: validateBoolean(config.enabled, `${path}.enabled`),
634
+ };
635
+ // Workers can be number or 'auto'
636
+ if (typeof config.workers === 'string' && config.workers === 'auto') {
637
+ result.workers = 'auto';
638
+ }
639
+ else {
640
+ result.workers = validateNumber(config.workers, `${path}.workers`, { min: 1 });
641
+ }
642
+ // Optional memoryPerWorkerGB
643
+ if (config.memoryPerWorkerGB !== undefined) {
644
+ result.memoryPerWorkerGB = validateNumber(config.memoryPerWorkerGB, `${path}.memoryPerWorkerGB`, { min: 0.1 });
645
+ }
646
+ return result;
647
+ }
648
+ /**
649
+ * Validate WebSocket configuration
650
+ */
651
+ function validateWebSocketConfig(config, path) {
652
+ if (!config || typeof config !== 'object') {
653
+ throw new ConfigValidationError(path, config, 'object', 'WebSocket configuration must be an object');
654
+ }
655
+ const result = {
656
+ enabled: validateBoolean(config.enabled, `${path}.enabled`),
657
+ };
658
+ // Optional fields
659
+ if (config.adapter !== undefined) {
660
+ result.adapter = validateString(config.adapter, `${path}.adapter`);
661
+ }
662
+ if (config.compression !== undefined) {
663
+ result.compression = validateBoolean(config.compression, `${path}.compression`);
664
+ }
665
+ if (config.customIdGenerator !== undefined) {
666
+ result.customIdGenerator = config.customIdGenerator; // Function - no validation needed
667
+ }
668
+ if (config.options !== undefined) {
669
+ result.options = validateWebSocketOptions(config.options, `${path}.options`);
670
+ }
671
+ return result;
672
+ }
673
+ /**
674
+ * Validate WebSocket options
675
+ */
676
+ function validateWebSocketOptions(config, path) {
677
+ if (!config || typeof config !== 'object') {
678
+ throw new ConfigValidationError(path, config, 'object', 'WebSocket options must be an object');
679
+ }
680
+ const result = {};
681
+ if (config.cors !== undefined) {
682
+ result.cors = validateWebSocketCorsOptions(config.cors, `${path}.cors`);
683
+ }
684
+ if (config.path !== undefined) {
685
+ result.path = validateString(config.path, `${path}.path`);
686
+ }
687
+ if (config.maxPayloadLength !== undefined) {
688
+ result.maxPayloadLength = validateNumber(config.maxPayloadLength, `${path}.maxPayloadLength`, {
689
+ min: 1024,
690
+ });
691
+ }
692
+ return result;
693
+ }
694
+ /**
695
+ * Validate WebSocket CORS options
696
+ */
697
+ function validateWebSocketCorsOptions(config, path) {
698
+ if (!config || typeof config !== 'object') {
699
+ throw new ConfigValidationError(path, config, 'object', 'WebSocket CORS options must be an object');
700
+ }
701
+ const result = {};
702
+ if (config.origin !== undefined) {
703
+ result.origin = validateCorsOrigin(config.origin, `${path}.origin`);
704
+ }
705
+ if (config.credentials !== undefined) {
706
+ result.credentials = validateBoolean(config.credentials, `${path}.credentials`);
707
+ }
708
+ return result;
709
+ }
710
+ // Basic validation functions
711
+ function validatePort(value, path) {
712
+ const num = Number(value);
713
+ if (isNaN(num) || num < 1 || num > 65535) {
714
+ throw new ConfigValidationError(path, value, 'number (1-65535)', 'Must be a number between 1 and 65535');
715
+ }
716
+ return num;
717
+ }
718
+ function validateBoolean(value, path) {
719
+ if (value === 'true' || value === true)
720
+ return true;
721
+ if (value === 'false' || value === false)
722
+ return false;
723
+ if (value === '1' || value === 1)
724
+ return true;
725
+ if (value === '0' || value === 0)
726
+ return false;
727
+ throw new ConfigValidationError(path, value, 'boolean', 'Must be a boolean (true/false) or numeric (1/0)');
728
+ }
729
+ function validateNumber(value, path, options = {}) {
730
+ const num = Number(value);
731
+ if (isNaN(num)) {
732
+ throw new ConfigValidationError(path, value, 'number', 'Must be a valid number');
733
+ }
734
+ if (options.min !== undefined && num < options.min) {
735
+ throw new ConfigValidationError(path, value, `number >= ${options.min}`, `Must be at least ${options.min}`);
736
+ }
737
+ if (options.max !== undefined && num > options.max) {
738
+ throw new ConfigValidationError(path, value, `number <= ${options.max}`, `Must be at most ${options.max}`);
739
+ }
740
+ return num;
741
+ }
742
+ function validateString(value, path) {
743
+ if (typeof value !== 'string') {
744
+ throw new ConfigValidationError(path, value, 'string', 'Must be a string');
745
+ }
746
+ return value;
747
+ }
748
+ function validateEnum(value, validValues, path) {
749
+ const str = validateString(value, path);
750
+ if (!validValues.includes(str)) {
751
+ throw new ConfigValidationError(path, value, `one of: ${validValues.join(', ')}`, `Must be one of: ${validValues.join(', ')}`);
752
+ }
753
+ return str;
754
+ }
755
+ function validateStringArray(value, path) {
756
+ if (!Array.isArray(value)) {
757
+ // Try to parse comma-separated string
758
+ if (typeof value === 'string') {
759
+ return value
760
+ .split(',')
761
+ .map(s => s.trim())
762
+ .filter(s => s.length > 0);
763
+ }
764
+ throw new ConfigValidationError(path, value, 'string[]', 'Must be an array or comma-separated string');
765
+ }
766
+ return value.map((item, index) => validateString(item, `${path}[${index}]`));
767
+ }
768
+ function validateObject(value, path) {
769
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
770
+ throw new ConfigValidationError(path, value, 'object', 'Must be an object');
771
+ }
772
+ return value;
773
+ }
774
+ /**
775
+ * Provide helpful validation hints based on the error
776
+ */
777
+ function provideValidationHints(error) {
778
+ if (error.field.includes('port')) {
779
+ logger.error(' 💡 Hint: Ports must be numbers between 1 and 65535');
780
+ }
781
+ if (error.field.includes('url')) {
782
+ logger.error(' 💡 Hint: URLs must include protocol (http:// or https://)');
783
+ }
784
+ if (error.field.includes('environment')) {
785
+ logger.error(' 💡 Hint: NODE_ENV must be one of: development, staging, production');
786
+ }
787
+ if (error.field.includes('level')) {
788
+ logger.error(' 💡 Hint: Log level must be one of: debug, info, warn, error, fatal');
789
+ }
790
+ }
791
+ //# sourceMappingURL=config-validator.js.map