zod 3.26.0-canary.20250703T013930 → 3.26.0-canary.20250703T025502
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/package.json +20 -20
- package/src/index.ts +4 -0
- package/src/v3/ZodError.ts +330 -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 +56 -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 +551 -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 +257 -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 +110 -0
- package/src/v3/tests/language-server.source.ts +76 -0
- package/src/v3/tests/language-server.test.ts +207 -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 +21 -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 +434 -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 +194 -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 +916 -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 +5136 -0
- package/src/v4/classic/checks.ts +30 -0
- package/src/v4/classic/coerce.ts +27 -0
- package/src/v4/classic/compat.ts +66 -0
- package/src/v4/classic/errors.ts +75 -0
- package/src/v4/classic/external.ts +50 -0
- package/src/v4/classic/index.ts +5 -0
- package/src/v4/classic/iso.ts +90 -0
- package/src/v4/classic/parse.ts +33 -0
- package/src/v4/classic/schemas.ts +2055 -0
- package/src/v4/classic/tests/anyunknown.test.ts +26 -0
- package/src/v4/classic/tests/array.test.ts +264 -0
- package/src/v4/classic/tests/assignability.test.ts +210 -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 +54 -0
- package/src/v4/classic/tests/brand.test.ts +65 -0
- package/src/v4/classic/tests/catch.test.ts +252 -0
- package/src/v4/classic/tests/coalesce.test.ts +20 -0
- package/src/v4/classic/tests/coerce.test.ts +160 -0
- package/src/v4/classic/tests/continuability.test.ts +352 -0
- package/src/v4/classic/tests/custom.test.ts +40 -0
- package/src/v4/classic/tests/date.test.ts +31 -0
- package/src/v4/classic/tests/datetime.test.ts +296 -0
- package/src/v4/classic/tests/default.test.ts +313 -0
- package/src/v4/classic/tests/description.test.ts +32 -0
- package/src/v4/classic/tests/discriminated-unions.test.ts +592 -0
- package/src/v4/classic/tests/enum.test.ts +285 -0
- package/src/v4/classic/tests/error-utils.test.ts +527 -0
- package/src/v4/classic/tests/error.test.ts +711 -0
- package/src/v4/classic/tests/file.test.ts +91 -0
- package/src/v4/classic/tests/firstparty.test.ts +175 -0
- package/src/v4/classic/tests/function.test.ts +268 -0
- package/src/v4/classic/tests/generics.test.ts +72 -0
- package/src/v4/classic/tests/index.test.ts +829 -0
- package/src/v4/classic/tests/instanceof.test.ts +34 -0
- package/src/v4/classic/tests/intersection.test.ts +171 -0
- package/src/v4/classic/tests/json.test.ts +108 -0
- package/src/v4/classic/tests/lazy.test.ts +227 -0
- package/src/v4/classic/tests/literal.test.ts +92 -0
- package/src/v4/classic/tests/map.test.ts +196 -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 +86 -0
- package/src/v4/classic/tests/nullable.test.ts +22 -0
- package/src/v4/classic/tests/number.test.ts +247 -0
- package/src/v4/classic/tests/object.test.ts +553 -0
- package/src/v4/classic/tests/optional.test.ts +103 -0
- package/src/v4/classic/tests/partial.test.ts +147 -0
- package/src/v4/classic/tests/pickomit.test.ts +127 -0
- package/src/v4/classic/tests/pipe.test.ts +81 -0
- package/src/v4/classic/tests/prefault.test.ts +37 -0
- package/src/v4/classic/tests/preprocess.test.ts +298 -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/prototypes.test.ts +23 -0
- package/src/v4/classic/tests/readonly.test.ts +252 -0
- package/src/v4/classic/tests/record.test.ts +332 -0
- package/src/v4/classic/tests/recursive-types.test.ts +325 -0
- package/src/v4/classic/tests/refine.test.ts +423 -0
- package/src/v4/classic/tests/registries.test.ts +195 -0
- package/src/v4/classic/tests/set.test.ts +179 -0
- package/src/v4/classic/tests/standard-schema.test.ts +57 -0
- package/src/v4/classic/tests/string-formats.test.ts +109 -0
- package/src/v4/classic/tests/string.test.ts +881 -0
- package/src/v4/classic/tests/stringbool.test.ts +66 -0
- package/src/v4/classic/tests/template-literal.test.ts +758 -0
- package/src/v4/classic/tests/to-json-schema.test.ts +2182 -0
- package/src/v4/classic/tests/transform.test.ts +250 -0
- package/src/v4/classic/tests/tuple.test.ts +163 -0
- package/src/v4/classic/tests/union.test.ts +94 -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 +1592 -0
- package/src/v4/core/checks.ts +1285 -0
- package/src/v4/core/config.ts +15 -0
- package/src/v4/core/core.ts +134 -0
- package/src/v4/core/doc.ts +44 -0
- package/src/v4/core/errors.ts +420 -0
- package/src/v4/core/function.ts +176 -0
- package/src/v4/core/index.ts +15 -0
- package/src/v4/core/json-schema.ts +143 -0
- package/src/v4/core/parse.ts +94 -0
- package/src/v4/core/regexes.ts +135 -0
- package/src/v4/core/registries.ts +86 -0
- package/src/v4/core/schemas.ts +3781 -0
- package/src/v4/core/standard-schema.ts +64 -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/en.test.ts +22 -0
- package/src/v4/core/tests/locales/ru.test.ts +128 -0
- package/src/v4/core/tests/locales/tr.test.ts +69 -0
- package/src/v4/core/to-json-schema.ts +944 -0
- package/src/v4/core/util.ts +775 -0
- package/src/v4/core/versions.ts +5 -0
- package/src/v4/core/zsf.ts +323 -0
- package/src/v4/index.ts +4 -0
- package/src/v4/locales/ar.ts +125 -0
- package/src/v4/locales/az.ts +121 -0
- package/src/v4/locales/be.ts +184 -0
- package/src/v4/locales/ca.ts +127 -0
- package/src/v4/locales/cs.ts +142 -0
- package/src/v4/locales/de.ts +124 -0
- package/src/v4/locales/en.ts +127 -0
- package/src/v4/locales/es.ts +125 -0
- package/src/v4/locales/fa.ts +134 -0
- package/src/v4/locales/fi.ts +131 -0
- package/src/v4/locales/fr-CA.ts +126 -0
- package/src/v4/locales/fr.ts +124 -0
- package/src/v4/locales/he.ts +125 -0
- package/src/v4/locales/hu.ts +126 -0
- package/src/v4/locales/id.ts +125 -0
- package/src/v4/locales/index.ts +38 -0
- package/src/v4/locales/it.ts +125 -0
- package/src/v4/locales/ja.ts +122 -0
- package/src/v4/locales/kh.ts +126 -0
- package/src/v4/locales/ko.ts +131 -0
- package/src/v4/locales/mk.ts +127 -0
- package/src/v4/locales/ms.ts +124 -0
- package/src/v4/locales/nl.ts +126 -0
- package/src/v4/locales/no.ts +124 -0
- package/src/v4/locales/ota.ts +125 -0
- package/src/v4/locales/pl.ts +126 -0
- package/src/v4/locales/ps.ts +133 -0
- package/src/v4/locales/pt.ts +123 -0
- package/src/v4/locales/ru.ts +184 -0
- package/src/v4/locales/sl.ts +126 -0
- package/src/v4/locales/sv.ts +127 -0
- package/src/v4/locales/ta.ts +125 -0
- package/src/v4/locales/th.ts +126 -0
- package/src/v4/locales/tr.ts +121 -0
- package/src/v4/locales/ua.ts +126 -0
- package/src/v4/locales/ur.ts +126 -0
- package/src/v4/locales/vi.ts +125 -0
- package/src/v4/locales/zh-CN.ts +123 -0
- package/src/v4/locales/zh-TW.ts +125 -0
- package/src/v4/mini/checks.ts +32 -0
- package/src/v4/mini/coerce.ts +22 -0
- package/src/v4/mini/external.ts +40 -0
- package/src/v4/mini/index.ts +3 -0
- package/src/v4/mini/iso.ts +62 -0
- package/src/v4/mini/parse.ts +1 -0
- package/src/v4/mini/schemas.ts +1579 -0
- package/src/v4/mini/tests/assignability.test.ts +129 -0
- package/src/v4/mini/tests/brand.test.ts +51 -0
- package/src/v4/mini/tests/checks.test.ts +144 -0
- package/src/v4/mini/tests/computed.test.ts +36 -0
- package/src/v4/mini/tests/error.test.ts +22 -0
- package/src/v4/mini/tests/functions.test.ts +43 -0
- package/src/v4/mini/tests/index.test.ts +871 -0
- package/src/v4/mini/tests/number.test.ts +95 -0
- package/src/v4/mini/tests/object.test.ts +185 -0
- package/src/v4/mini/tests/prototypes.test.ts +43 -0
- package/src/v4/mini/tests/recursive-types.test.ts +275 -0
- package/src/v4/mini/tests/string.test.ts +293 -0
- package/src/v4-mini/index.ts +1 -0
- package/v4/classic/compat.cjs +1 -7
- package/v4/classic/compat.d.cts +0 -2
- package/v4/classic/compat.d.ts +0 -2
- package/v4/classic/compat.js +0 -6
- package/v4/classic/external.cjs +2 -1
- package/v4/classic/external.d.cts +1 -1
- package/v4/classic/external.d.ts +1 -1
- package/v4/classic/external.js +1 -1
- package/v4/classic/schemas.d.cts +4 -4
- package/v4/classic/schemas.d.ts +4 -4
- package/v4/core/api.cjs +11 -10
- package/v4/core/api.js +11 -10
- package/v4/core/checks.cjs +6 -4
- package/v4/core/checks.js +6 -4
- package/v4/core/core.cjs +5 -1
- package/v4/core/core.d.cts +2 -0
- package/v4/core/core.d.ts +2 -0
- package/v4/core/core.js +4 -0
- package/v4/core/schemas.cjs +12 -13
- package/v4/core/schemas.js +12 -13
- package/v4/core/util.cjs +3 -0
- package/v4/core/util.d.cts +1 -1
- package/v4/core/util.d.ts +1 -1
- package/v4/core/util.js +3 -0
- package/v4/mini/external.cjs +2 -1
- package/v4/mini/external.d.cts +1 -1
- package/v4/mini/external.d.ts +1 -1
- package/v4/mini/external.js +1 -1
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import Benchmark from "benchmark";
|
|
2
|
+
|
|
3
|
+
import { z } from "zod/v3";
|
|
4
|
+
|
|
5
|
+
const emptySuite = new Benchmark.Suite("z.object: empty");
|
|
6
|
+
const shortSuite = new Benchmark.Suite("z.object: short");
|
|
7
|
+
const longSuite = new Benchmark.Suite("z.object: long");
|
|
8
|
+
|
|
9
|
+
const empty = z.object({});
|
|
10
|
+
const short = z.object({
|
|
11
|
+
string: z.string(),
|
|
12
|
+
});
|
|
13
|
+
const long = z.object({
|
|
14
|
+
string: z.string(),
|
|
15
|
+
number: z.number(),
|
|
16
|
+
boolean: z.boolean(),
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
emptySuite
|
|
20
|
+
.add("valid", () => {
|
|
21
|
+
empty.parse({});
|
|
22
|
+
})
|
|
23
|
+
.add("valid: extra keys", () => {
|
|
24
|
+
empty.parse({ string: "string" });
|
|
25
|
+
})
|
|
26
|
+
.add("invalid: null", () => {
|
|
27
|
+
try {
|
|
28
|
+
empty.parse(null);
|
|
29
|
+
} catch (_err) {}
|
|
30
|
+
})
|
|
31
|
+
.on("cycle", (e: Benchmark.Event) => {
|
|
32
|
+
console.log(`${(emptySuite as any).name}: ${e.target}`);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
shortSuite
|
|
36
|
+
.add("valid", () => {
|
|
37
|
+
short.parse({ string: "string" });
|
|
38
|
+
})
|
|
39
|
+
.add("valid: extra keys", () => {
|
|
40
|
+
short.parse({ string: "string", number: 42 });
|
|
41
|
+
})
|
|
42
|
+
.add("invalid: null", () => {
|
|
43
|
+
try {
|
|
44
|
+
short.parse(null);
|
|
45
|
+
} catch (_err) {}
|
|
46
|
+
})
|
|
47
|
+
.on("cycle", (e: Benchmark.Event) => {
|
|
48
|
+
console.log(`${(shortSuite as any).name}: ${e.target}`);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
longSuite
|
|
52
|
+
.add("valid", () => {
|
|
53
|
+
long.parse({ string: "string", number: 42, boolean: true });
|
|
54
|
+
})
|
|
55
|
+
.add("valid: extra keys", () => {
|
|
56
|
+
long.parse({ string: "string", number: 42, boolean: true, list: [] });
|
|
57
|
+
})
|
|
58
|
+
.add("invalid: null", () => {
|
|
59
|
+
try {
|
|
60
|
+
long.parse(null);
|
|
61
|
+
} catch (_err) {}
|
|
62
|
+
})
|
|
63
|
+
.on("cycle", (e: Benchmark.Event) => {
|
|
64
|
+
console.log(`${(longSuite as any).name}: ${e.target}`);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
export default {
|
|
68
|
+
suites: [emptySuite, shortSuite, longSuite],
|
|
69
|
+
};
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import Benchmark from "benchmark";
|
|
2
|
+
|
|
3
|
+
import { z } from "zod/v3";
|
|
4
|
+
import { Mocker } from "../tests/Mocker.js";
|
|
5
|
+
|
|
6
|
+
const val = new Mocker();
|
|
7
|
+
|
|
8
|
+
const enumSuite = new Benchmark.Suite("z.enum");
|
|
9
|
+
const enumSchema = z.enum(["a", "b", "c"]);
|
|
10
|
+
|
|
11
|
+
enumSuite
|
|
12
|
+
.add("valid", () => {
|
|
13
|
+
enumSchema.parse("a");
|
|
14
|
+
})
|
|
15
|
+
.add("invalid", () => {
|
|
16
|
+
try {
|
|
17
|
+
enumSchema.parse("x");
|
|
18
|
+
} catch (_e: any) {}
|
|
19
|
+
})
|
|
20
|
+
.on("cycle", (e: Benchmark.Event) => {
|
|
21
|
+
console.log(`z.enum: ${e.target}`);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const longEnumSuite = new Benchmark.Suite("long z.enum");
|
|
25
|
+
const longEnumSchema = z.enum([
|
|
26
|
+
"one",
|
|
27
|
+
"two",
|
|
28
|
+
"three",
|
|
29
|
+
"four",
|
|
30
|
+
"five",
|
|
31
|
+
"six",
|
|
32
|
+
"seven",
|
|
33
|
+
"eight",
|
|
34
|
+
"nine",
|
|
35
|
+
"ten",
|
|
36
|
+
"eleven",
|
|
37
|
+
"twelve",
|
|
38
|
+
"thirteen",
|
|
39
|
+
"fourteen",
|
|
40
|
+
"fifteen",
|
|
41
|
+
"sixteen",
|
|
42
|
+
"seventeen",
|
|
43
|
+
]);
|
|
44
|
+
|
|
45
|
+
longEnumSuite
|
|
46
|
+
.add("valid", () => {
|
|
47
|
+
longEnumSchema.parse("five");
|
|
48
|
+
})
|
|
49
|
+
.add("invalid", () => {
|
|
50
|
+
try {
|
|
51
|
+
longEnumSchema.parse("invalid");
|
|
52
|
+
} catch (_e: any) {}
|
|
53
|
+
})
|
|
54
|
+
.on("cycle", (e: Benchmark.Event) => {
|
|
55
|
+
console.log(`long z.enum: ${e.target}`);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
const undefinedSuite = new Benchmark.Suite("z.undefined");
|
|
59
|
+
const undefinedSchema = z.undefined();
|
|
60
|
+
|
|
61
|
+
undefinedSuite
|
|
62
|
+
.add("valid", () => {
|
|
63
|
+
undefinedSchema.parse(undefined);
|
|
64
|
+
})
|
|
65
|
+
.add("invalid", () => {
|
|
66
|
+
try {
|
|
67
|
+
undefinedSchema.parse(1);
|
|
68
|
+
} catch (_e: any) {}
|
|
69
|
+
})
|
|
70
|
+
.on("cycle", (e: Benchmark.Event) => {
|
|
71
|
+
console.log(`z.undefined: ${e.target}`);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
const literalSuite = new Benchmark.Suite("z.literal");
|
|
75
|
+
const short = "short";
|
|
76
|
+
const bad = "bad";
|
|
77
|
+
const literalSchema = z.literal("short");
|
|
78
|
+
|
|
79
|
+
literalSuite
|
|
80
|
+
.add("valid", () => {
|
|
81
|
+
literalSchema.parse(short);
|
|
82
|
+
})
|
|
83
|
+
.add("invalid", () => {
|
|
84
|
+
try {
|
|
85
|
+
literalSchema.parse(bad);
|
|
86
|
+
} catch (_e: any) {}
|
|
87
|
+
})
|
|
88
|
+
.on("cycle", (e: Benchmark.Event) => {
|
|
89
|
+
console.log(`z.literal: ${e.target}`);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
const numberSuite = new Benchmark.Suite("z.number");
|
|
93
|
+
const numberSchema = z.number().int();
|
|
94
|
+
|
|
95
|
+
numberSuite
|
|
96
|
+
.add("valid", () => {
|
|
97
|
+
numberSchema.parse(1);
|
|
98
|
+
})
|
|
99
|
+
.add("invalid type", () => {
|
|
100
|
+
try {
|
|
101
|
+
numberSchema.parse("bad");
|
|
102
|
+
} catch (_e: any) {}
|
|
103
|
+
})
|
|
104
|
+
.add("invalid number", () => {
|
|
105
|
+
try {
|
|
106
|
+
numberSchema.parse(0.5);
|
|
107
|
+
} catch (_e: any) {}
|
|
108
|
+
})
|
|
109
|
+
.on("cycle", (e: Benchmark.Event) => {
|
|
110
|
+
console.log(`z.number: ${e.target}`);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
const dateSuite = new Benchmark.Suite("z.date");
|
|
114
|
+
|
|
115
|
+
const plainDate = z.date();
|
|
116
|
+
const minMaxDate = z.date().min(new Date("2021-01-01")).max(new Date("2030-01-01"));
|
|
117
|
+
|
|
118
|
+
dateSuite
|
|
119
|
+
.add("valid", () => {
|
|
120
|
+
plainDate.parse(new Date());
|
|
121
|
+
})
|
|
122
|
+
.add("invalid", () => {
|
|
123
|
+
try {
|
|
124
|
+
plainDate.parse(1);
|
|
125
|
+
} catch (_e: any) {}
|
|
126
|
+
})
|
|
127
|
+
.add("valid min and max", () => {
|
|
128
|
+
minMaxDate.parse(new Date("2023-01-01"));
|
|
129
|
+
})
|
|
130
|
+
.add("invalid min", () => {
|
|
131
|
+
try {
|
|
132
|
+
minMaxDate.parse(new Date("2019-01-01"));
|
|
133
|
+
} catch (_e: any) {}
|
|
134
|
+
})
|
|
135
|
+
.add("invalid max", () => {
|
|
136
|
+
try {
|
|
137
|
+
minMaxDate.parse(new Date("2031-01-01"));
|
|
138
|
+
} catch (_e: any) {}
|
|
139
|
+
})
|
|
140
|
+
.on("cycle", (e: Benchmark.Event) => {
|
|
141
|
+
console.log(`z.date: ${e.target}`);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
const symbolSuite = new Benchmark.Suite("z.symbol");
|
|
145
|
+
const symbolSchema = z.symbol();
|
|
146
|
+
|
|
147
|
+
symbolSuite
|
|
148
|
+
.add("valid", () => {
|
|
149
|
+
symbolSchema.parse(val.symbol);
|
|
150
|
+
})
|
|
151
|
+
.add("invalid", () => {
|
|
152
|
+
try {
|
|
153
|
+
symbolSchema.parse(1);
|
|
154
|
+
} catch (_e: any) {}
|
|
155
|
+
})
|
|
156
|
+
.on("cycle", (e: Benchmark.Event) => {
|
|
157
|
+
console.log(`z.symbol: ${e.target}`);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
export default {
|
|
161
|
+
suites: [enumSuite, longEnumSuite, undefinedSuite, literalSuite, numberSuite, dateSuite, symbolSuite],
|
|
162
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import Benchmark from "benchmark";
|
|
2
|
+
|
|
3
|
+
import { z } from "zod/v3";
|
|
4
|
+
|
|
5
|
+
const shortSuite = new Benchmark.Suite("realworld");
|
|
6
|
+
|
|
7
|
+
const People = z.array(
|
|
8
|
+
z.object({
|
|
9
|
+
type: z.literal("person"),
|
|
10
|
+
hair: z.enum(["blue", "brown"]),
|
|
11
|
+
active: z.boolean(),
|
|
12
|
+
name: z.string(),
|
|
13
|
+
age: z.number().int(),
|
|
14
|
+
hobbies: z.array(z.string()),
|
|
15
|
+
address: z.object({
|
|
16
|
+
street: z.string(),
|
|
17
|
+
zip: z.string(),
|
|
18
|
+
country: z.string(),
|
|
19
|
+
}),
|
|
20
|
+
})
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
let i = 0;
|
|
24
|
+
|
|
25
|
+
function num() {
|
|
26
|
+
return ++i;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function str() {
|
|
30
|
+
return (++i % 100).toString(16);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function array<T>(fn: () => T): T[] {
|
|
34
|
+
return Array.from({ length: ++i % 10 }, () => fn());
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const people = Array.from({ length: 100 }, () => {
|
|
38
|
+
return {
|
|
39
|
+
type: "person",
|
|
40
|
+
hair: i % 2 ? "blue" : "brown",
|
|
41
|
+
active: !!(i % 2),
|
|
42
|
+
name: str(),
|
|
43
|
+
age: num(),
|
|
44
|
+
hobbies: array(str),
|
|
45
|
+
address: {
|
|
46
|
+
street: str(),
|
|
47
|
+
zip: str(),
|
|
48
|
+
country: str(),
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
shortSuite
|
|
54
|
+
.add("valid", () => {
|
|
55
|
+
People.parse(people);
|
|
56
|
+
})
|
|
57
|
+
.on("cycle", (e: Benchmark.Event) => {
|
|
58
|
+
console.log(`${(shortSuite as any).name}: ${e.target}`);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
export default {
|
|
62
|
+
suites: [shortSuite],
|
|
63
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import Benchmark from "benchmark";
|
|
2
|
+
|
|
3
|
+
import { z } from "zod/v3";
|
|
4
|
+
|
|
5
|
+
const SUITE_NAME = "z.string";
|
|
6
|
+
const suite = new Benchmark.Suite(SUITE_NAME);
|
|
7
|
+
|
|
8
|
+
const empty = "";
|
|
9
|
+
const short = "short";
|
|
10
|
+
const long = "long".repeat(256);
|
|
11
|
+
const manual = (str: unknown) => {
|
|
12
|
+
if (typeof str !== "string") {
|
|
13
|
+
throw new Error("Not a string");
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return str;
|
|
17
|
+
};
|
|
18
|
+
const stringSchema = z.string();
|
|
19
|
+
const optionalStringSchema = z.string().optional();
|
|
20
|
+
const optionalNullableStringSchema = z.string().optional().nullable();
|
|
21
|
+
|
|
22
|
+
suite
|
|
23
|
+
.add("empty string", () => {
|
|
24
|
+
stringSchema.parse(empty);
|
|
25
|
+
})
|
|
26
|
+
.add("short string", () => {
|
|
27
|
+
stringSchema.parse(short);
|
|
28
|
+
})
|
|
29
|
+
.add("long string", () => {
|
|
30
|
+
stringSchema.parse(long);
|
|
31
|
+
})
|
|
32
|
+
.add("optional string", () => {
|
|
33
|
+
optionalStringSchema.parse(long);
|
|
34
|
+
})
|
|
35
|
+
.add("nullable string", () => {
|
|
36
|
+
optionalNullableStringSchema.parse(long);
|
|
37
|
+
})
|
|
38
|
+
.add("nullable (null) string", () => {
|
|
39
|
+
optionalNullableStringSchema.parse(null);
|
|
40
|
+
})
|
|
41
|
+
.add("invalid: null", () => {
|
|
42
|
+
try {
|
|
43
|
+
stringSchema.parse(null);
|
|
44
|
+
} catch (_err) {}
|
|
45
|
+
})
|
|
46
|
+
.add("manual parser: long", () => {
|
|
47
|
+
manual(long);
|
|
48
|
+
})
|
|
49
|
+
.on("cycle", (e: Benchmark.Event) => {
|
|
50
|
+
console.log(`${SUITE_NAME}: ${e.target}`);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
export default {
|
|
54
|
+
suites: [suite],
|
|
55
|
+
};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import Benchmark from "benchmark";
|
|
2
|
+
|
|
3
|
+
import { z } from "zod/v3";
|
|
4
|
+
|
|
5
|
+
const doubleSuite = new Benchmark.Suite("z.union: double");
|
|
6
|
+
const manySuite = new Benchmark.Suite("z.union: 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.union([aSchema, bSchema]);
|
|
34
|
+
const many = z.union([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
|
+
};
|
package/src/v3/errors.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ZodErrorMap } from "./ZodError.js";
|
|
2
|
+
import defaultErrorMap from "./locales/en.js";
|
|
3
|
+
|
|
4
|
+
let overrideErrorMap = defaultErrorMap;
|
|
5
|
+
export { defaultErrorMap };
|
|
6
|
+
|
|
7
|
+
export function setErrorMap(map: ZodErrorMap) {
|
|
8
|
+
overrideErrorMap = map;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function getErrorMap() {
|
|
12
|
+
return overrideErrorMap;
|
|
13
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export namespace enumUtil {
|
|
2
|
+
type UnionToIntersectionFn<T> = (T extends unknown ? (k: () => T) => void : never) extends (
|
|
3
|
+
k: infer Intersection
|
|
4
|
+
) => void
|
|
5
|
+
? Intersection
|
|
6
|
+
: never;
|
|
7
|
+
|
|
8
|
+
type GetUnionLast<T> = UnionToIntersectionFn<T> extends () => infer Last ? Last : never;
|
|
9
|
+
|
|
10
|
+
type UnionToTuple<T, Tuple extends unknown[] = []> = [T] extends [never]
|
|
11
|
+
? Tuple
|
|
12
|
+
: UnionToTuple<Exclude<T, GetUnionLast<T>>, [GetUnionLast<T>, ...Tuple]>;
|
|
13
|
+
|
|
14
|
+
type CastToStringTuple<T> = T extends [string, ...string[]] ? T : never;
|
|
15
|
+
|
|
16
|
+
export type UnionToTupleString<T> = CastToStringTuple<UnionToTuple<T>>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export namespace errorUtil {
|
|
2
|
+
export type ErrMessage = string | { message?: string | undefined };
|
|
3
|
+
export const errToObj = (message?: ErrMessage): { message?: string | undefined } =>
|
|
4
|
+
typeof message === "string" ? { message } : message || {};
|
|
5
|
+
// biome-ignore lint:
|
|
6
|
+
export const toString = (message?: ErrMessage): string | undefined =>
|
|
7
|
+
typeof message === "string" ? message : message?.message;
|
|
8
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import type { IssueData, ZodErrorMap, ZodIssue } from "../ZodError.js";
|
|
2
|
+
import { getErrorMap } from "../errors.js";
|
|
3
|
+
import defaultErrorMap from "../locales/en.js";
|
|
4
|
+
import type { ZodParsedType } from "./util.js";
|
|
5
|
+
|
|
6
|
+
export const makeIssue = (params: {
|
|
7
|
+
data: any;
|
|
8
|
+
path: (string | number)[];
|
|
9
|
+
errorMaps: ZodErrorMap[];
|
|
10
|
+
issueData: IssueData;
|
|
11
|
+
}): ZodIssue => {
|
|
12
|
+
const { data, path, errorMaps, issueData } = params;
|
|
13
|
+
const fullPath = [...path, ...(issueData.path || [])];
|
|
14
|
+
const fullIssue = {
|
|
15
|
+
...issueData,
|
|
16
|
+
path: fullPath,
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
if (issueData.message !== undefined) {
|
|
20
|
+
return {
|
|
21
|
+
...issueData,
|
|
22
|
+
path: fullPath,
|
|
23
|
+
message: issueData.message,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
let errorMessage = "";
|
|
28
|
+
const maps = errorMaps
|
|
29
|
+
.filter((m) => !!m)
|
|
30
|
+
.slice()
|
|
31
|
+
.reverse();
|
|
32
|
+
for (const map of maps) {
|
|
33
|
+
errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
...issueData,
|
|
38
|
+
path: fullPath,
|
|
39
|
+
message: errorMessage,
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export type ParseParams = {
|
|
44
|
+
path: (string | number)[];
|
|
45
|
+
errorMap: ZodErrorMap;
|
|
46
|
+
async: boolean;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export type ParsePathComponent = string | number;
|
|
50
|
+
export type ParsePath = ParsePathComponent[];
|
|
51
|
+
export const EMPTY_PATH: ParsePath = [];
|
|
52
|
+
|
|
53
|
+
export interface ParseContext {
|
|
54
|
+
readonly common: {
|
|
55
|
+
readonly issues: ZodIssue[];
|
|
56
|
+
readonly contextualErrorMap?: ZodErrorMap | undefined;
|
|
57
|
+
readonly async: boolean;
|
|
58
|
+
};
|
|
59
|
+
readonly path: ParsePath;
|
|
60
|
+
readonly schemaErrorMap?: ZodErrorMap | undefined;
|
|
61
|
+
readonly parent: ParseContext | null;
|
|
62
|
+
readonly data: any;
|
|
63
|
+
readonly parsedType: ZodParsedType;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export type ParseInput = {
|
|
67
|
+
data: any;
|
|
68
|
+
path: (string | number)[];
|
|
69
|
+
parent: ParseContext;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
export function addIssueToContext(ctx: ParseContext, issueData: IssueData): void {
|
|
73
|
+
const overrideMap = getErrorMap();
|
|
74
|
+
const issue = makeIssue({
|
|
75
|
+
issueData: issueData,
|
|
76
|
+
data: ctx.data,
|
|
77
|
+
path: ctx.path,
|
|
78
|
+
errorMaps: [
|
|
79
|
+
ctx.common.contextualErrorMap, // contextual error map is first priority
|
|
80
|
+
ctx.schemaErrorMap, // then schema-bound map if available
|
|
81
|
+
overrideMap, // then global override map
|
|
82
|
+
overrideMap === defaultErrorMap ? undefined : defaultErrorMap, // then global default map
|
|
83
|
+
].filter((x) => !!x),
|
|
84
|
+
});
|
|
85
|
+
ctx.common.issues.push(issue);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export type ObjectPair = {
|
|
89
|
+
key: SyncParseReturnType<any>;
|
|
90
|
+
value: SyncParseReturnType<any>;
|
|
91
|
+
};
|
|
92
|
+
export class ParseStatus {
|
|
93
|
+
value: "aborted" | "dirty" | "valid" = "valid";
|
|
94
|
+
dirty(): void {
|
|
95
|
+
if (this.value === "valid") this.value = "dirty";
|
|
96
|
+
}
|
|
97
|
+
abort(): void {
|
|
98
|
+
if (this.value !== "aborted") this.value = "aborted";
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
static mergeArray(status: ParseStatus, results: SyncParseReturnType<any>[]): SyncParseReturnType {
|
|
102
|
+
const arrayValue: any[] = [];
|
|
103
|
+
for (const s of results) {
|
|
104
|
+
if (s.status === "aborted") return INVALID;
|
|
105
|
+
if (s.status === "dirty") status.dirty();
|
|
106
|
+
arrayValue.push(s.value);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return { status: status.value, value: arrayValue };
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
static async mergeObjectAsync(
|
|
113
|
+
status: ParseStatus,
|
|
114
|
+
pairs: { key: ParseReturnType<any>; value: ParseReturnType<any> }[]
|
|
115
|
+
): Promise<SyncParseReturnType<any>> {
|
|
116
|
+
const syncPairs: ObjectPair[] = [];
|
|
117
|
+
for (const pair of pairs) {
|
|
118
|
+
const key = await pair.key;
|
|
119
|
+
const value = await pair.value;
|
|
120
|
+
syncPairs.push({
|
|
121
|
+
key,
|
|
122
|
+
value,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
return ParseStatus.mergeObjectSync(status, syncPairs);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
static mergeObjectSync(
|
|
129
|
+
status: ParseStatus,
|
|
130
|
+
pairs: {
|
|
131
|
+
key: SyncParseReturnType<any>;
|
|
132
|
+
value: SyncParseReturnType<any>;
|
|
133
|
+
alwaysSet?: boolean;
|
|
134
|
+
}[]
|
|
135
|
+
): SyncParseReturnType {
|
|
136
|
+
const finalObject: any = {};
|
|
137
|
+
for (const pair of pairs) {
|
|
138
|
+
const { key, value } = pair;
|
|
139
|
+
if (key.status === "aborted") return INVALID;
|
|
140
|
+
if (value.status === "aborted") return INVALID;
|
|
141
|
+
if (key.status === "dirty") status.dirty();
|
|
142
|
+
if (value.status === "dirty") status.dirty();
|
|
143
|
+
|
|
144
|
+
if (key.value !== "__proto__" && (typeof value.value !== "undefined" || pair.alwaysSet)) {
|
|
145
|
+
finalObject[key.value] = value.value;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return { status: status.value, value: finalObject };
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
export interface ParseResult {
|
|
153
|
+
status: "aborted" | "dirty" | "valid";
|
|
154
|
+
data: any;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export type INVALID = { status: "aborted" };
|
|
158
|
+
export const INVALID: INVALID = Object.freeze({
|
|
159
|
+
status: "aborted",
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
export type DIRTY<T> = { status: "dirty"; value: T };
|
|
163
|
+
export const DIRTY = <T>(value: T): DIRTY<T> => ({ status: "dirty", value });
|
|
164
|
+
|
|
165
|
+
export type OK<T> = { status: "valid"; value: T };
|
|
166
|
+
export const OK = <T>(value: T): OK<T> => ({ status: "valid", value });
|
|
167
|
+
|
|
168
|
+
export type SyncParseReturnType<T = any> = OK<T> | DIRTY<T> | INVALID;
|
|
169
|
+
export type AsyncParseReturnType<T> = Promise<SyncParseReturnType<T>>;
|
|
170
|
+
export type ParseReturnType<T> = SyncParseReturnType<T> | AsyncParseReturnType<T>;
|
|
171
|
+
|
|
172
|
+
export const isAborted = (x: ParseReturnType<any>): x is INVALID => (x as any).status === "aborted";
|
|
173
|
+
export const isDirty = <T>(x: ParseReturnType<T>): x is OK<T> | DIRTY<T> => (x as any).status === "dirty";
|
|
174
|
+
export const isValid = <T>(x: ParseReturnType<T>): x is OK<T> => (x as any).status === "valid";
|
|
175
|
+
export const isAsync = <T>(x: ParseReturnType<T>): x is AsyncParseReturnType<T> =>
|
|
176
|
+
typeof Promise !== "undefined" && x instanceof Promise;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
ZodArray,
|
|
3
|
+
ZodNullable,
|
|
4
|
+
ZodObject,
|
|
5
|
+
ZodOptional,
|
|
6
|
+
ZodRawShape,
|
|
7
|
+
ZodTuple,
|
|
8
|
+
ZodTupleItems,
|
|
9
|
+
ZodTypeAny,
|
|
10
|
+
} from "../types.js";
|
|
11
|
+
|
|
12
|
+
export namespace partialUtil {
|
|
13
|
+
export type DeepPartial<T extends ZodTypeAny> = T extends ZodObject<ZodRawShape>
|
|
14
|
+
? ZodObject<
|
|
15
|
+
{ [k in keyof T["shape"]]: ZodOptional<DeepPartial<T["shape"][k]>> },
|
|
16
|
+
T["_def"]["unknownKeys"],
|
|
17
|
+
T["_def"]["catchall"]
|
|
18
|
+
>
|
|
19
|
+
: T extends ZodArray<infer Type, infer Card>
|
|
20
|
+
? ZodArray<DeepPartial<Type>, Card>
|
|
21
|
+
: T extends ZodOptional<infer Type>
|
|
22
|
+
? ZodOptional<DeepPartial<Type>>
|
|
23
|
+
: T extends ZodNullable<infer Type>
|
|
24
|
+
? ZodNullable<DeepPartial<Type>>
|
|
25
|
+
: T extends ZodTuple<infer Items>
|
|
26
|
+
? {
|
|
27
|
+
[k in keyof Items]: Items[k] extends ZodTypeAny ? DeepPartial<Items[k]> : never;
|
|
28
|
+
} extends infer PI
|
|
29
|
+
? PI extends ZodTupleItems
|
|
30
|
+
? ZodTuple<PI>
|
|
31
|
+
: never
|
|
32
|
+
: never
|
|
33
|
+
: T;
|
|
34
|
+
}
|