furukotest 1.0.0 → 4.6.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 (333) hide show
  1. package/package.json +125 -6
  2. package/src/compile.ts +56 -0
  3. package/src/index.ts +7 -0
  4. package/src/locales/index.ts +1 -0
  5. package/src/mini/index.ts +3 -0
  6. package/src/v3/ZodError.ts +340 -0
  7. package/src/v3/benchmarks/datetime.ts +58 -0
  8. package/src/v3/benchmarks/discriminatedUnion.ts +80 -0
  9. package/src/v3/benchmarks/index.ts +59 -0
  10. package/src/v3/benchmarks/ipv4.ts +57 -0
  11. package/src/v3/benchmarks/object.ts +69 -0
  12. package/src/v3/benchmarks/primitives.ts +162 -0
  13. package/src/v3/benchmarks/realworld.ts +63 -0
  14. package/src/v3/benchmarks/string.ts +55 -0
  15. package/src/v3/benchmarks/union.ts +80 -0
  16. package/src/v3/errors.ts +13 -0
  17. package/src/v3/external.ts +6 -0
  18. package/src/v3/helpers/enumUtil.ts +17 -0
  19. package/src/v3/helpers/errorUtil.ts +8 -0
  20. package/src/v3/helpers/parseUtil.ts +176 -0
  21. package/src/v3/helpers/partialUtil.ts +34 -0
  22. package/src/v3/helpers/typeAliases.ts +2 -0
  23. package/src/v3/helpers/util.ts +224 -0
  24. package/src/v3/index.ts +4 -0
  25. package/src/v3/locales/en.ts +124 -0
  26. package/src/v3/standard-schema.ts +113 -0
  27. package/src/v3/tests/Mocker.ts +54 -0
  28. package/src/v3/tests/all-errors.test.ts +157 -0
  29. package/src/v3/tests/anyunknown.test.ts +28 -0
  30. package/src/v3/tests/array.test.ts +71 -0
  31. package/src/v3/tests/async-parsing.test.ts +388 -0
  32. package/src/v3/tests/async-refinements.test.ts +46 -0
  33. package/src/v3/tests/base.test.ts +29 -0
  34. package/src/v3/tests/bigint.test.ts +55 -0
  35. package/src/v3/tests/branded.test.ts +53 -0
  36. package/src/v3/tests/catch.test.ts +220 -0
  37. package/src/v3/tests/coerce.test.ts +133 -0
  38. package/src/v3/tests/complex.test.ts +70 -0
  39. package/src/v3/tests/custom.test.ts +31 -0
  40. package/src/v3/tests/date.test.ts +32 -0
  41. package/src/v3/tests/deepmasking.test.ts +186 -0
  42. package/src/v3/tests/default.test.ts +112 -0
  43. package/src/v3/tests/description.test.ts +33 -0
  44. package/src/v3/tests/discriminated-unions.test.ts +315 -0
  45. package/src/v3/tests/enum.test.ts +80 -0
  46. package/src/v3/tests/error.test.ts +586 -0
  47. package/src/v3/tests/firstparty.test.ts +87 -0
  48. package/src/v3/tests/firstpartyschematypes.test.ts +21 -0
  49. package/src/v3/tests/function.test.ts +261 -0
  50. package/src/v3/tests/generics.test.ts +48 -0
  51. package/src/v3/tests/instanceof.test.ts +37 -0
  52. package/src/v3/tests/intersection.test.ts +128 -0
  53. package/src/v3/tests/language-server.source.ts +76 -0
  54. package/src/v3/tests/language-server.test.ts +206 -0
  55. package/src/v3/tests/literal.test.ts +36 -0
  56. package/src/v3/tests/map.test.ts +110 -0
  57. package/src/v3/tests/masking.test.ts +4 -0
  58. package/src/v3/tests/mocker.test.ts +19 -0
  59. package/src/v3/tests/nan.test.ts +24 -0
  60. package/src/v3/tests/nativeEnum.test.ts +87 -0
  61. package/src/v3/tests/nullable.test.ts +42 -0
  62. package/src/v3/tests/number.test.ts +176 -0
  63. package/src/v3/tests/object-augmentation.test.ts +29 -0
  64. package/src/v3/tests/object-in-es5-env.test.ts +29 -0
  65. package/src/v3/tests/object.test.ts +431 -0
  66. package/src/v3/tests/optional.test.ts +42 -0
  67. package/src/v3/tests/parseUtil.test.ts +23 -0
  68. package/src/v3/tests/parser.test.ts +41 -0
  69. package/src/v3/tests/partials.test.ts +243 -0
  70. package/src/v3/tests/pickomit.test.ts +111 -0
  71. package/src/v3/tests/pipeline.test.ts +29 -0
  72. package/src/v3/tests/preprocess.test.ts +186 -0
  73. package/src/v3/tests/primitive.test.ts +440 -0
  74. package/src/v3/tests/promise.test.ts +90 -0
  75. package/src/v3/tests/readonly.test.ts +114 -0
  76. package/src/v3/tests/record.test.ts +171 -0
  77. package/src/v3/tests/recursive.test.ts +197 -0
  78. package/src/v3/tests/refine.test.ts +313 -0
  79. package/src/v3/tests/safeparse.test.ts +27 -0
  80. package/src/v3/tests/set.test.ts +142 -0
  81. package/src/v3/tests/standard-schema.test.ts +83 -0
  82. package/src/v3/tests/string.test.ts +922 -0
  83. package/src/v3/tests/transformer.test.ts +233 -0
  84. package/src/v3/tests/tuple.test.ts +90 -0
  85. package/src/v3/tests/unions.test.ts +57 -0
  86. package/src/v3/tests/validations.test.ts +133 -0
  87. package/src/v3/tests/void.test.ts +15 -0
  88. package/src/v3/types.ts +5138 -0
  89. package/src/v4/classic/checks.ts +33 -0
  90. package/src/v4/classic/coerce.ts +27 -0
  91. package/src/v4/classic/compat.ts +78 -0
  92. package/src/v4/classic/deep-partial.ts +76 -0
  93. package/src/v4/classic/errors.ts +97 -0
  94. package/src/v4/classic/external.ts +57 -0
  95. package/src/v4/classic/from-json-schema.ts +944 -0
  96. package/src/v4/classic/in-out.ts +45 -0
  97. package/src/v4/classic/index.ts +5 -0
  98. package/src/v4/classic/iso.ts +20 -0
  99. package/src/v4/classic/parse.ts +88 -0
  100. package/src/v4/classic/schemas.ts +2937 -0
  101. package/src/v4/classic/tests/anyunknown.test.ts +26 -0
  102. package/src/v4/classic/tests/apply.test.ts +86 -0
  103. package/src/v4/classic/tests/array.test.ts +264 -0
  104. package/src/v4/classic/tests/assignability.test.ts +402 -0
  105. package/src/v4/classic/tests/async-parsing.test.ts +381 -0
  106. package/src/v4/classic/tests/async-refinements.test.ts +68 -0
  107. package/src/v4/classic/tests/base.test.ts +7 -0
  108. package/src/v4/classic/tests/bigint.test.ts +89 -0
  109. package/src/v4/classic/tests/brand.test.ts +106 -0
  110. package/src/v4/classic/tests/catch.test.ts +604 -0
  111. package/src/v4/classic/tests/coalesce.test.ts +20 -0
  112. package/src/v4/classic/tests/codec-examples.test.ts +572 -0
  113. package/src/v4/classic/tests/codec.test.ts +704 -0
  114. package/src/v4/classic/tests/coerce.test.ts +160 -0
  115. package/src/v4/classic/tests/continuability.test.ts +374 -0
  116. package/src/v4/classic/tests/credit-card.test.ts +76 -0
  117. package/src/v4/classic/tests/custom.test.ts +40 -0
  118. package/src/v4/classic/tests/cyclic-data.test.ts +985 -0
  119. package/src/v4/classic/tests/date.test.ts +92 -0
  120. package/src/v4/classic/tests/datetime.test.ts +316 -0
  121. package/src/v4/classic/tests/deep-partial.test.ts +380 -0
  122. package/src/v4/classic/tests/default-locale.test.ts +32 -0
  123. package/src/v4/classic/tests/default.test.ts +455 -0
  124. package/src/v4/classic/tests/describe-meta-checks.test.ts +27 -0
  125. package/src/v4/classic/tests/description.test.ts +32 -0
  126. package/src/v4/classic/tests/detached-methods.test.ts +221 -0
  127. package/src/v4/classic/tests/discriminated-unions.test.ts +942 -0
  128. package/src/v4/classic/tests/enum.test.ts +305 -0
  129. package/src/v4/classic/tests/error-utils.test.ts +917 -0
  130. package/src/v4/classic/tests/error.test.ts +1108 -0
  131. package/src/v4/classic/tests/file.test.ts +96 -0
  132. package/src/v4/classic/tests/firstparty.test.ts +179 -0
  133. package/src/v4/classic/tests/fix-json-issue.test.ts +26 -0
  134. package/src/v4/classic/tests/from-json-schema.test.ts +1467 -0
  135. package/src/v4/classic/tests/function.test.ts +391 -0
  136. package/src/v4/classic/tests/generics.test.ts +72 -0
  137. package/src/v4/classic/tests/global-config.test.ts +32 -0
  138. package/src/v4/classic/tests/hash.test.ts +67 -0
  139. package/src/v4/classic/tests/iban.test.ts +81 -0
  140. package/src/v4/classic/tests/in-out.test.ts +159 -0
  141. package/src/v4/classic/tests/index.test.ts +958 -0
  142. package/src/v4/classic/tests/instance-footprint.test.ts +319 -0
  143. package/src/v4/classic/tests/instanceof.test.ts +127 -0
  144. package/src/v4/classic/tests/intersection.test.ts +334 -0
  145. package/src/v4/classic/tests/issue-schema.test.ts +215 -0
  146. package/src/v4/classic/tests/jitless-allows-eval.test.ts +39 -0
  147. package/src/v4/classic/tests/json.test.ts +109 -0
  148. package/src/v4/classic/tests/lazy.test.ts +262 -0
  149. package/src/v4/classic/tests/literal.test.ts +128 -0
  150. package/src/v4/classic/tests/locales_ka.test.ts +29 -0
  151. package/src/v4/classic/tests/locales_ro.test.ts +24 -0
  152. package/src/v4/classic/tests/map.test.ts +342 -0
  153. package/src/v4/classic/tests/nan.test.ts +21 -0
  154. package/src/v4/classic/tests/nested-refine.test.ts +168 -0
  155. package/src/v4/classic/tests/nonoptional.test.ts +101 -0
  156. package/src/v4/classic/tests/nullable.test.ts +22 -0
  157. package/src/v4/classic/tests/number.test.ts +401 -0
  158. package/src/v4/classic/tests/object.test.ts +1006 -0
  159. package/src/v4/classic/tests/optin-ladder.test.ts +235 -0
  160. package/src/v4/classic/tests/optional.test.ts +366 -0
  161. package/src/v4/classic/tests/partial.test.ts +497 -0
  162. package/src/v4/classic/tests/pickomit.test.ts +211 -0
  163. package/src/v4/classic/tests/pipe.test.ts +101 -0
  164. package/src/v4/classic/tests/prefault.test.ts +144 -0
  165. package/src/v4/classic/tests/preprocess-types.test.ts +44 -0
  166. package/src/v4/classic/tests/preprocess.test.ts +351 -0
  167. package/src/v4/classic/tests/primitive.test.ts +175 -0
  168. package/src/v4/classic/tests/promise.test.ts +81 -0
  169. package/src/v4/classic/tests/properties.test.ts +141 -0
  170. package/src/v4/classic/tests/prototypes.test.ts +23 -0
  171. package/src/v4/classic/tests/readonly.test.ts +184 -0
  172. package/src/v4/classic/tests/record.test.ts +885 -0
  173. package/src/v4/classic/tests/recursive-types.test.ts +707 -0
  174. package/src/v4/classic/tests/redos.test.ts +68 -0
  175. package/src/v4/classic/tests/refine.test.ts +693 -0
  176. package/src/v4/classic/tests/registries.test.ts +243 -0
  177. package/src/v4/classic/tests/set.test.ts +190 -0
  178. package/src/v4/classic/tests/standard-schema.test.ts +153 -0
  179. package/src/v4/classic/tests/string-formats.test.ts +125 -0
  180. package/src/v4/classic/tests/string.test.ts +1440 -0
  181. package/src/v4/classic/tests/stringbool.test.ts +124 -0
  182. package/src/v4/classic/tests/template-literal.test.ts +812 -0
  183. package/src/v4/classic/tests/to-json-schema-methods.test.ts +438 -0
  184. package/src/v4/classic/tests/to-json-schema.test.ts +4733 -0
  185. package/src/v4/classic/tests/transform.test.ts +378 -0
  186. package/src/v4/classic/tests/tuple.test.ts +511 -0
  187. package/src/v4/classic/tests/union.test.ts +310 -0
  188. package/src/v4/classic/tests/url.test.ts +13 -0
  189. package/src/v4/classic/tests/validate.test.ts +645 -0
  190. package/src/v4/classic/tests/validations.test.ts +283 -0
  191. package/src/v4/classic/tests/void.test.ts +12 -0
  192. package/src/v4/core/api.ts +1875 -0
  193. package/src/v4/core/checks.ts +1266 -0
  194. package/src/v4/core/compile.ts +2313 -0
  195. package/src/v4/core/core.ts +230 -0
  196. package/src/v4/core/doc.ts +52 -0
  197. package/src/v4/core/errors.ts +543 -0
  198. package/src/v4/core/index.ts +19 -0
  199. package/src/v4/core/json-schema-generator.ts +131 -0
  200. package/src/v4/core/json-schema-processors.ts +934 -0
  201. package/src/v4/core/json-schema.ts +148 -0
  202. package/src/v4/core/memoizer.ts +331 -0
  203. package/src/v4/core/parse.ts +309 -0
  204. package/src/v4/core/regexes.ts +217 -0
  205. package/src/v4/core/registries.ts +105 -0
  206. package/src/v4/core/schemas.ts +5192 -0
  207. package/src/v4/core/standard-schema.ts +159 -0
  208. package/src/v4/core/tests/cached.test.ts +54 -0
  209. package/src/v4/core/tests/compile-differential.test.ts +1004 -0
  210. package/src/v4/core/tests/compile-generative.test.ts +445 -0
  211. package/src/v4/core/tests/compile-global.test.ts +89 -0
  212. package/src/v4/core/tests/compile-off-by-default.test.ts +26 -0
  213. package/src/v4/core/tests/compile-stats.test.ts +34 -0
  214. package/src/v4/core/tests/compile.test.ts +2036 -0
  215. package/src/v4/core/tests/email-regex.test.ts +140 -0
  216. package/src/v4/core/tests/extend.test.ts +59 -0
  217. package/src/v4/core/tests/index.test.ts +46 -0
  218. package/src/v4/core/tests/locales/be.test.ts +124 -0
  219. package/src/v4/core/tests/locales/el.test.ts +214 -0
  220. package/src/v4/core/tests/locales/en.test.ts +22 -0
  221. package/src/v4/core/tests/locales/es.test.ts +180 -0
  222. package/src/v4/core/tests/locales/fr.test.ts +72 -0
  223. package/src/v4/core/tests/locales/he.test.ts +379 -0
  224. package/src/v4/core/tests/locales/hr.test.ts +163 -0
  225. package/src/v4/core/tests/locales/nl.test.ts +46 -0
  226. package/src/v4/core/tests/locales/parity.test.ts +42 -0
  227. package/src/v4/core/tests/locales/ru.test.ts +128 -0
  228. package/src/v4/core/tests/locales/tg.test.ts +85 -0
  229. package/src/v4/core/tests/locales/tk.test.ts +69 -0
  230. package/src/v4/core/tests/locales/tr.test.ts +69 -0
  231. package/src/v4/core/tests/locales/uz.test.ts +105 -0
  232. package/src/v4/core/tests/polyfill-collision.test.ts +46 -0
  233. package/src/v4/core/tests/record-constructor.test.ts +125 -0
  234. package/src/v4/core/tests/recursive-tuples.test.ts +45 -0
  235. package/src/v4/core/tests/treeshake.test.ts +51 -0
  236. package/src/v4/core/tests/url-no-canparse.test.ts +133 -0
  237. package/src/v4/core/to-json-schema.ts +857 -0
  238. package/src/v4/core/util.ts +1280 -0
  239. package/src/v4/core/versions.ts +5 -0
  240. package/src/v4/core/visit.ts +193 -0
  241. package/src/v4/core/zsf.ts +323 -0
  242. package/src/v4/index.ts +4 -0
  243. package/src/v4/locales/ar.ts +120 -0
  244. package/src/v4/locales/az.ts +116 -0
  245. package/src/v4/locales/be.ts +188 -0
  246. package/src/v4/locales/bg.ts +133 -0
  247. package/src/v4/locales/bn.ts +123 -0
  248. package/src/v4/locales/ca.ts +121 -0
  249. package/src/v4/locales/ckb.ts +140 -0
  250. package/src/v4/locales/cs.ts +123 -0
  251. package/src/v4/locales/da.ts +128 -0
  252. package/src/v4/locales/de.ts +121 -0
  253. package/src/v4/locales/el.ts +124 -0
  254. package/src/v4/locales/en.ts +136 -0
  255. package/src/v4/locales/eo.ts +123 -0
  256. package/src/v4/locales/es.ts +145 -0
  257. package/src/v4/locales/fa.ts +131 -0
  258. package/src/v4/locales/fi.ts +126 -0
  259. package/src/v4/locales/fr-CA.ts +121 -0
  260. package/src/v4/locales/fr.ts +139 -0
  261. package/src/v4/locales/gu.ts +123 -0
  262. package/src/v4/locales/he.ts +253 -0
  263. package/src/v4/locales/hi.ts +126 -0
  264. package/src/v4/locales/hr.ts +135 -0
  265. package/src/v4/locales/hu.ts +122 -0
  266. package/src/v4/locales/hy.ts +175 -0
  267. package/src/v4/locales/id.ts +120 -0
  268. package/src/v4/locales/index.ts +63 -0
  269. package/src/v4/locales/is.ts +124 -0
  270. package/src/v4/locales/it.ts +121 -0
  271. package/src/v4/locales/ja.ts +119 -0
  272. package/src/v4/locales/ka.ts +128 -0
  273. package/src/v4/locales/kh.ts +7 -0
  274. package/src/v4/locales/km.ts +124 -0
  275. package/src/v4/locales/kn.ts +126 -0
  276. package/src/v4/locales/ko.ts +126 -0
  277. package/src/v4/locales/lt.ts +243 -0
  278. package/src/v4/locales/mk.ts +123 -0
  279. package/src/v4/locales/ms.ts +120 -0
  280. package/src/v4/locales/ne.ts +128 -0
  281. package/src/v4/locales/nl.ts +126 -0
  282. package/src/v4/locales/nn.ts +121 -0
  283. package/src/v4/locales/no.ts +121 -0
  284. package/src/v4/locales/ota.ts +122 -0
  285. package/src/v4/locales/pl.ts +123 -0
  286. package/src/v4/locales/ps.ts +131 -0
  287. package/src/v4/locales/pt-BR.ts +161 -0
  288. package/src/v4/locales/pt.ts +159 -0
  289. package/src/v4/locales/ro.ts +132 -0
  290. package/src/v4/locales/ru.ts +188 -0
  291. package/src/v4/locales/sk.ts +123 -0
  292. package/src/v4/locales/sl.ts +123 -0
  293. package/src/v4/locales/sv.ts +124 -0
  294. package/src/v4/locales/ta.ts +123 -0
  295. package/src/v4/locales/tg.ts +135 -0
  296. package/src/v4/locales/th.ts +124 -0
  297. package/src/v4/locales/tk.ts +113 -0
  298. package/src/v4/locales/tr.ts +116 -0
  299. package/src/v4/locales/ua.ts +7 -0
  300. package/src/v4/locales/uk.ts +122 -0
  301. package/src/v4/locales/ur.ts +124 -0
  302. package/src/v4/locales/uz.ts +120 -0
  303. package/src/v4/locales/vi.ts +122 -0
  304. package/src/v4/locales/yo.ts +129 -0
  305. package/src/v4/locales/zh-CN.ts +121 -0
  306. package/src/v4/locales/zh-TW.ts +120 -0
  307. package/src/v4/mini/checks.ts +33 -0
  308. package/src/v4/mini/coerce.ts +27 -0
  309. package/src/v4/mini/deep-partial.ts +73 -0
  310. package/src/v4/mini/external.ts +52 -0
  311. package/src/v4/mini/in-out.ts +45 -0
  312. package/src/v4/mini/index.ts +3 -0
  313. package/src/v4/mini/iso.ts +66 -0
  314. package/src/v4/mini/parse.ts +16 -0
  315. package/src/v4/mini/schemas.ts +2051 -0
  316. package/src/v4/mini/tests/apply.test.ts +57 -0
  317. package/src/v4/mini/tests/assignability.test.ts +190 -0
  318. package/src/v4/mini/tests/brand.test.ts +94 -0
  319. package/src/v4/mini/tests/checks.test.ts +158 -0
  320. package/src/v4/mini/tests/codec.test.ts +582 -0
  321. package/src/v4/mini/tests/computed.test.ts +30 -0
  322. package/src/v4/mini/tests/cyclic-data.test.ts +84 -0
  323. package/src/v4/mini/tests/deep-partial.test.ts +54 -0
  324. package/src/v4/mini/tests/error.test.ts +41 -0
  325. package/src/v4/mini/tests/functions.test.ts +14 -0
  326. package/src/v4/mini/tests/index.test.ts +1146 -0
  327. package/src/v4/mini/tests/number.test.ts +109 -0
  328. package/src/v4/mini/tests/object.test.ts +292 -0
  329. package/src/v4/mini/tests/prototypes.test.ts +43 -0
  330. package/src/v4/mini/tests/recursive-types.test.ts +341 -0
  331. package/src/v4/mini/tests/standard-schema.test.ts +50 -0
  332. package/src/v4/mini/tests/string.test.ts +396 -0
  333. package/src/v4-mini/index.ts +3 -0
