@openclaw/zalo 2026.9.4 → 2026.9.6

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 (551) hide show
  1. package/assets/activity.svg +40 -0
  2. package/assets/icon.png +0 -0
  3. package/dist/{actions.runtime-2MsIGd0H.js → .setup/actions.runtime-B7EqgwH6.mjs} +1 -1
  4. package/dist/.setup/api-BDqk_OyX.mjs +6 -0
  5. package/dist/{channel-mgXGK008.js → .setup/channel-C4-ovULW.mjs} +14 -12
  6. package/dist/{channel.runtime-aikbF-5l.js → .setup/channel.runtime-Bm9k5qqB.mjs} +3 -3
  7. package/dist/{monitor-CXlZtCk9.js → .setup/monitor-BXzlUPAd.mjs} +6 -7
  8. package/dist/{monitor.webhook-DOCUBaE5.js → .setup/monitor.webhook-B_9qJI4O.mjs} +2 -2
  9. package/dist/.setup/secret-contract-api-DKDS_ZlS.mjs +3 -0
  10. package/dist/{send-CIMDH1gH.js → .setup/send-Div0xZFE.mjs} +34 -15
  11. package/dist/{setup-surface--Y84d_LY.js → .setup/setup-surface-CNyPRzlv.mjs} +1 -1
  12. package/dist/{webhook-spool-CPxf_Kwe.js → .setup/webhook-spool-BSTKDQ8X.mjs} +2 -2
  13. package/dist/api.js +3 -3
  14. package/dist/channel-plugin-api.js +1 -1
  15. package/dist/contract-api.js +1 -1
  16. package/dist/runtime-api.js +1 -1
  17. package/dist/secret-contract-api.js +1 -1
  18. package/dist/setup-api.js +2 -2
  19. package/dist/setup-entry.js +3 -2
  20. package/dist/setup-surface.js +2 -2
  21. package/node_modules/zod/README.md +29 -2
  22. package/node_modules/zod/compile.cjs +96 -0
  23. package/node_modules/zod/compile.d.cts +1 -0
  24. package/node_modules/zod/compile.d.ts +1 -0
  25. package/node_modules/zod/compile.js +52 -0
  26. package/node_modules/zod/index.cjs +21 -2
  27. package/node_modules/zod/index.d.cts +1 -2
  28. package/node_modules/zod/index.d.ts +1 -2
  29. package/node_modules/zod/index.js +5 -2
  30. package/node_modules/zod/locales/index.cjs +19 -0
  31. package/node_modules/zod/mini/index.cjs +19 -0
  32. package/node_modules/zod/package.json +20 -8
  33. package/node_modules/zod/src/compile.ts +56 -0
  34. package/node_modules/zod/src/index.ts +5 -2
  35. package/node_modules/zod/src/v3/ZodError.ts +22 -12
  36. package/node_modules/zod/src/v3/helpers/errorUtil.ts +1 -1
  37. package/node_modules/zod/src/v3/tests/error.test.ts +35 -0
  38. package/node_modules/zod/src/v3/tests/intersection.test.ts +18 -0
  39. package/node_modules/zod/src/v3/tests/language-server.test.ts +1 -2
  40. package/node_modules/zod/src/v3/tests/object.test.ts +3 -6
  41. package/node_modules/zod/src/v3/tests/readonly.test.ts +0 -80
  42. package/node_modules/zod/src/v3/tests/string.test.ts +6 -0
  43. package/node_modules/zod/src/v3/types.ts +5 -5
  44. package/node_modules/zod/src/v4/classic/checks.ts +1 -0
  45. package/node_modules/zod/src/v4/classic/compat.ts +26 -18
  46. package/node_modules/zod/src/v4/classic/deep-partial.ts +76 -0
  47. package/node_modules/zod/src/v4/classic/errors.ts +59 -44
  48. package/node_modules/zod/src/v4/classic/external.ts +14 -9
  49. package/node_modules/zod/src/v4/classic/from-json-schema.ts +363 -78
  50. package/node_modules/zod/src/v4/classic/in-out.ts +45 -0
  51. package/node_modules/zod/src/v4/classic/index.ts +2 -2
  52. package/node_modules/zod/src/v4/classic/iso.ts +2 -72
  53. package/node_modules/zod/src/v4/classic/parse.ts +10 -4
  54. package/node_modules/zod/src/v4/classic/schemas.ts +640 -375
  55. package/node_modules/zod/src/v4/classic/tests/apply.test.ts +27 -0
  56. package/node_modules/zod/src/v4/classic/tests/array.test.ts +2 -2
  57. package/node_modules/zod/src/v4/classic/tests/assignability.test.ts +186 -0
  58. package/node_modules/zod/src/v4/classic/tests/bigint.test.ts +36 -1
  59. package/node_modules/zod/src/v4/classic/tests/catch.test.ts +278 -0
  60. package/node_modules/zod/src/v4/classic/tests/codec-examples.test.ts +1 -2
  61. package/node_modules/zod/src/v4/classic/tests/codec.test.ts +2 -1
  62. package/node_modules/zod/src/v4/classic/tests/continuability.test.ts +3 -3
  63. package/node_modules/zod/src/v4/classic/tests/credit-card.test.ts +76 -0
  64. package/node_modules/zod/src/v4/classic/tests/cyclic-data.test.ts +985 -0
  65. package/node_modules/zod/src/v4/classic/tests/date.test.ts +30 -0
  66. package/node_modules/zod/src/v4/classic/tests/datetime.test.ts +32 -18
  67. package/node_modules/zod/src/v4/classic/tests/deep-partial.test.ts +380 -0
  68. package/node_modules/zod/src/v4/classic/tests/default-locale.test.ts +32 -0
  69. package/node_modules/zod/src/v4/classic/tests/default.test.ts +46 -0
  70. package/node_modules/zod/src/v4/classic/tests/detached-methods.test.ts +31 -7
  71. package/node_modules/zod/src/v4/classic/tests/discriminated-unions.test.ts +261 -13
  72. package/node_modules/zod/src/v4/classic/tests/enum.test.ts +20 -0
  73. package/node_modules/zod/src/v4/classic/tests/error-utils.test.ts +112 -2
  74. package/node_modules/zod/src/v4/classic/tests/error.test.ts +403 -6
  75. package/node_modules/zod/src/v4/classic/tests/from-json-schema.test.ts +582 -10
  76. package/node_modules/zod/src/v4/classic/tests/function.test.ts +31 -0
  77. package/node_modules/zod/src/v4/classic/tests/global-config.test.ts +2 -9
  78. package/node_modules/zod/src/v4/classic/tests/hash.test.ts +1 -2
  79. package/node_modules/zod/src/v4/classic/tests/iban.test.ts +81 -0
  80. package/node_modules/zod/src/v4/classic/tests/in-out.test.ts +159 -0
  81. package/node_modules/zod/src/v4/classic/tests/index.test.ts +21 -2
  82. package/node_modules/zod/src/v4/classic/tests/instance-footprint.test.ts +319 -0
  83. package/node_modules/zod/src/v4/classic/tests/instanceof.test.ts +67 -0
  84. package/node_modules/zod/src/v4/classic/tests/intersection.test.ts +136 -0
  85. package/node_modules/zod/src/v4/classic/tests/issue-schema.test.ts +215 -0
  86. package/node_modules/zod/src/v4/classic/tests/jitless-allows-eval.test.ts +3 -10
  87. package/node_modules/zod/src/v4/classic/tests/lazy.test.ts +36 -1
  88. package/node_modules/zod/src/v4/classic/tests/literal.test.ts +12 -1
  89. package/node_modules/zod/src/v4/classic/tests/map.test.ts +12 -0
  90. package/node_modules/zod/src/v4/classic/tests/number.test.ts +85 -9
  91. package/node_modules/zod/src/v4/classic/tests/object.test.ts +301 -12
  92. package/node_modules/zod/src/v4/classic/tests/optin-ladder.test.ts +235 -0
  93. package/node_modules/zod/src/v4/classic/tests/optional.test.ts +49 -16
  94. package/node_modules/zod/src/v4/classic/tests/partial.test.ts +51 -4
  95. package/node_modules/zod/src/v4/classic/tests/prefault.test.ts +70 -0
  96. package/node_modules/zod/src/v4/classic/tests/preprocess-types.test.ts +20 -2
  97. package/node_modules/zod/src/v4/classic/tests/properties.test.ts +141 -0
  98. package/node_modules/zod/src/v4/classic/tests/readonly.test.ts +0 -68
  99. package/node_modules/zod/src/v4/classic/tests/record.test.ts +186 -18
  100. package/node_modules/zod/src/v4/classic/tests/recursive-types.test.ts +79 -3
  101. package/node_modules/zod/src/v4/classic/tests/redos.test.ts +68 -0
  102. package/node_modules/zod/src/v4/classic/tests/refine.test.ts +60 -0
  103. package/node_modules/zod/src/v4/classic/tests/set.test.ts +9 -0
  104. package/node_modules/zod/src/v4/classic/tests/standard-schema.test.ts +19 -0
  105. package/node_modules/zod/src/v4/classic/tests/string.test.ts +222 -6
  106. package/node_modules/zod/src/v4/classic/tests/stringbool.test.ts +18 -0
  107. package/node_modules/zod/src/v4/classic/tests/template-literal.test.ts +44 -3
  108. package/node_modules/zod/src/v4/classic/tests/to-json-schema.test.ts +1812 -204
  109. package/node_modules/zod/src/v4/classic/tests/tuple.test.ts +45 -30
  110. package/node_modules/zod/src/v4/classic/tests/union.test.ts +39 -2
  111. package/node_modules/zod/src/v4/classic/tests/validate.test.ts +645 -0
  112. package/node_modules/zod/src/v4/classic/tests/validations.test.ts +2 -2
  113. package/node_modules/zod/src/v4/core/api.ts +87 -35
  114. package/node_modules/zod/src/v4/core/checks.ts +119 -146
  115. package/node_modules/zod/src/v4/core/compile.ts +2313 -0
  116. package/node_modules/zod/src/v4/core/core.ts +99 -22
  117. package/node_modules/zod/src/v4/core/doc.ts +17 -9
  118. package/node_modules/zod/src/v4/core/errors.ts +113 -25
  119. package/node_modules/zod/src/v4/core/index.ts +3 -0
  120. package/node_modules/zod/src/v4/core/json-schema-generator.ts +8 -3
  121. package/node_modules/zod/src/v4/core/json-schema-processors.ts +424 -156
  122. package/node_modules/zod/src/v4/core/json-schema.ts +2 -1
  123. package/node_modules/zod/src/v4/core/memoizer.ts +331 -0
  124. package/node_modules/zod/src/v4/core/parse.ts +164 -50
  125. package/node_modules/zod/src/v4/core/regexes.ts +42 -15
  126. package/node_modules/zod/src/v4/core/registries.ts +2 -2
  127. package/node_modules/zod/src/v4/core/schemas.ts +1000 -538
  128. package/node_modules/zod/src/v4/core/tests/cached.test.ts +54 -0
  129. package/node_modules/zod/src/v4/core/tests/compile-differential.test.ts +1004 -0
  130. package/node_modules/zod/src/v4/core/tests/compile-generative.test.ts +445 -0
  131. package/node_modules/zod/src/v4/core/tests/compile-global.test.ts +89 -0
  132. package/node_modules/zod/src/v4/core/tests/compile-off-by-default.test.ts +26 -0
  133. package/node_modules/zod/src/v4/core/tests/compile-stats.test.ts +34 -0
  134. package/node_modules/zod/src/v4/core/tests/compile.test.ts +2036 -0
  135. package/node_modules/zod/src/v4/core/tests/email-regex.test.ts +140 -0
  136. package/node_modules/zod/src/v4/core/tests/locales/el.test.ts +1 -2
  137. package/node_modules/zod/src/v4/core/tests/locales/es.test.ts +1 -2
  138. package/node_modules/zod/src/v4/core/tests/locales/fr.test.ts +3 -3
  139. package/node_modules/zod/src/v4/core/tests/locales/parity.test.ts +42 -0
  140. package/node_modules/zod/src/v4/core/tests/locales/tg.test.ts +85 -0
  141. package/node_modules/zod/src/v4/core/tests/locales/tk.test.ts +69 -0
  142. package/node_modules/zod/src/v4/core/tests/polyfill-collision.test.ts +46 -0
  143. package/node_modules/zod/src/v4/core/tests/treeshake.test.ts +51 -0
  144. package/node_modules/zod/src/v4/core/tests/url-no-canparse.test.ts +133 -0
  145. package/node_modules/zod/src/v4/core/to-json-schema.ts +283 -48
  146. package/node_modules/zod/src/v4/core/util.ts +454 -157
  147. package/node_modules/zod/src/v4/core/versions.ts +2 -2
  148. package/node_modules/zod/src/v4/core/visit.ts +193 -0
  149. package/node_modules/zod/src/v4/index.ts +3 -3
  150. package/node_modules/zod/src/v4/locales/ar.ts +5 -0
  151. package/node_modules/zod/src/v4/locales/az.ts +5 -0
  152. package/node_modules/zod/src/v4/locales/be.ts +12 -0
  153. package/node_modules/zod/src/v4/locales/bg.ts +5 -0
  154. package/node_modules/zod/src/v4/locales/bn.ts +123 -0
  155. package/node_modules/zod/src/v4/locales/ca.ts +5 -0
  156. package/node_modules/zod/src/v4/locales/ckb.ts +140 -0
  157. package/node_modules/zod/src/v4/locales/cs.ts +5 -0
  158. package/node_modules/zod/src/v4/locales/da.ts +7 -2
  159. package/node_modules/zod/src/v4/locales/de.ts +5 -0
  160. package/node_modules/zod/src/v4/locales/el.ts +3 -0
  161. package/node_modules/zod/src/v4/locales/en.ts +17 -4
  162. package/node_modules/zod/src/v4/locales/eo.ts +5 -0
  163. package/node_modules/zod/src/v4/locales/es.ts +4 -0
  164. package/node_modules/zod/src/v4/locales/fa.ts +5 -0
  165. package/node_modules/zod/src/v4/locales/fi.ts +5 -0
  166. package/node_modules/zod/src/v4/locales/fr-CA.ts +5 -0
  167. package/node_modules/zod/src/v4/locales/fr.ts +21 -14
  168. package/node_modules/zod/src/v4/locales/gu.ts +123 -0
  169. package/node_modules/zod/src/v4/locales/he.ts +8 -1
  170. package/node_modules/zod/src/v4/locales/hi.ts +126 -0
  171. package/node_modules/zod/src/v4/locales/hr.ts +4 -0
  172. package/node_modules/zod/src/v4/locales/hu.ts +5 -0
  173. package/node_modules/zod/src/v4/locales/hy.ts +11 -0
  174. package/node_modules/zod/src/v4/locales/id.ts +5 -0
  175. package/node_modules/zod/src/v4/locales/index.ts +11 -0
  176. package/node_modules/zod/src/v4/locales/is.ts +5 -0
  177. package/node_modules/zod/src/v4/locales/it.ts +5 -0
  178. package/node_modules/zod/src/v4/locales/ja.ts +5 -0
  179. package/node_modules/zod/src/v4/locales/ka.ts +5 -0
  180. package/node_modules/zod/src/v4/locales/km.ts +5 -0
  181. package/node_modules/zod/src/v4/locales/kn.ts +126 -0
  182. package/node_modules/zod/src/v4/locales/ko.ts +5 -0
  183. package/node_modules/zod/src/v4/locales/lt.ts +4 -0
  184. package/node_modules/zod/src/v4/locales/mk.ts +5 -0
  185. package/node_modules/zod/src/v4/locales/ms.ts +5 -0
  186. package/node_modules/zod/src/v4/locales/ne.ts +128 -0
  187. package/node_modules/zod/src/v4/locales/nl.ts +5 -0
  188. package/node_modules/zod/src/v4/locales/nn.ts +121 -0
  189. package/node_modules/zod/src/v4/locales/no.ts +7 -2
  190. package/node_modules/zod/src/v4/locales/ota.ts +5 -0
  191. package/node_modules/zod/src/v4/locales/pl.ts +5 -0
  192. package/node_modules/zod/src/v4/locales/ps.ts +5 -0
  193. package/node_modules/zod/src/v4/locales/pt-BR.ts +161 -0
  194. package/node_modules/zod/src/v4/locales/pt.ts +101 -58
  195. package/node_modules/zod/src/v4/locales/ro.ts +3 -0
  196. package/node_modules/zod/src/v4/locales/ru.ts +12 -0
  197. package/node_modules/zod/src/v4/locales/sk.ts +123 -0
  198. package/node_modules/zod/src/v4/locales/sl.ts +5 -0
  199. package/node_modules/zod/src/v4/locales/sv.ts +7 -2
  200. package/node_modules/zod/src/v4/locales/ta.ts +5 -0
  201. package/node_modules/zod/src/v4/locales/tg.ts +135 -0
  202. package/node_modules/zod/src/v4/locales/th.ts +5 -0
  203. package/node_modules/zod/src/v4/locales/tk.ts +113 -0
  204. package/node_modules/zod/src/v4/locales/tr.ts +5 -0
  205. package/node_modules/zod/src/v4/locales/uk.ts +5 -0
  206. package/node_modules/zod/src/v4/locales/ur.ts +5 -0
  207. package/node_modules/zod/src/v4/locales/uz.ts +3 -0
  208. package/node_modules/zod/src/v4/locales/vi.ts +5 -0
  209. package/node_modules/zod/src/v4/locales/yo.ts +5 -0
  210. package/node_modules/zod/src/v4/locales/zh-CN.ts +5 -0
  211. package/node_modules/zod/src/v4/locales/zh-TW.ts +5 -0
  212. package/node_modules/zod/src/v4/mini/checks.ts +1 -0
  213. package/node_modules/zod/src/v4/mini/deep-partial.ts +73 -0
  214. package/node_modules/zod/src/v4/mini/external.ts +12 -1
  215. package/node_modules/zod/src/v4/mini/in-out.ts +45 -0
  216. package/node_modules/zod/src/v4/mini/parse.ts +2 -0
  217. package/node_modules/zod/src/v4/mini/schemas.ts +167 -63
  218. package/node_modules/zod/src/v4/mini/tests/apply.test.ts +33 -0
  219. package/node_modules/zod/src/v4/mini/tests/assignability.test.ts +62 -1
  220. package/node_modules/zod/src/v4/mini/tests/checks.test.ts +14 -0
  221. package/node_modules/zod/src/v4/mini/tests/codec.test.ts +35 -1
  222. package/node_modules/zod/src/v4/mini/tests/computed.test.ts +11 -17
  223. package/node_modules/zod/src/v4/mini/tests/cyclic-data.test.ts +84 -0
  224. package/node_modules/zod/src/v4/mini/tests/deep-partial.test.ts +54 -0
  225. package/node_modules/zod/src/v4/mini/tests/error.test.ts +23 -4
  226. package/node_modules/zod/src/v4/mini/tests/functions.test.ts +9 -0
  227. package/node_modules/zod/src/v4/mini/tests/index.test.ts +158 -5
  228. package/node_modules/zod/src/v4/mini/tests/number.test.ts +14 -0
  229. package/node_modules/zod/src/v4/mini/tests/object.test.ts +65 -0
  230. package/node_modules/zod/src/v4/mini/tests/recursive-types.test.ts +16 -0
  231. package/node_modules/zod/src/v4/mini/tests/string.test.ts +44 -0
  232. package/node_modules/zod/v3/ZodError.cjs +41 -12
  233. package/node_modules/zod/v3/ZodError.d.cts +1 -1
  234. package/node_modules/zod/v3/ZodError.d.ts +1 -1
  235. package/node_modules/zod/v3/ZodError.js +22 -12
  236. package/node_modules/zod/v3/errors.cjs +19 -0
  237. package/node_modules/zod/v3/external.cjs +19 -0
  238. package/node_modules/zod/v3/helpers/enumUtil.cjs +19 -0
  239. package/node_modules/zod/v3/helpers/errorUtil.cjs +20 -1
  240. package/node_modules/zod/v3/helpers/errorUtil.js +1 -1
  241. package/node_modules/zod/v3/helpers/parseUtil.cjs +19 -0
  242. package/node_modules/zod/v3/helpers/partialUtil.cjs +19 -0
  243. package/node_modules/zod/v3/helpers/typeAliases.cjs +19 -0
  244. package/node_modules/zod/v3/helpers/util.cjs +19 -0
  245. package/node_modules/zod/v3/index.cjs +19 -0
  246. package/node_modules/zod/v3/standard-schema.cjs +19 -0
  247. package/node_modules/zod/v3/types.cjs +26 -5
  248. package/node_modules/zod/v3/types.js +7 -5
  249. package/node_modules/zod/v4/classic/checks.cjs +21 -1
  250. package/node_modules/zod/v4/classic/checks.d.cts +1 -1
  251. package/node_modules/zod/v4/classic/checks.d.ts +1 -1
  252. package/node_modules/zod/v4/classic/checks.js +1 -1
  253. package/node_modules/zod/v4/classic/coerce.cjs +19 -0
  254. package/node_modules/zod/v4/classic/compat.cjs +19 -0
  255. package/node_modules/zod/v4/classic/compat.d.cts +9 -11
  256. package/node_modules/zod/v4/classic/compat.d.ts +9 -11
  257. package/node_modules/zod/v4/classic/deep-partial.cjs +58 -0
  258. package/node_modules/zod/v4/classic/deep-partial.d.cts +14 -0
  259. package/node_modules/zod/v4/classic/deep-partial.d.ts +14 -0
  260. package/node_modules/zod/v4/classic/deep-partial.js +13 -0
  261. package/node_modules/zod/v4/classic/errors.cjs +62 -34
  262. package/node_modules/zod/v4/classic/errors.d.cts +3 -4
  263. package/node_modules/zod/v4/classic/errors.d.ts +3 -4
  264. package/node_modules/zod/v4/classic/errors.js +43 -34
  265. package/node_modules/zod/v4/classic/external.cjs +51 -27
  266. package/node_modules/zod/v4/classic/external.d.cts +5 -2
  267. package/node_modules/zod/v4/classic/external.d.ts +5 -2
  268. package/node_modules/zod/v4/classic/external.js +5 -8
  269. package/node_modules/zod/v4/classic/from-json-schema.cjs +376 -75
  270. package/node_modules/zod/v4/classic/from-json-schema.js +357 -75
  271. package/node_modules/zod/v4/classic/in-out.cjs +82 -0
  272. package/node_modules/zod/v4/classic/in-out.d.cts +8 -0
  273. package/node_modules/zod/v4/classic/in-out.d.ts +8 -0
  274. package/node_modules/zod/v4/classic/in-out.js +36 -0
  275. package/node_modules/zod/v4/classic/index.cjs +21 -2
  276. package/node_modules/zod/v4/classic/index.d.cts +1 -2
  277. package/node_modules/zod/v4/classic/index.d.ts +1 -2
  278. package/node_modules/zod/v4/classic/index.js +2 -2
  279. package/node_modules/zod/v4/classic/iso.cjs +30 -22
  280. package/node_modules/zod/v4/classic/iso.d.cts +2 -17
  281. package/node_modules/zod/v4/classic/iso.d.ts +2 -17
  282. package/node_modules/zod/v4/classic/iso.js +2 -17
  283. package/node_modules/zod/v4/classic/parse.cjs +23 -1
  284. package/node_modules/zod/v4/classic/parse.d.cts +17 -4
  285. package/node_modules/zod/v4/classic/parse.d.ts +17 -4
  286. package/node_modules/zod/v4/classic/parse.js +1 -0
  287. package/node_modules/zod/v4/classic/schemas.cjs +591 -426
  288. package/node_modules/zod/v4/classic/schemas.d.cts +68 -19
  289. package/node_modules/zod/v4/classic/schemas.d.ts +68 -19
  290. package/node_modules/zod/v4/classic/schemas.js +564 -424
  291. package/node_modules/zod/v4/core/api.cjs +66 -24
  292. package/node_modules/zod/v4/core/api.d.cts +22 -12
  293. package/node_modules/zod/v4/core/api.d.ts +22 -12
  294. package/node_modules/zod/v4/core/api.js +44 -24
  295. package/node_modules/zod/v4/core/checks.cjs +88 -128
  296. package/node_modules/zod/v4/core/checks.d.cts +29 -13
  297. package/node_modules/zod/v4/core/checks.d.ts +29 -13
  298. package/node_modules/zod/v4/core/checks.js +68 -127
  299. package/node_modules/zod/v4/core/compile.cjs +1908 -0
  300. package/node_modules/zod/v4/core/compile.d.cts +65 -0
  301. package/node_modules/zod/v4/core/compile.d.ts +65 -0
  302. package/node_modules/zod/v4/core/compile.js +1858 -0
  303. package/node_modules/zod/v4/core/core.cjs +101 -19
  304. package/node_modules/zod/v4/core/core.d.cts +16 -4
  305. package/node_modules/zod/v4/core/core.d.ts +16 -4
  306. package/node_modules/zod/v4/core/core.js +83 -20
  307. package/node_modules/zod/v4/core/doc.cjs +31 -9
  308. package/node_modules/zod/v4/core/doc.d.cts +3 -1
  309. package/node_modules/zod/v4/core/doc.d.ts +3 -1
  310. package/node_modules/zod/v4/core/doc.js +12 -9
  311. package/node_modules/zod/v4/core/errors.cjs +126 -25
  312. package/node_modules/zod/v4/core/errors.d.cts +4 -0
  313. package/node_modules/zod/v4/core/errors.d.ts +4 -0
  314. package/node_modules/zod/v4/core/errors.js +107 -25
  315. package/node_modules/zod/v4/core/index.cjs +24 -1
  316. package/node_modules/zod/v4/core/index.d.cts +3 -0
  317. package/node_modules/zod/v4/core/index.d.ts +3 -0
  318. package/node_modules/zod/v4/core/index.js +3 -0
  319. package/node_modules/zod/v4/core/json-schema-generator.cjs +24 -1
  320. package/node_modules/zod/v4/core/json-schema-generator.d.cts +2 -2
  321. package/node_modules/zod/v4/core/json-schema-generator.d.ts +2 -2
  322. package/node_modules/zod/v4/core/json-schema-generator.js +6 -2
  323. package/node_modules/zod/v4/core/json-schema-processors.cjs +441 -156
  324. package/node_modules/zod/v4/core/json-schema-processors.d.cts +16 -0
  325. package/node_modules/zod/v4/core/json-schema-processors.d.ts +16 -0
  326. package/node_modules/zod/v4/core/json-schema-processors.js +400 -158
  327. package/node_modules/zod/v4/core/json-schema.cjs +19 -0
  328. package/node_modules/zod/v4/core/json-schema.d.cts +2 -1
  329. package/node_modules/zod/v4/core/json-schema.d.ts +2 -1
  330. package/node_modules/zod/v4/core/memoizer.cjs +360 -0
  331. package/node_modules/zod/v4/core/memoizer.d.cts +15 -0
  332. package/node_modules/zod/v4/core/memoizer.d.ts +15 -0
  333. package/node_modules/zod/v4/core/memoizer.js +311 -0
  334. package/node_modules/zod/v4/core/parse.cjs +148 -46
  335. package/node_modules/zod/v4/core/parse.d.cts +14 -11
  336. package/node_modules/zod/v4/core/parse.d.ts +14 -11
  337. package/node_modules/zod/v4/core/parse.js +127 -45
  338. package/node_modules/zod/v4/core/regexes.cjs +54 -17
  339. package/node_modules/zod/v4/core/regexes.d.cts +5 -0
  340. package/node_modules/zod/v4/core/regexes.d.ts +5 -0
  341. package/node_modules/zod/v4/core/regexes.js +32 -15
  342. package/node_modules/zod/v4/core/registries.cjs +19 -0
  343. package/node_modules/zod/v4/core/registries.js +2 -2
  344. package/node_modules/zod/v4/core/schemas.cjs +785 -386
  345. package/node_modules/zod/v4/core/schemas.d.cts +123 -34
  346. package/node_modules/zod/v4/core/schemas.d.ts +123 -34
  347. package/node_modules/zod/v4/core/schemas.js +753 -386
  348. package/node_modules/zod/v4/core/standard-schema.cjs +19 -0
  349. package/node_modules/zod/v4/core/to-json-schema.cjs +269 -45
  350. package/node_modules/zod/v4/core/to-json-schema.d.cts +45 -5
  351. package/node_modules/zod/v4/core/to-json-schema.d.ts +45 -5
  352. package/node_modules/zod/v4/core/to-json-schema.js +247 -44
  353. package/node_modules/zod/v4/core/util.cjs +372 -157
  354. package/node_modules/zod/v4/core/util.d.cts +79 -1
  355. package/node_modules/zod/v4/core/util.d.ts +79 -1
  356. package/node_modules/zod/v4/core/util.js +341 -156
  357. package/node_modules/zod/v4/core/versions.cjs +21 -2
  358. package/node_modules/zod/v4/core/versions.d.cts +1 -1
  359. package/node_modules/zod/v4/core/versions.d.ts +1 -1
  360. package/node_modules/zod/v4/core/versions.js +2 -2
  361. package/node_modules/zod/v4/core/visit.cjs +214 -0
  362. package/node_modules/zod/v4/core/visit.d.cts +30 -0
  363. package/node_modules/zod/v4/core/visit.d.ts +30 -0
  364. package/node_modules/zod/v4/core/visit.js +169 -0
  365. package/node_modules/zod/v4/index.cjs +34 -5
  366. package/node_modules/zod/v4/index.d.cts +2 -2
  367. package/node_modules/zod/v4/index.d.ts +2 -2
  368. package/node_modules/zod/v4/index.js +3 -2
  369. package/node_modules/zod/v4/locales/ar.cjs +5 -0
  370. package/node_modules/zod/v4/locales/ar.js +5 -0
  371. package/node_modules/zod/v4/locales/az.cjs +5 -0
  372. package/node_modules/zod/v4/locales/az.js +5 -0
  373. package/node_modules/zod/v4/locales/be.cjs +12 -0
  374. package/node_modules/zod/v4/locales/be.js +12 -0
  375. package/node_modules/zod/v4/locales/bg.cjs +5 -0
  376. package/node_modules/zod/v4/locales/bg.js +5 -0
  377. package/node_modules/zod/v4/locales/bn.cjs +140 -0
  378. package/node_modules/zod/v4/locales/bn.d.cts +5 -0
  379. package/node_modules/zod/v4/locales/bn.d.ts +4 -0
  380. package/node_modules/zod/v4/locales/bn.js +113 -0
  381. package/node_modules/zod/v4/locales/ca.cjs +5 -0
  382. package/node_modules/zod/v4/locales/ca.js +5 -0
  383. package/node_modules/zod/v4/locales/ckb.cjs +160 -0
  384. package/node_modules/zod/v4/locales/ckb.d.cts +5 -0
  385. package/node_modules/zod/v4/locales/ckb.d.ts +4 -0
  386. package/node_modules/zod/v4/locales/ckb.js +133 -0
  387. package/node_modules/zod/v4/locales/cs.cjs +5 -0
  388. package/node_modules/zod/v4/locales/cs.js +5 -0
  389. package/node_modules/zod/v4/locales/da.cjs +7 -2
  390. package/node_modules/zod/v4/locales/da.js +7 -2
  391. package/node_modules/zod/v4/locales/de.cjs +5 -0
  392. package/node_modules/zod/v4/locales/de.js +5 -0
  393. package/node_modules/zod/v4/locales/el.cjs +3 -0
  394. package/node_modules/zod/v4/locales/el.js +3 -0
  395. package/node_modules/zod/v4/locales/en.cjs +16 -4
  396. package/node_modules/zod/v4/locales/en.js +16 -4
  397. package/node_modules/zod/v4/locales/eo.cjs +5 -0
  398. package/node_modules/zod/v4/locales/eo.js +5 -0
  399. package/node_modules/zod/v4/locales/es.cjs +4 -0
  400. package/node_modules/zod/v4/locales/es.js +4 -0
  401. package/node_modules/zod/v4/locales/fa.cjs +5 -0
  402. package/node_modules/zod/v4/locales/fa.js +5 -0
  403. package/node_modules/zod/v4/locales/fi.cjs +5 -0
  404. package/node_modules/zod/v4/locales/fi.js +5 -0
  405. package/node_modules/zod/v4/locales/fr-CA.cjs +5 -0
  406. package/node_modules/zod/v4/locales/fr-CA.js +5 -0
  407. package/node_modules/zod/v4/locales/fr.cjs +18 -14
  408. package/node_modules/zod/v4/locales/fr.js +18 -14
  409. package/node_modules/zod/v4/locales/gu.cjs +140 -0
  410. package/node_modules/zod/v4/locales/gu.d.cts +5 -0
  411. package/node_modules/zod/v4/locales/gu.d.ts +4 -0
  412. package/node_modules/zod/v4/locales/gu.js +113 -0
  413. package/node_modules/zod/v4/locales/he.cjs +7 -0
  414. package/node_modules/zod/v4/locales/he.js +7 -0
  415. package/node_modules/zod/v4/locales/hi.cjs +138 -0
  416. package/node_modules/zod/v4/locales/hi.d.cts +5 -0
  417. package/node_modules/zod/v4/locales/hi.d.ts +4 -0
  418. package/node_modules/zod/v4/locales/hi.js +111 -0
  419. package/node_modules/zod/v4/locales/hr.cjs +4 -0
  420. package/node_modules/zod/v4/locales/hr.js +4 -0
  421. package/node_modules/zod/v4/locales/hu.cjs +5 -0
  422. package/node_modules/zod/v4/locales/hu.js +5 -0
  423. package/node_modules/zod/v4/locales/hy.cjs +11 -0
  424. package/node_modules/zod/v4/locales/hy.js +11 -0
  425. package/node_modules/zod/v4/locales/id.cjs +5 -0
  426. package/node_modules/zod/v4/locales/id.js +5 -0
  427. package/node_modules/zod/v4/locales/index.cjs +43 -2
  428. package/node_modules/zod/v4/locales/index.d.cts +11 -0
  429. package/node_modules/zod/v4/locales/index.d.ts +11 -0
  430. package/node_modules/zod/v4/locales/index.js +11 -0
  431. package/node_modules/zod/v4/locales/is.cjs +5 -0
  432. package/node_modules/zod/v4/locales/is.js +5 -0
  433. package/node_modules/zod/v4/locales/it.cjs +5 -0
  434. package/node_modules/zod/v4/locales/it.js +5 -0
  435. package/node_modules/zod/v4/locales/ja.cjs +5 -0
  436. package/node_modules/zod/v4/locales/ja.js +5 -0
  437. package/node_modules/zod/v4/locales/ka.cjs +5 -0
  438. package/node_modules/zod/v4/locales/ka.js +5 -0
  439. package/node_modules/zod/v4/locales/km.cjs +5 -0
  440. package/node_modules/zod/v4/locales/km.js +5 -0
  441. package/node_modules/zod/v4/locales/kn.cjs +143 -0
  442. package/node_modules/zod/v4/locales/kn.d.cts +5 -0
  443. package/node_modules/zod/v4/locales/kn.d.ts +4 -0
  444. package/node_modules/zod/v4/locales/kn.js +116 -0
  445. package/node_modules/zod/v4/locales/ko.cjs +5 -0
  446. package/node_modules/zod/v4/locales/ko.js +5 -0
  447. package/node_modules/zod/v4/locales/lt.cjs +4 -0
  448. package/node_modules/zod/v4/locales/lt.js +4 -0
  449. package/node_modules/zod/v4/locales/mk.cjs +5 -0
  450. package/node_modules/zod/v4/locales/mk.js +5 -0
  451. package/node_modules/zod/v4/locales/ms.cjs +5 -0
  452. package/node_modules/zod/v4/locales/ms.js +5 -0
  453. package/node_modules/zod/v4/locales/ne.cjs +138 -0
  454. package/node_modules/zod/v4/locales/ne.d.cts +5 -0
  455. package/node_modules/zod/v4/locales/ne.d.ts +4 -0
  456. package/node_modules/zod/v4/locales/ne.js +111 -0
  457. package/node_modules/zod/v4/locales/nl.cjs +5 -0
  458. package/node_modules/zod/v4/locales/nl.js +5 -0
  459. package/node_modules/zod/v4/locales/nn.cjs +140 -0
  460. package/node_modules/zod/v4/locales/nn.d.cts +5 -0
  461. package/node_modules/zod/v4/locales/nn.d.ts +4 -0
  462. package/node_modules/zod/v4/locales/nn.js +113 -0
  463. package/node_modules/zod/v4/locales/no.cjs +7 -2
  464. package/node_modules/zod/v4/locales/no.js +7 -2
  465. package/node_modules/zod/v4/locales/ota.cjs +5 -0
  466. package/node_modules/zod/v4/locales/ota.js +5 -0
  467. package/node_modules/zod/v4/locales/pl.cjs +5 -0
  468. package/node_modules/zod/v4/locales/pl.js +5 -0
  469. package/node_modules/zod/v4/locales/ps.cjs +5 -0
  470. package/node_modules/zod/v4/locales/ps.js +5 -0
  471. package/node_modules/zod/v4/locales/pt-BR.cjs +170 -0
  472. package/node_modules/zod/v4/locales/pt-BR.d.cts +5 -0
  473. package/node_modules/zod/v4/locales/pt-BR.d.ts +4 -0
  474. package/node_modules/zod/v4/locales/pt-BR.js +143 -0
  475. package/node_modules/zod/v4/locales/pt.cjs +89 -55
  476. package/node_modules/zod/v4/locales/pt.js +89 -55
  477. package/node_modules/zod/v4/locales/ro.cjs +3 -0
  478. package/node_modules/zod/v4/locales/ro.js +3 -0
  479. package/node_modules/zod/v4/locales/ru.cjs +12 -0
  480. package/node_modules/zod/v4/locales/ru.js +12 -0
  481. package/node_modules/zod/v4/locales/sk.cjs +143 -0
  482. package/node_modules/zod/v4/locales/sk.d.cts +5 -0
  483. package/node_modules/zod/v4/locales/sk.d.ts +4 -0
  484. package/node_modules/zod/v4/locales/sk.js +116 -0
  485. package/node_modules/zod/v4/locales/sl.cjs +5 -0
  486. package/node_modules/zod/v4/locales/sl.js +5 -0
  487. package/node_modules/zod/v4/locales/sv.cjs +7 -2
  488. package/node_modules/zod/v4/locales/sv.js +7 -2
  489. package/node_modules/zod/v4/locales/ta.cjs +5 -0
  490. package/node_modules/zod/v4/locales/ta.js +5 -0
  491. package/node_modules/zod/v4/locales/tg.cjs +144 -0
  492. package/node_modules/zod/v4/locales/tg.d.cts +5 -0
  493. package/node_modules/zod/v4/locales/tg.d.ts +4 -0
  494. package/node_modules/zod/v4/locales/tg.js +117 -0
  495. package/node_modules/zod/v4/locales/th.cjs +5 -0
  496. package/node_modules/zod/v4/locales/th.js +5 -0
  497. package/node_modules/zod/v4/locales/tk.cjs +134 -0
  498. package/node_modules/zod/v4/locales/tk.d.cts +5 -0
  499. package/node_modules/zod/v4/locales/tk.d.ts +4 -0
  500. package/node_modules/zod/v4/locales/tk.js +107 -0
  501. package/node_modules/zod/v4/locales/tr.cjs +5 -0
  502. package/node_modules/zod/v4/locales/tr.js +5 -0
  503. package/node_modules/zod/v4/locales/uk.cjs +5 -0
  504. package/node_modules/zod/v4/locales/uk.js +5 -0
  505. package/node_modules/zod/v4/locales/ur.cjs +5 -0
  506. package/node_modules/zod/v4/locales/ur.js +5 -0
  507. package/node_modules/zod/v4/locales/uz.cjs +3 -0
  508. package/node_modules/zod/v4/locales/uz.js +3 -0
  509. package/node_modules/zod/v4/locales/vi.cjs +5 -0
  510. package/node_modules/zod/v4/locales/vi.js +5 -0
  511. package/node_modules/zod/v4/locales/yo.cjs +5 -0
  512. package/node_modules/zod/v4/locales/yo.js +5 -0
  513. package/node_modules/zod/v4/locales/zh-CN.cjs +5 -0
  514. package/node_modules/zod/v4/locales/zh-CN.js +5 -0
  515. package/node_modules/zod/v4/locales/zh-TW.cjs +5 -0
  516. package/node_modules/zod/v4/locales/zh-TW.js +5 -0
  517. package/node_modules/zod/v4/mini/checks.cjs +21 -1
  518. package/node_modules/zod/v4/mini/checks.d.cts +1 -1
  519. package/node_modules/zod/v4/mini/checks.d.ts +1 -1
  520. package/node_modules/zod/v4/mini/checks.js +1 -1
  521. package/node_modules/zod/v4/mini/coerce.cjs +19 -0
  522. package/node_modules/zod/v4/mini/deep-partial.cjs +58 -0
  523. package/node_modules/zod/v4/mini/deep-partial.d.cts +14 -0
  524. package/node_modules/zod/v4/mini/deep-partial.d.ts +14 -0
  525. package/node_modules/zod/v4/mini/deep-partial.js +13 -0
  526. package/node_modules/zod/v4/mini/external.cjs +33 -1
  527. package/node_modules/zod/v4/mini/external.d.cts +5 -2
  528. package/node_modules/zod/v4/mini/external.d.ts +5 -2
  529. package/node_modules/zod/v4/mini/external.js +3 -1
  530. package/node_modules/zod/v4/mini/in-out.cjs +82 -0
  531. package/node_modules/zod/v4/mini/in-out.d.cts +8 -0
  532. package/node_modules/zod/v4/mini/in-out.d.ts +8 -0
  533. package/node_modules/zod/v4/mini/in-out.js +36 -0
  534. package/node_modules/zod/v4/mini/index.cjs +19 -0
  535. package/node_modules/zod/v4/mini/iso.cjs +19 -0
  536. package/node_modules/zod/v4/mini/parse.cjs +22 -1
  537. package/node_modules/zod/v4/mini/parse.d.cts +1 -1
  538. package/node_modules/zod/v4/mini/parse.d.ts +1 -1
  539. package/node_modules/zod/v4/mini/parse.js +1 -1
  540. package/node_modules/zod/v4/mini/schemas.cjs +117 -53
  541. package/node_modules/zod/v4/mini/schemas.d.cts +49 -14
  542. package/node_modules/zod/v4/mini/schemas.d.ts +49 -14
  543. package/node_modules/zod/v4/mini/schemas.js +92 -51
  544. package/node_modules/zod/v4-mini/index.cjs +19 -0
  545. package/openclaw.plugin.json +12 -28
  546. package/package.json +9 -6
  547. package/node_modules/zod/src/v4/core/config.ts +0 -15
  548. /package/dist/{group-access-8qHRzDHx.js → .setup/group-access-8qHRzDHx.mjs} +0 -0
  549. /package/dist/{runtime-Dfhzt7qb.js → .setup/runtime-Dfhzt7qb.mjs} +0 -0
  550. /package/dist/{secret-contract-Cpsqe5Cv.js → .setup/secret-contract-Cpsqe5Cv.mjs} +0 -0
  551. /package/dist/{setup-core-CCMLSh4Q.js → .setup/setup-core-CCMLSh4Q.mjs} +0 -0
