fullstacked 0.12.1-1359 → 0.12.1-1364

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 (335) hide show
  1. package/fullstacked_modules/@fullstacked/ai-agent/ai-agent.js +55352 -53576
  2. package/fullstacked_modules/@fullstacked/ai-agent/index.ts +0 -1
  3. package/fullstacked_modules/@fullstacked/ai-agent/lock.json +157 -152
  4. package/fullstacked_modules/@fullstacked/ai-agent/package.json +13 -13
  5. package/fullstacked_modules/@fullstacked/ai-agent/src/providers/ollama.ts +2 -2
  6. package/fullstacked_modules/@fullstacked/ui/index.js +6 -1
  7. package/fullstacked_modules/zod/README.md +4 -4
  8. package/fullstacked_modules/zod/index.cjs +2 -2
  9. package/fullstacked_modules/zod/index.d.cts +2 -2
  10. package/fullstacked_modules/zod/index.d.ts +2 -2
  11. package/fullstacked_modules/zod/index.js +2 -2
  12. package/fullstacked_modules/zod/locales/index.cjs +17 -0
  13. package/fullstacked_modules/zod/locales/index.d.cts +1 -0
  14. package/fullstacked_modules/zod/locales/index.d.ts +1 -0
  15. package/fullstacked_modules/zod/locales/index.js +1 -0
  16. package/fullstacked_modules/zod/locales/package.json +6 -0
  17. package/fullstacked_modules/zod/mini/index.cjs +17 -0
  18. package/fullstacked_modules/zod/mini/index.d.cts +1 -0
  19. package/fullstacked_modules/zod/mini/index.d.ts +1 -0
  20. package/fullstacked_modules/zod/mini/index.js +1 -0
  21. package/fullstacked_modules/zod/mini/package.json +6 -0
  22. package/fullstacked_modules/zod/package.json +29 -12
  23. package/fullstacked_modules/zod/src/index.ts +2 -2
  24. package/fullstacked_modules/zod/src/locales/index.ts +1 -0
  25. package/fullstacked_modules/zod/src/mini/index.ts +1 -0
  26. package/fullstacked_modules/zod/src/v3/ZodError.ts +1 -1
  27. package/fullstacked_modules/zod/src/v3/tests/object.test.ts +2 -2
  28. package/fullstacked_modules/zod/src/v3/tests/string.test.ts +2 -2
  29. package/fullstacked_modules/zod/src/v3/types.ts +3 -1
  30. package/fullstacked_modules/zod/src/v4/classic/checks.ts +1 -0
  31. package/fullstacked_modules/zod/src/v4/classic/compat.ts +4 -0
  32. package/fullstacked_modules/zod/src/v4/classic/errors.ts +9 -2
  33. package/fullstacked_modules/zod/src/v4/classic/external.ts +1 -1
  34. package/fullstacked_modules/zod/src/v4/classic/parse.ts +49 -0
  35. package/fullstacked_modules/zod/src/v4/classic/schemas.ts +224 -81
  36. package/fullstacked_modules/zod/src/v4/classic/tests/array.test.ts +6 -6
  37. package/fullstacked_modules/zod/src/v4/classic/tests/catch.test.ts +29 -5
  38. package/fullstacked_modules/zod/src/v4/classic/tests/codec-examples.test.ts +573 -0
  39. package/fullstacked_modules/zod/src/v4/classic/tests/codec.test.ts +562 -0
  40. package/fullstacked_modules/zod/src/v4/classic/tests/continuability.test.ts +1 -1
  41. package/fullstacked_modules/zod/src/v4/classic/tests/datetime.test.ts +6 -0
  42. package/fullstacked_modules/zod/src/v4/classic/tests/default.test.ts +52 -0
  43. package/fullstacked_modules/zod/src/v4/classic/tests/discriminated-unions.test.ts +42 -0
  44. package/fullstacked_modules/zod/src/v4/classic/tests/error-utils.test.ts +70 -2
  45. package/fullstacked_modules/zod/src/v4/classic/tests/file.test.ts +9 -4
  46. package/fullstacked_modules/zod/src/v4/classic/tests/firstparty.test.ts +4 -0
  47. package/fullstacked_modules/zod/src/v4/classic/tests/function.test.ts +71 -31
  48. package/fullstacked_modules/zod/src/v4/classic/tests/hash.test.ts +68 -0
  49. package/fullstacked_modules/zod/src/v4/classic/tests/index.test.ts +15 -0
  50. package/fullstacked_modules/zod/src/v4/classic/tests/literal.test.ts +25 -0
  51. package/fullstacked_modules/zod/src/v4/classic/tests/nonoptional.test.ts +15 -0
  52. package/fullstacked_modules/zod/src/v4/classic/tests/number.test.ts +23 -0
  53. package/fullstacked_modules/zod/src/v4/classic/tests/object.test.ts +48 -2
  54. package/fullstacked_modules/zod/src/v4/classic/tests/optional.test.ts +13 -0
  55. package/fullstacked_modules/zod/src/v4/classic/tests/partial.test.ts +193 -0
  56. package/fullstacked_modules/zod/src/v4/classic/tests/pickomit.test.ts +5 -5
  57. package/fullstacked_modules/zod/src/v4/classic/tests/pipe.test.ts +25 -5
  58. package/fullstacked_modules/zod/src/v4/classic/tests/prefault.test.ts +37 -0
  59. package/fullstacked_modules/zod/src/v4/classic/tests/preprocess.test.ts +5 -21
  60. package/fullstacked_modules/zod/src/v4/classic/tests/record.test.ts +15 -1
  61. package/fullstacked_modules/zod/src/v4/classic/tests/recursive-types.test.ts +226 -0
  62. package/fullstacked_modules/zod/src/v4/classic/tests/refine.test.ts +78 -5
  63. package/fullstacked_modules/zod/src/v4/classic/tests/set.test.ts +5 -3
  64. package/fullstacked_modules/zod/src/v4/classic/tests/string-formats.test.ts +16 -0
  65. package/fullstacked_modules/zod/src/v4/classic/tests/string.test.ts +204 -5
  66. package/fullstacked_modules/zod/src/v4/classic/tests/stringbool.test.ts +40 -0
  67. package/fullstacked_modules/zod/src/v4/classic/tests/template-literal.test.ts +14 -9
  68. package/fullstacked_modules/zod/src/v4/classic/tests/to-json-schema.test.ts +315 -7
  69. package/fullstacked_modules/zod/src/v4/classic/tests/transform.test.ts +111 -0
  70. package/fullstacked_modules/zod/src/v4/classic/tests/tuple.test.ts +2 -2
  71. package/fullstacked_modules/zod/src/v4/classic/tests/union.test.ts +90 -3
  72. package/fullstacked_modules/zod/src/v4/core/api.ts +160 -133
  73. package/fullstacked_modules/zod/src/v4/core/checks.ts +6 -2
  74. package/fullstacked_modules/zod/src/v4/core/core.ts +9 -28
  75. package/fullstacked_modules/zod/src/v4/core/doc.ts +2 -2
  76. package/fullstacked_modules/zod/src/v4/core/errors.ts +49 -60
  77. package/fullstacked_modules/zod/src/v4/core/index.ts +0 -1
  78. package/fullstacked_modules/zod/src/v4/core/json-schema.ts +7 -3
  79. package/fullstacked_modules/zod/src/v4/core/parse.ts +101 -0
  80. package/fullstacked_modules/zod/src/v4/core/regexes.ts +56 -14
  81. package/fullstacked_modules/zod/src/v4/core/registries.ts +5 -4
  82. package/fullstacked_modules/zod/src/v4/core/schemas.ts +705 -230
  83. package/fullstacked_modules/zod/src/v4/core/tests/extend.test.ts +18 -0
  84. package/fullstacked_modules/zod/src/v4/core/tests/locales/es.test.ts +181 -0
  85. package/fullstacked_modules/zod/src/v4/core/to-json-schema.ts +100 -33
  86. package/fullstacked_modules/zod/src/v4/core/util.ts +237 -102
  87. package/fullstacked_modules/zod/src/v4/core/versions.ts +2 -2
  88. package/fullstacked_modules/zod/src/v4/locales/bg.ts +136 -0
  89. package/fullstacked_modules/zod/src/v4/locales/da.ts +141 -0
  90. package/fullstacked_modules/zod/src/v4/locales/es.ts +44 -10
  91. package/fullstacked_modules/zod/src/v4/locales/index.ts +8 -0
  92. package/fullstacked_modules/zod/src/v4/locales/is.ts +127 -0
  93. package/fullstacked_modules/zod/src/v4/locales/ka.ts +138 -0
  94. package/fullstacked_modules/zod/src/v4/locales/kh.ts +3 -122
  95. package/fullstacked_modules/zod/src/v4/locales/km.ts +126 -0
  96. package/fullstacked_modules/zod/src/v4/locales/lt.ts +265 -0
  97. package/fullstacked_modules/zod/src/v4/locales/ua.ts +3 -122
  98. package/fullstacked_modules/zod/src/v4/locales/uk.ts +126 -0
  99. package/fullstacked_modules/zod/src/v4/locales/yo.ts +131 -0
  100. package/fullstacked_modules/zod/src/v4/mini/external.ts +1 -1
  101. package/fullstacked_modules/zod/src/v4/mini/parse.ts +14 -1
  102. package/fullstacked_modules/zod/src/v4/mini/schemas.ts +186 -40
  103. package/fullstacked_modules/zod/src/v4/mini/tests/assignability.test.ts +1 -1
  104. package/fullstacked_modules/zod/src/v4/mini/tests/codec.test.ts +529 -0
  105. package/fullstacked_modules/zod/src/v4/mini/tests/computed.test.ts +1 -1
  106. package/fullstacked_modules/zod/src/v4/mini/tests/error.test.ts +1 -1
  107. package/fullstacked_modules/zod/src/v4/mini/tests/index.test.ts +29 -1
  108. package/fullstacked_modules/zod/src/v4/mini/tests/number.test.ts +1 -1
  109. package/fullstacked_modules/zod/src/v4/mini/tests/object.test.ts +16 -1
  110. package/fullstacked_modules/zod/src/v4/mini/tests/prototypes.test.ts +1 -1
  111. package/fullstacked_modules/zod/src/v4/mini/tests/recursive-types.test.ts +1 -1
  112. package/fullstacked_modules/zod/src/v4/mini/tests/string.test.ts +17 -1
  113. package/fullstacked_modules/zod/v3/ZodError.cjs +1 -1
  114. package/fullstacked_modules/zod/v3/ZodError.d.cts +6 -6
  115. package/fullstacked_modules/zod/v3/ZodError.d.ts +6 -6
  116. package/fullstacked_modules/zod/v3/ZodError.js +1 -1
  117. package/fullstacked_modules/zod/v3/locales/en.cjs +1 -0
  118. package/fullstacked_modules/zod/v3/locales/en.d.cts +1 -1
  119. package/fullstacked_modules/zod/v3/package.json +6 -0
  120. package/fullstacked_modules/zod/v3/types.cjs +2 -0
  121. package/fullstacked_modules/zod/v3/types.d.cts +4 -1
  122. package/fullstacked_modules/zod/v3/types.d.ts +4 -1
  123. package/fullstacked_modules/zod/v3/types.js +2 -0
  124. package/fullstacked_modules/zod/v4/classic/checks.d.cts +1 -1
  125. package/fullstacked_modules/zod/v4/classic/checks.d.ts +1 -1
  126. package/fullstacked_modules/zod/v4/classic/compat.cjs +5 -1
  127. package/fullstacked_modules/zod/v4/classic/compat.d.cts +4 -0
  128. package/fullstacked_modules/zod/v4/classic/compat.d.ts +4 -0
  129. package/fullstacked_modules/zod/v4/classic/compat.js +4 -0
  130. package/fullstacked_modules/zod/v4/classic/errors.cjs +9 -2
  131. package/fullstacked_modules/zod/v4/classic/errors.js +9 -2
  132. package/fullstacked_modules/zod/v4/classic/external.cjs +2 -2
  133. package/fullstacked_modules/zod/v4/classic/external.d.cts +1 -1
  134. package/fullstacked_modules/zod/v4/classic/external.d.ts +1 -1
  135. package/fullstacked_modules/zod/v4/classic/external.js +1 -1
  136. package/fullstacked_modules/zod/v4/classic/package.json +6 -0
  137. package/fullstacked_modules/zod/v4/classic/parse.cjs +10 -1
  138. package/fullstacked_modules/zod/v4/classic/parse.d.cts +8 -0
  139. package/fullstacked_modules/zod/v4/classic/parse.d.ts +8 -0
  140. package/fullstacked_modules/zod/v4/classic/parse.js +9 -0
  141. package/fullstacked_modules/zod/v4/classic/schemas.cjs +90 -48
  142. package/fullstacked_modules/zod/v4/classic/schemas.d.cts +70 -27
  143. package/fullstacked_modules/zod/v4/classic/schemas.d.ts +70 -27
  144. package/fullstacked_modules/zod/v4/classic/schemas.js +81 -47
  145. package/fullstacked_modules/zod/v4/core/api.cjs +52 -31
  146. package/fullstacked_modules/zod/v4/core/api.d.cts +87 -76
  147. package/fullstacked_modules/zod/v4/core/api.d.ts +87 -76
  148. package/fullstacked_modules/zod/v4/core/api.js +50 -31
  149. package/fullstacked_modules/zod/v4/core/checks.cjs +4 -0
  150. package/fullstacked_modules/zod/v4/core/checks.d.cts +2 -2
  151. package/fullstacked_modules/zod/v4/core/checks.d.ts +2 -2
  152. package/fullstacked_modules/zod/v4/core/checks.js +4 -0
  153. package/fullstacked_modules/zod/v4/core/core.cjs +8 -1
  154. package/fullstacked_modules/zod/v4/core/core.d.cts +5 -2
  155. package/fullstacked_modules/zod/v4/core/core.d.ts +5 -2
  156. package/fullstacked_modules/zod/v4/core/core.js +6 -0
  157. package/fullstacked_modules/zod/v4/core/doc.d.cts +1 -1
  158. package/fullstacked_modules/zod/v4/core/doc.d.ts +1 -1
  159. package/fullstacked_modules/zod/v4/core/errors.cjs +6 -19
  160. package/fullstacked_modules/zod/v4/core/errors.d.cts +24 -22
  161. package/fullstacked_modules/zod/v4/core/errors.d.ts +24 -22
  162. package/fullstacked_modules/zod/v4/core/errors.js +6 -19
  163. package/fullstacked_modules/zod/v4/core/index.cjs +0 -1
  164. package/fullstacked_modules/zod/v4/core/index.d.cts +0 -1
  165. package/fullstacked_modules/zod/v4/core/index.d.ts +0 -1
  166. package/fullstacked_modules/zod/v4/core/index.js +0 -1
  167. package/fullstacked_modules/zod/v4/core/json-schema.d.cts +4 -3
  168. package/fullstacked_modules/zod/v4/core/json-schema.d.ts +4 -3
  169. package/fullstacked_modules/zod/v4/core/package.json +6 -0
  170. package/fullstacked_modules/zod/v4/core/parse.cjs +45 -1
  171. package/fullstacked_modules/zod/v4/core/parse.d.cts +24 -0
  172. package/fullstacked_modules/zod/v4/core/parse.d.ts +24 -0
  173. package/fullstacked_modules/zod/v4/core/parse.js +36 -0
  174. package/fullstacked_modules/zod/v4/core/regexes.cjs +49 -16
  175. package/fullstacked_modules/zod/v4/core/regexes.d.cts +18 -2
  176. package/fullstacked_modules/zod/v4/core/regexes.d.ts +18 -2
  177. package/fullstacked_modules/zod/v4/core/regexes.js +46 -14
  178. package/fullstacked_modules/zod/v4/core/registries.cjs +4 -3
  179. package/fullstacked_modules/zod/v4/core/registries.d.cts +2 -2
  180. package/fullstacked_modules/zod/v4/core/registries.d.ts +2 -2
  181. package/fullstacked_modules/zod/v4/core/registries.js +4 -3
  182. package/fullstacked_modules/zod/v4/core/schemas.cjs +409 -171
  183. package/fullstacked_modules/zod/v4/core/schemas.d.cts +88 -16
  184. package/fullstacked_modules/zod/v4/core/schemas.d.ts +88 -16
  185. package/fullstacked_modules/zod/v4/core/schemas.js +408 -170
  186. package/fullstacked_modules/zod/v4/core/to-json-schema.cjs +97 -31
  187. package/fullstacked_modules/zod/v4/core/to-json-schema.d.cts +5 -3
  188. package/fullstacked_modules/zod/v4/core/to-json-schema.d.ts +5 -3
  189. package/fullstacked_modules/zod/v4/core/to-json-schema.js +97 -31
  190. package/fullstacked_modules/zod/v4/core/util.cjs +220 -101
  191. package/fullstacked_modules/zod/v4/core/util.d.cts +14 -0
  192. package/fullstacked_modules/zod/v4/core/util.d.ts +14 -0
  193. package/fullstacked_modules/zod/v4/core/util.js +209 -101
  194. package/fullstacked_modules/zod/v4/core/versions.cjs +2 -2
  195. package/fullstacked_modules/zod/v4/core/versions.d.cts +1 -1
  196. package/fullstacked_modules/zod/v4/core/versions.d.ts +1 -1
  197. package/fullstacked_modules/zod/v4/core/versions.js +2 -2
  198. package/fullstacked_modules/zod/v4/locales/ar.cjs +1 -0
  199. package/fullstacked_modules/zod/v4/locales/ar.d.cts +2 -1
  200. package/fullstacked_modules/zod/v4/locales/az.cjs +1 -0
  201. package/fullstacked_modules/zod/v4/locales/az.d.cts +2 -1
  202. package/fullstacked_modules/zod/v4/locales/be.cjs +1 -0
  203. package/fullstacked_modules/zod/v4/locales/be.d.cts +2 -1
  204. package/fullstacked_modules/zod/v4/locales/bg.cjs +156 -0
  205. package/fullstacked_modules/zod/v4/locales/bg.d.cts +5 -0
  206. package/fullstacked_modules/zod/v4/locales/bg.d.ts +5 -0
  207. package/fullstacked_modules/zod/v4/locales/bg.js +128 -0
  208. package/fullstacked_modules/zod/v4/locales/ca.cjs +1 -0
  209. package/fullstacked_modules/zod/v4/locales/ca.d.cts +2 -1
  210. package/fullstacked_modules/zod/v4/locales/cs.cjs +1 -0
  211. package/fullstacked_modules/zod/v4/locales/cs.d.cts +2 -1
  212. package/fullstacked_modules/zod/v4/locales/da.cjs +158 -0
  213. package/fullstacked_modules/zod/v4/locales/da.d.cts +5 -0
  214. package/fullstacked_modules/zod/v4/locales/da.d.ts +4 -0
  215. package/fullstacked_modules/zod/v4/locales/da.js +131 -0
  216. package/fullstacked_modules/zod/v4/locales/de.cjs +1 -0
  217. package/fullstacked_modules/zod/v4/locales/de.d.cts +2 -1
  218. package/fullstacked_modules/zod/v4/locales/es.cjs +43 -10
  219. package/fullstacked_modules/zod/v4/locales/es.d.cts +2 -1
  220. package/fullstacked_modules/zod/v4/locales/es.js +42 -10
  221. package/fullstacked_modules/zod/v4/locales/fa.cjs +1 -0
  222. package/fullstacked_modules/zod/v4/locales/fa.d.cts +2 -1
  223. package/fullstacked_modules/zod/v4/locales/fi.cjs +1 -0
  224. package/fullstacked_modules/zod/v4/locales/fi.d.cts +2 -1
  225. package/fullstacked_modules/zod/v4/locales/fr-CA.cjs +1 -0
  226. package/fullstacked_modules/zod/v4/locales/fr-CA.d.cts +2 -1
  227. package/fullstacked_modules/zod/v4/locales/fr.cjs +1 -0
  228. package/fullstacked_modules/zod/v4/locales/fr.d.cts +2 -1
  229. package/fullstacked_modules/zod/v4/locales/he.cjs +1 -0
  230. package/fullstacked_modules/zod/v4/locales/he.d.cts +2 -1
  231. package/fullstacked_modules/zod/v4/locales/hu.cjs +1 -0
  232. package/fullstacked_modules/zod/v4/locales/hu.d.cts +2 -1
  233. package/fullstacked_modules/zod/v4/locales/id.cjs +1 -0
  234. package/fullstacked_modules/zod/v4/locales/id.d.cts +2 -1
  235. package/fullstacked_modules/zod/v4/locales/index.cjs +17 -1
  236. package/fullstacked_modules/zod/v4/locales/index.d.cts +8 -0
  237. package/fullstacked_modules/zod/v4/locales/index.d.ts +8 -0
  238. package/fullstacked_modules/zod/v4/locales/index.js +8 -0
  239. package/fullstacked_modules/zod/v4/locales/is.cjs +145 -0
  240. package/fullstacked_modules/zod/v4/locales/is.d.cts +5 -0
  241. package/fullstacked_modules/zod/v4/locales/is.d.ts +5 -0
  242. package/fullstacked_modules/zod/v4/locales/is.js +117 -0
  243. package/fullstacked_modules/zod/v4/locales/it.cjs +1 -0
  244. package/fullstacked_modules/zod/v4/locales/it.d.cts +2 -1
  245. package/fullstacked_modules/zod/v4/locales/ja.cjs +1 -0
  246. package/fullstacked_modules/zod/v4/locales/ja.d.cts +2 -1
  247. package/fullstacked_modules/zod/v4/locales/ka.cjs +153 -0
  248. package/fullstacked_modules/zod/v4/locales/ka.d.cts +5 -0
  249. package/fullstacked_modules/zod/v4/locales/ka.d.ts +5 -0
  250. package/fullstacked_modules/zod/v4/locales/ka.js +125 -0
  251. package/fullstacked_modules/zod/v4/locales/kh.cjs +6 -137
  252. package/fullstacked_modules/zod/v4/locales/kh.d.cts +2 -1
  253. package/fullstacked_modules/zod/v4/locales/kh.d.ts +1 -0
  254. package/fullstacked_modules/zod/v4/locales/kh.js +3 -115
  255. package/fullstacked_modules/zod/v4/locales/km.cjs +144 -0
  256. package/fullstacked_modules/zod/v4/locales/km.d.cts +5 -0
  257. package/fullstacked_modules/zod/v4/locales/km.d.ts +4 -0
  258. package/fullstacked_modules/zod/v4/locales/km.js +117 -0
  259. package/fullstacked_modules/zod/v4/locales/ko.cjs +1 -0
  260. package/fullstacked_modules/zod/v4/locales/ko.d.cts +2 -1
  261. package/fullstacked_modules/zod/v4/locales/lt.cjs +258 -0
  262. package/fullstacked_modules/zod/v4/locales/lt.d.cts +5 -0
  263. package/fullstacked_modules/zod/v4/locales/lt.d.ts +5 -0
  264. package/fullstacked_modules/zod/v4/locales/lt.js +230 -0
  265. package/fullstacked_modules/zod/v4/locales/mk.cjs +1 -0
  266. package/fullstacked_modules/zod/v4/locales/mk.d.cts +2 -1
  267. package/fullstacked_modules/zod/v4/locales/ms.cjs +1 -0
  268. package/fullstacked_modules/zod/v4/locales/ms.d.cts +2 -1
  269. package/fullstacked_modules/zod/v4/locales/nl.cjs +1 -0
  270. package/fullstacked_modules/zod/v4/locales/nl.d.cts +2 -1
  271. package/fullstacked_modules/zod/v4/locales/no.cjs +1 -0
  272. package/fullstacked_modules/zod/v4/locales/no.d.cts +2 -1
  273. package/fullstacked_modules/zod/v4/locales/ota.cjs +1 -0
  274. package/fullstacked_modules/zod/v4/locales/ota.d.cts +2 -1
  275. package/fullstacked_modules/zod/v4/locales/package.json +6 -0
  276. package/fullstacked_modules/zod/v4/locales/pl.cjs +1 -0
  277. package/fullstacked_modules/zod/v4/locales/pl.d.cts +2 -1
  278. package/fullstacked_modules/zod/v4/locales/ps.cjs +1 -0
  279. package/fullstacked_modules/zod/v4/locales/ps.d.cts +2 -1
  280. package/fullstacked_modules/zod/v4/locales/pt.cjs +1 -0
  281. package/fullstacked_modules/zod/v4/locales/pt.d.cts +2 -1
  282. package/fullstacked_modules/zod/v4/locales/ru.cjs +1 -0
  283. package/fullstacked_modules/zod/v4/locales/ru.d.cts +2 -1
  284. package/fullstacked_modules/zod/v4/locales/sl.cjs +1 -0
  285. package/fullstacked_modules/zod/v4/locales/sl.d.cts +2 -1
  286. package/fullstacked_modules/zod/v4/locales/sv.cjs +1 -0
  287. package/fullstacked_modules/zod/v4/locales/sv.d.cts +2 -1
  288. package/fullstacked_modules/zod/v4/locales/ta.cjs +1 -0
  289. package/fullstacked_modules/zod/v4/locales/ta.d.cts +2 -1
  290. package/fullstacked_modules/zod/v4/locales/th.cjs +1 -0
  291. package/fullstacked_modules/zod/v4/locales/th.d.cts +2 -1
  292. package/fullstacked_modules/zod/v4/locales/ua.cjs +6 -137
  293. package/fullstacked_modules/zod/v4/locales/ua.d.cts +2 -1
  294. package/fullstacked_modules/zod/v4/locales/ua.d.ts +1 -0
  295. package/fullstacked_modules/zod/v4/locales/ua.js +3 -115
  296. package/fullstacked_modules/zod/v4/locales/uk.cjs +144 -0
  297. package/fullstacked_modules/zod/v4/locales/uk.d.cts +5 -0
  298. package/fullstacked_modules/zod/v4/locales/uk.d.ts +4 -0
  299. package/fullstacked_modules/zod/v4/locales/uk.js +117 -0
  300. package/fullstacked_modules/zod/v4/locales/ur.cjs +1 -0
  301. package/fullstacked_modules/zod/v4/locales/ur.d.cts +2 -1
  302. package/fullstacked_modules/zod/v4/locales/vi.cjs +1 -0
  303. package/fullstacked_modules/zod/v4/locales/vi.d.cts +2 -1
  304. package/fullstacked_modules/zod/v4/locales/yo.cjs +142 -0
  305. package/fullstacked_modules/zod/v4/locales/yo.d.cts +5 -0
  306. package/fullstacked_modules/zod/v4/locales/yo.d.ts +4 -0
  307. package/fullstacked_modules/zod/v4/locales/yo.js +115 -0
  308. package/fullstacked_modules/zod/v4/locales/zh-CN.cjs +1 -0
  309. package/fullstacked_modules/zod/v4/locales/zh-CN.d.cts +2 -1
  310. package/fullstacked_modules/zod/v4/locales/zh-TW.cjs +1 -0
  311. package/fullstacked_modules/zod/v4/locales/zh-TW.d.cts +2 -1
  312. package/fullstacked_modules/zod/v4/mini/external.cjs +2 -2
  313. package/fullstacked_modules/zod/v4/mini/external.d.cts +1 -1
  314. package/fullstacked_modules/zod/v4/mini/external.d.ts +1 -1
  315. package/fullstacked_modules/zod/v4/mini/external.js +1 -1
  316. package/fullstacked_modules/zod/v4/mini/package.json +6 -0
  317. package/fullstacked_modules/zod/v4/mini/parse.cjs +9 -1
  318. package/fullstacked_modules/zod/v4/mini/parse.d.cts +1 -1
  319. package/fullstacked_modules/zod/v4/mini/parse.d.ts +1 -1
  320. package/fullstacked_modules/zod/v4/mini/parse.js +1 -1
  321. package/fullstacked_modules/zod/v4/mini/schemas.cjs +77 -24
  322. package/fullstacked_modules/zod/v4/mini/schemas.d.cts +56 -5
  323. package/fullstacked_modules/zod/v4/mini/schemas.d.ts +56 -5
  324. package/fullstacked_modules/zod/v4/mini/schemas.js +66 -23
  325. package/fullstacked_modules/zod/v4/package.json +6 -0
  326. package/fullstacked_modules/zod/v4-mini/package.json +6 -0
  327. package/index.js +1 -1
  328. package/package.json +1 -1
  329. package/fullstacked_modules/@fullstacked/ai-agent/story.txt +0 -7
  330. package/fullstacked_modules/@fullstacked/ai-agent/summary.txt +0 -7
  331. package/fullstacked_modules/zod/src/v4/core/function.ts +0 -176
  332. package/fullstacked_modules/zod/v4/core/function.cjs +0 -102
  333. package/fullstacked_modules/zod/v4/core/function.d.cts +0 -52
  334. package/fullstacked_modules/zod/v4/core/function.d.ts +0 -52
  335. package/fullstacked_modules/zod/v4/core/function.js +0 -75
