makecoder 1.0.25

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 (656) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +281 -0
  3. package/claude/commands/dev/ultra-think.md +153 -0
  4. package/claude/commands/docs/generate-api-documentation.md +80 -0
  5. package/claude/commands/git/commit.md +63 -0
  6. package/claude/commands/git/status.md +39 -0
  7. package/claude/commands/setup/migrate-to-typescript.md +76 -0
  8. package/claude/commands/test/generate-test-cases.md +76 -0
  9. package/dist/cc.mjs +4654 -0
  10. package/dist/coder.js +201 -0
  11. package/dist/codex +0 -0
  12. package/dist/codex.exe +0 -0
  13. package/dist/codex.mjs +162 -0
  14. package/dist/gcli.mjs +3162 -0
  15. package/dist/vendor/claude-code-jetbrains-plugin/lib/annotations-23.0.0.jar +0 -0
  16. package/dist/vendor/claude-code-jetbrains-plugin/lib/claude-code-jetbrains-plugin-0.1.12-beta-searchableOptions.jar +0 -0
  17. package/dist/vendor/claude-code-jetbrains-plugin/lib/claude-code-jetbrains-plugin-0.1.12-beta.jar +0 -0
  18. package/dist/vendor/claude-code-jetbrains-plugin/lib/config-1.4.3.jar +0 -0
  19. package/dist/vendor/claude-code-jetbrains-plugin/lib/jansi-2.4.1.jar +0 -0
  20. package/dist/vendor/claude-code-jetbrains-plugin/lib/kotlin-logging-jvm-7.0.0.jar +0 -0
  21. package/dist/vendor/claude-code-jetbrains-plugin/lib/kotlin-reflect-2.0.21.jar +0 -0
  22. package/dist/vendor/claude-code-jetbrains-plugin/lib/kotlin-sdk-jvm-0.4.0.jar +0 -0
  23. package/dist/vendor/claude-code-jetbrains-plugin/lib/kotlin-stdlib-2.1.20.jar +0 -0
  24. package/dist/vendor/claude-code-jetbrains-plugin/lib/kotlinx-coroutines-core-jvm-1.9.0.jar +0 -0
  25. package/dist/vendor/claude-code-jetbrains-plugin/lib/kotlinx-coroutines-slf4j-1.9.0.jar +0 -0
  26. package/dist/vendor/claude-code-jetbrains-plugin/lib/kotlinx-io-bytestring-jvm-0.5.4.jar +0 -0
  27. package/dist/vendor/claude-code-jetbrains-plugin/lib/kotlinx-io-core-jvm-0.5.4.jar +0 -0
  28. package/dist/vendor/claude-code-jetbrains-plugin/lib/kotlinx-serialization-core-jvm-1.8.1.jar +0 -0
  29. package/dist/vendor/claude-code-jetbrains-plugin/lib/kotlinx-serialization-json-jvm-1.8.1.jar +0 -0
  30. package/dist/vendor/claude-code-jetbrains-plugin/lib/ktor-client-cio-jvm-3.0.2.jar +0 -0
  31. package/dist/vendor/claude-code-jetbrains-plugin/lib/ktor-client-core-jvm-3.0.2.jar +0 -0
  32. package/dist/vendor/claude-code-jetbrains-plugin/lib/ktor-events-jvm-3.0.2.jar +0 -0
  33. package/dist/vendor/claude-code-jetbrains-plugin/lib/ktor-http-cio-jvm-3.0.2.jar +0 -0
  34. package/dist/vendor/claude-code-jetbrains-plugin/lib/ktor-http-jvm-3.0.2.jar +0 -0
  35. package/dist/vendor/claude-code-jetbrains-plugin/lib/ktor-io-jvm-3.0.2.jar +0 -0
  36. package/dist/vendor/claude-code-jetbrains-plugin/lib/ktor-network-jvm-3.0.2.jar +0 -0
  37. package/dist/vendor/claude-code-jetbrains-plugin/lib/ktor-network-tls-jvm-3.0.2.jar +0 -0
  38. package/dist/vendor/claude-code-jetbrains-plugin/lib/ktor-serialization-jvm-3.0.2.jar +0 -0
  39. package/dist/vendor/claude-code-jetbrains-plugin/lib/ktor-server-cio-jvm-3.0.2.jar +0 -0
  40. package/dist/vendor/claude-code-jetbrains-plugin/lib/ktor-server-core-jvm-3.0.2.jar +0 -0
  41. package/dist/vendor/claude-code-jetbrains-plugin/lib/ktor-server-sse-jvm-3.0.2.jar +0 -0
  42. package/dist/vendor/claude-code-jetbrains-plugin/lib/ktor-server-websockets-jvm-3.0.2.jar +0 -0
  43. package/dist/vendor/claude-code-jetbrains-plugin/lib/ktor-sse-jvm-3.0.2.jar +0 -0
  44. package/dist/vendor/claude-code-jetbrains-plugin/lib/ktor-utils-jvm-3.0.2.jar +0 -0
  45. package/dist/vendor/claude-code-jetbrains-plugin/lib/ktor-websocket-serialization-jvm-3.0.2.jar +0 -0
  46. package/dist/vendor/claude-code-jetbrains-plugin/lib/ktor-websockets-jvm-3.0.2.jar +0 -0
  47. package/dist/vendor/claude-code-jetbrains-plugin/lib/slf4j-api-2.0.16.jar +0 -0
  48. package/dist/vendor/ripgrep/COPYING +3 -0
  49. package/dist/vendor/ripgrep/arm64-darwin/rg +0 -0
  50. package/dist/vendor/ripgrep/arm64-darwin/ripgrep.node +0 -0
  51. package/dist/vendor/ripgrep/arm64-linux/rg +0 -0
  52. package/dist/vendor/ripgrep/arm64-linux/ripgrep.node +0 -0
  53. package/dist/vendor/ripgrep/x64-darwin/rg +0 -0
  54. package/dist/vendor/ripgrep/x64-darwin/ripgrep.node +0 -0
  55. package/dist/vendor/ripgrep/x64-linux/rg +0 -0
  56. package/dist/vendor/ripgrep/x64-linux/ripgrep.node +0 -0
  57. package/dist/vendor/ripgrep/x64-win32/rg.exe +0 -0
  58. package/dist/vendor/ripgrep/x64-win32/ripgrep.node +0 -0
  59. package/dist/zod/LICENSE +21 -0
  60. package/dist/zod/README.md +208 -0
  61. package/dist/zod/index.cjs +33 -0
  62. package/dist/zod/index.d.cts +4 -0
  63. package/dist/zod/index.d.ts +4 -0
  64. package/dist/zod/index.js +4 -0
  65. package/dist/zod/package.json +118 -0
  66. package/dist/zod/src/index.ts +4 -0
  67. package/dist/zod/src/v3/ZodError.ts +330 -0
  68. package/dist/zod/src/v3/benchmarks/datetime.ts +58 -0
  69. package/dist/zod/src/v3/benchmarks/discriminatedUnion.ts +80 -0
  70. package/dist/zod/src/v3/benchmarks/index.ts +59 -0
  71. package/dist/zod/src/v3/benchmarks/ipv4.ts +57 -0
  72. package/dist/zod/src/v3/benchmarks/object.ts +69 -0
  73. package/dist/zod/src/v3/benchmarks/primitives.ts +162 -0
  74. package/dist/zod/src/v3/benchmarks/realworld.ts +63 -0
  75. package/dist/zod/src/v3/benchmarks/string.ts +55 -0
  76. package/dist/zod/src/v3/benchmarks/union.ts +80 -0
  77. package/dist/zod/src/v3/errors.ts +13 -0
  78. package/dist/zod/src/v3/external.ts +6 -0
  79. package/dist/zod/src/v3/helpers/enumUtil.ts +17 -0
  80. package/dist/zod/src/v3/helpers/errorUtil.ts +8 -0
  81. package/dist/zod/src/v3/helpers/parseUtil.ts +176 -0
  82. package/dist/zod/src/v3/helpers/partialUtil.ts +34 -0
  83. package/dist/zod/src/v3/helpers/typeAliases.ts +2 -0
  84. package/dist/zod/src/v3/helpers/util.ts +224 -0
  85. package/dist/zod/src/v3/index.ts +4 -0
  86. package/dist/zod/src/v3/locales/en.ts +124 -0
  87. package/dist/zod/src/v3/standard-schema.ts +113 -0
  88. package/dist/zod/src/v3/tests/Mocker.ts +54 -0
  89. package/dist/zod/src/v3/tests/all-errors.test.ts +157 -0
  90. package/dist/zod/src/v3/tests/anyunknown.test.ts +28 -0
  91. package/dist/zod/src/v3/tests/array.test.ts +71 -0
  92. package/dist/zod/src/v3/tests/async-parsing.test.ts +388 -0
  93. package/dist/zod/src/v3/tests/async-refinements.test.ts +46 -0
  94. package/dist/zod/src/v3/tests/base.test.ts +29 -0
  95. package/dist/zod/src/v3/tests/bigint.test.ts +55 -0
  96. package/dist/zod/src/v3/tests/branded.test.ts +53 -0
  97. package/dist/zod/src/v3/tests/catch.test.ts +220 -0
  98. package/dist/zod/src/v3/tests/coerce.test.ts +133 -0
  99. package/dist/zod/src/v3/tests/complex.test.ts +56 -0
  100. package/dist/zod/src/v3/tests/custom.test.ts +31 -0
  101. package/dist/zod/src/v3/tests/date.test.ts +32 -0
  102. package/dist/zod/src/v3/tests/deepmasking.test.ts +186 -0
  103. package/dist/zod/src/v3/tests/default.test.ts +112 -0
  104. package/dist/zod/src/v3/tests/description.test.ts +33 -0
  105. package/dist/zod/src/v3/tests/discriminated-unions.test.ts +315 -0
  106. package/dist/zod/src/v3/tests/enum.test.ts +80 -0
  107. package/dist/zod/src/v3/tests/error.test.ts +551 -0
  108. package/dist/zod/src/v3/tests/firstparty.test.ts +87 -0
  109. package/dist/zod/src/v3/tests/firstpartyschematypes.test.ts +21 -0
  110. package/dist/zod/src/v3/tests/function.test.ts +257 -0
  111. package/dist/zod/src/v3/tests/generics.test.ts +48 -0
  112. package/dist/zod/src/v3/tests/instanceof.test.ts +37 -0
  113. package/dist/zod/src/v3/tests/intersection.test.ts +110 -0
  114. package/dist/zod/src/v3/tests/language-server.source.ts +76 -0
  115. package/dist/zod/src/v3/tests/language-server.test.ts +207 -0
  116. package/dist/zod/src/v3/tests/literal.test.ts +36 -0
  117. package/dist/zod/src/v3/tests/map.test.ts +110 -0
  118. package/dist/zod/src/v3/tests/masking.test.ts +4 -0
  119. package/dist/zod/src/v3/tests/mocker.test.ts +19 -0
  120. package/dist/zod/src/v3/tests/nan.test.ts +21 -0
  121. package/dist/zod/src/v3/tests/nativeEnum.test.ts +87 -0
  122. package/dist/zod/src/v3/tests/nullable.test.ts +42 -0
  123. package/dist/zod/src/v3/tests/number.test.ts +176 -0
  124. package/dist/zod/src/v3/tests/object-augmentation.test.ts +29 -0
  125. package/dist/zod/src/v3/tests/object-in-es5-env.test.ts +29 -0
  126. package/dist/zod/src/v3/tests/object.test.ts +434 -0
  127. package/dist/zod/src/v3/tests/optional.test.ts +42 -0
  128. package/dist/zod/src/v3/tests/parseUtil.test.ts +23 -0
  129. package/dist/zod/src/v3/tests/parser.test.ts +41 -0
  130. package/dist/zod/src/v3/tests/partials.test.ts +243 -0
  131. package/dist/zod/src/v3/tests/pickomit.test.ts +111 -0
  132. package/dist/zod/src/v3/tests/pipeline.test.ts +29 -0
  133. package/dist/zod/src/v3/tests/preprocess.test.ts +186 -0
  134. package/dist/zod/src/v3/tests/primitive.test.ts +440 -0
  135. package/dist/zod/src/v3/tests/promise.test.ts +90 -0
  136. package/dist/zod/src/v3/tests/readonly.test.ts +194 -0
  137. package/dist/zod/src/v3/tests/record.test.ts +171 -0
  138. package/dist/zod/src/v3/tests/recursive.test.ts +197 -0
  139. package/dist/zod/src/v3/tests/refine.test.ts +313 -0
  140. package/dist/zod/src/v3/tests/safeparse.test.ts +27 -0
  141. package/dist/zod/src/v3/tests/set.test.ts +142 -0
  142. package/dist/zod/src/v3/tests/standard-schema.test.ts +83 -0
  143. package/dist/zod/src/v3/tests/string.test.ts +916 -0
  144. package/dist/zod/src/v3/tests/transformer.test.ts +233 -0
  145. package/dist/zod/src/v3/tests/tuple.test.ts +90 -0
  146. package/dist/zod/src/v3/tests/unions.test.ts +57 -0
  147. package/dist/zod/src/v3/tests/validations.test.ts +133 -0
  148. package/dist/zod/src/v3/tests/void.test.ts +15 -0
  149. package/dist/zod/src/v3/types.ts +5136 -0
  150. package/dist/zod/src/v4/classic/checks.ts +30 -0
  151. package/dist/zod/src/v4/classic/coerce.ts +27 -0
  152. package/dist/zod/src/v4/classic/compat.ts +66 -0
  153. package/dist/zod/src/v4/classic/errors.ts +75 -0
  154. package/dist/zod/src/v4/classic/external.ts +50 -0
  155. package/dist/zod/src/v4/classic/index.ts +5 -0
  156. package/dist/zod/src/v4/classic/iso.ts +90 -0
  157. package/dist/zod/src/v4/classic/parse.ts +33 -0
  158. package/dist/zod/src/v4/classic/schemas.ts +2054 -0
  159. package/dist/zod/src/v4/classic/tests/anyunknown.test.ts +26 -0
  160. package/dist/zod/src/v4/classic/tests/array.test.ts +264 -0
  161. package/dist/zod/src/v4/classic/tests/assignability.test.ts +210 -0
  162. package/dist/zod/src/v4/classic/tests/async-parsing.test.ts +381 -0
  163. package/dist/zod/src/v4/classic/tests/async-refinements.test.ts +68 -0
  164. package/dist/zod/src/v4/classic/tests/base.test.ts +7 -0
  165. package/dist/zod/src/v4/classic/tests/bigint.test.ts +54 -0
  166. package/dist/zod/src/v4/classic/tests/brand.test.ts +63 -0
  167. package/dist/zod/src/v4/classic/tests/catch.test.ts +252 -0
  168. package/dist/zod/src/v4/classic/tests/coalesce.test.ts +20 -0
  169. package/dist/zod/src/v4/classic/tests/coerce.test.ts +160 -0
  170. package/dist/zod/src/v4/classic/tests/continuability.test.ts +352 -0
  171. package/dist/zod/src/v4/classic/tests/custom.test.ts +40 -0
  172. package/dist/zod/src/v4/classic/tests/date.test.ts +31 -0
  173. package/dist/zod/src/v4/classic/tests/datetime.test.ts +296 -0
  174. package/dist/zod/src/v4/classic/tests/default.test.ts +313 -0
  175. package/dist/zod/src/v4/classic/tests/description.test.ts +32 -0
  176. package/dist/zod/src/v4/classic/tests/discriminated-unions.test.ts +619 -0
  177. package/dist/zod/src/v4/classic/tests/enum.test.ts +285 -0
  178. package/dist/zod/src/v4/classic/tests/error-utils.test.ts +527 -0
  179. package/dist/zod/src/v4/classic/tests/error.test.ts +711 -0
  180. package/dist/zod/src/v4/classic/tests/file.test.ts +91 -0
  181. package/dist/zod/src/v4/classic/tests/firstparty.test.ts +175 -0
  182. package/dist/zod/src/v4/classic/tests/function.test.ts +268 -0
  183. package/dist/zod/src/v4/classic/tests/generics.test.ts +72 -0
  184. package/dist/zod/src/v4/classic/tests/index.test.ts +829 -0
  185. package/dist/zod/src/v4/classic/tests/instanceof.test.ts +34 -0
  186. package/dist/zod/src/v4/classic/tests/intersection.test.ts +171 -0
  187. package/dist/zod/src/v4/classic/tests/json.test.ts +108 -0
  188. package/dist/zod/src/v4/classic/tests/lazy.test.ts +227 -0
  189. package/dist/zod/src/v4/classic/tests/literal.test.ts +92 -0
  190. package/dist/zod/src/v4/classic/tests/map.test.ts +196 -0
  191. package/dist/zod/src/v4/classic/tests/nan.test.ts +21 -0
  192. package/dist/zod/src/v4/classic/tests/nested-refine.test.ts +168 -0
  193. package/dist/zod/src/v4/classic/tests/nonoptional.test.ts +86 -0
  194. package/dist/zod/src/v4/classic/tests/nullable.test.ts +22 -0
  195. package/dist/zod/src/v4/classic/tests/number.test.ts +247 -0
  196. package/dist/zod/src/v4/classic/tests/object.test.ts +563 -0
  197. package/dist/zod/src/v4/classic/tests/optional.test.ts +123 -0
  198. package/dist/zod/src/v4/classic/tests/partial.test.ts +147 -0
  199. package/dist/zod/src/v4/classic/tests/pickomit.test.ts +127 -0
  200. package/dist/zod/src/v4/classic/tests/pipe.test.ts +81 -0
  201. package/dist/zod/src/v4/classic/tests/prefault.test.ts +37 -0
  202. package/dist/zod/src/v4/classic/tests/preprocess.test.ts +298 -0
  203. package/dist/zod/src/v4/classic/tests/primitive.test.ts +175 -0
  204. package/dist/zod/src/v4/classic/tests/promise.test.ts +81 -0
  205. package/dist/zod/src/v4/classic/tests/prototypes.test.ts +23 -0
  206. package/dist/zod/src/v4/classic/tests/readonly.test.ts +252 -0
  207. package/dist/zod/src/v4/classic/tests/record.test.ts +342 -0
  208. package/dist/zod/src/v4/classic/tests/recursive-types.test.ts +356 -0
  209. package/dist/zod/src/v4/classic/tests/refine.test.ts +532 -0
  210. package/dist/zod/src/v4/classic/tests/registries.test.ts +204 -0
  211. package/dist/zod/src/v4/classic/tests/set.test.ts +179 -0
  212. package/dist/zod/src/v4/classic/tests/standard-schema.test.ts +57 -0
  213. package/dist/zod/src/v4/classic/tests/string-formats.test.ts +109 -0
  214. package/dist/zod/src/v4/classic/tests/string.test.ts +881 -0
  215. package/dist/zod/src/v4/classic/tests/stringbool.test.ts +66 -0
  216. package/dist/zod/src/v4/classic/tests/template-literal.test.ts +758 -0
  217. package/dist/zod/src/v4/classic/tests/to-json-schema.test.ts +2314 -0
  218. package/dist/zod/src/v4/classic/tests/transform.test.ts +250 -0
  219. package/dist/zod/src/v4/classic/tests/tuple.test.ts +163 -0
  220. package/dist/zod/src/v4/classic/tests/union.test.ts +94 -0
  221. package/dist/zod/src/v4/classic/tests/validations.test.ts +283 -0
  222. package/dist/zod/src/v4/classic/tests/void.test.ts +12 -0
  223. package/dist/zod/src/v4/core/api.ts +1594 -0
  224. package/dist/zod/src/v4/core/checks.ts +1283 -0
  225. package/dist/zod/src/v4/core/config.ts +15 -0
  226. package/dist/zod/src/v4/core/core.ts +134 -0
  227. package/dist/zod/src/v4/core/doc.ts +44 -0
  228. package/dist/zod/src/v4/core/errors.ts +424 -0
  229. package/dist/zod/src/v4/core/function.ts +176 -0
  230. package/dist/zod/src/v4/core/index.ts +15 -0
  231. package/dist/zod/src/v4/core/json-schema.ts +143 -0
  232. package/dist/zod/src/v4/core/parse.ts +94 -0
  233. package/dist/zod/src/v4/core/regexes.ts +135 -0
  234. package/dist/zod/src/v4/core/registries.ts +96 -0
  235. package/dist/zod/src/v4/core/schemas.ts +3842 -0
  236. package/dist/zod/src/v4/core/standard-schema.ts +64 -0
  237. package/dist/zod/src/v4/core/tests/index.test.ts +46 -0
  238. package/dist/zod/src/v4/core/tests/locales/be.test.ts +124 -0
  239. package/dist/zod/src/v4/core/tests/locales/en.test.ts +22 -0
  240. package/dist/zod/src/v4/core/tests/locales/ru.test.ts +128 -0
  241. package/dist/zod/src/v4/core/tests/locales/tr.test.ts +69 -0
  242. package/dist/zod/src/v4/core/to-json-schema.ts +977 -0
  243. package/dist/zod/src/v4/core/util.ts +775 -0
  244. package/dist/zod/src/v4/core/versions.ts +5 -0
  245. package/dist/zod/src/v4/core/zsf.ts +323 -0
  246. package/dist/zod/src/v4/index.ts +4 -0
  247. package/dist/zod/src/v4/locales/ar.ts +125 -0
  248. package/dist/zod/src/v4/locales/az.ts +121 -0
  249. package/dist/zod/src/v4/locales/be.ts +184 -0
  250. package/dist/zod/src/v4/locales/ca.ts +127 -0
  251. package/dist/zod/src/v4/locales/cs.ts +142 -0
  252. package/dist/zod/src/v4/locales/de.ts +124 -0
  253. package/dist/zod/src/v4/locales/en.ts +127 -0
  254. package/dist/zod/src/v4/locales/eo.ts +125 -0
  255. package/dist/zod/src/v4/locales/es.ts +125 -0
  256. package/dist/zod/src/v4/locales/fa.ts +134 -0
  257. package/dist/zod/src/v4/locales/fi.ts +131 -0
  258. package/dist/zod/src/v4/locales/fr-CA.ts +126 -0
  259. package/dist/zod/src/v4/locales/fr.ts +124 -0
  260. package/dist/zod/src/v4/locales/he.ts +125 -0
  261. package/dist/zod/src/v4/locales/hu.ts +126 -0
  262. package/dist/zod/src/v4/locales/id.ts +125 -0
  263. package/dist/zod/src/v4/locales/index.ts +39 -0
  264. package/dist/zod/src/v4/locales/it.ts +125 -0
  265. package/dist/zod/src/v4/locales/ja.ts +122 -0
  266. package/dist/zod/src/v4/locales/kh.ts +126 -0
  267. package/dist/zod/src/v4/locales/ko.ts +131 -0
  268. package/dist/zod/src/v4/locales/mk.ts +127 -0
  269. package/dist/zod/src/v4/locales/ms.ts +124 -0
  270. package/dist/zod/src/v4/locales/nl.ts +126 -0
  271. package/dist/zod/src/v4/locales/no.ts +124 -0
  272. package/dist/zod/src/v4/locales/ota.ts +125 -0
  273. package/dist/zod/src/v4/locales/pl.ts +126 -0
  274. package/dist/zod/src/v4/locales/ps.ts +133 -0
  275. package/dist/zod/src/v4/locales/pt.ts +123 -0
  276. package/dist/zod/src/v4/locales/ru.ts +184 -0
  277. package/dist/zod/src/v4/locales/sl.ts +126 -0
  278. package/dist/zod/src/v4/locales/sv.ts +127 -0
  279. package/dist/zod/src/v4/locales/ta.ts +125 -0
  280. package/dist/zod/src/v4/locales/th.ts +126 -0
  281. package/dist/zod/src/v4/locales/tr.ts +121 -0
  282. package/dist/zod/src/v4/locales/ua.ts +126 -0
  283. package/dist/zod/src/v4/locales/ur.ts +126 -0
  284. package/dist/zod/src/v4/locales/vi.ts +125 -0
  285. package/dist/zod/src/v4/locales/zh-CN.ts +123 -0
  286. package/dist/zod/src/v4/locales/zh-TW.ts +125 -0
  287. package/dist/zod/src/v4/mini/checks.ts +32 -0
  288. package/dist/zod/src/v4/mini/coerce.ts +22 -0
  289. package/dist/zod/src/v4/mini/external.ts +40 -0
  290. package/dist/zod/src/v4/mini/index.ts +3 -0
  291. package/dist/zod/src/v4/mini/iso.ts +62 -0
  292. package/dist/zod/src/v4/mini/parse.ts +1 -0
  293. package/dist/zod/src/v4/mini/schemas.ts +1579 -0
  294. package/dist/zod/src/v4/mini/tests/assignability.test.ts +129 -0
  295. package/dist/zod/src/v4/mini/tests/brand.test.ts +51 -0
  296. package/dist/zod/src/v4/mini/tests/checks.test.ts +144 -0
  297. package/dist/zod/src/v4/mini/tests/computed.test.ts +36 -0
  298. package/dist/zod/src/v4/mini/tests/error.test.ts +22 -0
  299. package/dist/zod/src/v4/mini/tests/functions.test.ts +43 -0
  300. package/dist/zod/src/v4/mini/tests/index.test.ts +871 -0
  301. package/dist/zod/src/v4/mini/tests/number.test.ts +95 -0
  302. package/dist/zod/src/v4/mini/tests/object.test.ts +185 -0
  303. package/dist/zod/src/v4/mini/tests/prototypes.test.ts +43 -0
  304. package/dist/zod/src/v4/mini/tests/recursive-types.test.ts +275 -0
  305. package/dist/zod/src/v4/mini/tests/string.test.ts +299 -0
  306. package/dist/zod/src/v4-mini/index.ts +1 -0
  307. package/dist/zod/v3/ZodError.cjs +138 -0
  308. package/dist/zod/v3/ZodError.d.cts +164 -0
  309. package/dist/zod/v3/ZodError.d.ts +164 -0
  310. package/dist/zod/v3/ZodError.js +133 -0
  311. package/dist/zod/v3/errors.cjs +17 -0
  312. package/dist/zod/v3/errors.d.cts +5 -0
  313. package/dist/zod/v3/errors.d.ts +5 -0
  314. package/dist/zod/v3/errors.js +9 -0
  315. package/dist/zod/v3/external.cjs +22 -0
  316. package/dist/zod/v3/external.d.cts +6 -0
  317. package/dist/zod/v3/external.d.ts +6 -0
  318. package/dist/zod/v3/external.js +6 -0
  319. package/dist/zod/v3/helpers/enumUtil.cjs +2 -0
  320. package/dist/zod/v3/helpers/enumUtil.d.cts +8 -0
  321. package/dist/zod/v3/helpers/enumUtil.d.ts +8 -0
  322. package/dist/zod/v3/helpers/enumUtil.js +1 -0
  323. package/dist/zod/v3/helpers/errorUtil.cjs +9 -0
  324. package/dist/zod/v3/helpers/errorUtil.d.cts +9 -0
  325. package/dist/zod/v3/helpers/errorUtil.d.ts +9 -0
  326. package/dist/zod/v3/helpers/errorUtil.js +6 -0
  327. package/dist/zod/v3/helpers/parseUtil.cjs +124 -0
  328. package/dist/zod/v3/helpers/parseUtil.d.cts +78 -0
  329. package/dist/zod/v3/helpers/parseUtil.d.ts +78 -0
  330. package/dist/zod/v3/helpers/parseUtil.js +109 -0
  331. package/dist/zod/v3/helpers/partialUtil.cjs +2 -0
  332. package/dist/zod/v3/helpers/partialUtil.d.cts +8 -0
  333. package/dist/zod/v3/helpers/partialUtil.d.ts +8 -0
  334. package/dist/zod/v3/helpers/partialUtil.js +1 -0
  335. package/dist/zod/v3/helpers/typeAliases.cjs +2 -0
  336. package/dist/zod/v3/helpers/typeAliases.d.cts +2 -0
  337. package/dist/zod/v3/helpers/typeAliases.d.ts +2 -0
  338. package/dist/zod/v3/helpers/typeAliases.js +1 -0
  339. package/dist/zod/v3/helpers/util.cjs +137 -0
  340. package/dist/zod/v3/helpers/util.d.cts +85 -0
  341. package/dist/zod/v3/helpers/util.d.ts +85 -0
  342. package/dist/zod/v3/helpers/util.js +133 -0
  343. package/dist/zod/v3/index.cjs +33 -0
  344. package/dist/zod/v3/index.d.cts +4 -0
  345. package/dist/zod/v3/index.d.ts +4 -0
  346. package/dist/zod/v3/index.js +4 -0
  347. package/dist/zod/v3/locales/en.cjs +111 -0
  348. package/dist/zod/v3/locales/en.d.cts +3 -0
  349. package/dist/zod/v3/locales/en.d.ts +3 -0
  350. package/dist/zod/v3/locales/en.js +109 -0
  351. package/dist/zod/v3/standard-schema.cjs +2 -0
  352. package/dist/zod/v3/standard-schema.d.cts +102 -0
  353. package/dist/zod/v3/standard-schema.d.ts +102 -0
  354. package/dist/zod/v3/standard-schema.js +1 -0
  355. package/dist/zod/v3/types.cjs +3775 -0
  356. package/dist/zod/v3/types.d.cts +1031 -0
  357. package/dist/zod/v3/types.d.ts +1031 -0
  358. package/dist/zod/v3/types.js +3693 -0
  359. package/dist/zod/v4/classic/checks.cjs +32 -0
  360. package/dist/zod/v4/classic/checks.d.cts +1 -0
  361. package/dist/zod/v4/classic/checks.d.ts +1 -0
  362. package/dist/zod/v4/classic/checks.js +1 -0
  363. package/dist/zod/v4/classic/coerce.cjs +47 -0
  364. package/dist/zod/v4/classic/coerce.d.cts +17 -0
  365. package/dist/zod/v4/classic/coerce.d.ts +17 -0
  366. package/dist/zod/v4/classic/coerce.js +17 -0
  367. package/dist/zod/v4/classic/compat.cjs +57 -0
  368. package/dist/zod/v4/classic/compat.d.cts +46 -0
  369. package/dist/zod/v4/classic/compat.d.ts +46 -0
  370. package/dist/zod/v4/classic/compat.js +27 -0
  371. package/dist/zod/v4/classic/errors.cjs +67 -0
  372. package/dist/zod/v4/classic/errors.d.cts +30 -0
  373. package/dist/zod/v4/classic/errors.d.ts +30 -0
  374. package/dist/zod/v4/classic/errors.js +41 -0
  375. package/dist/zod/v4/classic/external.cjs +70 -0
  376. package/dist/zod/v4/classic/external.d.cts +13 -0
  377. package/dist/zod/v4/classic/external.d.ts +13 -0
  378. package/dist/zod/v4/classic/external.js +18 -0
  379. package/dist/zod/v4/classic/index.cjs +33 -0
  380. package/dist/zod/v4/classic/index.d.cts +4 -0
  381. package/dist/zod/v4/classic/index.d.ts +4 -0
  382. package/dist/zod/v4/classic/index.js +4 -0
  383. package/dist/zod/v4/classic/iso.cjs +60 -0
  384. package/dist/zod/v4/classic/iso.d.cts +22 -0
  385. package/dist/zod/v4/classic/iso.d.ts +22 -0
  386. package/dist/zod/v4/classic/iso.js +30 -0
  387. package/dist/zod/v4/classic/parse.cjs +32 -0
  388. package/dist/zod/v4/classic/parse.d.cts +23 -0
  389. package/dist/zod/v4/classic/parse.d.ts +23 -0
  390. package/dist/zod/v4/classic/parse.js +6 -0
  391. package/dist/zod/v4/classic/schemas.cjs +1109 -0
  392. package/dist/zod/v4/classic/schemas.d.cts +630 -0
  393. package/dist/zod/v4/classic/schemas.d.ts +630 -0
  394. package/dist/zod/v4/classic/schemas.js +1006 -0
  395. package/dist/zod/v4/core/api.cjs +1039 -0
  396. package/dist/zod/v4/core/api.d.cts +284 -0
  397. package/dist/zod/v4/core/api.d.ts +284 -0
  398. package/dist/zod/v4/core/api.js +906 -0
  399. package/dist/zod/v4/core/checks.cjs +591 -0
  400. package/dist/zod/v4/core/checks.d.cts +278 -0
  401. package/dist/zod/v4/core/checks.d.ts +278 -0
  402. package/dist/zod/v4/core/checks.js +565 -0
  403. package/dist/zod/v4/core/core.cjs +67 -0
  404. package/dist/zod/v4/core/core.d.cts +49 -0
  405. package/dist/zod/v4/core/core.d.ts +49 -0
  406. package/dist/zod/v4/core/core.js +61 -0
  407. package/dist/zod/v4/core/doc.cjs +39 -0
  408. package/dist/zod/v4/core/doc.d.cts +14 -0
  409. package/dist/zod/v4/core/doc.d.ts +14 -0
  410. package/dist/zod/v4/core/doc.js +35 -0
  411. package/dist/zod/v4/core/errors.cjs +226 -0
  412. package/dist/zod/v4/core/errors.d.cts +208 -0
  413. package/dist/zod/v4/core/errors.d.ts +208 -0
  414. package/dist/zod/v4/core/errors.js +195 -0
  415. package/dist/zod/v4/core/function.cjs +102 -0
  416. package/dist/zod/v4/core/function.d.cts +52 -0
  417. package/dist/zod/v4/core/function.d.ts +52 -0
  418. package/dist/zod/v4/core/function.js +75 -0
  419. package/dist/zod/v4/core/index.cjs +44 -0
  420. package/dist/zod/v4/core/index.d.cts +15 -0
  421. package/dist/zod/v4/core/index.d.ts +15 -0
  422. package/dist/zod/v4/core/index.js +15 -0
  423. package/dist/zod/v4/core/json-schema.cjs +2 -0
  424. package/dist/zod/v4/core/json-schema.d.cts +87 -0
  425. package/dist/zod/v4/core/json-schema.d.ts +87 -0
  426. package/dist/zod/v4/core/json-schema.js +1 -0
  427. package/dist/zod/v4/core/parse.cjs +87 -0
  428. package/dist/zod/v4/core/parse.d.cts +25 -0
  429. package/dist/zod/v4/core/parse.d.ts +25 -0
  430. package/dist/zod/v4/core/parse.js +57 -0
  431. package/dist/zod/v4/core/regexes.cjs +103 -0
  432. package/dist/zod/v4/core/regexes.d.cts +62 -0
  433. package/dist/zod/v4/core/regexes.d.ts +62 -0
  434. package/dist/zod/v4/core/regexes.js +95 -0
  435. package/dist/zod/v4/core/registries.cjs +56 -0
  436. package/dist/zod/v4/core/registries.d.cts +35 -0
  437. package/dist/zod/v4/core/registries.d.ts +35 -0
  438. package/dist/zod/v4/core/registries.js +51 -0
  439. package/dist/zod/v4/core/schemas.cjs +1748 -0
  440. package/dist/zod/v4/core/schemas.d.cts +1041 -0
  441. package/dist/zod/v4/core/schemas.d.ts +1041 -0
  442. package/dist/zod/v4/core/schemas.js +1717 -0
  443. package/dist/zod/v4/core/standard-schema.cjs +2 -0
  444. package/dist/zod/v4/core/standard-schema.d.cts +55 -0
  445. package/dist/zod/v4/core/standard-schema.d.ts +55 -0
  446. package/dist/zod/v4/core/standard-schema.js +1 -0
  447. package/dist/zod/v4/core/to-json-schema.cjs +854 -0
  448. package/dist/zod/v4/core/to-json-schema.d.cts +88 -0
  449. package/dist/zod/v4/core/to-json-schema.d.ts +88 -0
  450. package/dist/zod/v4/core/to-json-schema.js +849 -0
  451. package/dist/zod/v4/core/util.cjs +539 -0
  452. package/dist/zod/v4/core/util.d.cts +183 -0
  453. package/dist/zod/v4/core/util.d.ts +183 -0
  454. package/dist/zod/v4/core/util.js +493 -0
  455. package/dist/zod/v4/core/versions.cjs +8 -0
  456. package/dist/zod/v4/core/versions.d.cts +5 -0
  457. package/dist/zod/v4/core/versions.d.ts +5 -0
  458. package/dist/zod/v4/core/versions.js +5 -0
  459. package/dist/zod/v4/index.cjs +22 -0
  460. package/dist/zod/v4/index.d.cts +3 -0
  461. package/dist/zod/v4/index.d.ts +3 -0
  462. package/dist/zod/v4/index.js +3 -0
  463. package/dist/zod/v4/locales/ar.cjs +142 -0
  464. package/dist/zod/v4/locales/ar.d.cts +4 -0
  465. package/dist/zod/v4/locales/ar.d.ts +4 -0
  466. package/dist/zod/v4/locales/ar.js +116 -0
  467. package/dist/zod/v4/locales/az.cjs +141 -0
  468. package/dist/zod/v4/locales/az.d.cts +4 -0
  469. package/dist/zod/v4/locales/az.d.ts +4 -0
  470. package/dist/zod/v4/locales/az.js +115 -0
  471. package/dist/zod/v4/locales/be.cjs +190 -0
  472. package/dist/zod/v4/locales/be.d.cts +4 -0
  473. package/dist/zod/v4/locales/be.d.ts +4 -0
  474. package/dist/zod/v4/locales/be.js +164 -0
  475. package/dist/zod/v4/locales/ca.cjs +144 -0
  476. package/dist/zod/v4/locales/ca.d.cts +4 -0
  477. package/dist/zod/v4/locales/ca.d.ts +4 -0
  478. package/dist/zod/v4/locales/ca.js +118 -0
  479. package/dist/zod/v4/locales/cs.cjs +161 -0
  480. package/dist/zod/v4/locales/cs.d.cts +4 -0
  481. package/dist/zod/v4/locales/cs.d.ts +4 -0
  482. package/dist/zod/v4/locales/cs.js +135 -0
  483. package/dist/zod/v4/locales/de.cjs +142 -0
  484. package/dist/zod/v4/locales/de.d.cts +4 -0
  485. package/dist/zod/v4/locales/de.d.ts +4 -0
  486. package/dist/zod/v4/locales/de.js +116 -0
  487. package/dist/zod/v4/locales/en.cjs +145 -0
  488. package/dist/zod/v4/locales/en.d.cts +5 -0
  489. package/dist/zod/v4/locales/en.d.ts +5 -0
  490. package/dist/zod/v4/locales/en.js +117 -0
  491. package/dist/zod/v4/locales/eo.cjs +144 -0
  492. package/dist/zod/v4/locales/eo.d.cts +5 -0
  493. package/dist/zod/v4/locales/eo.d.ts +5 -0
  494. package/dist/zod/v4/locales/eo.js +116 -0
  495. package/dist/zod/v4/locales/es.cjs +143 -0
  496. package/dist/zod/v4/locales/es.d.cts +4 -0
  497. package/dist/zod/v4/locales/es.d.ts +4 -0
  498. package/dist/zod/v4/locales/es.js +117 -0
  499. package/dist/zod/v4/locales/fa.cjs +148 -0
  500. package/dist/zod/v4/locales/fa.d.cts +4 -0
  501. package/dist/zod/v4/locales/fa.d.ts +4 -0
  502. package/dist/zod/v4/locales/fa.js +122 -0
  503. package/dist/zod/v4/locales/fi.cjs +148 -0
  504. package/dist/zod/v4/locales/fi.d.cts +4 -0
  505. package/dist/zod/v4/locales/fi.d.ts +4 -0
  506. package/dist/zod/v4/locales/fi.js +122 -0
  507. package/dist/zod/v4/locales/fr-CA.cjs +143 -0
  508. package/dist/zod/v4/locales/fr-CA.d.cts +4 -0
  509. package/dist/zod/v4/locales/fr-CA.d.ts +4 -0
  510. package/dist/zod/v4/locales/fr-CA.js +117 -0
  511. package/dist/zod/v4/locales/fr.cjs +142 -0
  512. package/dist/zod/v4/locales/fr.d.cts +4 -0
  513. package/dist/zod/v4/locales/fr.d.ts +4 -0
  514. package/dist/zod/v4/locales/fr.js +116 -0
  515. package/dist/zod/v4/locales/he.cjs +143 -0
  516. package/dist/zod/v4/locales/he.d.cts +4 -0
  517. package/dist/zod/v4/locales/he.d.ts +4 -0
  518. package/dist/zod/v4/locales/he.js +117 -0
  519. package/dist/zod/v4/locales/hu.cjs +143 -0
  520. package/dist/zod/v4/locales/hu.d.cts +4 -0
  521. package/dist/zod/v4/locales/hu.d.ts +4 -0
  522. package/dist/zod/v4/locales/hu.js +117 -0
  523. package/dist/zod/v4/locales/id.cjs +142 -0
  524. package/dist/zod/v4/locales/id.d.cts +4 -0
  525. package/dist/zod/v4/locales/id.d.ts +4 -0
  526. package/dist/zod/v4/locales/id.js +116 -0
  527. package/dist/zod/v4/locales/index.cjs +84 -0
  528. package/dist/zod/v4/locales/index.d.cts +39 -0
  529. package/dist/zod/v4/locales/index.d.ts +39 -0
  530. package/dist/zod/v4/locales/index.js +39 -0
  531. package/dist/zod/v4/locales/it.cjs +143 -0
  532. package/dist/zod/v4/locales/it.d.cts +4 -0
  533. package/dist/zod/v4/locales/it.d.ts +4 -0
  534. package/dist/zod/v4/locales/it.js +117 -0
  535. package/dist/zod/v4/locales/ja.cjs +141 -0
  536. package/dist/zod/v4/locales/ja.d.cts +4 -0
  537. package/dist/zod/v4/locales/ja.d.ts +4 -0
  538. package/dist/zod/v4/locales/ja.js +115 -0
  539. package/dist/zod/v4/locales/kh.cjs +143 -0
  540. package/dist/zod/v4/locales/kh.d.cts +4 -0
  541. package/dist/zod/v4/locales/kh.d.ts +4 -0
  542. package/dist/zod/v4/locales/kh.js +117 -0
  543. package/dist/zod/v4/locales/ko.cjs +147 -0
  544. package/dist/zod/v4/locales/ko.d.cts +4 -0
  545. package/dist/zod/v4/locales/ko.d.ts +4 -0
  546. package/dist/zod/v4/locales/ko.js +121 -0
  547. package/dist/zod/v4/locales/mk.cjs +144 -0
  548. package/dist/zod/v4/locales/mk.d.cts +4 -0
  549. package/dist/zod/v4/locales/mk.d.ts +4 -0
  550. package/dist/zod/v4/locales/mk.js +118 -0
  551. package/dist/zod/v4/locales/ms.cjs +142 -0
  552. package/dist/zod/v4/locales/ms.d.cts +4 -0
  553. package/dist/zod/v4/locales/ms.d.ts +4 -0
  554. package/dist/zod/v4/locales/ms.js +116 -0
  555. package/dist/zod/v4/locales/nl.cjs +143 -0
  556. package/dist/zod/v4/locales/nl.d.cts +4 -0
  557. package/dist/zod/v4/locales/nl.d.ts +4 -0
  558. package/dist/zod/v4/locales/nl.js +117 -0
  559. package/dist/zod/v4/locales/no.cjs +142 -0
  560. package/dist/zod/v4/locales/no.d.cts +4 -0
  561. package/dist/zod/v4/locales/no.d.ts +4 -0
  562. package/dist/zod/v4/locales/no.js +116 -0
  563. package/dist/zod/v4/locales/ota.cjs +143 -0
  564. package/dist/zod/v4/locales/ota.d.cts +4 -0
  565. package/dist/zod/v4/locales/ota.d.ts +4 -0
  566. package/dist/zod/v4/locales/ota.js +117 -0
  567. package/dist/zod/v4/locales/pl.cjs +143 -0
  568. package/dist/zod/v4/locales/pl.d.cts +4 -0
  569. package/dist/zod/v4/locales/pl.d.ts +4 -0
  570. package/dist/zod/v4/locales/pl.js +117 -0
  571. package/dist/zod/v4/locales/ps.cjs +148 -0
  572. package/dist/zod/v4/locales/ps.d.cts +4 -0
  573. package/dist/zod/v4/locales/ps.d.ts +4 -0
  574. package/dist/zod/v4/locales/ps.js +122 -0
  575. package/dist/zod/v4/locales/pt.cjs +142 -0
  576. package/dist/zod/v4/locales/pt.d.cts +4 -0
  577. package/dist/zod/v4/locales/pt.d.ts +4 -0
  578. package/dist/zod/v4/locales/pt.js +116 -0
  579. package/dist/zod/v4/locales/ru.cjs +190 -0
  580. package/dist/zod/v4/locales/ru.d.cts +4 -0
  581. package/dist/zod/v4/locales/ru.d.ts +4 -0
  582. package/dist/zod/v4/locales/ru.js +164 -0
  583. package/dist/zod/v4/locales/sl.cjs +143 -0
  584. package/dist/zod/v4/locales/sl.d.cts +4 -0
  585. package/dist/zod/v4/locales/sl.d.ts +4 -0
  586. package/dist/zod/v4/locales/sl.js +117 -0
  587. package/dist/zod/v4/locales/sv.cjs +144 -0
  588. package/dist/zod/v4/locales/sv.d.cts +4 -0
  589. package/dist/zod/v4/locales/sv.d.ts +4 -0
  590. package/dist/zod/v4/locales/sv.js +118 -0
  591. package/dist/zod/v4/locales/ta.cjs +143 -0
  592. package/dist/zod/v4/locales/ta.d.cts +4 -0
  593. package/dist/zod/v4/locales/ta.d.ts +4 -0
  594. package/dist/zod/v4/locales/ta.js +117 -0
  595. package/dist/zod/v4/locales/th.cjs +143 -0
  596. package/dist/zod/v4/locales/th.d.cts +4 -0
  597. package/dist/zod/v4/locales/th.d.ts +4 -0
  598. package/dist/zod/v4/locales/th.js +117 -0
  599. package/dist/zod/v4/locales/tr.cjs +143 -0
  600. package/dist/zod/v4/locales/tr.d.cts +5 -0
  601. package/dist/zod/v4/locales/tr.d.ts +5 -0
  602. package/dist/zod/v4/locales/tr.js +115 -0
  603. package/dist/zod/v4/locales/ua.cjs +143 -0
  604. package/dist/zod/v4/locales/ua.d.cts +4 -0
  605. package/dist/zod/v4/locales/ua.d.ts +4 -0
  606. package/dist/zod/v4/locales/ua.js +117 -0
  607. package/dist/zod/v4/locales/ur.cjs +143 -0
  608. package/dist/zod/v4/locales/ur.d.cts +4 -0
  609. package/dist/zod/v4/locales/ur.d.ts +4 -0
  610. package/dist/zod/v4/locales/ur.js +117 -0
  611. package/dist/zod/v4/locales/vi.cjs +142 -0
  612. package/dist/zod/v4/locales/vi.d.cts +4 -0
  613. package/dist/zod/v4/locales/vi.d.ts +4 -0
  614. package/dist/zod/v4/locales/vi.js +116 -0
  615. package/dist/zod/v4/locales/zh-CN.cjs +142 -0
  616. package/dist/zod/v4/locales/zh-CN.d.cts +4 -0
  617. package/dist/zod/v4/locales/zh-CN.d.ts +4 -0
  618. package/dist/zod/v4/locales/zh-CN.js +116 -0
  619. package/dist/zod/v4/locales/zh-TW.cjs +143 -0
  620. package/dist/zod/v4/locales/zh-TW.d.cts +4 -0
  621. package/dist/zod/v4/locales/zh-TW.d.ts +4 -0
  622. package/dist/zod/v4/locales/zh-TW.js +117 -0
  623. package/dist/zod/v4/mini/checks.cjs +34 -0
  624. package/dist/zod/v4/mini/checks.d.cts +1 -0
  625. package/dist/zod/v4/mini/checks.d.ts +1 -0
  626. package/dist/zod/v4/mini/checks.js +1 -0
  627. package/dist/zod/v4/mini/coerce.cjs +47 -0
  628. package/dist/zod/v4/mini/coerce.d.cts +7 -0
  629. package/dist/zod/v4/mini/coerce.d.ts +7 -0
  630. package/dist/zod/v4/mini/coerce.js +17 -0
  631. package/dist/zod/v4/mini/external.cjs +62 -0
  632. package/dist/zod/v4/mini/external.d.cts +11 -0
  633. package/dist/zod/v4/mini/external.d.ts +11 -0
  634. package/dist/zod/v4/mini/external.js +13 -0
  635. package/dist/zod/v4/mini/index.cjs +32 -0
  636. package/dist/zod/v4/mini/index.d.cts +3 -0
  637. package/dist/zod/v4/mini/index.d.ts +3 -0
  638. package/dist/zod/v4/mini/index.js +3 -0
  639. package/dist/zod/v4/mini/iso.cjs +60 -0
  640. package/dist/zod/v4/mini/iso.d.cts +22 -0
  641. package/dist/zod/v4/mini/iso.d.ts +22 -0
  642. package/dist/zod/v4/mini/iso.js +30 -0
  643. package/dist/zod/v4/mini/parse.cjs +8 -0
  644. package/dist/zod/v4/mini/parse.d.cts +1 -0
  645. package/dist/zod/v4/mini/parse.d.ts +1 -0
  646. package/dist/zod/v4/mini/parse.js +1 -0
  647. package/dist/zod/v4/mini/schemas.cjs +839 -0
  648. package/dist/zod/v4/mini/schemas.d.cts +356 -0
  649. package/dist/zod/v4/mini/schemas.d.ts +356 -0
  650. package/dist/zod/v4/mini/schemas.js +732 -0
  651. package/dist/zod/v4-mini/index.cjs +17 -0
  652. package/dist/zod/v4-mini/index.d.cts +1 -0
  653. package/dist/zod/v4-mini/index.d.ts +1 -0
  654. package/dist/zod/v4-mini/index.js +1 -0
  655. package/package.json +42 -0
  656. package/scripts/postinstall.js +75 -0
