zod 4.5.3 → 4.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. package/compile.cjs +19 -0
  2. package/index.cjs +19 -0
  3. package/locales/index.cjs +19 -0
  4. package/mini/index.cjs +19 -0
  5. package/package.json +8 -7
  6. package/src/v3/helpers/errorUtil.ts +1 -1
  7. package/src/v4/classic/checks.ts +0 -1
  8. package/src/v4/classic/external.ts +2 -0
  9. package/src/v4/classic/from-json-schema.ts +248 -25
  10. package/src/v4/classic/schemas.ts +255 -164
  11. package/src/v4/classic/tests/assignability.test.ts +59 -9
  12. package/src/v4/classic/tests/bigint.test.ts +6 -0
  13. package/src/v4/classic/tests/continuability.test.ts +2 -2
  14. package/src/v4/classic/tests/cyclic-data.test.ts +316 -0
  15. package/src/v4/classic/tests/default.test.ts +46 -0
  16. package/src/v4/classic/tests/enum.test.ts +9 -0
  17. package/src/v4/classic/tests/error.test.ts +130 -1
  18. package/src/v4/classic/tests/firstparty.test.ts +4 -0
  19. package/src/v4/classic/tests/from-json-schema.test.ts +157 -0
  20. package/src/v4/classic/tests/iban.test.ts +81 -0
  21. package/src/v4/classic/tests/instance-footprint.test.ts +18 -2
  22. package/src/v4/classic/tests/instanceof.test.ts +27 -7
  23. package/src/v4/classic/tests/issue-schema.test.ts +88 -56
  24. package/src/v4/classic/tests/object.test.ts +56 -0
  25. package/src/v4/classic/tests/optin-ladder.test.ts +3 -2
  26. package/src/v4/classic/tests/properties.test.ts +225 -0
  27. package/src/v4/classic/tests/recursive-types.test.ts +1 -1
  28. package/src/v4/classic/tests/standard-schema.test.ts +19 -0
  29. package/src/v4/classic/tests/string.test.ts +25 -0
  30. package/src/v4/classic/tests/template-literal.test.ts +33 -1
  31. package/src/v4/classic/tests/to-json-schema.test.ts +147 -3
  32. package/src/v4/classic/tests/validate.test.ts +569 -0
  33. package/src/v4/core/api.ts +30 -6
  34. package/src/v4/core/checks.ts +1 -101
  35. package/src/v4/core/compile.ts +193 -81
  36. package/src/v4/core/doc.ts +6 -2
  37. package/src/v4/core/errors.ts +3 -6
  38. package/src/v4/core/json-schema-generator.ts +2 -2
  39. package/src/v4/core/json-schema-processors.ts +226 -68
  40. package/src/v4/core/memoizer.ts +162 -36
  41. package/src/v4/core/parse.ts +37 -16
  42. package/src/v4/core/regexes.ts +10 -4
  43. package/src/v4/core/schemas.ts +314 -83
  44. package/src/v4/core/tests/cached.test.ts +54 -0
  45. package/src/v4/core/tests/compile-generative.test.ts +445 -0
  46. package/src/v4/core/tests/compile.test.ts +222 -2
  47. package/src/v4/core/tests/email-regex.test.ts +140 -0
  48. package/src/v4/core/tests/polyfill-collision.test.ts +46 -0
  49. package/src/v4/core/to-json-schema.ts +10 -8
  50. package/src/v4/core/util.ts +222 -147
  51. package/src/v4/core/versions.ts +2 -2
  52. package/src/v4/core/visit.ts +11 -0
  53. package/src/v4/locales/ar.ts +1 -0
  54. package/src/v4/locales/az.ts +1 -0
  55. package/src/v4/locales/be.ts +1 -0
  56. package/src/v4/locales/bg.ts +1 -0
  57. package/src/v4/locales/bn.ts +1 -0
  58. package/src/v4/locales/ca.ts +1 -0
  59. package/src/v4/locales/ckb.ts +1 -0
  60. package/src/v4/locales/cs.ts +1 -0
  61. package/src/v4/locales/da.ts +1 -0
  62. package/src/v4/locales/de.ts +1 -0
  63. package/src/v4/locales/el.ts +1 -0
  64. package/src/v4/locales/en.ts +1 -0
  65. package/src/v4/locales/eo.ts +1 -0
  66. package/src/v4/locales/es.ts +1 -0
  67. package/src/v4/locales/fa.ts +1 -0
  68. package/src/v4/locales/fi.ts +1 -0
  69. package/src/v4/locales/fr-CA.ts +1 -0
  70. package/src/v4/locales/fr.ts +1 -0
  71. package/src/v4/locales/gu.ts +1 -0
  72. package/src/v4/locales/he.ts +1 -0
  73. package/src/v4/locales/hi.ts +1 -0
  74. package/src/v4/locales/hr.ts +1 -0
  75. package/src/v4/locales/hu.ts +1 -0
  76. package/src/v4/locales/hy.ts +1 -0
  77. package/src/v4/locales/id.ts +1 -0
  78. package/src/v4/locales/is.ts +1 -0
  79. package/src/v4/locales/it.ts +1 -0
  80. package/src/v4/locales/ja.ts +1 -0
  81. package/src/v4/locales/ka.ts +1 -0
  82. package/src/v4/locales/km.ts +1 -0
  83. package/src/v4/locales/kn.ts +1 -0
  84. package/src/v4/locales/ko.ts +1 -0
  85. package/src/v4/locales/lt.ts +1 -0
  86. package/src/v4/locales/mk.ts +1 -0
  87. package/src/v4/locales/ms.ts +1 -0
  88. package/src/v4/locales/ne.ts +1 -0
  89. package/src/v4/locales/nl.ts +1 -0
  90. package/src/v4/locales/nn.ts +1 -0
  91. package/src/v4/locales/no.ts +1 -0
  92. package/src/v4/locales/ota.ts +1 -0
  93. package/src/v4/locales/pl.ts +1 -0
  94. package/src/v4/locales/ps.ts +1 -0
  95. package/src/v4/locales/pt-BR.ts +1 -0
  96. package/src/v4/locales/pt.ts +1 -0
  97. package/src/v4/locales/ro.ts +1 -0
  98. package/src/v4/locales/ru.ts +1 -0
  99. package/src/v4/locales/sk.ts +1 -0
  100. package/src/v4/locales/sl.ts +1 -0
  101. package/src/v4/locales/sv.ts +1 -0
  102. package/src/v4/locales/ta.ts +1 -0
  103. package/src/v4/locales/th.ts +1 -0
  104. package/src/v4/locales/tk.ts +1 -0
  105. package/src/v4/locales/tr.ts +1 -0
  106. package/src/v4/locales/uk.ts +1 -0
  107. package/src/v4/locales/ur.ts +1 -0
  108. package/src/v4/locales/uz.ts +1 -0
  109. package/src/v4/locales/vi.ts +1 -0
  110. package/src/v4/locales/yo.ts +1 -0
  111. package/src/v4/locales/zh-CN.ts +1 -0
  112. package/src/v4/locales/zh-TW.ts +1 -0
  113. package/src/v4/mini/checks.ts +0 -1
  114. package/src/v4/mini/external.ts +2 -0
  115. package/src/v4/mini/schemas.ts +38 -2
  116. package/src/v4/mini/tests/checks.test.ts +1 -1
  117. package/src/v4/mini/tests/computed.test.ts +11 -17
  118. package/src/v4/mini/tests/index.test.ts +8 -0
  119. package/src/v4/mini/tests/string.test.ts +16 -0
  120. package/v3/ZodError.cjs +19 -0
  121. package/v3/errors.cjs +19 -0
  122. package/v3/external.cjs +19 -0
  123. package/v3/helpers/enumUtil.cjs +19 -0
  124. package/v3/helpers/errorUtil.cjs +20 -1
  125. package/v3/helpers/errorUtil.js +1 -1
  126. package/v3/helpers/parseUtil.cjs +19 -0
  127. package/v3/helpers/partialUtil.cjs +19 -0
  128. package/v3/helpers/typeAliases.cjs +19 -0
  129. package/v3/helpers/util.cjs +19 -0
  130. package/v3/index.cjs +19 -0
  131. package/v3/standard-schema.cjs +19 -0
  132. package/v3/types.cjs +19 -0
  133. package/v4/classic/checks.cjs +20 -2
  134. package/v4/classic/checks.d.cts +1 -1
  135. package/v4/classic/checks.d.ts +1 -1
  136. package/v4/classic/checks.js +1 -1
  137. package/v4/classic/coerce.cjs +19 -0
  138. package/v4/classic/compat.cjs +19 -0
  139. package/v4/classic/deep-partial.cjs +19 -0
  140. package/v4/classic/errors.cjs +19 -0
  141. package/v4/classic/external.cjs +22 -1
  142. package/v4/classic/external.d.cts +1 -1
  143. package/v4/classic/external.d.ts +1 -1
  144. package/v4/classic/external.js +1 -1
  145. package/v4/classic/from-json-schema.cjs +264 -24
  146. package/v4/classic/from-json-schema.js +245 -24
  147. package/v4/classic/in-out.cjs +19 -0
  148. package/v4/classic/index.cjs +19 -0
  149. package/v4/classic/iso.cjs +19 -0
  150. package/v4/classic/parse.cjs +19 -0
  151. package/v4/classic/schemas.cjs +100 -31
  152. package/v4/classic/schemas.d.cts +17 -1
  153. package/v4/classic/schemas.d.ts +17 -1
  154. package/v4/classic/schemas.js +77 -29
  155. package/v4/core/api.cjs +37 -2
  156. package/v4/core/api.d.cts +6 -4
  157. package/v4/core/api.d.ts +6 -4
  158. package/v4/core/api.js +17 -2
  159. package/v4/core/checks.cjs +19 -96
  160. package/v4/core/checks.d.cts +1 -1
  161. package/v4/core/checks.d.ts +1 -1
  162. package/v4/core/checks.js +0 -96
  163. package/v4/core/compile.cjs +164 -65
  164. package/v4/core/compile.d.cts +18 -4
  165. package/v4/core/compile.d.ts +18 -4
  166. package/v4/core/compile.js +145 -66
  167. package/v4/core/core.cjs +19 -0
  168. package/v4/core/doc.cjs +26 -2
  169. package/v4/core/doc.js +7 -2
  170. package/v4/core/errors.cjs +21 -5
  171. package/v4/core/errors.js +2 -5
  172. package/v4/core/index.cjs +19 -0
  173. package/v4/core/json-schema-generator.cjs +20 -1
  174. package/v4/core/json-schema-generator.js +2 -2
  175. package/v4/core/json-schema-processors.cjs +215 -63
  176. package/v4/core/json-schema-processors.d.cts +17 -0
  177. package/v4/core/json-schema-processors.d.ts +17 -0
  178. package/v4/core/json-schema-processors.js +195 -64
  179. package/v4/core/json-schema.cjs +19 -0
  180. package/v4/core/memoizer.cjs +204 -36
  181. package/v4/core/memoizer.js +162 -36
  182. package/v4/core/parse.cjs +56 -16
  183. package/v4/core/parse.js +37 -16
  184. package/v4/core/regexes.cjs +29 -6
  185. package/v4/core/regexes.d.cts +2 -0
  186. package/v4/core/regexes.d.ts +2 -0
  187. package/v4/core/regexes.js +8 -4
  188. package/v4/core/registries.cjs +19 -0
  189. package/v4/core/schemas.cjs +285 -66
  190. package/v4/core/schemas.d.cts +34 -3
  191. package/v4/core/schemas.d.ts +34 -3
  192. package/v4/core/schemas.js +264 -65
  193. package/v4/core/standard-schema.cjs +19 -0
  194. package/v4/core/to-json-schema.cjs +29 -7
  195. package/v4/core/to-json-schema.d.cts +7 -3
  196. package/v4/core/to-json-schema.d.ts +7 -3
  197. package/v4/core/to-json-schema.js +8 -7
  198. package/v4/core/util.cjs +181 -143
  199. package/v4/core/util.d.cts +25 -4
  200. package/v4/core/util.d.ts +25 -4
  201. package/v4/core/util.js +160 -143
  202. package/v4/core/versions.cjs +21 -2
  203. package/v4/core/versions.d.cts +1 -1
  204. package/v4/core/versions.d.ts +1 -1
  205. package/v4/core/versions.js +2 -2
  206. package/v4/core/visit.cjs +31 -0
  207. package/v4/core/visit.js +12 -0
  208. package/v4/index.cjs +19 -0
  209. package/v4/locales/ar.cjs +1 -0
  210. package/v4/locales/ar.js +1 -0
  211. package/v4/locales/az.cjs +1 -0
  212. package/v4/locales/az.js +1 -0
  213. package/v4/locales/be.cjs +1 -0
  214. package/v4/locales/be.js +1 -0
  215. package/v4/locales/bg.cjs +1 -0
  216. package/v4/locales/bg.js +1 -0
  217. package/v4/locales/bn.cjs +1 -0
  218. package/v4/locales/bn.js +1 -0
  219. package/v4/locales/ca.cjs +1 -0
  220. package/v4/locales/ca.js +1 -0
  221. package/v4/locales/ckb.cjs +1 -0
  222. package/v4/locales/ckb.js +1 -0
  223. package/v4/locales/cs.cjs +1 -0
  224. package/v4/locales/cs.js +1 -0
  225. package/v4/locales/da.cjs +1 -0
  226. package/v4/locales/da.js +1 -0
  227. package/v4/locales/de.cjs +1 -0
  228. package/v4/locales/de.js +1 -0
  229. package/v4/locales/el.cjs +1 -0
  230. package/v4/locales/el.js +1 -0
  231. package/v4/locales/en.cjs +1 -0
  232. package/v4/locales/en.js +1 -0
  233. package/v4/locales/eo.cjs +1 -0
  234. package/v4/locales/eo.js +1 -0
  235. package/v4/locales/es.cjs +1 -0
  236. package/v4/locales/es.js +1 -0
  237. package/v4/locales/fa.cjs +1 -0
  238. package/v4/locales/fa.js +1 -0
  239. package/v4/locales/fi.cjs +1 -0
  240. package/v4/locales/fi.js +1 -0
  241. package/v4/locales/fr-CA.cjs +1 -0
  242. package/v4/locales/fr-CA.js +1 -0
  243. package/v4/locales/fr.cjs +1 -0
  244. package/v4/locales/fr.js +1 -0
  245. package/v4/locales/gu.cjs +1 -0
  246. package/v4/locales/gu.js +1 -0
  247. package/v4/locales/he.cjs +1 -0
  248. package/v4/locales/he.js +1 -0
  249. package/v4/locales/hi.cjs +1 -0
  250. package/v4/locales/hi.js +1 -0
  251. package/v4/locales/hr.cjs +1 -0
  252. package/v4/locales/hr.js +1 -0
  253. package/v4/locales/hu.cjs +1 -0
  254. package/v4/locales/hu.js +1 -0
  255. package/v4/locales/hy.cjs +1 -0
  256. package/v4/locales/hy.js +1 -0
  257. package/v4/locales/id.cjs +1 -0
  258. package/v4/locales/id.js +1 -0
  259. package/v4/locales/index.cjs +19 -0
  260. package/v4/locales/is.cjs +1 -0
  261. package/v4/locales/is.js +1 -0
  262. package/v4/locales/it.cjs +1 -0
  263. package/v4/locales/it.js +1 -0
  264. package/v4/locales/ja.cjs +1 -0
  265. package/v4/locales/ja.js +1 -0
  266. package/v4/locales/ka.cjs +1 -0
  267. package/v4/locales/ka.js +1 -0
  268. package/v4/locales/km.cjs +1 -0
  269. package/v4/locales/km.js +1 -0
  270. package/v4/locales/kn.cjs +1 -0
  271. package/v4/locales/kn.js +1 -0
  272. package/v4/locales/ko.cjs +1 -0
  273. package/v4/locales/ko.js +1 -0
  274. package/v4/locales/lt.cjs +1 -0
  275. package/v4/locales/lt.js +1 -0
  276. package/v4/locales/mk.cjs +1 -0
  277. package/v4/locales/mk.js +1 -0
  278. package/v4/locales/ms.cjs +1 -0
  279. package/v4/locales/ms.js +1 -0
  280. package/v4/locales/ne.cjs +1 -0
  281. package/v4/locales/ne.js +1 -0
  282. package/v4/locales/nl.cjs +1 -0
  283. package/v4/locales/nl.js +1 -0
  284. package/v4/locales/nn.cjs +1 -0
  285. package/v4/locales/nn.js +1 -0
  286. package/v4/locales/no.cjs +1 -0
  287. package/v4/locales/no.js +1 -0
  288. package/v4/locales/ota.cjs +1 -0
  289. package/v4/locales/ota.js +1 -0
  290. package/v4/locales/pl.cjs +1 -0
  291. package/v4/locales/pl.js +1 -0
  292. package/v4/locales/ps.cjs +1 -0
  293. package/v4/locales/ps.js +1 -0
  294. package/v4/locales/pt-BR.cjs +1 -0
  295. package/v4/locales/pt-BR.js +1 -0
  296. package/v4/locales/pt.cjs +1 -0
  297. package/v4/locales/pt.js +1 -0
  298. package/v4/locales/ro.cjs +1 -0
  299. package/v4/locales/ro.js +1 -0
  300. package/v4/locales/ru.cjs +1 -0
  301. package/v4/locales/ru.js +1 -0
  302. package/v4/locales/sk.cjs +1 -0
  303. package/v4/locales/sk.js +1 -0
  304. package/v4/locales/sl.cjs +1 -0
  305. package/v4/locales/sl.js +1 -0
  306. package/v4/locales/sv.cjs +1 -0
  307. package/v4/locales/sv.js +1 -0
  308. package/v4/locales/ta.cjs +1 -0
  309. package/v4/locales/ta.js +1 -0
  310. package/v4/locales/th.cjs +1 -0
  311. package/v4/locales/th.js +1 -0
  312. package/v4/locales/tk.cjs +1 -0
  313. package/v4/locales/tk.js +1 -0
  314. package/v4/locales/tr.cjs +1 -0
  315. package/v4/locales/tr.js +1 -0
  316. package/v4/locales/uk.cjs +1 -0
  317. package/v4/locales/uk.js +1 -0
  318. package/v4/locales/ur.cjs +1 -0
  319. package/v4/locales/ur.js +1 -0
  320. package/v4/locales/uz.cjs +1 -0
  321. package/v4/locales/uz.js +1 -0
  322. package/v4/locales/vi.cjs +1 -0
  323. package/v4/locales/vi.js +1 -0
  324. package/v4/locales/yo.cjs +1 -0
  325. package/v4/locales/yo.js +1 -0
  326. package/v4/locales/zh-CN.cjs +1 -0
  327. package/v4/locales/zh-CN.js +1 -0
  328. package/v4/locales/zh-TW.cjs +1 -0
  329. package/v4/locales/zh-TW.js +1 -0
  330. package/v4/mini/checks.cjs +20 -2
  331. package/v4/mini/checks.d.cts +1 -1
  332. package/v4/mini/checks.d.ts +1 -1
  333. package/v4/mini/checks.js +1 -1
  334. package/v4/mini/coerce.cjs +19 -0
  335. package/v4/mini/deep-partial.cjs +19 -0
  336. package/v4/mini/external.cjs +22 -1
  337. package/v4/mini/external.d.cts +1 -1
  338. package/v4/mini/external.d.ts +1 -1
  339. package/v4/mini/external.js +1 -1
  340. package/v4/mini/in-out.cjs +19 -0
  341. package/v4/mini/index.cjs +19 -0
  342. package/v4/mini/iso.cjs +19 -0
  343. package/v4/mini/parse.cjs +19 -0
  344. package/v4/mini/schemas.cjs +42 -4
  345. package/v4/mini/schemas.d.cts +8 -0
  346. package/v4/mini/schemas.d.ts +8 -0
  347. package/v4/mini/schemas.js +19 -2
  348. package/v4-mini/index.cjs +19 -0