@@ -0,0 +1,529 @@
1
+ import { expect, expectTypeOf, test } from "vitest";
2
+ import { en } from "zod/locales";
3
+ import * as z from "zod/mini";
4
+
5
+ z.config(en());
6
+
7
+ const isoDateCodec = z.codec(
8
+ z.iso.datetime(), // Input: ISO string (validates to string)
9
+ z.date(), // Output: Date object
10
+ {
11
+ decode: (isoString) => new Date(isoString), // Forward: ISO string → Date
12
+ encode: (date) => date.toISOString(), // Backward: Date → ISO string
13
+ }
14
+ );
15
+
16
+ test("instanceof", () => {
17
+ expect(isoDateCodec instanceof z.ZodMiniCodec).toBe(true);
18
+ expect(isoDateCodec instanceof z.ZodMiniPipe).toBe(true);
19
+ expect(isoDateCodec instanceof z.ZodMiniType).toBe(true);
20
+ expect(isoDateCodec instanceof z.core.$ZodCodec).toBe(true);
21
+ expect(isoDateCodec instanceof z.core.$ZodPipe).toBe(true);
22
+ expect(isoDateCodec instanceof z.core.$ZodType).toBe(true);
23
+
24
+ expectTypeOf(isoDateCodec.def).toEqualTypeOf<z.core.$ZodCodecDef<z.ZodMiniISODateTime, z.ZodMiniDate<Date>>>();
25
+ });
26
+
27
+ test("codec basic functionality", () => {
28
+ // ISO string -> Date codec using z.iso.datetime() for input validation
29
+
30
+ const testIsoString = "2024-01-15T10:30:00.000Z";
31
+ const testDate = new Date("2024-01-15T10:30:00.000Z");
32
+
33
+ // Forward decoding (ISO string -> Date)
34
+ const decodedResult = z.decode(isoDateCodec, testIsoString);
35
+ expect(decodedResult).toBeInstanceOf(Date);
36
+ expect(decodedResult.toISOString()).toMatchInlineSnapshot(`"2024-01-15T10:30:00.000Z"`);
37
+
38
+ // Backward encoding (Date -> ISO string)
39
+ const encodedResult = z.encode(isoDateCodec, testDate);
40
+ expect(typeof encodedResult).toBe("string");
41
+ expect(encodedResult).toMatchInlineSnapshot(`"2024-01-15T10:30:00.000Z"`);
42
+ });
43
+
44
+ test("codec round trip", () => {
45
+ const isoDateCodec = z.codec(z.iso.datetime(), z.date(), {
46
+ decode: (isoString) => new Date(isoString),
47
+ encode: (date) => date.toISOString(),
48
+ });
49
+
50
+ const original = "2024-12-25T15:45:30.123Z";
51
+ const toDate = z.decode(isoDateCodec, original);
52
+ const backToString = z.encode(isoDateCodec, toDate);
53
+
54
+ expect(backToString).toMatchInlineSnapshot(`"2024-12-25T15:45:30.123Z"`);
55
+ expect(toDate).toBeInstanceOf(Date);
56
+ expect(toDate.getTime()).toMatchInlineSnapshot(`1735141530123`);
57
+ });
58
+
59
+ test("codec with refinement", () => {
60
+ const isoDateCodec = z
61
+ .codec(z.iso.datetime(), z.date(), {
62
+ decode: (isoString) => new Date(isoString),
63
+ encode: (date) => date.toISOString(),
64
+ })
65
+ .check(z.refine((val) => val.getFullYear() === 2024, { error: "Year must be 2024" }));
66
+
67
+ // Valid 2024 date
68
+ const validDate = z.decode(isoDateCodec, "2024-01-15T10:30:00.000Z");
69
+ expect(validDate.getFullYear()).toMatchInlineSnapshot(`2024`);
70
+ expect(validDate.getTime()).toMatchInlineSnapshot(`1705314600000`);
71
+
72
+ // Invalid year should fail safely
73
+ const invalidYearResult = z.safeDecode(isoDateCodec, "2023-01-15T10:30:00.000Z");
74
+ expect(invalidYearResult.success).toBe(false);
75
+ if (!invalidYearResult.success) {
76
+ expect(invalidYearResult.error.issues).toMatchInlineSnapshot(`
77
+ [
78
+ {
79
+ "code": "custom",
80
+ "message": "Year must be 2024",
81
+ "path": [],
82
+ },
83
+ ]
84
+ `);
85
+ }
86
+ });
87
+
88
+ test("safe codec operations", () => {
89
+ const isoDateCodec = z.codec(z.iso.datetime(), z.date(), {
90
+ decode: (isoString) => new Date(isoString),
91
+ encode: (date) => date.toISOString(),
92
+ });
93
+
94
+ // Safe decode with invalid input
95
+ const safeDecodeResult = z.safeDecode(isoDateCodec, "invalid-date");
96
+ expect(safeDecodeResult.success).toBe(false);
97
+ if (!safeDecodeResult.success) {
98
+ expect(safeDecodeResult.error.issues).toMatchInlineSnapshot(`
99
+ [
100
+ {
101
+ "code": "invalid_format",
102
+ "format": "datetime",
103
+ "message": "Invalid ISO datetime",
104
+ "origin": "string",
105
+ "path": [],
106
+ "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))$/",
107
+ },
108
+ ]
109
+ `);
110
+ }
111
+
112
+ // Safe decode with valid input
113
+ const safeDecodeValid = z.safeDecode(isoDateCodec, "2024-01-15T10:30:00.000Z");
114
+ expect(safeDecodeValid.success).toBe(true);
115
+ if (safeDecodeValid.success) {
116
+ expect(safeDecodeValid.data).toBeInstanceOf(Date);
117
+ expect(safeDecodeValid.data.getTime()).toMatchInlineSnapshot(`1705314600000`);
118
+ }
119
+
120
+ // Safe encode with valid input
121
+ const safeEncodeResult = z.safeEncode(isoDateCodec, new Date("2024-01-01"));
122
+ expect(safeEncodeResult.success).toBe(true);
123
+ if (safeEncodeResult.success) {
124
+ expect(safeEncodeResult.data).toMatchInlineSnapshot(`"2024-01-01T00:00:00.000Z"`);
125
+ }
126
+ });
127
+
128
+ test("codec with different types", () => {
129
+ // String -> Number codec
130
+ const stringNumberCodec = z.codec(z.string(), z.number(), {
131
+ decode: (str) => Number.parseFloat(str),
132
+ encode: (num) => num.toString(),
133
+ });
134
+
135
+ const decodedNumber = z.decode(stringNumberCodec, "42.5");
136
+ expect(decodedNumber).toMatchInlineSnapshot(`42.5`);
137
+ expect(typeof decodedNumber).toBe("number");
138
+
139
+ const encodedString = z.encode(stringNumberCodec, 42.5);
140
+ expect(encodedString).toMatchInlineSnapshot(`"42.5"`);
141
+ expect(typeof encodedString).toBe("string");
142
+ });
143
+
144
+ test("async codec operations", async () => {
145
+ const isoDateCodec = z.codec(z.iso.datetime(), z.date(), {
146
+ decode: (isoString) => new Date(isoString),
147
+ encode: (date) => date.toISOString(),
148
+ });
149
+
150
+ // Async decode
151
+ const decodedResult = await z.decodeAsync(isoDateCodec, "2024-01-15T10:30:00.000Z");
152
+ expect(decodedResult).toBeInstanceOf(Date);
153
+ expect(decodedResult.getTime()).toMatchInlineSnapshot(`1705314600000`);
154
+
155
+ // Async encode
156
+ const encodedResult = await z.encodeAsync(isoDateCodec, new Date("2024-01-15T10:30:00.000Z"));
157
+ expect(typeof encodedResult).toBe("string");
158
+ expect(encodedResult).toMatchInlineSnapshot(`"2024-01-15T10:30:00.000Z"`);
159
+
160
+ // Safe async operations
161
+ const safeDecodeResult = await z.safeDecodeAsync(isoDateCodec, "2024-01-15T10:30:00.000Z");
162
+ expect(safeDecodeResult.success).toBe(true);
163
+ if (safeDecodeResult.success) {
164
+ expect(safeDecodeResult.data.getTime()).toMatchInlineSnapshot(`1705314600000`);
165
+ }
166
+
167
+ const safeEncodeResult = await z.safeEncodeAsync(isoDateCodec, new Date("2024-01-15T10:30:00.000Z"));
168
+ expect(safeEncodeResult.success).toBe(true);
169
+ if (safeEncodeResult.success) {
170
+ expect(safeEncodeResult.data).toMatchInlineSnapshot(`"2024-01-15T10:30:00.000Z"`);
171
+ }
172
+ });
173
+
174
+ test("codec type inference", () => {
175
+ const codec = z.codec(z.string(), z.number(), {
176
+ decode: (str) => Number.parseInt(str),
177
+ encode: (num) => num.toString(),
178
+ });
179
+
180
+ // These should compile without type errors
181
+ const decoded: number = z.decode(codec, "123");
182
+ const encoded: string = z.encode(codec, 123);
183
+
184
+ expect(decoded).toMatchInlineSnapshot(`123`);
185
+ expect(encoded).toMatchInlineSnapshot(`"123"`);
186
+ });
187
+
188
+ test("nested codec with object containing codec property", () => {
189
+ // Nested schema: object containing a codec as one of its properties, with refinements at all levels
190
+ const waypointSchema = z
191
+ .object({
192
+ name: z.string().check(z.minLength(1, "Waypoint name required")),
193
+ difficulty: z.enum(["easy", "medium", "hard"]),
194
+ coordinate: z
195
+ .codec(
196
+ z
197
+ .string()
198
+ .check(z.regex(/^-?\d+,-?\d+$/, "Must be 'x,y' format")), // Input: coordinate string
199
+ z
200
+ .object({ x: z.number(), y: z.number() })
201
+ .check(z.refine((coord) => coord.x >= 0 && coord.y >= 0, { error: "Coordinates must be non-negative" })), // Output: coordinate object
202
+ {
203
+ decode: (coordString: string) => {
204
+ const [x, y] = coordString.split(",").map(Number);
205
+ return { x, y };
206
+ },
207
+ encode: (coord: { x: number; y: number }) => `${coord.x},${coord.y}`,
208
+ }
209
+ )
210
+ .check(z.refine((coord) => coord.x <= 1000 && coord.y <= 1000, { error: "Coordinates must be within bounds" })),
211
+ })
212
+ .check(
213
+ z.refine((waypoint) => waypoint.difficulty !== "hard" || waypoint.coordinate.x >= 100, {
214
+ error: "Hard waypoints must be at least 100 units from origin",
215
+ })
216
+ );
217
+
218
+ // Test data
219
+ const inputWaypoint = {
220
+ name: "Summit Point",
221
+ difficulty: "medium" as const,
222
+ coordinate: "150,200",
223
+ };
224
+
225
+ // Forward decoding (object with string coordinate -> object with coordinate object)
226
+ const decodedWaypoint = z.decode(waypointSchema, inputWaypoint);
227
+ expect(decodedWaypoint).toMatchInlineSnapshot(`
228
+ {
229
+ "coordinate": {
230
+ "x": 150,
231
+ "y": 200,
232
+ },
233
+ "difficulty": "medium",
234
+ "name": "Summit Point",
235
+ }
236
+ `);
237
+
238
+ // Backward encoding (object with coordinate object -> object with string coordinate)
239
+ const encodedWaypoint = z.encode(waypointSchema, decodedWaypoint);
240
+ expect(encodedWaypoint).toMatchInlineSnapshot(`
241
+ {
242
+ "coordinate": "150,200",
243
+ "difficulty": "medium",
244
+ "name": "Summit Point",
245
+ }
246
+ `);
247
+
248
+ // Test refinements at all levels
249
+ // String validation (empty waypoint name)
250
+ const emptyNameResult = z.safeDecode(waypointSchema, {
251
+ name: "",
252
+ difficulty: "easy",
253
+ coordinate: "10,20",
254
+ });
255
+ expect(emptyNameResult.success).toBe(false);
256
+ if (!emptyNameResult.success) {
257
+ expect(emptyNameResult.error.issues).toMatchInlineSnapshot(`
258
+ [
259
+ {
260
+ "code": "too_small",
261
+ "inclusive": true,
262
+ "message": "Waypoint name required",
263
+ "minimum": 1,
264
+ "origin": "string",
265
+ "path": [
266
+ "name",
267
+ ],
268
+ },
269
+ ]
270
+ `);
271
+ }
272
+
273
+ // Enum validation (invalid difficulty)
274
+ const invalidDifficultyResult = z.safeDecode(waypointSchema, {
275
+ name: "Test Point",
276
+ difficulty: "impossible" as any,
277
+ coordinate: "10,20",
278
+ });
279
+ expect(invalidDifficultyResult.success).toBe(false);
280
+ if (!invalidDifficultyResult.success) {
281
+ expect(invalidDifficultyResult.error.issues).toMatchInlineSnapshot(`
282
+ [
283
+ {
284
+ "code": "invalid_value",
285
+ "message": "Invalid option: expected one of "easy"|"medium"|"hard"",
286
+ "path": [
287
+ "difficulty",
288
+ ],
289
+ "values": [
290
+ "easy",
291
+ "medium",
292
+ "hard",
293
+ ],
294
+ },
295
+ ]
296
+ `);
297
+ }
298
+
299
+ // Codec string format validation (invalid coordinate format)
300
+ const invalidFormatResult = z.safeDecode(waypointSchema, {
301
+ name: "Test Point",
302
+ difficulty: "easy",
303
+ coordinate: "invalid",
304
+ });
305
+ expect(invalidFormatResult.success).toBe(false);
306
+ if (!invalidFormatResult.success) {
307
+ expect(invalidFormatResult.error.issues).toMatchInlineSnapshot(`
308
+ [
309
+ {
310
+ "code": "invalid_format",
311
+ "format": "regex",
312
+ "message": "Must be 'x,y' format",
313
+ "origin": "string",
314
+ "path": [
315
+ "coordinate",
316
+ ],
317
+ "pattern": "/^-?\\d+,-?\\d+$/",
318
+ },
319
+ ]
320
+ `);
321
+ }
322
+
323
+ // Codec object refinement (negative coordinates)
324
+ const negativeCoordResult = z.safeDecode(waypointSchema, {
325
+ name: "Test Point",
326
+ difficulty: "easy",
327
+ coordinate: "-5,10",
328
+ });
329
+ expect(negativeCoordResult.success).toBe(false);
330
+ if (!negativeCoordResult.success) {
331
+ expect(negativeCoordResult.error.issues).toMatchInlineSnapshot(`
332
+ [
333
+ {
334
+ "code": "custom",
335
+ "message": "Coordinates must be non-negative",
336
+ "path": [
337
+ "coordinate",
338
+ ],
339
+ },
340
+ ]
341
+ `);
342
+ }
343
+
344
+ // Codec-level refinement (coordinates out of bounds)
345
+ const outOfBoundsResult = z.safeDecode(waypointSchema, {
346
+ name: "Test Point",
347
+ difficulty: "easy",
348
+ coordinate: "1500,2000",
349
+ });
350
+ expect(outOfBoundsResult.success).toBe(false);
351
+ if (!outOfBoundsResult.success) {
352
+ expect(outOfBoundsResult.error.issues).toMatchInlineSnapshot(`
353
+ [
354
+ {
355
+ "code": "custom",
356
+ "message": "Coordinates must be within bounds",
357
+ "path": [
358
+ "coordinate",
359
+ ],
360
+ },
361
+ ]
362
+ `);
363
+ }
364
+
365
+ // Object-level refinement (hard waypoint too close to origin)
366
+ const hardWaypointResult = z.safeDecode(waypointSchema, {
367
+ name: "Expert Point",
368
+ difficulty: "hard",
369
+ coordinate: "50,60", // x < 100, but hard waypoints need x >= 100
370
+ });
371
+ expect(hardWaypointResult.success).toBe(false);
372
+ if (!hardWaypointResult.success) {
373
+ expect(hardWaypointResult.error.issues).toMatchInlineSnapshot(`
374
+ [
375
+ {
376
+ "code": "custom",
377
+ "message": "Hard waypoints must be at least 100 units from origin",
378
+ "path": [],
379
+ },
380
+ ]
381
+ `);
382
+ }
383
+
384
+ // Round trip test
385
+ const roundTripResult = z.encode(waypointSchema, z.decode(waypointSchema, inputWaypoint));
386
+ expect(roundTripResult).toMatchInlineSnapshot(`
387
+ {
388
+ "coordinate": "150,200",
389
+ "difficulty": "medium",
390
+ "name": "Summit Point",
391
+ }
392
+ `);
393
+ });
394
+
395
+ test("mutating refinements", () => {
396
+ const A = z.codec(z.string(), z.string().check(z.trim()), {
397
+ decode: (val) => val,
398
+ encode: (val) => val,
399
+ });
400
+
401
+ expect(z.decode(A, " asdf ")).toMatchInlineSnapshot(`"asdf"`);
402
+ expect(z.encode(A, " asdf ")).toMatchInlineSnapshot(`"asdf"`);
403
+ });
404
+
405
+ test("codec type enforcement - correct encode/decode signatures", () => {
406
+ // Test that codec functions have correct type signatures
407
+ const stringToNumberCodec = z.codec(z.string(), z.number(), {
408
+ decode: (value: string) => Number(value), // core.output<A> -> core.input<B>
409
+ encode: (value: number) => String(value), // core.input<B> -> core.output<A>
410
+ });
411
+
412
+ // These should compile without errors - correct types (async support)
413
+ expectTypeOf<(value: string, payload: z.core.ParsePayload<string>) => z.core.util.MaybeAsync<number>>(
414
+ stringToNumberCodec.def.transform
415
+ ).toBeFunction();
416
+ expectTypeOf<(value: number, payload: z.core.ParsePayload<number>) => z.core.util.MaybeAsync<string>>(
417
+ stringToNumberCodec.def.reverseTransform
418
+ ).toBeFunction();
419
+
420
+ // Test that decode parameter type is core.output<A> (string)
421
+ const validDecode = (value: string) => Number(value);
422
+ expectTypeOf(validDecode).toMatchTypeOf<(value: string) => number>();
423
+
424
+ // Test that encode parameter type is core.input<B> (number)
425
+ const validEncode = (value: number) => String(value);
426
+ expectTypeOf(validEncode).toMatchTypeOf<(value: number) => string>();
427
+
428
+ z.codec(z.string(), z.number(), {
429
+ // @ts-expect-error - decode should NOT accept core.input<A> as parameter
430
+ decode: (value: never, _payload) => Number(value), // Wrong: should be string, not unknown
431
+ encode: (value: number, _payload) => String(value),
432
+ });
433
+
434
+ z.codec(z.string(), z.number(), {
435
+ decode: (value: string) => Number(value),
436
+ // @ts-expect-error - encode should NOT accept core.output<B> as parameter
437
+ encode: (value: never) => String(value), // Wrong: should be number, not unknown
438
+ });
439
+
440
+ z.codec(z.string(), z.number(), {
441
+ // @ts-expect-error - decode return type should be core.input<B>
442
+ decode: (value: string) => String(value), // Wrong: should return number, not string
443
+ encode: (value: number) => String(value),
444
+ });
445
+
446
+ z.codec(z.string(), z.number(), {
447
+ decode: (value: string) => Number(value),
448
+ // @ts-expect-error - encode return type should be core.output<A>
449
+ encode: (value: number) => Number(value), // Wrong: should return string, not number
450
+ });
451
+ });
452
+
453
+ test("async codec functionality", async () => {
454
+ // Test that async encode/decode functions work properly
455
+ const asyncCodec = z.codec(z.string(), z.number(), {
456
+ decode: async (str) => {
457
+ await new Promise((resolve) => setTimeout(resolve, 1)); // Simulate async work
458
+ return Number.parseFloat(str);
459
+ },
460
+ encode: async (num) => {
461
+ await new Promise((resolve) => setTimeout(resolve, 1)); // Simulate async work
462
+ return num.toString();
463
+ },
464
+ });
465
+
466
+ // Test async decode/encode
467
+ const decoded = await z.decodeAsync(asyncCodec, "42.5");
468
+ expect(decoded).toBe(42.5);
469
+
470
+ const encoded = await z.encodeAsync(asyncCodec, 42.5);
471
+ expect(encoded).toBe("42.5");
472
+
473
+ // Test that both sync and async work
474
+ const mixedCodec = z.codec(z.string(), z.number(), {
475
+ decode: async (str) => Number.parseFloat(str),
476
+ encode: (num) => num.toString(), // sync encode
477
+ });
478
+
479
+ const mixedResult = await z.decodeAsync(mixedCodec, "123");
480
+ expect(mixedResult).toBe(123);
481
+ });
482
+
483
+ test("codec type enforcement - complex types", () => {
484
+ type User = { id: number; name: string };
485
+ type UserInput = { id: string; name: string };
486
+
487
+ const userCodec = z.codec(
488
+ z.object({ id: z.string(), name: z.string() }),
489
+ z.object({ id: z.number(), name: z.string() }),
490
+ {
491
+ decode: (input: UserInput) => ({ id: Number(input.id), name: input.name }),
492
+ encode: (user: User) => ({ id: String(user.id), name: user.name }),
493
+ }
494
+ );
495
+
496
+ // Verify correct types are inferred (async support)
497
+ expectTypeOf<(input: UserInput, payload: z.core.ParsePayload<UserInput>) => z.core.util.MaybeAsync<User>>(
498
+ userCodec.def.transform
499
+ ).toBeFunction();
500
+ expectTypeOf<(user: User, payload: z.core.ParsePayload<User>) => z.core.util.MaybeAsync<UserInput>>(
501
+ userCodec.def.reverseTransform
502
+ ).toBeFunction();
503
+
504
+ z.codec(
505
+ z.object({
506
+ id: z.string(),
507
+ name: z.string(),
508
+ }),
509
+ z.object({ id: z.number(), name: z.string() }),
510
+ {
511
+ // @ts-expect-error - decode parameter should be UserInput, not User
512
+ decode: (input: User) => ({ id: Number(input.id), name: input.name }), // Wrong type
513
+ encode: (user: User) => ({ id: String(user.id), name: user.name }),
514
+ }
515
+ );
516
+
517
+ z.codec(
518
+ z.object({
519
+ id: z.string(),
520
+ name: z.string(),
521
+ }),
522
+ z.object({ id: z.number(), name: z.string() }),
523
+ {
524
+ decode: (input: UserInput) => ({ id: Number(input.id), name: input.name }),
525
+ // @ts-expect-error - encode parameter should be User, not UserInput
526
+ encode: (user: UserInput) => ({ id: String(user.id), name: user.name }), // Wrong type
527
+ }
528
+ );
529
+ });
@@ -1,5 +1,5 @@
1
1
  import { expect, test } from "vitest";
