@morojs/moro 1.6.2 → 1.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (366) hide show
  1. package/dist/core/http/http-server.js +12 -9
  2. package/dist/core/http/http-server.js.map +1 -1
  3. package/dist/core/http/uws-http-server.js +1 -1
  4. package/dist/core/http/uws-http-server.js.map +1 -1
  5. package/dist/core/middleware/built-in/auth/core.d.ts +78 -0
  6. package/dist/core/middleware/built-in/auth/core.js +358 -0
  7. package/dist/core/middleware/built-in/auth/core.js.map +1 -0
  8. package/dist/core/middleware/built-in/{auth-helpers.js → auth/helpers.js} +1 -1
  9. package/dist/core/middleware/built-in/auth/helpers.js.map +1 -0
  10. package/dist/core/middleware/built-in/auth/hook.d.ts +30 -0
  11. package/dist/core/middleware/built-in/auth/hook.js +99 -0
  12. package/dist/core/middleware/built-in/auth/hook.js.map +1 -0
  13. package/dist/core/middleware/built-in/auth/index.d.ts +7 -0
  14. package/dist/core/middleware/built-in/auth/index.js +15 -0
  15. package/dist/core/middleware/built-in/auth/index.js.map +1 -0
  16. package/dist/core/middleware/built-in/{jwt-helpers.js → auth/jwt-helpers.js} +1 -1
  17. package/dist/core/middleware/built-in/auth/jwt-helpers.js.map +1 -0
  18. package/dist/core/middleware/built-in/auth/middleware.d.ts +23 -0
  19. package/dist/core/middleware/built-in/auth/middleware.js +71 -0
  20. package/dist/core/middleware/built-in/auth/middleware.js.map +1 -0
  21. package/dist/core/middleware/built-in/{auth-providers.d.ts → auth/providers.d.ts} +1 -1
  22. package/dist/core/middleware/built-in/{auth-providers.js → auth/providers.js} +1 -1
  23. package/dist/core/middleware/built-in/auth/providers.js.map +1 -0
  24. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/file.d.ts +1 -1
  25. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/file.js +1 -1
  26. package/dist/core/middleware/built-in/cache/adapters/cache/file.js.map +1 -0
  27. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/index.d.ts +1 -1
  28. package/dist/core/middleware/built-in/cache/adapters/cache/index.js.map +1 -0
  29. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/memory.d.ts +1 -1
  30. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/memory.js +1 -1
  31. package/dist/core/middleware/built-in/cache/adapters/cache/memory.js.map +1 -0
  32. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/redis.d.ts +1 -1
  33. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/redis.js +2 -2
  34. package/dist/core/middleware/built-in/cache/adapters/cache/redis.js.map +1 -0
  35. package/dist/core/middleware/built-in/{adapters → cache/adapters}/index.d.ts +0 -2
  36. package/{src/core/middleware/built-in/adapters/index.ts → dist/core/middleware/built-in/cache/adapters/index.js} +1 -3
  37. package/dist/core/middleware/built-in/cache/adapters/index.js.map +1 -0
  38. package/dist/core/middleware/built-in/cache/core.d.ts +37 -0
  39. package/dist/core/middleware/built-in/cache/core.js +87 -0
  40. package/dist/core/middleware/built-in/cache/core.js.map +1 -0
  41. package/dist/core/middleware/built-in/cache/hook.d.ts +20 -0
  42. package/dist/core/middleware/built-in/{cache.js → cache/hook.js} +22 -5
  43. package/dist/core/middleware/built-in/cache/hook.js.map +1 -0
  44. package/dist/core/middleware/built-in/cache/index.d.ts +3 -0
  45. package/dist/core/middleware/built-in/cache/index.js +9 -0
  46. package/dist/core/middleware/built-in/cache/index.js.map +1 -0
  47. package/dist/core/middleware/built-in/cache/middleware.d.ts +17 -0
  48. package/dist/core/middleware/built-in/cache/middleware.js +44 -0
  49. package/dist/core/middleware/built-in/cache/middleware.js.map +1 -0
  50. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/azure.d.ts +1 -1
  51. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/azure.js +1 -1
  52. package/dist/core/middleware/built-in/cdn/adapters/cdn/azure.js.map +1 -0
  53. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudflare.d.ts +1 -1
  54. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudflare.js +1 -1
  55. package/dist/core/middleware/built-in/cdn/adapters/cdn/cloudflare.js.map +1 -0
  56. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudfront.d.ts +1 -1
  57. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudfront.js +2 -2
  58. package/dist/core/middleware/built-in/cdn/adapters/cdn/cloudfront.js.map +1 -0
  59. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/index.d.ts +1 -1
  60. package/dist/core/middleware/built-in/cdn/adapters/cdn/index.js.map +1 -0
  61. package/dist/core/middleware/built-in/cdn/adapters/index.d.ts +2 -0
  62. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/index.js +0 -2
  63. package/dist/core/middleware/built-in/cdn/adapters/index.js.map +1 -0
  64. package/dist/core/middleware/built-in/cdn/core.d.ts +43 -0
  65. package/dist/core/middleware/built-in/cdn/core.js +144 -0
  66. package/dist/core/middleware/built-in/cdn/core.js.map +1 -0
  67. package/dist/core/middleware/built-in/cdn/hook.d.ts +22 -0
  68. package/dist/core/middleware/built-in/cdn/hook.js +70 -0
  69. package/dist/core/middleware/built-in/cdn/hook.js.map +1 -0
  70. package/dist/core/middleware/built-in/cdn/index.d.ts +5 -0
  71. package/dist/core/middleware/built-in/cdn/index.js +11 -0
  72. package/dist/core/middleware/built-in/cdn/index.js.map +1 -0
  73. package/dist/core/middleware/built-in/cdn/middleware.d.ts +21 -0
  74. package/dist/core/middleware/built-in/cdn/middleware.js +52 -0
  75. package/dist/core/middleware/built-in/cdn/middleware.js.map +1 -0
  76. package/dist/core/middleware/built-in/cookie/core.d.ts +37 -0
  77. package/dist/core/middleware/built-in/cookie/core.js +83 -0
  78. package/dist/core/middleware/built-in/cookie/core.js.map +1 -0
  79. package/dist/core/middleware/built-in/cookie/hook.d.ts +20 -0
  80. package/dist/core/middleware/built-in/cookie/hook.js +47 -0
  81. package/dist/core/middleware/built-in/cookie/hook.js.map +1 -0
  82. package/dist/core/middleware/built-in/cookie/index.d.ts +3 -0
  83. package/dist/core/middleware/built-in/cookie/index.js +9 -0
  84. package/dist/core/middleware/built-in/cookie/index.js.map +1 -0
  85. package/dist/core/middleware/built-in/cookie/middleware.d.ts +17 -0
  86. package/dist/core/middleware/built-in/cookie/middleware.js +36 -0
  87. package/dist/core/middleware/built-in/cookie/middleware.js.map +1 -0
  88. package/dist/core/middleware/built-in/cors/core.d.ts +23 -0
  89. package/dist/core/middleware/built-in/cors/core.js +51 -0
  90. package/dist/core/middleware/built-in/cors/core.js.map +1 -0
  91. package/dist/core/middleware/built-in/cors/hook.d.ts +17 -0
  92. package/dist/core/middleware/built-in/cors/hook.js +37 -0
  93. package/dist/core/middleware/built-in/cors/hook.js.map +1 -0
  94. package/dist/core/middleware/built-in/cors/index.d.ts +3 -0
  95. package/dist/core/middleware/built-in/cors/index.js +9 -0
  96. package/dist/core/middleware/built-in/cors/index.js.map +1 -0
  97. package/dist/core/middleware/built-in/cors/middleware.d.ts +16 -0
  98. package/dist/core/middleware/built-in/cors/middleware.js +22 -0
  99. package/dist/core/middleware/built-in/cors/middleware.js.map +1 -0
  100. package/dist/core/middleware/built-in/csp/core.d.ts +45 -0
  101. package/dist/core/middleware/built-in/csp/core.js +88 -0
  102. package/dist/core/middleware/built-in/csp/core.js.map +1 -0
  103. package/dist/core/middleware/built-in/csp/hook.d.ts +22 -0
  104. package/dist/core/middleware/built-in/csp/hook.js +47 -0
  105. package/dist/core/middleware/built-in/csp/hook.js.map +1 -0
  106. package/dist/core/middleware/built-in/csp/index.d.ts +3 -0
  107. package/dist/core/middleware/built-in/csp/index.js +9 -0
  108. package/dist/core/middleware/built-in/csp/index.js.map +1 -0
  109. package/dist/core/middleware/built-in/csp/middleware.d.ts +19 -0
  110. package/dist/core/middleware/built-in/csp/middleware.js +29 -0
  111. package/dist/core/middleware/built-in/csp/middleware.js.map +1 -0
  112. package/dist/core/middleware/built-in/csrf/core.d.ts +28 -0
  113. package/dist/core/middleware/built-in/csrf/core.js +69 -0
  114. package/dist/core/middleware/built-in/csrf/core.js.map +1 -0
  115. package/dist/core/middleware/built-in/csrf/hook.d.ts +17 -0
  116. package/dist/core/middleware/built-in/csrf/hook.js +45 -0
  117. package/dist/core/middleware/built-in/csrf/hook.js.map +1 -0
  118. package/dist/core/middleware/built-in/csrf/index.d.ts +3 -0
  119. package/dist/core/middleware/built-in/csrf/index.js +9 -0
  120. package/dist/core/middleware/built-in/csrf/index.js.map +1 -0
  121. package/dist/core/middleware/built-in/csrf/middleware.d.ts +16 -0
  122. package/dist/core/middleware/built-in/csrf/middleware.js +34 -0
  123. package/dist/core/middleware/built-in/csrf/middleware.js.map +1 -0
  124. package/dist/core/middleware/built-in/error-tracker/index.d.ts +1 -0
  125. package/dist/core/middleware/built-in/error-tracker/index.js +4 -0
  126. package/dist/core/middleware/built-in/error-tracker/index.js.map +1 -0
  127. package/dist/core/middleware/built-in/error-tracker/middleware.d.ts +12 -0
  128. package/dist/core/middleware/built-in/{error-tracker.js → error-tracker/middleware.js} +14 -3
  129. package/dist/core/middleware/built-in/error-tracker/middleware.js.map +1 -0
  130. package/dist/core/middleware/built-in/index.d.ts +25 -59
  131. package/dist/core/middleware/built-in/index.js +31 -31
  132. package/dist/core/middleware/built-in/index.js.map +1 -1
  133. package/dist/core/middleware/built-in/performance-monitor/index.d.ts +1 -0
  134. package/dist/core/middleware/built-in/performance-monitor/index.js +4 -0
  135. package/dist/core/middleware/built-in/performance-monitor/index.js.map +1 -0
  136. package/dist/core/middleware/built-in/performance-monitor/middleware.d.ts +12 -0
  137. package/dist/core/middleware/built-in/{performance-monitor.js → performance-monitor/middleware.js} +14 -3
  138. package/dist/core/middleware/built-in/performance-monitor/middleware.js.map +1 -0
  139. package/dist/core/middleware/built-in/rate-limit/core.d.ts +33 -0
  140. package/dist/core/middleware/built-in/rate-limit/core.js +86 -0
  141. package/dist/core/middleware/built-in/rate-limit/core.js.map +1 -0
  142. package/dist/core/middleware/built-in/rate-limit/hook.d.ts +20 -0
  143. package/dist/core/middleware/built-in/{rate-limit.js → rate-limit/hook.js} +22 -16
  144. package/dist/core/middleware/built-in/rate-limit/hook.js.map +1 -0
  145. package/dist/core/middleware/built-in/rate-limit/index.d.ts +3 -0
  146. package/dist/core/middleware/built-in/rate-limit/index.js +9 -0
  147. package/dist/core/middleware/built-in/rate-limit/index.js.map +1 -0
  148. package/dist/core/middleware/built-in/rate-limit/middleware.d.ts +16 -0
  149. package/dist/core/middleware/built-in/rate-limit/middleware.js +35 -0
  150. package/dist/core/middleware/built-in/rate-limit/middleware.js.map +1 -0
  151. package/dist/core/middleware/built-in/request-logger/index.d.ts +1 -0
  152. package/dist/core/middleware/built-in/request-logger/index.js +4 -0
  153. package/dist/core/middleware/built-in/request-logger/index.js.map +1 -0
  154. package/dist/core/middleware/built-in/request-logger/middleware.d.ts +12 -0
  155. package/dist/core/middleware/built-in/{request-logger.js → request-logger/middleware.js} +14 -3
  156. package/dist/core/middleware/built-in/request-logger/middleware.js.map +1 -0
  157. package/dist/core/middleware/built-in/session/core.d.ts +73 -0
  158. package/dist/core/middleware/built-in/session/core.js +227 -0
  159. package/dist/core/middleware/built-in/session/core.js.map +1 -0
  160. package/dist/core/middleware/built-in/session/hook.d.ts +17 -0
  161. package/dist/core/middleware/built-in/session/hook.js +53 -0
  162. package/dist/core/middleware/built-in/session/hook.js.map +1 -0
  163. package/dist/core/middleware/built-in/session/index.d.ts +3 -0
  164. package/dist/core/middleware/built-in/session/index.js +9 -0
  165. package/dist/core/middleware/built-in/session/index.js.map +1 -0
  166. package/dist/core/middleware/built-in/session/middleware.d.ts +17 -0
  167. package/dist/core/middleware/built-in/session/middleware.js +38 -0
  168. package/dist/core/middleware/built-in/session/middleware.js.map +1 -0
  169. package/dist/core/middleware/built-in/sse/core.d.ts +44 -0
  170. package/dist/core/middleware/built-in/sse/core.js +117 -0
  171. package/dist/core/middleware/built-in/sse/core.js.map +1 -0
  172. package/dist/core/middleware/built-in/sse/hook.d.ts +18 -0
  173. package/dist/core/middleware/built-in/sse/hook.js +60 -0
  174. package/dist/core/middleware/built-in/sse/hook.js.map +1 -0
  175. package/dist/core/middleware/built-in/sse/index.d.ts +3 -0
  176. package/dist/core/middleware/built-in/sse/index.js +9 -0
  177. package/dist/core/middleware/built-in/sse/index.js.map +1 -0
  178. package/dist/core/middleware/built-in/sse/middleware.d.ts +18 -0
  179. package/dist/core/middleware/built-in/sse/middleware.js +43 -0
  180. package/dist/core/middleware/built-in/sse/middleware.js.map +1 -0
  181. package/dist/core/middleware/built-in/validation/core.d.ts +23 -0
  182. package/dist/core/middleware/built-in/validation/core.js +93 -0
  183. package/dist/core/middleware/built-in/validation/core.js.map +1 -0
  184. package/dist/core/middleware/built-in/validation/hook.d.ts +13 -0
  185. package/dist/core/middleware/built-in/{validation.js → validation/hook.js} +14 -3
  186. package/dist/core/middleware/built-in/validation/hook.js.map +1 -0
  187. package/dist/core/middleware/built-in/validation/index.d.ts +3 -0
  188. package/dist/core/middleware/built-in/validation/index.js +9 -0
  189. package/dist/core/middleware/built-in/validation/index.js.map +1 -0
  190. package/dist/core/middleware/built-in/validation/middleware.d.ts +16 -0
  191. package/dist/core/middleware/built-in/validation/middleware.js +27 -0
  192. package/dist/core/middleware/built-in/validation/middleware.js.map +1 -0
  193. package/dist/core/middleware/index.js +6 -0
  194. package/dist/core/middleware/index.js.map +1 -1
  195. package/dist/core/routing/unified-router.d.ts +4 -20
  196. package/dist/core/routing/unified-router.js +61 -106
  197. package/dist/core/routing/unified-router.js.map +1 -1
  198. package/dist/index.d.ts +3 -2
  199. package/dist/index.js +3 -2
  200. package/dist/index.js.map +1 -1
  201. package/dist/moro.js +12 -18
  202. package/dist/moro.js.map +1 -1
  203. package/dist/types/hooks.d.ts +3 -0
  204. package/package.json +2 -6
  205. package/dist/core/middleware/built-in/adapters/cache/file.js.map +0 -1
  206. package/dist/core/middleware/built-in/adapters/cache/index.js.map +0 -1
  207. package/dist/core/middleware/built-in/adapters/cache/memory.js.map +0 -1
  208. package/dist/core/middleware/built-in/adapters/cache/redis.js.map +0 -1
  209. package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +0 -1
  210. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +0 -1
  211. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +0 -1
  212. package/dist/core/middleware/built-in/adapters/cdn/index.js.map +0 -1
  213. package/dist/core/middleware/built-in/adapters/index.js.map +0 -1
  214. package/dist/core/middleware/built-in/auth-helpers.js.map +0 -1
  215. package/dist/core/middleware/built-in/auth-providers.js.map +0 -1
  216. package/dist/core/middleware/built-in/auth.d.ts +0 -30
  217. package/dist/core/middleware/built-in/auth.js +0 -348
  218. package/dist/core/middleware/built-in/auth.js.map +0 -1
  219. package/dist/core/middleware/built-in/cache.d.ts +0 -3
  220. package/dist/core/middleware/built-in/cache.js.map +0 -1
  221. package/dist/core/middleware/built-in/cdn.d.ts +0 -3
  222. package/dist/core/middleware/built-in/cdn.js +0 -109
  223. package/dist/core/middleware/built-in/cdn.js.map +0 -1
  224. package/dist/core/middleware/built-in/cookie.d.ts +0 -14
  225. package/dist/core/middleware/built-in/cookie.js +0 -64
  226. package/dist/core/middleware/built-in/cookie.js.map +0 -1
  227. package/dist/core/middleware/built-in/cors.d.ts +0 -2
  228. package/dist/core/middleware/built-in/cors.js +0 -25
  229. package/dist/core/middleware/built-in/cors.js.map +0 -1
  230. package/dist/core/middleware/built-in/csp.d.ts +0 -22
  231. package/dist/core/middleware/built-in/csp.js +0 -68
  232. package/dist/core/middleware/built-in/csp.js.map +0 -1
  233. package/dist/core/middleware/built-in/csrf.d.ts +0 -9
  234. package/dist/core/middleware/built-in/csrf.js +0 -60
  235. package/dist/core/middleware/built-in/csrf.js.map +0 -1
  236. package/dist/core/middleware/built-in/error-tracker.d.ts +0 -1
  237. package/dist/core/middleware/built-in/error-tracker.js.map +0 -1
  238. package/dist/core/middleware/built-in/jwt-helpers.js.map +0 -1
  239. package/dist/core/middleware/built-in/performance-monitor.d.ts +0 -1
  240. package/dist/core/middleware/built-in/performance-monitor.js.map +0 -1
  241. package/dist/core/middleware/built-in/rate-limit.d.ts +0 -6
  242. package/dist/core/middleware/built-in/rate-limit.js.map +0 -1
  243. package/dist/core/middleware/built-in/request-logger.d.ts +0 -1
  244. package/dist/core/middleware/built-in/request-logger.js.map +0 -1
  245. package/dist/core/middleware/built-in/session.d.ts +0 -41
  246. package/dist/core/middleware/built-in/session.js +0 -205
  247. package/dist/core/middleware/built-in/session.js.map +0 -1
  248. package/dist/core/middleware/built-in/sse.d.ts +0 -6
  249. package/dist/core/middleware/built-in/sse.js +0 -69
  250. package/dist/core/middleware/built-in/sse.js.map +0 -1
  251. package/dist/core/middleware/built-in/validation.d.ts +0 -2
  252. package/dist/core/middleware/built-in/validation.js.map +0 -1
  253. package/jest.config.mjs +0 -41
  254. package/src/core/auth/README.md +0 -339
  255. package/src/core/auth/morojs-adapter.ts +0 -415
  256. package/src/core/config/config-manager.ts +0 -133
  257. package/src/core/config/config-sources.ts +0 -600
  258. package/src/core/config/config-validator.ts +0 -1116
  259. package/src/core/config/file-loader.ts +0 -150
  260. package/src/core/config/index.ts +0 -109
  261. package/src/core/config/schema.ts +0 -164
  262. package/src/core/config/utils.ts +0 -244
  263. package/src/core/database/README.md +0 -238
  264. package/src/core/database/adapters/drizzle.ts +0 -415
  265. package/src/core/database/adapters/index.ts +0 -42
  266. package/src/core/database/adapters/mongodb.ts +0 -317
  267. package/src/core/database/adapters/mysql.ts +0 -235
  268. package/src/core/database/adapters/postgresql.ts +0 -226
  269. package/src/core/database/adapters/redis.ts +0 -379
  270. package/src/core/database/adapters/sqlite.ts +0 -263
  271. package/src/core/database/index.ts +0 -3
  272. package/src/core/docs/index.ts +0 -231
  273. package/src/core/docs/openapi-generator.ts +0 -576
  274. package/src/core/docs/schema-to-openapi.ts +0 -145
  275. package/src/core/docs/simple-docs.ts +0 -295
  276. package/src/core/docs/swagger-ui.ts +0 -354
  277. package/src/core/docs/zod-to-openapi.ts +0 -532
  278. package/src/core/events/event-bus.ts +0 -231
  279. package/src/core/events/index.ts +0 -12
  280. package/src/core/framework.ts +0 -885
  281. package/src/core/http/http-server.ts +0 -1847
  282. package/src/core/http/index.ts +0 -7
  283. package/src/core/http/uws-http-server.ts +0 -591
  284. package/src/core/logger/filters.ts +0 -153
  285. package/src/core/logger/index.ts +0 -21
  286. package/src/core/logger/logger.ts +0 -1033
  287. package/src/core/logger/outputs.ts +0 -132
  288. package/src/core/middleware/built-in/adapters/cache/file.ts +0 -104
  289. package/src/core/middleware/built-in/adapters/cache/index.ts +0 -23
  290. package/src/core/middleware/built-in/adapters/cache/memory.ts +0 -73
  291. package/src/core/middleware/built-in/adapters/cache/redis.ts +0 -114
  292. package/src/core/middleware/built-in/adapters/cdn/azure.ts +0 -60
  293. package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +0 -83
  294. package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +0 -94
  295. package/src/core/middleware/built-in/adapters/cdn/index.ts +0 -23
  296. package/src/core/middleware/built-in/auth-helpers.ts +0 -401
  297. package/src/core/middleware/built-in/auth-providers.ts +0 -480
  298. package/src/core/middleware/built-in/auth.ts +0 -410
  299. package/src/core/middleware/built-in/cache.ts +0 -213
  300. package/src/core/middleware/built-in/cdn.ts +0 -124
  301. package/src/core/middleware/built-in/cookie.ts +0 -85
  302. package/src/core/middleware/built-in/cors.ts +0 -38
  303. package/src/core/middleware/built-in/csp.ts +0 -101
  304. package/src/core/middleware/built-in/csrf.ts +0 -82
  305. package/src/core/middleware/built-in/error-tracker.ts +0 -16
  306. package/src/core/middleware/built-in/index.ts +0 -87
  307. package/src/core/middleware/built-in/jwt-helpers.ts +0 -243
  308. package/src/core/middleware/built-in/performance-monitor.ts +0 -25
  309. package/src/core/middleware/built-in/rate-limit.ts +0 -60
  310. package/src/core/middleware/built-in/request-logger.ts +0 -16
  311. package/src/core/middleware/built-in/session.ts +0 -287
  312. package/src/core/middleware/built-in/sse.ts +0 -88
  313. package/src/core/middleware/built-in/validation.ts +0 -33
  314. package/src/core/middleware/index.ts +0 -177
  315. package/src/core/modules/auto-discovery.ts +0 -726
  316. package/src/core/modules/index.ts +0 -3
  317. package/src/core/modules/modules.ts +0 -135
  318. package/src/core/networking/adapters/index.ts +0 -17
  319. package/src/core/networking/adapters/socketio-adapter.ts +0 -254
  320. package/src/core/networking/adapters/uws-adapter.ts +0 -619
  321. package/src/core/networking/adapters/ws-adapter.ts +0 -429
  322. package/src/core/networking/index.ts +0 -4
  323. package/src/core/networking/service-discovery.ts +0 -303
  324. package/src/core/networking/websocket-adapter.ts +0 -217
  325. package/src/core/networking/websocket-manager.ts +0 -308
  326. package/src/core/pooling/object-pool-manager.ts +0 -630
  327. package/src/core/routing/app-integration.ts +0 -164
  328. package/src/core/routing/index.ts +0 -261
  329. package/src/core/routing/path-matcher.ts +0 -222
  330. package/src/core/routing/router.ts +0 -97
  331. package/src/core/routing/unified-router.ts +0 -870
  332. package/src/core/runtime/aws-lambda-adapter.ts +0 -147
  333. package/src/core/runtime/base-adapter.ts +0 -130
  334. package/src/core/runtime/cloudflare-workers-adapter.ts +0 -152
  335. package/src/core/runtime/index.ts +0 -62
  336. package/src/core/runtime/node-adapter.ts +0 -202
  337. package/src/core/runtime/vercel-edge-adapter.ts +0 -114
  338. package/src/core/utilities/circuit-breaker.ts +0 -46
  339. package/src/core/utilities/container.ts +0 -736
  340. package/src/core/utilities/hooks.ts +0 -142
  341. package/src/core/utilities/index.ts +0 -17
  342. package/src/core/utilities/package-utils.ts +0 -59
  343. package/src/core/validation/adapters.ts +0 -147
  344. package/src/core/validation/index.ts +0 -258
  345. package/src/core/validation/schema-interface.ts +0 -100
  346. package/src/index.ts +0 -233
  347. package/src/moro.ts +0 -1728
  348. package/src/types/auth.ts +0 -440
  349. package/src/types/cache.ts +0 -38
  350. package/src/types/cdn.ts +0 -22
  351. package/src/types/config.ts +0 -229
  352. package/src/types/core.ts +0 -58
  353. package/src/types/database.ts +0 -32
  354. package/src/types/discovery.ts +0 -7
  355. package/src/types/events.ts +0 -82
  356. package/src/types/hooks.ts +0 -47
  357. package/src/types/http.ts +0 -89
  358. package/src/types/logger.ts +0 -102
  359. package/src/types/module.ts +0 -99
  360. package/src/types/runtime.ts +0 -76
  361. package/src/types/session.ts +0 -89
  362. package/tsconfig.json +0 -23
  363. /package/dist/core/middleware/built-in/{auth-helpers.d.ts → auth/helpers.d.ts} +0 -0
  364. /package/dist/core/middleware/built-in/{jwt-helpers.d.ts → auth/jwt-helpers.d.ts} +0 -0
  365. /package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/index.js +0 -0
  366. /package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/index.js +0 -0