@@ -78,6 +78,8 @@ export interface ZodType<
78
78
  data: unknown,
79
79
  params?: core.ParseContext<core.$ZodIssue>
80
80
  ) => Promise<parse.ZodSafeParseResult<core.output<this>>>;
81
+ validate(data: unknown, params?: core.ParseContext<core.$ZodIssue>): data is core.input<this>;
82
+ validateAsync(data: unknown, params?: core.ParseContext<core.$ZodIssue>): Promise<boolean>;
81
83
 
82
84
  // encoding/decoding
83
85
  encode(data: core.output<this>, params?: core.ParseContext<core.$ZodIssue>): core.input<this>;
@@ -310,6 +312,12 @@ export const ZodType: core.$constructor<ZodType> = /*@__PURE__*/ core.$construct
310
312
  set spa(value: ZodType["safeParseAsync"]) {
311
313
  util.own(this, "spa", value);
312
314
  },
315
+ validate(data, params) {
316
+ return parse.validate(this, data, params);
317
+ },
318
+ validateAsync(data, params) {
319
+ return parse.validateAsync(this, data, params);
320
+ },
313
321
  encode: function _encode(data, params) {
314
322
  return parse.encode(this, data, params, { callee: _encode });
315
323
  },
@@ -383,59 +391,61 @@ export const _ZodString: core.$constructor<_ZodString> = /*@__PURE__*/ core.$con
383
391
  ZodType.init(inst, def);