@@ -0,0 +1,2314 @@
1
+ import { describe, expect, test } from "vitest";
2
+ import * as z from "zod/v4";
3
+ // import * as zCore from "zod/v4/core";
4
+
5
+ describe("toJSONSchema", () => {
6
+ test("primitive types", () => {
7
+ expect(z.toJSONSchema(z.string())).toMatchInlineSnapshot(`
8
+ {
9
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
10
+ "type": "string",
11
+ }
12
+ `);
13
+ expect(z.toJSONSchema(z.number())).toMatchInlineSnapshot(`
14
+ {
15
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
16
+ "type": "number",
17
+ }
18
+ `);
19
+ expect(z.toJSONSchema(z.boolean())).toMatchInlineSnapshot(`
20
+ {
21
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
22
+ "type": "boolean",
23
+ }
24
+ `);
25
+ expect(z.toJSONSchema(z.null())).toMatchInlineSnapshot(`
26
+ {
27
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
28
+ "type": "null",
29
+ }
30
+ `);
31
+ expect(z.toJSONSchema(z.undefined(), { unrepresentable: "any" })).toMatchInlineSnapshot(`
32
+ {
33
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
34
+ }
35
+ `);
36
+ expect(z.toJSONSchema(z.any())).toMatchInlineSnapshot(`
37
+ {
38
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
39
+ }
40
+ `);
41
+ expect(z.toJSONSchema(z.unknown())).toMatchInlineSnapshot(`
42
+ {
43
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
44
+ }
45
+ `);
46
+ expect(z.toJSONSchema(z.never())).toMatchInlineSnapshot(`
47
+ {
48
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
49
+ "not": {},
50
+ }
51
+ `);
52
+ expect(z.toJSONSchema(z.email())).toMatchInlineSnapshot(`
53
+ {
54
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
55
+ "format": "email",
56
+ "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
57
+ "type": "string",
58
+ }
59
+ `);
60
+ expect(z.toJSONSchema(z.iso.datetime())).toMatchInlineSnapshot(`
61
+ {
62
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
63
+ "format": "date-time",
64
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
65
+ "type": "string",
66
+ }
67
+ `);
68
+ expect(z.toJSONSchema(z.iso.date())).toMatchInlineSnapshot(`
69
+ {
70
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
71
+ "format": "date",
72
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
73
+ "type": "string",
74
+ }
75
+ `);
76
+ expect(z.toJSONSchema(z.iso.time())).toMatchInlineSnapshot(`
77
+ {
78
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
79
+ "format": "time",
80
+ "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?$",
81
+ "type": "string",
82
+ }
83
+ `);
84
+ expect(z.toJSONSchema(z.iso.duration())).toMatchInlineSnapshot(`
85
+ {
86
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
87
+ "format": "duration",
88
+ "pattern": "^P(?:(\\d+W)|(?!.*W)(?=\\d|T\\d)(\\d+Y)?(\\d+M)?(\\d+D)?(T(?=\\d)(\\d+H)?(\\d+M)?(\\d+([.,]\\d+)?S)?)?)$",
89
+ "type": "string",
90
+ }
91
+ `);
92
+ expect(z.toJSONSchema(z.ipv4())).toMatchInlineSnapshot(`
93
+ {
94
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
95
+ "format": "ipv4",
96
+ "pattern": "^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$",
97
+ "type": "string",
98
+ }
99
+ `);
100
+ expect(z.toJSONSchema(z.ipv6())).toMatchInlineSnapshot(`
101
+ {
102
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
103
+ "format": "ipv6",
104
+ "pattern": "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})$",
105
+ "type": "string",
106
+ }
107
+ `);
108
+ expect(z.toJSONSchema(z.uuid())).toMatchInlineSnapshot(`
109
+ {
110
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
111
+ "format": "uuid",
112
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000)$",
113
+ "type": "string",
114
+ }
115
+ `);
116
+ expect(z.toJSONSchema(z.guid())).toMatchInlineSnapshot(`
117
+ {
118
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
119
+ "format": "uuid",
120
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
121
+ "type": "string",
122
+ }
123
+ `);
124
+ expect(z.toJSONSchema(z.url())).toMatchInlineSnapshot(`
125
+ {
126
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
127
+ "format": "uri",
128
+ "type": "string",
129
+ }
130
+ `);
131
+ expect(z.toJSONSchema(z.base64())).toMatchInlineSnapshot(`
132
+ {
133
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
134
+ "contentEncoding": "base64",
135
+ "format": "base64",
136
+ "pattern": "^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$",
137
+ "type": "string",
138
+ }
139
+ `);
140
+ expect(z.toJSONSchema(z.cuid())).toMatchInlineSnapshot(`
141
+ {
142
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
143
+ "format": "cuid",
144
+ "pattern": "^[cC][^\\s-]{8,}$",
145
+ "type": "string",
146
+ }
147
+ `);
148
+ // expect(z.toJSONSchema(z.regex(/asdf/))).toMatchInlineSnapshot();
149
+ expect(z.toJSONSchema(z.emoji())).toMatchInlineSnapshot(`
150
+ {
151
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
152
+ "format": "emoji",
153
+ "pattern": "^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$",
154
+ "type": "string",
155
+ }
156
+ `);
157
+ expect(z.toJSONSchema(z.nanoid())).toMatchInlineSnapshot(`
158
+ {
159
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
160
+ "format": "nanoid",
161
+ "pattern": "^[a-zA-Z0-9_-]{21}$",
162
+ "type": "string",
163
+ }
164
+ `);
165
+ expect(z.toJSONSchema(z.cuid2())).toMatchInlineSnapshot(`
166
+ {
167
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
168
+ "format": "cuid2",
169
+ "pattern": "^[0-9a-z]+$",
170
+ "type": "string",
171
+ }
172
+ `);
173
+ expect(z.toJSONSchema(z.ulid())).toMatchInlineSnapshot(`
174
+ {
175
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
176
+ "format": "ulid",
177
+ "pattern": "^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$",
178
+ "type": "string",
179
+ }
180
+ `);
181
+ // expect(z.toJSONSchema(z.cidr())).toMatchInlineSnapshot();
182
+ expect(z.toJSONSchema(z.number())).toMatchInlineSnapshot(`
183
+ {
184
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
185
+ "type": "number",
186
+ }
187
+ `);
188
+ expect(z.toJSONSchema(z.int())).toMatchInlineSnapshot(`
189
+ {
190
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
191
+ "maximum": 9007199254740991,
192
+ "minimum": -9007199254740991,
193
+ "type": "integer",
194
+ }
195
+ `);
196
+ expect(z.toJSONSchema(z.int32())).toMatchInlineSnapshot(`
197
+ {
198
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
199
+ "maximum": 2147483647,
200
+ "minimum": -2147483648,
201
+ "type": "integer",
202
+ }
203
+ `);
204
+ expect(z.toJSONSchema(z.float32())).toMatchInlineSnapshot(`
205
+ {
206
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
207
+ "maximum": 3.4028234663852886e+38,
208
+ "minimum": -3.4028234663852886e+38,
209
+ "type": "number",
210
+ }
211
+ `);
212
+ expect(z.toJSONSchema(z.float64())).toMatchInlineSnapshot(`
213
+ {
214
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
215
+ "maximum": 1.7976931348623157e+308,
216
+ "minimum": -1.7976931348623157e+308,
217
+ "type": "number",
218
+ }
219
+ `);
220
+ expect(z.toJSONSchema(z.jwt())).toMatchInlineSnapshot(`
221
+ {
222
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
223
+ "format": "jwt",
224
+ "type": "string",
225
+ }
226
+ `);
227
+ });
228
+
229
+ test("unsupported schema types", () => {
230
+ expect(() => z.toJSONSchema(z.bigint())).toThrow("BigInt cannot be represented in JSON Schema");
231
+ expect(() => z.toJSONSchema(z.int64())).toThrow("BigInt cannot be represented in JSON Schema");
232
+ expect(() => z.toJSONSchema(z.symbol())).toThrow("Symbols cannot be represented in JSON Schema");
233
+ expect(() => z.toJSONSchema(z.void())).toThrow("Void cannot be represented in JSON Schema");
234
+ expect(() => z.toJSONSchema(z.undefined())).toThrow("Undefined cannot be represented in JSON Schema");
235
+ expect(() => z.toJSONSchema(z.date())).toThrow("Date cannot be represented in JSON Schema");
236
+ expect(() => z.toJSONSchema(z.map(z.string(), z.number()))).toThrow("Map cannot be represented in JSON Schema");
237
+ expect(() => z.toJSONSchema(z.set(z.string()))).toThrow("Set cannot be represented in JSON Schema");
238
+ expect(() => z.toJSONSchema(z.custom(() => true))).toThrow("Custom types cannot be represented in JSON Schema");
239
+
240
+ // Transform
241
+ const transformSchema = z.string().transform((val) => Number.parseInt(val));
242
+ expect(() => z.toJSONSchema(transformSchema)).toThrow("Transforms cannot be represented in JSON Schema");
243
+
244
+ // Static catch values
245
+ const staticCatchSchema = z.string().catch(() => "sup");
246
+ expect(z.toJSONSchema(staticCatchSchema)).toMatchInlineSnapshot(`
247
+ {
248
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
249
+ "default": "sup",
250
+ "type": "string",
251
+ }
252
+ `);
253
+
254
+ // Dynamic catch values
255
+ const dynamicCatchSchema = z.string().catch((ctx) => `${ctx.issues.length}`);
256
+ expect(() => z.toJSONSchema(dynamicCatchSchema)).toThrow("Dynamic catch values are not supported in JSON Schema");
257
+ });
258
+
259
+ test("string formats", () => {
260
+ expect(z.toJSONSchema(z.string().email())).toMatchInlineSnapshot(`
261
+ {
262
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
263
+ "format": "email",
264
+ "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
265
+ "type": "string",
266
+ }
267
+ `);
268
+ expect(z.toJSONSchema(z.string().uuid())).toMatchInlineSnapshot(`
269
+ {
270
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
271
+ "format": "uuid",
272
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000)$",
273
+ "type": "string",
274
+ }
275
+ `);
276
+ expect(z.toJSONSchema(z.iso.datetime())).toMatchInlineSnapshot(`
277
+ {
278
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
279
+ "format": "date-time",
280
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
281
+ "type": "string",
282
+ }
283
+ `);
284
+
285
+ expect(z.toJSONSchema(z.iso.date())).toMatchInlineSnapshot(`
286
+ {
287
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
288
+ "format": "date",
289
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
290
+ "type": "string",
291
+ }
292
+ `);
293
+ expect(z.toJSONSchema(z.iso.time())).toMatchInlineSnapshot(`
294
+ {
295
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
296
+ "format": "time",
297
+ "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?$",
298
+ "type": "string",
299
+ }
300
+ `);
301
+ expect(z.toJSONSchema(z.iso.duration())).toMatchInlineSnapshot(`
302
+ {
303
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
304
+ "format": "duration",
305
+ "pattern": "^P(?:(\\d+W)|(?!.*W)(?=\\d|T\\d)(\\d+Y)?(\\d+M)?(\\d+D)?(T(?=\\d)(\\d+H)?(\\d+M)?(\\d+([.,]\\d+)?S)?)?)$",
306
+ "type": "string",
307
+ }
308
+ `);
309
+ // expect(z.toJSONSchema(z.string().ip())).toMatchInlineSnapshot(`
310
+ // {
311
+ // "pattern": /\\(\\^\\(\\?:\\(\\?:25\\[0-5\\]\\|2\\[0-4\\]\\[0-9\\]\\|1\\[0-9\\]\\[0-9\\]\\|\\[1-9\\]\\[0-9\\]\\|\\[0-9\\]\\)\\\\\\.\\)\\{3\\}\\(\\?:25\\[0-5\\]\\|2\\[0-4\\]\\[0-9\\]\\|1\\[0-9\\]\\[0-9\\]\\|\\[1-9\\]\\[0-9\\]\\|\\[0-9\\]\\)\\$\\)\\|\\(\\^\\(\\(\\[a-fA-F0-9\\]\\{1,4\\}:\\)\\{7\\}\\|::\\(\\[a-fA-F0-9\\]\\{1,4\\}:\\)\\{0,6\\}\\|\\(\\[a-fA-F0-9\\]\\{1,4\\}:\\)\\{1\\}:\\(\\[a-fA-F0-9\\]\\{1,4\\}:\\)\\{0,5\\}\\|\\(\\[a-fA-F0-9\\]\\{1,4\\}:\\)\\{2\\}:\\(\\[a-fA-F0-9\\]\\{1,4\\}:\\)\\{0,4\\}\\|\\(\\[a-fA-F0-9\\]\\{1,4\\}:\\)\\{3\\}:\\(\\[a-fA-F0-9\\]\\{1,4\\}:\\)\\{0,3\\}\\|\\(\\[a-fA-F0-9\\]\\{1,4\\}:\\)\\{4\\}:\\(\\[a-fA-F0-9\\]\\{1,4\\}:\\)\\{0,2\\}\\|\\(\\[a-fA-F0-9\\]\\{1,4\\}:\\)\\{5\\}:\\(\\[a-fA-F0-9\\]\\{1,4\\}:\\)\\{0,1\\}\\)\\(\\[a-fA-F0-9\\]\\{1,4\\}\\|\\(\\(\\(25\\[0-5\\]\\)\\|\\(2\\[0-4\\]\\[0-9\\]\\)\\|\\(1\\[0-9\\]\\{2\\}\\)\\|\\(\\[0-9\\]\\{1,2\\}\\)\\)\\\\\\.\\)\\{3\\}\\(\\(25\\[0-5\\]\\)\\|\\(2\\[0-4\\]\\[0-9\\]\\)\\|\\(1\\[0-9\\]\\{2\\}\\)\\|\\(\\[0-9\\]\\{1,2\\}\\)\\)\\)\\$\\)/,
312
+ // "type": "string",
313
+ // }
314
+ // `);
315
+ expect(z.toJSONSchema(z.ipv4())).toMatchInlineSnapshot(`
316
+ {
317
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
318
+ "format": "ipv4",
319
+ "pattern": "^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$",
320
+ "type": "string",
321
+ }
322
+ `);
323
+
324
+ expect(z.toJSONSchema(z.ipv6())).toMatchInlineSnapshot(`
325
+ {
326
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
327
+ "format": "ipv6",
328
+ "pattern": "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})$",
329
+ "type": "string",
330
+ }
331
+ `);
332
+
333
+ expect(z.toJSONSchema(z.base64())).toMatchInlineSnapshot(`
334
+ {
335
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
336
+ "contentEncoding": "base64",
337
+ "format": "base64",
338
+ "pattern": "^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$",
339
+ "type": "string",
340
+ }
341
+ `);
342
+ expect(z.toJSONSchema(z.url())).toMatchInlineSnapshot(`
343
+ {
344
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
345
+ "format": "uri",
346
+ "type": "string",
347
+ }
348
+ `);
349
+ expect(z.toJSONSchema(z.guid())).toMatchInlineSnapshot(`
350
+ {
351
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
352
+ "format": "uuid",
353
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
354
+ "type": "string",
355
+ }
356
+ `);
357
+ expect(z.toJSONSchema(z.string().regex(/asdf/))).toMatchInlineSnapshot(`
358
+ {
359
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
360
+ "pattern": "asdf",
361
+ "type": "string",
362
+ }
363
+ `);
364
+ });
365
+
366
+ test("string patterns", () => {
367
+ expect(
368
+ z.toJSONSchema(
369
+ z
370
+ .string()
371
+ .startsWith("hello")
372
+ .includes("cruel")
373
+ .includes("dark", { position: 10 })
374
+ .endsWith("world")
375
+ .regex(/stuff/)
376
+ )
377
+ ).toMatchInlineSnapshot(`
378
+ {
379
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
380
+ "allOf": [
381
+ {
382
+ "pattern": "^hello.*",
383
+ },
384
+ {
385
+ "pattern": "cruel",
386
+ },
387
+ {
388
+ "pattern": "^.{10}dark",
389
+ },
390
+ {
391
+ "pattern": ".*world$",
392
+ },
393
+ {
394
+ "pattern": "stuff",
395
+ },
396
+ ],
397
+ "type": "string",
398
+ }
399
+ `);
400
+
401
+ expect(
402
+ z.toJSONSchema(
403
+ z
404
+ .string()
405
+ .startsWith("hello")
406
+ .includes("cruel")
407
+ .includes("dark", { position: 10 })
408
+ .endsWith("world")
409
+ .regex(/stuff/),
410
+ {
411
+ target: "draft-7",
412
+ }
413
+ )
414
+ ).toMatchInlineSnapshot(`
415
+ {
416
+ "$schema": "http://json-schema.org/draft-07/schema#",
417
+ "allOf": [
418
+ {
419
+ "pattern": "^hello.*",
420
+ "type": "string",
421
+ },
422
+ {
423
+ "pattern": "cruel",
424
+ "type": "string",
425
+ },
426
+ {
427
+ "pattern": "^.{10}dark",
428
+ "type": "string",
429
+ },
430
+ {
431
+ "pattern": ".*world$",
432
+ "type": "string",
433
+ },
434
+ {
435
+ "pattern": "stuff",
436
+ "type": "string",
437
+ },
438
+ ],
439
+ "type": "string",
440
+ }
441
+ `);
442
+ });
443
+
444
+ test("number constraints", () => {
445
+ expect(z.toJSONSchema(z.number().min(5).max(10))).toMatchInlineSnapshot(
446
+ `
447
+ {
448
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
449
+ "maximum": 10,
450
+ "minimum": 5,
451
+ "type": "number",
452
+ }
453
+ `
454
+ );
455
+
456
+ expect(z.toJSONSchema(z.number().gt(5).gt(10))).toMatchInlineSnapshot(`
457
+ {
458
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
459
+ "exclusiveMinimum": 10,
460
+ "type": "number",
461
+ }
462
+ `);
463
+
464
+ expect(z.toJSONSchema(z.number().gt(5).gte(10))).toMatchInlineSnapshot(`
465
+ {
466
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
467
+ "minimum": 10,
468
+ "type": "number",
469
+ }
470
+ `);
471
+
472
+ expect(z.toJSONSchema(z.number().lt(5).lt(3))).toMatchInlineSnapshot(`
473
+ {
474
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
475
+ "exclusiveMaximum": 3,
476
+ "type": "number",
477
+ }
478
+ `);
479
+
480
+ expect(z.toJSONSchema(z.number().lt(5).lt(3).lte(2))).toMatchInlineSnapshot(`
481
+ {
482
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
483
+ "maximum": 2,
484
+ "type": "number",
485
+ }
486
+ `);
487
+
488
+ expect(z.toJSONSchema(z.number().lt(5).lte(3))).toMatchInlineSnapshot(`
489
+ {
490
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
491
+ "maximum": 3,
492
+ "type": "number",
493
+ }
494
+ `);
495
+
496
+ expect(z.toJSONSchema(z.number().gt(5).lt(10))).toMatchInlineSnapshot(`
497
+ {
498
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
499
+ "exclusiveMaximum": 10,
500
+ "exclusiveMinimum": 5,
501
+ "type": "number",
502
+ }
503
+ `);
504
+ expect(z.toJSONSchema(z.number().gte(5).lte(10))).toMatchInlineSnapshot(`
505
+ {
506
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
507
+ "maximum": 10,
508
+ "minimum": 5,
509
+ "type": "number",
510
+ }
511
+ `);
512
+ expect(z.toJSONSchema(z.number().positive())).toMatchInlineSnapshot(`
513
+ {
514
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
515
+ "exclusiveMinimum": 0,
516
+ "type": "number",
517
+ }
518
+ `);
519
+ expect(z.toJSONSchema(z.number().negative())).toMatchInlineSnapshot(`
520
+ {
521
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
522
+ "exclusiveMaximum": 0,
523
+ "type": "number",
524
+ }
525
+ `);
526
+ expect(z.toJSONSchema(z.number().nonpositive())).toMatchInlineSnapshot(`
527
+ {
528
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
529
+ "maximum": 0,
530
+ "type": "number",
531
+ }
532
+ `);
533
+ expect(z.toJSONSchema(z.number().nonnegative())).toMatchInlineSnapshot(`
534
+ {
535
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
536
+ "minimum": 0,
537
+ "type": "number",
538
+ }
539
+ `);
540
+ });
541
+
542
+ test("arrays", () => {
543
+ expect(z.toJSONSchema(z.array(z.string()))).toMatchInlineSnapshot(`
544
+ {
545
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
546
+ "items": {
547
+ "type": "string",
548
+ },
549
+ "type": "array",
550
+ }
551
+ `);
552
+ });
553
+
554
+ test("unions", () => {
555
+ const schema = z.union([z.string(), z.number()]);
556
+ expect(z.toJSONSchema(schema)).toMatchInlineSnapshot(`
557
+ {
558
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
559
+ "anyOf": [
560
+ {
561
+ "type": "string",
562
+ },
563
+ {
564
+ "type": "number",
565
+ },
566
+ ],
567
+ }
568
+ `);
569
+ });
570
+
571
+ test("intersections", () => {
572
+ const schema = z.intersection(z.object({ name: z.string() }), z.object({ age: z.number() }));
573
+
574
+ expect(z.toJSONSchema(schema)).toMatchInlineSnapshot(`
575
+ {
576
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
577
+ "allOf": [
578
+ {
579
+ "additionalProperties": false,
580
+ "properties": {
581
+ "name": {
582
+ "type": "string",
583
+ },
584
+ },
585
+ "required": [
586
+ "name",
587
+ ],
588
+ "type": "object",
589
+ },
590
+ {
591
+ "additionalProperties": false,
592
+ "properties": {
593
+ "age": {
594
+ "type": "number",
595
+ },
596
+ },
597
+ "required": [
598
+ "age",
599
+ ],
600
+ "type": "object",
601
+ },
602
+ ],
603
+ }
604
+ `);
605
+ });
606
+
607
+ test("record", () => {
608
+ const schema = z.record(z.string(), z.boolean());
609
+ expect(z.toJSONSchema(schema)).toMatchInlineSnapshot(`
610
+ {
611
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
612
+ "additionalProperties": {
613
+ "type": "boolean",
614
+ },
615
+ "propertyNames": {
616
+ "type": "string",
617
+ },
618
+ "type": "object",
619
+ }
620
+ `);
621
+ });
622
+
623
+ test("tuple", () => {
624
+ const schema = z.tuple([z.string(), z.number()]).rest(z.boolean());
625
+ expect(z.toJSONSchema(schema)).toMatchInlineSnapshot(`
626
+ {
627
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
628
+ "items": {
629
+ "type": "boolean",
630
+ },
631
+ "prefixItems": [
632
+ {
633
+ "type": "string",
634
+ },
635
+ {
636
+ "type": "number",
637
+ },
638
+ ],
639
+ "type": "array",
640
+ }
641
+ `);
642
+ });
643
+
644
+ test("promise", () => {
645
+ const schema = z.promise(z.string());
646
+ expect(z.toJSONSchema(schema)).toMatchInlineSnapshot(`
647
+ {
648
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
649
+ "type": "string",
650
+ }
651
+ `);
652
+ });
653
+
654
+ test("lazy", () => {
655
+ const schema = z.lazy(() => z.string());
656
+ expect(z.toJSONSchema(schema)).toMatchInlineSnapshot(`
657
+ {
658
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
659
+ "type": "string",
660
+ }
661
+ `);
662
+ });
663
+
664
+ // enum
665
+ test("enum", () => {
666
+ const a = z.enum(["a", "b", "c"]);
667
+ expect(z.toJSONSchema(a)).toMatchInlineSnapshot(`
668
+ {
669
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
670
+ "enum": [
671
+ "a",
672
+ "b",
673
+ "c",
674
+ ],
675
+ "type": "string",
676
+ }
677
+ `);
678
+
679
+ enum B {
680
+ A = 0,
681
+ B = 1,
682
+ C = 2,
683
+ }
684
+
685
+ const b = z.enum(B);
686
+ expect(z.toJSONSchema(b)).toMatchInlineSnapshot(`
687
+ {
688
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
689
+ "enum": [
690
+ 0,
691
+ 1,
692
+ 2,
693
+ ],
694
+ "type": "number",
695
+ }
696
+ `);
697
+ });
698
+
699
+ // literal
700
+ test("literal", () => {
701
+ const a = z.literal("hello");
702
+ expect(z.toJSONSchema(a)).toMatchInlineSnapshot(`
703
+ {
704
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
705
+ "const": "hello",
706
+ "type": "string",
707
+ }
708
+ `);
709
+
710
+ const b = z.literal(7);
711
+ expect(z.toJSONSchema(b)).toMatchInlineSnapshot(`
712
+ {
713
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
714
+ "const": 7,
715
+ "type": "number",
716
+ }
717
+ `);
718
+
719
+ const c = z.literal(["hello", undefined, null, 5, BigInt(1324)]);
720
+ expect(() => z.toJSONSchema(c)).toThrow();
721
+
722
+ const d = z.literal(["hello", null, 5]);
723
+ expect(z.toJSONSchema(d)).toMatchInlineSnapshot(`
724
+ {
725
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
726
+ "enum": [
727
+ "hello",
728
+ null,
729
+ 5,
730
+ ],
731
+ }
732
+ `);
733
+
734
+ const e = z.literal(["hello", "zod", "v4"]);
735
+ expect(z.toJSONSchema(e)).toMatchInlineSnapshot(`
736
+ {
737
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
738
+ "enum": [
739
+ "hello",
740
+ "zod",
741
+ "v4",
742
+ ],
743
+ "type": "string",
744
+ }
745
+ `);
746
+ });
747
+
748
+ // pipe
749
+ test("pipe", () => {
750
+ const schema = z
751
+ .string()
752
+ .transform((val) => Number.parseInt(val))
753
+ .pipe(z.number());
754
+ expect(z.toJSONSchema(schema)).toMatchInlineSnapshot(`
755
+ {
756
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
757
+ "type": "number",
758
+ }
759
+ `);
760
+ });
761
+
762
+ test("simple objects", () => {
763
+ const schema = z.object({
764
+ name: z.string(),
765
+ age: z.number(),
766
+ });
767
+
768
+ expect(z.toJSONSchema(schema)).toMatchInlineSnapshot(
769
+ `
770
+ {
771
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
772
+ "additionalProperties": false,
773
+ "properties": {
774
+ "age": {
775
+ "type": "number",
776
+ },
777
+ "name": {
778
+ "type": "string",
779
+ },
780
+ },
781
+ "required": [
782
+ "name",
783
+ "age",
784
+ ],
785
+ "type": "object",
786
+ }
787
+ `
788
+ );
789
+ });
790
+
791
+ test("additionalproperties in z.object", () => {
792
+ const a = z.object({
793
+ name: z.string(),
794
+ });
795
+ expect(z.toJSONSchema(a)).toMatchInlineSnapshot(`
796
+ {
797
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
798
+ "additionalProperties": false,
799
+ "properties": {
800
+ "name": {
801
+ "type": "string",
802
+ },
803
+ },
804
+ "required": [
805
+ "name",
806
+ ],
807
+ "type": "object",
808
+ }
809
+ `);
810
+ expect(z.toJSONSchema(a, { io: "input" })).toMatchInlineSnapshot(`
811
+ {
812
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
813
+ "properties": {
814
+ "name": {
815
+ "type": "string",
816
+ },
817
+ },
818
+ "required": [
819
+ "name",
820
+ ],
821
+ "type": "object",
822
+ }
823
+ `);
824
+ expect(
825
+ z.toJSONSchema(a, {
826
+ io: "input",
827
+ override(ctx) {
828
+ const def = ctx.zodSchema._zod.def;
829
+ if (def.type === "object" && !def.catchall) {
830
+ (ctx.jsonSchema as z.core.JSONSchema.ObjectSchema).additionalProperties = false;
831
+ }
832
+ },
833
+ })
834
+ ).toMatchInlineSnapshot(`
835
+ {
836
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
837
+ "additionalProperties": false,
838
+ "properties": {
839
+ "name": {
840
+ "type": "string",
841
+ },
842
+ },
843
+ "required": [
844
+ "name",
845
+ ],
846
+ "type": "object",
847
+ }
848
+ `);
849
+ });
850
+
851
+ test("catchall objects", () => {
852
+ const a = z.strictObject({
853
+ name: z.string(),
854
+ age: z.number(),
855
+ });
856
+
857
+ expect(z.toJSONSchema(a)).toMatchInlineSnapshot(`
858
+ {
859
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
860
+ "additionalProperties": false,
861
+ "properties": {
862
+ "age": {
863
+ "type": "number",
864
+ },
865
+ "name": {
866
+ "type": "string",
867
+ },
868
+ },
869
+ "required": [
870
+ "name",
871
+ "age",
872
+ ],
873
+ "type": "object",
874
+ }
875
+ `);
876
+
877
+ const b = z
878
+ .object({
879
+ name: z.string(),
880
+ })
881
+ .catchall(z.string());
882
+
883
+ expect(z.toJSONSchema(b)).toMatchInlineSnapshot(`
884
+ {
885
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
886
+ "additionalProperties": {
887
+ "type": "string",
888
+ },
889
+ "properties": {
890
+ "name": {
891
+ "type": "string",
892
+ },
893
+ },
894
+ "required": [
895
+ "name",
896
+ ],
897
+ "type": "object",
898
+ }
899
+ `);
900
+
901
+ const c = z.looseObject({
902
+ name: z.string(),
903
+ });
904
+
905
+ expect(z.toJSONSchema(c)).toMatchInlineSnapshot(`
906
+ {
907
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
908
+ "additionalProperties": {},
909
+ "properties": {
910
+ "name": {
911
+ "type": "string",
912
+ },
913
+ },
914
+ "required": [
915
+ "name",
916
+ ],
917
+ "type": "object",
918
+ }
919
+ `);
920
+ });
921
+
922
+ test("optional fields - object", () => {
923
+ const schema = z.object({
924
+ required: z.string(),
925
+ optional: z.string().optional(),
926
+ nonoptional: z.string().optional().nonoptional(),
927
+ });
928
+
929
+ const result = z.toJSONSchema(schema);
930
+
931
+ expect(result).toMatchInlineSnapshot(`
932
+ {
933
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
934
+ "additionalProperties": false,
935
+ "properties": {
936
+ "nonoptional": {
937
+ "type": "string",
938
+ },
939
+ "optional": {
940
+ "type": "string",
941
+ },
942
+ "required": {
943
+ "type": "string",
944
+ },
945
+ },
946
+ "required": [
947
+ "required",
948
+ "nonoptional",
949
+ ],
950
+ "type": "object",
951
+ }
952
+ `);
953
+ });
954
+
955
+ test("recursive object", () => {
956
+ interface Category {
957
+ name: string;
958
+ subcategories: Category[];
959
+ }
960
+
961
+ const categorySchema: z.ZodType<Category> = z.object({
962
+ name: z.string(),
963
+ subcategories: z.array(z.lazy(() => categorySchema)),
964
+ });
965
+
966
+ const result = z.toJSONSchema(categorySchema);
967
+ expect(result).toMatchInlineSnapshot(`
968
+ {
969
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
970
+ "additionalProperties": false,
971
+ "properties": {
972
+ "name": {
973
+ "type": "string",
974
+ },
975
+ "subcategories": {
976
+ "items": {
977
+ "$ref": "#",
978
+ },
979
+ "type": "array",
980
+ },
981
+ },
982
+ "required": [
983
+ "name",
984
+ "subcategories",
985
+ ],
986
+ "type": "object",
987
+ }
988
+ `);
989
+ });
990
+
991
+ test("simple interface", () => {
992
+ const userSchema = z.object({
993
+ name: z.string(),
994
+ age: z.number().optional(),
995
+ });
996
+
997
+ const result = z.toJSONSchema(userSchema);
998
+ expect(result).toMatchInlineSnapshot(`
999
+ {
1000
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1001
+ "additionalProperties": false,
1002
+ "properties": {
1003
+ "age": {
1004
+ "type": "number",
1005
+ },
1006
+ "name": {
1007
+ "type": "string",
1008
+ },
1009
+ },
1010
+ "required": [
1011
+ "name",
1012
+ ],
1013
+ "type": "object",
1014
+ }
1015
+ `);
1016
+ });
1017
+
1018
+ test("catchall interface", () => {
1019
+ const a = z.strictObject({
1020
+ name: z.string(),
1021
+ age: z.number(),
1022
+ });
1023
+
1024
+ expect(z.toJSONSchema(a)).toMatchInlineSnapshot(`
1025
+ {
1026
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1027
+ "additionalProperties": false,
1028
+ "properties": {
1029
+ "age": {
1030
+ "type": "number",
1031
+ },
1032
+ "name": {
1033
+ "type": "string",
1034
+ },
1035
+ },
1036
+ "required": [
1037
+ "name",
1038
+ "age",
1039
+ ],
1040
+ "type": "object",
1041
+ }
1042
+ `);
1043
+
1044
+ const b = z
1045
+ .object({
1046
+ name: z.string(),
1047
+ })
1048
+ .catchall(z.string());
1049
+
1050
+ expect(z.toJSONSchema(b)).toMatchInlineSnapshot(`
1051
+ {
1052
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1053
+ "additionalProperties": {
1054
+ "type": "string",
1055
+ },
1056
+ "properties": {
1057
+ "name": {
1058
+ "type": "string",
1059
+ },
1060
+ },
1061
+ "required": [
1062
+ "name",
1063
+ ],
1064
+ "type": "object",
1065
+ }
1066
+ `);
1067
+
1068
+ const c = z.looseObject({
1069
+ name: z.string(),
1070
+ });
1071
+
1072
+ expect(z.toJSONSchema(c)).toMatchInlineSnapshot(`
1073
+ {
1074
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1075
+ "additionalProperties": {},
1076
+ "properties": {
1077
+ "name": {
1078
+ "type": "string",
1079
+ },
1080
+ },
1081
+ "required": [
1082
+ "name",
1083
+ ],
1084
+ "type": "object",
1085
+ }
1086
+ `);
1087
+ });
1088
+
1089
+ test("recursive interface schemas", () => {
1090
+ const TreeNodeSchema = z.object({
1091
+ id: z.string(),
1092
+ get children() {
1093
+ return TreeNodeSchema;
1094
+ },
1095
+ });
1096
+
1097
+ const result = z.toJSONSchema(TreeNodeSchema);
1098
+
1099
+ // Should have definitions for recursive schema
1100
+ expect(JSON.stringify(result, null, 2)).toMatchInlineSnapshot(
1101
+ `
1102
+ "{
1103
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1104
+ "type": "object",
1105
+ "properties": {
1106
+ "id": {
1107
+ "type": "string"
1108
+ },
1109
+ "children": {
1110
+ "$ref": "#"
1111
+ }
1112
+ },
1113
+ "required": [
1114
+ "id",
1115
+ "children"
1116
+ ],
1117
+ "additionalProperties": false
1118
+ }"
1119
+ `
1120
+ );
1121
+ });
1122
+
1123
+ test("mutually recursive interface schemas", () => {
1124
+ const FolderSchema = z.object({
1125
+ name: z.string(),
1126
+ get files() {
1127
+ return z.array(FileSchema);
1128
+ },
1129
+ });
1130
+
1131
+ const FileSchema = z.object({
1132
+ name: z.string(),
1133
+ get parent() {
1134
+ return FolderSchema;
1135
+ },
1136
+ });
1137
+
1138
+ const result = z.toJSONSchema(FolderSchema);
1139
+
1140
+ // Should have definitions for both schemas
1141
+ expect(JSON.stringify(result, null, 2)).toMatchInlineSnapshot(
1142
+ `
1143
+ "{
1144
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1145
+ "type": "object",
1146
+ "properties": {
1147
+ "name": {
1148
+ "type": "string"
1149
+ },
1150
+ "files": {
1151
+ "type": "array",
1152
+ "items": {
1153
+ "type": "object",
1154
+ "properties": {
1155
+ "name": {
1156
+ "type": "string"
1157
+ },
1158
+ "parent": {
1159
+ "$ref": "#"
1160
+ }
1161
+ },
1162
+ "required": [
1163
+ "name",
1164
+ "parent"
1165
+ ],
1166
+ "additionalProperties": false
1167
+ }
1168
+ }
1169
+ },
1170
+ "required": [
1171
+ "name",
1172
+ "files"
1173
+ ],
1174
+ "additionalProperties": false
1175
+ }"
1176
+ `
1177
+ );
1178
+ });
1179
+ });
1180
+
1181
+ test("override", () => {
1182
+ const schema = z.z.toJSONSchema(z.string(), {
1183
+ override: (ctx) => {
1184
+ ctx.zodSchema;
1185
+ ctx.jsonSchema;
1186
+ ctx.jsonSchema.whatever = "sup";
1187
+ },
1188
+ });
1189
+ expect(schema).toMatchInlineSnapshot(`
1190
+ {
1191
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1192
+ "type": "string",
1193
+ "whatever": "sup",
1194
+ }
1195
+ `);
1196
+ });
1197
+
1198
+ test("override: do not run on references", () => {
1199
+ let overrideCount = 0;
1200
+ const schema = z
1201
+ .union([z.string().date(), z.string().datetime(), z.string().datetime({ local: true })])
1202
+ .meta({ a: true })
1203
+ .transform((str) => new Date(str))
1204
+ .meta({ b: true })
1205
+ .pipe(z.date())
1206
+ .meta({ c: true })
1207
+ .brand("dateIn");
1208
+ z.z.toJSONSchema(schema, {
1209
+ unrepresentable: "any",
1210
+ io: "input",
1211
+ override(_) {
1212
+ overrideCount++;
1213
+ },
1214
+ });
1215
+
1216
+ expect(overrideCount).toBe(6);
1217
+ });
1218
+
1219
+ test("override with refs", () => {
1220
+ const a = z.string().optional();
1221
+ const result = z.z.toJSONSchema(a, {
1222
+ override(ctx) {
1223
+ if (ctx.zodSchema._zod.def.type === "string") {
1224
+ ctx.jsonSchema.type = "STRING" as "string";
1225
+ }
1226
+ },
1227
+ });
1228
+
1229
+ expect(result).toMatchInlineSnapshot(`
1230
+ {
1231
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1232
+ "type": "STRING",
1233
+ }
1234
+ `);
1235
+ });
1236
+
1237
+ test("override execution order", () => {
1238
+ const schema = z.union([z.string(), z.number()]);
1239
+ let unionSchema!: any;
1240
+ z.z.toJSONSchema(schema, {
1241
+ override(ctx) {
1242
+ if (ctx.zodSchema._zod.def.type === "union") {
1243
+ unionSchema = ctx.jsonSchema;
1244
+ }
1245
+ },
1246
+ });
1247
+
1248
+ expect(unionSchema).toMatchInlineSnapshot(`
1249
+ {
1250
+ "anyOf": [
1251
+ {
1252
+ "type": "string",
1253
+ },
1254
+ {
1255
+ "type": "number",
1256
+ },
1257
+ ],
1258
+ }
1259
+ `);
1260
+ });
1261
+
1262
+ test("override with path", () => {
1263
+ const userSchema = z.object({
1264
+ name: z.string(),
1265
+ age: z.number(),
1266
+ });
1267
+
1268
+ const capturedPaths: (string | number)[][] = [];
1269
+
1270
+ z.toJSONSchema(userSchema, {
1271
+ override(ctx) {
1272
+ capturedPaths.push(ctx.path);
1273
+ },
1274
+ });
1275
+
1276
+ expect(capturedPaths).toMatchInlineSnapshot(`
1277
+ [
1278
+ [
1279
+ "properties",
1280
+ "age",
1281
+ ],
1282
+ [
1283
+ "properties",
1284
+ "name",
1285
+ ],
1286
+ [],
1287
+ ]
1288
+ `);
1289
+ });
1290
+
1291
+ test("pipe", () => {
1292
+ const mySchema = z
1293
+ .string()
1294
+ .transform((val) => val.length)
1295
+ .pipe(z.number());
1296
+ // ZodPipe
1297
+
1298
+ const a = z.z.toJSONSchema(mySchema);
1299
+ expect(a).toMatchInlineSnapshot(`
1300
+ {
1301
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1302
+ "type": "number",
1303
+ }
1304
+ `);
1305
+ // => { type: "number" }
1306
+
1307
+ const b = z.z.toJSONSchema(mySchema, { io: "input" });
1308
+ expect(b).toMatchInlineSnapshot(`
1309
+ {
1310
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1311
+ "type": "string",
1312
+ }
1313
+ `);
1314
+ // => { type: "string" }
1315
+ });
1316
+
1317
+ test("passthrough schemas", () => {
1318
+ const Internal = z.object({
1319
+ num: z.number(),
1320
+ str: z.string(),
1321
+ });
1322
+ //.meta({ id: "Internal" });
1323
+
1324
+ const External = z.object({
1325
+ a: Internal,
1326
+ b: Internal.optional(),
1327
+ c: z.lazy(() => Internal),
1328
+ d: z.promise(Internal),
1329
+ e: z.pipe(Internal, Internal),
1330
+ });
1331
+
1332
+ const result = z.z.toJSONSchema(External, {
1333
+ reused: "ref",
1334
+ });
1335
+ expect(result).toMatchInlineSnapshot(`
1336
+ {
1337
+ "$defs": {
1338
+ "__schema0": {
1339
+ "additionalProperties": false,
1340
+ "properties": {
1341
+ "num": {
1342
+ "type": "number",
1343
+ },
1344
+ "str": {
1345
+ "type": "string",
1346
+ },
1347
+ },
1348
+ "required": [
1349
+ "num",
1350
+ "str",
1351
+ ],
1352
+ "type": "object",
1353
+ },
1354
+ },
1355
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1356
+ "additionalProperties": false,
1357
+ "properties": {
1358
+ "a": {
1359
+ "$ref": "#/$defs/__schema0",
1360
+ },
1361
+ "b": {
1362
+ "$ref": "#/$defs/__schema0",
1363
+ },
1364
+ "c": {
1365
+ "$ref": "#/$defs/__schema0",
1366
+ },
1367
+ "d": {
1368
+ "$ref": "#/$defs/__schema0",
1369
+ },
1370
+ "e": {
1371
+ "$ref": "#/$defs/__schema0",
1372
+ },
1373
+ },
1374
+ "required": [
1375
+ "a",
1376
+ "c",
1377
+ "d",
1378
+ "e",
1379
+ ],
1380
+ "type": "object",
1381
+ }
1382
+ `);
1383
+ });
1384
+
1385
+ test("extract schemas with id", () => {
1386
+ const name = z.string().meta({ id: "name" });
1387
+ const result = z.z.toJSONSchema(
1388
+ z.object({
1389
+ first_name: name,
1390
+ last_name: name.nullable(),
1391
+ middle_name: name.optional(),
1392
+ age: z.number().meta({ id: "age" }),
1393
+ })
1394
+ );
1395
+ expect(result).toMatchInlineSnapshot(`
1396
+ {
1397
+ "$defs": {
1398
+ "age": {
1399
+ "id": "age",
1400
+ "type": "number",
1401
+ },
1402
+ "name": {
1403
+ "id": "name",
1404
+ "type": "string",
1405
+ },
1406
+ },
1407
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1408
+ "additionalProperties": false,
1409
+ "properties": {
1410
+ "age": {
1411
+ "$ref": "#/$defs/age",
1412
+ },
1413
+ "first_name": {
1414
+ "$ref": "#/$defs/name",
1415
+ },
1416
+ "last_name": {
1417
+ "anyOf": [
1418
+ {
1419
+ "$ref": "#/$defs/name",
1420
+ },
1421
+ {
1422
+ "type": "null",
1423
+ },
1424
+ ],
1425
+ },
1426
+ "middle_name": {
1427
+ "$ref": "#/$defs/name",
1428
+ },
1429
+ },
1430
+ "required": [
1431
+ "first_name",
1432
+ "last_name",
1433
+ "age",
1434
+ ],
1435
+ "type": "object",
1436
+ }
1437
+ `);
1438
+ });
1439
+
1440
+ test("unrepresentable literal values are ignored", () => {
1441
+ const a = z.z.toJSONSchema(z.literal(["hello", null, 5, BigInt(1324), undefined]), { unrepresentable: "any" });
1442
+ expect(a).toMatchInlineSnapshot(`
1443
+ {
1444
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1445
+ "enum": [
1446
+ "hello",
1447
+ null,
1448
+ 5,
1449
+ 1324,
1450
+ ],
1451
+ }
1452
+ `);
1453
+
1454
+ const b = z.z.toJSONSchema(z.literal([undefined, null, 5, BigInt(1324)]), { unrepresentable: "any" });
1455
+ expect(b).toMatchInlineSnapshot(`
1456
+ {
1457
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1458
+ "enum": [
1459
+ null,
1460
+ 5,
1461
+ 1324,
1462
+ ],
1463
+ }
1464
+ `);
1465
+
1466
+ const c = z.z.toJSONSchema(z.literal([undefined]), { unrepresentable: "any" });
1467
+ expect(c).toMatchInlineSnapshot(`
1468
+ {
1469
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1470
+ }
1471
+ `);
1472
+ });
1473
+
1474
+ test("describe with id", () => {
1475
+ const jobId = z.string().meta({ id: "jobId" });
1476
+
1477
+ const a = z.z.toJSONSchema(
1478
+ z.object({
1479
+ current: jobId.describe("Current job"),
1480
+ previous: jobId.describe("Previous job"),
1481
+ })
1482
+ );
1483
+ expect(a).toMatchInlineSnapshot(`
1484
+ {
1485
+ "$defs": {
1486
+ "jobId": {
1487
+ "id": "jobId",
1488
+ "type": "string",
1489
+ },
1490
+ },
1491
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1492
+ "additionalProperties": false,
1493
+ "properties": {
1494
+ "current": {
1495
+ "$ref": "#/$defs/jobId",
1496
+ "description": "Current job",
1497
+ },
1498
+ "previous": {
1499
+ "$ref": "#/$defs/jobId",
1500
+ "description": "Previous job",
1501
+ },
1502
+ },
1503
+ "required": [
1504
+ "current",
1505
+ "previous",
1506
+ ],
1507
+ "type": "object",
1508
+ }
1509
+ `);
1510
+ });
1511
+
1512
+ test("overwrite id", () => {
1513
+ const jobId = z.string().meta({ id: "aaa" });
1514
+
1515
+ const a = z.z.toJSONSchema(
1516
+ z.object({
1517
+ current: jobId,
1518
+ previous: jobId.meta({ id: "bbb" }),
1519
+ })
1520
+ );
1521
+ expect(a).toMatchInlineSnapshot(`
1522
+ {
1523
+ "$defs": {
1524
+ "aaa": {
1525
+ "id": "aaa",
1526
+ "type": "string",
1527
+ },
1528
+ "bbb": {
1529
+ "$ref": "#/$defs/aaa",
1530
+ "id": "bbb",
1531
+ },
1532
+ },
1533
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1534
+ "additionalProperties": false,
1535
+ "properties": {
1536
+ "current": {
1537
+ "$ref": "#/$defs/aaa",
1538
+ },
1539
+ "previous": {
1540
+ "$ref": "#/$defs/bbb",
1541
+ },
1542
+ },
1543
+ "required": [
1544
+ "current",
1545
+ "previous",
1546
+ ],
1547
+ "type": "object",
1548
+ }
1549
+ `);
1550
+
1551
+ const b = z.z.toJSONSchema(
1552
+ z.object({
1553
+ current: jobId,
1554
+ previous: jobId.meta({ id: "ccc" }),
1555
+ }),
1556
+ {
1557
+ reused: "ref",
1558
+ }
1559
+ );
1560
+ expect(b).toMatchInlineSnapshot(`
1561
+ {
1562
+ "$defs": {
1563
+ "aaa": {
1564
+ "id": "aaa",
1565
+ "type": "string",
1566
+ },
1567
+ "ccc": {
1568
+ "$ref": "#/$defs/aaa",
1569
+ "id": "ccc",
1570
+ },
1571
+ },
1572
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1573
+ "additionalProperties": false,
1574
+ "properties": {
1575
+ "current": {
1576
+ "$ref": "#/$defs/aaa",
1577
+ },
1578
+ "previous": {
1579
+ "$ref": "#/$defs/ccc",
1580
+ },
1581
+ },
1582
+ "required": [
1583
+ "current",
1584
+ "previous",
1585
+ ],
1586
+ "type": "object",
1587
+ }
1588
+ `);
1589
+ });
1590
+
1591
+ test("overwrite descriptions", () => {
1592
+ const field = z.string().describe("a").describe("b").describe("c");
1593
+
1594
+ const a = z.z.toJSONSchema(
1595
+ z.object({
1596
+ d: field.describe("d"),
1597
+ e: field.describe("e"),
1598
+ })
1599
+ );
1600
+ expect(a).toMatchInlineSnapshot(`
1601
+ {
1602
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1603
+ "additionalProperties": false,
1604
+ "properties": {
1605
+ "d": {
1606
+ "description": "d",
1607
+ "type": "string",
1608
+ },
1609
+ "e": {
1610
+ "description": "e",
1611
+ "type": "string",
1612
+ },
1613
+ },
1614
+ "required": [
1615
+ "d",
1616
+ "e",
1617
+ ],
1618
+ "type": "object",
1619
+ }
1620
+ `);
1621
+
1622
+ const b = z.z.toJSONSchema(
1623
+ z.object({
1624
+ d: field.describe("d"),
1625
+ e: field.describe("e"),
1626
+ }),
1627
+ {
1628
+ reused: "ref",
1629
+ }
1630
+ );
1631
+ expect(b).toMatchInlineSnapshot(`
1632
+ {
1633
+ "$defs": {
1634
+ "__schema0": {
1635
+ "description": "c",
1636
+ "type": "string",
1637
+ },
1638
+ },
1639
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1640
+ "additionalProperties": false,
1641
+ "properties": {
1642
+ "d": {
1643
+ "$ref": "#/$defs/__schema0",
1644
+ "description": "d",
1645
+ },
1646
+ "e": {
1647
+ "$ref": "#/$defs/__schema0",
1648
+ "description": "e",
1649
+ },
1650
+ },
1651
+ "required": [
1652
+ "d",
1653
+ "e",
1654
+ ],
1655
+ "type": "object",
1656
+ }
1657
+ `);
1658
+ });
1659
+
1660
+ test("top-level readonly", () => {
1661
+ const A = z
1662
+ .object({
1663
+ name: z.string(),
1664
+ get b() {
1665
+ return B;
1666
+ },
1667
+ })
1668
+ .readonly()
1669
+ .meta({ id: "A" });
1670
+ // z.globalRegistry.add(A, { id: "A" });
1671
+ // .meta({ id: "A" });
1672
+
1673
+ const B = z
1674
+ .object({
1675
+ name: z.string(),
1676
+ get a() {
1677
+ return A;
1678
+ },
1679
+ })
1680
+ .readonly()
1681
+ .meta({ id: "B" });
1682
+ // z.globalRegistry.add(B, { id: "B" });
1683
+ // .meta({ id: "B" });
1684
+
1685
+ const result = z.z.toJSONSchema(A);
1686
+ expect(result).toMatchInlineSnapshot(`
1687
+ {
1688
+ "$defs": {
1689
+ "B": {
1690
+ "additionalProperties": false,
1691
+ "id": "B",
1692
+ "properties": {
1693
+ "a": {
1694
+ "$ref": "#",
1695
+ },
1696
+ "name": {
1697
+ "type": "string",
1698
+ },
1699
+ },
1700
+ "readOnly": true,
1701
+ "required": [
1702
+ "name",
1703
+ "a",
1704
+ ],
1705
+ "type": "object",
1706
+ },
1707
+ },
1708
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1709
+ "additionalProperties": false,
1710
+ "id": "A",
1711
+ "properties": {
1712
+ "b": {
1713
+ "$ref": "#/$defs/B",
1714
+ },
1715
+ "name": {
1716
+ "type": "string",
1717
+ },
1718
+ },
1719
+ "readOnly": true,
1720
+ "required": [
1721
+ "name",
1722
+ "b",
1723
+ ],
1724
+ "type": "object",
1725
+ }
1726
+ `);
1727
+ });
1728
+
1729
+ test("basic registry", () => {
1730
+ const myRegistry = z.registry<{ id: string }>();
1731
+ const User = z.object({
1732
+ name: z.string(),
1733
+ get posts() {
1734
+ return z.array(Post);
1735
+ },
1736
+ });
1737
+
1738
+ const Post = z.object({
1739
+ title: z.string(),
1740
+ content: z.string(),
1741
+ get author() {
1742
+ return User;
1743
+ },
1744
+ });
1745
+
1746
+ myRegistry.add(User, { id: "User" });
1747
+ myRegistry.add(Post, { id: "Post" });
1748
+
1749
+ const result = z.z.toJSONSchema(myRegistry, { uri: (id) => `https://example.com/${id}.json` });
1750
+ expect(result).toMatchInlineSnapshot(`
1751
+ {
1752
+ "schemas": {
1753
+ "Post": {
1754
+ "$id": "https://example.com/Post.json",
1755
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1756
+ "additionalProperties": false,
1757
+ "properties": {
1758
+ "author": {
1759
+ "$ref": "https://example.com/User.json",
1760
+ },
1761
+ "content": {
1762
+ "type": "string",
1763
+ },
1764
+ "title": {
1765
+ "type": "string",
1766
+ },
1767
+ },
1768
+ "required": [
1769
+ "title",
1770
+ "content",
1771
+ "author",
1772
+ ],
1773
+ "type": "object",
1774
+ },
1775
+ "User": {
1776
+ "$id": "https://example.com/User.json",
1777
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1778
+ "additionalProperties": false,
1779
+ "properties": {
1780
+ "name": {
1781
+ "type": "string",
1782
+ },
1783
+ "posts": {
1784
+ "items": {
1785
+ "$ref": "https://example.com/Post.json",
1786
+ },
1787
+ "type": "array",
1788
+ },
1789
+ },
1790
+ "required": [
1791
+ "name",
1792
+ "posts",
1793
+ ],
1794
+ "type": "object",
1795
+ },
1796
+ },
1797
+ }
1798
+ `);
1799
+ });
1800
+
1801
+ test("_ref", () => {
1802
+ // const a = z.promise(z.string().describe("a"));
1803
+ const a = z.z.toJSONSchema(z.promise(z.string().describe("a")));
1804
+ expect(a).toMatchInlineSnapshot(`
1805
+ {
1806
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1807
+ "description": "a",
1808
+ "type": "string",
1809
+ }
1810
+ `);
1811
+
1812
+ const b = z.z.toJSONSchema(z.lazy(() => z.string().describe("a")));
1813
+ expect(b).toMatchInlineSnapshot(`
1814
+ {
1815
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1816
+ "description": "a",
1817
+ "type": "string",
1818
+ }
1819
+ `);
1820
+
1821
+ const c = z.z.toJSONSchema(z.optional(z.string().describe("a")));
1822
+ expect(c).toMatchInlineSnapshot(`
1823
+ {
1824
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1825
+ "description": "a",
1826
+ "type": "string",
1827
+ }
1828
+ `);
1829
+ });
1830
+
1831
+ test("defaults/prefaults", () => {
1832
+ const a = z
1833
+ .string()
1834
+ .transform((val) => val.length)
1835
+ .pipe(z.number());
1836
+ const b = a.prefault("hello");
1837
+ const c = a.default(1234);
1838
+
1839
+ // a
1840
+ expect(z.toJSONSchema(a)).toMatchInlineSnapshot(`
1841
+ {
1842
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1843
+ "type": "number",
1844
+ }
1845
+ `);
1846
+ expect(z.toJSONSchema(a, { io: "input" })).toMatchInlineSnapshot(`
1847
+ {
1848
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1849
+ "type": "string",
1850
+ }
1851
+ `);
1852
+
1853
+ // b
1854
+ expect(z.toJSONSchema(b)).toMatchInlineSnapshot(`
1855
+ {
1856
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1857
+ "type": "number",
1858
+ }
1859
+ `);
1860
+ expect(z.toJSONSchema(b, { io: "input" })).toMatchInlineSnapshot(`
1861
+ {
1862
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1863
+ "default": "hello",
1864
+ "type": "string",
1865
+ }
1866
+ `);
1867
+ // c
1868
+ expect(z.toJSONSchema(c)).toMatchInlineSnapshot(`
1869
+ {
1870
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1871
+ "default": 1234,
1872
+ "type": "number",
1873
+ }
1874
+ `);
1875
+ expect(z.toJSONSchema(c, { io: "input" })).toMatchInlineSnapshot(`
1876
+ {
1877
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1878
+ "type": "string",
1879
+ }
1880
+ `);
1881
+ });
1882
+
1883
+ test("input type", () => {
1884
+ const schema = z.object({
1885
+ a: z.string(),
1886
+ b: z.string().optional(),
1887
+ c: z.string().default("hello"),
1888
+ d: z.string().nullable(),
1889
+ e: z.string().prefault("hello"),
1890
+ f: z.string().catch("hello"),
1891
+ g: z.never(),
1892
+ h: z.union([z.string(), z.number().default(2)]),
1893
+ i: z.union([z.string(), z.string().optional()]),
1894
+ });
1895
+ expect(z.toJSONSchema(schema, { io: "input" })).toMatchInlineSnapshot(`
1896
+ {
1897
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1898
+ "properties": {
1899
+ "a": {
1900
+ "type": "string",
1901
+ },
1902
+ "b": {
1903
+ "type": "string",
1904
+ },
1905
+ "c": {
1906
+ "default": "hello",
1907
+ "type": "string",
1908
+ },
1909
+ "d": {
1910
+ "anyOf": [
1911
+ {
1912
+ "type": "string",
1913
+ },
1914
+ {
1915
+ "type": "null",
1916
+ },
1917
+ ],
1918
+ },
1919
+ "e": {
1920
+ "default": "hello",
1921
+ "type": "string",
1922
+ },
1923
+ "f": {
1924
+ "default": "hello",
1925
+ "type": "string",
1926
+ },
1927
+ "g": {
1928
+ "not": {},
1929
+ },
1930
+ "h": {
1931
+ "anyOf": [
1932
+ {
1933
+ "type": "string",
1934
+ },
1935
+ {
1936
+ "default": 2,
1937
+ "type": "number",
1938
+ },
1939
+ ],
1940
+ },
1941
+ "i": {
1942
+ "anyOf": [
1943
+ {
1944
+ "type": "string",
1945
+ },
1946
+ {
1947
+ "type": "string",
1948
+ },
1949
+ ],
1950
+ },
1951
+ },
1952
+ "required": [
1953
+ "a",
1954
+ "d",
1955
+ "g",
1956
+ ],
1957
+ "type": "object",
1958
+ }
1959
+ `);
1960
+ expect(z.toJSONSchema(schema, { io: "output" })).toMatchInlineSnapshot(`
1961
+ {
1962
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1963
+ "additionalProperties": false,
1964
+ "properties": {
1965
+ "a": {
1966
+ "type": "string",
1967
+ },
1968
+ "b": {
1969
+ "type": "string",
1970
+ },
1971
+ "c": {
1972
+ "default": "hello",
1973
+ "type": "string",
1974
+ },
1975
+ "d": {
1976
+ "anyOf": [
1977
+ {
1978
+ "type": "string",
1979
+ },
1980
+ {
1981
+ "type": "null",
1982
+ },
1983
+ ],
1984
+ },
1985
+ "e": {
1986
+ "type": "string",
1987
+ },
1988
+ "f": {
1989
+ "default": "hello",
1990
+ "type": "string",
1991
+ },
1992
+ "g": {
1993
+ "not": {},
1994
+ },
1995
+ "h": {
1996
+ "anyOf": [
1997
+ {
1998
+ "type": "string",
1999
+ },
2000
+ {
2001
+ "default": 2,
2002
+ "type": "number",
2003
+ },
2004
+ ],
2005
+ },
2006
+ "i": {
2007
+ "anyOf": [
2008
+ {
2009
+ "type": "string",
2010
+ },
2011
+ {
2012
+ "type": "string",
2013
+ },
2014
+ ],
2015
+ },
2016
+ },
2017
+ "required": [
2018
+ "a",
2019
+ "c",
2020
+ "d",
2021
+ "e",
2022
+ "f",
2023
+ "g",
2024
+ "h",
2025
+ ],
2026
+ "type": "object",
2027
+ }
2028
+ `);
2029
+ });
2030
+
2031
+ test("examples on pipe", () => {
2032
+ const schema = z
2033
+ .string()
2034
+ .meta({ examples: ["test"] })
2035
+ .transform(Number)
2036
+ // .pipe(z.transform(Number).meta({ examples: [4] }))
2037
+ .meta({ examples: [4] });
2038
+
2039
+ const i = z.z.toJSONSchema(schema, { io: "input", unrepresentable: "any" });
2040
+ expect(i).toMatchInlineSnapshot(`
2041
+ {
2042
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2043
+ "examples": [
2044
+ "test",
2045
+ ],
2046
+ "type": "string",
2047
+ }
2048
+ `);
2049
+ const o = z.z.toJSONSchema(schema, { io: "output", unrepresentable: "any" });
2050
+ expect(o).toMatchInlineSnapshot(`
2051
+ {
2052
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2053
+ "examples": [
2054
+ 4,
2055
+ ],
2056
+ }
2057
+ `);
2058
+ });
2059
+
2060
+ // test("number checks", () => {
2061
+ // expect(z.z.toJSONSchema(z.number().int())).toMatchInlineSnapshot(`
2062
+ // {
2063
+ // "maximum": 9007199254740991,
2064
+ // "minimum": -9007199254740991,
2065
+ // "type": "integer",
2066
+ // }
2067
+ // `);
2068
+ // expect(z.z.toJSONSchema(z.int())).toMatchInlineSnapshot(`
2069
+ // {
2070
+ // "maximum": 9007199254740991,
2071
+ // "minimum": -9007199254740991,
2072
+ // "type": "integer",
2073
+ // }
2074
+ // `);
2075
+ // expect(z.z.toJSONSchema(z.int().positive())).toMatchInlineSnapshot(`
2076
+ // {
2077
+ // "exclusiveMinimum": 0,
2078
+ // "maximum": 9007199254740991,
2079
+ // "minimum": -9007199254740991,
2080
+ // "type": "integer",
2081
+ // }
2082
+ // `);
2083
+ // expect(z.z.toJSONSchema(z.int().nonnegative())).toMatchInlineSnapshot(`
2084
+ // {
2085
+ // "maximum": 9007199254740991,
2086
+ // "minimum": 0,
2087
+ // "type": "integer",
2088
+ // }
2089
+ // `);
2090
+ // expect(z.z.toJSONSchema(z.int().gt(0))).toMatchInlineSnapshot(`
2091
+ // {
2092
+ // "exclusiveMinimum": 0,
2093
+ // "maximum": 9007199254740991,
2094
+ // "minimum": -9007199254740991,
2095
+ // "type": "integer",
2096
+ // }
2097
+ // `);
2098
+ // expect(z.z.toJSONSchema(z.int().gte(0))).toMatchInlineSnapshot(`
2099
+ // {
2100
+ // "maximum": 9007199254740991,
2101
+ // "minimum": 0,
2102
+ // "type": "integer",
2103
+ // }
2104
+ // `);
2105
+
2106
+ // });
2107
+
2108
+ test("use output type for preprocess", () => {
2109
+ const a = z.preprocess((val) => String(val), z.string());
2110
+
2111
+ expect(z.toJSONSchema(a, { io: "input" })).toMatchInlineSnapshot(`
2112
+ {
2113
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2114
+ "type": "string",
2115
+ }
2116
+ `);
2117
+ });
2118
+
2119
+ // test("isTransforming", () => {
2120
+ // const tx = z.core.isTransforming;
2121
+ // expect(tx(z.string())).toEqual(false);
2122
+ // expect(tx(z.string().transform((val) => val))).toEqual(true);
2123
+ // expect(tx(z.string().pipe(z.string()))).toEqual(false);
2124
+ // expect(
2125
+ // tx(
2126
+ // z
2127
+ // .string()
2128
+ // .transform((val) => val)
2129
+ // .pipe(z.string())
2130
+ // )
2131
+ // ).toEqual(true);
2132
+
2133
+ // const a = z.transform((val) => val);
2134
+ // expect(tx(z.transform((val) => val))).toEqual(true);
2135
+ // expect(tx(a.optional())).toEqual(true);
2136
+
2137
+ // const b = z.string().optional();
2138
+ // expect(tx(b)).toEqual(false);
2139
+
2140
+ // const c = z.string().prefault("hello");
2141
+ // expect(tx(c)).toEqual(false);
2142
+
2143
+ // const d = z.string().default("hello");
2144
+ // expect(tx(d)).toEqual(false);
2145
+ // });
2146
+
2147
+ test("flatten simple intersections", () => {
2148
+ const FirstSchema = z.object({
2149
+ testNum: z.number(),
2150
+ });
2151
+
2152
+ const SecondSchema = z.object({
2153
+ testStr: z.string(),
2154
+ });
2155
+
2156
+ const ThirdSchema = z.object({
2157
+ testBool: z.boolean(),
2158
+ });
2159
+
2160
+ const HelloSchema = FirstSchema.and(SecondSchema).and(ThirdSchema).describe("123");
2161
+
2162
+ // Zod 3
2163
+ // console.log(JSON.stringify(zodToJsonSchema(HelloSchema), null, 2));
2164
+
2165
+ // Zod 4
2166
+ const result = z.toJSONSchema(HelloSchema, { target: "draft-7" });
2167
+ expect(result).toMatchInlineSnapshot(`
2168
+ {
2169
+ "$schema": "http://json-schema.org/draft-07/schema#",
2170
+ "allOf": [
2171
+ {
2172
+ "additionalProperties": false,
2173
+ "properties": {
2174
+ "testNum": {
2175
+ "type": "number",
2176
+ },
2177
+ },
2178
+ "required": [
2179
+ "testNum",
2180
+ ],
2181
+ "type": "object",
2182
+ },
2183
+ {
2184
+ "additionalProperties": false,
2185
+ "properties": {
2186
+ "testStr": {
2187
+ "type": "string",
2188
+ },
2189
+ },
2190
+ "required": [
2191
+ "testStr",
2192
+ ],
2193
+ "type": "object",
2194
+ },
2195
+ {
2196
+ "additionalProperties": false,
2197
+ "properties": {
2198
+ "testBool": {
2199
+ "type": "boolean",
2200
+ },
2201
+ },
2202
+ "required": [
2203
+ "testBool",
2204
+ ],
2205
+ "type": "object",
2206
+ },
2207
+ ],
2208
+ "description": "123",
2209
+ }
2210
+ `);
2211
+ });
2212
+
2213
+ test("z.file()", () => {
2214
+ const a = z.file();
2215
+ expect(z.toJSONSchema(a)).toMatchInlineSnapshot(`
2216
+ {
2217
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2218
+ "contentEncoding": "binary",
2219
+ "format": "binary",
2220
+ "type": "string",
2221
+ }
2222
+ `);
2223
+
2224
+ const b = z.file().mime("image/png").min(1000).max(10000);
2225
+ expect(z.toJSONSchema(b)).toMatchInlineSnapshot(`
2226
+ {
2227
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2228
+ "contentEncoding": "binary",
2229
+ "contentMediaType": "image/png",
2230
+ "format": "binary",
2231
+ "maxLength": 10000,
2232
+ "minLength": 1000,
2233
+ "type": "string",
2234
+ }
2235
+ `);
2236
+
2237
+ const c = z.file().mime(["image/png", "image/jpg"]).min(1000).max(10000);
2238
+ expect(z.toJSONSchema(c)).toMatchInlineSnapshot(`
2239
+ {
2240
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2241
+ "anyOf": [
2242
+ {
2243
+ "contentEncoding": "binary",
2244
+ "contentMediaType": "image/png",
2245
+ "format": "binary",
2246
+ "maxLength": 10000,
2247
+ "minLength": 1000,
2248
+ "type": "string",
2249
+ },
2250
+ {
2251
+ "contentEncoding": "binary",
2252
+ "contentMediaType": "image/jpg",
2253
+ "format": "binary",
2254
+ "maxLength": 10000,
2255
+ "minLength": 1000,
2256
+ "type": "string",
2257
+ },
2258
+ ],
2259
+ }
2260
+ `);
2261
+ });
2262
+
2263
+ test("custom toJSONSchema", () => {
2264
+ const schema = z.instanceof(Date);
2265
+ schema._zod.toJSONSchema = () => ({
2266
+ type: "string",
2267
+ format: "date-time",
2268
+ });
2269
+
2270
+ expect(z.toJSONSchema(schema)).toMatchInlineSnapshot(`
2271
+ {
2272
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2273
+ "format": "date-time",
2274
+ "type": "string",
2275
+ }
2276
+ `);
2277
+ });
2278
+
2279
+ test("cycle detection - root", () => {
2280
+ const schema = z.object({
2281
+ name: z.string(),
2282
+ get subcategories() {
2283
+ return z.array(schema);
2284
+ },
2285
+ });
2286
+
2287
+ expect(() => z.toJSONSchema(schema, { cycles: "throw" })).toThrowErrorMatchingInlineSnapshot(`
2288
+ [Error: Cycle detected: #/properties/subcategories/items/<root>
2289
+
2290
+ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.]
2291
+ `);
2292
+ });
2293
+
2294
+ test("cycle detection - mutual recursion", () => {
2295
+ const A = z.object({
2296
+ name: z.string(),
2297
+ get subcategories() {
2298
+ return z.array(B);
2299
+ },
2300
+ });
2301
+
2302
+ const B = z.object({
2303
+ name: z.string(),
2304
+ get subcategories() {
2305
+ return z.array(A);
2306
+ },
2307
+ });
2308
+
2309
+ expect(() => z.toJSONSchema(A, { cycles: "throw" })).toThrowErrorMatchingInlineSnapshot(`
2310
+ [Error: Cycle detected: #/properties/subcategories/items/properties/subcategories/items/<root>
2311
+
2312
+ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.]
2313
+ `);
2314
+ });