@@ -0,0 +1,235 @@
1
+ import { expect, expectTypeOf, test } from "vitest";
2
+ import { z } from "zod/v4";
3
+
4
+ /* ------------------------------------------------------------------ *
5
+ * TYPE-LEVEL — the dangerous half. Defaults must stay OPTIONAL in
6
+ * z.input and REQUIRED in z.output, exactly as before the ladder.
7
+ * ------------------------------------------------------------------ */
8
+ test("ladder: z.input / z.output unchanged by the extra rung", () => {
9
+ const objDefault = z.object({ a: z.string().default("D"), b: z.number() });
10
+ expectTypeOf<z.input<typeof objDefault>>().toEqualTypeOf<{ a?: string | undefined; b: number }>();
11
+ expectTypeOf<z.output<typeof objDefault>>().toEqualTypeOf<{ a: string; b: number }>();
12
+
13
+ const objPrefault = z.object({ a: z.string().prefault("P"), b: z.number() });
14
+ expectTypeOf<z.input<typeof objPrefault>>().toEqualTypeOf<{ a?: string | undefined; b: number }>();
15
+ expectTypeOf<z.output<typeof objPrefault>>().toEqualTypeOf<{ a: string; b: number }>();
16
+
17
+ const objOptional = z.object({ a: z.string().optional() });
18
+ expectTypeOf<z.input<typeof objOptional>>().toEqualTypeOf<{ a?: string | undefined }>();
19
+
20
+ const objTransform = z.object({
21
+ a: z
22
+ .string()
23
+ .default("")
24
+ .transform((v) => v.length),
25
+ });
26
+ expectTypeOf<z.input<typeof objTransform>>().toEqualTypeOf<{ a?: string | undefined }>();
27
+ expectTypeOf<z.output<typeof objTransform>>().toEqualTypeOf<{ a: number }>();
28
+
29
+ const standalone = z.string().default("D");
30
+ expectTypeOf<z.input<typeof standalone>>().toEqualTypeOf<string | undefined>();
31
+ expectTypeOf<z.output<typeof standalone>>().toEqualTypeOf<string>();
32
+
33
+ // a trailing defaulted tuple slot stays optional in the input tuple
34
+ const tup = z.tuple([z.string(), z.number().default(1)]);
35
+ expectTypeOf<z.input<typeof tup>>().toEqualTypeOf<[string, (number | undefined)?]>();
36
+
37
+ const partialed = objDefault.partial();
38
+ expectTypeOf<z.input<typeof partialed>>().toEqualTypeOf<{ a?: string | undefined; b?: number | undefined }>();
39
+ });
40
+
41
+ /* ------------------------------------------------------------------ *
42
+ * RUNTIME
43
+ * ------------------------------------------------------------------ */
44
+ test("ladder: the #6321 regression is fixed", () => {
45
+ const arr = z
46
+ .string()
47
+ .default("")
48
+ .transform((v) => (v ? v.split(",") : []));
49
+ expect(z.object({ a: arr }).partial().parse({})).toEqual({ a: [] });
50
+ expect(z.object({ a: arr }).partial().parse({ a: undefined })).toEqual({ a: [] });
51
+ expect(z.object({ a: arr }).partial().parse({ a: "x,y" })).toEqual({ a: ["x", "y"] });
52
+ expect(arr.optional().parse(undefined)).toEqual([]);
53
+ expect(
54
+ z
55
+ .string()
56
+ .prefault("hi")
57
+ .transform((v) => v.length)
58
+ .optional()
59
+ .parse(undefined)
60
+ ).toBe(2);
61
+ });
62
+
63
+ test("ladder: key-level admissibility across every rung", () => {
64
+ expect(z.object({ a: z.string().default("D") }).parse({})).toEqual({ a: "D" });
65
+ expect(z.object({ a: z.string().prefault("P") }).parse({})).toEqual({ a: "P" });
66
+ expect(z.object({ a: z.string().optional() }).parse({})).toEqual({});
67
+ expect(z.object({ a: z.transform(() => "T") }).parse({})).toEqual({ a: "T" });
68
+ expect(z.object({ a: z.string().catch("C") }).parse({})).toEqual({ a: "C" });
69
+ expect(z.object({ a: z.string() }).safeParse({}).success).toBe(false);
70
+ });
71
+
72
+ test("ladder: exactOptional keeps its distinct meaning", () => {
73
+ expect(z.object({ a: z.string().exactOptional() }).parse({})).toEqual({});
74
+ expect(z.object({ a: z.string().exactOptional() }).safeParse({ a: undefined }).success).toBe(false);
75
+ });
76
+
77
+ // An absent key never materializes a value from a schema that only claims the middle rung, however that schema answers `undefined`. The top rung still substitutes, and an explicitly present `undefined` still runs the inner.
78
+ test.each([true, false])("ladder: an absent key stays absent on the middle rung (jitless=%s)", (jitless) => {
79
+ const opts = { jitless };
80
+ expect(z.object({ a: z.coerce.string().exactOptional() }).parse({}, opts)).toStrictEqual({});
81
+ expect(z.object({ a: z.string().catch("C").exactOptional() }).parse({}, opts)).toStrictEqual({});
82
+ expect(z.object({ a: z.preprocess((v) => v ?? "X", z.string()).exactOptional() }).parse({}, opts)).toStrictEqual({});
83
+ expect(z.object({ a: z.union([z.coerce.string(), z.string().optional()]) }).parse({}, opts)).toStrictEqual({});
84
+
85
+ expect(z.object({ a: z.string().default("D").exactOptional() }).parse({}, opts)).toStrictEqual({ a: "D" });
86
+ expect(z.object({ a: z.string().prefault("P").exactOptional() }).parse({}, opts)).toStrictEqual({ a: "P" });
87
+ expect(z.object({ a: z.coerce.string().exactOptional() }).parse({ a: undefined }, opts)).toStrictEqual({
88
+ a: "undefined",
89
+ });
90
+ expect(z.object({ a: z.coerce.string() }).parse({ a: undefined }, opts)).toStrictEqual({ a: "undefined" });
91
+ });
92
+
93
+ test("ladder: an absent tuple slot on the middle rung truncates the tail", () => {
94
+ expect(z.tuple([z.string(), z.coerce.string().exactOptional()]).parse(["x"])).toStrictEqual(["x"]);
95
+ expect(z.tuple([z.string(), z.string().catch("C").exactOptional()]).parse(["x"])).toStrictEqual(["x"]);
96
+ expect(z.tuple([z.string(), z.string().default("D").exactOptional()]).parse(["x"])).toStrictEqual(["x", "D"]);
97
+ });
98
+
99
+ // z.compile() assembles its own output, so the gate has to be mirrored there or compile mode silently keeps the invented value.
100
+ test("ladder: compile mode agrees with the interpreted and JIT paths on absent middle-rung slots", () => {
101
+ const objects = [
102
+ [z.object({ a: z.coerce.string().exactOptional() }), {}],
103
+ [z.object({ a: z.string().catch("C").exactOptional() }), {}],
104
+ [z.object({ a: z.string().default("D").exactOptional() }), { a: "D" }],
105
+ [z.object({ a: z.string().catch("C") }), { a: "C" }],
106
+ ] as const;
107
+ for (const [schema, expected] of objects) {
108
+ expect(z.compile(schema).parse({})).toStrictEqual(expected);
109
+ expect(schema.parse({}, { jitless: true })).toStrictEqual(expected);
110
+ expect(schema.parse({})).toStrictEqual(expected);
111
+ }
112
+
113
+ const tuples = [
114
+ [z.tuple([z.string(), z.coerce.string().exactOptional()]), ["x"]],
115
+ [z.tuple([z.string(), z.string().default("D").exactOptional()]), ["x", "D"]],
116
+ ] as const;
117
+ for (const [schema, expected] of tuples) {
118
+ expect(z.compile(schema).parse(["x"])).toStrictEqual(expected);
119
+ expect(schema.parse(["x"], { jitless: true })).toStrictEqual(expected);
120
+ }
121
+ });
122
+
123
+ test("ladder: tuple minimum length respects every rung", () => {
124
+ expect(z.tuple([z.string().default("D")]).parse([])).toEqual(["D"]);
125
+ expect(z.tuple([z.string().prefault("P")]).parse([])).toEqual(["P"]);
126
+ expect(z.tuple([z.string().optional()]).parse([])).toEqual([]);
127
+ expect(z.tuple([z.string()]).safeParse([]).success).toBe(false);
128
+ expect(z.tuple([z.string(), z.number().default(1)]).parse(["x"])).toEqual(["x", 1]);
129
+ });
130
+
131
+ test("ladder: the #5941 / #5939 clobber invariants still hold", () => {
132
+ expect(
133
+ z
134
+ .preprocess((v) => v ?? "X", z.string())
135
+ .optional()
136
+ .parse(undefined)
137
+ ).toBeUndefined();
138
+ expect(z.string().catch("X").optional().parse(undefined)).toBeUndefined();
139
+ expect(
140
+ z
141
+ .string()
142
+ .catch("X")
143
+ .transform((s) => `${s}!`)
144
+ .optional()
145
+ .parse(undefined)
146
+ ).toBeUndefined();
147
+ expect(
148
+ z
149
+ .transform(() => "T")
150
+ .optional()
151
+ .parse(undefined)
152
+ ).toBeUndefined();
153
+ expect(
154
+ z
155
+ .union([z.preprocess((v) => v ?? "X", z.string()), z.number()])
156
+ .optional()
157
+ .parse(undefined)
158
+ ).toBeUndefined();
159
+ expect(z.object({ a: z.preprocess((v) => v ?? "X", z.string()) }).parse({})).toEqual({ a: "X" });
160
+ });
161
+
162
+ test("ladder: the top rung survives every wrapper order", () => {
163
+ expect(z.string().default("D").optional().parse(undefined)).toBe("D");
164
+ expect(z.string().default("D").optional().optional().parse(undefined)).toBe("D");
165
+ expect(z.string().default("D").nullable().optional().parse(undefined)).toBe("D");
166
+ expect(z.string().default("D").readonly().optional().parse(undefined)).toBe("D");
167
+ expect(z.string().default("D").catch("C").optional().parse(undefined)).toBe("D");
168
+ expect(z.string().default("D").pipe(z.string()).optional().parse(undefined)).toBe("D");
169
+ expect(
170
+ z
171
+ .union([z.string().default("D"), z.number()])
172
+ .optional()
173
+ .parse(undefined)
174
+ ).toBe("D");
175
+ expect(
176
+ z
177
+ .lazy(() => z.string().default("D"))
178
+ .optional()
179
+ .parse(undefined)
180
+ ).toBe("D");
181
+ });
182
+
183
+ test("ladder: record and catchall paths that read optin", () => {
184
+ expect(z.record(z.string(), z.string().default("D")).parse({ k: undefined })).toEqual({ k: "D" });
185
+ expect(z.object({}).catchall(z.string().default("D")).parse({ x: undefined })).toEqual({ x: "D" });
186
+ });
187
+
188
+ test("ladder: async parity", async () => {
189
+ const a = z
190
+ .string()
191
+ .default("")
192
+ .transform(async (v) => (v ? v.split(",") : []));
193
+ expect((await a.optional().safeParseAsync(undefined)).data).toEqual([]);
194
+ expect((await z.object({ a }).partial().safeParseAsync({})).data).toEqual({ a: [] });
195
+ expect(
196
+ (
197
+ await z
198
+ .preprocess(async (v) => v ?? "X", z.string())
199
+ .optional()
200
+ .safeParseAsync(undefined)
201
+ ).data
202
+ ).toBeUndefined();
203
+ });
204
+
205
+ test("ladder: the rung values themselves", () => {
206
+ expect(z.string()._zod.optin).toBeUndefined();
207
+ expect(z.string().optional()._zod.optin).toBe("optional");
208
+ expect(z.transform(() => 1)._zod.optin).toBe("optional");
209
+ expect(z.string().catch("C")._zod.optin).toBe("optional");
210
+ expect(z.string().default("D")._zod.optin).toBe("defaulted");
211
+ expect(z.string().prefault("P")._zod.optin).toBe("defaulted");
212
+ expect(
213
+ z
214
+ .string()
215
+ .default("D")
216
+ .transform((v) => v)._zod.optin
217
+ ).toBe("defaulted");
218
+ expect(z.string().default("D").optional()._zod.optin).toBe("defaulted");
219
+ expect(z.union([z.string().default("D"), z.number()])._zod.optin).toBe("defaulted");
220
+ expect(z.union([z.string().optional(), z.number()])._zod.optin).toBe("optional");
221
+ });
222
+
223
+ test("exactOptional overrides the values and pattern optional installs", () => {
224
+ expect(z.exactOptional(z.enum(["a", "b"]))._zod.values).toEqual(new Set(["a", "b"]));
225
+ // a format carries its pattern on its def; a chained `.regex()` no longer folds into the inner `_zod.pattern`, the template literal derives that itself
226
+ expect(z.exactOptional(z.stringFormat("abc", /^abc$/))._zod.pattern).toEqual(/^abc$/);
227
+ expect(z.templateLiteral(["a", z.exactOptional(z.literal("b"))]).safeParse("a").success).toEqual(false);
228
+ });
229
+
230
+ // The override is installed once, on a prototype every instance of the type shares, so it has to hold for instances built after the first.
231
+ test("exactOptional's override holds for later instances", () => {
232
+ z.exactOptional(z.enum(["a", "b"]));
233
+ expect(z.exactOptional(z.enum(["c", "d"]))._zod.values).toEqual(new Set(["c", "d"]));
234
+ expect(z.exactOptional(z.stringFormat("xyz", /^xyz$/))._zod.pattern).toEqual(/^xyz$/);
235
+ });
@@ -27,7 +27,7 @@ test("optionality", () => {
27
27
  expect(b._zod.optout).toEqual("optional");
28
28
 
29
29
  const c = z.string().default("asdf");
30
- expect(c._zod.optin).toEqual("optional");
30
+ expect(c._zod.optin).toEqual("defaulted");
31
31
  expect(c._zod.optout).toEqual(undefined);
32
32
 
33
33
  const d = z.string().optional().nullable();
@@ -35,27 +35,27 @@ test("optionality", () => {
35
35
  expect(d._zod.optout).toEqual("optional");
36
36
 
37
37
  const e = z.string().default("asdf").nullable();
38
- expect(e._zod.optin).toEqual("optional");
38
+ expect(e._zod.optin).toEqual("defaulted");
39
39
  expect(e._zod.optout).toEqual(undefined);
40
40
 
41
41
  // z.undefined should NOT be optional
42
42
  const f = z.undefined();
43
43
  expect(f._zod.optin).toEqual(undefined);
44
44
  expect(f._zod.optout).toEqual(undefined);
45
- expectTypeOf<typeof f._zod.optin>().toEqualTypeOf<"optional" | undefined>();
45
+ expectTypeOf<typeof f._zod.optin>().toEqualTypeOf<"optional" | "defaulted" | undefined>();
46
46
  expectTypeOf<typeof f._zod.optout>().toEqualTypeOf<"optional" | undefined>();
47
47
 
48
48
  // z.union should be optional if any of the types are optional
49
49
  const g = z.union([z.string(), z.undefined()]);
50
50
  expect(g._zod.optin).toEqual(undefined);
51
51
  expect(g._zod.optout).toEqual(undefined);
52
- expectTypeOf<typeof g._zod.optin>().toEqualTypeOf<"optional" | undefined>();
52
+ expectTypeOf<typeof g._zod.optin>().toEqualTypeOf<"optional" | "defaulted" | undefined>();
53
53
  expectTypeOf<typeof g._zod.optout>().toEqualTypeOf<"optional" | undefined>();
54
54
 
55
55
  const h = z.union([z.string(), z.optional(z.string())]);
56
56
  expect(h._zod.optin).toEqual("optional");
57
57
  expect(h._zod.optout).toEqual("optional");
58
- expectTypeOf<typeof h._zod.optin>().toEqualTypeOf<"optional">();
58
+ expectTypeOf<typeof h._zod.optin>().toEqualTypeOf<"optional" | "defaulted">();
59
59
  expectTypeOf<typeof h._zod.optout>().toEqualTypeOf<"optional">();
60
60
  });
61
61
 
@@ -64,7 +64,7 @@ test("pipe optionality", () => {
64
64
  const a = z.string().optional().pipe(z.string());
65
65
  expect(a._zod.optin).toEqual("optional");
66
66
  expect(a._zod.optout).toEqual(undefined);
67
- expectTypeOf<typeof a._zod.optin>().toEqualTypeOf<"optional">();
67
+ expectTypeOf<typeof a._zod.optin>().toEqualTypeOf<"optional" | "defaulted">();
68
68
  expectTypeOf<typeof a._zod.optout>().toEqualTypeOf<"optional" | undefined>();
69
69
 
70
70
  const b = z
@@ -73,11 +73,11 @@ test("pipe optionality", () => {
73
73
  .pipe(z.string().optional());
74
74
  expect(b._zod.optin).toEqual(undefined);
75
75
  expect(b._zod.optout).toEqual("optional");
76
- expectTypeOf<typeof b._zod.optin>().toEqualTypeOf<"optional" | undefined>();
76
+ expectTypeOf<typeof b._zod.optin>().toEqualTypeOf<"optional" | "defaulted" | undefined>();
77
77
  expectTypeOf<typeof b._zod.optout>().toEqualTypeOf<"optional">();
78
78
 
79
79
  const c = z.string().default("asdf").pipe(z.string());
80
- expect(c._zod.optin).toEqual("optional");
80
+ expect(c._zod.optin).toEqual("defaulted");
81
81
  expect(c._zod.optout).toEqual(undefined);
82
82
 
83
83
  const d = z
@@ -202,7 +202,7 @@ test("exactOptional optionality", () => {
202
202
  const a = z.string().exactOptional();
203
203
  expect(a._zod.optin).toEqual("optional");
204
204
  expect(a._zod.optout).toEqual("optional");
205
- expectTypeOf<typeof a._zod.optin>().toEqualTypeOf<"optional">();
205
+ expectTypeOf<typeof a._zod.optin>().toEqualTypeOf<"optional" | "defaulted">();
206
206
  expectTypeOf<typeof a._zod.optout>().toEqualTypeOf<"optional">();
207
207
  });
208
208
 
@@ -268,10 +268,7 @@ test("exactOptional vs optional comparison", () => {
268
268
  expect(exactOptionalSchema.safeParse({ a: undefined }).success).toEqual(false);
269
269
  });
270
270
 
271
- // Defensive inference coverage: every schema that propagates `optout` participates
272
- // in object-key optionality inference. If anyone ever changes the set of values that
273
- // `optout` can take (or how OptionalOutSchema matches them), these assertions must
274
- // continue to hold or downstream `z.infer<typeof obj>` types silently flip required keys.
271
+ // Defensive inference coverage: every schema that propagates `optout` participates in object-key optionality inference. If anyone ever changes the set of values that `optout` can take (or how OptionalOutSchema matches them), these assertions must continue to hold or downstream `z.infer<typeof obj>` types silently flip required keys.
275
272
  test("object key optionality through optout propagation", () => {
276
273
  const direct = z.object({ k: z.string().optional() });
277
274
  expectTypeOf<z.infer<typeof direct>>().toEqualTypeOf<{ k?: string | undefined }>();
@@ -317,9 +314,7 @@ test("object key optionality through optout propagation", () => {
317
314
  }>();
318
315
  });
319
316
 
320
- // Defensive: tuple optional-tail inference also reads optout. The PR that introduced
321
- // `"includeUndefined"` had to update TupleOutputTypeWithOptionals; pin the result so
322
- // any future flag change has to keep this contract.
317
+ // Defensive: tuple optional-tail inference also reads optout. The PR that introduced `"includeUndefined"` had to update TupleOutputTypeWithOptionals; pin the result so any future flag change has to keep this contract.
323
318
  test("tuple tail optionality through optout propagation", () => {
324
319
  const trailingOptional = z.tuple([z.string(), z.number().optional()]);
325
320
  expectTypeOf<z.output<typeof trailingOptional>>().toEqualTypeOf<[string, (number | undefined)?]>();
@@ -331,3 +326,41 @@ test("tuple tail optionality through optout propagation", () => {
331
326
  const interiorOptional = z.tuple([z.string(), z.number().optional(), z.string()]);
332
327
  expectTypeOf<z.output<typeof interiorOptional>>().toEqualTypeOf<[string, number | undefined, string]>();
333
328
  });
329
+
330
+ // An absent optional key whose check fails has its issue swallowed; the value the check wrote must go with it, on the JIT fastpass as well as the interpreted path.
331
+ test("swallowed issue on an absent optional key drops its value", async () => {
332
+ const schema = z.object({
333
+ a: z
334
+ .string()
335
+ .optional()
336
+ .superRefine((_v, ctx) => {
337
+ ctx.addIssue({ code: "custom", message: "bad" });
338
+ ctx.value = "leaked";
339
+ }),
340
+ });
341
+
342
+ for (const result of [
343
+ schema.safeParse({}),
344
+ schema.safeParse({}, { jitless: true }),
345
+ await schema.safeParseAsync({}),
346
+ ]) {
347
+ expect(result.success).toEqual(true);
348
+ expect("a" in result.data!).toEqual(false);
349
+ }
350
+
351
+ // A present key keeps both the issue and its value.
352
+ expect(schema.safeParse({ a: "x" }).success).toEqual(false);
353
+ expect(schema.safeParse({ a: "x" }, { jitless: true }).success).toEqual(false);
354
+ });
355
+
356
+ test("optional does not swallow an issue it did not cause", () => {
357
+ // A pipe hands its `out` schema the caller's issues array so an unrecognized key can survive to an enclosing intersection. A defaulted inner substituting for absence must not read that as its own failing and drop it.
358
+ const result = z
359
+ .strictObject({ a: z.string() })
360
+ .transform((): number | undefined => undefined)
361
+ .pipe(z.number().default(5).optional())
362
+ .safeParse({ a: "x", extra: 1 });
363
+
364
+ expect(result.success).toBe(false);
365
+ expect(result.error!.issues.map((i) => i.code)).toEqual(["unrecognized_keys"]);
366
+ });
@@ -156,10 +156,7 @@ test("catch/prefault/default", () => {
156
156
  f: z.string().prefault("prefault value"),
157
157
  });
158
158
 
159
- // Catch (d) and default/prefault (b, c, e, f) handle absent keys gracefully.
160
- // `a: catch().optional()` short-circuits to undefined when the original
161
- // input was undefined, so the property is omitted from the output. All
162
- // other catch/default/prefault keys produce their fallback values.
159
+ // Catch (d) and default/prefault (b, c, e, f) handle absent keys gracefully. `a: catch().optional()` short-circuits to undefined when the original input was undefined, so the property is omitted from the output. All other catch/default/prefault keys produce their fallback values.
163
160
  expect(mySchema.parse({})).toMatchInlineSnapshot(`
164
161
  {
165
162
  "b": "default value",
@@ -448,3 +445,53 @@ test("required - refinement is executed on required schema", () => {
448
445
  const validResult = requiredSchema.safeParse({ password: "abc", confirmPassword: "abc" });
449
446
  expect(validResult.success).toBe(true);
450
447
  });
448
+
449
+ test("exactPartial - shallow inference", () => {
450
+ const shallow = nested.exactPartial();
451
+ type shallow = z.infer<typeof shallow>;
452
+ expectTypeOf<shallow>().toEqualTypeOf<{
453
+ name?: string;
454
+ age?: number;
455
+ outer?: { inner: string };
456
+ array?: { asdf: string }[];
457
+ }>();
458
+
459
+ // The point of exactPartial: unlike partial(), this matches TypeScript's Partial<> under exactOptionalPropertyTypes.
460
+ expectTypeOf<shallow>().toEqualTypeOf<Partial<z.infer<typeof nested>>>();
461
+ });
462
+
463
+ test("exactPartial - wraps fields in ZodExactOptional", () => {
464
+ const object = z.object({ name: z.string(), age: z.number() });
465
+ const exact = object.exactPartial();
466
+ expect(exact.shape.name).toBeInstanceOf(z.ZodExactOptional);
467
+ expect(exact.shape.age).toBeInstanceOf(z.ZodExactOptional);
468
+ expect(exact.shape.name.unwrap()).toBeInstanceOf(z.ZodString);
469
+ });
470
+
471
+ test("exactPartial - absent keys pass, explicit undefined rejected", () => {
472
+ const exact = z.object({ name: z.string(), age: z.number() }).exactPartial();
473
+ expect(exact.parse({})).toEqual({});
474
+ expect(exact.parse({ name: "asdf" })).toEqual({ name: "asdf" });
475
+ expect(exact.safeParse({ name: undefined }).success).toBe(false);
476
+ });
477
+
478
+ test("exactPartial with mask", () => {
479
+ const object = z.object({ name: z.string(), age: z.number(), country: z.string() });
480
+ const masked = object.exactPartial({ name: true, age: true });
481
+ expect(masked.shape.name).toBeInstanceOf(z.ZodExactOptional);
482
+ expect(masked.shape.age).toBeInstanceOf(z.ZodExactOptional);
483
+ expect(masked.shape.country).toBeInstanceOf(z.ZodString);
484
+
485
+ type masked = z.infer<typeof masked>;
486
+ expectTypeOf<masked>().toEqualTypeOf<{ name?: string; age?: number; country: string }>();
487
+
488
+ expect(masked.parse({ country: "US" })).toEqual({ country: "US" });
489
+ expect(masked.safeParse({ country: "US", name: undefined }).success).toBe(false);
490
+ });
491
+
492
+ test("exactPartial - throws on schema with refinements", () => {
493
+ const refined = z.object({ name: z.string() }).refine(() => true);
494
+ expect(() => refined.exactPartial()).toThrow(
495
+ ".exactPartial() cannot be used on object schemas containing refinements"
496
+ );
497
+ });
@@ -1,6 +1,76 @@
1
1
  import { expect, expectTypeOf, test } from "vitest";
2
2
  import { z } from "zod/v4";
3
3
 
4
+ test.each([false, true])("undefined prefault preserves object keys (jitless: %s)", async (jitless) => {
5
+ const previous = z.config().jitless;
6
+ z.config({ jitless });
7
+ try {
8
+ let calls = 0;
9
+ const field = z.union([z.string(), z.undefined()]).prefault(() => {
10
+ calls++;
11
+ return undefined;
12
+ });
13
+ const schema = z.object({ a: field });
14
+ expectTypeOf<z.output<typeof field>>().toEqualTypeOf<string | undefined>();
15
+ expectTypeOf<z.input<typeof schema>>().toEqualTypeOf<{ a?: string | undefined }>();
16
+ expectTypeOf<z.output<typeof schema>>().toEqualTypeOf<{ a: string | undefined }>();
17
+ expect(schema.parse({})).toStrictEqual({ a: undefined });
18
+ expect(calls).toBe(1);
19
+ expect(schema.parse({ a: undefined })).toStrictEqual({ a: undefined });
20
+ expect(calls).toBe(2);
21
+ expect(await schema.parseAsync({})).toStrictEqual({ a: undefined });
22
+ expect(calls).toBe(3);
23
+ expect(schema.parse({ a: "value" })).toStrictEqual({ a: "value" });
24
+ expect(schema.safeParse({ a: 123 }).success).toBe(false);
25
+ expect(calls).toBe(3);
26
+
27
+ const literal = z.prefault(z.string().optional(), undefined);
28
+ expect(z.core.compileFn(z.object({ a: literal }))({})).toStrictEqual({ a: undefined });
29
+ for (const wrapped of [literal, literal.readonly(), literal.nullable(), z.lazy(() => literal)]) {
30
+ expect(z.object({ a: wrapped }).parse({})).toStrictEqual({ a: undefined });
31
+ }
32
+ expect(z.object({ a: literal.optional() }).parse({})).toStrictEqual({});
33
+ expect(z.object({ a: literal.optional() }).parse({ a: undefined })).toStrictEqual({ a: undefined });
34
+ expect(z.tuple([literal]).parse([])).toStrictEqual([undefined]);
35
+ } finally {
36
+ z.config({ jitless: previous });
37
+ }
38
+ });
39
+
40
+ test("prefault preserves transformed undefined output", async () => {
41
+ const field = z
42
+ .string()
43
+ .transform(() => undefined)
44
+ .prefault("fallback");
45
+ expectTypeOf<z.output<typeof field>>().toEqualTypeOf<undefined>();
46
+ expect(field.parse(undefined)).toBeUndefined();
47
+ const schema = z.object({ a: field, optional: z.string().optional() });
48
+ expectTypeOf<z.output<typeof schema>>().toEqualTypeOf<{ a: undefined; optional?: string | undefined }>();
49
+ expect(schema.parse({})).toStrictEqual({ a: undefined });
50
+ expect(z.core.compileFn(schema)({})).toStrictEqual({ a: undefined });
51
+ expect(z.compile(schema).parse({})).toStrictEqual({ a: undefined });
52
+ expect(
53
+ await z
54
+ .object({
55
+ a: z
56
+ .string()
57
+ .transform(async () => undefined)
58
+ .prefault("fallback"),
59
+ })
60
+ .parseAsync({})
61
+ ).toStrictEqual({ a: undefined });
62
+ expect(
63
+ z
64
+ .object({
65
+ a: z
66
+ .string()
67
+ .prefault("fallback")
68
+ .transform(() => undefined),
69
+ })
70
+ .parse({})
71
+ ).toStrictEqual({ a: undefined });
72
+ });
73
+
4
74
  test("basic prefault", () => {
5
75
  const a = z.prefault(z.string().trim(), " default ");
6
76
  expect(a).toBeInstanceOf(z.ZodPrefault);
@@ -11,11 +11,11 @@ test("ZodPreprocess<B> assignable to ZodPipe<$ZodTransform, B>", () => {
11
11
 
12
12
  test("ZodPreprocess optin/optout defer to B", () => {
13
13
  const optionalInside = z.preprocess((v) => v, z.string().optional());
14
- expectTypeOf<(typeof optionalInside)["_zod"]["optin"]>().toEqualTypeOf<"optional">();
14
+ expectTypeOf<(typeof optionalInside)["_zod"]["optin"]>().toEqualTypeOf<"optional" | "defaulted">();
15
15
  expectTypeOf<(typeof optionalInside)["_zod"]["optout"]>().toEqualTypeOf<"optional">();
16
16
 
17
17
  const required = z.preprocess((v) => v, z.string());
18
- expectTypeOf<(typeof required)["_zod"]["optin"]>().toEqualTypeOf<"optional" | undefined>();
18
+ expectTypeOf<(typeof required)["_zod"]["optin"]>().toEqualTypeOf<"optional" | "defaulted" | undefined>();
19
19
  expectTypeOf<(typeof required)["_zod"]["optout"]>().toEqualTypeOf<"optional" | undefined>();
20
20
  });
21
21
 
@@ -24,3 +24,21 @@ test("ZodPreprocess input/output inference", () => {
24
24
  expectTypeOf<z.output<typeof pre>>().toEqualTypeOf<number | undefined>();
25
25
  expectTypeOf<z.input<typeof pre>>().toEqualTypeOf<unknown>();
26
26
  });
27
+
28
+ test("ZodPreprocess narrows input from an annotated preprocessor arg", () => {
29
+ const trimmed = z.preprocess((val: string | null | undefined) => val?.trim() ?? "", z.string());
30
+ expectTypeOf<z.input<typeof trimmed>>().toEqualTypeOf<string | null | undefined>();
31
+ expectTypeOf<z.output<typeof trimmed>>().toEqualTypeOf<string>();
32
+
33
+ const obj = z.object({ a: z.preprocess((v: string | number) => String(v), z.string()) });
34
+ expectTypeOf<z.input<typeof obj>>().toEqualTypeOf<{ a: string | number }>();
35
+ expectTypeOf<z.output<typeof obj>>().toEqualTypeOf<{ a: string }>();
36
+ });
37
+
38
+ // The narrowing must ride on the transform's input only. Binding its output too makes $ZodPipeDef's codec-only `transform?` field contravariant in the preprocessor's return type, which drops the bare-type assignability below.
39
+ test("narrowed ZodPreprocess still assignable to the bare type", () => {
40
+ const pre = z.preprocess((v: string) => v.length, z.number());
41
+ const _bare: z.ZodPreprocess<z.ZodNumber> = pre;
42
+ const _bareCore: z.core.$ZodPreprocess = pre;
43
+ expectTypeOf<(typeof pre)["_zod"]["optin"]>().toEqualTypeOf<"optional" | "defaulted" | undefined>();
44
+ });