384
392
 
385
393
  inst._zod.processJSONSchema = (ctx, json, params) => processors.stringProcessor(inst, ctx, json, params);
386
-
387
- const bag = inst._zod.bag;
388
- inst.format = bag.format ?? null;
389
- inst.minLength = bag.minimum ?? null;
390
- inst.maxLength = bag.maximum ?? null;
391
394
  },
392
- {
393
- regex(...args) {
394
- return this.check((checks.regex as any)(...args));
395
- },
396
- includes(...args) {
397
- return this.check((checks.includes as any)(...args));
398
- },
399
- startsWith(...args) {
400
- return this.check((checks.startsWith as any)(...args));
401
- },
402
- endsWith(...args) {
403
- return this.check((checks.endsWith as any)(...args));
404
- },
405
- min(...args) {
406
- return this.check((checks.minLength as any)(...args));
407
- },
408
- max(...args) {
409
- return this.check((checks.maxLength as any)(...args));
410
- },
411
- length(...args) {
412
- return this.check((checks.length as any)(...args));
413
- },
414
- nonempty(...args) {
415
- return this.check((checks.minLength as any)(1, ...args));
416
- },
417
- lowercase(params) {
418
- return this.check(checks.lowercase(params));
419
- },
420
- uppercase(params) {
421
- return this.check(checks.uppercase(params));
422
- },
423
- trim() {
424
- return this.check(checks.trim());
425
- },
426
- normalize(...args) {
427
- return this.check(checks.normalize(...args));
428
- },
429
- toLowerCase() {
430
- return this.check(checks.toLowerCase());
431
- },
432
- toUpperCase() {
433
- return this.check(checks.toUpperCase());
434
- },
435
- slugify() {
436
- return this.check(checks.slugify());
395
+ /*@__PURE__*/ util.derived<_ZodString>(
396
+ {
397
+ format: (inst) => processors.aggregateChecks(inst).format ?? null,
398
+ minLength: (inst) => processors.aggregateChecks<number>(inst).minimum ?? null,
399
+ maxLength: (inst) => processors.aggregateChecks<number>(inst).maximum ?? null,
437
400
  },
438
- }
401
+ {
402
+ regex(...args) {
403
+ return this.check((checks.regex as any)(...args));
404
+ },
405
+ includes(...args) {
406
+ return this.check((checks.includes as any)(...args));
407
+ },
408
+ startsWith(...args) {
409
+ return this.check((checks.startsWith as any)(...args));
410
+ },
411
+ endsWith(...args) {
412
+ return this.check((checks.endsWith as any)(...args));
413
+ },
414
+ min(...args) {
415
+ return this.check((checks.minLength as any)(...args));
416
+ },
417
+ max(...args) {
418
+ return this.check((checks.maxLength as any)(...args));
419
+ },
420
+ length(...args) {
421
+ return this.check((checks.length as any)(...args));
422
+ },
423
+ nonempty(...args) {
424
+ return this.check((checks.minLength as any)(1, ...args));
425
+ },
426
+ lowercase(params) {
427
+ return this.check(checks.lowercase(params));
428
+ },
429
+ uppercase(params) {
430
+ return this.check(checks.uppercase(params));
431
+ },
432
+ trim() {
433
+ return this.check(checks.trim());
434
+ },
435
+ normalize(...args) {
436
+ return this.check(checks.normalize(...args));
437
+ },
438
+ toLowerCase() {
439
+ return this.check(checks.toLowerCase());
440
+ },
441
+ toUpperCase() {
442
+ return this.check(checks.toUpperCase());
443
+ },
444
+ slugify() {
445
+ return this.check(checks.slugify());
446
+ },
447
+ }
448
+ )
439
449
  );
