zod 3.25.21 → 3.25.22

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 (506) hide show
  1. package/package.json +2 -2
  2. package/dist/cjs/v3/tests/all-errors.test.js +0 -147
  3. package/dist/cjs/v3/tests/anyunknown.test.js +0 -47
  4. package/dist/cjs/v3/tests/array.test.js +0 -80
  5. package/dist/cjs/v3/tests/async-parsing.test.js +0 -381
  6. package/dist/cjs/v3/tests/async-refinements.test.js +0 -60
  7. package/dist/cjs/v3/tests/base.test.js +0 -47
  8. package/dist/cjs/v3/tests/bigint.test.js +0 -74
  9. package/dist/cjs/v3/tests/branded.test.js +0 -58
  10. package/dist/cjs/v3/tests/catch.test.js +0 -181
  11. package/dist/cjs/v3/tests/coerce.test.js +0 -152
  12. package/dist/cjs/v3/tests/complex.test.js +0 -78
  13. package/dist/cjs/v3/tests/custom.test.js +0 -51
  14. package/dist/cjs/v3/tests/date.test.js +0 -49
  15. package/dist/cjs/v3/tests/deepmasking.test.js +0 -187
  16. package/dist/cjs/v3/tests/default.test.js +0 -86
  17. package/dist/cjs/v3/tests/description.test.js +0 -51
  18. package/dist/cjs/v3/tests/discriminated-unions.test.js +0 -321
  19. package/dist/cjs/v3/tests/enum.test.js +0 -91
  20. package/dist/cjs/v3/tests/error.test.js +0 -526
  21. package/dist/cjs/v3/tests/firstparty.test.js +0 -109
  22. package/dist/cjs/v3/tests/firstpartyschematypes.test.js +0 -8
  23. package/dist/cjs/v3/tests/function.test.js +0 -236
  24. package/dist/cjs/v3/tests/generics.test.js +0 -67
  25. package/dist/cjs/v3/tests/instanceof.test.js +0 -60
  26. package/dist/cjs/v3/tests/intersection.test.js +0 -111
  27. package/dist/cjs/v3/tests/language-server.source.js +0 -71
  28. package/dist/cjs/v3/tests/language-server.test.js +0 -177
  29. package/dist/cjs/v3/tests/literal.test.js +0 -55
  30. package/dist/cjs/v3/tests/map.test.js +0 -112
  31. package/dist/cjs/v3/tests/masking.test.js +0 -5
  32. package/dist/cjs/v3/tests/mocker.test.js +0 -19
  33. package/dist/cjs/v3/tests/nan.test.js +0 -42
  34. package/dist/cjs/v3/tests/nativeEnum.test.js +0 -100
  35. package/dist/cjs/v3/tests/nullable.test.js +0 -65
  36. package/dist/cjs/v3/tests/number.test.js +0 -189
  37. package/dist/cjs/v3/tests/object-augmentation.test.js +0 -50
  38. package/dist/cjs/v3/tests/object-in-es5-env.test.js +0 -49
  39. package/dist/cjs/v3/tests/object.test.js +0 -352
  40. package/dist/cjs/v3/tests/optional.test.js +0 -65
  41. package/dist/cjs/v3/tests/parseUtil.test.js +0 -20
  42. package/dist/cjs/v3/tests/parser.test.js +0 -55
  43. package/dist/cjs/v3/tests/partials.test.js +0 -201
  44. package/dist/cjs/v3/tests/pickomit.test.js +0 -113
  45. package/dist/cjs/v3/tests/pipeline.test.js +0 -50
  46. package/dist/cjs/v3/tests/preprocess.test.js +0 -181
  47. package/dist/cjs/v3/tests/primitive.test.js +0 -385
  48. package/dist/cjs/v3/tests/promise.test.js +0 -98
  49. package/dist/cjs/v3/tests/readonly.test.js +0 -190
  50. package/dist/cjs/v3/tests/record.test.js +0 -153
  51. package/dist/cjs/v3/tests/recursive.test.js +0 -161
  52. package/dist/cjs/v3/tests/refine.test.js +0 -279
  53. package/dist/cjs/v3/tests/safeparse.test.js +0 -46
  54. package/dist/cjs/v3/tests/set.test.js +0 -144
  55. package/dist/cjs/v3/tests/standard-schema.test.js +0 -102
  56. package/dist/cjs/v3/tests/string.test.js +0 -842
  57. package/dist/cjs/v3/tests/transformer.test.js +0 -218
  58. package/dist/cjs/v3/tests/tuple.test.js +0 -97
  59. package/dist/cjs/v3/tests/unions.test.js +0 -75
  60. package/dist/cjs/v3/tests/validations.test.js +0 -155
  61. package/dist/cjs/v3/tests/void.test.js +0 -36
  62. package/dist/cjs/v4/classic/tests/anyunknown.test.js +0 -45
  63. package/dist/cjs/v4/classic/tests/array.test.js +0 -249
  64. package/dist/cjs/v4/classic/tests/assignability.test.js +0 -110
  65. package/dist/cjs/v4/classic/tests/async-parsing.test.js +0 -364
  66. package/dist/cjs/v4/classic/tests/async-refinements.test.js +0 -82
  67. package/dist/cjs/v4/classic/tests/base.test.js +0 -31
  68. package/dist/cjs/v4/classic/tests/bigint.test.js +0 -73
  69. package/dist/cjs/v4/classic/tests/brand.test.js +0 -60
  70. package/dist/cjs/v4/classic/tests/catch.test.js +0 -214
  71. package/dist/cjs/v4/classic/tests/coalesce.test.js +0 -18
  72. package/dist/cjs/v4/classic/tests/coerce.test.js +0 -175
  73. package/dist/cjs/v4/classic/tests/custom.test.js +0 -38
  74. package/dist/cjs/v4/classic/tests/date.test.js +0 -48
  75. package/dist/cjs/v4/classic/tests/default.test.js +0 -88
  76. package/dist/cjs/v4/classic/tests/description.test.js +0 -51
  77. package/dist/cjs/v4/classic/tests/discriminated-unions.test.js +0 -540
  78. package/dist/cjs/v4/classic/tests/enum.test.js +0 -260
  79. package/dist/cjs/v4/classic/tests/error-utils.test.js +0 -411
  80. package/dist/cjs/v4/classic/tests/error.test.js +0 -651
  81. package/dist/cjs/v4/classic/tests/file.test.js +0 -68
  82. package/dist/cjs/v4/classic/tests/firstparty.test.js +0 -198
  83. package/dist/cjs/v4/classic/tests/function.test.js +0 -219
  84. package/dist/cjs/v4/classic/tests/generics.test.js +0 -72
  85. package/dist/cjs/v4/classic/tests/index.test.js +0 -765
  86. package/dist/cjs/v4/classic/tests/instanceof.test.js +0 -58
  87. package/dist/cjs/v4/classic/tests/intersection.test.js +0 -134
  88. package/dist/cjs/v4/classic/tests/json-schema.test.js +0 -1707
  89. package/dist/cjs/v4/classic/tests/json.test.js +0 -105
  90. package/dist/cjs/v4/classic/tests/lazy.test.js +0 -185
  91. package/dist/cjs/v4/classic/tests/literal.test.js +0 -94
  92. package/dist/cjs/v4/classic/tests/map.test.js +0 -193
  93. package/dist/cjs/v4/classic/tests/nan.test.js +0 -42
  94. package/dist/cjs/v4/classic/tests/nested-refine.test.js +0 -180
  95. package/dist/cjs/v4/classic/tests/nonoptional.test.js +0 -80
  96. package/dist/cjs/v4/classic/tests/nullable.test.js +0 -43
  97. package/dist/cjs/v4/classic/tests/number.test.js +0 -241
  98. package/dist/cjs/v4/classic/tests/object.test.js +0 -405
  99. package/dist/cjs/v4/classic/tests/optional.test.js +0 -98
  100. package/dist/cjs/v4/classic/tests/partial.test.js +0 -137
  101. package/dist/cjs/v4/classic/tests/pickomit.test.js +0 -125
  102. package/dist/cjs/v4/classic/tests/pipe.test.js +0 -92
  103. package/dist/cjs/v4/classic/tests/prefault.test.js +0 -22
  104. package/dist/cjs/v4/classic/tests/preprocess.test.js +0 -273
  105. package/dist/cjs/v4/classic/tests/primitive.test.js +0 -184
  106. package/dist/cjs/v4/classic/tests/promise.test.js +0 -91
  107. package/dist/cjs/v4/classic/tests/readonly.test.js +0 -241
  108. package/dist/cjs/v4/classic/tests/record.test.js +0 -307
  109. package/dist/cjs/v4/classic/tests/recursive-types.test.js +0 -108
  110. package/dist/cjs/v4/classic/tests/refine.test.js +0 -402
  111. package/dist/cjs/v4/classic/tests/registries.test.js +0 -155
  112. package/dist/cjs/v4/classic/tests/set.test.js +0 -182
  113. package/dist/cjs/v4/classic/tests/standard-schema.test.js +0 -77
  114. package/dist/cjs/v4/classic/tests/string-formats.test.js +0 -49
  115. package/dist/cjs/v4/classic/tests/string.test.js +0 -980
  116. package/dist/cjs/v4/classic/tests/template-literal.test.js +0 -705
  117. package/dist/cjs/v4/classic/tests/transform.test.js +0 -239
  118. package/dist/cjs/v4/classic/tests/tuple.test.js +0 -166
  119. package/dist/cjs/v4/classic/tests/union.test.js +0 -107
  120. package/dist/cjs/v4/classic/tests/validations.test.js +0 -301
  121. package/dist/cjs/v4/classic/tests/void.test.js +0 -34
  122. package/dist/cjs/v4/core/tests/index.test.js +0 -66
  123. package/dist/cjs/v4/core/tests/locales/be.test.js +0 -123
  124. package/dist/cjs/v4/core/tests/locales/en.test.js +0 -21
  125. package/dist/cjs/v4/core/tests/locales/ru.test.js +0 -123
  126. package/dist/cjs/v4/core/tests/locales/tr.test.js +0 -79
  127. package/dist/cjs/v4/mini/tests/assignability.test.js +0 -104
  128. package/dist/cjs/v4/mini/tests/brand.test.js +0 -58
  129. package/dist/cjs/v4/mini/tests/checks.test.js +0 -147
  130. package/dist/cjs/v4/mini/tests/computed.test.js +0 -55
  131. package/dist/cjs/v4/mini/tests/error.test.js +0 -45
  132. package/dist/cjs/v4/mini/tests/functions.test.js +0 -37
  133. package/dist/cjs/v4/mini/tests/index.test.js +0 -763
  134. package/dist/cjs/v4/mini/tests/number.test.js +0 -109
  135. package/dist/cjs/v4/mini/tests/object.test.js +0 -122
  136. package/dist/cjs/v4/mini/tests/prototypes.test.js +0 -44
  137. package/dist/cjs/v4/mini/tests/recursive-types.test.js +0 -106
  138. package/dist/cjs/v4/mini/tests/string.test.js +0 -265
  139. package/dist/types/v3/tests/all-errors.test.d.ts +0 -1
  140. package/dist/types/v3/tests/anyunknown.test.d.ts +0 -1
  141. package/dist/types/v3/tests/array.test.d.ts +0 -1
  142. package/dist/types/v3/tests/async-parsing.test.d.ts +0 -1
  143. package/dist/types/v3/tests/async-refinements.test.d.ts +0 -1
  144. package/dist/types/v3/tests/base.test.d.ts +0 -1
  145. package/dist/types/v3/tests/bigint.test.d.ts +0 -1
  146. package/dist/types/v3/tests/branded.test.d.ts +0 -1
  147. package/dist/types/v3/tests/catch.test.d.ts +0 -1
  148. package/dist/types/v3/tests/coerce.test.d.ts +0 -1
  149. package/dist/types/v3/tests/complex.test.d.ts +0 -1
  150. package/dist/types/v3/tests/custom.test.d.ts +0 -1
  151. package/dist/types/v3/tests/date.test.d.ts +0 -1
  152. package/dist/types/v3/tests/deepmasking.test.d.ts +0 -1
  153. package/dist/types/v3/tests/default.test.d.ts +0 -1
  154. package/dist/types/v3/tests/description.test.d.ts +0 -1
  155. package/dist/types/v3/tests/discriminated-unions.test.d.ts +0 -1
  156. package/dist/types/v3/tests/enum.test.d.ts +0 -1
  157. package/dist/types/v3/tests/error.test.d.ts +0 -1
  158. package/dist/types/v3/tests/firstparty.test.d.ts +0 -1
  159. package/dist/types/v3/tests/firstpartyschematypes.test.d.ts +0 -1
  160. package/dist/types/v3/tests/function.test.d.ts +0 -1
  161. package/dist/types/v3/tests/generics.test.d.ts +0 -1
  162. package/dist/types/v3/tests/instanceof.test.d.ts +0 -1
  163. package/dist/types/v3/tests/intersection.test.d.ts +0 -1
  164. package/dist/types/v3/tests/language-server.source.d.ts +0 -70
  165. package/dist/types/v3/tests/language-server.test.d.ts +0 -1
  166. package/dist/types/v3/tests/literal.test.d.ts +0 -1
  167. package/dist/types/v3/tests/map.test.d.ts +0 -1
  168. package/dist/types/v3/tests/masking.test.d.ts +0 -1
  169. package/dist/types/v3/tests/mocker.test.d.ts +0 -1
  170. package/dist/types/v3/tests/nan.test.d.ts +0 -1
  171. package/dist/types/v3/tests/nativeEnum.test.d.ts +0 -1
  172. package/dist/types/v3/tests/nullable.test.d.ts +0 -1
  173. package/dist/types/v3/tests/number.test.d.ts +0 -1
  174. package/dist/types/v3/tests/object-augmentation.test.d.ts +0 -1
  175. package/dist/types/v3/tests/object-in-es5-env.test.d.ts +0 -1
  176. package/dist/types/v3/tests/object.test.d.ts +0 -1
  177. package/dist/types/v3/tests/optional.test.d.ts +0 -1
  178. package/dist/types/v3/tests/parseUtil.test.d.ts +0 -1
  179. package/dist/types/v3/tests/parser.test.d.ts +0 -1
  180. package/dist/types/v3/tests/partials.test.d.ts +0 -1
  181. package/dist/types/v3/tests/pickomit.test.d.ts +0 -1
  182. package/dist/types/v3/tests/pipeline.test.d.ts +0 -1
  183. package/dist/types/v3/tests/preprocess.test.d.ts +0 -1
  184. package/dist/types/v3/tests/primitive.test.d.ts +0 -1
  185. package/dist/types/v3/tests/promise.test.d.ts +0 -1
  186. package/dist/types/v3/tests/readonly.test.d.ts +0 -1
  187. package/dist/types/v3/tests/record.test.d.ts +0 -1
  188. package/dist/types/v3/tests/recursive.test.d.ts +0 -1
  189. package/dist/types/v3/tests/refine.test.d.ts +0 -1
  190. package/dist/types/v3/tests/safeparse.test.d.ts +0 -1
  191. package/dist/types/v3/tests/set.test.d.ts +0 -1
  192. package/dist/types/v3/tests/standard-schema.test.d.ts +0 -1
  193. package/dist/types/v3/tests/string.test.d.ts +0 -1
  194. package/dist/types/v3/tests/transformer.test.d.ts +0 -1
  195. package/dist/types/v3/tests/tuple.test.d.ts +0 -1
  196. package/dist/types/v3/tests/unions.test.d.ts +0 -1
  197. package/dist/types/v3/tests/validations.test.d.ts +0 -1
  198. package/dist/types/v3/tests/void.test.d.ts +0 -1
  199. package/dist/types/v4/classic/tests/anyunknown.test.d.ts +0 -1
  200. package/dist/types/v4/classic/tests/array.test.d.ts +0 -1
  201. package/dist/types/v4/classic/tests/assignability.test.d.ts +0 -1
  202. package/dist/types/v4/classic/tests/async-parsing.test.d.ts +0 -1
  203. package/dist/types/v4/classic/tests/async-refinements.test.d.ts +0 -1
  204. package/dist/types/v4/classic/tests/base.test.d.ts +0 -1
  205. package/dist/types/v4/classic/tests/bigint.test.d.ts +0 -1
  206. package/dist/types/v4/classic/tests/brand.test.d.ts +0 -1
  207. package/dist/types/v4/classic/tests/catch.test.d.ts +0 -1
  208. package/dist/types/v4/classic/tests/coalesce.test.d.ts +0 -1
  209. package/dist/types/v4/classic/tests/coerce.test.d.ts +0 -1
  210. package/dist/types/v4/classic/tests/custom.test.d.ts +0 -1
  211. package/dist/types/v4/classic/tests/date.test.d.ts +0 -1
  212. package/dist/types/v4/classic/tests/default.test.d.ts +0 -1
  213. package/dist/types/v4/classic/tests/description.test.d.ts +0 -1
  214. package/dist/types/v4/classic/tests/discriminated-unions.test.d.ts +0 -1
  215. package/dist/types/v4/classic/tests/enum.test.d.ts +0 -1
  216. package/dist/types/v4/classic/tests/error-utils.test.d.ts +0 -1
  217. package/dist/types/v4/classic/tests/error.test.d.ts +0 -1
  218. package/dist/types/v4/classic/tests/file.test.d.ts +0 -1
  219. package/dist/types/v4/classic/tests/firstparty.test.d.ts +0 -1
  220. package/dist/types/v4/classic/tests/function.test.d.ts +0 -1
  221. package/dist/types/v4/classic/tests/generics.test.d.ts +0 -1
  222. package/dist/types/v4/classic/tests/index.test.d.ts +0 -1
  223. package/dist/types/v4/classic/tests/instanceof.test.d.ts +0 -1
  224. package/dist/types/v4/classic/tests/intersection.test.d.ts +0 -1
  225. package/dist/types/v4/classic/tests/json-schema.test.d.ts +0 -1
  226. package/dist/types/v4/classic/tests/json.test.d.ts +0 -1
  227. package/dist/types/v4/classic/tests/lazy.test.d.ts +0 -1
  228. package/dist/types/v4/classic/tests/literal.test.d.ts +0 -1
  229. package/dist/types/v4/classic/tests/map.test.d.ts +0 -1
  230. package/dist/types/v4/classic/tests/nan.test.d.ts +0 -1
  231. package/dist/types/v4/classic/tests/nested-refine.test.d.ts +0 -1
  232. package/dist/types/v4/classic/tests/nonoptional.test.d.ts +0 -1
  233. package/dist/types/v4/classic/tests/nullable.test.d.ts +0 -1
  234. package/dist/types/v4/classic/tests/number.test.d.ts +0 -1
  235. package/dist/types/v4/classic/tests/object.test.d.ts +0 -1
  236. package/dist/types/v4/classic/tests/optional.test.d.ts +0 -1
  237. package/dist/types/v4/classic/tests/partial.test.d.ts +0 -1
  238. package/dist/types/v4/classic/tests/pickomit.test.d.ts +0 -1
  239. package/dist/types/v4/classic/tests/pipe.test.d.ts +0 -1
  240. package/dist/types/v4/classic/tests/prefault.test.d.ts +0 -1
  241. package/dist/types/v4/classic/tests/preprocess.test.d.ts +0 -1
  242. package/dist/types/v4/classic/tests/primitive.test.d.ts +0 -1
  243. package/dist/types/v4/classic/tests/promise.test.d.ts +0 -1
  244. package/dist/types/v4/classic/tests/readonly.test.d.ts +0 -1
  245. package/dist/types/v4/classic/tests/record.test.d.ts +0 -1
  246. package/dist/types/v4/classic/tests/recursive-types.test.d.ts +0 -1
  247. package/dist/types/v4/classic/tests/refine.test.d.ts +0 -1
  248. package/dist/types/v4/classic/tests/registries.test.d.ts +0 -1
  249. package/dist/types/v4/classic/tests/set.test.d.ts +0 -1
  250. package/dist/types/v4/classic/tests/standard-schema.test.d.ts +0 -1
  251. package/dist/types/v4/classic/tests/string-formats.test.d.ts +0 -1
  252. package/dist/types/v4/classic/tests/string.test.d.ts +0 -1
  253. package/dist/types/v4/classic/tests/template-literal.test.d.ts +0 -1
  254. package/dist/types/v4/classic/tests/transform.test.d.ts +0 -1
  255. package/dist/types/v4/classic/tests/tuple.test.d.ts +0 -1
  256. package/dist/types/v4/classic/tests/union.test.d.ts +0 -1
  257. package/dist/types/v4/classic/tests/validations.test.d.ts +0 -1
  258. package/dist/types/v4/classic/tests/void.test.d.ts +0 -1
  259. package/dist/types/v4/core/tests/index.test.d.ts +0 -1
  260. package/dist/types/v4/core/tests/locales/be.test.d.ts +0 -1
  261. package/dist/types/v4/core/tests/locales/en.test.d.ts +0 -1
  262. package/dist/types/v4/core/tests/locales/ru.test.d.ts +0 -1
  263. package/dist/types/v4/core/tests/locales/tr.test.d.ts +0 -1
  264. package/dist/types/v4/mini/tests/assignability.test.d.ts +0 -1
  265. package/dist/types/v4/mini/tests/brand.test.d.ts +0 -1
  266. package/dist/types/v4/mini/tests/checks.test.d.ts +0 -1
  267. package/dist/types/v4/mini/tests/computed.test.d.ts +0 -1
  268. package/dist/types/v4/mini/tests/error.test.d.ts +0 -1
  269. package/dist/types/v4/mini/tests/functions.test.d.ts +0 -1
  270. package/dist/types/v4/mini/tests/index.test.d.ts +0 -1
  271. package/dist/types/v4/mini/tests/number.test.d.ts +0 -1
  272. package/dist/types/v4/mini/tests/object.test.d.ts +0 -1
  273. package/dist/types/v4/mini/tests/prototypes.test.d.ts +0 -1
  274. package/dist/types/v4/mini/tests/recursive-types.test.d.ts +0 -1
  275. package/dist/types/v4/mini/tests/string.test.d.ts +0 -1
  276. package/src/index.ts +0 -4
  277. package/src/v3/ZodError.ts +0 -329
  278. package/src/v3/benchmarks/datetime.ts +0 -58
  279. package/src/v3/benchmarks/discriminatedUnion.ts +0 -80
  280. package/src/v3/benchmarks/index.ts +0 -59
  281. package/src/v3/benchmarks/ipv4.ts +0 -57
  282. package/src/v3/benchmarks/object.ts +0 -69
  283. package/src/v3/benchmarks/primitives.ts +0 -162
  284. package/src/v3/benchmarks/realworld.ts +0 -63
  285. package/src/v3/benchmarks/string.ts +0 -55
  286. package/src/v3/benchmarks/union.ts +0 -80
  287. package/src/v3/errors.ts +0 -13
  288. package/src/v3/external.ts +0 -6
  289. package/src/v3/helpers/enumUtil.ts +0 -17
  290. package/src/v3/helpers/errorUtil.ts +0 -8
  291. package/src/v3/helpers/parseUtil.ts +0 -176
  292. package/src/v3/helpers/partialUtil.ts +0 -34
  293. package/src/v3/helpers/typeAliases.ts +0 -2
  294. package/src/v3/helpers/util.ts +0 -224
  295. package/src/v3/index.ts +0 -4
  296. package/src/v3/locales/en.ts +0 -120
  297. package/src/v3/standard-schema.ts +0 -113
  298. package/src/v3/tests/Mocker.ts +0 -54
  299. package/src/v3/tests/all-errors.test.ts +0 -157
  300. package/src/v3/tests/anyunknown.test.ts +0 -28
  301. package/src/v3/tests/array.test.ts +0 -71
  302. package/src/v3/tests/async-parsing.test.ts +0 -388
  303. package/src/v3/tests/async-refinements.test.ts +0 -46
  304. package/src/v3/tests/base.test.ts +0 -29
  305. package/src/v3/tests/bigint.test.ts +0 -55
  306. package/src/v3/tests/branded.test.ts +0 -53
  307. package/src/v3/tests/catch.test.ts +0 -220
  308. package/src/v3/tests/coerce.test.ts +0 -133
  309. package/src/v3/tests/complex.test.ts +0 -56
  310. package/src/v3/tests/custom.test.ts +0 -31
  311. package/src/v3/tests/date.test.ts +0 -32
  312. package/src/v3/tests/deepmasking.test.ts +0 -186
  313. package/src/v3/tests/default.test.ts +0 -112
  314. package/src/v3/tests/description.test.ts +0 -33
  315. package/src/v3/tests/discriminated-unions.test.ts +0 -315
  316. package/src/v3/tests/enum.test.ts +0 -80
  317. package/src/v3/tests/error.test.ts +0 -551
  318. package/src/v3/tests/firstparty.test.ts +0 -87
  319. package/src/v3/tests/firstpartyschematypes.test.ts +0 -21
  320. package/src/v3/tests/function.test.ts +0 -257
  321. package/src/v3/tests/generics.test.ts +0 -48
  322. package/src/v3/tests/instanceof.test.ts +0 -37
  323. package/src/v3/tests/intersection.test.ts +0 -110
  324. package/src/v3/tests/language-server.source.ts +0 -76
  325. package/src/v3/tests/language-server.test.ts +0 -207
  326. package/src/v3/tests/literal.test.ts +0 -36
  327. package/src/v3/tests/map.test.ts +0 -110
  328. package/src/v3/tests/masking.test.ts +0 -4
  329. package/src/v3/tests/mocker.test.ts +0 -19
  330. package/src/v3/tests/nan.test.ts +0 -21
  331. package/src/v3/tests/nativeEnum.test.ts +0 -87
  332. package/src/v3/tests/nullable.test.ts +0 -42
  333. package/src/v3/tests/number.test.ts +0 -176
  334. package/src/v3/tests/object-augmentation.test.ts +0 -29
  335. package/src/v3/tests/object-in-es5-env.test.ts +0 -29
  336. package/src/v3/tests/object.test.ts +0 -434
  337. package/src/v3/tests/optional.test.ts +0 -42
  338. package/src/v3/tests/parseUtil.test.ts +0 -23
  339. package/src/v3/tests/parser.test.ts +0 -41
  340. package/src/v3/tests/partials.test.ts +0 -243
  341. package/src/v3/tests/pickomit.test.ts +0 -111
  342. package/src/v3/tests/pipeline.test.ts +0 -29
  343. package/src/v3/tests/preprocess.test.ts +0 -188
  344. package/src/v3/tests/primitive.test.ts +0 -440
  345. package/src/v3/tests/promise.test.ts +0 -90
  346. package/src/v3/tests/readonly.test.ts +0 -194
  347. package/src/v3/tests/record.test.ts +0 -171
  348. package/src/v3/tests/recursive.test.ts +0 -197
  349. package/src/v3/tests/refine.test.ts +0 -297
  350. package/src/v3/tests/safeparse.test.ts +0 -27
  351. package/src/v3/tests/set.test.ts +0 -142
  352. package/src/v3/tests/standard-schema.test.ts +0 -83
  353. package/src/v3/tests/string.test.ts +0 -916
  354. package/src/v3/tests/transformer.test.ts +0 -233
  355. package/src/v3/tests/tuple.test.ts +0 -90
  356. package/src/v3/tests/unions.test.ts +0 -57
  357. package/src/v3/tests/validations.test.ts +0 -133
  358. package/src/v3/tests/void.test.ts +0 -15
  359. package/src/v3/types.ts +0 -5135
  360. package/src/v4/classic/checks.ts +0 -30
  361. package/src/v4/classic/coerce.ts +0 -27
  362. package/src/v4/classic/compat.ts +0 -76
  363. package/src/v4/classic/errors.ts +0 -75
  364. package/src/v4/classic/external.ts +0 -31
  365. package/src/v4/classic/index.ts +0 -5
  366. package/src/v4/classic/iso.ts +0 -90
  367. package/src/v4/classic/parse.ts +0 -33
  368. package/src/v4/classic/schemas.ts +0 -2062
  369. package/src/v4/classic/tests/anyunknown.test.ts +0 -26
  370. package/src/v4/classic/tests/array.test.ts +0 -257
  371. package/src/v4/classic/tests/assignability.test.ts +0 -124
  372. package/src/v4/classic/tests/async-parsing.test.ts +0 -381
  373. package/src/v4/classic/tests/async-refinements.test.ts +0 -68
  374. package/src/v4/classic/tests/base.test.ts +0 -7
  375. package/src/v4/classic/tests/bigint.test.ts +0 -54
  376. package/src/v4/classic/tests/brand.test.ts +0 -57
  377. package/src/v4/classic/tests/catch.test.ts +0 -252
  378. package/src/v4/classic/tests/coalesce.test.ts +0 -20
  379. package/src/v4/classic/tests/coerce.test.ts +0 -160
  380. package/src/v4/classic/tests/custom.test.ts +0 -16
  381. package/src/v4/classic/tests/date.test.ts +0 -31
  382. package/src/v4/classic/tests/default.test.ts +0 -114
  383. package/src/v4/classic/tests/description.test.ts +0 -32
  384. package/src/v4/classic/tests/discriminated-unions.test.ts +0 -566
  385. package/src/v4/classic/tests/enum.test.ts +0 -285
  386. package/src/v4/classic/tests/error-utils.test.ts +0 -480
  387. package/src/v4/classic/tests/error.test.ts +0 -698
  388. package/src/v4/classic/tests/file.test.ts +0 -52
  389. package/src/v4/classic/tests/firstparty.test.ts +0 -177
  390. package/src/v4/classic/tests/function.test.ts +0 -230
  391. package/src/v4/classic/tests/generics.test.ts +0 -58
  392. package/src/v4/classic/tests/index.test.ts +0 -909
  393. package/src/v4/classic/tests/instanceof.test.ts +0 -34
  394. package/src/v4/classic/tests/intersection.test.ts +0 -171
  395. package/src/v4/classic/tests/json-schema.test.ts +0 -1810
  396. package/src/v4/classic/tests/json.test.ts +0 -108
  397. package/src/v4/classic/tests/lazy.test.ts +0 -227
  398. package/src/v4/classic/tests/literal.test.ts +0 -82
  399. package/src/v4/classic/tests/map.test.ts +0 -196
  400. package/src/v4/classic/tests/nan.test.ts +0 -21
  401. package/src/v4/classic/tests/nested-refine.test.ts +0 -165
  402. package/src/v4/classic/tests/nonoptional.test.ts +0 -86
  403. package/src/v4/classic/tests/nullable.test.ts +0 -22
  404. package/src/v4/classic/tests/number.test.ts +0 -242
  405. package/src/v4/classic/tests/object.test.ts +0 -493
  406. package/src/v4/classic/tests/optional.test.ts +0 -103
  407. package/src/v4/classic/tests/partial.test.ts +0 -147
  408. package/src/v4/classic/tests/pickomit.test.ts +0 -125
  409. package/src/v4/classic/tests/pipe.test.ts +0 -81
  410. package/src/v4/classic/tests/prefault.test.ts +0 -37
  411. package/src/v4/classic/tests/preprocess.test.ts +0 -272
  412. package/src/v4/classic/tests/primitive.test.ts +0 -175
  413. package/src/v4/classic/tests/promise.test.ts +0 -81
  414. package/src/v4/classic/tests/readonly.test.ts +0 -252
  415. package/src/v4/classic/tests/record.test.ts +0 -332
  416. package/src/v4/classic/tests/recursive-types.test.ts +0 -126
  417. package/src/v4/classic/tests/refine.test.ts +0 -423
  418. package/src/v4/classic/tests/registries.test.ts +0 -159
  419. package/src/v4/classic/tests/set.test.ts +0 -179
  420. package/src/v4/classic/tests/standard-schema.test.ts +0 -57
  421. package/src/v4/classic/tests/string-formats.test.ts +0 -31
  422. package/src/v4/classic/tests/string.test.ts +0 -1081
  423. package/src/v4/classic/tests/template-literal.test.ts +0 -758
  424. package/src/v4/classic/tests/transform.test.ts +0 -250
  425. package/src/v4/classic/tests/tuple.test.ts +0 -163
  426. package/src/v4/classic/tests/union.test.ts +0 -94
  427. package/src/v4/classic/tests/validations.test.ts +0 -277
  428. package/src/v4/classic/tests/void.test.ts +0 -12
  429. package/src/v4/core/api.ts +0 -1533
  430. package/src/v4/core/checks.ts +0 -1282
  431. package/src/v4/core/config.ts +0 -15
  432. package/src/v4/core/core.ts +0 -98
  433. package/src/v4/core/doc.ts +0 -45
  434. package/src/v4/core/errors.ts +0 -433
  435. package/src/v4/core/function.ts +0 -143
  436. package/src/v4/core/index.ts +0 -15
  437. package/src/v4/core/json-schema.ts +0 -106
  438. package/src/v4/core/parse.ts +0 -94
  439. package/src/v4/core/regexes.ts +0 -133
  440. package/src/v4/core/registries.ts +0 -89
  441. package/src/v4/core/schemas.ts +0 -3802
  442. package/src/v4/core/standard-schema.ts +0 -64
  443. package/src/v4/core/tests/index.test.ts +0 -46
  444. package/src/v4/core/tests/locales/be.test.ts +0 -124
  445. package/src/v4/core/tests/locales/en.test.ts +0 -22
  446. package/src/v4/core/tests/locales/ru.test.ts +0 -128
  447. package/src/v4/core/tests/locales/tr.test.ts +0 -69
  448. package/src/v4/core/to-json-schema.ts +0 -790
  449. package/src/v4/core/util.ts +0 -750
  450. package/src/v4/core/versions.ts +0 -5
  451. package/src/v4/core/zsf.ts +0 -323
  452. package/src/v4/index.ts +0 -4
  453. package/src/v4/locales/ar.ts +0 -125
  454. package/src/v4/locales/az.ts +0 -121
  455. package/src/v4/locales/be.ts +0 -185
  456. package/src/v4/locales/ca.ts +0 -127
  457. package/src/v4/locales/cs.ts +0 -142
  458. package/src/v4/locales/de.ts +0 -124
  459. package/src/v4/locales/en.ts +0 -127
  460. package/src/v4/locales/es.ts +0 -124
  461. package/src/v4/locales/fa.ts +0 -134
  462. package/src/v4/locales/fi.ts +0 -131
  463. package/src/v4/locales/fr.ts +0 -124
  464. package/src/v4/locales/frCA.ts +0 -126
  465. package/src/v4/locales/he.ts +0 -125
  466. package/src/v4/locales/hu.ts +0 -126
  467. package/src/v4/locales/id.ts +0 -124
  468. package/src/v4/locales/index.ts +0 -34
  469. package/src/v4/locales/it.ts +0 -125
  470. package/src/v4/locales/ja.ts +0 -122
  471. package/src/v4/locales/ko.ts +0 -131
  472. package/src/v4/locales/mk.ts +0 -127
  473. package/src/v4/locales/ms.ts +0 -124
  474. package/src/v4/locales/no.ts +0 -124
  475. package/src/v4/locales/ota.ts +0 -125
  476. package/src/v4/locales/pl.ts +0 -125
  477. package/src/v4/locales/pt.ts +0 -123
  478. package/src/v4/locales/ru.ts +0 -185
  479. package/src/v4/locales/sl.ts +0 -125
  480. package/src/v4/locales/ta.ts +0 -125
  481. package/src/v4/locales/th.ts +0 -126
  482. package/src/v4/locales/tr.ts +0 -121
  483. package/src/v4/locales/ua.ts +0 -126
  484. package/src/v4/locales/ur.ts +0 -126
  485. package/src/v4/locales/vi.ts +0 -125
  486. package/src/v4/locales/zh-CN.ts +0 -123
  487. package/src/v4/locales/zh-tw.ts +0 -125
  488. package/src/v4/mini/checks.ts +0 -32
  489. package/src/v4/mini/coerce.ts +0 -22
  490. package/src/v4/mini/external.ts +0 -26
  491. package/src/v4/mini/index.ts +0 -3
  492. package/src/v4/mini/iso.ts +0 -62
  493. package/src/v4/mini/parse.ts +0 -1
  494. package/src/v4/mini/schemas.ts +0 -1556
  495. package/src/v4/mini/tests/assignability.test.ts +0 -117
  496. package/src/v4/mini/tests/brand.test.ts +0 -51
  497. package/src/v4/mini/tests/checks.test.ts +0 -144
  498. package/src/v4/mini/tests/computed.test.ts +0 -36
  499. package/src/v4/mini/tests/error.test.ts +0 -22
  500. package/src/v4/mini/tests/functions.test.ts +0 -43
  501. package/src/v4/mini/tests/index.test.ts +0 -914
  502. package/src/v4/mini/tests/number.test.ts +0 -95
  503. package/src/v4/mini/tests/object.test.ts +0 -139
  504. package/src/v4/mini/tests/prototypes.test.ts +0 -23
  505. package/src/v4/mini/tests/recursive-types.test.ts +0 -124
  506. package/src/v4/mini/tests/string.test.ts +0 -284