@@ -1,1116 +0,0 @@
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
-
8
- import { AppConfig } from '../../types/config.js';
9
- import { createFrameworkLogger } from '../logger/index.js';
10
-
11
- const logger = createFrameworkLogger('ConfigValidator');
12
-
13
- /**
14
- * Configuration validation error with detailed context
15
- */
16
- export class ConfigValidationError extends Error {
17
- constructor(
18
- public readonly field: string,
19
- public readonly value: unknown,
20
- public readonly expectedType: string,
21
- message: string
22
- ) {
23
- super(`Configuration validation failed for '${field}': ${message}`);
24
- this.name = 'ConfigValidationError';
25
- }
26
- }
27
-
28
- /**
29
- * Validate and normalize a complete configuration object
30
- * This ensures type safety and provides helpful error messages
31
- */
32
- export function validateConfig(config: any): AppConfig {
33
- logger.debug('Validating configuration');
34
-
35
- try {
36
- const validatedConfig: AppConfig = {
37
- server: validateServerConfig(config.server, 'server'),
38
- serviceDiscovery: validateServiceDiscoveryConfig(config.serviceDiscovery, 'serviceDiscovery'),
39
- database: validateDatabaseConfig(config.database, 'database'),
40
- modules: validateModuleDefaultsConfig(config.modules, 'modules'),
41
- logging: validateLoggingConfig(config.logging, 'logging'),
42
- security: validateSecurityConfig(config.security, 'security'),
43
- external: validateExternalServicesConfig(config.external, 'external'),
44
- performance: validatePerformanceConfig(config.performance, 'performance'),
45
- websocket: validateWebSocketConfig(config.websocket, 'websocket'),
46
- };
47
-
48
- logger.debug('Configuration validation successful');
49
- return validatedConfig;
50
- } catch (error) {
51
- if (error instanceof ConfigValidationError) {
52
- logger.error(`❌ Configuration validation failed for '${error.field}':`, error.message);
53
-
54
- // Provide helpful hints
55
- provideValidationHints(error);
56
-
57
- throw error;
58
- }
59
-
60
- logger.error('❌ Unexpected configuration validation error:', String(error));
61
- throw new Error(`Configuration validation failed: ${String(error)}`);
62
- }
63
- }
64
-
65
- /**
66
- * Validate server configuration
67
- */
68
- function validateServerConfig(config: any, path: string) {
69
- if (!config || typeof config !== 'object') {
70
- throw new ConfigValidationError(
71
- path,
72
- config,
73
- 'object',
74
- 'Server configuration must be an object'
75
- );
76
- }
77
-
78
- const result: any = {
79
- port: validatePort(config.port, `${path}.port`),
80
- host: validateString(config.host, `${path}.host`),
81
- maxConnections: validateNumber(config.maxConnections, `${path}.maxConnections`, { min: 1 }),
82
- timeout: validateNumber(config.timeout, `${path}.timeout`, { min: 1000 }),
83
- bodySizeLimit: validateString(config.bodySizeLimit, `${path}.bodySizeLimit`),
84
- requestTracking: {
85
- enabled: validateBoolean(config.requestTracking?.enabled, `${path}.requestTracking.enabled`),
86
- },
87
- requestLogging: {
88
- enabled: validateBoolean(config.requestLogging?.enabled, `${path}.requestLogging.enabled`),
89
- },
90
- errorBoundary: {
91
- enabled: validateBoolean(config.errorBoundary?.enabled, `${path}.errorBoundary.enabled`),
92
- },
93
- };
94
-
95
- // Optional uWebSockets configuration
96
- if (config.useUWebSockets !== undefined) {
97
- result.useUWebSockets = validateBoolean(config.useUWebSockets, `${path}.useUWebSockets`);
98
- }
99
-
100
- // Optional SSL configuration
101
- if (config.ssl !== undefined) {
102
- result.ssl = validateSSLConfig(config.ssl, `${path}.ssl`);
103
- }
104
-
105
- return result;
106
- }
107
-
108
- /**
109
- * Validate SSL configuration
110
- */
111
- function validateSSLConfig(config: any, path: string) {
112
- if (!config || typeof config !== 'object') {
113
- throw new ConfigValidationError(path, config, 'object', 'SSL configuration must be an object');
114
- }
115
-
116
- const result: any = {};
117
-
118
- if (config.key_file_name !== undefined) {
119
- result.key_file_name = validateString(config.key_file_name, `${path}.key_file_name`);
120
- }
121
- if (config.cert_file_name !== undefined) {
122
- result.cert_file_name = validateString(config.cert_file_name, `${path}.cert_file_name`);
123
- }
124
- if (config.passphrase !== undefined) {
125
- result.passphrase = validateString(config.passphrase, `${path}.passphrase`);
126
- }
127
-
128
- return result;
129
- }
130
-
131
- /**
132
- * Validate service discovery configuration
133
- */
134
- function validateServiceDiscoveryConfig(config: any, path: string) {
135
- if (!config || typeof config !== 'object') {
136
- throw new ConfigValidationError(
137
- path,
138
- config,
139
- 'object',
140
- 'Service discovery configuration must be an object'
141
- );
142
- }
143
-
144
- return {
145
- enabled: validateBoolean(config.enabled, `${path}.enabled`),
146
- type: validateEnum(config.type, ['memory', 'consul', 'kubernetes'], `${path}.type`),
147
- consulUrl: validateString(config.consulUrl, `${path}.consulUrl`),
148
- kubernetesNamespace: validateString(config.kubernetesNamespace, `${path}.kubernetesNamespace`),
149
- healthCheckInterval: validateNumber(config.healthCheckInterval, `${path}.healthCheckInterval`, {
150
- min: 1000,
151
- }),
152
- retryAttempts: validateNumber(config.retryAttempts, `${path}.retryAttempts`, { min: 0 }),
153
- };
154
- }
155
-
156
- /**
157
- * Validate database configuration
158
- */
159
- function validateDatabaseConfig(config: any, path: string) {
160
- if (!config || typeof config !== 'object') {
161
- throw new ConfigValidationError(
162
- path,
163
- config,
164
- 'object',
165
- 'Database configuration must be an object'
166
- );
167
- }
168
-
169
- const result: any = {};
170
-
171
- // Optional URL
172
- if (config.url !== undefined) {
173
- result.url = validateString(config.url, `${path}.url`);
174
- }
175
-
176
- // Optional Redis - only validate if present
177
- if (config.redis !== undefined) {
178
- result.redis = validateRedisConfig(config.redis, `${path}.redis`);
179
- }
180
-
181
- // Optional MySQL - only validate if present
182
- if (config.mysql !== undefined) {
183
- result.mysql = validateMySQLConfig(config.mysql, `${path}.mysql`);
184
- }
185
-
186
- // Optional PostgreSQL - only validate if present
187
- if (config.postgresql !== undefined) {
188
- result.postgresql = validatePostgreSQLConfig(config.postgresql, `${path}.postgresql`);
189
- }
190
-
191
- // Optional SQLite - only validate if present
192
- if (config.sqlite !== undefined) {
193
- result.sqlite = validateSQLiteConfig(config.sqlite, `${path}.sqlite`);
194
- }
195
-
196
- // Optional MongoDB - only validate if present
197
- if (config.mongodb !== undefined) {
198
- result.mongodb = validateMongoDBConfig(config.mongodb, `${path}.mongodb`);
199
- }
200
-
201
- return result;
202
- }
203
-
204
- /**
205
- * Validate Redis configuration
206
- */
207
- function validateRedisConfig(config: any, path: string) {
208
- if (!config || typeof config !== 'object') {
209
- throw new ConfigValidationError(
210
- path,
211
- config,
212
- 'object',
213
- 'Redis configuration must be an object'
214
- );
215
- }
216
-
217
- return {
218
- url: validateString(config.url, `${path}.url`),
219
- maxRetries: validateNumber(config.maxRetries, `${path}.maxRetries`, { min: 0 }),
220
- retryDelay: validateNumber(config.retryDelay, `${path}.retryDelay`, { min: 0 }),
221
- keyPrefix: validateString(config.keyPrefix, `${path}.keyPrefix`),
222
- };
223
- }
224
-
225
- /**
226
- * Validate MySQL configuration
227
- */
228
- function validateMySQLConfig(config: any, path: string) {
229
- if (!config || typeof config !== 'object') {
230
- throw new ConfigValidationError(
231
- path,
232
- config,
233
- 'object',
234
- 'MySQL configuration must be an object'
235
- );
236
- }
237
-
238
- const result: any = {
239
- host: validateString(config.host, `${path}.host`),
240
- port: validatePort(config.port, `${path}.port`),
241
- connectionLimit: validateNumber(config.connectionLimit, `${path}.connectionLimit`, { min: 1 }),
242
- acquireTimeout: validateNumber(config.acquireTimeout, `${path}.acquireTimeout`, { min: 1000 }),
243
- timeout: validateNumber(config.timeout, `${path}.timeout`, { min: 1000 }),
244
- };
245
-
246
- // Optional fields
247
- if (config.database !== undefined) {
248
- result.database = validateString(config.database, `${path}.database`);
249
- }
250
- if (config.username !== undefined) {
251
- result.username = validateString(config.username, `${path}.username`);
252
- }
253
- if (config.password !== undefined) {
254
- result.password = validateString(config.password, `${path}.password`);
255
- }
256
-
257
- return result;
258
- }
259
-
260
- /**
261
- * Validate PostgreSQL configuration
262
- */
263
- function validatePostgreSQLConfig(config: any, path: string) {
264
- if (!config || typeof config !== 'object') {
265
- throw new ConfigValidationError(
266
- path,
267
- config,
268
- 'object',
269
- 'PostgreSQL configuration must be an object'
270
- );
271
- }
272
-
273
- const result: any = {
274
- host: validateString(config.host, `${path}.host`),
275
- port: validatePort(config.port, `${path}.port`),
276
- connectionLimit: validateNumber(config.connectionLimit, `${path}.connectionLimit`, { min: 1 }),
277
- };
278
-
279
- // Optional fields
280
- if (config.database !== undefined) {
281
- result.database = validateString(config.database, `${path}.database`);
282
- }
283
- if (config.user !== undefined) {
284
- result.user = validateString(config.user, `${path}.user`);
285
- }
286
- if (config.password !== undefined) {
287
- result.password = validateString(config.password, `${path}.password`);
288
- }
289
- if (config.ssl !== undefined) {
290
- result.ssl = validateBoolean(config.ssl, `${path}.ssl`);
291
- }
292
-
293
- return result;
294
- }
295
-
296
- /**
297
- * Validate SQLite configuration
298
- */
299
- function validateSQLiteConfig(config: any, path: string) {
300
- if (!config || typeof config !== 'object') {
301
- throw new ConfigValidationError(
302
- path,
303
- config,
304
- 'object',
305
- 'SQLite configuration must be an object'
306
- );
307
- }
308
-
309
- const result: any = {
310
- filename: validateString(config.filename, `${path}.filename`),
311
- };
312
-
313
- // Optional fields
314
- if (config.memory !== undefined) {
315
- result.memory = validateBoolean(config.memory, `${path}.memory`);
316
- }
317
- if (config.verbose !== undefined) {
318
- result.verbose = validateBoolean(config.verbose, `${path}.verbose`);
319
- }
320
-
321
- return result;
322
- }
323
-
324
- /**
325
- * Validate MongoDB configuration
326
- */
327
- function validateMongoDBConfig(config: any, path: string) {
328
- if (!config || typeof config !== 'object') {
329
- throw new ConfigValidationError(
330
- path,
331
- config,
332
- 'object',
333
- 'MongoDB configuration must be an object'
334
- );
335
- }
336
-
337
- const result: any = {};
338
-
339
- // Either url or host+port
340
- if (config.url !== undefined) {
341
- result.url = validateString(config.url, `${path}.url`);
342
- }
343
- if (config.host !== undefined) {
344
- result.host = validateString(config.host, `${path}.host`);
345
- }
346
- if (config.port !== undefined) {
347
- result.port = validatePort(config.port, `${path}.port`);
348
- }
349
- if (config.database !== undefined) {
350
- result.database = validateString(config.database, `${path}.database`);
351
- }
352
- if (config.username !== undefined) {
353
- result.username = validateString(config.username, `${path}.username`);
354
- }
355
- if (config.password !== undefined) {
356
- result.password = validateString(config.password, `${path}.password`);
357
- }
358
-
359
- return result;
360
- }
361
-
362
- /**
363
- * Validate module defaults configuration
364
- */
365
- function validateModuleDefaultsConfig(config: any, path: string) {
366
- if (!config || typeof config !== 'object') {
367
- throw new ConfigValidationError(
368
- path,
369
- config,
370
- 'object',
371
- 'Module defaults configuration must be an object'
372
- );
373
- }
374
-
375
- return {
376
- cache: validateCacheConfig(config.cache, `${path}.cache`),
377
- rateLimit: validateRateLimitConfig(config.rateLimit, `${path}.rateLimit`),
378
- validation: validateValidationConfig(config.validation, `${path}.validation`),
379
- autoDiscovery: validateAutoDiscoveryConfig(config.autoDiscovery, `${path}.autoDiscovery`),
380
- };
381
- }
382
-
383
- /**
384
- * Validate auto-discovery configuration
385
- */
386
- function validateAutoDiscoveryConfig(config: any, path: string) {
387
- if (!config || typeof config !== 'object') {
388
- throw new ConfigValidationError(
389
- path,
390
- config,
391
- 'object',
392
- 'Auto-discovery configuration must be an object'
393
- );
394
- }
395
-
396
- return {
397
- enabled: validateBoolean(config.enabled, `${path}.enabled`),
398
- paths: validateStringArray(config.paths, `${path}.paths`),
399
- patterns: validateStringArray(config.patterns, `${path}.patterns`),
400
- recursive: validateBoolean(config.recursive, `${path}.recursive`),
401
- loadingStrategy: validateEnum(
402
- config.loadingStrategy,
403
- ['eager', 'lazy', 'conditional'],
404
- `${path}.loadingStrategy`
405
- ),
406
- watchForChanges: validateBoolean(config.watchForChanges, `${path}.watchForChanges`),
407
- ignorePatterns: validateStringArray(config.ignorePatterns, `${path}.ignorePatterns`),
408
- loadOrder: validateEnum(
409
- config.loadOrder,
410
- ['alphabetical', 'dependency', 'custom'],
411
- `${path}.loadOrder`
412
- ),
413
- failOnError: validateBoolean(config.failOnError, `${path}.failOnError`),
414
- maxDepth: validateNumber(config.maxDepth, `${path}.maxDepth`),
415
- };
416
- }
417
-
418
- /**
419
- * Validate cache configuration
420
- */
421
- function validateCacheConfig(config: any, path: string) {
422
- if (!config || typeof config !== 'object') {
423
- throw new ConfigValidationError(
424
- path,
425
- config,
426
- 'object',
427
- 'Cache configuration must be an object'
428
- );
429
- }
430
-
431
- return {
432
- enabled: validateBoolean(config.enabled, `${path}.enabled`),
433
- defaultTtl: validateNumber(config.defaultTtl, `${path}.defaultTtl`, { min: 0 }),
434
- maxSize: validateNumber(config.maxSize, `${path}.maxSize`, { min: 1 }),
435
- strategy: validateEnum(config.strategy, ['lru', 'lfu', 'fifo'], `${path}.strategy`),
436
- };
437
- }
438
-
439
- /**
440
- * Validate rate limit configuration
441
- */
442
- function validateRateLimitConfig(config: any, path: string) {
443
- if (!config || typeof config !== 'object') {
444
- throw new ConfigValidationError(
445
- path,
446
- config,
447
- 'object',
448
- 'Rate limit configuration must be an object'
449
- );
450
- }
451
-
452
- return {
453
- enabled: validateBoolean(config.enabled, `${path}.enabled`),
454
- defaultRequests: validateNumber(config.defaultRequests, `${path}.defaultRequests`, { min: 1 }),
455
- defaultWindow: validateNumber(config.defaultWindow, `${path}.defaultWindow`, { min: 1000 }),
456
- skipSuccessfulRequests: validateBoolean(
457
- config.skipSuccessfulRequests,
458
- `${path}.skipSuccessfulRequests`
459
- ),
460
- skipFailedRequests: validateBoolean(config.skipFailedRequests, `${path}.skipFailedRequests`),
461
- };
462
- }
463
-
464
- /**
465
- * Validate validation configuration
466
- */
467
- function validateValidationConfig(config: any, path: string) {
468
- if (!config || typeof config !== 'object') {
469
- throw new ConfigValidationError(
470
- path,
471
- config,
472
- 'object',
473
- 'Validation configuration must be an object'
474
- );
475
- }
476
-
477
- return {
478
- enabled: validateBoolean(config.enabled, `${path}.enabled`),
479
- stripUnknown: validateBoolean(config.stripUnknown, `${path}.stripUnknown`),
480
- abortEarly: validateBoolean(config.abortEarly, `${path}.abortEarly`),
481
- };
482
- }
483
-
484
- /**
485
- * Validate logging configuration
486
- */
487
- function validateLoggingConfig(config: any, path: string) {
488
- if (!config || typeof config !== 'object') {
489
- throw new ConfigValidationError(
490
- path,
491
- config,
492
- 'object',
493
- 'Logging configuration must be an object'
494
- );
495
- }
496
-
497
- return {
498
- level: validateEnum(config.level, ['debug', 'info', 'warn', 'error', 'fatal'], `${path}.level`),
499
- format: validateEnum(config.format, ['pretty', 'json', 'compact'], `${path}.format`),
500
- enableColors: validateBoolean(config.enableColors, `${path}.enableColors`),
501
- enableTimestamp: validateBoolean(config.enableTimestamp, `${path}.enableTimestamp`),
502
- enableContext: validateBoolean(config.enableContext, `${path}.enableContext`),
503
- outputs: validateLoggingOutputsConfig(config.outputs, `${path}.outputs`),
504
- };
505
- }
506
-
507
- /**
508
- * Validate logging outputs configuration
509
- */
510
- function validateLoggingOutputsConfig(config: any, path: string) {
511
- if (!config || typeof config !== 'object') {
512
- throw new ConfigValidationError(
513
- path,
514
- config,
515
- 'object',
516
- 'Logging outputs configuration must be an object'
517
- );
518
- }
519
-
520
- return {
521
- console: validateBoolean(config.console, `${path}.console`),
522
- file: validateLoggingFileConfig(config.file, `${path}.file`),
523
- webhook: validateLoggingWebhookConfig(config.webhook, `${path}.webhook`),
524
- };
525
- }
526
-
527
- /**
528
- * Validate logging file configuration
529
- */
530
- function validateLoggingFileConfig(config: any, path: string) {
531
- if (!config || typeof config !== 'object') {
532
- throw new ConfigValidationError(
533
- path,
534
- config,
535
- 'object',
536
- 'Logging file configuration must be an object'
537
- );
538
- }
539
-
540
- return {
541
- enabled: validateBoolean(config.enabled, `${path}.enabled`),
542
- path: validateString(config.path, `${path}.path`),
543
- maxSize: validateString(config.maxSize, `${path}.maxSize`),
544
- maxFiles: validateNumber(config.maxFiles, `${path}.maxFiles`, { min: 1 }),
545
- };
546
- }
547
-
548
- /**
549
- * Validate logging webhook configuration
550
- */
551
- function validateLoggingWebhookConfig(config: any, path: string) {
552
- if (!config || typeof config !== 'object') {
553
- throw new ConfigValidationError(
554
- path,
555
- config,
556
- 'object',
557
- 'Logging webhook configuration must be an object'
558
- );
559
- }
560
-
561
- const result: any = {
562
- enabled: validateBoolean(config.enabled, `${path}.enabled`),
563
- headers: validateObject(config.headers, `${path}.headers`),
564
- };
565
-
566
- // Optional URL
567
- if (config.url !== undefined) {
568
- result.url = validateString(config.url, `${path}.url`);
569
- }
570
-
571
- return result;
572
- }
573
-
574
- /**
575
- * Validate security configuration
576
- */
577
- function validateSecurityConfig(config: any, path: string) {
578
- if (!config || typeof config !== 'object') {
579
- throw new ConfigValidationError(
580
- path,
581
- config,
582
- 'object',
583
- 'Security configuration must be an object'
584
- );
585
- }
586
-
587
- return {
588
- cors: validateCorsConfig(config.cors, `${path}.cors`),
589
- helmet: validateHelmetConfig(config.helmet, `${path}.helmet`),
590
- rateLimit: validateSecurityRateLimitConfig(config.rateLimit, `${path}.rateLimit`),
591
- };
592
- }
593
-
594
- /**
595
- * Validate CORS configuration
596
- */
597
- function validateCorsConfig(config: any, path: string) {
598
- if (!config || typeof config !== 'object') {
599
- throw new ConfigValidationError(path, config, 'object', 'CORS configuration must be an object');
600
- }
601
-
602
- return {
603
- enabled: validateBoolean(config.enabled, `${path}.enabled`),
604
- origin: validateCorsOrigin(config.origin, `${path}.origin`),
605
- methods: validateStringArray(config.methods, `${path}.methods`),
606
- allowedHeaders: validateStringArray(config.allowedHeaders, `${path}.allowedHeaders`),
607
- credentials: validateBoolean(config.credentials, `${path}.credentials`),
608
- };
609
- }
610
-
611
- /**
612
- * Validate CORS origin (can be string, array, or boolean)
613
- */
614
- function validateCorsOrigin(value: any, path: string): string | string[] | boolean {
615
- if (typeof value === 'boolean' || typeof value === 'string') {
616
- return value;
617
- }
618
- if (Array.isArray(value)) {
619
- return validateStringArray(value, path);
620
- }
621
- throw new ConfigValidationError(
622
- path,
623
- value,
624
- 'string | string[] | boolean',
625
- 'Must be a string, array of strings, or boolean'
626
- );
627
- }
628
-
629
- /**
630
- * Validate helmet configuration
631
- */
632
- function validateHelmetConfig(config: any, path: string) {
633
- if (!config || typeof config !== 'object') {
634
- throw new ConfigValidationError(
635
- path,
636
- config,
637
- 'object',
638
- 'Helmet configuration must be an object'
639
- );
640
- }
641
-
642
- return {
643
- enabled: validateBoolean(config.enabled, `${path}.enabled`),
644
- contentSecurityPolicy: validateBoolean(
645
- config.contentSecurityPolicy,
646
- `${path}.contentSecurityPolicy`
647
- ),
648
- hsts: validateBoolean(config.hsts, `${path}.hsts`),
649
- noSniff: validateBoolean(config.noSniff, `${path}.noSniff`),
650
- frameguard: validateBoolean(config.frameguard, `${path}.frameguard`),
651
- };
652
- }
653
-
654
- /**
655
- * Validate security rate limit configuration
656
- */
657
- function validateSecurityRateLimitConfig(config: any, path: string) {
658
- if (!config || typeof config !== 'object') {
659
- throw new ConfigValidationError(
660
- path,
661
- config,
662
- 'object',
663
- 'Security rate limit configuration must be an object'
664
- );
665
- }
666
-
667
- return {
668
- global: validateGlobalRateLimitConfig(config.global, `${path}.global`),
669
- };
670
- }
671
-
672
- /**
673
- * Validate global rate limit configuration
674
- */
675
- function validateGlobalRateLimitConfig(config: any, path: string) {
676
- if (!config || typeof config !== 'object') {
677
- throw new ConfigValidationError(
678
- path,
679
- config,
680
- 'object',
681
- 'Global rate limit configuration must be an object'
682
- );
683
- }
684
-
685
- return {
686
- enabled: validateBoolean(config.enabled, `${path}.enabled`),
687
- requests: validateNumber(config.requests, `${path}.requests`, { min: 1 }),
688
- window: validateNumber(config.window, `${path}.window`, { min: 1000 }),
689
- };
690
- }
691
-
692
- /**
693
- * Validate external services configuration
694
- */
695
- function validateExternalServicesConfig(config: any, path: string) {
696
- if (!config || typeof config !== 'object') {
697
- throw new ConfigValidationError(
698
- path,
699
- config,
700
- 'object',
701
- 'External services configuration must be an object'
702
- );
703
- }
704
-
705
- const result: any = {};
706
-
707
- // Optional services - only validate if present
708
- if (config.stripe !== undefined) {
709
- result.stripe = validateStripeConfig(config.stripe, `${path}.stripe`);
710
- }
711
- if (config.paypal !== undefined) {
712
- result.paypal = validatePayPalConfig(config.paypal, `${path}.paypal`);
713
- }
714
- if (config.smtp !== undefined) {
715
- result.smtp = validateSMTPConfig(config.smtp, `${path}.smtp`);
716
- }
717
-
718
- return result;
719
- }
720
-
721
- /**
722
- * Validate Stripe configuration
723
- */
724
- function validateStripeConfig(config: any, path: string) {
725
- if (!config || typeof config !== 'object') {
726
- throw new ConfigValidationError(
727
- path,
728
- config,
729
- 'object',
730
- 'Stripe configuration must be an object'
731
- );
732
- }
733
-
734
- const result: any = {};
735
-
736
- // Optional fields
737
- if (config.secretKey !== undefined) {
738
- result.secretKey = validateString(config.secretKey, `${path}.secretKey`);
739
- }
740
- if (config.publishableKey !== undefined) {
741
- result.publishableKey = validateString(config.publishableKey, `${path}.publishableKey`);
742
- }
743
- if (config.webhookSecret !== undefined) {
744
- result.webhookSecret = validateString(config.webhookSecret, `${path}.webhookSecret`);
745
- }
746
- if (config.apiVersion !== undefined) {
747
- result.apiVersion = validateString(config.apiVersion, `${path}.apiVersion`);
748
- } else {
749
- result.apiVersion = '2023-10-16'; // Default API version
750
- }
751
-
752
- return result;
753
- }
754
-
755
- /**
756
- * Validate PayPal configuration
757
- */
758
- function validatePayPalConfig(config: any, path: string) {
759
- if (!config || typeof config !== 'object') {
760
- throw new ConfigValidationError(
761
- path,
762
- config,
763
- 'object',
764
- 'PayPal configuration must be an object'
765
- );
766
- }
767
-
768
- const result: any = {
769
- environment: validateEnum(config.environment, ['sandbox', 'production'], `${path}.environment`),
770
- };
771
-
772
- // Optional fields
773
- if (config.clientId !== undefined) {
774
- result.clientId = validateString(config.clientId, `${path}.clientId`);
775
- }
776
- if (config.clientSecret !== undefined) {
777
- result.clientSecret = validateString(config.clientSecret, `${path}.clientSecret`);
778
- }
779
- if (config.webhookId !== undefined) {
780
- result.webhookId = validateString(config.webhookId, `${path}.webhookId`);
781
- }
782
-
783
- return result;
784
- }
785
-
786
- /**
787
- * Validate SMTP configuration
788
- */
789
- function validateSMTPConfig(config: any, path: string) {
790
- if (!config || typeof config !== 'object') {
791
- throw new ConfigValidationError(path, config, 'object', 'SMTP configuration must be an object');
792
- }
793
-
794
- const result: any = {
795
- port: validatePort(config.port, `${path}.port`),
796
- secure: validateBoolean(config.secure, `${path}.secure`),
797
- };
798
-
799
- // Optional fields
800
- if (config.host !== undefined) {
801
- result.host = validateString(config.host, `${path}.host`);
802
- }
803
- if (config.username !== undefined) {
804
- result.username = validateString(config.username, `${path}.username`);
805
- }
806
- if (config.password !== undefined) {
807
- result.password = validateString(config.password, `${path}.password`);
808
- }
809
-
810
- return result;
811
- }
812
-
813
- /**
814
- * Validate performance configuration
815
- */
816
- function validatePerformanceConfig(config: any, path: string) {
817
- if (!config || typeof config !== 'object') {
818
- throw new ConfigValidationError(
819
- path,
820
- config,
821
- 'object',
822
- 'Performance configuration must be an object'
823
- );
824
- }
825
-
826
- return {
827
- compression: validateCompressionConfig(config.compression, `${path}.compression`),
828
- circuitBreaker: validateCircuitBreakerConfig(config.circuitBreaker, `${path}.circuitBreaker`),
829
- clustering: validateClusteringConfig(config.clustering, `${path}.clustering`),
830
- };
831
- }
832
-
833
- /**
834
- * Validate compression configuration
835
- */
836
- function validateCompressionConfig(config: any, path: string) {
837
- if (!config || typeof config !== 'object') {
838
- throw new ConfigValidationError(
839
- path,
840
- config,
841
- 'object',
842
- 'Compression configuration must be an object'
843
- );
844
- }
845
-
846
- return {
847
- enabled: validateBoolean(config.enabled, `${path}.enabled`),
848
- level: validateNumber(config.level, `${path}.level`, { min: 1, max: 9 }),
849
- threshold: validateNumber(config.threshold, `${path}.threshold`, { min: 0 }),
850
- };
851
- }
852
-
853
- /**
854
- * Validate circuit breaker configuration
855
- */
856
- function validateCircuitBreakerConfig(config: any, path: string) {
857
- if (!config || typeof config !== 'object') {
858
- throw new ConfigValidationError(
859
- path,
860
- config,
861
- 'object',
862
- 'Circuit breaker configuration must be an object'
863
- );
864
- }
865
-
866
- return {
867
- enabled: validateBoolean(config.enabled, `${path}.enabled`),
868
- failureThreshold: validateNumber(config.failureThreshold, `${path}.failureThreshold`, {
869
- min: 1,
870
- }),
871
- resetTimeout: validateNumber(config.resetTimeout, `${path}.resetTimeout`, { min: 1000 }),
872
- monitoringPeriod: validateNumber(config.monitoringPeriod, `${path}.monitoringPeriod`, {
873
- min: 1000,
874
- }),
875
- };
876
- }
877
-
878
- /**
879
- * Validate clustering configuration
880
- */
881
- function validateClusteringConfig(config: any, path: string) {
882
- if (!config || typeof config !== 'object') {
883
- throw new ConfigValidationError(
884
- path,
885
- config,
886
- 'object',
887
- 'Clustering configuration must be an object'
888
- );
889
- }
890
-
891
- const result: any = {
892
- enabled: validateBoolean(config.enabled, `${path}.enabled`),
893
- };
894
-
895
- // Workers can be number or 'auto'
896
- if (typeof config.workers === 'string' && config.workers === 'auto') {
897
- result.workers = 'auto';
898
- } else {
899
- result.workers = validateNumber(config.workers, `${path}.workers`, { min: 1 });
900
- }
901
-
902
- // Optional memoryPerWorkerGB
903
- if (config.memoryPerWorkerGB !== undefined) {
904
- result.memoryPerWorkerGB = validateNumber(
905
- config.memoryPerWorkerGB,
906
- `${path}.memoryPerWorkerGB`,
907
- { min: 0.1 }
908
- );
909
- }
910
-
911
- return result;
912
- }
913
-
914
- /**
915
- * Validate WebSocket configuration
916
- */
917
- function validateWebSocketConfig(config: any, path: string) {
918
- if (!config || typeof config !== 'object') {
919
- throw new ConfigValidationError(
920
- path,
921
- config,
922
- 'object',
923
- 'WebSocket configuration must be an object'
924
- );
925
- }
926
-
927
- const result: any = {
928
- enabled: validateBoolean(config.enabled, `${path}.enabled`),
929
- };
930
-
931
- // Optional fields
932
- if (config.adapter !== undefined) {
933
- result.adapter = validateString(config.adapter, `${path}.adapter`);
934
- }
935
- if (config.compression !== undefined) {
936
- result.compression = validateBoolean(config.compression, `${path}.compression`);
937
- }
938
- if (config.customIdGenerator !== undefined) {
939
- result.customIdGenerator = config.customIdGenerator; // Function - no validation needed
940
- }
941
- if (config.options !== undefined) {
942
- result.options = validateWebSocketOptions(config.options, `${path}.options`);
943
- }
944
-
945
- return result;
946
- }
947
-
948
- /**
949
- * Validate WebSocket options
950
- */
951
- function validateWebSocketOptions(config: any, path: string) {
952
- if (!config || typeof config !== 'object') {
953
- throw new ConfigValidationError(path, config, 'object', 'WebSocket options must be an object');
954
- }
955
-
956
- const result: any = {};
957
-
958
- if (config.cors !== undefined) {
959
- result.cors = validateWebSocketCorsOptions(config.cors, `${path}.cors`);
960
- }
961
- if (config.path !== undefined) {
962
- result.path = validateString(config.path, `${path}.path`);
963
- }
964
- if (config.maxPayloadLength !== undefined) {
965
- result.maxPayloadLength = validateNumber(config.maxPayloadLength, `${path}.maxPayloadLength`, {
966
- min: 1024,
967
- });
968
- }
969
-
970
- return result;
971
- }
972
-
973
- /**
974
- * Validate WebSocket CORS options
975
- */
976
- function validateWebSocketCorsOptions(config: any, path: string) {
977
- if (!config || typeof config !== 'object') {
978
- throw new ConfigValidationError(
979
- path,
980
- config,
981
- 'object',
982
- 'WebSocket CORS options must be an object'
983
- );
984
- }
985
-
986
- const result: any = {};
987
-
988
- if (config.origin !== undefined) {
989
- result.origin = validateCorsOrigin(config.origin, `${path}.origin`);
990
- }
991
- if (config.credentials !== undefined) {
992
- result.credentials = validateBoolean(config.credentials, `${path}.credentials`);
993
- }
994
-
995
- return result;
996
- }
997
-
998
- // Basic validation functions
999
-
1000
- function validatePort(value: any, path: string): number {
1001
- const num = Number(value);
1002
- if (isNaN(num) || num < 1 || num > 65535) {
1003
- throw new ConfigValidationError(
1004
- path,
1005
- value,
1006
- 'number (1-65535)',
1007
- 'Must be a number between 1 and 65535'
1008
- );
1009
- }
1010
- return num;
1011
- }
1012
-
1013
- function validateBoolean(value: any, path: string): boolean {
1014
- if (value === 'true' || value === true) return true;
1015
- if (value === 'false' || value === false) return false;
1016
- if (value === '1' || value === 1) return true;
1017
- if (value === '0' || value === 0) return false;
1018
- throw new ConfigValidationError(
1019
- path,
1020
- value,
1021
- 'boolean',
1022
- 'Must be a boolean (true/false) or numeric (1/0)'
1023
- );
1024
- }
1025
-
1026
- function validateNumber(
1027
- value: any,
1028
- path: string,
1029
- options: { min?: number; max?: number } = {}
1030
- ): number {
1031
- const num = Number(value);
1032
- if (isNaN(num)) {
1033
- throw new ConfigValidationError(path, value, 'number', 'Must be a valid number');
1034
- }
1035
- if (options.min !== undefined && num < options.min) {
1036
- throw new ConfigValidationError(
1037
- path,
1038
- value,
1039
- `number >= ${options.min}`,
1040
- `Must be at least ${options.min}`
1041
- );
1042
- }
1043
- if (options.max !== undefined && num > options.max) {
1044
- throw new ConfigValidationError(
1045
- path,
1046
- value,
1047
- `number <= ${options.max}`,
1048
- `Must be at most ${options.max}`
1049
- );
1050
- }
1051
- return num;
1052
- }
1053
-
1054
- function validateString(value: any, path: string): string {
1055
- if (typeof value !== 'string') {
1056
- throw new ConfigValidationError(path, value, 'string', 'Must be a string');
1057
- }
1058
- return value;
1059
- }
1060
-
1061
- function validateEnum<T extends string>(value: any, validValues: readonly T[], path: string): T {
1062
- const str = validateString(value, path);
1063
- if (!validValues.includes(str as T)) {
1064
- throw new ConfigValidationError(
1065
- path,
1066
- value,
1067
- `one of: ${validValues.join(', ')}`,
1068
- `Must be one of: ${validValues.join(', ')}`
1069
- );
1070
- }
1071
- return str as T;
1072
- }
1073
-
1074
- function validateStringArray(value: any, path: string): string[] {
1075
- if (!Array.isArray(value)) {
1076
- // Try to parse comma-separated string
1077
- if (typeof value === 'string') {
1078
- return value
1079
- .split(',')
1080
- .map(s => s.trim())
1081
- .filter(s => s.length > 0);
1082
- }
1083
- throw new ConfigValidationError(
1084
- path,
1085
- value,
1086
- 'string[]',
1087
- 'Must be an array or comma-separated string'
1088
- );
1089
- }
1090
- return value.map((item, index) => validateString(item, `${path}[${index}]`));
1091
- }
1092
-
1093
- function validateObject(value: any, path: string): Record<string, string> {
1094
- if (!value || typeof value !== 'object' || Array.isArray(value)) {
1095
- throw new ConfigValidationError(path, value, 'object', 'Must be an object');
1096
- }
1097
- return value;
1098
- }
1099
-
1100
- /**
1101
- * Provide helpful validation hints based on the error
1102
- */
1103
- function provideValidationHints(error: ConfigValidationError): void {
1104
- if (error.field.includes('port')) {
1105
- logger.error(' 💡 Hint: Ports must be numbers between 1 and 65535');
1106
- }
1107
- if (error.field.includes('url')) {
1108
- logger.error(' 💡 Hint: URLs must include protocol (http:// or https://)');
1109
- }
1110
- if (error.field.includes('environment')) {
1111
- logger.error(' 💡 Hint: NODE_ENV must be one of: development, staging, production');
1112
- }
1113
- if (error.field.includes('level')) {
1114
- logger.error(' 💡 Hint: Log level must be one of: debug, info, warn, error, fatal');
1115
- }
1116
- }