@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
@@ -1,6 +1,7 @@
1
1
  // Database PostgreSQL Adapter
2
- import { DatabaseAdapter, DatabaseTransaction } from '../../../types/database';
3
- import { createFrameworkLogger } from '../../logger';
2
+ import { DatabaseAdapter, DatabaseTransaction } from '../../../types/database.js';
3
+ import { createFrameworkLogger } from '../../logger/index.js';
4
+ import { resolveUserPackage } from '../../utilities/package-utils.js';
4
5
 
5
6
  interface PostgreSQLConfig {
6
7
  host?: string;
@@ -9,16 +10,33 @@ interface PostgreSQLConfig {
9
10
  password?: string;
10
11
  database?: string;
11
12
  connectionLimit?: number;
12
- ssl?: boolean;
13
+ ssl?:
14
+ | {
15
+ rejectUnauthorized?: boolean;
16
+ ca?: string;
17
+ cert?: string;
18
+ key?: string;
19
+ passphrase?: string;
20
+ servername?: string;
21
+ checkServerIdentity?: boolean;
22
+ }
23
+ | boolean;
13
24
  }
14
25
 
15
26
  export class PostgreSQLAdapter implements DatabaseAdapter {
16
27
  private pool: any;
17
28
  private logger = createFrameworkLogger('PostgreSQL');
29
+ private initPromise: Promise<void>;
18
30
 
19
31
  constructor(config: PostgreSQLConfig) {
32
+ this.initPromise = this.initialize(config);
33
+ }
34
+
35
+ private async initialize(config: PostgreSQLConfig): Promise<void> {
20
36
  try {
21
- const { Pool } = require('pg');
37
+ const pgPath = resolveUserPackage('pg');
38
+ const pg = await import(pgPath);
39
+ const { Pool } = pg.default;
22
40
  this.pool = new Pool({
23
41
  host: config.host || 'localhost',
24
42
  port: config.port || 5432,
@@ -26,7 +44,7 @@ export class PostgreSQLAdapter implements DatabaseAdapter {
26
44
  password: config.password || '',
27
45
  database: config.database || 'moro_app',
28
46
  max: config.connectionLimit || 10,
29
- ssl: config.ssl || false,
47
+ ssl: typeof config.ssl === 'object' ? { ...config.ssl } : config.ssl || false,
30
48
  });
31
49
 
32
50
  this.pool.on('error', (err: Error) => {
@@ -44,6 +62,7 @@ export class PostgreSQLAdapter implements DatabaseAdapter {
44
62
  }
45
63
 
46
64
  async connect(): Promise<void> {
65
+ await this.initPromise;
47
66
  try {
48
67
  const client = await this.pool.connect();
49
68
  client.release();
@@ -57,10 +76,12 @@ export class PostgreSQLAdapter implements DatabaseAdapter {
57
76
  }
58
77
 
59
78
  async disconnect(): Promise<void> {
79
+ await this.initPromise;
60
80
  await this.pool.end();
61
81
  }
62
82
 
63
83
  async query<T = any>(sql: string, params?: any[]): Promise<T[]> {
84
+ await this.initPromise;
64
85
  const result = await this.pool.query(sql, params);
65
86
  return result.rows as T[];
66
87
  }
@@ -71,6 +92,7 @@ export class PostgreSQLAdapter implements DatabaseAdapter {
71
92
  }
72
93
 
73
94
  async insert<T = any>(table: string, data: Record<string, any>): Promise<T> {
95
+ await this.initPromise;
74
96
  const keys = Object.keys(data);
75
97
  const values = Object.values(data);
76
98
  const placeholders = keys.map((_, index) => `$${index + 1}`).join(', ');
@@ -86,6 +108,7 @@ export class PostgreSQLAdapter implements DatabaseAdapter {
86
108
  data: Record<string, any>,
87
109
  where: Record<string, any>
88
110
  ): Promise<T> {
111
+ await this.initPromise;
89
112
  const dataKeys = Object.keys(data);
90
113
  const dataValues = Object.values(data);
91
114
  const whereKeys = Object.keys(where);
@@ -104,6 +127,7 @@ export class PostgreSQLAdapter implements DatabaseAdapter {
104
127
  }
105
128
 
106
129
  async delete(table: string, where: Record<string, any>): Promise<number> {
130
+ await this.initPromise;
107
131
  const whereKeys = Object.keys(where);
108
132
  const whereValues = Object.values(where);
109
133
  const whereClause = whereKeys.map((key, index) => `${key} = $${index + 1}`).join(' AND ');
@@ -115,6 +139,7 @@ export class PostgreSQLAdapter implements DatabaseAdapter {
115
139
  }
116
140
 
117
141
  async transaction<T>(callback: (tx: DatabaseTransaction) => Promise<T>): Promise<T> {
142
+ await this.initPromise;
118
143
  const client = await this.pool.connect();
119
144
 
120
145
  try {
@@ -1,6 +1,7 @@
1
1
  // Database Redis Adapter
2
- import { DatabaseAdapter, DatabaseTransaction } from '../../../types/database';
3
- import { createFrameworkLogger } from '../../logger';
2
+ import { DatabaseAdapter, DatabaseTransaction } from '../../../types/database.js';
3
+ import { createFrameworkLogger } from '../../logger/index.js';
4
+ import { resolveUserPackage } from '../../utilities/package-utils.js';
4
5
 
5
6
  interface RedisConfig {
6
7
  host?: string;
@@ -11,6 +12,15 @@ interface RedisConfig {
11
12
  maxRetriesPerRequest?: number;
12
13
  retryDelayOnFailover?: number;
13
14
  lazyConnect?: boolean;
15
+ tls?: {
16
+ rejectUnauthorized?: boolean;
17
+ ca?: string;
18
+ cert?: string;
19
+ key?: string;
20
+ passphrase?: string;
21
+ servername?: string;
22
+ checkServerIdentity?: boolean;
23
+ };
14
24
  cluster?: {
15
25
  enableReadyCheck?: boolean;
16
26
  redisOptions?: any;
@@ -22,21 +32,35 @@ export class RedisAdapter implements DatabaseAdapter {
22
32
  private client: any;
23
33
  private logger = createFrameworkLogger('Redis');
24
34
  private keyPrefix: string;
35
+ private initPromise: Promise<void>;
25
36
 
26
37
  constructor(config: RedisConfig = {}) {
38
+ this.keyPrefix = config.keyPrefix || 'moro:';
39
+ this.initPromise = this.initialize(config);
40
+ }
41
+
42
+ private async initialize(config: RedisConfig): Promise<void> {
27
43
  try {
28
- const Redis = require('ioredis');
29
- this.keyPrefix = config.keyPrefix || 'moro:';
44
+ const ioredisPath = resolveUserPackage('ioredis');
45
+ const ioredis = await import(ioredisPath);
46
+ const Redis = ioredis.default;
30
47
 
31
48
  if (config.cluster) {
32
49
  // Redis Cluster
33
- this.client = new Redis.Cluster(config.cluster.nodes, {
50
+ const clusterOptions: any = {
34
51
  enableReadyCheck: config.cluster.enableReadyCheck || false,
35
52
  redisOptions: config.cluster.redisOptions || {},
36
- });
53
+ };
54
+
55
+ // Add TLS options to cluster configuration
56
+ if (config.tls) {
57
+ clusterOptions.redisOptions.tls = { ...config.tls };
58
+ }
59
+
60
+ this.client = new Redis.Cluster(config.cluster.nodes, clusterOptions);
37
61
  } else {
38
62
  // Single Redis instance
39
- this.client = new Redis({
63
+ const redisOptions: any = {
40
64
  host: config.host || 'localhost',
41
65
  port: config.port || 6379,
42
66
  password: config.password,
@@ -44,7 +68,14 @@ export class RedisAdapter implements DatabaseAdapter {
44
68
  maxRetriesPerRequest: config.maxRetriesPerRequest || 3,
45
69
  retryDelayOnFailover: config.retryDelayOnFailover || 100,
46
70
  lazyConnect: config.lazyConnect || true,
47
- });
71
+ };
72
+
73
+ // Add TLS options if provided
74
+ if (config.tls) {
75
+ redisOptions.tls = { ...config.tls };
76
+ }
77
+
78
+ this.client = new Redis(redisOptions);
48
79
  }
49
80
 
50
81
  this.client.on('error', (err: Error) => {
@@ -74,6 +105,7 @@ export class RedisAdapter implements DatabaseAdapter {
74
105
  }
75
106
 
76
107
  async connect(): Promise<void> {
108
+ await this.initPromise;
77
109
  try {
78
110
  await this.client.ping();
79
111
  this.logger.info('Redis connection established', 'Connection');
@@ -86,11 +118,13 @@ export class RedisAdapter implements DatabaseAdapter {
86
118
  }
87
119
 
88
120
  async disconnect(): Promise<void> {
121
+ await this.initPromise;
89
122
  await this.client.quit();
90
123
  }
91
124
 
92
125
  // For Redis, we adapt the SQL-like interface to key-value operations
93
126
  async query<T = any>(pattern: string, _params?: any[]): Promise<T[]> {
127
+ await this.initPromise;
94
128
  try {
95
129
  const keys = await this.client.keys(this.prefixKey(pattern));
96
130
  if (keys.length === 0) return [];
@@ -110,6 +144,7 @@ export class RedisAdapter implements DatabaseAdapter {
110
144
  }
111
145
 
112
146
  async queryOne<T = any>(key: string, _params?: any[]): Promise<T | null> {
147
+ await this.initPromise;
113
148
  try {
114
149
  const value = await this.client.get(this.prefixKey(key));
115
150
  return value ? JSON.parse(value) : null;
@@ -123,6 +158,7 @@ export class RedisAdapter implements DatabaseAdapter {
123
158
  }
124
159
 
125
160
  async insert<T = any>(key: string, data: Record<string, any>): Promise<T> {
161
+ await this.initPromise;
126
162
  try {
127
163
  const value = JSON.stringify(data);
128
164
  await this.client.set(this.prefixKey(key), value);
@@ -141,6 +177,7 @@ export class RedisAdapter implements DatabaseAdapter {
141
177
  data: Record<string, any>,
142
178
  _where?: Record<string, any>
143
179
  ): Promise<T> {
180
+ await this.initPromise;
144
181
  try {
145
182
  // For Redis, we'll merge with existing data if it exists
146
183
  const existing = await this.queryOne(key);
@@ -158,6 +195,7 @@ export class RedisAdapter implements DatabaseAdapter {
158
195
  }
159
196
 
160
197
  async delete(pattern: string, _where?: Record<string, any>): Promise<number> {
198
+ await this.initPromise;
161
199
  try {
162
200
  const keys = await this.client.keys(this.prefixKey(pattern));
163
201
  if (keys.length === 0) return 0;
@@ -174,6 +212,7 @@ export class RedisAdapter implements DatabaseAdapter {
174
212
  }
175
213
 
176
214
  async transaction<T>(callback: (tx: DatabaseTransaction) => Promise<T>): Promise<T> {
215
+ await this.initPromise;
177
216
  const multi = this.client.multi();
178
217
  const transaction = new RedisTransaction(multi, this.keyPrefix);
179
218
 
@@ -190,6 +229,7 @@ export class RedisAdapter implements DatabaseAdapter {
190
229
 
191
230
  // Redis-specific methods
192
231
  async set(key: string, value: any, ttl?: number): Promise<void> {
232
+ await this.initPromise;
193
233
  const prefixedKey = this.prefixKey(key);
194
234
  if (ttl) {
195
235
  await this.client.setex(prefixedKey, ttl, JSON.stringify(value));
@@ -199,38 +239,46 @@ export class RedisAdapter implements DatabaseAdapter {
199
239
  }
200
240
 
201
241
  async get(key: string): Promise<any> {
242
+ await this.initPromise;
202
243
  const value = await this.client.get(this.prefixKey(key));
203
244
  return value ? JSON.parse(value) : null;
204
245
  }
205
246
 
206
247
  async exists(key: string): Promise<boolean> {
248
+ await this.initPromise;
207
249
  const result = await this.client.exists(this.prefixKey(key));
208
250
  return result === 1;
209
251
  }
210
252
 
211
253
  async expire(key: string, ttl: number): Promise<boolean> {
254
+ await this.initPromise;
212
255
  const result = await this.client.expire(this.prefixKey(key), ttl);
213
256
  return result === 1;
214
257
  }
215
258
 
216
259
  async incr(key: string): Promise<number> {
260
+ await this.initPromise;
217
261
  return await this.client.incr(this.prefixKey(key));
218
262
  }
219
263
 
220
264
  async decr(key: string): Promise<number> {
265
+ await this.initPromise;
221
266
  return await this.client.decr(this.prefixKey(key));
222
267
  }
223
268
 
224
269
  async hset(hash: string, field: string, value: any): Promise<void> {
270
+ await this.initPromise;
225
271
  await this.client.hset(this.prefixKey(hash), field, JSON.stringify(value));
226
272
  }
227
273
 
228
274
  async hget(hash: string, field: string): Promise<any> {
275
+ await this.initPromise;
229
276
  const value = await this.client.hget(this.prefixKey(hash), field);
230
277
  return value ? JSON.parse(value) : null;
231
278
  }
232
279
 
233
280
  async hgetall(hash: string): Promise<Record<string, any>> {
281
+ await this.initPromise;
234
282
  const result = await this.client.hgetall(this.prefixKey(hash));
235
283
  const parsed: Record<string, any> = {};
236
284
  for (const [key, value] of Object.entries(result)) {
@@ -240,25 +288,30 @@ export class RedisAdapter implements DatabaseAdapter {
240
288
  }
241
289
 
242
290
  async lpush(list: string, ...values: any[]): Promise<number> {
291
+ await this.initPromise;
243
292
  const serialized = values.map(v => JSON.stringify(v));
244
293
  return await this.client.lpush(this.prefixKey(list), ...serialized);
245
294
  }
246
295
 
247
296
  async rpop(list: string): Promise<any> {
297
+ await this.initPromise;
248
298
  const value = await this.client.rpop(this.prefixKey(list));
249
299
  return value ? JSON.parse(value) : null;
250
300
  }
251
301
 
252
302
  async lrange(list: string, start: number, stop: number): Promise<any[]> {
303
+ await this.initPromise;
253
304
  const values = await this.client.lrange(this.prefixKey(list), start, stop);
254
305
  return values.map((v: string) => JSON.parse(v));
255
306
  }
256
307
 
257
308
  async publish(channel: string, message: any): Promise<number> {
309
+ await this.initPromise;
258
310
  return await this.client.publish(channel, JSON.stringify(message));
259
311
  }
260
312
 
261
313
  async subscribe(channel: string, callback: (message: any) => void): Promise<void> {
314
+ await this.initPromise;
262
315
  const subscriber = this.client.duplicate();
263
316
  subscriber.subscribe(channel);
264
317
  subscriber.on('message', (_channel: string, message: string) => {
@@ -1,6 +1,7 @@
1
1
  // Database SQLite Adapter
2
- import { DatabaseAdapter, DatabaseTransaction } from '../../../types/database';
3
- import { createFrameworkLogger } from '../../logger';
2
+ import { DatabaseAdapter, DatabaseTransaction } from '../../../types/database.js';
3
+ import { createFrameworkLogger } from '../../logger/index.js';
4
+ import { resolveUserPackage } from '../../utilities/package-utils.js';
4
5
 
5
6
  interface SQLiteConfig {
6
7
  filename?: string;
@@ -14,10 +15,17 @@ interface SQLiteConfig {
14
15
  export class SQLiteAdapter implements DatabaseAdapter {
15
16
  private db: any;
16
17
  private logger = createFrameworkLogger('SQLite');
18
+ private initPromise: Promise<void>;
17
19
 
18
20
  constructor(config: SQLiteConfig = {}) {
21
+ this.initPromise = this.initialize(config);
22
+ }
23
+
24
+ private async initialize(config: SQLiteConfig): Promise<void> {
19
25
  try {
20
- const Database = require('better-sqlite3');
26
+ const sqlite3Path = resolveUserPackage('better-sqlite3');
27
+ const betterSqlite3 = await import(sqlite3Path);
28
+ const Database = betterSqlite3.default;
21
29
  const filename = config.memory ? ':memory:' : config.filename || 'moro_app.db';
22
30
  this.db = new Database(filename, {
23
31
  readonly: config.readonly || false,
@@ -40,15 +48,18 @@ export class SQLiteAdapter implements DatabaseAdapter {
40
48
  }
41
49
 
42
50
  async connect(): Promise<void> {
51
+ await this.initPromise;
43
52
  // SQLite doesn't require explicit connection - it's handled in constructor
44
53
  this.logger.info('SQLite adapter ready', 'Connection');
45
54
  }
46
55
 
47
56
  async disconnect(): Promise<void> {
57
+ await this.initPromise;
48
58
  this.db.close();
49
59
  }
50
60
 
51
61
  async query<T = any>(sql: string, params?: any[]): Promise<T[]> {
62
+ await this.initPromise;
52
63
  try {
53
64
  const stmt = this.db.prepare(sql);
54
65
  const results = stmt.all(params || []);
@@ -63,6 +74,7 @@ export class SQLiteAdapter implements DatabaseAdapter {
63
74
  }
64
75
 
65
76
  async queryOne<T = any>(sql: string, params?: any[]): Promise<T | null> {
77
+ await this.initPromise;
66
78
  try {
67
79
  const stmt = this.db.prepare(sql);
68
80
  const result = stmt.get(params || []);
@@ -77,6 +89,7 @@ export class SQLiteAdapter implements DatabaseAdapter {
77
89
  }
78
90
 
79
91
  async insert<T = any>(table: string, data: Record<string, any>): Promise<T> {
92
+ await this.initPromise;
80
93
  const keys = Object.keys(data);
81
94
  const values = Object.values(data);
82
95
  const placeholders = keys.map(() => '?').join(', ');
@@ -107,6 +120,7 @@ export class SQLiteAdapter implements DatabaseAdapter {
107
120
  data: Record<string, any>,
108
121
  where: Record<string, any>
109
122
  ): Promise<T> {
123
+ await this.initPromise;
110
124
  const setClause = Object.keys(data)
111
125
  .map(key => `${key} = ?`)
112
126
  .join(', ');
@@ -138,6 +152,7 @@ export class SQLiteAdapter implements DatabaseAdapter {
138
152
  }
139
153
 
140
154
  async delete(table: string, where: Record<string, any>): Promise<number> {
155
+ await this.initPromise;
141
156
  const whereClause = Object.keys(where)
142
157
  .map(key => `${key} = ?`)
143
158
  .join(' AND ');
@@ -157,6 +172,7 @@ export class SQLiteAdapter implements DatabaseAdapter {
157
172
  }
158
173
 
159
174
  async transaction<T>(callback: (tx: DatabaseTransaction) => Promise<T>): Promise<T> {
175
+ await this.initPromise;
160
176
  const transaction = this.db.transaction(async () => {
161
177
  const tx = new SQLiteTransaction(this.db);
162
178
  return await callback(tx);
@@ -1,3 +1,3 @@
1
1
  // Database Module
2
- export * from './adapters';
3
- export * from '../../types/database';
2
+ export * from './adapters/index.js';
3
+ export * from '../../types/database.js';
@@ -1,17 +1,17 @@
1
1
  // Moro Framework Documentation System
2
2
  // Automatic API documentation generation from intelligent routes and Validation schemas
3
3
 
4
- import { CompiledRoute } from '../routing';
5
- import { IntelligentRoutingManager } from '../routing/app-integration';
4
+ import { CompiledRoute } from '../routing/index.js';
5
+ import { IntelligentRoutingManager } from '../routing/app-integration.js';
6
6
  import {
7
7
  OpenAPIGenerator,
8
8
  generateOpenAPIFromRoutes,
9
9
  GenerationOptions,
10
10
  OpenAPISpec,
11
11
  defaultSecuritySchemes,
12
- } from './openapi-generator';
13
- import { SwaggerUIMiddleware, SwaggerUIOptions, createDocsMiddleware } from './swagger-ui';
14
- import { createFrameworkLogger } from '../logger';
12
+ } from './openapi-generator.js';
13
+ import { SwaggerUIMiddleware, SwaggerUIOptions, createDocsMiddleware } from './swagger-ui.js';
14
+ import { createFrameworkLogger } from '../logger/index.js';
15
15
 
16
16
  const logger = createFrameworkLogger('DocumentationSystem');
17
17
 
@@ -226,6 +226,6 @@ export function generateDocsFromIntelligentRoutes(
226
226
  }
227
227
 
228
228
  // Export all types and functions
229
- export * from './openapi-generator';
230
- export * from './swagger-ui';
231
- export * from './zod-to-openapi';
229
+ export * from './openapi-generator.js';
230
+ export * from './swagger-ui.js';
231
+ export * from './zod-to-openapi.js';
@@ -1,10 +1,10 @@
1
1
  // OpenAPI Specification Generator for Moro Framework
2
2
  // Extracts route information from intelligent routing and generates OpenAPI 3.0 specs
3
3
 
4
- import { CompiledRoute, RouteSchema } from '../routing';
5
- import { OpenAPISchema } from './zod-to-openapi';
6
- import { schemaToOpenAPI, generateExampleFromValidationSchema } from './schema-to-openapi';
7
- import { createFrameworkLogger } from '../logger';
4
+ import { CompiledRoute, RouteSchema } from '../routing/index.js';
5
+ import { OpenAPISchema } from './zod-to-openapi.js';
6
+ import { schemaToOpenAPI, generateExampleFromValidationSchema } from './schema-to-openapi.js';
7
+ import { createFrameworkLogger } from '../logger/index.js';
8
8
 
9
9
  const logger = createFrameworkLogger('OpenAPIGenerator');
10
10
 
@@ -1,9 +1,9 @@
1
1
  // Universal Schema to OpenAPI Converter
2
2
  // Converts ValidationSchema (Zod, Joi, etc.) to OpenAPI 3.0 schema definitions
3
3
 
4
- import { ValidationSchema } from '../validation/schema-interface';
5
- import { OpenAPISchema } from './zod-to-openapi';
6
- import { createFrameworkLogger } from '../logger';
4
+ import { ValidationSchema } from '../validation/schema-interface.js';
5
+ import { OpenAPISchema, zodToOpenAPI, generateExampleFromSchema } from './zod-to-openapi.js';
6
+ import { createFrameworkLogger } from '../logger/index.js';
7
7
 
8
8
  const logger = createFrameworkLogger('SchemaToOpenAPI');
9
9
 
@@ -32,8 +32,6 @@ export function schemaToOpenAPI(
32
32
  // If it's a Zod schema, use the existing zod converter
33
33
  if (isZodSchema(schema)) {
34
34
  try {
35
- // Import zod converter dynamically
36
- const { zodToOpenAPI } = require('./zod-to-openapi');
37
35
  return zodToOpenAPI(schema, options);
38
36
  } catch (error) {
39
37
  logger.warn('Zod converter not available, using fallback', String(error));
@@ -59,7 +57,6 @@ export function generateExampleFromValidationSchema(schema: ValidationSchema): a
59
57
  // If it's a Zod schema, use existing example generator
60
58
  if (isZodSchema(schema)) {
61
59
  try {
62
- const { generateExampleFromSchema } = require('./zod-to-openapi');
63
60
  return generateExampleFromSchema(schema);
64
61
  } catch (error) {
65
62
  logger.warn('Zod example generator not available', String(error));
@@ -1,8 +1,8 @@
1
1
  // Simple Documentation Generator - Fallback for when Swagger UI has issues
2
2
  // Generates clean, readable API documentation from routes
3
3
 
4
- import { CompiledRoute, RouteSchema } from '../routing';
5
- import { createFrameworkLogger } from '../logger';
4
+ import { CompiledRoute, RouteSchema } from '../routing/index.js';
5
+ import { createFrameworkLogger } from '../logger/index.js';
6
6
 
7
7
  const logger = createFrameworkLogger('SimpleDocs');
8
8
 
@@ -3,9 +3,10 @@
3
3
 
4
4
  import { readFileSync } from 'fs';
5
5
  import { join } from 'path';
6
- import { HttpRequest, HttpResponse } from '../http';
7
- import { OpenAPISpec } from './openapi-generator';
8
- import { createFrameworkLogger } from '../logger';
6
+ import { createUserRequire } from '../utilities/package-utils.js';
7
+ import { HttpRequest, HttpResponse } from '../http/index.js';
8
+ import { OpenAPISpec } from './openapi-generator.js';
9
+ import { createFrameworkLogger } from '../logger/index.js';
9
10
 
10
11
  const logger = createFrameworkLogger('SwaggerUI');
11
12
 
@@ -44,7 +45,9 @@ export class SwaggerUIMiddleware {
44
45
  };
45
46
 
46
47
  try {
47
- // Find swagger-ui-dist assets
48
+ // Find swagger-ui-dist assets using ESM-compatible resolution
49
+ // Create a require function from the user's working directory to find their installed packages
50
+ const require = createUserRequire();
48
51
  this.swaggerUIAssetPath = require
49
52
  .resolve('swagger-ui-dist/package.json')
50
53
  .replace('/package.json', '');
@@ -119,37 +122,37 @@ export class SwaggerUIMiddleware {
119
122
  <h3>Failed to Load Swagger UI</h3>
120
123
  <div id="error-details"></div>
121
124
  </div>
122
-
125
+
123
126
  <script src="${basePath}/swagger-ui-bundle.js" charset="UTF-8"></script>
124
127
  <script src="${basePath}/swagger-ui-standalone-preset.js" charset="UTF-8"></script>
125
128
  <script>
126
129
  console.log('Starting Swagger UI initialization...');
127
-
130
+
128
131
  function showError(message, details) {
129
132
  console.error('Swagger UI Error:', message, details);
130
133
  document.getElementById('loading-message').style.display = 'none';
131
134
  document.getElementById('error-display').style.display = 'block';
132
- document.getElementById('error-details').innerHTML =
135
+ document.getElementById('error-details').innerHTML =
133
136
  '<p><strong>Error:</strong> ' + message + '</p>' +
134
137
  (details ? '<pre>' + JSON.stringify(details, null, 2) + '</pre>' : '');
135
138
  }
136
-
139
+
137
140
  function initializeSwaggerUI() {
138
141
  console.log('Initializing Swagger UI...');
139
-
142
+
140
143
  if (typeof SwaggerUIBundle === 'undefined') {
141
144
  showError('SwaggerUIBundle not loaded', { SwaggerUIBundle: typeof SwaggerUIBundle });
142
145
  return;
143
146
  }
144
-
147
+
145
148
  if (typeof SwaggerUIStandalonePreset === 'undefined') {
146
149
  showError('SwaggerUIStandalonePreset not loaded', { SwaggerUIStandalonePreset: typeof SwaggerUIStandalonePreset });
147
150
  return;
148
151
  }
149
-
152
+
150
153
  try {
151
154
  console.log('Creating SwaggerUIBundle...');
152
-
155
+
153
156
  const ui = SwaggerUIBundle({
154
157
  url: '${basePath}/openapi.json',
155
158
  dom_id: '#swagger-ui',
@@ -173,10 +176,10 @@ export class SwaggerUIMiddleware {
173
176
  showError('Swagger UI initialization failed', error);
174
177
  }
175
178
  });
176
-
179
+
177
180
  window.ui = ui;
178
181
  console.log('SwaggerUIBundle created successfully');
179
-
182
+
180
183
  // Hide loading message after timeout if onComplete doesn't fire
181
184
  setTimeout(function() {
182
185
  var loadingEl = document.getElementById('loading-message');
@@ -185,7 +188,7 @@ export class SwaggerUIMiddleware {
185
188
  loadingEl.style.display = 'none';
186
189
  }
187
190
  }, 5000);
188
-
191
+
189
192
  } catch (error) {
190
193
  console.error('Error creating SwaggerUIBundle:', error);
191
194
  showError('Failed to create SwaggerUIBundle', {
@@ -194,7 +197,7 @@ export class SwaggerUIMiddleware {
194
197
  });
195
198
  }
196
199
  }
197
-
200
+
198
201
  // Initialize when DOM is ready and scripts are loaded
199
202
  if (document.readyState === 'loading') {
200
203
  document.addEventListener('DOMContentLoaded', function() {