@@ -1,1810 +0,0 @@
1
- import { describe, expect, test } from "vitest";
2
- import * as z from "zod/v4";
3
- import { toJSONSchema } from "zod/v4/core";
4
-
5
- describe("toJSONSchema", () => {
6
- test("primitive types", () => {
7
- expect(toJSONSchema(z.string())).toMatchInlineSnapshot(`
8
- {
9
- "$schema": "https://json-schema.org/draft-2020-12/schema",
10
- "type": "string",
11
- }
12
- `);
13
- expect(toJSONSchema(z.number())).toMatchInlineSnapshot(`
14
- {
15
- "$schema": "https://json-schema.org/draft-2020-12/schema",
16
- "type": "number",
17
- }
18
- `);
19
- expect(toJSONSchema(z.boolean())).toMatchInlineSnapshot(`
20
- {
21
- "$schema": "https://json-schema.org/draft-2020-12/schema",
22
- "type": "boolean",
23
- }
24
- `);
25
- expect(toJSONSchema(z.null())).toMatchInlineSnapshot(`
26
- {
27
- "$schema": "https://json-schema.org/draft-2020-12/schema",
28
- "type": "null",
29
- }
30
- `);
31
- expect(toJSONSchema(z.undefined())).toMatchInlineSnapshot(`
32
- {
33
- "$schema": "https://json-schema.org/draft-2020-12/schema",
34
- "type": "null",
35
- }
36
- `);
37
- expect(toJSONSchema(z.any())).toMatchInlineSnapshot(`
38
- {
39
- "$schema": "https://json-schema.org/draft-2020-12/schema",
40
- }
41
- `);
42
- expect(toJSONSchema(z.unknown())).toMatchInlineSnapshot(`
43
- {
44
- "$schema": "https://json-schema.org/draft-2020-12/schema",
45
- }
46
- `);
47
- expect(toJSONSchema(z.never())).toMatchInlineSnapshot(`
48
- {
49
- "$schema": "https://json-schema.org/draft-2020-12/schema",
50
- "not": {},
51
- }
52
- `);
53
- expect(toJSONSchema(z.email())).toMatchInlineSnapshot(`
54
- {
55
- "$schema": "https://json-schema.org/draft-2020-12/schema",
56
- "format": "email",
57
- "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
58
- "type": "string",
59
- }
60
- `);
61
- expect(toJSONSchema(z.iso.datetime())).toMatchInlineSnapshot(`
62
- {
63
- "$schema": "https://json-schema.org/draft-2020-12/schema",
64
- "format": "date-time",
65
- "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)$",
66
- "type": "string",
67
- }
68
- `);
69
- expect(toJSONSchema(z.iso.date())).toMatchInlineSnapshot(`
70
- {
71
- "$schema": "https://json-schema.org/draft-2020-12/schema",
72
- "format": "date",
73
- "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])))$",
74
- "type": "string",
75
- }
76
- `);
77
- expect(toJSONSchema(z.iso.time())).toMatchInlineSnapshot(`
78
- {
79
- "$schema": "https://json-schema.org/draft-2020-12/schema",
80
- "format": "time",
81
- "pattern": "^([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(\\.\\d+)?$",
82
- "type": "string",
83
- }
84
- `);
85
- expect(toJSONSchema(z.iso.duration())).toMatchInlineSnapshot(`
86
- {
87
- "$schema": "https://json-schema.org/draft-2020-12/schema",
88
- "format": "duration",
89
- "pattern": "^P(?:(\\d+W)|(?!.*W)(?=\\d|T\\d)(\\d+Y)?(\\d+M)?(\\d+D)?(T(?=\\d)(\\d+H)?(\\d+M)?(\\d+([.,]\\d+)?S)?)?)$",
90
- "type": "string",
91
- }
92
- `);
93
- expect(toJSONSchema(z.ipv4())).toMatchInlineSnapshot(`
94
- {
95
- "$schema": "https://json-schema.org/draft-2020-12/schema",
96
- "format": "ipv4",
97
- "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])$",
98
- "type": "string",
99
- }
100
- `);
101
- expect(toJSONSchema(z.ipv6())).toMatchInlineSnapshot(`
102
- {
103
- "$schema": "https://json-schema.org/draft-2020-12/schema",
104
- "format": "ipv6",
105
- "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})$",
106
- "type": "string",
107
- }
108
- `);
109
- expect(toJSONSchema(z.uuid())).toMatchInlineSnapshot(`
110
- {
111
- "$schema": "https://json-schema.org/draft-2020-12/schema",
112
- "format": "uuid",
113
- "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)$",
114
- "type": "string",
115
- }
116
- `);
117
- expect(toJSONSchema(z.guid())).toMatchInlineSnapshot(`
118
- {
119
- "$schema": "https://json-schema.org/draft-2020-12/schema",
120
- "format": "uuid",
121
- "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})$",
122
- "type": "string",
123
- }
124
- `);
125
- expect(toJSONSchema(z.url())).toMatchInlineSnapshot(`
126
- {
127
- "$schema": "https://json-schema.org/draft-2020-12/schema",
128
- "format": "uri",
129
- "type": "string",
130
- }
131
- `);
132
- expect(toJSONSchema(z.base64())).toMatchInlineSnapshot(`
133
- {
134
- "$schema": "https://json-schema.org/draft-2020-12/schema",
135
- "contentEncoding": "base64",
136
- "format": "base64",
137
- "pattern": "^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$",
138
- "type": "string",
139
- }
140
- `);
141
- expect(toJSONSchema(z.cuid())).toMatchInlineSnapshot(`
142
- {
143
- "$schema": "https://json-schema.org/draft-2020-12/schema",
144
- "format": "cuid",
145
- "pattern": "^[cC][^\\s-]{8,}$",
146
- "type": "string",
147
- }
148
- `);
149
- // expect(toJSONSchema(z.regex(/asdf/))).toMatchInlineSnapshot();
150
- expect(toJSONSchema(z.emoji())).toMatchInlineSnapshot(`
151
- {
152
- "$schema": "https://json-schema.org/draft-2020-12/schema",
153
- "format": "emoji",
154
- "pattern": "^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$",
155
- "type": "string",
156
- }
157
- `);
158
- expect(toJSONSchema(z.nanoid())).toMatchInlineSnapshot(`
159
- {
160
- "$schema": "https://json-schema.org/draft-2020-12/schema",
161
- "format": "nanoid",
162
- "pattern": "^[a-zA-Z0-9_-]{21}$",
163
- "type": "string",
164
- }
165
- `);
166
- expect(toJSONSchema(z.cuid2())).toMatchInlineSnapshot(`
167
- {
168
- "$schema": "https://json-schema.org/draft-2020-12/schema",
169
- "format": "cuid2",
170
- "pattern": "^[0-9a-z]+$",
171
- "type": "string",
172
- }
173
- `);
174
- expect(toJSONSchema(z.ulid())).toMatchInlineSnapshot(`
175
- {
176
- "$schema": "https://json-schema.org/draft-2020-12/schema",
177
- "format": "ulid",
178
- "pattern": "^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$",
179
- "type": "string",
180
- }
181
- `);
182
- // expect(toJSONSchema(z.cidr())).toMatchInlineSnapshot();
183
- expect(toJSONSchema(z.number())).toMatchInlineSnapshot(`
184
- {
185
- "$schema": "https://json-schema.org/draft-2020-12/schema",
186
- "type": "number",
187
- }
188
- `);
189
- expect(toJSONSchema(z.int())).toMatchInlineSnapshot(`
190
- {
191
- "$schema": "https://json-schema.org/draft-2020-12/schema",
192
- "maximum": 9007199254740991,
193
- "minimum": -9007199254740991,
194
- "type": "integer",
195
- }
196
- `);
197
- expect(toJSONSchema(z.int32())).toMatchInlineSnapshot(`
198
- {
199
- "$schema": "https://json-schema.org/draft-2020-12/schema",
200
- "maximum": 2147483647,
201
- "minimum": -2147483648,
202
- "type": "integer",
203
- }
204
- `);
205
- expect(toJSONSchema(z.float32())).toMatchInlineSnapshot(`
206
- {
207
- "$schema": "https://json-schema.org/draft-2020-12/schema",
208
- "maximum": 3.4028234663852886e+38,
209
- "minimum": -3.4028234663852886e+38,
210
- "type": "number",
211
- }
212
- `);
213
- expect(toJSONSchema(z.float64())).toMatchInlineSnapshot(`
214
- {
215
- "$schema": "https://json-schema.org/draft-2020-12/schema",
216
- "maximum": 1.7976931348623157e+308,
217
- "minimum": -1.7976931348623157e+308,
218
- "type": "number",
219
- }
220
- `);
221
- expect(toJSONSchema(z.jwt())).toMatchInlineSnapshot(`
222
- {
223
- "$schema": "https://json-schema.org/draft-2020-12/schema",
224
- "format": "jwt",
225
- "type": "string",
226
- }
227
- `);
228
- });
229
-
230
- test("unsupported schema types", () => {
231
- expect(() => toJSONSchema(z.bigint())).toThrow("BigInt cannot be represented in JSON Schema");
232
- expect(() => toJSONSchema(z.int64())).toThrow("BigInt cannot be represented in JSON Schema");
233
- expect(() => toJSONSchema(z.symbol())).toThrow("Symbols cannot be represented in JSON Schema");
234
- expect(() => toJSONSchema(z.void())).toThrow("Void cannot be represented in JSON Schema");
235
- expect(() => toJSONSchema(z.date())).toThrow("Date cannot be represented in JSON Schema");
236
- expect(() => toJSONSchema(z.map(z.string(), z.number()))).toThrow("Map cannot be represented in JSON Schema");
237
- expect(() => toJSONSchema(z.set(z.string()))).toThrow("Set cannot be represented in JSON Schema");
238
- expect(() => toJSONSchema(z.custom(() => true))).toThrow("Custom types cannot be represented in JSON Schema");
239
-
240
- // File type
241
- const fileSchema = z.file();
242
- expect(() => toJSONSchema(fileSchema)).toThrow("File cannot be represented in JSON Schema");
243
-
244
- // Transform
245
- const transformSchema = z.string().transform((val) => Number.parseInt(val));
246
- expect(() => toJSONSchema(transformSchema)).toThrow("Transforms cannot be represented in JSON Schema");
247
-
248
- // Static catch values
249
- const staticCatchSchema = z.string().catch(() => "sup");
250
- expect(toJSONSchema(staticCatchSchema)).toMatchInlineSnapshot(`
251
- {
252
- "$schema": "https://json-schema.org/draft-2020-12/schema",
253
- "default": "sup",
254
- "type": "string",
255
- }
256
- `);
257
-
258
- // Dynamic catch values
259
- const dynamicCatchSchema = z.string().catch((ctx) => `${ctx.issues.length}`);
260
- expect(() => toJSONSchema(dynamicCatchSchema)).toThrow("Dynamic catch values are not supported in JSON Schema");
261
- });
262
-
263
- test("string formats", () => {
264
- expect(toJSONSchema(z.string().email())).toMatchInlineSnapshot(`
265
- {
266
- "$schema": "https://json-schema.org/draft-2020-12/schema",
267
- "format": "email",
268
- "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
269
- "type": "string",
270
- }
271
- `);
272
- expect(toJSONSchema(z.string().uuid())).toMatchInlineSnapshot(`
273
- {
274
- "$schema": "https://json-schema.org/draft-2020-12/schema",
275
- "format": "uuid",
276
- "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)$",
277
- "type": "string",
278
- }
279
- `);
280
- expect(toJSONSchema(z.iso.datetime())).toMatchInlineSnapshot(`
281
- {
282
- "$schema": "https://json-schema.org/draft-2020-12/schema",
283
- "format": "date-time",
284
- "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)$",
285
- "type": "string",
286
- }
287
- `);
288
-
289
- expect(toJSONSchema(z.iso.date())).toMatchInlineSnapshot(`
290
- {
291
- "$schema": "https://json-schema.org/draft-2020-12/schema",
292
- "format": "date",
293
- "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])))$",
294
- "type": "string",
295
- }
296
- `);
297
- expect(toJSONSchema(z.iso.time())).toMatchInlineSnapshot(`
298
- {
299
- "$schema": "https://json-schema.org/draft-2020-12/schema",
300
- "format": "time",
301
- "pattern": "^([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(\\.\\d+)?$",
302
- "type": "string",
303
- }
304
- `);
305
- expect(toJSONSchema(z.iso.duration())).toMatchInlineSnapshot(`
306
- {
307
- "$schema": "https://json-schema.org/draft-2020-12/schema",
308
- "format": "duration",
309
- "pattern": "^P(?:(\\d+W)|(?!.*W)(?=\\d|T\\d)(\\d+Y)?(\\d+M)?(\\d+D)?(T(?=\\d)(\\d+H)?(\\d+M)?(\\d+([.,]\\d+)?S)?)?)$",
310
- "type": "string",
311
- }
312
- `);
313
- // expect(toJSONSchema(z.string().ip())).toMatchInlineSnapshot(`
314
- // {
315
- // "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\\}\\)\\)\\)\\$\\)/,
316
- // "type": "string",
317
- // }
318
- // `);
319
- expect(toJSONSchema(z.ipv4())).toMatchInlineSnapshot(`
320
- {
321
- "$schema": "https://json-schema.org/draft-2020-12/schema",
322
- "format": "ipv4",
323
- "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])$",
324
- "type": "string",
325
- }
326
- `);
327
-
328
- expect(toJSONSchema(z.ipv6())).toMatchInlineSnapshot(`
329
- {
330
- "$schema": "https://json-schema.org/draft-2020-12/schema",
331
- "format": "ipv6",
332
- "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})$",
333
- "type": "string",
334
- }
335
- `);
336
-
337
- expect(toJSONSchema(z.base64())).toMatchInlineSnapshot(`
338
- {
339
- "$schema": "https://json-schema.org/draft-2020-12/schema",
340
- "contentEncoding": "base64",
341
- "format": "base64",
342
- "pattern": "^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$",
343
- "type": "string",
344
- }
345
- `);
346
- expect(toJSONSchema(z.url())).toMatchInlineSnapshot(`
347
- {
348
- "$schema": "https://json-schema.org/draft-2020-12/schema",
349
- "format": "uri",
350
- "type": "string",
351
- }
352
- `);
353
- expect(toJSONSchema(z.guid())).toMatchInlineSnapshot(`
354
- {
355
- "$schema": "https://json-schema.org/draft-2020-12/schema",
356
- "format": "uuid",
357
- "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})$",
358
- "type": "string",
359
- }
360
- `);
361
- expect(toJSONSchema(z.string().regex(/asdf/))).toMatchInlineSnapshot(`
362
- {
363
- "$schema": "https://json-schema.org/draft-2020-12/schema",
364
- "format": "regex",
365
- "pattern": "asdf",
366
- "type": "string",
367
- }
368
- `);
369
- });
370
-
371
- test("number constraints", () => {
372
- expect(toJSONSchema(z.number().min(5).max(10))).toMatchInlineSnapshot(
373
- `
374
- {
375
- "$schema": "https://json-schema.org/draft-2020-12/schema",
376
- "maximum": 10,
377
- "minimum": 5,
378
- "type": "number",
379
- }
380
- `
381
- );
382
-
383
- expect(toJSONSchema(z.number().gt(5).gt(10))).toMatchInlineSnapshot(`
384
- {
385
- "$schema": "https://json-schema.org/draft-2020-12/schema",
386
- "exclusiveMinimum": 10,
387
- "type": "number",
388
- }
389
- `);
390
-
391
- expect(toJSONSchema(z.number().gt(5).gte(10))).toMatchInlineSnapshot(`
392
- {
393
- "$schema": "https://json-schema.org/draft-2020-12/schema",
394
- "minimum": 10,
395
- "type": "number",
396
- }
397
- `);
398
-
399
- expect(toJSONSchema(z.number().lt(5).lt(3))).toMatchInlineSnapshot(`
400
- {
401
- "$schema": "https://json-schema.org/draft-2020-12/schema",
402
- "exclusiveMaximum": 3,
403
- "type": "number",
404
- }
405
- `);
406
-
407
- expect(toJSONSchema(z.number().lt(5).lt(3).lte(2))).toMatchInlineSnapshot(`
408
- {
409
- "$schema": "https://json-schema.org/draft-2020-12/schema",
410
- "maximum": 2,
411
- "type": "number",
412
- }
413
- `);
414
-
415
- expect(toJSONSchema(z.number().lt(5).lte(3))).toMatchInlineSnapshot(`
416
- {
417
- "$schema": "https://json-schema.org/draft-2020-12/schema",
418
- "maximum": 3,
419
- "type": "number",
420
- }
421
- `);
422
-
423
- expect(toJSONSchema(z.number().gt(5).lt(10))).toMatchInlineSnapshot(`
424
- {
425
- "$schema": "https://json-schema.org/draft-2020-12/schema",
426
- "exclusiveMaximum": 10,
427
- "exclusiveMinimum": 5,
428
- "type": "number",
429
- }
430
- `);
431
- expect(toJSONSchema(z.number().gte(5).lte(10))).toMatchInlineSnapshot(`
432
- {
433
- "$schema": "https://json-schema.org/draft-2020-12/schema",
434
- "maximum": 10,
435
- "minimum": 5,
436
- "type": "number",
437
- }
438
- `);
439
- expect(toJSONSchema(z.number().positive())).toMatchInlineSnapshot(`
440
- {
441
- "$schema": "https://json-schema.org/draft-2020-12/schema",
442
- "exclusiveMinimum": 0,
443
- "type": "number",
444
- }
445
- `);
446
- expect(toJSONSchema(z.number().negative())).toMatchInlineSnapshot(`
447
- {
448
- "$schema": "https://json-schema.org/draft-2020-12/schema",
449
- "exclusiveMaximum": 0,
450
- "type": "number",
451
- }
452
- `);
453
- expect(toJSONSchema(z.number().nonpositive())).toMatchInlineSnapshot(`
454
- {
455
- "$schema": "https://json-schema.org/draft-2020-12/schema",
456
- "maximum": 0,
457
- "type": "number",
458
- }
459
- `);
460
- expect(toJSONSchema(z.number().nonnegative())).toMatchInlineSnapshot(`
461
- {
462
- "$schema": "https://json-schema.org/draft-2020-12/schema",
463
- "minimum": 0,
464
- "type": "number",
465
- }
466
- `);
467
- });
468
-
469
- test("arrays", () => {
470
- expect(toJSONSchema(z.array(z.string()))).toMatchInlineSnapshot(`
471
- {
472
- "$schema": "https://json-schema.org/draft-2020-12/schema",
473
- "items": {
474
- "type": "string",
475
- },
476
- "type": "array",
477
- }
478
- `);
479
- });
480
-
481
- test("unions", () => {
482
- const schema = z.union([z.string(), z.number()]);
483
- expect(toJSONSchema(schema)).toMatchInlineSnapshot(`
484
- {
485
- "$schema": "https://json-schema.org/draft-2020-12/schema",
486
- "anyOf": [
487
- {
488
- "type": "string",
489
- },
490
- {
491
- "type": "number",
492
- },
493
- ],
494
- }
495
- `);
496
- });
497
-
498
- test("intersections", () => {
499
- const schema = z.intersection(z.object({ name: z.string() }), z.object({ age: z.number() }));
500
-
501
- expect(toJSONSchema(schema)).toMatchInlineSnapshot(`
502
- {
503
- "$schema": "https://json-schema.org/draft-2020-12/schema",
504
- "allOf": [
505
- {
506
- "properties": {
507
- "name": {
508
- "type": "string",
509
- },
510
- },
511
- "required": [
512
- "name",
513
- ],
514
- "type": "object",
515
- },
516
- {
517
- "properties": {
518
- "age": {
519
- "type": "number",
520
- },
521
- },
522
- "required": [
523
- "age",
524
- ],
525
- "type": "object",
526
- },
527
- ],
528
- }
529
- `);
530
- });
531
-
532
- test("record", () => {
533
- const schema = z.record(z.string(), z.boolean());
534
- expect(toJSONSchema(schema)).toMatchInlineSnapshot(`
535
- {
536
- "$schema": "https://json-schema.org/draft-2020-12/schema",
537
- "additionalProperties": {
538
- "type": "boolean",
539
- },
540
- "propertyNames": {
541
- "type": "string",
542
- },
543
- "type": "object",
544
- }
545
- `);
546
- });
547
-
548
- test("tuple", () => {
549
- const schema = z.tuple([z.string(), z.number()]).rest(z.boolean());
550
- expect(toJSONSchema(schema)).toMatchInlineSnapshot(`
551
- {
552
- "$schema": "https://json-schema.org/draft-2020-12/schema",
553
- "items": {
554
- "type": "boolean",
555
- },
556
- "prefixItems": [
557
- {
558
- "type": "string",
559
- },
560
- {
561
- "type": "number",
562
- },
563
- ],
564
- "type": "array",
565
- }
566
- `);
567
- });
568
-
569
- test("promise", () => {
570
- const schema = z.promise(z.string());
571
- expect(toJSONSchema(schema)).toMatchInlineSnapshot(`
572
- {
573
- "$schema": "https://json-schema.org/draft-2020-12/schema",
574
- "type": "string",
575
- }
576
- `);
577
- });
578
-
579
- test("lazy", () => {
580
- const schema = z.lazy(() => z.string());
581
- expect(toJSONSchema(schema)).toMatchInlineSnapshot(`
582
- {
583
- "$schema": "https://json-schema.org/draft-2020-12/schema",
584
- "type": "string",
585
- }
586
- `);
587
- });
588
-
589
- // enum
590
- test("enum", () => {
591
- const schema = z.enum(["a", "b", "c"]);
592
- expect(toJSONSchema(schema)).toMatchInlineSnapshot(`
593
- {
594
- "$schema": "https://json-schema.org/draft-2020-12/schema",
595
- "enum": [
596
- "a",
597
- "b",
598
- "c",
599
- ],
600
- }
601
- `);
602
- });
603
-
604
- // literal
605
- test("literal", () => {
606
- const a = z.literal("hello");
607
- expect(toJSONSchema(a)).toMatchInlineSnapshot(`
608
- {
609
- "$schema": "https://json-schema.org/draft-2020-12/schema",
610
- "const": "hello",
611
- }
612
- `);
613
-
614
- const b = z.literal(["hello", undefined, null, 5, BigInt(1324)]);
615
- expect(() => toJSONSchema(b)).toThrow();
616
-
617
- const c = z.literal(["hello", null, 5]);
618
- expect(toJSONSchema(c)).toMatchInlineSnapshot(`
619
- {
620
- "$schema": "https://json-schema.org/draft-2020-12/schema",
621
- "enum": [
622
- "hello",
623
- null,
624
- 5,
625
- ],
626
- }
627
- `);
628
- });
629
-
630
- // pipe
631
- test("pipe", () => {
632
- const schema = z
633
- .string()
634
- .transform((val) => Number.parseInt(val))
635
- .pipe(z.number());
636
- expect(toJSONSchema(schema)).toMatchInlineSnapshot(`
637
- {
638
- "$schema": "https://json-schema.org/draft-2020-12/schema",
639
- "type": "number",
640
- }
641
- `);
642
- });
643
-
644
- test("simple objects", () => {
645
- const schema = z.object({
646
- name: z.string(),
647
- age: z.number(),
648
- });
649
-
650
- expect(toJSONSchema(schema)).toMatchInlineSnapshot(
651
- `
652
- {
653
- "$schema": "https://json-schema.org/draft-2020-12/schema",
654
- "properties": {
655
- "age": {
656
- "type": "number",
657
- },
658
- "name": {
659
- "type": "string",
660
- },
661
- },
662
- "required": [
663
- "name",
664
- "age",
665
- ],
666
- "type": "object",
667
- }
668
- `
669
- );
670
- });
671
-
672
- test("catchall objects", () => {
673
- const a = z.strictObject({
674
- name: z.string(),
675
- age: z.number(),
676
- });
677
-
678
- expect(toJSONSchema(a)).toMatchInlineSnapshot(`
679
- {
680
- "$schema": "https://json-schema.org/draft-2020-12/schema",
681
- "additionalProperties": false,
682
- "properties": {
683
- "age": {
684
- "type": "number",
685
- },
686
- "name": {
687
- "type": "string",
688
- },
689
- },
690
- "required": [
691
- "name",
692
- "age",
693
- ],
694
- "type": "object",
695
- }
696
- `);
697
-
698
- const b = z
699
- .object({
700
- name: z.string(),
701
- })
702
- .catchall(z.string());
703
-
704
- expect(toJSONSchema(b)).toMatchInlineSnapshot(`
705
- {
706
- "$schema": "https://json-schema.org/draft-2020-12/schema",
707
- "additionalProperties": {
708
- "type": "string",
709
- },
710
- "properties": {
711
- "name": {
712
- "type": "string",
713
- },
714
- },
715
- "required": [
716
- "name",
717
- ],
718
- "type": "object",
719
- }
720
- `);
721
-
722
- const c = z.looseObject({
723
- name: z.string(),
724
- });
725
-
726
- expect(toJSONSchema(c)).toMatchInlineSnapshot(`
727
- {
728
- "$schema": "https://json-schema.org/draft-2020-12/schema",
729
- "additionalProperties": {},
730
- "properties": {
731
- "name": {
732
- "type": "string",
733
- },
734
- },
735
- "required": [
736
- "name",
737
- ],
738
- "type": "object",
739
- }
740
- `);
741
- });
742
-
743
- test("optional fields - object", () => {
744
- const schema = z.object({
745
- required: z.string(),
746
- optional: z.string().optional(),
747
- nonoptional: z.string().optional().nonoptional(),
748
- });
749
-
750
- const result = toJSONSchema(schema);
751
-
752
- expect(result).toMatchInlineSnapshot(`
753
- {
754
- "$schema": "https://json-schema.org/draft-2020-12/schema",
755
- "properties": {
756
- "nonoptional": {
757
- "type": "string",
758
- },
759
- "optional": {
760
- "type": "string",
761
- },
762
- "required": {
763
- "type": "string",
764
- },
765
- },
766
- "required": [
767
- "required",
768
- "nonoptional",
769
- ],
770
- "type": "object",
771
- }
772
- `);
773
- });
774
-
775
- test("recursive object", () => {
776
- interface Category {
777
- name: string;
778
- subcategories: Category[];
779
- }
780
-
781
- const categorySchema: z.ZodType<Category> = z.object({
782
- name: z.string(),
783
- subcategories: z.array(z.lazy(() => categorySchema)),
784
- });
785
-
786
- const result = toJSONSchema(categorySchema);
787
- expect(result).toMatchInlineSnapshot(`
788
- {
789
- "$schema": "https://json-schema.org/draft-2020-12/schema",
790
- "properties": {
791
- "name": {
792
- "type": "string",
793
- },
794
- "subcategories": {
795
- "items": {
796
- "$ref": "#",
797
- },
798
- "type": "array",
799
- },
800
- },
801
- "required": [
802
- "name",
803
- "subcategories",
804
- ],
805
- "type": "object",
806
- }
807
- `);
808
- });
809
-
810
- test("simple interface", () => {
811
- const userSchema = z.object({
812
- name: z.string(),
813
- age: z.number().optional(),
814
- });
815
-
816
- const result = toJSONSchema(userSchema);
817
- expect(result).toMatchInlineSnapshot(`
818
- {
819
- "$schema": "https://json-schema.org/draft-2020-12/schema",
820
- "properties": {
821
- "age": {
822
- "type": "number",
823
- },
824
- "name": {
825
- "type": "string",
826
- },
827
- },
828
- "required": [
829
- "name",
830
- ],
831
- "type": "object",
832
- }
833
- `);
834
- });
835
-
836
- test("catchall interface", () => {
837
- const a = z.strictObject({
838
- name: z.string(),
839
- age: z.number(),
840
- });
841
-
842
- expect(toJSONSchema(a)).toMatchInlineSnapshot(`
843
- {
844
- "$schema": "https://json-schema.org/draft-2020-12/schema",
845
- "additionalProperties": false,
846
- "properties": {
847
- "age": {
848
- "type": "number",
849
- },
850
- "name": {
851
- "type": "string",
852
- },
853
- },
854
- "required": [
855
- "name",
856
- "age",
857
- ],
858
- "type": "object",
859
- }
860
- `);
861
-
862
- const b = z
863
- .object({
864
- name: z.string(),
865
- })
866
- .catchall(z.string());
867
-
868
- expect(toJSONSchema(b)).toMatchInlineSnapshot(`
869
- {
870
- "$schema": "https://json-schema.org/draft-2020-12/schema",
871
- "additionalProperties": {
872
- "type": "string",
873
- },
874
- "properties": {
875
- "name": {
876
- "type": "string",
877
- },
878
- },
879
- "required": [
880
- "name",
881
- ],
882
- "type": "object",
883
- }
884
- `);
885
-
886
- const c = z.looseObject({
887
- name: z.string(),
888
- });
889
-
890
- expect(toJSONSchema(c)).toMatchInlineSnapshot(`
891
- {
892
- "$schema": "https://json-schema.org/draft-2020-12/schema",
893
- "additionalProperties": {},
894
- "properties": {
895
- "name": {
896
- "type": "string",
897
- },
898
- },
899
- "required": [
900
- "name",
901
- ],
902
- "type": "object",
903
- }
904
- `);
905
- });
906
-
907
- test("recursive interface schemas", () => {
908
- const TreeNodeSchema = z.object({
909
- id: z.string(),
910
- get children() {
911
- return TreeNodeSchema;
912
- },
913
- });
914
-
915
- const result = toJSONSchema(TreeNodeSchema);
916
-
917
- // Should have definitions for recursive schema
918
- expect(JSON.stringify(result, null, 2)).toMatchInlineSnapshot(
919
- `
920
- "{
921
- "type": "object",
922
- "properties": {
923
- "id": {
924
- "type": "string"
925
- },
926
- "children": {
927
- "$ref": "#"
928
- }
929
- },
930
- "required": [
931
- "id",
932
- "children"
933
- ],
934
- "$schema": "https://json-schema.org/draft-2020-12/schema"
935
- }"
936
- `
937
- );
938
- });
939
-
940
- test("mutually recursive interface schemas", () => {
941
- const FolderSchema = z.object({
942
- name: z.string(),
943
- get files() {
944
- return z.array(FileSchema);
945
- },
946
- });
947
-
948
- const FileSchema = z.object({
949
- name: z.string(),
950
- get parent() {
951
- return FolderSchema;
952
- },
953
- });
954
-
955
- const result = toJSONSchema(FolderSchema);
956
-
957
- // Should have definitions for both schemas
958
- expect(JSON.stringify(result, null, 2)).toMatchInlineSnapshot(
959
- `
960
- "{
961
- "type": "object",
962
- "properties": {
963
- "name": {
964
- "type": "string"
965
- },
966
- "files": {
967
- "type": "array",
968
- "items": {
969
- "type": "object",
970
- "properties": {
971
- "name": {
972
- "type": "string"
973
- },
974
- "parent": {
975
- "$ref": "#"
976
- }
977
- },
978
- "required": [
979
- "name",
980
- "parent"
981
- ]
982
- }
983
- }
984
- },
985
- "required": [
986
- "name",
987
- "files"
988
- ],
989
- "$schema": "https://json-schema.org/draft-2020-12/schema"
990
- }"
991
- `
992
- );
993
- });
994
- });
995
-
996
- test("override", () => {
997
- const schema = z.toJSONSchema(z.string(), {
998
- override: (ctx) => {
999
- ctx.zodSchema;
1000
- ctx.jsonSchema;
1001
- ctx.jsonSchema.whatever = "sup";
1002
- },
1003
- });
1004
- expect(schema).toMatchInlineSnapshot(`
1005
- {
1006
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1007
- "type": "string",
1008
- "whatever": "sup",
1009
- }
1010
- `);
1011
- });
1012
-
1013
- test("override: do not run on references", () => {
1014
- let overrideCount = 0;
1015
- const schema = z
1016
- .union([z.string().date(), z.string().datetime(), z.string().datetime({ local: true })])
1017
- .meta({ a: true })
1018
- .transform((str) => new Date(str))
1019
- .meta({ b: true })
1020
- .pipe(z.date())
1021
- .meta({ c: true })
1022
- .brand("dateIn");
1023
- z.toJSONSchema(schema, {
1024
- unrepresentable: "any",
1025
- io: "input",
1026
- override(_) {
1027
- overrideCount++;
1028
- },
1029
- });
1030
-
1031
- expect(overrideCount).toBe(6);
1032
- });
1033
-
1034
- test("override with refs", () => {
1035
- const a = z.string().optional();
1036
- const result = z.toJSONSchema(a, {
1037
- override(ctx) {
1038
- if (ctx.zodSchema._zod.def.type === "string") {
1039
- ctx.jsonSchema.type = "STRING";
1040
- }
1041
- },
1042
- });
1043
-
1044
- expect(result).toMatchInlineSnapshot(`
1045
- {
1046
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1047
- "type": "STRING",
1048
- }
1049
- `);
1050
- });
1051
-
1052
- test("override execution order", () => {
1053
- const schema = z.union([z.string(), z.number()]);
1054
- let unionSchema!: any;
1055
- z.toJSONSchema(schema, {
1056
- override(ctx) {
1057
- if (ctx.zodSchema._zod.def.type === "union") {
1058
- unionSchema = ctx.jsonSchema;
1059
- }
1060
- },
1061
- });
1062
-
1063
- expect(unionSchema).toMatchInlineSnapshot(`
1064
- {
1065
- "anyOf": [
1066
- {
1067
- "type": "string",
1068
- },
1069
- {
1070
- "type": "number",
1071
- },
1072
- ],
1073
- }
1074
- `);
1075
- });
1076
-
1077
- test("pipe", () => {
1078
- const mySchema = z
1079
- .string()
1080
- .transform((val) => val.length)
1081
- .pipe(z.number());
1082
- // ZodPipe
1083
-
1084
- const a = z.toJSONSchema(mySchema);
1085
- expect(a).toMatchInlineSnapshot(`
1086
- {
1087
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1088
- "type": "number",
1089
- }
1090
- `);
1091
- // => { type: "number" }
1092
-
1093
- const b = z.toJSONSchema(mySchema, { io: "input" });
1094
- expect(b).toMatchInlineSnapshot(`
1095
- {
1096
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1097
- "type": "string",
1098
- }
1099
- `);
1100
- // => { type: "string" }
1101
- });
1102
-
1103
- test("passthrough schemas", () => {
1104
- const Internal = z.object({
1105
- num: z.number(),
1106
- str: z.string(),
1107
- });
1108
- //.meta({ id: "Internal" });
1109
-
1110
- const External = z.object({
1111
- a: Internal,
1112
- b: Internal.optional(),
1113
- c: z.lazy(() => Internal),
1114
- d: z.promise(Internal),
1115
- e: z.pipe(Internal, Internal),
1116
- });
1117
-
1118
- const result = z.toJSONSchema(External, {
1119
- reused: "ref",
1120
- });
1121
- expect(result).toMatchInlineSnapshot(`
1122
- {
1123
- "$defs": {
1124
- "__schema0": {
1125
- "properties": {
1126
- "num": {
1127
- "type": "number",
1128
- },
1129
- "str": {
1130
- "type": "string",
1131
- },
1132
- },
1133
- "required": [
1134
- "num",
1135
- "str",
1136
- ],
1137
- "type": "object",
1138
- },
1139
- },
1140
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1141
- "properties": {
1142
- "a": {
1143
- "$ref": "#/$defs/__schema0",
1144
- },
1145
- "b": {
1146
- "$ref": "#/$defs/__schema0",
1147
- },
1148
- "c": {
1149
- "$ref": "#/$defs/__schema0",
1150
- },
1151
- "d": {
1152
- "$ref": "#/$defs/__schema0",
1153
- },
1154
- "e": {
1155
- "$ref": "#/$defs/__schema0",
1156
- },
1157
- },
1158
- "required": [
1159
- "a",
1160
- "c",
1161
- "d",
1162
- "e",
1163
- ],
1164
- "type": "object",
1165
- }
1166
- `);
1167
- });
1168
-
1169
- test("extract schemas with id", () => {
1170
- const name = z.string().meta({ id: "name" });
1171
- const result = z.toJSONSchema(
1172
- z.object({
1173
- first_name: name,
1174
- last_name: name.nullable(),
1175
- middle_name: name.optional(),
1176
- age: z.number().meta({ id: "age" }),
1177
- })
1178
- );
1179
- expect(result).toMatchInlineSnapshot(`
1180
- {
1181
- "$defs": {
1182
- "age": {
1183
- "id": "age",
1184
- "type": "number",
1185
- },
1186
- "name": {
1187
- "id": "name",
1188
- "type": "string",
1189
- },
1190
- },
1191
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1192
- "properties": {
1193
- "age": {
1194
- "$ref": "#/$defs/age",
1195
- },
1196
- "first_name": {
1197
- "$ref": "#/$defs/name",
1198
- },
1199
- "last_name": {
1200
- "anyOf": [
1201
- {
1202
- "$ref": "#/$defs/name",
1203
- },
1204
- {
1205
- "type": "null",
1206
- },
1207
- ],
1208
- },
1209
- "middle_name": {
1210
- "$ref": "#/$defs/name",
1211
- },
1212
- },
1213
- "required": [
1214
- "first_name",
1215
- "last_name",
1216
- "age",
1217
- ],
1218
- "type": "object",
1219
- }
1220
- `);
1221
- });
1222
-
1223
- test("unrepresentable literal values are ignored", () => {
1224
- const a = z.toJSONSchema(z.literal(["hello", null, 5, BigInt(1324), undefined]), { unrepresentable: "any" });
1225
- expect(a).toMatchInlineSnapshot(`
1226
- {
1227
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1228
- "enum": [
1229
- "hello",
1230
- null,
1231
- 5,
1232
- 1324,
1233
- ],
1234
- }
1235
- `);
1236
-
1237
- const b = z.toJSONSchema(z.literal([undefined, null, 5, BigInt(1324)]), { unrepresentable: "any" });
1238
- expect(b).toMatchInlineSnapshot(`
1239
- {
1240
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1241
- "enum": [
1242
- null,
1243
- 5,
1244
- 1324,
1245
- ],
1246
- }
1247
- `);
1248
-
1249
- const c = z.toJSONSchema(z.literal([undefined]), { unrepresentable: "any" });
1250
- expect(c).toMatchInlineSnapshot(`
1251
- {
1252
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1253
- }
1254
- `);
1255
- });
1256
-
1257
- test("describe with id", () => {
1258
- const jobId = z.string().meta({ id: "jobId" });
1259
-
1260
- const a = z.toJSONSchema(
1261
- z.object({
1262
- current: jobId.describe("Current job"),
1263
- previous: jobId.describe("Previous job"),
1264
- })
1265
- );
1266
- expect(a).toMatchInlineSnapshot(`
1267
- {
1268
- "$defs": {
1269
- "jobId": {
1270
- "id": "jobId",
1271
- "type": "string",
1272
- },
1273
- },
1274
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1275
- "properties": {
1276
- "current": {
1277
- "$ref": "#/$defs/jobId",
1278
- "description": "Current job",
1279
- },
1280
- "previous": {
1281
- "$ref": "#/$defs/jobId",
1282
- "description": "Previous job",
1283
- },
1284
- },
1285
- "required": [
1286
- "current",
1287
- "previous",
1288
- ],
1289
- "type": "object",
1290
- }
1291
- `);
1292
- });
1293
-
1294
- test("overwrite id", () => {
1295
- const jobId = z.string().meta({ id: "aaa" });
1296
-
1297
- const a = z.toJSONSchema(
1298
- z.object({
1299
- current: jobId,
1300
- previous: jobId.meta({ id: "bbb" }),
1301
- })
1302
- );
1303
- expect(a).toMatchInlineSnapshot(`
1304
- {
1305
- "$defs": {
1306
- "aaa": {
1307
- "id": "aaa",
1308
- "type": "string",
1309
- },
1310
- "bbb": {
1311
- "$ref": "#/$defs/aaa",
1312
- "id": "bbb",
1313
- },
1314
- },
1315
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1316
- "properties": {
1317
- "current": {
1318
- "$ref": "#/$defs/aaa",
1319
- },
1320
- "previous": {
1321
- "$ref": "#/$defs/bbb",
1322
- },
1323
- },
1324
- "required": [
1325
- "current",
1326
- "previous",
1327
- ],
1328
- "type": "object",
1329
- }
1330
- `);
1331
-
1332
- const b = z.toJSONSchema(
1333
- z.object({
1334
- current: jobId,
1335
- previous: jobId.meta({ id: "ccc" }),
1336
- }),
1337
- {
1338
- reused: "ref",
1339
- }
1340
- );
1341
- expect(b).toMatchInlineSnapshot(`
1342
- {
1343
- "$defs": {
1344
- "aaa": {
1345
- "id": "aaa",
1346
- "type": "string",
1347
- },
1348
- "ccc": {
1349
- "$ref": "#/$defs/aaa",
1350
- "id": "ccc",
1351
- },
1352
- },
1353
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1354
- "properties": {
1355
- "current": {
1356
- "$ref": "#/$defs/aaa",
1357
- },
1358
- "previous": {
1359
- "$ref": "#/$defs/ccc",
1360
- },
1361
- },
1362
- "required": [
1363
- "current",
1364
- "previous",
1365
- ],
1366
- "type": "object",
1367
- }
1368
- `);
1369
- });
1370
-
1371
- test("overwrite descriptions", () => {
1372
- const field = z.string().describe("a").describe("b").describe("c");
1373
-
1374
- const a = z.toJSONSchema(
1375
- z.object({
1376
- d: field.describe("d"),
1377
- e: field.describe("e"),
1378
- })
1379
- );
1380
- expect(a).toMatchInlineSnapshot(`
1381
- {
1382
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1383
- "properties": {
1384
- "d": {
1385
- "description": "d",
1386
- "type": "string",
1387
- },
1388
- "e": {
1389
- "description": "e",
1390
- "type": "string",
1391
- },
1392
- },
1393
- "required": [
1394
- "d",
1395
- "e",
1396
- ],
1397
- "type": "object",
1398
- }
1399
- `);
1400
-
1401
- const b = z.toJSONSchema(
1402
- z.object({
1403
- d: field.describe("d"),
1404
- e: field.describe("e"),
1405
- }),
1406
- {
1407
- reused: "ref",
1408
- }
1409
- );
1410
- expect(b).toMatchInlineSnapshot(`
1411
- {
1412
- "$defs": {
1413
- "__schema0": {
1414
- "description": "c",
1415
- "type": "string",
1416
- },
1417
- },
1418
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1419
- "properties": {
1420
- "d": {
1421
- "$ref": "#/$defs/__schema0",
1422
- "description": "d",
1423
- },
1424
- "e": {
1425
- "$ref": "#/$defs/__schema0",
1426
- "description": "e",
1427
- },
1428
- },
1429
- "required": [
1430
- "d",
1431
- "e",
1432
- ],
1433
- "type": "object",
1434
- }
1435
- `);
1436
- });
1437
-
1438
- test("top-level readonly", () => {
1439
- const A = z
1440
- .object({
1441
- name: z.string(),
1442
- get b() {
1443
- return B;
1444
- },
1445
- })
1446
- .readonly()
1447
- .meta({ id: "A" });
1448
-
1449
- const B = z
1450
- .object({
1451
- name: z.string(),
1452
- get a() {
1453
- return A;
1454
- },
1455
- })
1456
- .readonly()
1457
- .meta({ id: "B" });
1458
-
1459
- const result = z.toJSONSchema(A);
1460
- expect(result).toMatchInlineSnapshot(`
1461
- {
1462
- "$defs": {
1463
- "B": {
1464
- "id": "B",
1465
- "properties": {
1466
- "a": {
1467
- "$ref": "#",
1468
- },
1469
- "name": {
1470
- "type": "string",
1471
- },
1472
- },
1473
- "readOnly": true,
1474
- "required": [
1475
- "name",
1476
- "a",
1477
- ],
1478
- "type": "object",
1479
- },
1480
- },
1481
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1482
- "id": "A",
1483
- "properties": {
1484
- "b": {
1485
- "$ref": "#/$defs/B",
1486
- },
1487
- "name": {
1488
- "type": "string",
1489
- },
1490
- },
1491
- "readOnly": true,
1492
- "required": [
1493
- "name",
1494
- "b",
1495
- ],
1496
- "type": "object",
1497
- }
1498
- `);
1499
- });
1500
-
1501
- test("basic registry", () => {
1502
- const myRegistry = z.registry<{ id: string }>();
1503
- const User = z.object({
1504
- name: z.string(),
1505
- get posts() {
1506
- return z.array(Post);
1507
- },
1508
- });
1509
-
1510
- const Post = z.object({
1511
- title: z.string(),
1512
- content: z.string(),
1513
- get author() {
1514
- return User;
1515
- },
1516
- });
1517
-
1518
- myRegistry.add(User, { id: "User" });
1519
- myRegistry.add(Post, { id: "Post" });
1520
-
1521
- const result = z.toJSONSchema(myRegistry);
1522
- expect(result).toMatchInlineSnapshot(`
1523
- {
1524
- "schemas": {
1525
- "Post": {
1526
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1527
- "properties": {
1528
- "author": {
1529
- "$ref": "User",
1530
- },
1531
- "content": {
1532
- "type": "string",
1533
- },
1534
- "title": {
1535
- "type": "string",
1536
- },
1537
- },
1538
- "required": [
1539
- "title",
1540
- "content",
1541
- "author",
1542
- ],
1543
- "type": "object",
1544
- },
1545
- "User": {
1546
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1547
- "properties": {
1548
- "name": {
1549
- "type": "string",
1550
- },
1551
- "posts": {
1552
- "items": {
1553
- "$ref": "Post",
1554
- },
1555
- "type": "array",
1556
- },
1557
- },
1558
- "required": [
1559
- "name",
1560
- "posts",
1561
- ],
1562
- "type": "object",
1563
- },
1564
- },
1565
- }
1566
- `);
1567
- });
1568
-
1569
- test("_ref", () => {
1570
- // const a = z.promise(z.string().describe("a"));
1571
- const a = z.toJSONSchema(z.promise(z.string().describe("a")));
1572
- expect(a).toMatchInlineSnapshot(`
1573
- {
1574
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1575
- "description": "a",
1576
- "type": "string",
1577
- }
1578
- `);
1579
-
1580
- const b = z.toJSONSchema(z.lazy(() => z.string().describe("a")));
1581
- expect(b).toMatchInlineSnapshot(`
1582
- {
1583
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1584
- "description": "a",
1585
- "type": "string",
1586
- }
1587
- `);
1588
-
1589
- const c = z.toJSONSchema(z.optional(z.string().describe("a")));
1590
- expect(c).toMatchInlineSnapshot(`
1591
- {
1592
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1593
- "description": "a",
1594
- "type": "string",
1595
- }
1596
- `);
1597
- });
1598
-
1599
- test("defaults/prefaults", () => {
1600
- const a = z
1601
- .string()
1602
- .transform((val) => val.length)
1603
- .pipe(z.number());
1604
- const b = a.prefault("hello");
1605
- const c = a.default(1234);
1606
-
1607
- // a
1608
- expect(toJSONSchema(a)).toMatchInlineSnapshot(`
1609
- {
1610
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1611
- "type": "number",
1612
- }
1613
- `);
1614
- expect(toJSONSchema(a, { io: "input" })).toMatchInlineSnapshot(`
1615
- {
1616
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1617
- "type": "string",
1618
- }
1619
- `);
1620
-
1621
- // b
1622
- expect(toJSONSchema(b)).toMatchInlineSnapshot(`
1623
- {
1624
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1625
- "type": "number",
1626
- }
1627
- `);
1628
- expect(toJSONSchema(b, { io: "input" })).toMatchInlineSnapshot(`
1629
- {
1630
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1631
- "default": "hello",
1632
- "type": "string",
1633
- }
1634
- `);
1635
- // c
1636
- expect(toJSONSchema(c)).toMatchInlineSnapshot(`
1637
- {
1638
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1639
- "default": 1234,
1640
- "type": "number",
1641
- }
1642
- `);
1643
- expect(toJSONSchema(c, { io: "input" })).toMatchInlineSnapshot(`
1644
- {
1645
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1646
- "default": 1234,
1647
- "type": "string",
1648
- }
1649
- `);
1650
- });
1651
-
1652
- test("input type", () => {
1653
- const schema = z.object({
1654
- a: z.string(),
1655
- b: z.string().optional(),
1656
- c: z.string().default("hello"),
1657
- d: z.string().nullable(),
1658
- e: z.string().prefault("hello"),
1659
- });
1660
- expect(toJSONSchema(schema, { io: "input" })).toMatchInlineSnapshot(`
1661
- {
1662
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1663
- "properties": {
1664
- "a": {
1665
- "type": "string",
1666
- },
1667
- "b": {
1668
- "type": "string",
1669
- },
1670
- "c": {
1671
- "default": "hello",
1672
- "type": "string",
1673
- },
1674
- "d": {
1675
- "anyOf": [
1676
- {
1677
- "type": "string",
1678
- },
1679
- {
1680
- "type": "null",
1681
- },
1682
- ],
1683
- },
1684
- "e": {
1685
- "default": "hello",
1686
- "type": "string",
1687
- },
1688
- },
1689
- "required": [
1690
- "a",
1691
- "d",
1692
- ],
1693
- "type": "object",
1694
- }
1695
- `);
1696
- expect(toJSONSchema(schema, { io: "output" })).toMatchInlineSnapshot(`
1697
- {
1698
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1699
- "properties": {
1700
- "a": {
1701
- "type": "string",
1702
- },
1703
- "b": {
1704
- "type": "string",
1705
- },
1706
- "c": {
1707
- "default": "hello",
1708
- "type": "string",
1709
- },
1710
- "d": {
1711
- "anyOf": [
1712
- {
1713
- "type": "string",
1714
- },
1715
- {
1716
- "type": "null",
1717
- },
1718
- ],
1719
- },
1720
- "e": {
1721
- "type": "string",
1722
- },
1723
- },
1724
- "required": [
1725
- "a",
1726
- "c",
1727
- "d",
1728
- "e",
1729
- ],
1730
- "type": "object",
1731
- }
1732
- `);
1733
- });
1734
-
1735
- test("examples on pipe", () => {
1736
- const schema = z
1737
- .string()
1738
- .meta({ examples: ["test"] })
1739
- .transform(Number)
1740
- // .pipe(z.transform(Number).meta({ examples: [4] }))
1741
- .meta({ examples: [4] });
1742
-
1743
- const i = z.toJSONSchema(schema, { io: "input", unrepresentable: "any" });
1744
- expect(i).toMatchInlineSnapshot(`
1745
- {
1746
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1747
- "examples": [
1748
- "test",
1749
- ],
1750
- "type": "string",
1751
- }
1752
- `);
1753
- const o = z.toJSONSchema(schema, { io: "output", unrepresentable: "any" });
1754
- expect(o).toMatchInlineSnapshot(`
1755
- {
1756
- "$schema": "https://json-schema.org/draft-2020-12/schema",
1757
- "examples": [
1758
- 4,
1759
- ],
1760
- }
1761
- `);
1762
- });
1763
-
1764
- // test("number checks", () => {
1765
- // expect(z.toJSONSchema(z.number().int())).toMatchInlineSnapshot(`
1766
- // {
1767
- // "maximum": 9007199254740991,
1768
- // "minimum": -9007199254740991,
1769
- // "type": "integer",
1770
- // }
1771
- // `);
1772
- // expect(z.toJSONSchema(z.int())).toMatchInlineSnapshot(`
1773
- // {
1774
- // "maximum": 9007199254740991,
1775
- // "minimum": -9007199254740991,
1776
- // "type": "integer",
1777
- // }
1778
- // `);
1779
- // expect(z.toJSONSchema(z.int().positive())).toMatchInlineSnapshot(`
1780
- // {
1781
- // "exclusiveMinimum": 0,
1782
- // "maximum": 9007199254740991,
1783
- // "minimum": -9007199254740991,
1784
- // "type": "integer",
1785
- // }
1786
- // `);
1787
- // expect(z.toJSONSchema(z.int().nonnegative())).toMatchInlineSnapshot(`
1788
- // {
1789
- // "maximum": 9007199254740991,
1790
- // "minimum": 0,
1791
- // "type": "integer",
1792
- // }
1793
- // `);
1794
- // expect(z.toJSONSchema(z.int().gt(0))).toMatchInlineSnapshot(`
1795
- // {
1796
- // "exclusiveMinimum": 0,
1797
- // "maximum": 9007199254740991,
1798
- // "minimum": -9007199254740991,
1799
- // "type": "integer",
1800
- // }
1801
- // `);
1802
- // expect(z.toJSONSchema(z.int().gte(0))).toMatchInlineSnapshot(`
1803
- // {
1804
- // "maximum": 9007199254740991,
1805
- // "minimum": 0,
1806
- // "type": "integer",
1807
- // }
1808
- // `);
1809
-
1810
- // });