@morojs/moro 1.6.1 → 1.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (404) hide show
  1. package/README.md +74 -256
  2. package/dist/core/auth/morojs-adapter.js +20 -20
  3. package/dist/core/auth/morojs-adapter.js.map +1 -1
  4. package/dist/core/config/config-manager.d.ts +44 -0
  5. package/dist/core/config/config-manager.js +104 -0
  6. package/dist/core/config/config-manager.js.map +1 -0
  7. package/dist/core/config/config-sources.d.ts +21 -0
  8. package/dist/core/config/config-sources.js +503 -0
  9. package/dist/core/config/config-sources.js.map +1 -0
  10. package/dist/core/config/config-validator.d.ts +21 -0
  11. package/dist/core/config/config-validator.js +791 -0
  12. package/dist/core/config/config-validator.js.map +1 -0
  13. package/dist/core/config/file-loader.d.ts +1 -6
  14. package/dist/core/config/file-loader.js +21 -249
  15. package/dist/core/config/file-loader.js.map +1 -1
  16. package/dist/core/config/index.d.ts +41 -12
  17. package/dist/core/config/index.js +65 -54
  18. package/dist/core/config/index.js.map +1 -1
  19. package/dist/core/config/schema.d.ts +2 -2
  20. package/dist/core/config/schema.js +55 -44
  21. package/dist/core/config/schema.js.map +1 -1
  22. package/dist/core/config/utils.d.ts +10 -3
  23. package/dist/core/config/utils.js +31 -58
  24. package/dist/core/config/utils.js.map +1 -1
  25. package/dist/core/database/adapters/drizzle.d.ts +1 -1
  26. package/dist/core/database/adapters/drizzle.js +18 -11
  27. package/dist/core/database/adapters/drizzle.js.map +1 -1
  28. package/dist/core/database/adapters/index.d.ts +7 -7
  29. package/dist/core/database/adapters/index.js +19 -29
  30. package/dist/core/database/adapters/index.js.map +1 -1
  31. package/dist/core/database/adapters/mongodb.d.ts +13 -1
  32. package/dist/core/database/adapters/mongodb.js +46 -10
  33. package/dist/core/database/adapters/mongodb.js.map +1 -1
  34. package/dist/core/database/adapters/mysql.d.ts +14 -1
  35. package/dist/core/database/adapters/mysql.js +19 -9
  36. package/dist/core/database/adapters/mysql.js.map +1 -1
  37. package/dist/core/database/adapters/postgresql.d.ts +12 -2
  38. package/dist/core/database/adapters/postgresql.js +19 -9
  39. package/dist/core/database/adapters/postgresql.js.map +1 -1
  40. package/dist/core/database/adapters/redis.d.ts +12 -1
  41. package/dist/core/database/adapters/redis.js +48 -13
  42. package/dist/core/database/adapters/redis.js.map +1 -1
  43. package/dist/core/database/adapters/sqlite.d.ts +3 -1
  44. package/dist/core/database/adapters/sqlite.js +19 -8
  45. package/dist/core/database/adapters/sqlite.js.map +1 -1
  46. package/dist/core/database/index.d.ts +2 -2
  47. package/dist/core/database/index.js +2 -18
  48. package/dist/core/database/index.js.map +1 -1
  49. package/dist/core/docs/index.d.ts +9 -9
  50. package/dist/core/docs/index.js +14 -35
  51. package/dist/core/docs/index.js.map +1 -1
  52. package/dist/core/docs/openapi-generator.d.ts +2 -2
  53. package/dist/core/docs/openapi-generator.js +11 -16
  54. package/dist/core/docs/openapi-generator.js.map +1 -1
  55. package/dist/core/docs/schema-to-openapi.d.ts +2 -2
  56. package/dist/core/docs/schema-to-openapi.js +5 -11
  57. package/dist/core/docs/schema-to-openapi.js.map +1 -1
  58. package/dist/core/docs/simple-docs.d.ts +1 -1
  59. package/dist/core/docs/simple-docs.js +4 -9
  60. package/dist/core/docs/simple-docs.js.map +1 -1
  61. package/dist/core/docs/swagger-ui.d.ts +2 -2
  62. package/dist/core/docs/swagger-ui.js +26 -29
  63. package/dist/core/docs/swagger-ui.js.map +1 -1
  64. package/dist/core/docs/zod-to-openapi.js +31 -28
  65. package/dist/core/docs/zod-to-openapi.js.map +1 -1
  66. package/dist/core/events/event-bus.d.ts +1 -1
  67. package/dist/core/events/event-bus.js +7 -11
  68. package/dist/core/events/event-bus.js.map +1 -1
  69. package/dist/core/events/index.d.ts +2 -2
  70. package/dist/core/events/index.js +1 -5
  71. package/dist/core/events/index.js.map +1 -1
  72. package/dist/core/framework.d.ts +20 -13
  73. package/dist/core/framework.js +285 -102
  74. package/dist/core/framework.js.map +1 -1
  75. package/dist/core/http/http-server.d.ts +59 -7
  76. package/dist/core/http/http-server.js +190 -176
  77. package/dist/core/http/http-server.js.map +1 -1
  78. package/dist/core/http/index.d.ts +4 -3
  79. package/dist/core/http/index.js +3 -8
  80. package/dist/core/http/index.js.map +1 -1
  81. package/dist/core/http/uws-http-server.d.ts +46 -0
  82. package/dist/core/http/uws-http-server.js +523 -0
  83. package/dist/core/http/uws-http-server.js.map +1 -0
  84. package/dist/core/logger/filters.d.ts +1 -1
  85. package/dist/core/logger/filters.js +20 -23
  86. package/dist/core/logger/filters.js.map +1 -1
  87. package/dist/core/logger/index.d.ts +3 -3
  88. package/dist/core/logger/index.js +2 -24
  89. package/dist/core/logger/index.js.map +1 -1
  90. package/dist/core/logger/logger.d.ts +30 -14
  91. package/dist/core/logger/logger.js +398 -223
  92. package/dist/core/logger/logger.js.map +1 -1
  93. package/dist/core/logger/outputs.d.ts +1 -1
  94. package/dist/core/logger/outputs.js +8 -17
  95. package/dist/core/logger/outputs.js.map +1 -1
  96. package/dist/core/middleware/built-in/adapters/cache/file.d.ts +1 -1
  97. package/dist/core/middleware/built-in/adapters/cache/file.js +10 -47
  98. package/dist/core/middleware/built-in/adapters/cache/file.js.map +1 -1
  99. package/dist/core/middleware/built-in/adapters/cache/index.d.ts +4 -4
  100. package/dist/core/middleware/built-in/adapters/cache/index.js +10 -17
  101. package/dist/core/middleware/built-in/adapters/cache/index.js.map +1 -1
  102. package/dist/core/middleware/built-in/adapters/cache/memory.d.ts +1 -1
  103. package/dist/core/middleware/built-in/adapters/cache/memory.js +3 -7
  104. package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -1
  105. package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +3 -1
  106. package/dist/core/middleware/built-in/adapters/cache/redis.js +11 -9
  107. package/dist/core/middleware/built-in/adapters/cache/redis.js.map +1 -1
  108. package/dist/core/middleware/built-in/adapters/cdn/azure.d.ts +1 -1
  109. package/dist/core/middleware/built-in/adapters/cdn/azure.js +3 -7
  110. package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +1 -1
  111. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.d.ts +1 -1
  112. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js +3 -7
  113. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -1
  114. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +3 -1
  115. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +12 -10
  116. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +1 -1
  117. package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +4 -4
  118. package/dist/core/middleware/built-in/adapters/cdn/index.js +10 -17
  119. package/dist/core/middleware/built-in/adapters/cdn/index.js.map +1 -1
  120. package/dist/core/middleware/built-in/adapters/index.d.ts +4 -4
  121. package/dist/core/middleware/built-in/adapters/index.js +4 -23
  122. package/dist/core/middleware/built-in/adapters/index.js.map +1 -1
  123. package/dist/core/middleware/built-in/auth-helpers.js +11 -22
  124. package/dist/core/middleware/built-in/auth-helpers.js.map +1 -1
  125. package/dist/core/middleware/built-in/auth-providers.d.ts +1 -1
  126. package/dist/core/middleware/built-in/auth-providers.js +4 -9
  127. package/dist/core/middleware/built-in/auth-providers.js.map +1 -1
  128. package/dist/core/middleware/built-in/auth.d.ts +2 -2
  129. package/dist/core/middleware/built-in/auth.js +93 -26
  130. package/dist/core/middleware/built-in/auth.js.map +1 -1
  131. package/dist/core/middleware/built-in/cache.d.ts +2 -2
  132. package/dist/core/middleware/built-in/cache.js +11 -12
  133. package/dist/core/middleware/built-in/cache.js.map +1 -1
  134. package/dist/core/middleware/built-in/cdn.d.ts +2 -2
  135. package/dist/core/middleware/built-in/cdn.js +5 -9
  136. package/dist/core/middleware/built-in/cdn.js.map +1 -1
  137. package/dist/core/middleware/built-in/cookie.d.ts +1 -1
  138. package/dist/core/middleware/built-in/cookie.js +3 -7
  139. package/dist/core/middleware/built-in/cookie.js.map +1 -1
  140. package/dist/core/middleware/built-in/cors.d.ts +1 -1
  141. package/dist/core/middleware/built-in/cors.js +3 -7
  142. package/dist/core/middleware/built-in/cors.js.map +1 -1
  143. package/dist/core/middleware/built-in/csp.d.ts +1 -1
  144. package/dist/core/middleware/built-in/csp.js +5 -8
  145. package/dist/core/middleware/built-in/csp.js.map +1 -1
  146. package/dist/core/middleware/built-in/csrf.d.ts +1 -1
  147. package/dist/core/middleware/built-in/csrf.js +5 -8
  148. package/dist/core/middleware/built-in/csrf.js.map +1 -1
  149. package/dist/core/middleware/built-in/error-tracker.js +3 -7
  150. package/dist/core/middleware/built-in/error-tracker.js.map +1 -1
  151. package/dist/core/middleware/built-in/index.d.ts +28 -27
  152. package/dist/core/middleware/built-in/index.js +48 -78
  153. package/dist/core/middleware/built-in/index.js.map +1 -1
  154. package/dist/core/middleware/built-in/jwt-helpers.d.ts +118 -0
  155. package/dist/core/middleware/built-in/jwt-helpers.js +218 -0
  156. package/dist/core/middleware/built-in/jwt-helpers.js.map +1 -0
  157. package/dist/core/middleware/built-in/performance-monitor.js +3 -7
  158. package/dist/core/middleware/built-in/performance-monitor.js.map +1 -1
  159. package/dist/core/middleware/built-in/rate-limit.d.ts +1 -1
  160. package/dist/core/middleware/built-in/rate-limit.js +3 -7
  161. package/dist/core/middleware/built-in/rate-limit.js.map +1 -1
  162. package/dist/core/middleware/built-in/request-logger.js +5 -8
  163. package/dist/core/middleware/built-in/request-logger.js.map +1 -1
  164. package/dist/core/middleware/built-in/session.d.ts +2 -2
  165. package/dist/core/middleware/built-in/session.js +11 -15
  166. package/dist/core/middleware/built-in/session.js.map +1 -1
  167. package/dist/core/middleware/built-in/sse.d.ts +1 -1
  168. package/dist/core/middleware/built-in/sse.js +12 -14
  169. package/dist/core/middleware/built-in/sse.js.map +1 -1
  170. package/dist/core/middleware/built-in/validation.d.ts +1 -1
  171. package/dist/core/middleware/built-in/validation.js +3 -7
  172. package/dist/core/middleware/built-in/validation.js.map +1 -1
  173. package/dist/core/middleware/index.d.ts +4 -4
  174. package/dist/core/middleware/index.js +8 -28
  175. package/dist/core/middleware/index.js.map +1 -1
  176. package/dist/core/modules/auto-discovery.d.ts +19 -2
  177. package/dist/core/modules/auto-discovery.js +391 -74
  178. package/dist/core/modules/auto-discovery.js.map +1 -1
  179. package/dist/core/modules/index.d.ts +2 -2
  180. package/dist/core/modules/index.js +2 -9
  181. package/dist/core/modules/index.js.map +1 -1
  182. package/dist/core/modules/modules.d.ts +3 -3
  183. package/dist/core/modules/modules.js +23 -54
  184. package/dist/core/modules/modules.js.map +1 -1
  185. package/dist/core/networking/adapters/index.d.ts +4 -3
  186. package/dist/core/networking/adapters/index.js +3 -7
  187. package/dist/core/networking/adapters/index.js.map +1 -1
  188. package/dist/core/networking/adapters/socketio-adapter.d.ts +1 -1
  189. package/dist/core/networking/adapters/socketio-adapter.js +5 -40
  190. package/dist/core/networking/adapters/socketio-adapter.js.map +1 -1
  191. package/dist/core/networking/adapters/uws-adapter.d.ts +44 -0
  192. package/dist/core/networking/adapters/uws-adapter.js +513 -0
  193. package/dist/core/networking/adapters/uws-adapter.js.map +1 -0
  194. package/dist/core/networking/adapters/ws-adapter.d.ts +2 -2
  195. package/dist/core/networking/adapters/ws-adapter.js +8 -43
  196. package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
  197. package/dist/core/networking/index.d.ts +3 -2
  198. package/dist/core/networking/index.js +2 -7
  199. package/dist/core/networking/index.js.map +1 -1
  200. package/dist/core/networking/service-discovery.js +8 -12
  201. package/dist/core/networking/service-discovery.js.map +1 -1
  202. package/dist/core/networking/websocket-adapter.js +1 -2
  203. package/dist/core/networking/websocket-adapter.js.map +1 -1
  204. package/dist/core/networking/websocket-manager.d.ts +3 -3
  205. package/dist/core/networking/websocket-manager.js +9 -11
  206. package/dist/core/networking/websocket-manager.js.map +1 -1
  207. package/dist/core/pooling/object-pool-manager.d.ts +140 -0
  208. package/dist/core/pooling/object-pool-manager.js +502 -0
  209. package/dist/core/pooling/object-pool-manager.js.map +1 -0
  210. package/dist/core/routing/app-integration.d.ts +14 -12
  211. package/dist/core/routing/app-integration.js +49 -85
  212. package/dist/core/routing/app-integration.js.map +1 -1
  213. package/dist/core/routing/index.d.ts +17 -11
  214. package/dist/core/routing/index.js +48 -237
  215. package/dist/core/routing/index.js.map +1 -1
  216. package/dist/core/routing/path-matcher.d.ts +67 -0
  217. package/dist/core/routing/path-matcher.js +182 -0
  218. package/dist/core/routing/path-matcher.js.map +1 -0
  219. package/dist/core/routing/router.d.ts +38 -0
  220. package/dist/core/routing/router.js +68 -0
  221. package/dist/core/routing/router.js.map +1 -0
  222. package/dist/core/routing/unified-router.d.ts +148 -0
  223. package/dist/core/routing/unified-router.js +684 -0
  224. package/dist/core/routing/unified-router.js.map +1 -0
  225. package/dist/core/runtime/aws-lambda-adapter.d.ts +3 -3
  226. package/dist/core/runtime/aws-lambda-adapter.js +2 -6
  227. package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
  228. package/dist/core/runtime/base-adapter.d.ts +2 -2
  229. package/dist/core/runtime/base-adapter.js +3 -7
  230. package/dist/core/runtime/base-adapter.js.map +1 -1
  231. package/dist/core/runtime/cloudflare-workers-adapter.d.ts +3 -3
  232. package/dist/core/runtime/cloudflare-workers-adapter.js +2 -6
  233. package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
  234. package/dist/core/runtime/index.d.ts +12 -12
  235. package/dist/core/runtime/index.js +22 -35
  236. package/dist/core/runtime/index.js.map +1 -1
  237. package/dist/core/runtime/node-adapter.d.ts +4 -4
  238. package/dist/core/runtime/node-adapter.js +18 -49
  239. package/dist/core/runtime/node-adapter.js.map +1 -1
  240. package/dist/core/runtime/vercel-edge-adapter.d.ts +3 -3
  241. package/dist/core/runtime/vercel-edge-adapter.js +2 -6
  242. package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
  243. package/dist/core/utilities/circuit-breaker.js +1 -5
  244. package/dist/core/utilities/circuit-breaker.js.map +1 -1
  245. package/dist/core/utilities/container.js +12 -22
  246. package/dist/core/utilities/container.js.map +1 -1
  247. package/dist/core/utilities/hooks.d.ts +2 -2
  248. package/dist/core/utilities/hooks.js +7 -12
  249. package/dist/core/utilities/hooks.js.map +1 -1
  250. package/dist/core/utilities/index.d.ts +5 -4
  251. package/dist/core/utilities/index.js +5 -19
  252. package/dist/core/utilities/index.js.map +1 -1
  253. package/dist/core/utilities/package-utils.d.ts +38 -0
  254. package/dist/core/utilities/package-utils.js +57 -0
  255. package/dist/core/utilities/package-utils.js.map +1 -0
  256. package/dist/core/validation/adapters.d.ts +1 -1
  257. package/dist/core/validation/adapters.js +15 -26
  258. package/dist/core/validation/adapters.js.map +1 -1
  259. package/dist/core/validation/index.d.ts +6 -4
  260. package/dist/core/validation/index.js +57 -28
  261. package/dist/core/validation/index.js.map +1 -1
  262. package/dist/core/validation/schema-interface.js +3 -9
  263. package/dist/core/validation/schema-interface.js.map +1 -1
  264. package/dist/index.d.ts +51 -52
  265. package/dist/index.js +23 -132
  266. package/dist/index.js.map +1 -1
  267. package/dist/moro.d.ts +70 -16
  268. package/dist/moro.js +658 -271
  269. package/dist/moro.js.map +1 -1
  270. package/dist/types/auth.js +3 -9
  271. package/dist/types/auth.js.map +1 -1
  272. package/dist/types/cache.js +1 -2
  273. package/dist/types/cdn.js +1 -2
  274. package/dist/types/config.d.ts +73 -2
  275. package/dist/types/config.js +1 -2
  276. package/dist/types/config.js.map +1 -1
  277. package/dist/types/core.d.ts +36 -42
  278. package/dist/types/core.js +1 -2
  279. package/dist/types/database.js +1 -2
  280. package/dist/types/discovery.js +1 -2
  281. package/dist/types/events.js +1 -2
  282. package/dist/types/hooks.d.ts +1 -1
  283. package/dist/types/hooks.js +1 -2
  284. package/dist/types/http.d.ts +16 -1
  285. package/dist/types/http.js +1 -2
  286. package/dist/types/logger.d.ts +7 -0
  287. package/dist/types/logger.js +1 -2
  288. package/dist/types/module.d.ts +11 -0
  289. package/dist/types/module.js +1 -2
  290. package/dist/types/runtime.d.ts +1 -1
  291. package/dist/types/runtime.js +1 -2
  292. package/dist/types/session.js +1 -2
  293. package/jest.config.mjs +41 -0
  294. package/package.json +19 -52
  295. package/src/core/auth/morojs-adapter.ts +18 -13
  296. package/src/core/config/config-manager.ts +133 -0
  297. package/src/core/config/config-sources.ts +600 -0
  298. package/src/core/config/config-validator.ts +1116 -0
  299. package/src/core/config/file-loader.ts +16 -273
  300. package/src/core/config/index.ts +83 -34
  301. package/src/core/config/schema.ts +47 -33
  302. package/src/core/config/utils.ts +24 -31
  303. package/src/core/database/README.md +26 -16
  304. package/src/core/database/adapters/drizzle.ts +18 -6
  305. package/src/core/database/adapters/index.ts +13 -13
  306. package/src/core/database/adapters/mongodb.ts +53 -5
  307. package/src/core/database/adapters/mysql.ts +32 -4
  308. package/src/core/database/adapters/postgresql.ts +30 -5
  309. package/src/core/database/adapters/redis.ts +61 -8
  310. package/src/core/database/adapters/sqlite.ts +19 -3
  311. package/src/core/database/index.ts +2 -2
  312. package/src/core/docs/index.ts +8 -8
  313. package/src/core/docs/openapi-generator.ts +4 -4
  314. package/src/core/docs/schema-to-openapi.ts +3 -6
  315. package/src/core/docs/simple-docs.ts +2 -2
  316. package/src/core/docs/swagger-ui.ts +19 -16
  317. package/src/core/docs/zod-to-openapi.ts +34 -34
  318. package/src/core/events/event-bus.ts +3 -3
  319. package/src/core/events/index.ts +2 -2
  320. package/src/core/framework.ts +320 -71
  321. package/src/core/http/http-server.ts +203 -143
  322. package/src/core/http/index.ts +4 -3
  323. package/src/core/http/uws-http-server.ts +591 -0
  324. package/src/core/logger/filters.ts +13 -5
  325. package/src/core/logger/index.ts +4 -3
  326. package/src/core/logger/logger.ts +435 -216
  327. package/src/core/logger/outputs.ts +1 -3
  328. package/src/core/middleware/built-in/adapters/cache/file.ts +3 -3
  329. package/src/core/middleware/built-in/adapters/cache/index.ts +7 -7
  330. package/src/core/middleware/built-in/adapters/cache/memory.ts +2 -2
  331. package/src/core/middleware/built-in/adapters/cache/redis.ts +18 -4
  332. package/src/core/middleware/built-in/adapters/cdn/azure.ts +2 -2
  333. package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +2 -2
  334. package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +16 -5
  335. package/src/core/middleware/built-in/adapters/cdn/index.ts +7 -7
  336. package/src/core/middleware/built-in/adapters/index.ts +4 -4
  337. package/src/core/middleware/built-in/auth-helpers.ts +1 -1
  338. package/src/core/middleware/built-in/auth-providers.ts +1 -1
  339. package/src/core/middleware/built-in/auth.ts +102 -21
  340. package/src/core/middleware/built-in/cache.ts +8 -6
  341. package/src/core/middleware/built-in/cdn.ts +4 -4
  342. package/src/core/middleware/built-in/cookie.ts +2 -2
  343. package/src/core/middleware/built-in/cors.ts +2 -2
  344. package/src/core/middleware/built-in/csp.ts +3 -3
  345. package/src/core/middleware/built-in/csrf.ts +3 -3
  346. package/src/core/middleware/built-in/error-tracker.ts +1 -1
  347. package/src/core/middleware/built-in/index.ts +38 -30
  348. package/src/core/middleware/built-in/jwt-helpers.ts +243 -0
  349. package/src/core/middleware/built-in/performance-monitor.ts +1 -1
  350. package/src/core/middleware/built-in/rate-limit.ts +2 -2
  351. package/src/core/middleware/built-in/request-logger.ts +3 -1
  352. package/src/core/middleware/built-in/session.ts +7 -8
  353. package/src/core/middleware/built-in/sse.ts +11 -9
  354. package/src/core/middleware/built-in/validation.ts +2 -2
  355. package/src/core/middleware/index.ts +6 -6
  356. package/src/core/modules/auto-discovery.ts +478 -15
  357. package/src/core/modules/index.ts +2 -2
  358. package/src/core/modules/modules.ts +23 -12
  359. package/src/core/networking/adapters/index.ts +4 -3
  360. package/src/core/networking/adapters/socketio-adapter.ts +5 -3
  361. package/src/core/networking/adapters/uws-adapter.ts +619 -0
  362. package/src/core/networking/adapters/ws-adapter.ts +8 -9
  363. package/src/core/networking/index.ts +3 -2
  364. package/src/core/networking/service-discovery.ts +6 -7
  365. package/src/core/networking/websocket-manager.ts +7 -7
  366. package/src/core/pooling/object-pool-manager.ts +630 -0
  367. package/src/core/routing/app-integration.ts +60 -112
  368. package/src/core/routing/index.ts +66 -293
  369. package/src/core/routing/path-matcher.ts +222 -0
  370. package/src/core/routing/router.ts +97 -0
  371. package/src/core/routing/unified-router.ts +870 -0
  372. package/src/core/runtime/aws-lambda-adapter.ts +3 -3
  373. package/src/core/runtime/base-adapter.ts +2 -2
  374. package/src/core/runtime/cloudflare-workers-adapter.ts +3 -3
  375. package/src/core/runtime/index.ts +13 -13
  376. package/src/core/runtime/node-adapter.ts +16 -10
  377. package/src/core/runtime/vercel-edge-adapter.ts +3 -3
  378. package/src/core/utilities/hooks.ts +3 -3
  379. package/src/core/utilities/index.ts +5 -4
  380. package/src/core/utilities/package-utils.ts +59 -0
  381. package/src/core/validation/adapters.ts +1 -1
  382. package/src/core/validation/index.ts +68 -16
  383. package/src/index.ts +73 -66
  384. package/src/moro.ts +784 -253
  385. package/src/types/config.ts +74 -2
  386. package/src/types/core.ts +49 -47
  387. package/src/types/hooks.ts +1 -1
  388. package/src/types/http.ts +23 -1
  389. package/src/types/logger.ts +9 -0
  390. package/src/types/module.ts +12 -0
  391. package/src/types/runtime.ts +1 -1
  392. package/tsconfig.json +4 -2
  393. package/dist/core/config/loader.d.ts +0 -7
  394. package/dist/core/config/loader.js +0 -269
  395. package/dist/core/config/loader.js.map +0 -1
  396. package/dist/core/config/validation.d.ts +0 -17
  397. package/dist/core/config/validation.js +0 -131
  398. package/dist/core/config/validation.js.map +0 -1
  399. package/dist/core/http/router.d.ts +0 -14
  400. package/dist/core/http/router.js +0 -109
  401. package/dist/core/http/router.js.map +0 -1
  402. package/src/core/config/loader.ts +0 -633
  403. package/src/core/config/validation.ts +0 -140
  404. package/src/core/http/router.ts +0 -141