440
450
 
441
451
  export interface ZodString extends _ZodString<core.$ZodStringInternals<string>> {
@@ -1020,6 +1030,19 @@ export function creditCard(params?: string | core.$ZodCreditCardParams): ZodCred
1020
1030
  return core._creditCard(ZodCreditCard, params);
1021
1031
  }
1022
1032
 
1033
+ // ZodIBAN
1034
+ export interface ZodIBAN extends ZodStringFormat<"iban"> {
1035
+ _zod: core.$ZodIBANInternals;
1036
+ }
1037
+ export const ZodIBAN: core.$constructor<ZodIBAN> = /*@__PURE__*/ core.$constructor("ZodIBAN", (inst, def) => {
1038
+ core.$ZodIBAN.init(inst, def);
1039
+ ZodStringFormat.init(inst, def);
1040
+ });
1041
+
1042
+ export function iban(params?: string | core.$ZodIBANParams): ZodIBAN {
1043
+ return core._iban(ZodIBAN, params);
1044
+ }
1045
+
1023
1046
  // ZodJWT
1024
1047
  export interface ZodJWT extends ZodStringFormat<"jwt"> {
1025
1048
  _zod: core.$ZodJWTInternals;
@@ -1123,63 +1146,72 @@ export const ZodNumber: core.$constructor<ZodNumber> = /*@__PURE__*/ core.$const
1123
1146
  ZodType.init(inst, def);
1124
1147
 
1125
1148
  inst._zod.processJSONSchema = (ctx, json, params) => processors.numberProcessor(inst, ctx, json, params);
1126
-
1127
- const bag = inst._zod.bag;
1128
- inst.minValue =
1129
- Math.max(bag.minimum ?? Number.NEGATIVE_INFINITY, bag.exclusiveMinimum ?? Number.NEGATIVE_INFINITY) ?? null;
1130
- inst.maxValue =
1131
- Math.min(bag.maximum ?? Number.POSITIVE_INFINITY, bag.exclusiveMaximum ?? Number.POSITIVE_INFINITY) ?? null;
1132
- inst.isInt = (bag.format ?? "").includes("int") || Number.isSafeInteger(bag.multipleOf ?? 0.5);
1133
1149
  inst.isFinite = true;
1134
- inst.format = bag.format ?? null;
1135
1150
  },
