@morojs/moro 1.0.0

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 (345) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +233 -0
  3. package/dist/core/config/index.d.ts +19 -0
  4. package/dist/core/config/index.js +59 -0
  5. package/dist/core/config/index.js.map +1 -0
  6. package/dist/core/config/loader.d.ts +6 -0
  7. package/dist/core/config/loader.js +288 -0
  8. package/dist/core/config/loader.js.map +1 -0
  9. package/dist/core/config/schema.d.ts +335 -0
  10. package/dist/core/config/schema.js +286 -0
  11. package/dist/core/config/schema.js.map +1 -0
  12. package/dist/core/config/utils.d.ts +50 -0
  13. package/dist/core/config/utils.js +185 -0
  14. package/dist/core/config/utils.js.map +1 -0
  15. package/dist/core/database/adapters/drizzle.d.ts +29 -0
  16. package/dist/core/database/adapters/drizzle.js +366 -0
  17. package/dist/core/database/adapters/drizzle.js.map +1 -0
  18. package/dist/core/database/adapters/index.d.ts +8 -0
  19. package/dist/core/database/adapters/index.js +48 -0
  20. package/dist/core/database/adapters/index.js.map +1 -0
  21. package/dist/core/database/adapters/mongodb.d.ts +35 -0
  22. package/dist/core/database/adapters/mongodb.js +215 -0
  23. package/dist/core/database/adapters/mongodb.js.map +1 -0
  24. package/dist/core/database/adapters/mysql.d.ts +23 -0
  25. package/dist/core/database/adapters/mysql.js +149 -0
  26. package/dist/core/database/adapters/mysql.js.map +1 -0
  27. package/dist/core/database/adapters/postgresql.d.ts +24 -0
  28. package/dist/core/database/adapters/postgresql.js +160 -0
  29. package/dist/core/database/adapters/postgresql.js.map +1 -0
  30. package/dist/core/database/adapters/redis.d.ts +50 -0
  31. package/dist/core/database/adapters/redis.js +266 -0
  32. package/dist/core/database/adapters/redis.js.map +1 -0
  33. package/dist/core/database/adapters/sqlite.d.ts +23 -0
  34. package/dist/core/database/adapters/sqlite.js +194 -0
  35. package/dist/core/database/adapters/sqlite.js.map +1 -0
  36. package/dist/core/database/index.d.ts +2 -0
  37. package/dist/core/database/index.js +20 -0
  38. package/dist/core/database/index.js.map +1 -0
  39. package/dist/core/docs/index.d.ts +63 -0
  40. package/dist/core/docs/index.js +170 -0
  41. package/dist/core/docs/index.js.map +1 -0
  42. package/dist/core/docs/openapi-generator.d.ts +124 -0
  43. package/dist/core/docs/openapi-generator.js +413 -0
  44. package/dist/core/docs/openapi-generator.js.map +1 -0
  45. package/dist/core/docs/simple-docs.d.ts +21 -0
  46. package/dist/core/docs/simple-docs.js +268 -0
  47. package/dist/core/docs/simple-docs.js.map +1 -0
  48. package/dist/core/docs/swagger-ui.d.ts +28 -0
  49. package/dist/core/docs/swagger-ui.js +317 -0
  50. package/dist/core/docs/swagger-ui.js.map +1 -0
  51. package/dist/core/docs/zod-to-openapi.d.ts +29 -0
  52. package/dist/core/docs/zod-to-openapi.js +414 -0
  53. package/dist/core/docs/zod-to-openapi.js.map +1 -0
  54. package/dist/core/events/event-bus.d.ts +27 -0
  55. package/dist/core/events/event-bus.js +193 -0
  56. package/dist/core/events/event-bus.js.map +1 -0
  57. package/dist/core/events/index.d.ts +2 -0
  58. package/dist/core/events/index.js +7 -0
  59. package/dist/core/events/index.js.map +1 -0
  60. package/dist/core/framework.d.ts +57 -0
  61. package/dist/core/framework.js +432 -0
  62. package/dist/core/framework.js.map +1 -0
  63. package/dist/core/http/http-server.d.ts +114 -0
  64. package/dist/core/http/http-server.js +1154 -0
  65. package/dist/core/http/http-server.js.map +1 -0
  66. package/dist/core/http/index.d.ts +3 -0
  67. package/dist/core/http/index.js +10 -0
  68. package/dist/core/http/index.js.map +1 -0
  69. package/dist/core/http/router.d.ts +14 -0
  70. package/dist/core/http/router.js +113 -0
  71. package/dist/core/http/router.js.map +1 -0
  72. package/dist/core/logger/filters.d.ts +9 -0
  73. package/dist/core/logger/filters.js +134 -0
  74. package/dist/core/logger/filters.js.map +1 -0
  75. package/dist/core/logger/index.d.ts +3 -0
  76. package/dist/core/logger/index.js +26 -0
  77. package/dist/core/logger/index.js.map +1 -0
  78. package/dist/core/logger/logger.d.ts +49 -0
  79. package/dist/core/logger/logger.js +332 -0
  80. package/dist/core/logger/logger.js.map +1 -0
  81. package/dist/core/logger/outputs.d.ts +42 -0
  82. package/dist/core/logger/outputs.js +110 -0
  83. package/dist/core/logger/outputs.js.map +1 -0
  84. package/dist/core/middleware/built-in/adapters/cache/file.d.ts +15 -0
  85. package/dist/core/middleware/built-in/adapters/cache/file.js +128 -0
  86. package/dist/core/middleware/built-in/adapters/cache/file.js.map +1 -0
  87. package/dist/core/middleware/built-in/adapters/cache/index.d.ts +5 -0
  88. package/dist/core/middleware/built-in/adapters/cache/index.js +28 -0
  89. package/dist/core/middleware/built-in/adapters/cache/index.js.map +1 -0
  90. package/dist/core/middleware/built-in/adapters/cache/memory.d.ts +11 -0
  91. package/dist/core/middleware/built-in/adapters/cache/memory.js +65 -0
  92. package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -0
  93. package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +17 -0
  94. package/dist/core/middleware/built-in/adapters/cache/redis.js +91 -0
  95. package/dist/core/middleware/built-in/adapters/cache/redis.js.map +1 -0
  96. package/dist/core/middleware/built-in/adapters/cdn/azure.d.ts +21 -0
  97. package/dist/core/middleware/built-in/adapters/cdn/azure.js +40 -0
  98. package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +1 -0
  99. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.d.ts +14 -0
  100. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js +77 -0
  101. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -0
  102. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +15 -0
  103. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +73 -0
  104. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +1 -0
  105. package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +5 -0
  106. package/dist/core/middleware/built-in/adapters/cdn/index.js +28 -0
  107. package/dist/core/middleware/built-in/adapters/cdn/index.js.map +1 -0
  108. package/dist/core/middleware/built-in/adapters/index.d.ts +4 -0
  109. package/dist/core/middleware/built-in/adapters/index.js +26 -0
  110. package/dist/core/middleware/built-in/adapters/index.js.map +1 -0
  111. package/dist/core/middleware/built-in/auth.d.ts +2 -0
  112. package/dist/core/middleware/built-in/auth.js +38 -0
  113. package/dist/core/middleware/built-in/auth.js.map +1 -0
  114. package/dist/core/middleware/built-in/cache.d.ts +3 -0
  115. package/dist/core/middleware/built-in/cache.js +188 -0
  116. package/dist/core/middleware/built-in/cache.js.map +1 -0
  117. package/dist/core/middleware/built-in/cdn.d.ts +3 -0
  118. package/dist/core/middleware/built-in/cdn.js +115 -0
  119. package/dist/core/middleware/built-in/cdn.js.map +1 -0
  120. package/dist/core/middleware/built-in/cookie.d.ts +14 -0
  121. package/dist/core/middleware/built-in/cookie.js +68 -0
  122. package/dist/core/middleware/built-in/cookie.js.map +1 -0
  123. package/dist/core/middleware/built-in/cors.d.ts +2 -0
  124. package/dist/core/middleware/built-in/cors.js +29 -0
  125. package/dist/core/middleware/built-in/cors.js.map +1 -0
  126. package/dist/core/middleware/built-in/csp.d.ts +22 -0
  127. package/dist/core/middleware/built-in/csp.js +74 -0
  128. package/dist/core/middleware/built-in/csp.js.map +1 -0
  129. package/dist/core/middleware/built-in/csrf.d.ts +9 -0
  130. package/dist/core/middleware/built-in/csrf.js +66 -0
  131. package/dist/core/middleware/built-in/csrf.js.map +1 -0
  132. package/dist/core/middleware/built-in/error-tracker.d.ts +1 -0
  133. package/dist/core/middleware/built-in/error-tracker.js +19 -0
  134. package/dist/core/middleware/built-in/error-tracker.js.map +1 -0
  135. package/dist/core/middleware/built-in/index.d.ts +70 -0
  136. package/dist/core/middleware/built-in/index.js +70 -0
  137. package/dist/core/middleware/built-in/index.js.map +1 -0
  138. package/dist/core/middleware/built-in/performance-monitor.d.ts +1 -0
  139. package/dist/core/middleware/built-in/performance-monitor.js +22 -0
  140. package/dist/core/middleware/built-in/performance-monitor.js.map +1 -0
  141. package/dist/core/middleware/built-in/rate-limit.d.ts +6 -0
  142. package/dist/core/middleware/built-in/rate-limit.js +47 -0
  143. package/dist/core/middleware/built-in/rate-limit.js.map +1 -0
  144. package/dist/core/middleware/built-in/request-logger.d.ts +1 -0
  145. package/dist/core/middleware/built-in/request-logger.js +15 -0
  146. package/dist/core/middleware/built-in/request-logger.js.map +1 -0
  147. package/dist/core/middleware/built-in/session.d.ts +41 -0
  148. package/dist/core/middleware/built-in/session.js +209 -0
  149. package/dist/core/middleware/built-in/session.js.map +1 -0
  150. package/dist/core/middleware/built-in/sse.d.ts +6 -0
  151. package/dist/core/middleware/built-in/sse.js +73 -0
  152. package/dist/core/middleware/built-in/sse.js.map +1 -0
  153. package/dist/core/middleware/built-in/validation.d.ts +2 -0
  154. package/dist/core/middleware/built-in/validation.js +31 -0
  155. package/dist/core/middleware/built-in/validation.js.map +1 -0
  156. package/dist/core/middleware/index.d.ts +21 -0
  157. package/dist/core/middleware/index.js +152 -0
  158. package/dist/core/middleware/index.js.map +1 -0
  159. package/dist/core/modules/auto-discovery.d.ts +27 -0
  160. package/dist/core/modules/auto-discovery.js +255 -0
  161. package/dist/core/modules/auto-discovery.js.map +1 -0
  162. package/dist/core/modules/index.d.ts +2 -0
  163. package/dist/core/modules/index.js +11 -0
  164. package/dist/core/modules/index.js.map +1 -0
  165. package/dist/core/modules/modules.d.ts +10 -0
  166. package/dist/core/modules/modules.js +137 -0
  167. package/dist/core/modules/modules.js.map +1 -0
  168. package/dist/core/networking/index.d.ts +2 -0
  169. package/dist/core/networking/index.js +9 -0
  170. package/dist/core/networking/index.js.map +1 -0
  171. package/dist/core/networking/service-discovery.d.ts +38 -0
  172. package/dist/core/networking/service-discovery.js +233 -0
  173. package/dist/core/networking/service-discovery.js.map +1 -0
  174. package/dist/core/networking/websocket-manager.d.ts +27 -0
  175. package/dist/core/networking/websocket-manager.js +211 -0
  176. package/dist/core/networking/websocket-manager.js.map +1 -0
  177. package/dist/core/routing/app-integration.d.ts +42 -0
  178. package/dist/core/routing/app-integration.js +152 -0
  179. package/dist/core/routing/app-integration.js.map +1 -0
  180. package/dist/core/routing/index.d.ts +106 -0
  181. package/dist/core/routing/index.js +343 -0
  182. package/dist/core/routing/index.js.map +1 -0
  183. package/dist/core/runtime/aws-lambda-adapter.d.ts +43 -0
  184. package/dist/core/runtime/aws-lambda-adapter.js +108 -0
  185. package/dist/core/runtime/aws-lambda-adapter.js.map +1 -0
  186. package/dist/core/runtime/base-adapter.d.ts +16 -0
  187. package/dist/core/runtime/base-adapter.js +105 -0
  188. package/dist/core/runtime/base-adapter.js.map +1 -0
  189. package/dist/core/runtime/cloudflare-workers-adapter.d.ts +18 -0
  190. package/dist/core/runtime/cloudflare-workers-adapter.js +131 -0
  191. package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -0
  192. package/dist/core/runtime/index.d.ts +14 -0
  193. package/dist/core/runtime/index.js +56 -0
  194. package/dist/core/runtime/index.js.map +1 -0
  195. package/dist/core/runtime/node-adapter.d.ts +15 -0
  196. package/dist/core/runtime/node-adapter.js +204 -0
  197. package/dist/core/runtime/node-adapter.js.map +1 -0
  198. package/dist/core/runtime/vercel-edge-adapter.d.ts +10 -0
  199. package/dist/core/runtime/vercel-edge-adapter.js +106 -0
  200. package/dist/core/runtime/vercel-edge-adapter.js.map +1 -0
  201. package/dist/core/utilities/circuit-breaker.d.ts +14 -0
  202. package/dist/core/utilities/circuit-breaker.js +42 -0
  203. package/dist/core/utilities/circuit-breaker.js.map +1 -0
  204. package/dist/core/utilities/container.d.ts +116 -0
  205. package/dist/core/utilities/container.js +529 -0
  206. package/dist/core/utilities/container.js.map +1 -0
  207. package/dist/core/utilities/hooks.d.ts +24 -0
  208. package/dist/core/utilities/hooks.js +131 -0
  209. package/dist/core/utilities/hooks.js.map +1 -0
  210. package/dist/core/utilities/index.d.ts +4 -0
  211. package/dist/core/utilities/index.js +22 -0
  212. package/dist/core/utilities/index.js.map +1 -0
  213. package/dist/core/validation/index.d.ts +30 -0
  214. package/dist/core/validation/index.js +144 -0
  215. package/dist/core/validation/index.js.map +1 -0
  216. package/dist/index.d.ts +30 -0
  217. package/dist/index.js +72 -0
  218. package/dist/index.js.map +1 -0
  219. package/dist/moro.d.ts +82 -0
  220. package/dist/moro.js +679 -0
  221. package/dist/moro.js.map +1 -0
  222. package/dist/types/cache.d.ts +34 -0
  223. package/dist/types/cache.js +3 -0
  224. package/dist/types/cache.js.map +1 -0
  225. package/dist/types/cdn.d.ts +19 -0
  226. package/dist/types/cdn.js +3 -0
  227. package/dist/types/cdn.js.map +1 -0
  228. package/dist/types/core.d.ts +13 -0
  229. package/dist/types/core.js +3 -0
  230. package/dist/types/core.js.map +1 -0
  231. package/dist/types/database.d.ts +29 -0
  232. package/dist/types/database.js +3 -0
  233. package/dist/types/database.js.map +1 -0
  234. package/dist/types/discovery.d.ts +6 -0
  235. package/dist/types/discovery.js +3 -0
  236. package/dist/types/discovery.js.map +1 -0
  237. package/dist/types/events.d.ts +116 -0
  238. package/dist/types/events.js +3 -0
  239. package/dist/types/events.js.map +1 -0
  240. package/dist/types/hooks.d.ts +38 -0
  241. package/dist/types/hooks.js +3 -0
  242. package/dist/types/hooks.js.map +1 -0
  243. package/dist/types/http.d.ts +51 -0
  244. package/dist/types/http.js +3 -0
  245. package/dist/types/http.js.map +1 -0
  246. package/dist/types/logger.d.ts +77 -0
  247. package/dist/types/logger.js +3 -0
  248. package/dist/types/logger.js.map +1 -0
  249. package/dist/types/module.d.ts +91 -0
  250. package/dist/types/module.js +3 -0
  251. package/dist/types/module.js.map +1 -0
  252. package/dist/types/runtime.d.ts +48 -0
  253. package/dist/types/runtime.js +3 -0
  254. package/dist/types/runtime.js.map +1 -0
  255. package/dist/types/session.d.ts +66 -0
  256. package/dist/types/session.js +3 -0
  257. package/dist/types/session.js.map +1 -0
  258. package/package.json +176 -0
  259. package/src/core/config/index.ts +47 -0
  260. package/src/core/config/loader.ts +366 -0
  261. package/src/core/config/schema.ts +346 -0
  262. package/src/core/config/utils.ts +220 -0
  263. package/src/core/database/README.md +228 -0
  264. package/src/core/database/adapters/drizzle.ts +425 -0
  265. package/src/core/database/adapters/index.ts +45 -0
  266. package/src/core/database/adapters/mongodb.ts +292 -0
  267. package/src/core/database/adapters/mysql.ts +217 -0
  268. package/src/core/database/adapters/postgresql.ts +211 -0
  269. package/src/core/database/adapters/redis.ts +331 -0
  270. package/src/core/database/adapters/sqlite.ts +255 -0
  271. package/src/core/database/index.ts +3 -0
  272. package/src/core/docs/index.ts +245 -0
  273. package/src/core/docs/openapi-generator.ts +588 -0
  274. package/src/core/docs/simple-docs.ts +305 -0
  275. package/src/core/docs/swagger-ui.ts +370 -0
  276. package/src/core/docs/zod-to-openapi.ts +532 -0
  277. package/src/core/events/event-bus.ts +249 -0
  278. package/src/core/events/index.ts +12 -0
  279. package/src/core/framework.ts +621 -0
  280. package/src/core/http/http-server.ts +1421 -0
  281. package/src/core/http/index.ts +11 -0
  282. package/src/core/http/router.ts +153 -0
  283. package/src/core/logger/filters.ts +148 -0
  284. package/src/core/logger/index.ts +20 -0
  285. package/src/core/logger/logger.ts +434 -0
  286. package/src/core/logger/outputs.ts +136 -0
  287. package/src/core/middleware/built-in/adapters/cache/file.ts +106 -0
  288. package/src/core/middleware/built-in/adapters/cache/index.ts +26 -0
  289. package/src/core/middleware/built-in/adapters/cache/memory.ts +73 -0
  290. package/src/core/middleware/built-in/adapters/cache/redis.ts +103 -0
  291. package/src/core/middleware/built-in/adapters/cdn/azure.ts +68 -0
  292. package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +100 -0
  293. package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +92 -0
  294. package/src/core/middleware/built-in/adapters/cdn/index.ts +23 -0
  295. package/src/core/middleware/built-in/adapters/index.ts +7 -0
  296. package/src/core/middleware/built-in/auth.ts +39 -0
  297. package/src/core/middleware/built-in/cache.ts +228 -0
  298. package/src/core/middleware/built-in/cdn.ts +151 -0
  299. package/src/core/middleware/built-in/cookie.ts +90 -0
  300. package/src/core/middleware/built-in/cors.ts +38 -0
  301. package/src/core/middleware/built-in/csp.ts +107 -0
  302. package/src/core/middleware/built-in/csrf.ts +87 -0
  303. package/src/core/middleware/built-in/error-tracker.ts +16 -0
  304. package/src/core/middleware/built-in/index.ts +57 -0
  305. package/src/core/middleware/built-in/performance-monitor.ts +25 -0
  306. package/src/core/middleware/built-in/rate-limit.ts +60 -0
  307. package/src/core/middleware/built-in/request-logger.ts +14 -0
  308. package/src/core/middleware/built-in/session.ts +311 -0
  309. package/src/core/middleware/built-in/sse.ts +91 -0
  310. package/src/core/middleware/built-in/validation.ts +33 -0
  311. package/src/core/middleware/index.ts +188 -0
  312. package/src/core/modules/auto-discovery.ts +265 -0
  313. package/src/core/modules/index.ts +6 -0
  314. package/src/core/modules/modules.ts +125 -0
  315. package/src/core/networking/index.ts +7 -0
  316. package/src/core/networking/service-discovery.ts +309 -0
  317. package/src/core/networking/websocket-manager.ts +259 -0
  318. package/src/core/routing/app-integration.ts +229 -0
  319. package/src/core/routing/index.ts +519 -0
  320. package/src/core/runtime/aws-lambda-adapter.ts +157 -0
  321. package/src/core/runtime/base-adapter.ts +140 -0
  322. package/src/core/runtime/cloudflare-workers-adapter.ts +166 -0
  323. package/src/core/runtime/index.ts +74 -0
  324. package/src/core/runtime/node-adapter.ts +210 -0
  325. package/src/core/runtime/vercel-edge-adapter.ts +125 -0
  326. package/src/core/utilities/circuit-breaker.ts +46 -0
  327. package/src/core/utilities/container.ts +760 -0
  328. package/src/core/utilities/hooks.ts +148 -0
  329. package/src/core/utilities/index.ts +16 -0
  330. package/src/core/validation/index.ts +216 -0
  331. package/src/index.ts +120 -0
  332. package/src/moro.ts +842 -0
  333. package/src/types/cache.ts +38 -0
  334. package/src/types/cdn.ts +22 -0
  335. package/src/types/core.ts +17 -0
  336. package/src/types/database.ts +40 -0
  337. package/src/types/discovery.ts +7 -0
  338. package/src/types/events.ts +90 -0
  339. package/src/types/hooks.ts +47 -0
  340. package/src/types/http.ts +70 -0
  341. package/src/types/logger.ts +109 -0
  342. package/src/types/module.ts +87 -0
  343. package/src/types/runtime.ts +91 -0
  344. package/src/types/session.ts +89 -0
  345. package/tsconfig.json +21 -0