@@ -0,0 +1,870 @@
1
+ // Unified Router - Consolidates Intelligent Router and Core Router
2
+ // Combines best features from both systems with zero breaking changes
3
+
4
+ import { PathMatcher, CompiledPath } from './path-matcher.js';
5
+ import { ObjectPoolManager } from '../pooling/object-pool-manager.js';
6
+ import { createFrameworkLogger } from '../logger/index.js';
7
+ import { HttpRequest, HttpResponse } from '../../types/http.js';
8
+ import { ValidationSchema } from '../validation/schema-interface.js';
9
+
10
+ const logger = createFrameworkLogger('UnifiedRouter');
11
+
12
+ // ===== Types =====
13
+
14
+ export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS';
15
+ export type RouteHandler<T = any> = (req: HttpRequest, res: HttpResponse) => T | Promise<T>;
16
+ export type Middleware = (
17
+ req: HttpRequest,
18
+ res: HttpResponse,
19
+ next: () => void
20
+ ) => void | Promise<void>;
21
+
22
+ export interface ValidationConfig {
23
+ body?: ValidationSchema;
24
+ query?: ValidationSchema;
25
+ params?: ValidationSchema;
26
+ headers?: ValidationSchema;
27
+ }
28
+
29
+ export interface AuthConfig {
30
+ roles?: string[];
31
+ permissions?: string[];
32
+ optional?: boolean;
33
+ }
34
+
35
+ export interface RateLimitConfig {
36
+ requests: number;
37
+ window: number;
38
+ skipSuccessfulRequests?: boolean;
39
+ }
40
+
41
+ export interface CacheConfig {
42
+ ttl: number;
43
+ key?: string;
44
+ tags?: string[];
45
+ }
46
+
47
+ export interface MiddlewarePhases {
48
+ before?: Middleware[];
49
+ after?: Middleware[];
50
+ transform?: Middleware[];
51
+ }
52
+
53
+ export interface RouteSchema {
54
+ method: HttpMethod;
55
+ path: string;
56
+ handler: RouteHandler;
57
+ validation?: ValidationConfig;
58
+ auth?: AuthConfig;
59
+ rateLimit?: RateLimitConfig;
60
+ cache?: CacheConfig;
61
+ middleware?: MiddlewarePhases | Middleware[];
62
+ description?: string;
63
+ tags?: string[];
64
+ }
65
+
66
+ // Internal route representation
67
+ interface InternalRoute {
68
+ schema: RouteSchema;
69
+ compiledPath: CompiledPath;
70
+ isFastPath: boolean; // No middleware, auth, validation, rate limiting
71
+ executionOrder: string[]; // Ordered list of execution phases
72
+ }
73
+
74
+ // ===== Route Builder (Chainable API) =====
75
+
76
+ export class RouteBuilder {
77
+ private schema: Partial<RouteSchema>;
78
+ private router: UnifiedRouter;
79
+
80
+ constructor(method: HttpMethod, path: string, router: UnifiedRouter) {
81
+ this.schema = {
82
+ method,
83
+ path,
84
+ middleware: {} as MiddlewarePhases,
85
+ };
86
+ this.router = router;
87
+ }
88
+
89
+ // Validation methods
90
+ validate(config: ValidationConfig): this {
91
+ this.schema.validation = { ...this.schema.validation, ...config };
92
+ return this;
93
+ }
94
+
95
+ body<T>(schema: ValidationSchema<T>): this {
96
+ if (!this.schema.validation) this.schema.validation = {};
97
+ this.schema.validation.body = schema;
98
+ return this;
99
+ }
100
+
101
+ query<T>(schema: ValidationSchema<T>): this {
102
+ if (!this.schema.validation) this.schema.validation = {};
103
+ this.schema.validation.query = schema;
104
+ return this;
105
+ }
106
+
107
+ params<T>(schema: ValidationSchema<T>): this {
108
+ if (!this.schema.validation) this.schema.validation = {};
109
+ this.schema.validation.params = schema;
110
+ return this;
111
+ }
112
+
113
+ headers<T>(schema: ValidationSchema<T>): this {
114
+ if (!this.schema.validation) this.schema.validation = {};
115
+ this.schema.validation.headers = schema;
116
+ return this;
117
+ }
118
+
119
+ // Security methods
120
+ auth(config: AuthConfig): this {
121
+ this.schema.auth = config;
122
+ return this;
123
+ }
124
+
125
+ rateLimit(config: RateLimitConfig): this {
126
+ this.schema.rateLimit = config;
127
+ return this;
128
+ }
129
+
130
+ // Caching
131
+ cache(config: CacheConfig): this {
132
+ this.schema.cache = config;
133
+ return this;
134
+ }
135
+
136
+ // Custom middleware
137
+ before(...middleware: Middleware[]): this {
138
+ if (!this.schema.middleware) this.schema.middleware = {};
139
+ const phases = this.schema.middleware as MiddlewarePhases;
140
+ phases.before = [...(phases.before || []), ...middleware];
141
+ return this;
142
+ }
143
+
144
+ after(...middleware: Middleware[]): this {
145
+ if (!this.schema.middleware) this.schema.middleware = {};
146
+ const phases = this.schema.middleware as MiddlewarePhases;
147
+ phases.after = [...(phases.after || []), ...middleware];
148
+ return this;
149
+ }
150
+
151
+ transform(...middleware: Middleware[]): this {
152
+ if (!this.schema.middleware) this.schema.middleware = {};
153
+ const phases = this.schema.middleware as MiddlewarePhases;
154
+ phases.transform = [...(phases.transform || []), ...middleware];
155
+ return this;
156
+ }
157
+
158
+ use(...middleware: Middleware[]): this {
159
+ return this.after(...middleware);
160
+ }
161
+
162
+ // Metadata
163
+ describe(description: string): this {
164
+ this.schema.description = description;
165
+ return this;
166
+ }
167
+
168
+ tag(...tags: string[]): this {
169
+ this.schema.tags = [...(this.schema.tags || []), ...tags];
170
+ return this;
171
+ }
172
+
173
+ // Terminal method
174
+ handler<T>(handler: RouteHandler<T>): void {
175
+ if (!handler) {
176
+ throw new Error('Handler is required');
177
+ }
178
+
179
+ const completeSchema: RouteSchema = {
180
+ ...(this.schema as RouteSchema),
181
+ handler,
182
+ };
183
+
184
+ this.router.registerRoute(completeSchema);
185
+ }
186
+ }
187
+
188
+ // ===== Unified Router =====
189
+
190
+ export class UnifiedRouter {
191
+ private static instance: UnifiedRouter | null = null;
192
+
193
+ private readonly poolManager = ObjectPoolManager.getInstance();
194
+
195
+ // Route storage optimized for different access patterns
196
+ private staticRoutes = new Map<string, InternalRoute>(); // O(1) lookup: "GET:/api/users"
197
+ private dynamicRoutesBySegments = new Map<number, InternalRoute[]>(); // Grouped by segment count
198
+ private fastPathRoutes = new Set<InternalRoute>(); // Routes with no middleware
199
+ private allRoutes: InternalRoute[] = []; // For iteration/inspection
200
+
201
+ // Statistics
202
+ private stats = {
203
+ totalRoutes: 0,
204
+ staticRoutes: 0,
205
+ dynamicRoutes: 0,
206
+ fastPathRoutes: 0,
207
+ requestCount: 0,
208
+ fastPathHits: 0,
209
+ staticHits: 0,
210
+ dynamicHits: 0,
211
+ cacheHits: 0,
212
+ };
213
+
214
+ constructor() {
215
+ logger.debug('UnifiedRouter initialized', 'Initialization');
216
+ }
217
+
218
+ /**
219
+ * Get singleton instance (optional - can still create new instances)
220
+ */
221
+ static getInstance(): UnifiedRouter {
222
+ if (!this.instance) {
223
+ this.instance = new UnifiedRouter();
224
+ logger.info(`UnifiedRouter initialized (PID: ${process.pid})`, 'Router');
225
+ }
226
+ return this.instance;
227
+ }
228
+
229
+ /**
230
+ * Reset singleton (useful for testing)
231
+ */
232
+ static reset(): void {
233
+ if (this.instance) {
234
+ this.instance.clearAllRoutes();
235
+ }
236
+ this.instance = null;
237
+ }
238
+
239
+ /**
240
+ * Clear all routes (useful for testing)
241
+ */
242
+ clearAllRoutes(): void {
243
+ this.staticRoutes.clear();
244
+ this.dynamicRoutesBySegments.clear();
245
+ this.fastPathRoutes.clear();
246
+ this.allRoutes = [];
247
+ this.stats = {
248
+ totalRoutes: 0,
249
+ staticRoutes: 0,
250
+ dynamicRoutes: 0,
251
+ fastPathRoutes: 0,
252
+ requestCount: 0,
253
+ fastPathHits: 0,
254
+ staticHits: 0,
255
+ dynamicHits: 0,
256
+ cacheHits: 0,
257
+ };
258
+ logger.debug('UnifiedRouter routes cleared', 'Reset');
259
+ }
260
+
261
+ // ===== Route Registration =====
262
+
263
+ /**
264
+ * Register a route (internal method)
265
+ */
266
+ registerRoute(schema: RouteSchema): void {
267
+ // Compile path pattern
268
+ const compiledPath = PathMatcher.compile(schema.path);
269
+
270
+ // Determine if this is a fast-path route
271
+ const isFastPath = this.isFastPathRoute(schema);
272
+
273
+ // Determine execution order
274
+ const executionOrder = this.buildExecutionOrder(schema);
275
+
276
+ const route: InternalRoute = {
277
+ schema,
278
+ compiledPath,
279
+ isFastPath,
280
+ executionOrder,
281
+ };
282
+
283
+ // Store in appropriate structures
284
+ if (compiledPath.isStatic) {
285
+ const key = `${schema.method}:${schema.path}`;
286
+ this.staticRoutes.set(key, route);
287
+ this.stats.staticRoutes++;
288
+ } else {
289
+ // Group by segment count for faster matching
290
+ const segmentCount = compiledPath.segments;
291
+ if (!this.dynamicRoutesBySegments.has(segmentCount)) {
292
+ this.dynamicRoutesBySegments.set(segmentCount, []);
293
+ }
294
+ this.dynamicRoutesBySegments.get(segmentCount)!.push(route);
295
+ this.stats.dynamicRoutes++;
296
+ }
297
+
298
+ if (isFastPath) {
299
+ this.fastPathRoutes.add(route);
300
+ this.stats.fastPathRoutes++;
301
+ }
302
+
303
+ this.allRoutes.push(route);
304
+ this.stats.totalRoutes++;
305
+
306
+ logger.info(
307
+ `Registered route: ${schema.method} ${schema.path} (PID: ${process.pid}, total: ${this.stats.totalRoutes})`,
308
+ 'Registration',
309
+ {
310
+ isStatic: compiledPath.isStatic,
311
+ isFastPath,
312
+ segments: compiledPath.segments,
313
+ }
314
+ );
315
+ }
316
+
317
+ /**
318
+ * Chainable API methods
319
+ */
320
+ get(path: string): RouteBuilder {
321
+ return new RouteBuilder('GET', path, this);
322
+ }
323
+
324
+ post(path: string): RouteBuilder {
325
+ return new RouteBuilder('POST', path, this);
326
+ }
327
+
328
+ put(path: string): RouteBuilder {
329
+ return new RouteBuilder('PUT', path, this);
330
+ }
331
+
332
+ delete(path: string): RouteBuilder {
333
+ return new RouteBuilder('DELETE', path, this);
334
+ }
335
+
336
+ patch(path: string): RouteBuilder {
337
+ return new RouteBuilder('PATCH', path, this);
338
+ }
339
+
340
+ head(path: string): RouteBuilder {
341
+ return new RouteBuilder('HEAD', path, this);
342
+ }
343
+
344
+ options(path: string): RouteBuilder {
345
+ return new RouteBuilder('OPTIONS', path, this);
346
+ }
347
+
348
+ /**
349
+ * Schema-first route registration
350
+ */
351
+ route(schema: RouteSchema): void {
352
+ this.registerRoute(schema);
353
+ }
354
+
355
+ /**
356
+ * Direct API (for backward compatibility)
357
+ */
358
+ addRoute(
359
+ method: HttpMethod,
360
+ path: string,
361
+ handler: RouteHandler,
362
+ middleware: Middleware[] = []
363
+ ): void {
364
+ this.registerRoute({
365
+ method,
366
+ path,
367
+ handler,
368
+ middleware,
369
+ });
370
+ }
371
+
372
+ // ===== Route Matching =====
373
+
374
+ /**
375
+ * Find a matching route for the request
376
+ * Returns boolean (sync) for fast-path routes, Promise<boolean> for others
377
+ */
378
+ handleRequest(req: HttpRequest, res: HttpResponse): Promise<boolean> | boolean {
379
+ // PERFORMANCE: Only increment stats counter, not individual metrics in hot path
380
+ this.stats.requestCount++;
381
+
382
+ const method = req.method?.toUpperCase() as HttpMethod;
383
+ const path = req.path;
384
+
385
+ // Phase 1: No middleware, auth, validation, or rate limiting
386
+ // Optimized for synchronous execution when possible
387
+ if (this.fastPathRoutes.size > 0) {
388
+ for (const route of this.fastPathRoutes) {
389
+ if (route.schema.method === method) {
390
+ // Inline parameter extraction for speed (avoid function call overhead)
391
+ if (route.compiledPath.isStatic) {
392
+ if (route.compiledPath.path === path) {
393
+ // Static route match
394
+ req.params = {};
395
+
396
+ try {
397
+ const result = route.schema.handler(req, res);
398
+
399
+ // Check if result is a promise (optimized check)
400
+ if (result && typeof (result as any).then === 'function') {
401
+ // Async handler - return promise
402
+ return (result as Promise<any>)
403
+ .then(actualResult => {
404
+ if (actualResult !== undefined && !res.headersSent) {
405
+ res.json(actualResult);
406
+ }
407
+ return true;
408
+ })
409
+ .catch(() => {
410
+ if (!res.headersSent) {
411
+ res.status(500).json({ error: 'Internal server error' });
412
+ }
413
+ return true;
414
+ });
415
+ } else {
416
+ // Sync handler - handle synchronously (fastest path!)
417
+ if (result !== undefined && !res.headersSent) {
418
+ res.json(result);
419
+ }
420
+ return true;
421
+ }
422
+ } catch (error) {
423
+ if (!res.headersSent) {
424
+ res.status(500).json({ error: 'Internal server error' });
425
+ }
426
+ return true;
427
+ }
428
+ }
429
+ } else {
430
+ // Dynamic route - use regex matching
431
+ const pattern = route.compiledPath.pattern;
432
+ if (pattern) {
433
+ const matches = path.match(pattern);
434
+ if (matches) {
435
+ // Extract params inline (avoid function call)
436
+ const params: Record<string, string> = {};
437
+ const paramNames = route.compiledPath.paramNames;
438
+ for (let i = 0; i < paramNames.length; i++) {
439
+ params[paramNames[i]] = matches[i + 1];
440
+ }
441
+ req.params = params;
442
+
443
+ try {
444
+ const result = route.schema.handler(req, res);
445
+
446
+ if (result && typeof (result as any).then === 'function') {
447
+ return (result as Promise<any>)
448
+ .then(actualResult => {
449
+ if (actualResult !== undefined && !res.headersSent) {
450
+ res.json(actualResult);
451
+ }
452
+ return true;
453
+ })
454
+ .catch(() => {
455
+ if (!res.headersSent) {
456
+ res.status(500).json({ error: 'Internal server error' });
457
+ }
458
+ return true;
459
+ });
460
+ } else {
461
+ if (result !== undefined && !res.headersSent) {
462
+ res.json(result);
463
+ }
464
+ return true;
465
+ }
466
+ } catch (error) {
467
+ if (!res.headersSent) {
468
+ res.status(500).json({ error: 'Internal server error' });
469
+ }
470
+ return true;
471
+ }
472
+ }
473
+ }
474
+ }
475
+ }
476
+ }
477
+ }
478
+
479
+ // Phase 2 & 3: Non-fast-path routes (async)
480
+ return (async () => {
481
+ // Phase 2: O(1) static route lookup
482
+ const staticKey = `${method}:${path}`;
483
+
484
+ // Check pool manager cache
485
+ const cachedRoute = this.poolManager.getCachedRoute(staticKey);
486
+ if (cachedRoute) {
487
+ await this.executeRoute(cachedRoute, req, res, { params: {} });
488
+ return true;
489
+ }
490
+
491
+ const staticRoute = this.staticRoutes.get(staticKey);
492
+ if (staticRoute) {
493
+ this.poolManager.cacheRoute(staticKey, staticRoute);
494
+ req.params = {};
495
+ await this.executeRoute(staticRoute, req, res, { params: {} });
496
+ return true;
497
+ }
498
+
499
+ // Phase 3: Segment-based dynamic route matching
500
+ const segments = path.split('/').filter(s => s.length > 0);
501
+ const segmentCount = segments.length;
502
+ const candidates = this.dynamicRoutesBySegments.get(segmentCount) || [];
503
+
504
+ for (const route of candidates) {
505
+ if (route.schema.method === method) {
506
+ const matchResult = PathMatcher.match(route.compiledPath, path);
507
+ if (matchResult) {
508
+ this.poolManager.cacheRoute(staticKey, route);
509
+ await this.executeRoute(route, req, res, matchResult);
510
+ return true;
511
+ }
512
+ }
513
+ }
514
+
515
+ // No route found
516
+ return false;
517
+ })();
518
+ }
519
+
520
+ // ===== Route Execution =====
521
+
522
+ private async executeRoute(
523
+ route: InternalRoute,
524
+ req: HttpRequest,
525
+ res: HttpResponse,
526
+ matchResult: { params: Record<string, string> }
527
+ ): Promise<void> {
528
+ // Set params from pool
529
+ req.params = this.poolManager.acquireParams();
530
+ Object.assign(req.params, matchResult.params);
531
+
532
+ try {
533
+ // Execute middleware phases in order
534
+ for (const phase of route.executionOrder) {
535
+ if (res.headersSent) break;
536
+ await this.executePhase(phase, route, req, res);
537
+ }
538
+
539
+ // Execute handler
540
+ if (!res.headersSent) {
541
+ const result = await route.schema.handler(req, res);
542
+ if (result !== undefined && !res.headersSent) {
543
+ await res.json(result);
544
+ }
545
+ }
546
+ } catch (error) {
547
+ logger.error('Route execution error', 'Execution', {
548
+ error: error instanceof Error ? error.message : String(error),
549
+ route: `${route.schema.method} ${route.schema.path}`,
550
+ });
551
+
552
+ if (!res.headersSent) {
553
+ res.status(500).json({
554
+ success: false,
555
+ error: 'Internal server error',
556
+ requestId: req.requestId,
557
+ });
558
+ }
559
+ } finally {
560
+ // Release params back to pool
561
+ if (req.params) {
562
+ this.poolManager.releaseParams(req.params);
563
+ }
564
+ }
565
+ }
566
+
567
+ private async executePhase(
568
+ phase: string,
569
+ route: InternalRoute,
570
+ req: HttpRequest,
571
+ res: HttpResponse
572
+ ): Promise<void> {
573
+ const schema = route.schema;
574
+ const middleware = schema.middleware;
575
+
576
+ switch (phase) {
577
+ case 'before':
578
+ if (middleware && 'before' in middleware && Array.isArray(middleware.before)) {
579
+ for (const mw of middleware.before) {
580
+ await this.executeMiddleware(mw, req, res);
581
+ if (res.headersSent) return;
582
+ }
583
+ }
584
+ break;
585
+
586
+ case 'rateLimit':
587
+ if (schema.rateLimit) {
588
+ await this.executeRateLimit(req, res, schema.rateLimit);
589
+ }
590
+ break;
591
+
592
+ case 'auth':
593
+ if (schema.auth) {
594
+ await this.executeAuth(req, res, schema.auth);
595
+ }
596
+ break;
597
+
598
+ case 'validation':
599
+ if (schema.validation) {
600
+ await this.executeValidation(req, res, schema.validation);
601
+ }
602
+ break;
603
+
604
+ case 'transform':
605
+ if (middleware && 'transform' in middleware && Array.isArray(middleware.transform)) {
606
+ for (const mw of middleware.transform) {
607
+ await this.executeMiddleware(mw, req, res);
608
+ if (res.headersSent) return;
609
+ }
610
+ }
611
+ break;
612
+
613
+ case 'cache':
614
+ if (schema.cache) {
615
+ await this.executeCache(req, res, schema.cache);
616
+ }
617
+ break;
618
+
619
+ case 'after':
620
+ if (middleware && 'after' in middleware && Array.isArray(middleware.after)) {
621
+ for (const mw of middleware.after) {
622
+ await this.executeMiddleware(mw, req, res);
623
+ if (res.headersSent) return;
624
+ }
625
+ }
626
+ break;
627
+
628
+ case 'middleware':
629
+ // Handle array-style middleware (backward compatibility)
630
+ if (middleware && Array.isArray(middleware)) {
631
+ for (const mw of middleware) {
632
+ await this.executeMiddleware(mw, req, res);
633
+ if (res.headersSent) return;
634
+ }
635
+ }
636
+ break;
637
+ }
638
+ }
639
+
640
+ private async executeMiddleware(
641
+ middleware: Middleware,
642
+ req: HttpRequest,
643
+ res: HttpResponse
644
+ ): Promise<void> {
645
+ return new Promise((resolve, reject) => {
646
+ let resolved = false;
647
+
648
+ const next = () => {
649
+ if (!resolved) {
650
+ resolved = true;
651
+ resolve();
652
+ }
653
+ };
654
+
655
+ try {
656
+ const result = middleware(req, res, next);
657
+ if (result instanceof Promise) {
658
+ result.then(() => !resolved && next()).catch(reject);
659
+ } else if (!resolved) {
660
+ next();
661
+ }
662
+ } catch (error) {
663
+ if (!resolved) {
664
+ resolved = true;
665
+ reject(error);
666
+ }
667
+ }
668
+ });
669
+ }
670
+
671
+ private async executeRateLimit(
672
+ _req: HttpRequest,
673
+ _res: HttpResponse,
674
+ _config: RateLimitConfig
675
+ ): Promise<void> {
676
+ // Rate limiting implementation placeholder
677
+ // TODO: Implement actual rate limiting logic
678
+ }
679
+
680
+ private async executeAuth(
681
+ req: HttpRequest,
682
+ res: HttpResponse,
683
+ config: AuthConfig
684
+ ): Promise<void> {
685
+ const auth = (req as any).auth;
686
+
687
+ if (!auth) {
688
+ res.status(500).json({
689
+ success: false,
690
+ error: 'Authentication middleware not configured',
691
+ });
692
+ return;
693
+ }
694
+
695
+ if (!config.optional && !auth.isAuthenticated) {
696
+ res.status(401).json({
697
+ success: false,
698
+ error: 'Authentication required',
699
+ });
700
+ return;
701
+ }
702
+
703
+ if (auth.isAuthenticated && config.roles) {
704
+ const userRoles = auth.user?.roles || [];
705
+ const hasRole = config.roles.some(role => userRoles.includes(role));
706
+ if (!hasRole) {
707
+ res.status(403).json({
708
+ success: false,
709
+ error: 'Insufficient permissions',
710
+ message: `Required roles: ${config.roles.join(', ')}`,
711
+ });
712
+ return;
713
+ }
714
+ }
715
+
716
+ if (auth.isAuthenticated && config.permissions) {
717
+ const userPermissions = auth.user?.permissions || [];
718
+ const hasPermission = config.permissions.every(permission =>
719
+ userPermissions.includes(permission)
720
+ );
721
+ if (!hasPermission) {
722
+ res.status(403).json({
723
+ success: false,
724
+ error: 'Insufficient permissions',
725
+ message: `Required permissions: ${config.permissions.join(', ')}`,
726
+ });
727
+ return;
728
+ }
729
+ }
730
+ }
731
+
732
+ private async executeValidation(
733
+ req: HttpRequest,
734
+ res: HttpResponse,
735
+ config: ValidationConfig
736
+ ): Promise<void> {
737
+ try {
738
+ if (config.body && req.body !== undefined) {
739
+ (req as any).validatedBody = await config.body.parseAsync(req.body);
740
+ req.body = (req as any).validatedBody;
741
+ }
742
+
743
+ if (config.query && req.query !== undefined) {
744
+ (req as any).validatedQuery = await config.query.parseAsync(req.query);
745
+ req.query = (req as any).validatedQuery;
746
+ }
747
+
748
+ if (config.params && req.params !== undefined) {
749
+ (req as any).validatedParams = await config.params.parseAsync(req.params);
750
+ req.params = (req as any).validatedParams;
751
+ }
752
+
753
+ if (config.headers && req.headers !== undefined) {
754
+ (req as any).validatedHeaders = await config.headers.parseAsync(req.headers);
755
+ }
756
+ } catch (error: any) {
757
+ const field = error.field || 'unknown';
758
+ if (error.issues) {
759
+ res.status(400).json({
760
+ success: false,
761
+ error: `Validation failed for ${field}`,
762
+ details: error.issues.map((issue: any) => ({
763
+ field: issue.path.length > 0 ? issue.path.join('.') : field,
764
+ message: issue.message,
765
+ code: issue.code,
766
+ })),
767
+ requestId: req.requestId,
768
+ });
769
+ } else {
770
+ res.status(400).json({
771
+ success: false,
772
+ error: `Validation failed for ${field}`,
773
+ requestId: req.requestId,
774
+ });
775
+ }
776
+ }
777
+ }
778
+
779
+ private async executeCache(
780
+ _req: HttpRequest,
781
+ _res: HttpResponse,
782
+ _config: CacheConfig
783
+ ): Promise<void> {
784
+ // Cache implementation placeholder
785
+ // TODO: Implement actual caching logic
786
+ }
787
+
788
+ // ===== Helper Methods =====
789
+
790
+ private isFastPathRoute(schema: RouteSchema): boolean {
791
+ const middleware = schema.middleware;
792
+ const hasMiddleware =
793
+ (middleware && Array.isArray(middleware) && middleware.length > 0) ||
794
+ (middleware &&
795
+ typeof middleware === 'object' &&
796
+ ((middleware as MiddlewarePhases).before?.length ||
797
+ (middleware as MiddlewarePhases).after?.length ||
798
+ (middleware as MiddlewarePhases).transform?.length));
799
+
800
+ return (
801
+ !schema.auth && !schema.validation && !schema.rateLimit && !schema.cache && !hasMiddleware
802
+ );
803
+ }
804
+
805
+ private buildExecutionOrder(schema: RouteSchema): string[] {
806
+ const order: string[] = [];
807
+ const middleware = schema.middleware;
808
+
809
+ // Phase-based middleware
810
+ if (middleware && 'before' in middleware && middleware.before?.length) {
811
+ order.push('before');
812
+ }
813
+
814
+ if (schema.rateLimit) order.push('rateLimit');
815
+ if (schema.auth) order.push('auth');
816
+ if (schema.validation) order.push('validation');
817
+
818
+ if (middleware && 'transform' in middleware && middleware.transform?.length) {
819
+ order.push('transform');
820
+ }
821
+
822
+ if (schema.cache) order.push('cache');
823
+
824
+ if (middleware && 'after' in middleware && middleware.after?.length) {
825
+ order.push('after');
826
+ }
827
+
828
+ // Array-style middleware (backward compatibility)
829
+ if (middleware && Array.isArray(middleware) && middleware.length > 0) {
830
+ order.push('middleware');
831
+ }
832
+
833
+ return order;
834
+ }
835
+
836
+ // ===== Inspection Methods =====
837
+
838
+ getAllRoutes(): RouteSchema[] {
839
+ return this.allRoutes.map(r => r.schema);
840
+ }
841
+
842
+ getRouteCount(): number {
843
+ return this.stats.totalRoutes;
844
+ }
845
+
846
+ getStats() {
847
+ return {
848
+ ...this.stats,
849
+ poolManager: this.poolManager.getPerformanceSummary(),
850
+ pathMatcher: PathMatcher.getStats(),
851
+ };
852
+ }
853
+
854
+ logPerformanceStats(): void {
855
+ const stats = this.getStats();
856
+ logger.info('UnifiedRouter Performance', 'Stats', {
857
+ totalRoutes: stats.totalRoutes,
858
+ staticRoutes: stats.staticRoutes,
859
+ dynamicRoutes: stats.dynamicRoutes,
860
+ fastPathRoutes: stats.fastPathRoutes,
861
+ requests: stats.requestCount,
862
+ poolManager: {
863
+ routeCacheHitRate: stats.poolManager.routeCacheHitRate.toFixed(1) + '%',
864
+ responseCacheHitRate: stats.poolManager.responseCacheHitRate.toFixed(1) + '%',
865
+ paramPoolUtilization: stats.poolManager.paramPoolUtilization.toFixed(1) + '%',
866
+ totalMemoryKB: stats.poolManager.totalMemoryKB.toFixed(1) + ' KB',
867
+ },
868
+ });
869
+ }
870
+ }