1136
- {
1137
- gt(value, params) {
1138
- return this.check(checks.gt(value, params));
1139
- },
1140
- gte(value, params) {
1141
- return this.check(checks.gte(value, params));
1142
- },
1143
- min(value, params) {
1144
- return this.check(checks.gte(value, params));
1145
- },
1146
- lt(value, params) {
1147
- return this.check(checks.lt(value, params));
1148
- },
1149
- lte(value, params) {
1150
- return this.check(checks.lte(value, params));
1151
- },
1152
- max(value, params) {
1153
- return this.check(checks.lte(value, params));
1154
- },
1155
- int(params) {
1156
- return this.check(int(params));
1157
- },
1158
- safe(params) {
1159
- return this.check(int(params));
1160
- },
1161
- positive(params) {
1162
- return this.check(checks.gt(0, params));
1163
- },
1164
- nonnegative(params) {
1165
- return this.check(checks.gte(0, params));
1166
- },
1167
- negative(params) {
1168
- return this.check(checks.lt(0, params));
1169
- },
1170
- nonpositive(params) {
1171
- return this.check(checks.lte(0, params));
1172
- },
1173
- multipleOf(value, params) {
1174
- return this.check(checks.multipleOf(value, params));
1175
- },
1176
- step(value, params) {
1177
- return this.check(checks.multipleOf(value, params));
1178
- },
1179
- finite() {
1180
- return this;
1151
+ /*@__PURE__*/ util.derived<ZodNumber>(
1152
+ {
1153
+ minValue: (inst) => {
1154
+ const { minimum, exclusiveMinimum } = processors.aggregateChecks<number>(inst);
1155
+ return Math.max(minimum ?? Number.NEGATIVE_INFINITY, exclusiveMinimum ?? Number.NEGATIVE_INFINITY);
1156
+ },
1157
+ maxValue: (inst) => {
1158
+ const { maximum, exclusiveMaximum } = processors.aggregateChecks<number>(inst);
1159
+ return Math.min(maximum ?? Number.POSITIVE_INFINITY, exclusiveMaximum ?? Number.POSITIVE_INFINITY);
1160
+ },
1161
+ isInt: (inst) => {
1162
+ const { isInt, multipleOf } = processors.aggregateChecks(inst);
1163
+ return !!isInt || !!multipleOf?.some(Number.isSafeInteger);
1164
+ },
1165
+ format: (inst) => processors.aggregateChecks(inst).format ?? null,
1181
1166
  },
1182
- }
1167
+ {
1168
+ gt(value, params) {
1169
+ return this.check(checks.gt(value, params));
1170
+ },
1171
+ gte(value, params) {
1172
+ return this.check(checks.gte(value, params));
1173
+ },
1174
+ min(value, params) {
1175
+ return this.check(checks.gte(value, params));
1176
+ },
1177
+ lt(value, params) {
1178
+ return this.check(checks.lt(value, params));
1179
+ },
1180
+ lte(value, params) {
1181
+ return this.check(checks.lte(value, params));
1182
+ },
1183
+ max(value, params) {
1184
+ return this.check(checks.lte(value, params));
1185
+ },
1186
+ int(params) {
1187
+ return this.check(int(params));
1188
+ },
1189
+ safe(params) {
1190
+ return this.check(int(params));
1191
+ },
1192
+ positive(params) {
1193
+ return this.check(checks.gt(0, params));
1194
+ },
1195
+ nonnegative(params) {
1196
+ return this.check(checks.gte(0, params));
1197
+ },
1198
+ negative(params) {
1199
+ return this.check(checks.lt(0, params));
1200
+ },
1201
+ nonpositive(params) {
1202
+ return this.check(checks.lte(0, params));
1203
+ },
1204
+ multipleOf(value, params) {
1205
+ return this.check(checks.multipleOf(value, params));
1206
+ },
1207
+ step(value, params) {
1208
+ return this.check(checks.multipleOf(value, params));
1209
+ },
1210
+ finite() {
1211
+ return this;
1212
+ },
1213
+ }
1214
+ )
1183
1215
  );
1184
1216
 