package/package.json CHANGED
@@ -1,11 +1,130 @@
1
1
  {
2
2
  "name": "furukotest",
3
- "version": "1.0.0",
4
3
  "description": "Furoko test package",
5
- "main": "index.js",
6
- "scripts": {
7
- "test": "echo \"Error: no test specified\" && exit 1"
8
- },
4
+ "version": "4.6.6",
5
+ "type": "module",
9
6
  "author": "",
10
- "license": "ISC"
7
+ "license": "ISC",
8
+ "sideEffects": [
9
+ "./compile.js",
10
+ "./compile.cjs",
11
+ "./src/compile.ts"
12
+ ],
13
+ "files": [
14
+ "src",
15
+ "**/*.js",
16
+ "**/*.mjs",
17
+ "**/*.cjs",
18
+ "**/*.d.ts",
19
+ "**/*.d.mts",
20
+ "**/*.d.cts",
21
+ "**/package.json"
22
+ ],
23
+ "keywords": [
24
+ "typescript",
25
+ "schema",
26
+ "validation",
27
+ "type",
28
+ "inference"
29
+ ],
30
+ "main": "./index.cjs",
31
+ "types": "./index.d.cts",
32
+ "module": "./index.js",
33
+ "zshy": {
34
+ "exports": {
35
+ "./package.json": "./package.json",
36
+ ".": "./src/index.ts",
37
+ "./mini": "./src/mini/index.ts",
38
+ "./compile": "./src/compile.ts",
39
+ "./locales": "./src/locales/index.ts",
40
+ "./v3": "./src/v3/index.ts",
41
+ "./v4": "./src/v4/index.ts",
42
+ "./v4-mini": "./src/v4-mini/index.ts",
43
+ "./v4/mini": "./src/v4/mini/index.ts",
44
+ "./v4/core": "./src/v4/core/index.ts",
45
+ "./v4/locales": "./src/v4/locales/index.ts",
46
+ "./v4/locales/*": "./src/v4/locales/*"
47
+ },
48
+ "conditions": {
49
+ "@furukotest/source": "src"
50
+ },
51
+ "sealCjsExports": true
52
+ },
53
+ "exports": {
54
+ "./package.json": "./package.json",
55
+ ".": {
56
+ "@furukotest/source": "./src/index.ts",
57
+ "types": "./index.d.cts",
58
+ "import": "./index.js",
59
+ "require": "./index.cjs"
60
+ },
61
+ "./mini": {
62
+ "@furukotest/source": "./src/mini/index.ts",
63
+ "types": "./mini/index.d.cts",
64
+ "import": "./mini/index.js",
65
+ "require": "./mini/index.cjs"
66
+ },
67
+ "./compile": {
68
+ "@furukotest/source": "./src/compile.ts",
69
+ "types": "./compile.d.cts",
70
+ "import": "./compile.js",
71
+ "require": "./compile.cjs"
72
+ },
73
+ "./locales": {
74
+ "@furukotest/source": "./src/locales/index.ts",
75
+ "types": "./locales/index.d.cts",
76
+ "import": "./locales/index.js",
77
+ "require": "./locales/index.cjs"
78
+ },
79
+ "./v3": {
80
+ "@furukotest/source": "./src/v3/index.ts",
81
+ "types": "./v3/index.d.cts",
82
+ "import": "./v3/index.js",
83
+ "require": "./v3/index.cjs"
84
+ },
85
+ "./v4": {
86
+ "@furukotest/source": "./src/v4/index.ts",
87
+ "types": "./v4/index.d.cts",
88
+ "import": "./v4/index.js",
89
+ "require": "./v4/index.cjs"
90
+ },
91
+ "./v4-mini": {
92
+ "@furukotest/source": "./src/v4-mini/index.ts",
93
+ "types": "./v4-mini/index.d.cts",
94
+ "import": "./v4-mini/index.js",
95
+ "require": "./v4-mini/index.cjs"
96
+ },
97
+ "./v4/mini": {
98
+ "@furukotest/source": "./src/v4/mini/index.ts",
99
+ "types": "./v4/mini/index.d.cts",
100
+ "import": "./v4/mini/index.js",
101
+ "require": "./v4/mini/index.cjs"
102
+ },
103
+ "./v4/core": {
104
+ "@furukotest/source": "./src/v4/core/index.ts",
105
+ "types": "./v4/core/index.d.cts",
106
+ "import": "./v4/core/index.js",
107
+ "require": "./v4/core/index.cjs"
108
+ },
109
+ "./v4/locales": {
110
+ "@furukotest/source": "./src/v4/locales/index.ts",
111
+ "types": "./v4/locales/index.d.cts",
112
+ "import": "./v4/locales/index.js",
113
+ "require": "./v4/locales/index.cjs"
114
+ },
115
+ "./v4/locales/*": {
116
+ "@furukotest/source": "./src/v4/locales/*",
117
+ "types": "./v4/locales/*",
118
+ "import": "./v4/locales/*",
119
+ "require": "./v4/locales/*"
120
+ }
121
+ },
122
+ "scripts": {
123
+ "clean": "git clean -xdf . -e node_modules",
124
+ "build": "nub exec --node zshy --project tsconfig.build.json",
125
+ "postbuild": "nub ../../scripts/write-stub-package-jsons.ts && nub exec --node biome check --write .",
126
+ "test:watch": "nub exec --node vitest",
127
+ "test": "nub exec --node vitest run",
128
+ "prepublishOnly": "nub ../../scripts/check-versions.ts"
129
+ }
11
130
  }
