@willaimg/yatsp 4.3.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.
- package/README.md +22 -0
- package/compile.cjs +96 -0
- package/compile.d.cts +1 -0
- package/compile.d.ts +1 -0
- package/compile.js +52 -0
- package/index.cjs +52 -0
- package/index.d.cts +3 -0
- package/index.d.ts +3 -0
- package/index.js +7 -0
- package/locales/index.cjs +36 -0
- package/locales/index.d.cts +1 -0
- package/locales/index.d.ts +1 -0
- package/locales/index.js +1 -0
- package/mini/index.cjs +51 -0
- package/mini/index.d.cts +3 -0
- package/mini/index.d.ts +3 -0
- package/mini/index.js +3 -0
- package/package.json +142 -0
- package/src/compile.ts +56 -0
- package/src/index.ts +7 -0
- package/src/locales/index.ts +1 -0
- package/src/mini/index.ts +3 -0
- package/src/v3/YatspError.ts +340 -0
- package/src/v3/benchmarks/datetime.ts +58 -0
- package/src/v3/benchmarks/discriminatedUnion.ts +80 -0
- package/src/v3/benchmarks/index.ts +59 -0
- package/src/v3/benchmarks/ipv4.ts +57 -0
- package/src/v3/benchmarks/object.ts +69 -0
- package/src/v3/benchmarks/primitives.ts +162 -0
- package/src/v3/benchmarks/realworld.ts +63 -0
- package/src/v3/benchmarks/string.ts +55 -0
- package/src/v3/benchmarks/union.ts +80 -0
- package/src/v3/errors.ts +13 -0
- package/src/v3/external.ts +6 -0
- package/src/v3/helpers/enumUtil.ts +17 -0
- package/src/v3/helpers/errorUtil.ts +8 -0
- package/src/v3/helpers/parseUtil.ts +176 -0
- package/src/v3/helpers/partialUtil.ts +34 -0
- package/src/v3/helpers/typeAliases.ts +2 -0
- package/src/v3/helpers/util.ts +224 -0
- package/src/v3/index.ts +4 -0
- package/src/v3/locales/en.ts +124 -0
- package/src/v3/standard-schema.ts +113 -0
- package/src/v3/tests/Mocker.ts +54 -0
- package/src/v3/tests/all-errors.test.ts +157 -0
- package/src/v3/tests/anyunknown.test.ts +28 -0
- package/src/v3/tests/array.test.ts +71 -0
- package/src/v3/tests/async-parsing.test.ts +388 -0
- package/src/v3/tests/async-refinements.test.ts +46 -0
- package/src/v3/tests/base.test.ts +29 -0
- package/src/v3/tests/bigint.test.ts +55 -0
- package/src/v3/tests/branded.test.ts +53 -0
- package/src/v3/tests/catch.test.ts +220 -0
- package/src/v3/tests/coerce.test.ts +133 -0
- package/src/v3/tests/complex.test.ts +70 -0
- package/src/v3/tests/custom.test.ts +31 -0
- package/src/v3/tests/date.test.ts +32 -0
- package/src/v3/tests/deepmasking.test.ts +186 -0
- package/src/v3/tests/default.test.ts +112 -0
- package/src/v3/tests/description.test.ts +33 -0
- package/src/v3/tests/discriminated-unions.test.ts +315 -0
- package/src/v3/tests/enum.test.ts +80 -0
- package/src/v3/tests/error.test.ts +586 -0
- package/src/v3/tests/firstparty.test.ts +87 -0
- package/src/v3/tests/firstpartyschematypes.test.ts +21 -0
- package/src/v3/tests/function.test.ts +261 -0
- package/src/v3/tests/generics.test.ts +48 -0
- package/src/v3/tests/instanceof.test.ts +37 -0
- package/src/v3/tests/intersection.test.ts +128 -0
- package/src/v3/tests/language-server.source.ts +76 -0
- package/src/v3/tests/language-server.test.ts +206 -0
- package/src/v3/tests/literal.test.ts +36 -0
- package/src/v3/tests/map.test.ts +110 -0
- package/src/v3/tests/masking.test.ts +4 -0
- package/src/v3/tests/mocker.test.ts +19 -0
- package/src/v3/tests/nan.test.ts +24 -0
- package/src/v3/tests/nativeEnum.test.ts +87 -0
- package/src/v3/tests/nullable.test.ts +42 -0
- package/src/v3/tests/number.test.ts +176 -0
- package/src/v3/tests/object-augmentation.test.ts +29 -0
- package/src/v3/tests/object-in-es5-env.test.ts +29 -0
- package/src/v3/tests/object.test.ts +431 -0
- package/src/v3/tests/optional.test.ts +42 -0
- package/src/v3/tests/parseUtil.test.ts +23 -0
- package/src/v3/tests/parser.test.ts +41 -0
- package/src/v3/tests/partials.test.ts +243 -0
- package/src/v3/tests/pickomit.test.ts +111 -0
- package/src/v3/tests/pipeline.test.ts +29 -0
- package/src/v3/tests/preprocess.test.ts +186 -0
- package/src/v3/tests/primitive.test.ts +440 -0
- package/src/v3/tests/promise.test.ts +90 -0
- package/src/v3/tests/readonly.test.ts +114 -0
- package/src/v3/tests/record.test.ts +171 -0
- package/src/v3/tests/recursive.test.ts +197 -0
- package/src/v3/tests/refine.test.ts +313 -0
- package/src/v3/tests/safeparse.test.ts +27 -0
- package/src/v3/tests/set.test.ts +142 -0
- package/src/v3/tests/standard-schema.test.ts +83 -0
- package/src/v3/tests/string.test.ts +922 -0
- package/src/v3/tests/transformer.test.ts +233 -0
- package/src/v3/tests/tuple.test.ts +90 -0
- package/src/v3/tests/unions.test.ts +57 -0
- package/src/v3/tests/validations.test.ts +133 -0
- package/src/v3/tests/void.test.ts +15 -0
- package/src/v3/types.ts +5162 -0
- package/src/v4/classic/checks.ts +33 -0
- package/src/v4/classic/coerce.ts +27 -0
- package/src/v4/classic/compat.ts +78 -0
- package/src/v4/classic/deep-partial.ts +76 -0
- package/src/v4/classic/errors.ts +97 -0
- package/src/v4/classic/external.ts +57 -0
- package/src/v4/classic/from-json-schema.ts +944 -0
- package/src/v4/classic/in-out.ts +45 -0
- package/src/v4/classic/index.ts +5 -0
- package/src/v4/classic/iso.ts +20 -0
- package/src/v4/classic/parse.ts +88 -0
- package/src/v4/classic/schemas.ts +2994 -0
- package/src/v4/classic/tests/anyunknown.test.ts +26 -0
- package/src/v4/classic/tests/apply.test.ts +86 -0
- package/src/v4/classic/tests/array.test.ts +264 -0
- package/src/v4/classic/tests/assignability.test.ts +402 -0
- package/src/v4/classic/tests/async-parsing.test.ts +381 -0
- package/src/v4/classic/tests/async-refinements.test.ts +68 -0
- package/src/v4/classic/tests/base.test.ts +7 -0
- package/src/v4/classic/tests/bigint.test.ts +89 -0
- package/src/v4/classic/tests/brand.test.ts +106 -0
- package/src/v4/classic/tests/catch.test.ts +604 -0
- package/src/v4/classic/tests/coalesce.test.ts +20 -0
- package/src/v4/classic/tests/codec-examples.test.ts +572 -0
- package/src/v4/classic/tests/codec.test.ts +704 -0
- package/src/v4/classic/tests/coerce.test.ts +160 -0
- package/src/v4/classic/tests/continuability.test.ts +374 -0
- package/src/v4/classic/tests/credit-card.test.ts +76 -0
- package/src/v4/classic/tests/custom.test.ts +40 -0
- package/src/v4/classic/tests/cyclic-data.test.ts +985 -0
- package/src/v4/classic/tests/date.test.ts +92 -0
- package/src/v4/classic/tests/datetime.test.ts +316 -0
- package/src/v4/classic/tests/deep-partial.test.ts +380 -0
- package/src/v4/classic/tests/default-locale.test.ts +32 -0
- package/src/v4/classic/tests/default.test.ts +455 -0
- package/src/v4/classic/tests/describe-meta-checks.test.ts +27 -0
- package/src/v4/classic/tests/description.test.ts +32 -0
- package/src/v4/classic/tests/detached-methods.test.ts +226 -0
- package/src/v4/classic/tests/discriminated-unions.test.ts +942 -0
- package/src/v4/classic/tests/enum.test.ts +305 -0
- package/src/v4/classic/tests/error-utils.test.ts +917 -0
- package/src/v4/classic/tests/error.test.ts +1108 -0
- package/src/v4/classic/tests/file.test.ts +96 -0
- package/src/v4/classic/tests/firstparty.test.ts +179 -0
- package/src/v4/classic/tests/fix-json-issue.test.ts +26 -0
- package/src/v4/classic/tests/from-json-schema.test.ts +1467 -0
- package/src/v4/classic/tests/function.test.ts +391 -0
- package/src/v4/classic/tests/generics.test.ts +72 -0
- package/src/v4/classic/tests/global-config.test.ts +32 -0
- package/src/v4/classic/tests/hash.test.ts +67 -0
- package/src/v4/classic/tests/iban.test.ts +81 -0
- package/src/v4/classic/tests/in-out.test.ts +159 -0
- package/src/v4/classic/tests/index.test.ts +958 -0
- package/src/v4/classic/tests/instance-footprint.test.ts +319 -0
- package/src/v4/classic/tests/instanceof.test.ts +127 -0
- package/src/v4/classic/tests/intersection.test.ts +334 -0
- package/src/v4/classic/tests/issue-schema.test.ts +215 -0
- package/src/v4/classic/tests/jitless-allows-eval.test.ts +39 -0
- package/src/v4/classic/tests/json.test.ts +109 -0
- package/src/v4/classic/tests/lazy.test.ts +262 -0
- package/src/v4/classic/tests/literal.test.ts +128 -0
- package/src/v4/classic/tests/locales_ka.test.ts +29 -0
- package/src/v4/classic/tests/locales_ro.test.ts +24 -0
- package/src/v4/classic/tests/map.test.ts +342 -0
- package/src/v4/classic/tests/nan.test.ts +21 -0
- package/src/v4/classic/tests/nested-refine.test.ts +168 -0
- package/src/v4/classic/tests/nonoptional.test.ts +101 -0
- package/src/v4/classic/tests/nullable.test.ts +22 -0
- package/src/v4/classic/tests/number.test.ts +401 -0
- package/src/v4/classic/tests/object.test.ts +1006 -0
- package/src/v4/classic/tests/optin-ladder.test.ts +235 -0
- package/src/v4/classic/tests/optional.test.ts +366 -0
- package/src/v4/classic/tests/partial.test.ts +497 -0
- package/src/v4/classic/tests/pickomit.test.ts +211 -0
- package/src/v4/classic/tests/pipe.test.ts +101 -0
- package/src/v4/classic/tests/prefault.test.ts +144 -0
- package/src/v4/classic/tests/preprocess-types.test.ts +44 -0
- package/src/v4/classic/tests/preprocess.test.ts +351 -0
- package/src/v4/classic/tests/primitive.test.ts +175 -0
- package/src/v4/classic/tests/promise.test.ts +81 -0
- package/src/v4/classic/tests/properties.test.ts +141 -0
- package/src/v4/classic/tests/prototypes.test.ts +23 -0
- package/src/v4/classic/tests/readonly.test.ts +184 -0
- package/src/v4/classic/tests/record.test.ts +885 -0
- package/src/v4/classic/tests/recursive-types.test.ts +707 -0
- package/src/v4/classic/tests/redos.test.ts +68 -0
- package/src/v4/classic/tests/refine.test.ts +693 -0
- package/src/v4/classic/tests/registries.test.ts +243 -0
- package/src/v4/classic/tests/set.test.ts +190 -0
- package/src/v4/classic/tests/standard-schema.test.ts +153 -0
- package/src/v4/classic/tests/string-formats.test.ts +125 -0
- package/src/v4/classic/tests/string.test.ts +1440 -0
- package/src/v4/classic/tests/stringbool.test.ts +124 -0
- package/src/v4/classic/tests/template-literal.test.ts +814 -0
- package/src/v4/classic/tests/to-json-schema-methods.test.ts +438 -0
- package/src/v4/classic/tests/to-json-schema.test.ts +4733 -0
- package/src/v4/classic/tests/transform.test.ts +378 -0
- package/src/v4/classic/tests/tuple.test.ts +511 -0
- package/src/v4/classic/tests/union.test.ts +310 -0
- package/src/v4/classic/tests/url.test.ts +13 -0
- package/src/v4/classic/tests/validate.test.ts +645 -0
- package/src/v4/classic/tests/validations.test.ts +283 -0
- package/src/v4/classic/tests/void.test.ts +12 -0
- package/src/v4/core/api.ts +1913 -0
- package/src/v4/core/checks.ts +1274 -0
- package/src/v4/core/compile.ts +2315 -0
- package/src/v4/core/core.ts +230 -0
- package/src/v4/core/doc.ts +52 -0
- package/src/v4/core/errors.ts +546 -0
- package/src/v4/core/index.ts +19 -0
- package/src/v4/core/json-schema-generator.ts +131 -0
- package/src/v4/core/json-schema-processors.ts +934 -0
- package/src/v4/core/json-schema.ts +148 -0
- package/src/v4/core/memoizer.ts +331 -0
- package/src/v4/core/parse.ts +309 -0
- package/src/v4/core/regexes.ts +217 -0
- package/src/v4/core/registries.ts +109 -0
- package/src/v4/core/schemas.ts +5295 -0
- package/src/v4/core/standard-schema.ts +159 -0
- package/src/v4/core/tests/cached.test.ts +54 -0
- package/src/v4/core/tests/compile-differential.test.ts +1004 -0
- package/src/v4/core/tests/compile-generative.test.ts +445 -0
- package/src/v4/core/tests/compile-global.test.ts +89 -0
- package/src/v4/core/tests/compile-off-by-default.test.ts +26 -0
- package/src/v4/core/tests/compile-stats.test.ts +34 -0
- package/src/v4/core/tests/compile.test.ts +2040 -0
- package/src/v4/core/tests/email-regex.test.ts +140 -0
- package/src/v4/core/tests/extend.test.ts +59 -0
- package/src/v4/core/tests/index.test.ts +46 -0
- package/src/v4/core/tests/locales/be.test.ts +124 -0
- package/src/v4/core/tests/locales/el.test.ts +214 -0
- package/src/v4/core/tests/locales/en.test.ts +22 -0
- package/src/v4/core/tests/locales/es.test.ts +180 -0
- package/src/v4/core/tests/locales/fr.test.ts +72 -0
- package/src/v4/core/tests/locales/he.test.ts +379 -0
- package/src/v4/core/tests/locales/hr.test.ts +163 -0
- package/src/v4/core/tests/locales/nl.test.ts +46 -0
- package/src/v4/core/tests/locales/parity.test.ts +42 -0
- package/src/v4/core/tests/locales/ru.test.ts +128 -0
- package/src/v4/core/tests/locales/tg.test.ts +85 -0
- package/src/v4/core/tests/locales/tk.test.ts +69 -0
- package/src/v4/core/tests/locales/tr.test.ts +69 -0
- package/src/v4/core/tests/locales/uz.test.ts +105 -0
- package/src/v4/core/tests/polyfill-collision.test.ts +46 -0
- package/src/v4/core/tests/record-constructor.test.ts +125 -0
- package/src/v4/core/tests/recursive-tuples.test.ts +45 -0
- package/src/v4/core/tests/treeshake.test.ts +51 -0
- package/src/v4/core/tests/url-no-canparse.test.ts +133 -0
- package/src/v4/core/to-json-schema.ts +857 -0
- package/src/v4/core/util.ts +1284 -0
- package/src/v4/core/versions.ts +5 -0
- package/src/v4/core/visit.ts +193 -0
- package/src/v4/core/zsf.ts +323 -0
- package/src/v4/index.ts +4 -0
- package/src/v4/locales/ar.ts +120 -0
- package/src/v4/locales/az.ts +116 -0
- package/src/v4/locales/be.ts +188 -0
- package/src/v4/locales/bg.ts +133 -0
- package/src/v4/locales/bn.ts +123 -0
- package/src/v4/locales/ca.ts +121 -0
- package/src/v4/locales/ckb.ts +140 -0
- package/src/v4/locales/cs.ts +123 -0
- package/src/v4/locales/da.ts +128 -0
- package/src/v4/locales/de.ts +121 -0
- package/src/v4/locales/el.ts +124 -0
- package/src/v4/locales/en.ts +136 -0
- package/src/v4/locales/eo.ts +123 -0
- package/src/v4/locales/es.ts +145 -0
- package/src/v4/locales/fa.ts +131 -0
- package/src/v4/locales/fi.ts +126 -0
- package/src/v4/locales/fr-CA.ts +121 -0
- package/src/v4/locales/fr.ts +139 -0
- package/src/v4/locales/gu.ts +123 -0
- package/src/v4/locales/he.ts +253 -0
- package/src/v4/locales/hi.ts +126 -0
- package/src/v4/locales/hr.ts +135 -0
- package/src/v4/locales/hu.ts +122 -0
- package/src/v4/locales/hy.ts +175 -0
- package/src/v4/locales/id.ts +120 -0
- package/src/v4/locales/index.ts +63 -0
- package/src/v4/locales/is.ts +124 -0
- package/src/v4/locales/it.ts +121 -0
- package/src/v4/locales/ja.ts +119 -0
- package/src/v4/locales/ka.ts +128 -0
- package/src/v4/locales/kh.ts +7 -0
- package/src/v4/locales/km.ts +124 -0
- package/src/v4/locales/kn.ts +126 -0
- package/src/v4/locales/ko.ts +126 -0
- package/src/v4/locales/lt.ts +243 -0
- package/src/v4/locales/mk.ts +123 -0
- package/src/v4/locales/ms.ts +120 -0
- package/src/v4/locales/ne.ts +128 -0
- package/src/v4/locales/nl.ts +126 -0
- package/src/v4/locales/nn.ts +121 -0
- package/src/v4/locales/no.ts +121 -0
- package/src/v4/locales/ota.ts +122 -0
- package/src/v4/locales/pl.ts +123 -0
- package/src/v4/locales/ps.ts +131 -0
- package/src/v4/locales/pt-BR.ts +161 -0
- package/src/v4/locales/pt.ts +159 -0
- package/src/v4/locales/ro.ts +132 -0
- package/src/v4/locales/ru.ts +188 -0
- package/src/v4/locales/sk.ts +123 -0
- package/src/v4/locales/sl.ts +123 -0
- package/src/v4/locales/sv.ts +124 -0
- package/src/v4/locales/ta.ts +123 -0
- package/src/v4/locales/tg.ts +135 -0
- package/src/v4/locales/th.ts +124 -0
- package/src/v4/locales/tk.ts +113 -0
- package/src/v4/locales/tr.ts +116 -0
- package/src/v4/locales/ua.ts +7 -0
- package/src/v4/locales/uk.ts +122 -0
- package/src/v4/locales/ur.ts +124 -0
- package/src/v4/locales/uz.ts +120 -0
- package/src/v4/locales/vi.ts +122 -0
- package/src/v4/locales/yo.ts +129 -0
- package/src/v4/locales/zh-CN.ts +121 -0
- package/src/v4/locales/zh-TW.ts +120 -0
- package/src/v4/mini/checks.ts +33 -0
- package/src/v4/mini/coerce.ts +27 -0
- package/src/v4/mini/deep-partial.ts +73 -0
- package/src/v4/mini/external.ts +52 -0
- package/src/v4/mini/in-out.ts +45 -0
- package/src/v4/mini/index.ts +3 -0
- package/src/v4/mini/iso.ts +66 -0
- package/src/v4/mini/parse.ts +16 -0
- package/src/v4/mini/schemas.ts +2093 -0
- package/src/v4/mini/tests/apply.test.ts +57 -0
- package/src/v4/mini/tests/assignability.test.ts +190 -0
- package/src/v4/mini/tests/brand.test.ts +94 -0
- package/src/v4/mini/tests/checks.test.ts +158 -0
- package/src/v4/mini/tests/codec.test.ts +582 -0
- package/src/v4/mini/tests/computed.test.ts +30 -0
- package/src/v4/mini/tests/cyclic-data.test.ts +84 -0
- package/src/v4/mini/tests/deep-partial.test.ts +54 -0
- package/src/v4/mini/tests/error.test.ts +41 -0
- package/src/v4/mini/tests/functions.test.ts +14 -0
- package/src/v4/mini/tests/index.test.ts +1148 -0
- package/src/v4/mini/tests/number.test.ts +109 -0
- package/src/v4/mini/tests/object.test.ts +292 -0
- package/src/v4/mini/tests/prototypes.test.ts +43 -0
- package/src/v4/mini/tests/recursive-types.test.ts +341 -0
- package/src/v4/mini/tests/standard-schema.test.ts +50 -0
- package/src/v4/mini/tests/string.test.ts +396 -0
- package/src/v4-mini/index.ts +3 -0
- package/v3/YatspError.cjs +167 -0
- package/v3/YatspError.d.cts +164 -0
- package/v3/YatspError.d.ts +164 -0
- package/v3/YatspError.js +143 -0
- package/v3/errors.cjs +36 -0
- package/v3/errors.d.cts +5 -0
- package/v3/errors.d.ts +5 -0
- package/v3/errors.js +9 -0
- package/v3/external.cjs +41 -0
- package/v3/external.d.cts +6 -0
- package/v3/external.d.ts +6 -0
- package/v3/external.js +6 -0
- package/v3/helpers/enumUtil.cjs +21 -0
- package/v3/helpers/enumUtil.d.cts +8 -0
- package/v3/helpers/enumUtil.d.ts +8 -0
- package/v3/helpers/enumUtil.js +1 -0
- package/v3/helpers/errorUtil.cjs +28 -0
- package/v3/helpers/errorUtil.d.cts +9 -0
- package/v3/helpers/errorUtil.d.ts +9 -0
- package/v3/helpers/errorUtil.js +6 -0
- package/v3/helpers/parseUtil.cjs +143 -0
- package/v3/helpers/parseUtil.d.cts +78 -0
- package/v3/helpers/parseUtil.d.ts +78 -0
- package/v3/helpers/parseUtil.js +109 -0
- package/v3/helpers/partialUtil.cjs +21 -0
- package/v3/helpers/partialUtil.d.cts +8 -0
- package/v3/helpers/partialUtil.d.ts +8 -0
- package/v3/helpers/partialUtil.js +1 -0
- package/v3/helpers/typeAliases.cjs +21 -0
- package/v3/helpers/typeAliases.d.cts +2 -0
- package/v3/helpers/typeAliases.d.ts +2 -0
- package/v3/helpers/typeAliases.js +1 -0
- package/v3/helpers/util.cjs +156 -0
- package/v3/helpers/util.d.cts +85 -0
- package/v3/helpers/util.d.ts +85 -0
- package/v3/helpers/util.js +133 -0
- package/v3/index.cjs +52 -0
- package/v3/index.d.cts +4 -0
- package/v3/index.d.ts +4 -0
- package/v3/index.js +4 -0
- package/v3/locales/en.cjs +112 -0
- package/v3/locales/en.d.cts +3 -0
- package/v3/locales/en.d.ts +3 -0
- package/v3/locales/en.js +109 -0
- package/v3/standard-schema.cjs +21 -0
- package/v3/standard-schema.d.cts +102 -0
- package/v3/standard-schema.d.ts +102 -0
- package/v3/standard-schema.js +1 -0
- package/v3/types.cjs +3798 -0
- package/v3/types.d.cts +1034 -0
- package/v3/types.d.ts +1034 -0
- package/v3/types.js +3697 -0
- package/v4/classic/checks.cjs +53 -0
- package/v4/classic/checks.d.cts +1 -0
- package/v4/classic/checks.d.ts +1 -0
- package/v4/classic/checks.js +1 -0
- package/v4/classic/coerce.cjs +66 -0
- package/v4/classic/coerce.d.cts +17 -0
- package/v4/classic/coerce.d.ts +17 -0
- package/v4/classic/coerce.js +17 -0
- package/v4/classic/compat.cjs +80 -0
- package/v4/classic/compat.d.cts +48 -0
- package/v4/classic/compat.d.ts +48 -0
- package/v4/classic/compat.js +31 -0
- package/v4/classic/deep-partial.cjs +58 -0
- package/v4/classic/deep-partial.d.cts +14 -0
- package/v4/classic/deep-partial.d.ts +14 -0
- package/v4/classic/deep-partial.js +13 -0
- package/v4/classic/errors.cjs +102 -0
- package/v4/classic/errors.d.cts +29 -0
- package/v4/classic/errors.d.ts +29 -0
- package/v4/classic/errors.js +57 -0
- package/v4/classic/external.cjs +97 -0
- package/v4/classic/external.d.cts +19 -0
- package/v4/classic/external.d.ts +19 -0
- package/v4/classic/external.js +17 -0
- package/v4/classic/from-json-schema.cjs +926 -0
- package/v4/classic/from-json-schema.d.cts +12 -0
- package/v4/classic/from-json-schema.d.ts +12 -0
- package/v4/classic/from-json-schema.js +881 -0
- package/v4/classic/in-out.cjs +82 -0
- package/v4/classic/in-out.d.cts +8 -0
- package/v4/classic/in-out.d.ts +8 -0
- package/v4/classic/in-out.js +36 -0
- package/v4/classic/index.cjs +52 -0
- package/v4/classic/index.d.cts +3 -0
- package/v4/classic/index.d.ts +3 -0
- package/v4/classic/index.js +4 -0
- package/v4/classic/iso.cjs +68 -0
- package/v4/classic/iso.d.cts +7 -0
- package/v4/classic/iso.d.ts +7 -0
- package/v4/classic/iso.js +15 -0
- package/v4/classic/parse.cjs +63 -0
- package/v4/classic/parse.d.cts +44 -0
- package/v4/classic/parse.d.ts +44 -0
- package/v4/classic/parse.js +16 -0
- package/v4/classic/schemas.cjs +1676 -0
- package/v4/classic/schemas.d.cts +816 -0
- package/v4/classic/schemas.d.ts +816 -0
- package/v4/classic/schemas.js +1535 -0
- package/v4/core/api.cjs +1269 -0
- package/v4/core/api.d.cts +335 -0
- package/v4/core/api.d.ts +335 -0
- package/v4/core/api.js +1107 -0
- package/v4/core/checks.cjs +561 -0
- package/v4/core/checks.d.cts +294 -0
- package/v4/core/checks.d.ts +294 -0
- package/v4/core/checks.js +516 -0
- package/v4/core/compile.cjs +1908 -0
- package/v4/core/compile.d.cts +65 -0
- package/v4/core/compile.d.ts +65 -0
- package/v4/core/compile.js +1858 -0
- package/v4/core/core.cjs +167 -0
- package/v4/core/core.d.cts +82 -0
- package/v4/core/core.d.ts +82 -0
- package/v4/core/core.js +141 -0
- package/v4/core/doc.cjs +61 -0
- package/v4/core/doc.d.cts +16 -0
- package/v4/core/doc.d.ts +16 -0
- package/v4/core/doc.js +38 -0
- package/v4/core/errors.cjs +317 -0
- package/v4/core/errors.d.cts +225 -0
- package/v4/core/errors.d.ts +225 -0
- package/v4/core/errors.js +267 -0
- package/v4/core/index.cjs +70 -0
- package/v4/core/index.d.cts +19 -0
- package/v4/core/index.d.ts +19 -0
- package/v4/core/index.js +19 -0
- package/v4/core/json-schema-generator.cjs +122 -0
- package/v4/core/json-schema-generator.d.cts +65 -0
- package/v4/core/json-schema-generator.d.ts +65 -0
- package/v4/core/json-schema-generator.js +99 -0
- package/v4/core/json-schema-processors.cjs +929 -0
- package/v4/core/json-schema-processors.d.cts +65 -0
- package/v4/core/json-schema-processors.d.ts +65 -0
- package/v4/core/json-schema-processors.js +843 -0
- package/v4/core/json-schema.cjs +21 -0
- package/v4/core/json-schema.d.cts +89 -0
- package/v4/core/json-schema.d.ts +89 -0
- package/v4/core/json-schema.js +1 -0
- package/v4/core/memoizer.cjs +360 -0
- package/v4/core/memoizer.d.cts +15 -0
- package/v4/core/memoizer.d.ts +15 -0
- package/v4/core/memoizer.js +311 -0
- package/v4/core/parse.cjs +233 -0
- package/v4/core/parse.d.cts +52 -0
- package/v4/core/parse.d.ts +52 -0
- package/v4/core/parse.js +175 -0
- package/v4/core/regexes.cjs +209 -0
- package/v4/core/regexes.d.cts +90 -0
- package/v4/core/regexes.d.ts +90 -0
- package/v4/core/regexes.js +156 -0
- package/v4/core/registries.cjs +76 -0
- package/v4/core/registries.d.cts +35 -0
- package/v4/core/registries.d.ts +35 -0
- package/v4/core/registries.js +52 -0
- package/v4/core/schemas.cjs +2669 -0
- package/v4/core/schemas.d.cts +1273 -0
- package/v4/core/schemas.d.ts +1273 -0
- package/v4/core/schemas.js +2606 -0
- package/v4/core/standard-schema.cjs +21 -0
- package/v4/core/standard-schema.d.cts +126 -0
- package/v4/core/standard-schema.d.ts +126 -0
- package/v4/core/standard-schema.js +1 -0
- package/v4/core/to-json-schema.cjs +681 -0
- package/v4/core/to-json-schema.d.cts +154 -0
- package/v4/core/to-json-schema.d.ts +154 -0
- package/v4/core/to-json-schema.js +651 -0
- package/v4/core/util.cjs +949 -0
- package/v4/core/util.d.cts +278 -0
- package/v4/core/util.d.ts +278 -0
- package/v4/core/util.js +859 -0
- package/v4/core/versions.cjs +27 -0
- package/v4/core/versions.d.cts +5 -0
- package/v4/core/versions.d.ts +5 -0
- package/v4/core/versions.js +5 -0
- package/v4/core/visit.cjs +214 -0
- package/v4/core/visit.d.cts +30 -0
- package/v4/core/visit.d.ts +30 -0
- package/v4/core/visit.js +169 -0
- package/v4/index.cjs +51 -0
- package/v4/index.d.cts +3 -0
- package/v4/index.d.ts +3 -0
- package/v4/index.js +4 -0
- package/v4/locales/ar.cjs +138 -0
- package/v4/locales/ar.d.cts +5 -0
- package/v4/locales/ar.d.ts +4 -0
- package/v4/locales/ar.js +111 -0
- package/v4/locales/az.cjs +137 -0
- package/v4/locales/az.d.cts +5 -0
- package/v4/locales/az.d.ts +4 -0
- package/v4/locales/az.js +110 -0
- package/v4/locales/be.cjs +195 -0
- package/v4/locales/be.d.cts +5 -0
- package/v4/locales/be.d.ts +4 -0
- package/v4/locales/be.js +168 -0
- package/v4/locales/bg.cjs +152 -0
- package/v4/locales/bg.d.cts +5 -0
- package/v4/locales/bg.d.ts +4 -0
- package/v4/locales/bg.js +125 -0
- package/v4/locales/bn.cjs +140 -0
- package/v4/locales/bn.d.cts +5 -0
- package/v4/locales/bn.d.ts +4 -0
- package/v4/locales/bn.js +113 -0
- package/v4/locales/ca.cjs +139 -0
- package/v4/locales/ca.d.cts +5 -0
- package/v4/locales/ca.d.ts +4 -0
- package/v4/locales/ca.js +112 -0
- package/v4/locales/ckb.cjs +160 -0
- package/v4/locales/ckb.d.cts +5 -0
- package/v4/locales/ckb.d.ts +4 -0
- package/v4/locales/ckb.js +133 -0
- package/v4/locales/cs.cjs +143 -0
- package/v4/locales/cs.d.cts +5 -0
- package/v4/locales/cs.d.ts +4 -0
- package/v4/locales/cs.js +116 -0
- package/v4/locales/da.cjs +147 -0
- package/v4/locales/da.d.cts +5 -0
- package/v4/locales/da.d.ts +4 -0
- package/v4/locales/da.js +120 -0
- package/v4/locales/de.cjs +140 -0
- package/v4/locales/de.d.cts +5 -0
- package/v4/locales/de.d.ts +4 -0
- package/v4/locales/de.js +113 -0
- package/v4/locales/el.cjs +139 -0
- package/v4/locales/el.d.cts +5 -0
- package/v4/locales/el.d.ts +4 -0
- package/v4/locales/el.js +112 -0
- package/v4/locales/en.cjs +152 -0
- package/v4/locales/en.d.cts +5 -0
- package/v4/locales/en.d.ts +4 -0
- package/v4/locales/en.js +125 -0
- package/v4/locales/eo.cjs +141 -0
- package/v4/locales/eo.d.cts +5 -0
- package/v4/locales/eo.d.ts +4 -0
- package/v4/locales/eo.js +114 -0
- package/v4/locales/es.cjs +163 -0
- package/v4/locales/es.d.cts +5 -0
- package/v4/locales/es.d.ts +4 -0
- package/v4/locales/es.js +136 -0
- package/v4/locales/fa.cjs +146 -0
- package/v4/locales/fa.d.cts +5 -0
- package/v4/locales/fa.d.ts +4 -0
- package/v4/locales/fa.js +119 -0
- package/v4/locales/fi.cjs +144 -0
- package/v4/locales/fi.d.cts +5 -0
- package/v4/locales/fi.d.ts +4 -0
- package/v4/locales/fi.js +117 -0
- package/v4/locales/fr-CA.cjs +139 -0
- package/v4/locales/fr-CA.d.cts +5 -0
- package/v4/locales/fr-CA.d.ts +4 -0
- package/v4/locales/fr-CA.js +112 -0
- package/v4/locales/fr.cjs +156 -0
- package/v4/locales/fr.d.cts +5 -0
- package/v4/locales/fr.d.ts +4 -0
- package/v4/locales/fr.js +129 -0
- package/v4/locales/gu.cjs +140 -0
- package/v4/locales/gu.d.cts +5 -0
- package/v4/locales/gu.d.ts +4 -0
- package/v4/locales/gu.js +113 -0
- package/v4/locales/he.cjs +248 -0
- package/v4/locales/he.d.cts +5 -0
- package/v4/locales/he.d.ts +4 -0
- package/v4/locales/he.js +221 -0
- package/v4/locales/hi.cjs +138 -0
- package/v4/locales/hi.d.cts +5 -0
- package/v4/locales/hi.d.ts +4 -0
- package/v4/locales/hi.js +111 -0
- package/v4/locales/hr.cjs +153 -0
- package/v4/locales/hr.d.cts +5 -0
- package/v4/locales/hr.d.ts +4 -0
- package/v4/locales/hr.js +126 -0
- package/v4/locales/hu.cjs +140 -0
- package/v4/locales/hu.d.cts +5 -0
- package/v4/locales/hu.d.ts +4 -0
- package/v4/locales/hu.js +113 -0
- package/v4/locales/hy.cjs +185 -0
- package/v4/locales/hy.d.cts +5 -0
- package/v4/locales/hy.d.ts +4 -0
- package/v4/locales/hy.js +158 -0
- package/v4/locales/id.cjs +138 -0
- package/v4/locales/id.d.cts +5 -0
- package/v4/locales/id.d.ts +4 -0
- package/v4/locales/id.js +111 -0
- package/v4/locales/index.cjs +152 -0
- package/v4/locales/index.d.cts +63 -0
- package/v4/locales/index.d.ts +63 -0
- package/v4/locales/index.js +63 -0
- package/v4/locales/is.cjs +141 -0
- package/v4/locales/is.d.cts +5 -0
- package/v4/locales/is.d.ts +4 -0
- package/v4/locales/is.js +114 -0
- package/v4/locales/it.cjs +140 -0
- package/v4/locales/it.d.cts +5 -0
- package/v4/locales/it.d.ts +4 -0
- package/v4/locales/it.js +113 -0
- package/v4/locales/ja.cjs +139 -0
- package/v4/locales/ja.d.cts +5 -0
- package/v4/locales/ja.d.ts +4 -0
- package/v4/locales/ja.js +112 -0
- package/v4/locales/ka.cjs +144 -0
- package/v4/locales/ka.d.cts +5 -0
- package/v4/locales/ka.d.ts +4 -0
- package/v4/locales/ka.js +117 -0
- package/v4/locales/kh.cjs +12 -0
- package/v4/locales/kh.d.cts +5 -0
- package/v4/locales/kh.d.ts +5 -0
- package/v4/locales/kh.js +5 -0
- package/v4/locales/km.cjs +142 -0
- package/v4/locales/km.d.cts +5 -0
- package/v4/locales/km.d.ts +4 -0
- package/v4/locales/km.js +115 -0
- package/v4/locales/kn.cjs +143 -0
- package/v4/locales/kn.d.cts +5 -0
- package/v4/locales/kn.d.ts +4 -0
- package/v4/locales/kn.js +116 -0
- package/v4/locales/ko.cjs +143 -0
- package/v4/locales/ko.d.cts +5 -0
- package/v4/locales/ko.d.ts +4 -0
- package/v4/locales/ko.js +116 -0
- package/v4/locales/lt.cjs +234 -0
- package/v4/locales/lt.d.cts +5 -0
- package/v4/locales/lt.d.ts +4 -0
- package/v4/locales/lt.js +207 -0
- package/v4/locales/mk.cjs +141 -0
- package/v4/locales/mk.d.cts +5 -0
- package/v4/locales/mk.d.ts +4 -0
- package/v4/locales/mk.js +114 -0
- package/v4/locales/ms.cjs +139 -0
- package/v4/locales/ms.d.cts +5 -0
- package/v4/locales/ms.d.ts +4 -0
- package/v4/locales/ms.js +112 -0
- package/v4/locales/ne.cjs +138 -0
- package/v4/locales/ne.d.cts +5 -0
- package/v4/locales/ne.d.ts +4 -0
- package/v4/locales/ne.js +111 -0
- package/v4/locales/nl.cjs +142 -0
- package/v4/locales/nl.d.cts +5 -0
- package/v4/locales/nl.d.ts +4 -0
- package/v4/locales/nl.js +115 -0
- package/v4/locales/nn.cjs +140 -0
- package/v4/locales/nn.d.cts +5 -0
- package/v4/locales/nn.d.ts +4 -0
- package/v4/locales/nn.js +113 -0
- package/v4/locales/no.cjs +140 -0
- package/v4/locales/no.d.cts +5 -0
- package/v4/locales/no.d.ts +4 -0
- package/v4/locales/no.js +113 -0
- package/v4/locales/ota.cjs +141 -0
- package/v4/locales/ota.d.cts +5 -0
- package/v4/locales/ota.d.ts +4 -0
- package/v4/locales/ota.js +114 -0
- package/v4/locales/pl.cjs +141 -0
- package/v4/locales/pl.d.cts +5 -0
- package/v4/locales/pl.d.ts +4 -0
- package/v4/locales/pl.js +114 -0
- package/v4/locales/ps.cjs +146 -0
- package/v4/locales/ps.d.cts +5 -0
- package/v4/locales/ps.d.ts +4 -0
- package/v4/locales/ps.js +119 -0
- package/v4/locales/pt-BR.cjs +170 -0
- package/v4/locales/pt-BR.d.cts +5 -0
- package/v4/locales/pt-BR.d.ts +4 -0
- package/v4/locales/pt-BR.js +143 -0
- package/v4/locales/pt.cjs +169 -0
- package/v4/locales/pt.d.cts +5 -0
- package/v4/locales/pt.d.ts +4 -0
- package/v4/locales/pt.js +142 -0
- package/v4/locales/ro.cjs +149 -0
- package/v4/locales/ro.d.cts +5 -0
- package/v4/locales/ro.d.ts +4 -0
- package/v4/locales/ro.js +122 -0
- package/v4/locales/ru.cjs +195 -0
- package/v4/locales/ru.d.cts +5 -0
- package/v4/locales/ru.d.ts +4 -0
- package/v4/locales/ru.js +168 -0
- package/v4/locales/sk.cjs +143 -0
- package/v4/locales/sk.d.cts +5 -0
- package/v4/locales/sk.d.ts +4 -0
- package/v4/locales/sk.js +116 -0
- package/v4/locales/sl.cjs +141 -0
- package/v4/locales/sl.d.cts +5 -0
- package/v4/locales/sl.d.ts +4 -0
- package/v4/locales/sl.js +114 -0
- package/v4/locales/sv.cjs +142 -0
- package/v4/locales/sv.d.cts +5 -0
- package/v4/locales/sv.d.ts +4 -0
- package/v4/locales/sv.js +115 -0
- package/v4/locales/ta.cjs +142 -0
- package/v4/locales/ta.d.cts +5 -0
- package/v4/locales/ta.d.ts +4 -0
- package/v4/locales/ta.js +115 -0
- package/v4/locales/tg.cjs +144 -0
- package/v4/locales/tg.d.cts +5 -0
- package/v4/locales/tg.d.ts +4 -0
- package/v4/locales/tg.js +117 -0
- package/v4/locales/th.cjs +142 -0
- package/v4/locales/th.d.cts +5 -0
- package/v4/locales/th.d.ts +4 -0
- package/v4/locales/th.js +115 -0
- package/v4/locales/tk.cjs +134 -0
- package/v4/locales/tk.d.cts +5 -0
- package/v4/locales/tk.d.ts +4 -0
- package/v4/locales/tk.js +107 -0
- package/v4/locales/tr.cjs +137 -0
- package/v4/locales/tr.d.cts +5 -0
- package/v4/locales/tr.d.ts +4 -0
- package/v4/locales/tr.js +110 -0
- package/v4/locales/ua.cjs +12 -0
- package/v4/locales/ua.d.cts +5 -0
- package/v4/locales/ua.d.ts +5 -0
- package/v4/locales/ua.js +5 -0
- package/v4/locales/uk.cjs +140 -0
- package/v4/locales/uk.d.cts +5 -0
- package/v4/locales/uk.d.ts +4 -0
- package/v4/locales/uk.js +113 -0
- package/v4/locales/ur.cjs +142 -0
- package/v4/locales/ur.d.cts +5 -0
- package/v4/locales/ur.d.ts +4 -0
- package/v4/locales/ur.js +115 -0
- package/v4/locales/uz.cjs +140 -0
- package/v4/locales/uz.d.cts +5 -0
- package/v4/locales/uz.d.ts +4 -0
- package/v4/locales/uz.js +113 -0
- package/v4/locales/vi.cjs +140 -0
- package/v4/locales/vi.d.cts +5 -0
- package/v4/locales/vi.d.ts +4 -0
- package/v4/locales/vi.js +113 -0
- package/v4/locales/yo.cjs +139 -0
- package/v4/locales/yo.d.cts +5 -0
- package/v4/locales/yo.d.ts +4 -0
- package/v4/locales/yo.js +112 -0
- package/v4/locales/zh-CN.cjs +141 -0
- package/v4/locales/zh-CN.d.cts +5 -0
- package/v4/locales/zh-CN.d.ts +4 -0
- package/v4/locales/zh-CN.js +114 -0
- package/v4/locales/zh-TW.cjs +139 -0
- package/v4/locales/zh-TW.d.cts +5 -0
- package/v4/locales/zh-TW.d.ts +4 -0
- package/v4/locales/zh-TW.js +112 -0
- package/v4/mini/checks.cjs +54 -0
- package/v4/mini/checks.d.cts +1 -0
- package/v4/mini/checks.d.ts +1 -0
- package/v4/mini/checks.js +1 -0
- package/v4/mini/coerce.cjs +71 -0
- package/v4/mini/coerce.d.cts +7 -0
- package/v4/mini/coerce.d.ts +7 -0
- package/v4/mini/coerce.js +22 -0
- package/v4/mini/deep-partial.cjs +58 -0
- package/v4/mini/deep-partial.d.cts +14 -0
- package/v4/mini/deep-partial.d.ts +14 -0
- package/v4/mini/deep-partial.js +13 -0
- package/v4/mini/external.cjs +95 -0
- package/v4/mini/external.d.cts +16 -0
- package/v4/mini/external.d.ts +16 -0
- package/v4/mini/external.js +16 -0
- package/v4/mini/in-out.cjs +82 -0
- package/v4/mini/in-out.d.cts +8 -0
- package/v4/mini/in-out.d.ts +8 -0
- package/v4/mini/in-out.js +36 -0
- package/v4/mini/index.cjs +51 -0
- package/v4/mini/index.d.cts +3 -0
- package/v4/mini/index.d.ts +3 -0
- package/v4/mini/index.js +3 -0
- package/v4/mini/iso.cjs +83 -0
- package/v4/mini/iso.d.cts +22 -0
- package/v4/mini/iso.d.ts +22 -0
- package/v4/mini/iso.js +34 -0
- package/v4/mini/parse.cjs +37 -0
- package/v4/mini/parse.d.cts +1 -0
- package/v4/mini/parse.d.ts +1 -0
- package/v4/mini/parse.js +1 -0
- package/v4/mini/schemas.cjs +1149 -0
- package/v4/mini/schemas.d.cts +480 -0
- package/v4/mini/schemas.d.ts +480 -0
- package/v4/mini/schemas.js +1004 -0
- package/v4-mini/index.cjs +51 -0
- package/v4-mini/index.d.cts +3 -0
- package/v4-mini/index.d.ts +3 -0
- package/v4-mini/index.js +3 -0
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import { expect, test } from "vitest";
|
|
2
|
+
|
|
3
|
+
import * as zm from "yatsp/mini";
|
|
4
|
+
import * as z from "yatsp/v4";
|
|
5
|
+
import * as core from "yatsp/v4/core";
|
|
6
|
+
|
|
7
|
+
// V8 sizes an instance's property backing store in steps, and schema instances get no in-object slots (their constructor assigns nothing itself): 12 own properties cost 128 bytes, 13 cost 848, 21 cost 1616. Methods therefore live on the prototype and materialize per instance on first read. These bounds are what keeps a schema graph small; crossing one silently multiplies its memory by 6x.
|
|
8
|
+
const MAX_OWN_PROPS = 12;
|
|
9
|
+
|
|
10
|
+
test("schema instances stay under V8's property-count step", () => {
|
|
11
|
+
const cases: Array<[string, object]> = [
|
|
12
|
+
["string", z.string()],
|
|
13
|
+
["number", z.number()],
|
|
14
|
+
["bigint", z.bigint()],
|
|
15
|
+
["boolean", z.boolean()],
|
|
16
|
+
["date", z.date()],
|
|
17
|
+
["enum", z.enum(["a", "b"])],
|
|
18
|
+
["array", z.array(z.string())],
|
|
19
|
+
["object", z.object({ a: z.string() })],
|
|
20
|
+
["record", z.record(z.string(), z.string())],
|
|
21
|
+
["map", z.map(z.string(), z.string())],
|
|
22
|
+
["set", z.set(z.string())],
|
|
23
|
+
["union", z.union([z.string(), z.number()])],
|
|
24
|
+
["optional", z.string().optional()],
|
|
25
|
+
["pipe", z.string().pipe(z.string())],
|
|
26
|
+
["email", z.email()],
|
|
27
|
+
["mini string", zm.string()],
|
|
28
|
+
["mini object", zm.object({ a: zm.string() })],
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
const over = cases
|
|
32
|
+
.map(([name, schema]) => [name, Reflect.ownKeys(schema).length] as const)
|
|
33
|
+
.filter(([, count]) => count > MAX_OWN_PROPS);
|
|
34
|
+
|
|
35
|
+
expect(over).toEqual([]);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test("prototype-installed members survive detaching", () => {
|
|
39
|
+
const schema = z.string();
|
|
40
|
+
const { parse, safeParse, spa } = schema;
|
|
41
|
+
|
|
42
|
+
expect(parse("hi")).toEqual("hi");
|
|
43
|
+
expect(safeParse("hi").success).toEqual(true);
|
|
44
|
+
expect(["a", "b"].map((v) => parse(v))).toEqual(["a", "b"]);
|
|
45
|
+
expect(spa).toBe(schema.safeParseAsync);
|
|
46
|
+
|
|
47
|
+
const email = schema.email;
|
|
48
|
+
expect(email().safeParse("a@b.co").success).toEqual(true);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test("prototype-installed members can be overwritten per instance", () => {
|
|
52
|
+
const schema: any = z.string();
|
|
53
|
+
schema.parse = () => "overridden";
|
|
54
|
+
|
|
55
|
+
expect(schema.parse("anything")).toEqual("overridden");
|
|
56
|
+
expect(z.string().parse("untouched")).toEqual("untouched");
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test("~standard is lazy but complete", () => {
|
|
60
|
+
const schema = z.string();
|
|
61
|
+
|
|
62
|
+
expect(Object.prototype.hasOwnProperty.call(schema, "~standard")).toEqual(false);
|
|
63
|
+
expect(schema["~standard"].vendor).toEqual("yatsp");
|
|
64
|
+
expect(schema["~standard"].version).toEqual(1);
|
|
65
|
+
expect(schema["~standard"].validate("hi")).toEqual({ value: "hi" });
|
|
66
|
+
expect((schema["~standard"] as any).jsonSchema.input()).toMatchObject({ type: "string" });
|
|
67
|
+
// Reading it caches on the instance, so the getter runs once.
|
|
68
|
+
expect(Object.prototype.hasOwnProperty.call(schema, "~standard")).toEqual(true);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
test("caching a lazy member preserves its original enumerability", () => {
|
|
72
|
+
const schema = z.string();
|
|
73
|
+
|
|
74
|
+
// Methods were enumerable own properties before they moved to the prototype, so touching one still surfaces it to `Object.keys`.
|
|
75
|
+
void schema.parse;
|
|
76
|
+
void schema.optional;
|
|
77
|
+
expect(Object.keys(schema)).toContain("parse");
|
|
78
|
+
expect(Object.keys(schema)).toContain("optional");
|
|
79
|
+
|
|
80
|
+
// `~standard` never was an own data property, so caching it must not add it to `Object.keys` or to `JSON.stringify` of a schema.
|
|
81
|
+
void schema["~standard"];
|
|
82
|
+
expect(Object.keys(schema)).not.toContain("~standard");
|
|
83
|
+
expect(JSON.stringify(schema)).not.toContain("~standard");
|
|
84
|
+
|
|
85
|
+
// An explicit assignment behaves like one, as before.
|
|
86
|
+
const other: any = z.string();
|
|
87
|
+
other["~standard"] = { vendor: "x" };
|
|
88
|
+
expect(Object.keys(other)).toContain("~standard");
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test("_def stays read-only", () => {
|
|
92
|
+
expect(() => {
|
|
93
|
+
(z.string() as any)._def = {};
|
|
94
|
+
}).toThrow(TypeError);
|
|
95
|
+
expect(() => {
|
|
96
|
+
(z.function({ input: [z.string()], output: z.number() }) as any)._def = {};
|
|
97
|
+
}).toThrow(TypeError);
|
|
98
|
+
const schema = z.string();
|
|
99
|
+
expect(schema._def).toBe(schema._yatsp.def);
|
|
100
|
+
expect(z.object({ a: z.string() })._def.type).toEqual("object");
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test("deferred initializers are released after construction", () => {
|
|
104
|
+
expect(z.string()._yatsp.deferred).toEqual(undefined);
|
|
105
|
+
expect(z.object({ a: z.string() })._yatsp.deferred).toEqual(undefined);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
test("trait initializers run once per instance across repeated entry", () => {
|
|
109
|
+
const calls: string[] = [];
|
|
110
|
+
const Base: core.$constructor<any> = core.$constructor<any>("CountedBase", () => calls.push("base"));
|
|
111
|
+
const Child: core.$constructor<any> = core.$constructor<any>("CountedChild", (inst, def) => {
|
|
112
|
+
calls.push("child");
|
|
113
|
+
Base.init(inst, def);
|
|
114
|
+
Base.init(inst, def);
|
|
115
|
+
});
|
|
116
|
+
const constructed = new Child({});
|
|
117
|
+
Child.init(constructed, {});
|
|
118
|
+
const direct = Object.create({});
|
|
119
|
+
Child.init(direct, {});
|
|
120
|
+
Child.init(direct, {});
|
|
121
|
+
expect(calls).toEqual(["child", "base", "child", "base"]);
|
|
122
|
+
for (const inst of [constructed, direct]) {
|
|
123
|
+
expect([...inst._yatsp.traits]).toEqual(["CountedChild", "CountedBase"]);
|
|
124
|
+
expect(inst instanceof Base).toBe(true);
|
|
125
|
+
expect(inst instanceof Child).toBe(true);
|
|
126
|
+
}
|
|
127
|
+
expect(constructed._yatsp.traits).not.toBe(direct._yatsp.traits);
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
test("a trait initializer called directly still installs its members", () => {
|
|
131
|
+
// a direct `init` installs onto the receiver's own prototype, since it is not below the constructor's
|
|
132
|
+
z.string();
|
|
133
|
+
|
|
134
|
+
const proto = {};
|
|
135
|
+
const inst = Object.create(proto) as z.YatspString;
|
|
136
|
+
z.YatspString.init(inst, { type: "string" });
|
|
137
|
+
|
|
138
|
+
expect(typeof inst.email).toBe("function");
|
|
139
|
+
expect(typeof inst.optional).toBe("function");
|
|
140
|
+
expect(Object.prototype.hasOwnProperty.call(proto, "email")).toBe(true);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
test("a nested init during a repeat construction still installs its members", () => {
|
|
144
|
+
// the install used to read a module-level flag the outer construction set, so a nested `init` on an unrelated receiver inherited an answer that was not about it
|
|
145
|
+
const seen: string[] = [];
|
|
146
|
+
|
|
147
|
+
// an assertion signature needs the call target explicitly annotated
|
|
148
|
+
const Nested: core.$constructor<any> = core.$constructor<any>("Nested", () => {}, {
|
|
149
|
+
tag() {
|
|
150
|
+
return "nested";
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
const Outer = core.$constructor<any>("Outer", (_inst, def) => {
|
|
154
|
+
if (!def.nest) return;
|
|
155
|
+
// not a plain `{}`: the install target would resolve to `Object.prototype` and leak `tag` into every object the worker touches
|
|
156
|
+
const plain: any = Object.create({});
|
|
157
|
+
Nested.init(plain, {});
|
|
158
|
+
seen.push(typeof plain.tag);
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
new Outer({ nest: false });
|
|
162
|
+
new Outer({ nest: true });
|
|
163
|
+
|
|
164
|
+
expect(seen).toEqual(["function"]);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
test("a derived trait's members win over the ones it composes", () => {
|
|
168
|
+
// Classic installs a richer `~standard` over core's. Trait dedupe is what orders them: core's initializer runs once, at the first `init` that reaches it, so classic's always lands second.
|
|
169
|
+
expect(typeof (z.string()["~standard"] as any).jsonSchema.input).toBe("function");
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
test("a live member keeps the descriptor a prototype member had", () => {
|
|
173
|
+
// An object literal's getter is enumerable; the `defineProperty` it replaced was not. `for..in` over a schema is public surface, and the construction path walks the prototype with it.
|
|
174
|
+
const proto = Object.getPrototypeOf(z.string());
|
|
175
|
+
expect(Object.getOwnPropertyDescriptor(proto, "description")?.enumerable).toBe(false);
|
|
176
|
+
expect(Object.getOwnPropertyDescriptor(proto, "_def")?.enumerable).toBe(false);
|
|
177
|
+
// a derived member installs like a literal's accessor: not enumerable, still configurable
|
|
178
|
+
expect(Object.getOwnPropertyDescriptor(proto, "minLength")).toMatchObject({ enumerable: false, configurable: true });
|
|
179
|
+
|
|
180
|
+
// the derived metadata members live on the prototype and shadow as own data on first read
|
|
181
|
+
const schema = z.string();
|
|
182
|
+
const keys: string[] = [];
|
|
183
|
+
for (const k in schema) keys.push(k);
|
|
184
|
+
expect(keys).toEqual(["def", "type"]);
|
|
185
|
+
expect(schema.minLength).toBe(null);
|
|
186
|
+
expect(Object.keys(schema)).toContain("minLength");
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
test("a live member is not cached per instance", () => {
|
|
190
|
+
const schema = z.string();
|
|
191
|
+
|
|
192
|
+
expect(schema.description).toBe(undefined);
|
|
193
|
+
core.globalRegistry.add(schema, { description: "later" });
|
|
194
|
+
expect(schema.description).toBe("later");
|
|
195
|
+
expect(Object.prototype.hasOwnProperty.call(schema, "description")).toBe(false);
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
test("constructing through a subclass does not strip the base prototype", () => {
|
|
199
|
+
// `super(def)` gives `this` a prototype of `new.target.prototype`, so a constructor can complete a construction without having built its own prototype.
|
|
200
|
+
const MyString: new (def: { type: "string" }) => z.YatspString = class extends (z.YatspString as any) {} as any;
|
|
201
|
+
new MyString({ type: "string" });
|
|
202
|
+
|
|
203
|
+
const plain = z.string();
|
|
204
|
+
expect(plain.parse("x")).toBe("x");
|
|
205
|
+
expect(typeof plain.email).toBe("function");
|
|
206
|
+
expect(typeof new MyString({ type: "string" }).email).toBe("function");
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
test("a subclass's own members survive the install", () => {
|
|
210
|
+
// The members go on the prototype of the constructor that built the instance, so a subclass's own prototype keeps what it declared. `z.symbol()` is constructed nowhere else here, which puts the subclass before its base — the ordering the install has to get right. Asserted rather than assumed, so warming it elsewhere fails the test instead of hollowing it out.
|
|
211
|
+
expect(Object.prototype.hasOwnProperty.call((z.YatspSymbol as any).prototype, "parse")).toBe(false);
|
|
212
|
+
const First = class extends (z.YatspSymbol as any) {
|
|
213
|
+
parse() {
|
|
214
|
+
return "PARSE";
|
|
215
|
+
}
|
|
216
|
+
optional() {
|
|
217
|
+
return "OPTIONAL";
|
|
218
|
+
}
|
|
219
|
+
} as any;
|
|
220
|
+
const first = new First({ type: "symbol" });
|
|
221
|
+
expect(first.parse(Symbol())).toBe("PARSE");
|
|
222
|
+
expect(first.optional()).toBe("OPTIONAL");
|
|
223
|
+
const sym = Symbol();
|
|
224
|
+
expect(z.symbol().parse(sym)).toBe(sym);
|
|
225
|
+
|
|
226
|
+
// and the other way round, with the base prototype already built by one of the `z.number()` calls above. Asserted for the same reason: warm it nowhere and this block quietly becomes a second copy of the cold case.
|
|
227
|
+
expect(Object.prototype.hasOwnProperty.call((z.YatspNumber as any).prototype, "parse")).toBe(true);
|
|
228
|
+
const Second = class extends (z.YatspNumber as any) {
|
|
229
|
+
parse() {
|
|
230
|
+
return "SECOND";
|
|
231
|
+
}
|
|
232
|
+
} as any;
|
|
233
|
+
expect(new Second({ type: "number" }).parse(1)).toBe("SECOND");
|
|
234
|
+
|
|
235
|
+
// two levels deep: neither prototype takes a copy, so the inherited member is one function
|
|
236
|
+
const Third = class extends (Second as any) {} as any;
|
|
237
|
+
new Third({ type: "number" });
|
|
238
|
+
expect(Second.prototype.parse).toBe(Third.prototype.parse);
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
test("a hand-written getter member accepts assignment", () => {
|
|
242
|
+
// Every member was an accessor with a setter before they moved onto `proto`, so a getter written by hand needs one too.
|
|
243
|
+
const schema: any = z.string();
|
|
244
|
+
schema.spa = () => "SPA";
|
|
245
|
+
schema.toJSONSchema = () => "JSON";
|
|
246
|
+
expect(schema.spa()).toBe("SPA");
|
|
247
|
+
expect(schema.toJSONSchema()).toBe("JSON");
|
|
248
|
+
|
|
249
|
+
const mini: any = zm.string();
|
|
250
|
+
mini.with = () => "WITH";
|
|
251
|
+
expect(mini.with()).toBe("WITH");
|
|
252
|
+
|
|
253
|
+
// a derived metadata member accepts assignment before its first read, as it did as an own property
|
|
254
|
+
const derived = z.number().min(2);
|
|
255
|
+
derived.minValue = 99;
|
|
256
|
+
expect(derived.minValue).toBe(99);
|
|
257
|
+
expect(Object.keys(derived)).toContain("minValue");
|
|
258
|
+
|
|
259
|
+
// and, like every prototype member, recomputes after deletion rather than staying absent
|
|
260
|
+
delete (derived as any).minValue;
|
|
261
|
+
expect(derived.minValue).toBe(2);
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
test("shape is lazy and stays out of Object.keys", () => {
|
|
265
|
+
const schema = z.object({ a: z.string() });
|
|
266
|
+
|
|
267
|
+
expect(Object.prototype.hasOwnProperty.call(schema, "shape")).toEqual(false);
|
|
268
|
+
expect("shape" in schema).toEqual(true);
|
|
269
|
+
expect(Object.keys(schema)).not.toContain("shape");
|
|
270
|
+
expect({ ...schema }).not.toHaveProperty("shape");
|
|
271
|
+
|
|
272
|
+
expect(Object.keys(schema.shape)).toEqual(["a"]);
|
|
273
|
+
|
|
274
|
+
// Reading caches a non-enumerable own data property. An own accessor here would put every later object schema into V8 dictionary mode.
|
|
275
|
+
expect(Object.prototype.hasOwnProperty.call(schema, "shape")).toEqual(true);
|
|
276
|
+
expect(Object.getOwnPropertyDescriptor(schema, "shape")).toMatchObject({
|
|
277
|
+
writable: true,
|
|
278
|
+
enumerable: false,
|
|
279
|
+
configurable: true,
|
|
280
|
+
});
|
|
281
|
+
expect(Object.keys(schema)).not.toContain("shape");
|
|
282
|
+
|
|
283
|
+
const mini = zm.object({ a: zm.string() });
|
|
284
|
+
expect(Object.prototype.hasOwnProperty.call(mini, "shape")).toEqual(false);
|
|
285
|
+
expect(Object.keys(mini.shape)).toEqual(["a"]);
|
|
286
|
+
expect(Object.keys(mini)).not.toContain("shape");
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
test("shape accepts repeated assignment and recomputes after deletion", () => {
|
|
290
|
+
const schema: any = z.object({ a: z.string() });
|
|
291
|
+
|
|
292
|
+
schema.shape = { b: z.number() };
|
|
293
|
+
expect(Object.keys(schema.shape)).toEqual(["b"]);
|
|
294
|
+
// The cached property stays writable, so a second assignment does not throw in strict mode.
|
|
295
|
+
schema.shape = { c: z.boolean() };
|
|
296
|
+
expect(Object.keys(schema.shape)).toEqual(["c"]);
|
|
297
|
+
|
|
298
|
+
// Deleting clears the memo rather than removing the property, since the accessor lives on the prototype.
|
|
299
|
+
delete schema.shape;
|
|
300
|
+
expect(Object.keys(schema.shape)).toEqual(["a"]);
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
test("a self-referential shape getter breaks the cycle instead of recursing", () => {
|
|
304
|
+
const Self: any = z.object({
|
|
305
|
+
a: z.string(),
|
|
306
|
+
get b() {
|
|
307
|
+
return z.array(z.object(Self.shape));
|
|
308
|
+
},
|
|
309
|
+
});
|
|
310
|
+
expect(Object.keys(Self.shape)).toEqual(["a", "b"]);
|
|
311
|
+
|
|
312
|
+
const Mini: any = zm.object({
|
|
313
|
+
a: zm.string(),
|
|
314
|
+
get b() {
|
|
315
|
+
return zm.array(zm.object(Mini.shape));
|
|
316
|
+
},
|
|
317
|
+
});
|
|
318
|
+
expect(Object.keys(Mini.shape)).toEqual(["a", "b"]);
|
|
319
|
+
});
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { expect, expectTypeOf, test } from "vitest";
|
|
2
|
+
import * as z from "yatsp/v4";
|
|
3
|
+
|
|
4
|
+
test("instanceof", async () => {
|
|
5
|
+
class Test {}
|
|
6
|
+
class Subtest extends Test {}
|
|
7
|
+
abstract class AbstractBar {
|
|
8
|
+
constructor(public val: string) {}
|
|
9
|
+
}
|
|
10
|
+
class Bar extends AbstractBar {}
|
|
11
|
+
|
|
12
|
+
const TestSchema = z.instanceof(Test);
|
|
13
|
+
const SubtestSchema = z.instanceof(Subtest);
|
|
14
|
+
const AbstractSchema = z.instanceof(AbstractBar);
|
|
15
|
+
const BarSchema = z.instanceof(Bar);
|
|
16
|
+
|
|
17
|
+
TestSchema.parse(new Test());
|
|
18
|
+
TestSchema.parse(new Subtest());
|
|
19
|
+
SubtestSchema.parse(new Subtest());
|
|
20
|
+
AbstractSchema.parse(new Bar("asdf"));
|
|
21
|
+
const bar = BarSchema.parse(new Bar("asdf"));
|
|
22
|
+
expect(bar.val).toEqual("asdf");
|
|
23
|
+
|
|
24
|
+
await expect(() => SubtestSchema.parse(new Test())).toThrow();
|
|
25
|
+
await expect(() => TestSchema.parse(12)).toThrow();
|
|
26
|
+
|
|
27
|
+
expectTypeOf<Test>().toEqualTypeOf<z.infer<typeof TestSchema>>();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test("instanceof fatal", () => {
|
|
31
|
+
const schema = z.instanceof(Date).refine((d) => d.toString());
|
|
32
|
+
const res = schema.safeParse(null);
|
|
33
|
+
expect(res.success).toBe(false);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test("instanceof respects customError", () => {
|
|
37
|
+
class Test {
|
|
38
|
+
name!: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
z.config({
|
|
42
|
+
customError: () => {
|
|
43
|
+
return "This is invalid!";
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
const TestSchema = z.instanceof(Test);
|
|
48
|
+
const result = TestSchema.safeParse("whatever");
|
|
49
|
+
expect(result.success).toBe(false);
|
|
50
|
+
if (!result.success) {
|
|
51
|
+
const issue = result.error.issues[0];
|
|
52
|
+
expect(issue.code).toBe("invalid_type");
|
|
53
|
+
if (issue.code === "invalid_type") {
|
|
54
|
+
expect(issue.expected).toBe("Test");
|
|
55
|
+
}
|
|
56
|
+
expect(issue.message).toBe("This is invalid!");
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
z.config({ customError: undefined });
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
test("z.properties", () => {
|
|
63
|
+
const httpsUrl = z.instanceof(URL).check(
|
|
64
|
+
...z.properties({
|
|
65
|
+
protocol: z.literal("https:"),
|
|
66
|
+
hostname: z.string().regex(z.regexes.domain),
|
|
67
|
+
})
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
expectTypeOf<URL>().toEqualTypeOf<z.infer<typeof httpsUrl>>();
|
|
71
|
+
expect(httpsUrl.safeParse(new URL("https://example.com")).success).toBe(true);
|
|
72
|
+
|
|
73
|
+
// One check iterates the whole shape, so every failing property reports — unlike the equivalent chain of z.property() calls, which aborts on the first.
|
|
74
|
+
const both = httpsUrl.safeParse(new URL("http://localhost"));
|
|
75
|
+
expect(both.error!.issues.map((i) => i.path)).toEqual([["protocol"], ["hostname"]]);
|
|
76
|
+
|
|
77
|
+
// A failing base schema yields its own issue and no property issues.
|
|
78
|
+
for (const input of ["not a url", null]) {
|
|
79
|
+
const issues = httpsUrl.safeParse(input).error!.issues;
|
|
80
|
+
expect(issues.map((i) => [i.code, i.path])).toEqual([["custom", []]]);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Not specific to z.instanceof(). A base whose type mismatch aborts implicitly rather than explicitly must still not run the property checks against the rejected value.
|
|
84
|
+
const obj = z
|
|
85
|
+
.object({ a: z.string(), b: z.string() })
|
|
86
|
+
.check(...z.properties({ a: z.literal("x"), b: z.literal("y") }));
|
|
87
|
+
expect(obj.safeParse({ a: "x", b: "y" }).success).toBe(true);
|
|
88
|
+
expect(obj.safeParse({ a: "!", b: "!" }).error!.issues.map((i) => i.path)).toEqual([["a"], ["b"]]);
|
|
89
|
+
for (const input of [null, undefined, 5]) {
|
|
90
|
+
expect(obj.safeParse(input).error!.issues.map((i) => [i.code, i.path])).toEqual([["invalid_type", []]]);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Known looseness versus the longhand, pinned so it stays deliberate: the check is typed over the whole shape, and `$YatspCheckInternals.check()` is a method, so TypeScript compares it bivariantly and accepts a check type that is a subtype of the target. Naming a key the target lacks therefore compiles here and fails at parse time, where the equivalent chain of `z.property()` calls rejects it outright.
|
|
94
|
+
z.object({ a: z.string() }).check(...z.properties({ a: z.literal("x"), b: z.literal("y") }));
|
|
95
|
+
expect(
|
|
96
|
+
z
|
|
97
|
+
.object({ a: z.string() })
|
|
98
|
+
.check(...z.properties({ a: z.string(), b: z.literal("y") }))
|
|
99
|
+
.safeParse({ a: "ok" })
|
|
100
|
+
.error!.issues.map((i) => [i.code, i.path])
|
|
101
|
+
).toEqual([["invalid_value", ["b"]]]);
|
|
102
|
+
|
|
103
|
+
// literal and enum inputs widen to their primitive, so a `string`/`boolean` property accepts them without a cast, while a genuine type mismatch or an unknown key still fails to compile
|
|
104
|
+
z.instanceof(URL).check(z.property("protocol", z.literal("https:")));
|
|
105
|
+
z.instanceof(Request).check(...z.properties({ method: z.enum(["POST", "PUT"]), bodyUsed: z.literal(false) }));
|
|
106
|
+
// @ts-expect-error length is a number
|
|
107
|
+
z.string().check(z.property("length", z.string()));
|
|
108
|
+
// @ts-expect-error no such key
|
|
109
|
+
z.instanceof(URL).check(z.property("nope", z.string()));
|
|
110
|
+
|
|
111
|
+
// the check feeds the property value into its schema, so it is typed over the input side rather than the output
|
|
112
|
+
const stringToLength = z.property(
|
|
113
|
+
"a",
|
|
114
|
+
z.string().transform((s) => s.length)
|
|
115
|
+
);
|
|
116
|
+
z.object({ a: z.string() }).check(stringToLength);
|
|
117
|
+
// @ts-expect-error a is a number, the schema takes a string
|
|
118
|
+
z.object({ a: z.number() }).check(stringToLength);
|
|
119
|
+
|
|
120
|
+
// The properties check carries no `when`, so the schema stays on the compiled fast path.
|
|
121
|
+
const compiled = z.compile(httpsUrl);
|
|
122
|
+
expect(compiled.safeParse(new URL("https://example.com")).success).toBe(true);
|
|
123
|
+
expect(compiled.safeParse(new URL("http://localhost")).error!.issues.map((i) => i.path)).toEqual([
|
|
124
|
+
["protocol"],
|
|
125
|
+
["hostname"],
|
|
126
|
+
]);
|
|
127
|
+
});
|