1185
1217
  export function number(params?: string | core.$ZodNumberParams): ZodNumber {
@@ -1269,47 +1301,49 @@ export const ZodBigInt: core.$constructor<ZodBigInt> = /*@__PURE__*/ core.$const
1269
1301
  core.$ZodBigInt.init(inst, def);
1270
1302
  ZodType.init(inst, def);
1271
1303
  inst._zod.processJSONSchema = (ctx, json, params) => processors.bigintProcessor(inst, ctx, json, params);
1272
-
1273
- const bag = inst._zod.bag;
1274
- inst.minValue = bag.minimum ?? null;
1275
- inst.maxValue = bag.maximum ?? null;
1276
- inst.format = bag.format ?? null;
1277
1304
  },
1278
- {
1279
- gte(value, params) {
1280
- return this.check(checks.gte(value, params));
1281
- },
1282
- min(value, params) {
1283
- return this.check(checks.gte(value, params));
1284
- },
1285
- gt(value, params) {
1286
- return this.check(checks.gt(value, params));
1287
- },
1288
- lt(value, params) {
1289
- return this.check(checks.lt(value, params));
1290
- },
1291
- lte(value, params) {
1292
- return this.check(checks.lte(value, params));
1293
- },
1294
- max(value, params) {
1295
- return this.check(checks.lte(value, params));
1296
- },
1297
- positive(params) {
1298
- return this.check(checks.gt(BigInt(0), params));
1299
- },
1300
- negative(params) {
1301
- return this.check(checks.lt(BigInt(0), params));
1302
- },
1303
- nonpositive(params) {
1304
- return this.check(checks.lte(BigInt(0), params));
1305
- },
1306
- nonnegative(params) {
1307
- return this.check(checks.gte(BigInt(0), params));
1308
- },
1309
- multipleOf(value, params) {
1310
- return this.check(checks.multipleOf(value, params));
1305
+ /*@__PURE__*/ util.derived<ZodBigInt>(
1306
+ {
1307
+ minValue: (inst) => processors.aggregateChecks<bigint>(inst).minimum ?? null,
1308
+ maxValue: (inst) => processors.aggregateChecks<bigint>(inst).maximum ?? null,
1309
+ format: (inst) => processors.aggregateChecks(inst).format ?? null,
1311
1310
  },
1312
- }
1311
+ {
1312
+ gte(value, params) {
1313
+ return this.check(checks.gte(value, params));
1314
+ },
1315
+ min(value, params) {
1316
+ return this.check(checks.gte(value, params));
1317
+ },
1318
+ gt(value, params) {
1319
+ return this.check(checks.gt(value, params));
1320
+ },
1321
+ lt(value, params) {
1322
+ return this.check(checks.lt(value, params));
1323
+ },
1324
+ lte(value, params) {
1325
+ return this.check(checks.lte(value, params));
1326
+ },
1327
+ max(value, params) {
1328
+ return this.check(checks.lte(value, params));
1329
+ },
1330
+ positive(params) {
1331
+ return this.check(checks.gt(BigInt(0), params));
1332
+ },
1333
+ negative(params) {
1334
+ return this.check(checks.lt(BigInt(0), params));
1335
+ },
1336
+ nonpositive(params) {
1337
+ return this.check(checks.lte(BigInt(0), params));
1338
+ },
1339
+ nonnegative(params) {
1340
+ return this.check(checks.gte(BigInt(0), params));
1341
+ },
1342
+ multipleOf(value, params) {
1343
+ return this.check(checks.multipleOf(value, params));
1344
+ },
1345
+ }
1346
+ )
1313
1347
  );
1314
1348
 
1315
1349
  export function bigint(params?: string | core.$ZodBigIntParams): ZodBigInt {
@@ -1443,18 +1477,30 @@ export interface _ZodDate<T extends core.$ZodDateInternals = core.$ZodDateIntern
1443
1477
  }
1444
1478
 
1445
1479
  export interface ZodDate extends _ZodDate<core.$ZodDateInternals<Date>> {}
1446
- export const ZodDate: core.$constructor<ZodDate> = /*@__PURE__*/ core.$constructor("ZodDate", (inst, def) => {
1447
- core.$ZodDate.init(inst, def);
1448
- ZodType.init(inst, def);
1449
- inst._zod.processJSONSchema = (ctx, json, params) => processors.dateProcessor(inst, ctx, json, params);
1450
-
1451
- inst.min = (value, params) => inst.check(checks.gte(value, params));
1452
- inst.max = (value, params) => inst.check(checks.lte(value, params));
1480
+ export const ZodDate: core.$constructor<ZodDate> = /*@__PURE__*/ core.$constructor<ZodDate>(
1481
+ "ZodDate",
1482
+ (inst, def) => {
1483
+ core.$ZodDate.init(inst, def);
1484
+ ZodType.init(inst, def);
1485
+ inst._zod.processJSONSchema = (ctx, json, params) => processors.dateProcessor(inst, ctx, json, params);
1453
1486
 
1454
- const c = inst._zod.bag;
1455
- inst.minDate = c.minimum ? new Date(c.minimum) : null;
1456
- inst.maxDate = c.maximum ? new Date(c.maximum) : null;
1457
- });
1487
+ inst.min = (value, params) => inst.check(checks.gte(value, params));
1488
+ inst.max = (value, params) => inst.check(checks.lte(value, params));
1489
+ },
1490
+ /*@__PURE__*/ util.derived<ZodDate>(
1491
+ {
1492
+ minDate: (inst) => {
1493
+ const { minimum } = processors.aggregateChecks<Date>(inst);
1494
+ return minimum ? new Date(minimum) : null;
1495
+ },
1496
+ maxDate: (inst) => {
1497
+ const { maximum } = processors.aggregateChecks<Date>(inst);
1498
+ return maximum ? new Date(maximum) : null;
1499
+ },
1500
+ },
1501
+ {}
1502
+ )
1503
+ );
1458
1504
 
1459
1505
  export function date(params?: string | core.$ZodDateParams): ZodDate {
1460
1506
  return core._date(ZodDate, params);
@@ -1635,19 +1681,20 @@ export const ZodObject: core.$constructor<ZodObject> = /*@__PURE__*/ core.$const
1635
1681
  return _enum(Object.keys(this._zod.def.shape));
1636
1682
  },
1637
1683
  catchall(catchall) {
1638
- return this.clone({ ...this._zod.def, catchall: catchall as any });
1684
+ // `mergeDefs` rather than a spread: spreading reads `shape`, and resolving it can mint a whole fresh subtree
1685
+ return this.clone(util.mergeDefs(this._zod.def, { catchall: catchall as any }));
1639
1686
  },