package/src/compile.ts ADDED
@@ -0,0 +1,56 @@
1
+ // Side-effect-only: installs the post-processor on `globalConfig`. Listed in `package.json`'s `sideEffects`, and nothing else references it, so apps that never import it drop the compiler.
2
+ //
3
+ // Usage:
4
+ //
5
+ // import "yatsp/compile";
6
+ // import * as z from "yatsp";
7
+ // // every schema constructed below this is compiled on first parse
8
+ //
9
+ // Module evaluation order matters: schemas constructed in modules that evaluate before this import will not be compiled. Place this import in the app entry point, before any module that constructs schemas at top level.
10
+ //
11
+ // Failure handling: if the compiler refuses a schema (async refinement, unsupported feature, etc.) the shim permanently restores the runtime `_yatsp.run` for that schema. The schema continues to work via the regular runtime parser — no observable difference to the caller.
12
+
13
+ import { compile } from "./v4/core/compile.js";
14
+ import * as core from "./v4/core/index.js";
15
+
16
+ let compiling = false;
17
+
18
+ core.globalConfig.postProcessor = (inst: any) => {
19
+ if (compiling) return;
20
+ const originalRun = inst._yatsp?.run;
21
+ if (typeof originalRun !== "function") return;
22
+
23
+ const shim = (payload: any, ctx: any): any => {
24
+ // Bypass the fast path for any non-forward / non-sync / check-skipping call. The runtime owns those contracts.
25
+ if (ctx?.async || ctx?.direction === "backward" || ctx?.skipChecks) {
26
+ return originalRun(payload, ctx);
27
+ }
28
+
29
+ compiling = true;
30
+ try {
31
+ // Respect the jitless config: it exists precisely so CSP/no-eval environments never reach `new Function`. Global mode must not bypass it (explicit z.compile calls remain an explicit opt-in).
32
+ if (core.globalConfig.jitless) {
33
+ inst._yatsp.run = originalRun;
34
+ return originalRun(payload, ctx);
35
+ }
36
+ // Strict: the shim owns its own fallback below, and a non-strict compile would hand back `inst` — whose run is this shim — and reinstall it on itself.
37
+ const compiled = compile(inst, { strict: true });
38
+ // Only the run wrapper. Copying the compiled parse/safeParse closures would make their fallback re-enter this instance and run user callbacks a third time.
39
+ inst._yatsp.run = compiled._yatsp.run;
40
+ inst._yatsp.bag.fallbackRun = compiled._yatsp.bag.fallbackRun;
41
+ inst._yatsp.bag.validator = compiled._yatsp.bag.validator;
42
+ } catch {
43
+ // Permanent fallback for unsupported schemas.
44
+ inst._yatsp.run = originalRun;
45
+ } finally {
46
+ compiling = false;
47
+ }
48
+
49
+ return inst._yatsp.run(payload, ctx);
50
+ };
51
+
52
+ // Expose the pre-shim runtime so `compile()` invoked elsewhere can unwrap past the shim and capture the source-of-truth runtime. Without this, a user calling `z.compile(s)` after global mode is enabled would capture the shim itself, which would feed the wrapper into itself on fallback.
53
+ (shim as any).__originalRun = originalRun;
54
+
55
+ inst._yatsp.run = shim;
56
+ };
package/src/index.ts ADDED
@@ -0,0 +1,7 @@
1
+ import * as z from "./v4/classic/external.js";
2
+ export * from "./v4/classic/external.js";
3
+ // Aliasing the binding, instead of `export default z`, keeps the default export a
4
+ // re-export of `z` rather than a fresh namespace value. Rollup and Webpack can then
5
+ // shake `import z from "yatsp"` as they already shake `import { z } from "yatsp"` — without
6
+ // this they pull in every locale. See #6050.
7
+ export { z, z as default };
@@ -0,0 +1 @@
1
+ export * from "../v4/locales/index.js";
@@ -0,0 +1,3 @@
1
+ import * as z from "../v4/mini/external.js";
2
+ export * from "../v4/mini/external.js";
3
+ export { z };
@@ -0,0 +1,340 @@
1
+ import type { Primitive } from "./helpers/typeAliases.js";
2
+ import { util, type YatspParsedType } from "./helpers/util.js";
3
+ import type { TypeOf, YatspType } from "./index.js";
4
+
5
+ type allKeys<T> = T extends any ? keyof T : never;
6
+
7
+ export type inferFlattenedErrors<T extends YatspType<any, any, any>, U = string> = typeToFlattenedError<TypeOf<T>, U>;
8
+ export type typeToFlattenedError<T, U = string> = {
9
+ formErrors: U[];
10
+ fieldErrors: {
11
+ [P in allKeys<T>]?: U[];
12
+ };
13
+ };
14
+
15
+ export const YatspIssueCode = util.arrayToEnum([
16
+ "invalid_type",
17
+ "invalid_literal",
18
+ "custom",
19
+ "invalid_union",
20
+ "invalid_union_discriminator",
21
+ "invalid_enum_value",
22
+ "unrecognized_keys",
23
+ "invalid_arguments",
24
+ "invalid_return_type",
25
+ "invalid_date",
26
+ "invalid_string",
27
+ "too_small",
28
+ "too_big",
29
+ "invalid_intersection_types",
30
+ "not_multiple_of",
31
+ "not_finite",
32
+ ]);
33
+
34
+ export type YatspIssueCode = keyof typeof YatspIssueCode;
35
+
36
+ export type YatspIssueBase = {
37
+ path: (string | number)[];
38
+ message?: string | undefined;
39
+ };
40
+
41
+ export interface YatspInvalidTypeIssue extends YatspIssueBase {
42
+ code: typeof YatspIssueCode.invalid_type;
43
+ expected: YatspParsedType;
44
+ received: YatspParsedType;
45
+ }
46
+
47
+ export interface YatspInvalidLiteralIssue extends YatspIssueBase {
48
+ code: typeof YatspIssueCode.invalid_literal;
49
+ expected: unknown;
50
+ received: unknown;
51
+ }
52
+
53
+ export interface YatspUnrecognizedKeysIssue extends YatspIssueBase {
54
+ code: typeof YatspIssueCode.unrecognized_keys;
55
+ keys: string[];
56
+ }
57
+
58
+ export interface YatspInvalidUnionIssue extends YatspIssueBase {
59
+ code: typeof YatspIssueCode.invalid_union;
60
+ unionErrors: YatspError[];
61
+ }
62
+
63
+ export interface YatspInvalidUnionDiscriminatorIssue extends YatspIssueBase {
64
+ code: typeof YatspIssueCode.invalid_union_discriminator;
65
+ options: Primitive[];
66
+ }
67
+
68
+ export interface YatspInvalidEnumValueIssue extends YatspIssueBase {
69
+ received: string | number;
70
+ code: typeof YatspIssueCode.invalid_enum_value;
71
+ options: (string | number)[];
72
+ }
73
+
74
+ export interface YatspInvalidArgumentsIssue extends YatspIssueBase {
75
+ code: typeof YatspIssueCode.invalid_arguments;
76
+ argumentsError: YatspError;
77
+ }
78
+
79
+ export interface YatspInvalidReturnTypeIssue extends YatspIssueBase {
80
+ code: typeof YatspIssueCode.invalid_return_type;
81
+ returnTypeError: YatspError;
82
+ }
83
+
84
+ export interface YatspInvalidDateIssue extends YatspIssueBase {
85
+ code: typeof YatspIssueCode.invalid_date;
86
+ }
87
+
88
+ export type StringValidation =
89
+ | "email"
90
+ | "url"
91
+ | "emoji"
92
+ | "uuid"
93
+ | "nanoid"
94
+ | "regex"
95
+ | "cuid"
96
+ | "cuid2"
97
+ | "ulid"
98
+ | "datetime"
99
+ | "date"
100
+ | "time"
101
+ | "duration"
102
+ | "ip"
103
+ | "cidr"
104
+ | "base64"
105
+ | "jwt"
106
+ | "base64url"
107
+ | { includes: string; position?: number | undefined }
108
+ | { startsWith: string }
109
+ | { endsWith: string };
110
+
111
+ export interface YatspInvalidStringIssue extends YatspIssueBase {
112
+ code: typeof YatspIssueCode.invalid_string;
113
+ validation: StringValidation;
114
+ }
115
+
116
+ export interface YatspTooSmallIssue extends YatspIssueBase {
117
+ code: typeof YatspIssueCode.too_small;
118
+ minimum: number | bigint;
119
+ inclusive: boolean;
120
+ exact?: boolean;
121
+ type: "array" | "string" | "number" | "set" | "date" | "bigint";
122
+ }
123
+
124
+ export interface YatspTooBigIssue extends YatspIssueBase {
125
+ code: typeof YatspIssueCode.too_big;
126
+ maximum: number | bigint;
127
+ inclusive: boolean;
128
+ exact?: boolean;
129
+ type: "array" | "string" | "number" | "set" | "date" | "bigint";
130
+ }
131
+
132
+ export interface YatspInvalidIntersectionTypesIssue extends YatspIssueBase {
133
+ code: typeof YatspIssueCode.invalid_intersection_types;
134
+ }
135
+
136
+ export interface YatspNotMultipleOfIssue extends YatspIssueBase {
137
+ code: typeof YatspIssueCode.not_multiple_of;
138
+ multipleOf: number | bigint;
139
+ }
140
+
141
+ export interface YatspNotFiniteIssue extends YatspIssueBase {
142
+ code: typeof YatspIssueCode.not_finite;
143
+ }
144
+
145
+ export interface YatspCustomIssue extends YatspIssueBase {
146
+ code: typeof YatspIssueCode.custom;
147
+ params?: { [k: string]: any };
148
+ }
149
+
150
+ export type DenormalizedError = { [k: string]: DenormalizedError | string[] };
151
+
152
+ export type YatspIssueOptionalMessage =
153
+ | YatspInvalidTypeIssue
154
+ | YatspInvalidLiteralIssue
155
+ | YatspUnrecognizedKeysIssue
156
+ | YatspInvalidUnionIssue
157
+ | YatspInvalidUnionDiscriminatorIssue
158
+ | YatspInvalidEnumValueIssue
159
+ | YatspInvalidArgumentsIssue
160
+ | YatspInvalidReturnTypeIssue
161
+ | YatspInvalidDateIssue
162
+ | YatspInvalidStringIssue
163
+ | YatspTooSmallIssue
164
+ | YatspTooBigIssue
165
+ | YatspInvalidIntersectionTypesIssue
166
+ | YatspNotMultipleOfIssue
167
+ | YatspNotFiniteIssue
168
+ | YatspCustomIssue;
169
+
170
+ export type YatspIssue = YatspIssueOptionalMessage & {
171
+ fatal?: boolean | undefined;
172
+ message: string;
173
+ };
174
+
175
+ export const quotelessJson = (obj: any) => {
176
+ const json = JSON.stringify(obj, null, 2);
177
+ return json.replace(/"([^"]+)":/g, "$1:");
178
+ };
179
+
180
+ type recursiveYatspFormattedError<T> = T extends [any, ...any[]]
181
+ ? { [K in keyof T]?: YatspFormattedError<T[K]> }
182
+ : T extends any[]
183
+ ? { [k: number]: YatspFormattedError<T[number]> }
184
+ : T extends object
185
+ ? { [K in keyof T]?: YatspFormattedError<T[K]> }
186
+ : unknown;
187
+
188
+ export type YatspFormattedError<T, U = string> = {
189
+ _errors: U[];
190
+ } & recursiveYatspFormattedError<NonNullable<T>>;
191
+
192
+ export type inferFormattedError<T extends YatspType<any, any, any>, U = string> = YatspFormattedError<TypeOf<T>, U>;
193
+
194
+ export class YatspError<T = any> extends Error {
195
+ issues: YatspIssue[] = [];
196
+
197
+ get errors() {
198
+ return this.issues;
199
+ }
200
+
201
+ constructor(issues: YatspIssue[]) {
202
+ super();
203
+
204
+ const actualProto = new.target.prototype;
205
+ if (Object.setPrototypeOf) {
206
+ // eslint-disable-next-line ban/ban
207
+ Object.setPrototypeOf(this, actualProto);
208
+ } else {
209
+ (this as any).__proto__ = actualProto;
210
+ }
211
+ this.name = "YatspError";
212
+ this.issues = issues;
213
+ }
214
+
215
+ format(): YatspFormattedError<T>;
216
+ format<U>(mapper: (issue: YatspIssue) => U): YatspFormattedError<T, U>;
217
+ format(_mapper?: any) {
218
+ const mapper: (issue: YatspIssue) => any =
219
+ _mapper ||
220
+ function (issue: YatspIssue) {
221
+ return issue.message;
222
+ };
223
+ const fieldErrors: YatspFormattedError<T> = { _errors: [] } as any;
224
+ const processError = (error: YatspError) => {
225
+ for (const issue of error.issues) {
226
+ if (issue.code === "invalid_union") {
227
+ issue.unionErrors.map(processError);
228
+ } else if (issue.code === "invalid_return_type") {
229
+ processError(issue.returnTypeError);
230
+ } else if (issue.code === "invalid_arguments") {
231
+ processError(issue.argumentsError);
232
+ } else if (issue.path.length === 0) {
233
+ (fieldErrors as any)._errors.push(mapper(issue));
234
+ } else {
235
+ let curr: any = fieldErrors;
236
+ let i = 0;
237
+ while (i < issue.path.length) {
238
+ const el = issue.path[i]!;
239
+ const terminal = i === issue.path.length - 1;
240
+
241
+ // `_errors` is reserved by this legacy format, so merge a matching path segment into the current node instead of treating its array as a child.
242
+ if (el === "_errors") {
243
+ if (terminal) curr._errors.push(mapper(issue));
244
+ i++;
245
+ continue;
246
+ }
247
+
248
+ // Create `el` as an own data property. A segment naming an inherited member ("toString", "constructor") would otherwise read through to the prototype, and assigning "__proto__" would hit the setter and walk into Object.prototype.
249
+ if (!Object.prototype.hasOwnProperty.call(curr, el)) {
250
+ if (el === "__proto__") {
251
+ Object.defineProperty(curr, el, {
252
+ value: { _errors: [] },
253
+ writable: true,
254
+ enumerable: true,
255
+ configurable: true,
256
+ });
257
+ } else {
258
+ curr[el] = { _errors: [] };
259
+ }
260
+ }
261
+
262
+ curr = curr[el];
263
+ if (terminal) {
264
+ curr._errors.push(mapper(issue));
265
+ }
266
+ i++;
267
+ }
268
+ }
269
+ }
270
+ };
271
+
272
+ processError(this);
273
+ return fieldErrors;
274
+ }
275
+
276
+ static create = (issues: YatspIssue[]) => {
277
+ const error = new YatspError(issues);
278
+ return error;
279
+ };
280
+
281
+ static assert(value: unknown): asserts value is YatspError {
282
+ if (!(value instanceof YatspError)) {
283
+ throw new Error(`Not a YatspError: ${value}`);
284
+ }
285
+ }
286
+
287
+ override toString() {
288
+ return this.message;
289
+ }
290
+ override get message() {
291
+ return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);
292
+ }
293
+
294
+ get isEmpty(): boolean {
295
+ return this.issues.length === 0;
296
+ }
297
+
298
+ addIssue = (sub: YatspIssue) => {
299
+ this.issues = [...this.issues, sub];
300
+ };
301
+
302
+ addIssues = (subs: YatspIssue[] = []) => {
303
+ this.issues = [...this.issues, ...subs];
304
+ };
305
+
306
+ flatten(): typeToFlattenedError<T>;
307
+ flatten<U>(mapper?: (issue: YatspIssue) => U): typeToFlattenedError<T, U>;
308
+ flatten<U = string>(mapper: (issue: YatspIssue) => U = (issue: YatspIssue) => issue.message as any): any {
309
+ const fieldErrors: any = Object.create(null);
310
+ const formErrors: U[] = [];
311
+ for (const sub of this.issues) {
312
+ if (sub.path.length > 0) {
313
+ const firstEl = sub.path[0]!;
314
+ fieldErrors[firstEl] = fieldErrors[firstEl] || [];
315
+ fieldErrors[firstEl].push(mapper(sub));
316
+ } else {
317
+ formErrors.push(mapper(sub));
318
+ }
319
+ }
320
+ return { formErrors, fieldErrors };
321
+ }
322
+
323
+ get formErrors() {
324
+ return this.flatten();
325
+ }
326
+ }
327
+
328
+ type stripPath<T extends object> = T extends any ? util.OmitKeys<T, "path"> : never;
329
+
330
+ export type IssueData = stripPath<YatspIssueOptionalMessage> & {
331
+ path?: (string | number)[];
332
+ fatal?: boolean | undefined;
333
+ };
334
+
335
+ export type ErrorMapCtx = {
336
+ defaultError: string;
337
+ data: any;
338
+ };
339
+
340
+ export type YatspErrorMap = (issue: YatspIssueOptionalMessage, _ctx: ErrorMapCtx) => { message: string };
@@ -0,0 +1,58 @@
1
+ import Benchmark from "benchmark";
2
+
3
+ const datetimeValidationSuite = new Benchmark.Suite("datetime");
4
+
5
+ const DATA = "2021-01-01";
6
+ const MONTHS_31 = new Set([1, 3, 5, 7, 8, 10, 12]);
7
+ const MONTHS_30 = new Set([4, 6, 9, 11]);
8
+
9
+ const simpleDatetimeRegex = /^(\d{4})-(\d{2})-(\d{2})$/;
10
+ const datetimeRegexNoLeapYearValidation =
11
+ /^\d{4}-((0[13578]|10|12)-31|(0[13-9]|1[0-2])-30|(0[1-9]|1[0-2])-(0[1-9]|1\d|2\d))$/;
12
+ const datetimeRegexWithLeapYearValidation =
13
+ /^((\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\d|3[01])|(0[469]|11)-(0[1-9]|[12]\d|30)|(02)-(0[1-9]|1\d|2[0-8])))$/;
14
+
15
+ datetimeValidationSuite
16
+ .add("new Date()", () => {
17
+ return !Number.isNaN(new Date(DATA).getTime());
18
+ })
19
+ .add("regex (no validation)", () => {
20
+ return simpleDatetimeRegex.test(DATA);
21
+ })
22
+ .add("regex (no leap year)", () => {
23
+ return datetimeRegexNoLeapYearValidation.test(DATA);
24
+ })
25
+ .add("regex (w/ leap year)", () => {
26
+ return datetimeRegexWithLeapYearValidation.test(DATA);
27
+ })
28
+ .add("capture groups + code", () => {
29
+ const match = DATA.match(simpleDatetimeRegex);
30
+ if (!match) return false;
31
+
32
+ // Extract year, month, and day from the capture groups
33
+ const year = Number.parseInt(match[1], 10);
34
+ const month = Number.parseInt(match[2], 10); // month is 0-indexed in JavaScript Date, so subtract 1
35
+ const day = Number.parseInt(match[3], 10);
36
+
37
+ if (month === 2) {
38
+ if ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0) {
39
+ return day <= 29;
40
+ }
41
+ return day <= 28;
42
+ }
43
+ if (MONTHS_30.has(month)) {
44
+ return day <= 30;
45
+ }
46
+ if (MONTHS_31.has(month)) {
47
+ return day <= 31;
48
+ }
49
+ return false;
50
+ })
51
+
52
+ .on("cycle", (e: Benchmark.Event) => {
53
+ console.log(`${datetimeValidationSuite.name!}: ${e.target}`);
54
+ });
55
+
56
+ export default {
57
+ suites: [datetimeValidationSuite],
58
+ };
@@ -0,0 +1,80 @@
1
+ import Benchmark from "benchmark";
2
+
3
+ import { z } from "yatsp/v3";
4
+
5
+ const doubleSuite = new Benchmark.Suite("z.discriminatedUnion: double");
6
+ const manySuite = new Benchmark.Suite("z.discriminatedUnion: many");
7
+
8
+ const aSchema = z.object({
9
+ type: z.literal("a"),
10
+ });
11
+ const objA = {
12
+ type: "a",
13
+ };
14
+
15
+ const bSchema = z.object({
16
+ type: z.literal("b"),
17
+ });
18
+ const objB = {
19
+ type: "b",
20
+ };
21
+
22
+ const cSchema = z.object({
23
+ type: z.literal("c"),
24
+ });
25
+ const objC = {
26
+ type: "c",
27
+ };
28
+
29
+ const dSchema = z.object({
30
+ type: z.literal("d"),
31
+ });
32
+
33
+ const double = z.discriminatedUnion("type", [aSchema, bSchema]);
34
+ const many = z.discriminatedUnion("type", [aSchema, bSchema, cSchema, dSchema]);
35
+
36
+ doubleSuite
37
+ .add("valid: a", () => {
38
+ double.parse(objA);
39
+ })
40
+ .add("valid: b", () => {
41
+ double.parse(objB);
42
+ })
43
+ .add("invalid: null", () => {
44
+ try {
45
+ double.parse(null);
46
+ } catch (_err) {}
47
+ })
48
+ .add("invalid: wrong shape", () => {
49
+ try {
50
+ double.parse(objC);
51
+ } catch (_err) {}
52
+ })
53
+ .on("cycle", (e: Benchmark.Event) => {
54
+ console.log(`${(doubleSuite as any).name}: ${e.target}`);
55
+ });
56
+
57
+ manySuite
58
+ .add("valid: a", () => {
59
+ many.parse(objA);
60
+ })
61
+ .add("valid: c", () => {
62
+ many.parse(objC);
63
+ })
64
+ .add("invalid: null", () => {
65
+ try {
66
+ many.parse(null);
67
+ } catch (_err) {}
68
+ })
69
+ .add("invalid: wrong shape", () => {
70
+ try {
71
+ many.parse({ type: "unknown" });
72
+ } catch (_err) {}
73
+ })
74
+ .on("cycle", (e: Benchmark.Event) => {
75
+ console.log(`${(manySuite as any).name}: ${e.target}`);
76
+ });
77
+
78
+ export default {
79
+ suites: [doubleSuite, manySuite],
80
+ };