@@ -0,0 +1,268 @@
1
+ "use strict";
2
+ // Simple Documentation Generator - Fallback for when Swagger UI has issues
3
+ // Generates clean, readable API documentation from routes
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.SimpleDocsGenerator = void 0;
6
+ exports.createSimpleDocsMiddleware = createSimpleDocsMiddleware;
7
+ const logger_1 = require("../logger");
8
+ const logger = (0, logger_1.createFrameworkLogger)("SimpleDocs");
9
+ class SimpleDocsGenerator {
10
+ constructor(options = {}) {
11
+ this.options = options;
12
+ this.routes = [];
13
+ this.options = {
14
+ title: "API Documentation",
15
+ description: "API documentation generated from intelligent routes",
16
+ basePath: "/docs",
17
+ ...options,
18
+ };
19
+ }
20
+ addRoutes(routes) {
21
+ this.routes = routes;
22
+ logger.debug(`Added ${routes.length} routes to simple docs`, "RouteAddition");
23
+ }
24
+ generateHTML() {
25
+ const routesByTag = this.groupRoutesByTag();
26
+ return `<!DOCTYPE html>
27
+ <html lang="en">
28
+ <head>
29
+ <meta charset="UTF-8">
30
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
31
+ <title>${this.options.title}</title>
32
+ <style>
33
+ body {
34
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
35
+ line-height: 1.6;
36
+ margin: 0;
37
+ padding: 20px;
38
+ background: #f8f9fa;
39
+ }
40
+ .container {
41
+ max-width: 1200px;
42
+ margin: 0 auto;
43
+ background: white;
44
+ padding: 30px;
45
+ border-radius: 8px;
46
+ box-shadow: 0 2px 10px rgba(0,0,0,0.1);
47
+ }
48
+ h1 { color: #2563eb; margin-bottom: 10px; }
49
+ h2 { color: #374151; border-bottom: 2px solid #e5e7eb; padding-bottom: 10px; }
50
+ h3 { color: #6b7280; }
51
+ .endpoint {
52
+ background: #f3f4f6;
53
+ border-left: 4px solid #2563eb;
54
+ padding: 15px;
55
+ margin: 15px 0;
56
+ border-radius: 4px;
57
+ }
58
+ .method {
59
+ display: inline-block;
60
+ padding: 4px 8px;
61
+ border-radius: 4px;
62
+ font-weight: bold;
63
+ margin-right: 10px;
64
+ color: white;
65
+ }
66
+ .method.GET { background: #10b981; }
67
+ .method.POST { background: #f59e0b; }
68
+ .method.PUT { background: #3b82f6; }
69
+ .method.DELETE { background: #ef4444; }
70
+ .method.PATCH { background: #8b5cf6; }
71
+ .path { font-family: monospace; font-size: 16px; font-weight: bold; }
72
+ .description { color: #6b7280; margin: 8px 0; }
73
+ .tags { margin: 8px 0; }
74
+ .tag {
75
+ display: inline-block;
76
+ background: #e5e7eb;
77
+ color: #374151;
78
+ padding: 2px 8px;
79
+ border-radius: 12px;
80
+ font-size: 12px;
81
+ margin-right: 5px;
82
+ }
83
+ .validation {
84
+ background: #fef3c7;
85
+ border: 1px solid #f59e0b;
86
+ padding: 10px;
87
+ border-radius: 4px;
88
+ margin: 10px 0;
89
+ }
90
+ .auth {
91
+ background: #fee2e2;
92
+ border: 1px solid #ef4444;
93
+ padding: 10px;
94
+ border-radius: 4px;
95
+ margin: 10px 0;
96
+ }
97
+ .rate-limit {
98
+ background: #e0f2fe;
99
+ border: 1px solid #0284c7;
100
+ padding: 10px;
101
+ border-radius: 4px;
102
+ margin: 10px 0;
103
+ }
104
+ .example {
105
+ background: #f3f4f6;
106
+ border: 1px solid #d1d5db;
107
+ padding: 10px;
108
+ border-radius: 4px;
109
+ margin: 10px 0;
110
+ font-family: monospace;
111
+ font-size: 14px;
112
+ }
113
+ .footer {
114
+ margin-top: 40px;
115
+ padding-top: 20px;
116
+ border-top: 1px solid #e5e7eb;
117
+ text-align: center;
118
+ color: #6b7280;
119
+ }
120
+ </style>
121
+ </head>
122
+ <body>
123
+ <div class="container">
124
+ <h1>${this.options.title}</h1>
125
+ <p>${this.options.description}</p>
126
+
127
+ <div class="example">
128
+ <strong>Interactive Swagger UI:</strong> <a href="${this.options.basePath}" target="_blank">${this.options.basePath}</a><br>
129
+ <strong>OpenAPI JSON:</strong> <a href="${this.options.basePath}/openapi.json" target="_blank">${this.options.basePath}/openapi.json</a>
130
+ </div>
131
+
132
+ ${this.generateRouteDocumentation(routesByTag)}
133
+
134
+ <div class="footer">
135
+ <p>Generated automatically from Moro Framework intelligent routes</p>
136
+ <p>Built with Moro Framework - Intelligent Routing + Type-Safe Validation</p>
137
+ </div>
138
+ </div>
139
+ </body>
140
+ </html>`;
141
+ }
142
+ groupRoutesByTag() {
143
+ const grouped = new Map();
144
+ for (const route of this.routes) {
145
+ const tags = route.schema.tags || ["default"];
146
+ for (const tag of tags) {
147
+ if (!grouped.has(tag)) {
148
+ grouped.set(tag, []);
149
+ }
150
+ grouped.get(tag).push(route);
151
+ }
152
+ }
153
+ return grouped;
154
+ }
155
+ generateRouteDocumentation(routesByTag) {
156
+ let html = "";
157
+ for (const [tag, routes] of routesByTag) {
158
+ html += `<h2>${tag.charAt(0).toUpperCase() + tag.slice(1)}</h2>`;
159
+ for (const route of routes) {
160
+ html += this.generateRouteSection(route.schema);
161
+ }
162
+ }
163
+ return html;
164
+ }
165
+ generateRouteSection(route) {
166
+ const methodClass = route.method.toLowerCase();
167
+ const html = `
168
+ <div class="endpoint">
169
+ <div>
170
+ <span class="method ${route.method}">${route.method}</span>
171
+ <span class="path">${route.path}</span>
172
+ </div>
173
+
174
+ ${route.description ? `<div class="description">${route.description}</div>` : ""}
175
+
176
+ ${route.tags ? `<div class="tags">${route.tags.map((tag) => `<span class="tag">${tag}</span>`).join("")}</div>` : ""}
177
+
178
+ ${this.generateValidationInfo(route)}
179
+ ${this.generateAuthInfo(route)}
180
+ ${this.generateRateLimitInfo(route)}
181
+ ${this.generateExamples(route)}
182
+ </div>`;
183
+ return html;
184
+ }
185
+ generateValidationInfo(route) {
186
+ if (!route.validation)
187
+ return "";
188
+ const validationTypes = [];
189
+ if (route.validation.body)
190
+ validationTypes.push("Body");
191
+ if (route.validation.query)
192
+ validationTypes.push("Query Parameters");
193
+ if (route.validation.params)
194
+ validationTypes.push("Path Parameters");
195
+ if (route.validation.headers)
196
+ validationTypes.push("Headers");
197
+ return `
198
+ <div class="validation">
199
+ <strong>Validation:</strong> ${validationTypes.join(", ")}
200
+ <br><small>Request will be validated with Zod schemas for type safety</small>
201
+ </div>`;
202
+ }
203
+ generateAuthInfo(route) {
204
+ if (!route.auth)
205
+ return "";
206
+ const roles = route.auth.roles
207
+ ? route.auth.roles.join(", ")
208
+ : "authenticated";
209
+ return `
210
+ <div class="auth">
211
+ <strong>Authentication Required:</strong> ${roles}
212
+ <br><small>Requires valid authentication token</small>
213
+ </div>`;
214
+ }
215
+ generateRateLimitInfo(route) {
216
+ if (!route.rateLimit)
217
+ return "";
218
+ const { requests, window } = route.rateLimit;
219
+ const windowSeconds = Math.round(window / 1000);
220
+ return `
221
+ <div class="rate-limit">
222
+ <strong>Rate Limit:</strong> ${requests} requests per ${windowSeconds} seconds
223
+ <br><small>Automatic protection against abuse</small>
224
+ </div>`;
225
+ }
226
+ generateExamples(route) {
227
+ const baseUrl = "http://localhost:3001";
228
+ const fullPath = `${baseUrl}${route.path}`;
229
+ let example = "";
230
+ if (route.method === "GET") {
231
+ example = `curl "${fullPath}"`;
232
+ // Add query parameter example if validation exists
233
+ if (route.validation?.query) {
234
+ example = `curl "${fullPath}?limit=10&search=example"`;
235
+ }
236
+ }
237
+ else if (["POST", "PUT", "PATCH"].includes(route.method)) {
238
+ example = `curl -X ${route.method} ${fullPath} \\
239
+ -H "Content-Type: application/json" \\
240
+ -d '{"example": "data"}'`;
241
+ }
242
+ else {
243
+ example = `curl -X ${route.method} ${fullPath}`;
244
+ }
245
+ return `
246
+ <div class="example">
247
+ <strong>Example:</strong><br>
248
+ <code>${example}</code>
249
+ </div>`;
250
+ }
251
+ }
252
+ exports.SimpleDocsGenerator = SimpleDocsGenerator;
253
+ // Create middleware for simple docs
254
+ function createSimpleDocsMiddleware(routes, options = {}) {
255
+ const generator = new SimpleDocsGenerator(options);
256
+ generator.addRoutes(routes);
257
+ const basePath = options.basePath || "/docs";
258
+ return (req, res, next) => {
259
+ if (req.path === `${basePath}/simple` ||
260
+ req.path === `${basePath}/simple/`) {
261
+ res.setHeader("Content-Type", "text/html; charset=utf-8");
262
+ res.send(generator.generateHTML());
263
+ return;
264
+ }
265
+ next();
266
+ };
267
+ }
268
+ //# sourceMappingURL=simple-docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple-docs.js","sourceRoot":"","sources":["../../../src/core/docs/simple-docs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { HttpRequest, HttpResponse } from "../http";
2
+ import { OpenAPISpec } from "./openapi-generator";
3
+ export interface SwaggerUIOptions {
4
+ title?: string;
5
+ favicon?: string;
6
+ customCss?: string;
7
+ customJs?: string;
8
+ swaggerOptions?: Record<string, any>;
9
+ enableTryItOut?: boolean;
10
+ enableFilter?: boolean;
11
+ enableDeepLinking?: boolean;
12
+ }
13
+ export declare class SwaggerUIMiddleware {
14
+ private swaggerUIAssetPath;
15
+ private openAPISpec;
16
+ private options;
17
+ constructor(openAPISpec: OpenAPISpec, options?: SwaggerUIOptions);
18
+ private generateHTML;
19
+ createMiddleware(basePath?: string): (req: HttpRequest, res: HttpResponse, next: () => void) => void;
20
+ private getContentType;
21
+ updateSpec(newSpec: OpenAPISpec): void;
22
+ }
23
+ export declare function createDocsMiddleware(openAPISpec: OpenAPISpec, options?: SwaggerUIOptions): (req: HttpRequest, res: HttpResponse, next: () => void) => void;
24
+ export declare function generateDocsForApp(routes: any[], info: {
25
+ title: string;
26
+ version: string;
27
+ description?: string;
28
+ }, options?: SwaggerUIOptions): (req: HttpRequest, res: HttpResponse, next: () => void) => void;
@@ -0,0 +1,317 @@
1
+ "use strict";
2
+ // Swagger UI Integration for Moro Framework
3
+ // Serves interactive API documentation using Swagger UI
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.SwaggerUIMiddleware = void 0;
6
+ exports.createDocsMiddleware = createDocsMiddleware;
7
+ exports.generateDocsForApp = generateDocsForApp;
8
+ const fs_1 = require("fs");
9
+ const path_1 = require("path");
10
+ const logger_1 = require("../logger");
11
+ const logger = (0, logger_1.createFrameworkLogger)("SwaggerUI");
12
+ // Swagger UI middleware
13
+ class SwaggerUIMiddleware {
14
+ constructor(openAPISpec, options = {}) {
15
+ this.openAPISpec = openAPISpec;
16
+ this.options = {
17
+ title: "API Documentation",
18
+ enableTryItOut: true,
19
+ enableFilter: true,
20
+ enableDeepLinking: true,
21
+ swaggerOptions: {
22
+ dom_id: "#swagger-ui",
23
+ presets: [
24
+ "SwaggerUIBundle.presets.apis",
25
+ "SwaggerUIBundle.presets.standalone",
26
+ ],
27
+ plugins: ["SwaggerUIBundle.plugins.DownloadUrl"],
28
+ layout: "StandaloneLayout",
29
+ },
30
+ ...options,
31
+ };
32
+ try {
33
+ // Find swagger-ui-dist assets
34
+ this.swaggerUIAssetPath = require
35
+ .resolve("swagger-ui-dist/package.json")
36
+ .replace("/package.json", "");
37
+ logger.debug("Swagger UI assets found", "Initialization", {
38
+ assetPath: this.swaggerUIAssetPath,
39
+ });
40
+ }
41
+ catch (error) {
42
+ logger.error("Failed to locate Swagger UI assets", "Initialization", {
43
+ error: error instanceof Error ? error.message : String(error),
44
+ });
45
+ throw new Error("swagger-ui-dist package not found. Install with: npm install swagger-ui-dist");
46
+ }
47
+ }
48
+ // Generate HTML page for Swagger UI
49
+ generateHTML(basePath) {
50
+ const swaggerOptions = {
51
+ ...this.options.swaggerOptions,
52
+ url: `${basePath}/openapi.json`, // Relative URL to the OpenAPI spec
53
+ tryItOutEnabled: this.options.enableTryItOut,
54
+ filter: this.options.enableFilter,
55
+ deepLinking: this.options.enableDeepLinking,
56
+ };
57
+ return `<!DOCTYPE html>
58
+ <html lang="en">
59
+ <head>
60
+ <meta charset="UTF-8">
61
+ <title>${this.options.title}</title>
62
+ <link rel="stylesheet" type="text/css" href="${basePath}/swagger-ui.css" />
63
+ <style>
64
+ html {
65
+ box-sizing: border-box;
66
+ overflow: -moz-scrollbars-vertical;
67
+ overflow-y: scroll;
68
+ }
69
+ *, *:before, *:after {
70
+ box-sizing: inherit;
71
+ }
72
+ body {
73
+ margin:0;
74
+ background: #fafafa;
75
+ }
76
+ #loading-message {
77
+ padding: 20px;
78
+ text-align: center;
79
+ font-family: Arial, sans-serif;
80
+ color: #666;
81
+ }
82
+ #error-display {
83
+ display: none;
84
+ padding: 20px;
85
+ background: #ffebee;
86
+ border-left: 4px solid #f44336;
87
+ margin: 20px;
88
+ font-family: monospace;
89
+ color: #c62828;
90
+ }
91
+ ${this.options.customCss || ""}
92
+ </style>
93
+ ${this.options.favicon ? `<link rel="icon" type="image/png" href="${this.options.favicon}" sizes="32x32" />` : ""}
94
+ </head>
95
+ <body>
96
+ <div id="loading-message">
97
+ <h2>Loading Swagger UI...</h2>
98
+ <p>Please wait while the API documentation loads.</p>
99
+ </div>
100
+ <div id="swagger-ui"></div>
101
+ <div id="error-display">
102
+ <h3>Failed to Load Swagger UI</h3>
103
+ <div id="error-details"></div>
104
+ </div>
105
+
106
+ <script src="${basePath}/swagger-ui-bundle.js" charset="UTF-8"></script>
107
+ <script src="${basePath}/swagger-ui-standalone-preset.js" charset="UTF-8"></script>
108
+ <script>
109
+ console.log('Starting Swagger UI initialization...');
110
+
111
+ function showError(message, details) {
112
+ console.error('Swagger UI Error:', message, details);
113
+ document.getElementById('loading-message').style.display = 'none';
114
+ document.getElementById('error-display').style.display = 'block';
115
+ document.getElementById('error-details').innerHTML =
116
+ '<p><strong>Error:</strong> ' + message + '</p>' +
117
+ (details ? '<pre>' + JSON.stringify(details, null, 2) + '</pre>' : '');
118
+ }
119
+
120
+ function initializeSwaggerUI() {
121
+ console.log('Initializing Swagger UI...');
122
+
123
+ if (typeof SwaggerUIBundle === 'undefined') {
124
+ showError('SwaggerUIBundle not loaded', { SwaggerUIBundle: typeof SwaggerUIBundle });
125
+ return;
126
+ }
127
+
128
+ if (typeof SwaggerUIStandalonePreset === 'undefined') {
129
+ showError('SwaggerUIStandalonePreset not loaded', { SwaggerUIStandalonePreset: typeof SwaggerUIStandalonePreset });
130
+ return;
131
+ }
132
+
133
+ try {
134
+ console.log('Creating SwaggerUIBundle...');
135
+
136
+ const ui = SwaggerUIBundle({
137
+ url: '${basePath}/openapi.json',
138
+ dom_id: '#swagger-ui',
139
+ deepLinking: ${this.options.enableDeepLinking},
140
+ presets: [
141
+ SwaggerUIBundle.presets.apis,
142
+ SwaggerUIStandalonePreset
143
+ ],
144
+ plugins: [
145
+ SwaggerUIBundle.plugins.DownloadUrl
146
+ ],
147
+ layout: "StandaloneLayout",
148
+ tryItOutEnabled: ${this.options.enableTryItOut},
149
+ filter: ${this.options.enableFilter},
150
+ onComplete: function() {
151
+ console.log('Swagger UI loaded successfully');
152
+ document.getElementById('loading-message').style.display = 'none';
153
+ },
154
+ onFailure: function(error) {
155
+ console.error('Swagger UI failed to load:', error);
156
+ showError('Swagger UI initialization failed', error);
157
+ }
158
+ });
159
+
160
+ window.ui = ui;
161
+ console.log('SwaggerUIBundle created successfully');
162
+
163
+ // Hide loading message after timeout if onComplete doesn't fire
164
+ setTimeout(function() {
165
+ var loadingEl = document.getElementById('loading-message');
166
+ if (loadingEl && loadingEl.style.display !== 'none') {
167
+ console.log('Hiding loading message after timeout');
168
+ loadingEl.style.display = 'none';
169
+ }
170
+ }, 5000);
171
+
172
+ } catch (error) {
173
+ console.error('Error creating SwaggerUIBundle:', error);
174
+ showError('Failed to create SwaggerUIBundle', {
175
+ name: error.name,
176
+ message: error.message
177
+ });
178
+ }
179
+ }
180
+
181
+ // Initialize when DOM is ready and scripts are loaded
182
+ if (document.readyState === 'loading') {
183
+ document.addEventListener('DOMContentLoaded', function() {
184
+ setTimeout(initializeSwaggerUI, 100);
185
+ });
186
+ } else {
187
+ setTimeout(initializeSwaggerUI, 100);
188
+ }
189
+ </script>
190
+ </body>
191
+ </html>`;
192
+ }
193
+ // Create middleware function that serves Swagger UI
194
+ createMiddleware(basePath = "/docs") {
195
+ return (req, res, next) => {
196
+ const path = req.path;
197
+ logger.debug(`Docs middleware handling: ${path}`, "DocsMiddleware", {
198
+ basePath,
199
+ });
200
+ // Serve the main HTML page
201
+ if (path === basePath || path === `${basePath}/`) {
202
+ logger.debug("Serving Swagger UI HTML", "DocsServing");
203
+ // Set CSP headers to allow Swagger UI to work
204
+ res.setHeader("Content-Security-Policy", "default-src 'self'; " +
205
+ "script-src 'self' 'unsafe-inline' 'unsafe-eval'; " +
206
+ "style-src 'self' 'unsafe-inline'; " +
207
+ "img-src 'self' data: https:; " +
208
+ "font-src 'self' data:; " +
209
+ "connect-src 'self'");
210
+ res.setHeader("Content-Type", "text/html; charset=utf-8");
211
+ res.send(this.generateHTML(basePath));
212
+ return;
213
+ }
214
+ // Serve the OpenAPI JSON spec
215
+ if (path === `${basePath}/openapi.json`) {
216
+ logger.debug("Serving OpenAPI JSON spec", "DocsServing");
217
+ res.setHeader("Content-Type", "application/json");
218
+ res.json(this.openAPISpec);
219
+ return;
220
+ }
221
+ // Serve Swagger UI assets
222
+ if (path.startsWith(`${basePath}/`)) {
223
+ const assetName = path.replace(`${basePath}/`, "");
224
+ logger.debug(`Attempting to serve asset: ${assetName}`, "AssetServing", {
225
+ fullPath: path,
226
+ basePath,
227
+ assetPath: this.swaggerUIAssetPath,
228
+ });
229
+ // Security: only allow specific asset files
230
+ const allowedAssets = [
231
+ "swagger-ui-bundle.js",
232
+ "swagger-ui.css",
233
+ "swagger-ui-standalone-preset.js",
234
+ "favicon-16x16.png",
235
+ "favicon-32x32.png",
236
+ ];
237
+ if (allowedAssets.includes(assetName)) {
238
+ try {
239
+ const assetPath = (0, path_1.join)(this.swaggerUIAssetPath, assetName);
240
+ logger.debug(`Reading asset from: ${assetPath}`, "AssetServing");
241
+ const content = (0, fs_1.readFileSync)(assetPath);
242
+ // Set appropriate content type
243
+ const contentType = this.getContentType(assetName);
244
+ res.setHeader("Content-Type", contentType);
245
+ res.setHeader("Cache-Control", "public, max-age=86400"); // Cache for 1 day
246
+ logger.debug(`Serving asset: ${assetName} (${content.length} bytes)`, "AssetServing");
247
+ res.send(content);
248
+ return;
249
+ }
250
+ catch (error) {
251
+ logger.error(`Failed to serve Swagger UI asset: ${assetName}`, "AssetServing", {
252
+ error: error instanceof Error ? error.message : String(error),
253
+ assetPath: (0, path_1.join)(this.swaggerUIAssetPath, assetName),
254
+ });
255
+ res.status(404);
256
+ res.send(`Asset not found: ${assetName}`);
257
+ return;
258
+ }
259
+ }
260
+ else {
261
+ logger.warn(`Asset not allowed: ${assetName}`, "AssetServing", {
262
+ allowedAssets,
263
+ });
264
+ res.status(404);
265
+ res.send(`Asset not allowed: ${assetName}`);
266
+ return;
267
+ }
268
+ }
269
+ // Not a docs request, continue to next middleware
270
+ next();
271
+ };
272
+ }
273
+ // Get content type for asset files
274
+ getContentType(filename) {
275
+ if (filename.endsWith(".js"))
276
+ return "application/javascript";
277
+ if (filename.endsWith(".css"))
278
+ return "text/css";
279
+ if (filename.endsWith(".png"))
280
+ return "image/png";
281
+ if (filename.endsWith(".ico"))
282
+ return "image/x-icon";
283
+ return "text/plain";
284
+ }
285
+ // Update the OpenAPI spec (useful for dynamic updates)
286
+ updateSpec(newSpec) {
287
+ this.openAPISpec = newSpec;
288
+ logger.debug("OpenAPI specification updated", "SpecUpdate", {
289
+ pathCount: Object.keys(newSpec.paths).length,
290
+ });
291
+ }
292
+ }
293
+ exports.SwaggerUIMiddleware = SwaggerUIMiddleware;
294
+ // Convenience function to create documentation middleware
295
+ function createDocsMiddleware(openAPISpec, options = {}) {
296
+ const middleware = new SwaggerUIMiddleware(openAPISpec, options);
297
+ return middleware.createMiddleware();
298
+ }
299
+ // Helper function to generate documentation for an app
300
+ function generateDocsForApp(routes, info, options = {}) {
301
+ const openAPISpec = {
302
+ openapi: "3.0.3",
303
+ info,
304
+ servers: [
305
+ { url: "http://localhost:3000", description: "Development server" },
306
+ ],
307
+ paths: {},
308
+ tags: [],
309
+ };
310
+ // This will be enhanced when integrated with the routing system
311
+ logger.info("Documentation generated for app", "AppDocumentation", {
312
+ routeCount: routes.length,
313
+ title: info.title,
314
+ });
315
+ return createDocsMiddleware(openAPISpec, options);
316
+ }
317
+ //# sourceMappingURL=swagger-ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swagger-ui.js","sourceRoot":"","sources":["../../../src/core/docs/swagger-ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { ZodSchema } from "zod";
2
+ export interface OpenAPISchema {
3
+ type?: string;
4
+ format?: string;
5
+ description?: string;
6
+ example?: any;
7
+ enum?: any[];
8
+ items?: OpenAPISchema;
9
+ properties?: Record<string, OpenAPISchema>;
10
+ required?: string[];
11
+ minimum?: number;
12
+ maximum?: number;
13
+ minLength?: number;
14
+ maxLength?: number;
15
+ pattern?: string;
16
+ default?: any;
17
+ oneOf?: OpenAPISchema[];
18
+ anyOf?: OpenAPISchema[];
19
+ allOf?: OpenAPISchema[];
20
+ nullable?: boolean;
21
+ additionalProperties?: boolean | OpenAPISchema;
22
+ }
23
+ export interface ConversionOptions {
24
+ includeExamples?: boolean;
25
+ includeDescriptions?: boolean;
26
+ strict?: boolean;
27
+ }
28
+ export declare function zodToOpenAPI(schema: ZodSchema, options?: ConversionOptions): OpenAPISchema;
29
+ export declare function generateExampleFromSchema(schema: ZodSchema): any;