1640
1687
  passthrough() {
1641
- return this.clone({ ...this._zod.def, catchall: unknown() });
1688
+ return this.clone(util.mergeDefs(this._zod.def, { catchall: unknown() }));
1642
1689
  },
1643
1690
  loose() {
1644
- return this.clone({ ...this._zod.def, catchall: unknown() });
1691
+ return this.clone(util.mergeDefs(this._zod.def, { catchall: unknown() }));
1645
1692
  },
1646
1693
  strict() {
1647
- return this.clone({ ...this._zod.def, catchall: never() });
1694
+ return this.clone(util.mergeDefs(this._zod.def, { catchall: never() }));
1648
1695
  },
1649
1696
  strip() {
1650
- return this.clone({ ...this._zod.def, catchall: undefined });
1697
+ return this.clone(util.mergeDefs(this._zod.def, { catchall: undefined }));
1651
1698
  },
1652
1699
  extend(incoming) {
1653
1700
  return util.extend(this, incoming);
@@ -2060,7 +2107,8 @@ export const ZodEnum: core.$constructor<ZodEnum> = /*@__PURE__*/ core.$construct
2060
2107
  inst._zod.processJSONSchema = (ctx, json, params) => processors.enumProcessor(inst, ctx, json, params);
2061
2108
 
2062
2109
  inst.enum = def.entries;
2063
- inst.options = Object.values(def.entries);
2110
+ // reuse the parsed value set so a numeric TS enum's reverse-mapping keys stay out
2111
+ inst.options = [...inst._zod.values] as util.EnumValue[];
2064
2112
 
2065
2113
  const keys = new Set(Object.keys(def.entries));
2066
2114
 
@@ -2743,6 +2791,28 @@ export const ZodCustom: core.$constructor<ZodCustom> = /*@__PURE__*/ core.$const
2743
2791
  inst._zod.processJSONSchema = (ctx, json, params) => processors.customProcessor(inst, ctx, json, params);
2744
2792
  });
2745
2793
 
2794
+ // ZodProperties
2795
+ export interface ZodProperties<Shape extends core.$ZodShape = core.$ZodShape>
2796
+ extends _ZodType<core.$ZodPropertiesInternals<Shape>>,
2797
+ core.$ZodProperties<Shape> {
2798
+ "~standard": ZodStandardSchemaWithJSON<this>;
2799
+ }
2800
+ export const ZodProperties: core.$constructor<ZodProperties> = /*@__PURE__*/ core.$constructor(
2801
+ "ZodProperties",
2802
+ (inst, def) => {
2803
+ _ensureDefaultMemoizer();
2804
+ core.$ZodProperties.init(inst, def);
2805
+ ZodType.init(inst, def);
2806
+ }
2807
+ );
2808
+
2809
+ export function properties<Shape extends core.$ZodShape>(
2810
+ shape: Shape,
2811
+ params?: string | core.$ZodPropertiesParams
2812
+ ): ZodProperties<Shape> {
2813
+ return core._properties(ZodProperties, shape, params) as any;
2814
+ }
2815
+
2746
2816
  // custom checks
