@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,532 @@
1
+ // Zod to OpenAPI Schema Converter
2
+ // Transforms Zod schemas into OpenAPI 3.0 schema definitions
3
+
4
+ import {
5
+ ZodSchema,
6
+ ZodType,
7
+ ZodObject,
8
+ ZodArray,
9
+ ZodString,
10
+ ZodNumber,
11
+ ZodBoolean,
12
+ ZodEnum,
13
+ ZodOptional,
14
+ ZodDefault,
15
+ ZodUnion,
16
+ ZodLiteral,
17
+ } from "zod";
18
+ import { createFrameworkLogger } from "../logger";
19
+
20
+ const logger = createFrameworkLogger("ZodToOpenAPI");
21
+
22
+ // OpenAPI schema types
23
+ export interface OpenAPISchema {
24
+ type?: string;
25
+ format?: string;
26
+ description?: string;
27
+ example?: any;
28
+ enum?: any[];
29
+ items?: OpenAPISchema;
30
+ properties?: Record<string, OpenAPISchema>;
31
+ required?: string[];
32
+ minimum?: number;
33
+ maximum?: number;
34
+ minLength?: number;
35
+ maxLength?: number;
36
+ pattern?: string;
37
+ default?: any;
38
+ oneOf?: OpenAPISchema[];
39
+ anyOf?: OpenAPISchema[];
40
+ allOf?: OpenAPISchema[];
41
+ nullable?: boolean;
42
+ additionalProperties?: boolean | OpenAPISchema;
43
+ }
44
+
45
+ // Conversion options
46
+ export interface ConversionOptions {
47
+ includeExamples?: boolean;
48
+ includeDescriptions?: boolean;
49
+ strict?: boolean;
50
+ }
51
+
52
+ // Main conversion function
53
+ export function zodToOpenAPI(
54
+ schema: ZodSchema,
55
+ options: ConversionOptions = {},
56
+ ): OpenAPISchema {
57
+ const opts = {
58
+ includeExamples: true,
59
+ includeDescriptions: true,
60
+ strict: false,
61
+ ...options,
62
+ };
63
+
64
+ try {
65
+ return convertZodType(schema._def, opts);
66
+ } catch (error) {
67
+ logger.error("Failed to convert Zod schema to OpenAPI", "Conversion", {
68
+ error: error instanceof Error ? error.message : String(error),
69
+ });
70
+
71
+ // Return a basic schema as fallback
72
+ return {
73
+ type: "object",
74
+ description: "Schema conversion failed",
75
+ additionalProperties: true,
76
+ };
77
+ }
78
+ }
79
+
80
+ // Convert Zod type definition to OpenAPI schema
81
+ function convertZodType(def: any, options: ConversionOptions): OpenAPISchema {
82
+ if (!def || typeof def !== "object") {
83
+ logger.warn("Invalid Zod definition received", "Conversion", { def });
84
+ return { type: "object", additionalProperties: true };
85
+ }
86
+
87
+ // Handle newer Zod structure - check for 'type' field first, then 'typeName'
88
+ const typeName = def.typeName || def.type;
89
+
90
+ if (!typeName) {
91
+ logger.warn("Missing typeName/type in Zod definition", "Conversion", {
92
+ def: JSON.stringify(def).substring(0, 200),
93
+ });
94
+ return { type: "object", additionalProperties: true };
95
+ }
96
+
97
+ switch (typeName) {
98
+ case "ZodString":
99
+ case "string":
100
+ return convertZodString(def, options);
101
+
102
+ case "ZodNumber":
103
+ case "number":
104
+ return convertZodNumber(def, options);
105
+
106
+ case "ZodBoolean":
107
+ case "boolean":
108
+ return convertZodBoolean(def, options);
109
+
110
+ case "ZodObject":
111
+ case "object":
112
+ return convertZodObject(def, options);
113
+
114
+ case "ZodArray":
115
+ case "array":
116
+ return convertZodArray(def, options);
117
+
118
+ case "ZodEnum":
119
+ case "enum":
120
+ return convertZodEnum(def, options);
121
+
122
+ case "ZodOptional":
123
+ case "optional":
124
+ return convertZodOptional(def, options);
125
+
126
+ case "ZodDefault":
127
+ case "default":
128
+ return convertZodDefault(def, options);
129
+
130
+ case "ZodUnion":
131
+ case "union":
132
+ return convertZodUnion(def, options);
133
+
134
+ case "ZodLiteral":
135
+ case "literal":
136
+ return convertZodLiteral(def, options);
137
+
138
+ case "ZodDate":
139
+ return {
140
+ type: "string",
141
+ format: "date-time",
142
+ description: options.includeDescriptions
143
+ ? "ISO 8601 date-time string"
144
+ : undefined,
145
+ };
146
+
147
+ case "ZodUUID":
148
+ return {
149
+ type: "string",
150
+ format: "uuid",
151
+ pattern:
152
+ "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
153
+ description: options.includeDescriptions ? "UUID string" : undefined,
154
+ };
155
+
156
+ default:
157
+ logger.warn(`Unsupported Zod type: ${typeName}`, "Conversion");
158
+ return {
159
+ type: "object",
160
+ description: `Unsupported type: ${typeName}`,
161
+ additionalProperties: true,
162
+ };
163
+ }
164
+ }
165
+
166
+ // Convert ZodString
167
+ function convertZodString(def: any, options: ConversionOptions): OpenAPISchema {
168
+ const schema: OpenAPISchema = { type: "string" };
169
+
170
+ // Handle checks (validations)
171
+ if (def.checks) {
172
+ for (const check of def.checks) {
173
+ switch (check.kind) {
174
+ case "min":
175
+ schema.minLength = check.value;
176
+ break;
177
+ case "max":
178
+ schema.maxLength = check.value;
179
+ break;
180
+ case "email":
181
+ schema.format = "email";
182
+ break;
183
+ case "url":
184
+ schema.format = "uri";
185
+ break;
186
+ case "uuid":
187
+ schema.format = "uuid";
188
+ schema.pattern =
189
+ "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$";
190
+ break;
191
+ case "regex":
192
+ schema.pattern = check.regex.source;
193
+ break;
194
+ case "datetime":
195
+ schema.format = "date-time";
196
+ break;
197
+ }
198
+ }
199
+ }
200
+
201
+ if (options.includeExamples) {
202
+ if (schema.format === "email") {
203
+ schema.example = "user@example.com";
204
+ } else if (schema.format === "uuid") {
205
+ schema.example = "123e4567-e89b-12d3-a456-426614174000";
206
+ } else if (schema.format === "date-time") {
207
+ schema.example = "2023-12-01T10:00:00Z";
208
+ } else {
209
+ schema.example = "string";
210
+ }
211
+ }
212
+
213
+ return schema;
214
+ }
215
+
216
+ // Convert ZodNumber
217
+ function convertZodNumber(def: any, options: ConversionOptions): OpenAPISchema {
218
+ const schema: OpenAPISchema = { type: "number" };
219
+
220
+ if (def.checks) {
221
+ for (const check of def.checks) {
222
+ switch (check.kind) {
223
+ case "min":
224
+ schema.minimum = check.value;
225
+ break;
226
+ case "max":
227
+ schema.maximum = check.value;
228
+ break;
229
+ case "int":
230
+ schema.type = "integer";
231
+ break;
232
+ }
233
+ }
234
+ }
235
+
236
+ if (options.includeExamples) {
237
+ schema.example = schema.type === "integer" ? 42 : 3.14;
238
+ }
239
+
240
+ return schema;
241
+ }
242
+
243
+ // Convert ZodBoolean
244
+ function convertZodBoolean(
245
+ def: any,
246
+ options: ConversionOptions,
247
+ ): OpenAPISchema {
248
+ const schema: OpenAPISchema = { type: "boolean" };
249
+
250
+ if (options.includeExamples) {
251
+ schema.example = true;
252
+ }
253
+
254
+ return schema;
255
+ }
256
+
257
+ // Convert ZodObject
258
+ function convertZodObject(def: any, options: ConversionOptions): OpenAPISchema {
259
+ const schema: OpenAPISchema = {
260
+ type: "object",
261
+ properties: {},
262
+ required: [],
263
+ };
264
+
265
+ // Handle both old and new Zod object structures
266
+ let shape;
267
+ if (typeof def.shape === "function") {
268
+ shape = def.shape();
269
+ } else if (def.shape && typeof def.shape === "object") {
270
+ shape = def.shape;
271
+ } else {
272
+ logger.warn("Could not extract shape from Zod object", "Conversion");
273
+ return { type: "object", additionalProperties: true };
274
+ }
275
+
276
+ for (const [key, value] of Object.entries(shape)) {
277
+ const zodType = value as any;
278
+
279
+ // Handle the nested structure properly
280
+ let typeDef;
281
+ if (zodType._def) {
282
+ typeDef = zodType._def;
283
+ } else if (zodType.def) {
284
+ typeDef = zodType.def;
285
+ } else {
286
+ typeDef = zodType;
287
+ }
288
+
289
+ schema.properties![key] = convertZodType(typeDef, options);
290
+
291
+ // Check if field is required (not optional and no default)
292
+ const typeStr = typeDef.typeName || typeDef.type;
293
+ if (
294
+ typeStr !== "optional" &&
295
+ typeStr !== "ZodOptional" &&
296
+ typeStr !== "default" &&
297
+ typeStr !== "ZodDefault"
298
+ ) {
299
+ schema.required!.push(key);
300
+ }
301
+ }
302
+
303
+ // Remove required array if empty
304
+ if (schema.required!.length === 0) {
305
+ delete schema.required;
306
+ }
307
+
308
+ return schema;
309
+ }
310
+
311
+ // Convert ZodArray
312
+ function convertZodArray(def: any, options: ConversionOptions): OpenAPISchema {
313
+ const schema: OpenAPISchema = {
314
+ type: "array",
315
+ items:
316
+ def.type && def.type._def
317
+ ? convertZodType(def.type._def, options)
318
+ : { type: "string" },
319
+ };
320
+
321
+ // Handle array length constraints
322
+ if (def.minLength !== null && def.minLength !== undefined) {
323
+ schema.minLength =
324
+ typeof def.minLength === "object" ? def.minLength.value : def.minLength;
325
+ }
326
+ if (def.maxLength !== null && def.maxLength !== undefined) {
327
+ schema.maxLength =
328
+ typeof def.maxLength === "object" ? def.maxLength.value : def.maxLength;
329
+ }
330
+
331
+ if (options.includeExamples && schema.items) {
332
+ schema.example = [schema.items.example || "item"];
333
+ }
334
+
335
+ return schema;
336
+ }
337
+
338
+ // Convert ZodEnum
339
+ function convertZodEnum(def: any, options: ConversionOptions): OpenAPISchema {
340
+ const schema: OpenAPISchema = {
341
+ type: "string",
342
+ enum: def.values || [],
343
+ };
344
+
345
+ if (
346
+ options.includeExamples &&
347
+ def.values &&
348
+ Array.isArray(def.values) &&
349
+ def.values.length > 0
350
+ ) {
351
+ schema.example = def.values[0];
352
+ }
353
+
354
+ return schema;
355
+ }
356
+
357
+ // Convert ZodOptional
358
+ function convertZodOptional(
359
+ def: any,
360
+ options: ConversionOptions,
361
+ ): OpenAPISchema {
362
+ return convertZodType(def.innerType._def, options);
363
+ }
364
+
365
+ // Convert ZodDefault
366
+ function convertZodDefault(
367
+ def: any,
368
+ options: ConversionOptions,
369
+ ): OpenAPISchema {
370
+ const schema = convertZodType(def.innerType._def, options);
371
+
372
+ // Handle both function and property forms of defaultValue
373
+ if (typeof def.defaultValue === "function") {
374
+ try {
375
+ schema.default = def.defaultValue();
376
+ } catch (error) {
377
+ logger.warn("Failed to get default value from function", "Conversion", {
378
+ error,
379
+ });
380
+ schema.default = undefined;
381
+ }
382
+ } else if (def.defaultValue !== undefined) {
383
+ schema.default = def.defaultValue;
384
+ } else {
385
+ logger.warn("No default value found in ZodDefault", "Conversion");
386
+ schema.default = undefined;
387
+ }
388
+
389
+ return schema;
390
+ }
391
+
392
+ // Convert ZodUnion
393
+ function convertZodUnion(def: any, options: ConversionOptions): OpenAPISchema {
394
+ const schemas = def.options.map((option: ZodType) =>
395
+ convertZodType(option._def, options),
396
+ );
397
+
398
+ return {
399
+ oneOf: schemas,
400
+ };
401
+ }
402
+
403
+ // Convert ZodLiteral
404
+ function convertZodLiteral(
405
+ def: any,
406
+ options: ConversionOptions,
407
+ ): OpenAPISchema {
408
+ const value = def.value;
409
+
410
+ return {
411
+ type: typeof value as any,
412
+ enum: [value],
413
+ example: options.includeExamples ? value : undefined,
414
+ };
415
+ }
416
+
417
+ // Helper functions
418
+ function isOptionalType(type: ZodType): boolean {
419
+ return (type._def as any).typeName === "ZodOptional";
420
+ }
421
+
422
+ function hasDefault(type: ZodType): boolean {
423
+ return (type._def as any).typeName === "ZodDefault";
424
+ }
425
+
426
+ // Generate example data from Zod schema
427
+ export function generateExampleFromSchema(schema: ZodSchema): any {
428
+ try {
429
+ return generateExample(schema._def);
430
+ } catch (error) {
431
+ logger.warn("Failed to generate example from schema", "ExampleGeneration", {
432
+ error: error instanceof Error ? error.message : String(error),
433
+ });
434
+ return {};
435
+ }
436
+ }
437
+
438
+ function generateExample(def: any): any {
439
+ const typeName = def.typeName;
440
+
441
+ switch (typeName) {
442
+ case "ZodString":
443
+ if (def.checks) {
444
+ for (const check of def.checks) {
445
+ if (check.kind === "email") return "user@example.com";
446
+ if (check.kind === "uuid")
447
+ return "123e4567-e89b-12d3-a456-426614174000";
448
+ if (check.kind === "url") return "https://example.com";
449
+ if (check.kind === "datetime") return "2023-12-01T10:00:00Z";
450
+ }
451
+ }
452
+ return "string";
453
+
454
+ case "ZodNumber":
455
+ return 42;
456
+
457
+ case "ZodBoolean":
458
+ return true;
459
+
460
+ case "ZodObject": {
461
+ const example: any = {};
462
+ let shape;
463
+
464
+ try {
465
+ if (typeof def.shape === "function") {
466
+ shape = def.shape();
467
+ } else if (def.shape && typeof def.shape === "object") {
468
+ shape = def.shape;
469
+ } else {
470
+ return {};
471
+ }
472
+
473
+ for (const [key, value] of Object.entries(shape)) {
474
+ const zodType = value as ZodType;
475
+ if (!isOptionalType(zodType)) {
476
+ example[key] = generateExample(zodType._def);
477
+ }
478
+ }
479
+ } catch (error) {
480
+ logger.warn("Failed to generate object example", "ExampleGeneration", {
481
+ error,
482
+ });
483
+ return {};
484
+ }
485
+
486
+ return example;
487
+ }
488
+
489
+ case "ZodArray":
490
+ if (def.type && def.type._def) {
491
+ const itemExample = generateExample(def.type._def);
492
+ return [itemExample];
493
+ }
494
+ return ["item"];
495
+
496
+ case "ZodEnum":
497
+ return def.values && Array.isArray(def.values) && def.values.length > 0
498
+ ? def.values[0]
499
+ : "enum-value";
500
+
501
+ case "ZodOptional":
502
+ return generateExample(def.innerType._def);
503
+
504
+ case "ZodDefault":
505
+ // Handle both function and property forms of defaultValue
506
+ if (typeof def.defaultValue === "function") {
507
+ try {
508
+ return def.defaultValue();
509
+ } catch (error) {
510
+ logger.warn(
511
+ "Failed to get default value from function in example generation",
512
+ "ExampleGeneration",
513
+ { error },
514
+ );
515
+ return null;
516
+ }
517
+ } else if (def.defaultValue !== undefined) {
518
+ return def.defaultValue;
519
+ } else {
520
+ return null;
521
+ }
522
+
523
+ case "ZodUnion":
524
+ return generateExample(def.options[0]._def);
525
+
526
+ case "ZodLiteral":
527
+ return def.value;
528
+
529
+ default:
530
+ return null;
531
+ }
532
+ }