2
- import * as z from "zod/v4-mini";
2
+ import * as z from "zod/mini";
3
3
  import { util as zc } from "zod/v4/core";
4
4
 
5
5
  test("min/max", () => {
@@ -1,5 +1,5 @@
1
1
  import { expect, test } from "vitest";
2
- import * as z from "zod/v4-mini";
2
+ import * as z from "zod/mini";
3
3
 
4
4
  test("no locale by default", () => {
5
5
  const result = z.safeParse(z.string(), 12);
@@ -1,5 +1,5 @@
1
1
  import { expect, expectTypeOf, test } from "vitest";
2
- import * as z from "zod/v4-mini";
2
+ import * as z from "zod/mini";
3
3
  import type { util } from "zod/v4/core";
4
4
 
5
5
  test("z.boolean", () => {
@@ -869,3 +869,31 @@ test("def typing", () => {
869
869
  z.catch(z.string(), "fallback").def.type satisfies "catch";
870
870
  z.file().def.type satisfies "file";
871
871
  });
872
+
873
+ test("defaulted object schema returns shallow clone", () => {
874
+ const schema = z._default(
875
+ z.object({
876
+ a: z.string(),
877
+ }),
878
+ { a: "x" }
879
+ );
880
+ const result1 = schema.parse(undefined);
881
+ const result2 = schema.parse(undefined);
882
+ expect(result1).not.toBe(result2);
883
+ expect(result1).toEqual(result2);
884
+ });
885
+
886
+ test("runtime type property exists and returns correct values", () => {
887
+ const stringSchema = z.string();
888
+ expect(stringSchema.type).toBe("string");
889
+ });
890
+
891
+ test("type narrowing works with type property", () => {
892
+ type ArrayOrRecord = z.ZodMiniArray<z.ZodMiniString> | z.ZodMiniRecord<z.ZodMiniString<string>, z.ZodMiniAny>;
893
+ const arraySchema = z.array(z.string()) as ArrayOrRecord;
894
+
895
+ if (arraySchema.type === "array") {
896
+ expectTypeOf(arraySchema).toEqualTypeOf<z.ZodMiniArray<z.ZodMiniString<unknown>>>();
897
+ expect(arraySchema.def.element).toBeDefined();
898
+ }
899
+ });
@@ -1,5 +1,5 @@
1
1
  import { expect, expectTypeOf, test } from "vitest";
2
- import * as z from "zod/v4-mini";
2
+ import * as z from "zod/mini";
3
3
 
4
4
  test("z.number", () => {
5
5
  const a = z.number();
@@ -1,5 +1,5 @@
1
1
  import { expect, expectTypeOf, test } from "vitest";
2
- import * as z from "zod/v4-mini";
2
+ import * as z from "zod/mini";
3
3
 
4
4
  test("z.object", () => {
5
5
  const a = z.object({
@@ -89,6 +89,12 @@ test("z.keyof", () => {
89
89
  type UserKeys = z.infer<typeof userKeysSchema>;
90
90
  expectTypeOf<UserKeys>().toEqualTypeOf<"name" | "age" | "email">();
91
91
  expect(userKeysSchema).toBeDefined();
92
+ expect(userKeysSchema._zod.def.type).toBe("enum");
93
+ expect(userKeysSchema._zod.def.entries).toEqual({
94
+ name: "name",
95
+ age: "age",
96
+ email: "email",
97
+ });
92
98
  expect(z.safeParse(userKeysSchema, "name").success).toBe(true);
93
99
  expect(z.safeParse(userKeysSchema, "age").success).toBe(true);
94
100
  expect(z.safeParse(userKeysSchema, "email").success).toBe(true);
@@ -110,6 +116,15 @@ test("z.extend", () => {
110
116
  expect(z.safeParse(extendedSchema, { name: "John", age: 30, isAdmin: true }).success).toBe(true);
111
117
  });
112
118
 
119
+ test("z.safeExtend", () => {
120
+ const extended = z.safeExtend(userSchema, { name: z.string() });
121
+ expect(z.safeParse(extended, { name: "John", age: 30 }).success).toBe(true);
122
+ type Extended = z.infer<typeof extended>;
123
+ expectTypeOf<Extended>().toEqualTypeOf<{ name: string; age: number; email?: string }>();
124
+ // @ts-expect-error
125
+ z.safeExtend(userSchema, { name: z.number() });
126
+ });
127
+
113
128
  test("z.pick", () => {
114
129
  const pickedSchema = z.pick(userSchema, { name: true, email: true });
115
130
  type PickedUser = z.infer<typeof pickedSchema>;
@@ -1,5 +1,5 @@
1
1
  import { expect, test } from "vitest";
2
- import * as z from "zod/v4-mini";
2
+ import * as z from "zod/mini";
3
3
 
4
4
  declare module "zod/v4/core" {
5
5
  interface $ZodType {
@@ -1,5 +1,5 @@
1
1
  import { expect, expectTypeOf, test } from "vitest";
2
- import { z } from "zod/v4-mini";
2
+ import { z } from "zod/mini";
3
3
 
4
4
  test("recursion with z.lazy", () => {
5
5
  const data = {
@@ -1,5 +1,5 @@
1
1
  import { expect, expectTypeOf, test } from "vitest";
2
- import * as z from "zod/v4-mini";
2
+ import * as z from "zod/mini";
3
3
 
4
4
  const FAIL = { success: false };
5
5
 
@@ -297,3 +297,19 @@ test("z.jwt", () => {
297
297
  // wrong type
298
298
  expect(() => z.parse(a, 123)).toThrow();
299
299
  });
300
+
301
+ test("z.hash generic format", () => {
302
+ expect(z.hash("sha256").parse("a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3")).toBe(
303
+ "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3"
304
+ );
305
+
306
+ // --- Type-level checks (ensure the literal format string is encoded in the return type)
307
+ expectTypeOf(z.hash("md5")).toEqualTypeOf<z.ZodMiniCustomStringFormat<"md5_hex">>();
308
+ expectTypeOf(z.hash("sha1")).toEqualTypeOf<z.ZodMiniCustomStringFormat<"sha1_hex">>();
309
+ expectTypeOf(z.hash("sha256", { enc: "base64" as const })).toEqualTypeOf<
310
+ z.ZodMiniCustomStringFormat<"sha256_base64">
311
+ >();
312
+ expectTypeOf(z.hash("sha384", { enc: "base64url" as const })).toEqualTypeOf<
313
+ z.ZodMiniCustomStringFormat<"sha384_base64url">
314
+ >();
315
+ });
@@ -113,7 +113,7 @@ class ZodError extends Error {
113
113
  return this.issues.length === 0;
114
114
  }
115
115
  flatten(mapper = (issue) => issue.message) {
116
- const fieldErrors = {};
116
+ const fieldErrors = Object.create(null);
117
117
  const formErrors = [];
118
118
  for (const sub of this.issues) {
119
119
  if (sub.path.length > 0) {