2747
2817
  export function check<O = unknown>(fn: core.CheckFn<O>): core.$ZodCheck<O> {
2748
2818
  const ch = new core.$ZodCheck({
@@ -2785,14 +2855,35 @@ type ZodInstanceOfParams = core.Params<
2785
2855
  core.$ZodIssueCustom,
2786
2856
  "type" | "check" | "checks" | "fn" | "abort" | "error" | "params" | "path"
2787
2857
  >;
2858
+
2859
+ // ZodInstanceOf
2860
+ export interface ZodInstanceOf<T = unknown> extends ZodCustom<T, T> {
2861
+ properties<Shape extends core.$ZodShape>(
2862
+ shape: Shape,
2863
+ params?: string | core.$ZodPropertiesParams
2864
+ ): ZodInstanceOf<T & core.$InferObjectInput<Shape, {}>>;
2865
+ }
2866
+ export const ZodInstanceOf: core.$constructor<ZodInstanceOf> = /*@__PURE__*/ core.$constructor(
2867
+ "ZodInstanceOf",
2868
+ (inst, def) => {
2869
+ ZodCustom.init(inst, def);
2870
+ },
2871
+ {
2872
+ properties(shape: core.$ZodShape, params?: string | core.$ZodPropertiesParams) {
2873
+ // asserts in place, so the narrowed output type is truthful without a wrapper
2874
+ return this.check(properties(shape, params)) as any;
2875
+ },
2876
+ }
2877
+ );
2878
+
2788
2879
  function _instanceof<T extends typeof util.Class>(
2789
2880
  cls: T,
2790
2881
  params: ZodInstanceOfParams = {}
2791
- ): ZodCustom<InstanceType<T>, InstanceType<T>> {
2792
- const inst = new ZodCustom({
2882
+ ): ZodInstanceOf<InstanceType<T>> {
2883
+ const inst = new ZodInstanceOf({
2793
2884
  type: "custom",
2794
2885
  check: "custom",
2795
- fn: (data) => data instanceof cls,
2886
+ fn: (data: unknown) => data instanceof cls,
2796
2887
  abort: true,
2797
2888
  ...(util.normalizeParams(params) as any),
2798
2889
  });
@@ -237,6 +237,48 @@ test("toZod", () => {
237
237
  expectTypeOf<z.input<typeof Transformed>>().toEqualTypeOf<{ count: string }>();
238
238
  expectTypeOf<z.output<typeof Transformed>>().toEqualTypeOf<{ count: number }>();
239
239
 
240
+ // An enum target matches z.enum(...) even though the enum reference is not identical to the union of its members (#6524)
241
+ enum SkillLevel {
242
+ Noob = "noob",
243
+ Pro = "pro",
244
+ }
245
+ enum Rank {
246
+ First = 1,
247
+ Second = 2,
248
+ }
249
+
250
+ z.toZod<SkillLevel>()(z.enum(SkillLevel));
251
+ const Enums = z.toZod<{
252
+ skill: SkillLevel;
253
+ members: SkillLevel.Noob | SkillLevel.Pro;
254
+ rank: Rank;
255
+ maybe: SkillLevel | null;
256
+ list: SkillLevel[];
257
+ nested: { skill: SkillLevel };
258
+ }>()(
259
+ z.object({
260
+ skill: z.enum(SkillLevel),
261
+ members: z.enum(SkillLevel),
262
+ rank: z.enum(Rank),
263
+ maybe: z.enum(SkillLevel).nullable(),
264
+ list: z.array(z.enum(SkillLevel)),
265
+ nested: z.object({ skill: z.enum(SkillLevel) }),
266
+ })
267
+ );
268
+ expectTypeOf<z.output<typeof Enums>["skill"]>().toEqualTypeOf<SkillLevel>();
269
+
270
+ // @ts-expect-error a member subset is not the enum
271
+ z.toZod<{ skill: SkillLevel }>()(z.object({ skill: z.literal(SkillLevel.Noob) }));
272
+
273
+ // @ts-expect-error plain literals do not match a nominal enum target
274
+ z.toZod<{ skill: SkillLevel }>()(z.object({ skill: z.enum(["noob", "pro"]) }));
275
+
276
+ // @ts-expect-error an enum schema does not match a plain literal-union target
277
+ z.toZod<{ skill: "noob" | "pro" }>()(z.object({ skill: z.enum(SkillLevel) }));
278
+
279
+ // @ts-expect-error plain numeric literals do not match a numeric enum target either
280
+ z.toZod<{ rank: Rank }>()(z.object({ rank: z.union([z.literal(1), z.literal(2)]) }));
281
+
240
282
  z.toZod<Company>()(
241
283
  // @ts-expect-error missing optional keys still fail exact output matching
242
284
  z.object({
@@ -277,24 +319,32 @@ test("toZod", () => {
277
319
  // @ts-expect-error toZod checks output, not input
278
320
  z.toZod<string>()(z.string().transform((value) => value.length));
279
321
 
280
- // Exact equality is deliberately the only mode. A bidirectional-assignability mode would accept both of the two cases above — `any` is assignable in both directions by construction, and `readonly` is not part of assignability — so it would silently drop the guarantees the rest of this test pins. The cost is the asymmetry below: an intersection target matches `.and()` but not `.safeExtend()`, and a flat target matches `.safeExtend()` but not `.and()`. Flattening the target with a mapped type switches which spelling matches rather than accepting both.
322
+ // Exact equality is deliberately the only mode. A bidirectional-assignability mode would accept both of the two cases above — `any` is assignable in both directions by construction, and `readonly` is not part of assignability — so it would silently drop the guarantees the rest of this test pins.
323
+
324
+ // An intersection and the flat object with the same keys are interchangeable as targets, since the normalizer flattens both.
281
325
  type Intersected = { a: number } & { b: string };
282
- type Flatten<T> = { [K in keyof T]: T[K] } & {};
283
326
  const viaAnd = z.object({ a: z.number() }).and(z.object({ b: z.string() }));
284
327
  const viaExtend = z.object({ a: z.number() }).safeExtend({ b: z.string() });
285
328
 
286
329
  z.toZod<Intersected>()(viaAnd);
330
+ z.toZod<Intersected>()(viaExtend);
331
+ z.toZod<{ a: number; b: string }>()(viaAnd);
287
332
  z.toZod<{ a: number; b: string }>()(viaExtend);
288
- z.toZod<Flatten<Intersected>>()(viaExtend);
289
333
 
290
- // @ts-expect-error flattening the target does not make `.and()` match as well
291
- z.toZod<Flatten<Intersected>>()(viaAnd);
334
+ // @ts-expect-error a missing key is still a missing key
335
+ z.toZod<Intersected>()(z.object({ a: z.number() }));
292
336
 
293
- // @ts-expect-error .safeExtend() produces a flat object type, not an intersection
294
- z.toZod<Intersected>()(viaExtend);
337
+ // `keyof` a function is `never`, so the normalizer must not walk into one — mapping it would erase the signature and make every callable compare equal
338
+ z.toZod<() => string>()(z.custom<() => string>());
295
339
 
296
- // @ts-expect-error .and() produces an intersection, not a flat object type
297
- z.toZod<{ a: number; b: string }>()(viaAnd);
340
+ // @ts-expect-error an incompatible callable output is still rejected
341
+ z.toZod<() => string>()(z.custom<() => number>());
342
+
343
+ // @ts-expect-error and so is an incompatible function-valued property
344
+ z.toZod<{ cb: (x: number) => void }>()(z.object({ cb: z.custom<(x: string) => void>() }));
345
+
346
+ // @ts-expect-error a method-bearing generic keeps its type arguments
347
+ z.toZod<{ m: Map<string, number> }>()(z.object({ m: z.custom<Map<string, string>>() }));
298
348
  });
299
349
 
300
350
  test("checks", () => {
@@ -53,6 +53,12 @@ test("min max getters", () => {
53
53
  expect(z.bigint().max(BigInt(5)).max(BigInt(1)).maxValue).toEqual(BigInt(1));
54
54
  });
55
55
 
56
+ test("a format check applied after min/max does not widen minValue/maxValue back out", () => {
57
+ const schema = z.bigint().min(0n).max(23n).check(z.int64());
58
+ expect(schema.minValue).toEqual(0n);
59
+ expect(schema.maxValue).toEqual(23n);
60
+ });
61
+
56
62
  test("bigint formats are distinct at the type level", () => {
57
63
  expectTypeOf(z.int64()._zod.def.format).toEqualTypeOf<"int64">();
58
64
  expectTypeOf(z.uint64()._zod.def.format).toEqualTypeOf<"uint64">();
@@ -40,7 +40,7 @@ test("continuability", () => {
40
40
  "message": "Invalid email address",
41
41
  "origin": "string",
42
42
  "path": [],
43
- "pattern": "/^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$/",
43
+ "pattern": "/^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$/",
44
44
  },
45
45
  {
46
46
  "code": "custom",
@@ -230,7 +230,7 @@ test("continuability", () => {
230
230
  "message": "Invalid emoji",
231
231
  "origin": "string",
232
232
  "path": [],
233
- "pattern": "/^[\\p{Extended_Pictographic}\\p{Emoji_Component}]+$/u",
233
+ "pattern": "/^(?=[\\s\\S]*[\\p{Extended_Pictographic}\\p{Regional_Indicator}\\u20E3])[\\p{Extended_Pictographic}\\p{Emoji_Component}]+$/u",
234
234
  },
235
235
  {
236
236
  "code": "custom",