zod 3.26.0-canary.20250703T013930 → 3.26.0-canary.20250703T214020
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/eo.ts +125 -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 +39 -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/locales/eo.cjs +144 -0
- package/v4/locales/eo.d.cts +5 -0
- package/v4/locales/eo.d.ts +5 -0
- package/v4/locales/eo.js +116 -0
- package/v4/locales/index.cjs +3 -1
- package/v4/locales/index.d.cts +1 -0
- package/v4/locales/index.d.ts +1 -0
- package/v4/locales/index.js +1 -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,257 @@
|
|
|
1
|
+
// @ts-ignore TS6133
|
|
2
|
+
import { expect, test } from "vitest";
|
|
3
|
+
|
|
4
|
+
import * as z from "zod/v3";
|
|
5
|
+
import { util } from "../helpers/util.js";
|
|
6
|
+
|
|
7
|
+
const args1 = z.tuple([z.string()]);
|
|
8
|
+
const returns1 = z.number();
|
|
9
|
+
const func1 = z.function(args1, returns1);
|
|
10
|
+
|
|
11
|
+
test("function parsing", () => {
|
|
12
|
+
const parsed = func1.parse((arg: any) => arg.length);
|
|
13
|
+
parsed("asdf");
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
test("parsed function fail 1", () => {
|
|
17
|
+
const parsed = func1.parse((x: string) => x);
|
|
18
|
+
expect(() => parsed("asdf")).toThrow();
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
test("parsed function fail 2", () => {
|
|
22
|
+
const parsed = func1.parse((x: string) => x);
|
|
23
|
+
expect(() => parsed(13 as any)).toThrow();
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
test("function inference 1", () => {
|
|
27
|
+
type func1 = z.TypeOf<typeof func1>;
|
|
28
|
+
util.assertEqual<func1, (k: string) => number>(true);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test("method parsing", () => {
|
|
32
|
+
const methodObject = z.object({
|
|
33
|
+
property: z.number(),
|
|
34
|
+
method: z.function().args(z.string()).returns(z.number()),
|
|
35
|
+
});
|
|
36
|
+
const methodInstance = {
|
|
37
|
+
property: 3,
|
|
38
|
+
method: function (s: string) {
|
|
39
|
+
return s.length + this.property;
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
const parsed = methodObject.parse(methodInstance);
|
|
43
|
+
expect(parsed.method("length=8")).toBe(11); // 8 length + 3 property
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test("async method parsing", async () => {
|
|
47
|
+
const methodObject = z.object({
|
|
48
|
+
property: z.number(),
|
|
49
|
+
method: z.function().args(z.string()).returns(z.promise(z.number())),
|
|
50
|
+
});
|
|
51
|
+
const methodInstance = {
|
|
52
|
+
property: 3,
|
|
53
|
+
method: async function (s: string) {
|
|
54
|
+
return s.length + this.property;
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
const parsed = methodObject.parse(methodInstance);
|
|
58
|
+
expect(await parsed.method("length=8")).toBe(11); // 8 length + 3 property
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test("args method", () => {
|
|
62
|
+
const t1 = z.function();
|
|
63
|
+
type t1 = z.infer<typeof t1>;
|
|
64
|
+
util.assertEqual<t1, (...args_1: unknown[]) => unknown>(true);
|
|
65
|
+
|
|
66
|
+
const t2 = t1.args(z.string());
|
|
67
|
+
type t2 = z.infer<typeof t2>;
|
|
68
|
+
util.assertEqual<t2, (arg: string, ...args_1: unknown[]) => unknown>(true);
|
|
69
|
+
|
|
70
|
+
const t3 = t2.returns(z.boolean());
|
|
71
|
+
type t3 = z.infer<typeof t3>;
|
|
72
|
+
util.assertEqual<t3, (arg: string, ...args_1: unknown[]) => boolean>(true);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
const args2 = z.tuple([
|
|
76
|
+
z.object({
|
|
77
|
+
f1: z.number(),
|
|
78
|
+
f2: z.string().nullable(),
|
|
79
|
+
f3: z.array(z.boolean().optional()).optional(),
|
|
80
|
+
}),
|
|
81
|
+
]);
|
|
82
|
+
const returns2 = z.union([z.string(), z.number()]);
|
|
83
|
+
|
|
84
|
+
const func2 = z.function(args2, returns2);
|
|
85
|
+
|
|
86
|
+
test("function inference 2", () => {
|
|
87
|
+
type func2 = z.TypeOf<typeof func2>;
|
|
88
|
+
util.assertEqual<
|
|
89
|
+
func2,
|
|
90
|
+
(arg: {
|
|
91
|
+
f1: number;
|
|
92
|
+
f2: string | null;
|
|
93
|
+
f3?: (boolean | undefined)[] | undefined;
|
|
94
|
+
}) => string | number
|
|
95
|
+
>(true);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
test("valid function run", () => {
|
|
99
|
+
const validFunc2Instance = func2.validate((_x) => {
|
|
100
|
+
return "adf" as any;
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
const checker = () => {
|
|
104
|
+
validFunc2Instance({
|
|
105
|
+
f1: 21,
|
|
106
|
+
f2: "asdf",
|
|
107
|
+
f3: [true, false],
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
checker();
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
test("input validation error", () => {
|
|
115
|
+
const invalidFuncInstance = func2.validate((_x) => {
|
|
116
|
+
return "adf" as any;
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
const checker = () => {
|
|
120
|
+
invalidFuncInstance("Invalid_input" as any);
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
expect(checker).toThrow();
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
test("output validation error", () => {
|
|
127
|
+
const invalidFuncInstance = func2.validate((_x) => {
|
|
128
|
+
return ["this", "is", "not", "valid", "output"] as any;
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
const checker = () => {
|
|
132
|
+
invalidFuncInstance({
|
|
133
|
+
f1: 21,
|
|
134
|
+
f2: "asdf",
|
|
135
|
+
f3: [true, false],
|
|
136
|
+
});
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
expect(checker).toThrow();
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
z.function(z.tuple([z.string()])).args()._def.args;
|
|
143
|
+
|
|
144
|
+
test("special function error codes", () => {
|
|
145
|
+
const checker = z.function(z.tuple([z.string()]), z.boolean()).implement((arg) => {
|
|
146
|
+
return arg.length as any;
|
|
147
|
+
});
|
|
148
|
+
try {
|
|
149
|
+
checker("12" as any);
|
|
150
|
+
} catch (err) {
|
|
151
|
+
const zerr = err as z.ZodError;
|
|
152
|
+
const first = zerr.issues[0];
|
|
153
|
+
if (first.code !== z.ZodIssueCode.invalid_return_type) throw new Error();
|
|
154
|
+
|
|
155
|
+
expect(first.returnTypeError).toBeInstanceOf(z.ZodError);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
try {
|
|
159
|
+
checker(12 as any);
|
|
160
|
+
} catch (err) {
|
|
161
|
+
const zerr = err as z.ZodError;
|
|
162
|
+
const first = zerr.issues[0];
|
|
163
|
+
if (first.code !== z.ZodIssueCode.invalid_arguments) throw new Error();
|
|
164
|
+
expect(first.argumentsError).toBeInstanceOf(z.ZodError);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
test("function with async refinements", async () => {
|
|
169
|
+
const func = z
|
|
170
|
+
.function()
|
|
171
|
+
.args(z.string().refine(async (val) => val.length > 10))
|
|
172
|
+
.returns(z.promise(z.number().refine(async (val) => val > 10)))
|
|
173
|
+
.implement(async (val) => {
|
|
174
|
+
return val.length;
|
|
175
|
+
});
|
|
176
|
+
const results = [];
|
|
177
|
+
try {
|
|
178
|
+
await func("asdfasdf");
|
|
179
|
+
results.push("success");
|
|
180
|
+
} catch (_err) {
|
|
181
|
+
results.push("fail");
|
|
182
|
+
}
|
|
183
|
+
try {
|
|
184
|
+
await func("asdflkjasdflkjsf");
|
|
185
|
+
results.push("success");
|
|
186
|
+
} catch (_err) {
|
|
187
|
+
results.push("fail");
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
expect(results).toEqual(["fail", "success"]);
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
test("non async function with async refinements should fail", async () => {
|
|
194
|
+
const func = z
|
|
195
|
+
.function()
|
|
196
|
+
.args(z.string().refine(async (val) => val.length > 10))
|
|
197
|
+
.returns(z.number().refine(async (val) => val > 10))
|
|
198
|
+
.implement((val) => {
|
|
199
|
+
return val.length;
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
const results = [];
|
|
203
|
+
try {
|
|
204
|
+
await func("asdasdfasdffasdf");
|
|
205
|
+
results.push("success");
|
|
206
|
+
} catch (_err) {
|
|
207
|
+
results.push("fail");
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
expect(results).toEqual(["fail"]);
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
test("allow extra parameters", () => {
|
|
214
|
+
const maxLength5 = z
|
|
215
|
+
.function()
|
|
216
|
+
.args(z.string())
|
|
217
|
+
.returns(z.boolean())
|
|
218
|
+
.implement((str, _arg, _qewr) => {
|
|
219
|
+
return str.length <= 5;
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
const filteredList = ["apple", "orange", "pear", "banana", "strawberry"].filter(maxLength5);
|
|
223
|
+
expect(filteredList.length).toEqual(2);
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
test("params and returnType getters", () => {
|
|
227
|
+
const func = z.function().args(z.string()).returns(z.string());
|
|
228
|
+
|
|
229
|
+
func.parameters().items[0].parse("asdf");
|
|
230
|
+
func.returnType().parse("asdf");
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
test("inference with transforms", () => {
|
|
234
|
+
const funcSchema = z
|
|
235
|
+
.function()
|
|
236
|
+
.args(z.string().transform((val) => val.length))
|
|
237
|
+
.returns(z.object({ val: z.number() }));
|
|
238
|
+
const myFunc = funcSchema.implement((val) => {
|
|
239
|
+
return { val, extra: "stuff" };
|
|
240
|
+
});
|
|
241
|
+
myFunc("asdf");
|
|
242
|
+
|
|
243
|
+
util.assertEqual<typeof myFunc, (arg: string, ...args_1: unknown[]) => { val: number; extra: string }>(true);
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
test("fallback to OuterTypeOfFunction", () => {
|
|
247
|
+
const funcSchema = z
|
|
248
|
+
.function()
|
|
249
|
+
.args(z.string().transform((val) => val.length))
|
|
250
|
+
.returns(z.object({ arg: z.number() }).transform((val) => val.arg));
|
|
251
|
+
|
|
252
|
+
const myFunc = funcSchema.implement((val) => {
|
|
253
|
+
return { arg: val, arg2: false };
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
util.assertEqual<typeof myFunc, (arg: string, ...args_1: unknown[]) => number>(true);
|
|
257
|
+
});
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// @ts-ignore TS6133
|
|
2
|
+
import { expect, test } from "vitest";
|
|
3
|
+
|
|
4
|
+
import * as z from "zod/v3";
|
|
5
|
+
import { util } from "../helpers/util.js";
|
|
6
|
+
|
|
7
|
+
test("generics", () => {
|
|
8
|
+
async function stripOuter<TData extends z.ZodTypeAny>(schema: TData, data: unknown) {
|
|
9
|
+
return z
|
|
10
|
+
.object({
|
|
11
|
+
nested: schema, // as z.ZodTypeAny,
|
|
12
|
+
})
|
|
13
|
+
.transform((data) => {
|
|
14
|
+
return data.nested!;
|
|
15
|
+
})
|
|
16
|
+
.parse({ nested: data });
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const result = stripOuter(z.object({ a: z.string() }), { a: "asdf" });
|
|
20
|
+
util.assertEqual<typeof result, Promise<{ a: string }>>(true);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
// test("assignability", () => {
|
|
24
|
+
// const createSchemaAndParse = <K extends string, VS extends z.ZodString>(
|
|
25
|
+
// key: K,
|
|
26
|
+
// valueSchema: VS,
|
|
27
|
+
// data: unknown
|
|
28
|
+
// ) => {
|
|
29
|
+
// const schema = z.object({
|
|
30
|
+
// [key]: valueSchema,
|
|
31
|
+
// } as { [k in K]: VS });
|
|
32
|
+
// return { [key]: valueSchema };
|
|
33
|
+
// const parsed = schema.parse(data);
|
|
34
|
+
// return parsed;
|
|
35
|
+
// // const inferred: z.infer<z.ZodObject<{ [k in K]: VS }>> = parsed;
|
|
36
|
+
// // return inferred;
|
|
37
|
+
// };
|
|
38
|
+
// const parsed = createSchemaAndParse("foo", z.string(), { foo: "" });
|
|
39
|
+
// util.assertEqual<typeof parsed, { foo: string }>(true);
|
|
40
|
+
// });
|
|
41
|
+
|
|
42
|
+
test("nested no undefined", () => {
|
|
43
|
+
const inner = z.string().or(z.array(z.string()));
|
|
44
|
+
const outer = z.object({ inner });
|
|
45
|
+
type outerSchema = z.infer<typeof outer>;
|
|
46
|
+
z.util.assertEqual<outerSchema, { inner: string | string[] }>(true);
|
|
47
|
+
expect(outer.safeParse({ inner: undefined }).success).toEqual(false);
|
|
48
|
+
});
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// @ts-ignore TS6133
|
|
2
|
+
import { expect, test } from "vitest";
|
|
3
|
+
|
|
4
|
+
import * as z from "zod/v3";
|
|
5
|
+
import { util } from "../helpers/util.js";
|
|
6
|
+
|
|
7
|
+
test("instanceof", async () => {
|
|
8
|
+
class Test {}
|
|
9
|
+
class Subtest extends Test {}
|
|
10
|
+
abstract class AbstractBar {
|
|
11
|
+
constructor(public val: string) {}
|
|
12
|
+
}
|
|
13
|
+
class Bar extends AbstractBar {}
|
|
14
|
+
|
|
15
|
+
const TestSchema = z.instanceof(Test);
|
|
16
|
+
const SubtestSchema = z.instanceof(Subtest);
|
|
17
|
+
const AbstractSchema = z.instanceof(AbstractBar);
|
|
18
|
+
const BarSchema = z.instanceof(Bar);
|
|
19
|
+
|
|
20
|
+
TestSchema.parse(new Test());
|
|
21
|
+
TestSchema.parse(new Subtest());
|
|
22
|
+
SubtestSchema.parse(new Subtest());
|
|
23
|
+
AbstractSchema.parse(new Bar("asdf"));
|
|
24
|
+
const bar = BarSchema.parse(new Bar("asdf"));
|
|
25
|
+
expect(bar.val).toEqual("asdf");
|
|
26
|
+
|
|
27
|
+
await expect(() => SubtestSchema.parse(new Test())).toThrow(/Input not instance of Subtest/);
|
|
28
|
+
await expect(() => TestSchema.parse(12)).toThrow(/Input not instance of Test/);
|
|
29
|
+
|
|
30
|
+
util.assertEqual<Test, z.infer<typeof TestSchema>>(true);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test("instanceof fatal", () => {
|
|
34
|
+
const schema = z.instanceof(Date).refine((d) => d.toString());
|
|
35
|
+
const res = schema.safeParse(null);
|
|
36
|
+
expect(res.success).toBe(false);
|
|
37
|
+
});
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
// @ts-ignore TS6133
|
|
2
|
+
import { expect, test } from "vitest";
|
|
3
|
+
|
|
4
|
+
import * as z from "zod/v3";
|
|
5
|
+
|
|
6
|
+
test("object intersection", () => {
|
|
7
|
+
const BaseTeacher = z.object({
|
|
8
|
+
subjects: z.array(z.string()),
|
|
9
|
+
});
|
|
10
|
+
const HasID = z.object({ id: z.string() });
|
|
11
|
+
|
|
12
|
+
const Teacher = z.intersection(BaseTeacher.passthrough(), HasID); // BaseTeacher.merge(HasID);
|
|
13
|
+
const data = {
|
|
14
|
+
subjects: ["math"],
|
|
15
|
+
id: "asdfasdf",
|
|
16
|
+
};
|
|
17
|
+
expect(Teacher.parse(data)).toEqual(data);
|
|
18
|
+
expect(() => Teacher.parse({ subject: data.subjects })).toThrow();
|
|
19
|
+
expect(Teacher.parse({ ...data, extra: 12 })).toEqual({ ...data, extra: 12 });
|
|
20
|
+
|
|
21
|
+
expect(() => z.intersection(BaseTeacher.strict(), HasID).parse({ ...data, extra: 12 })).toThrow();
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test("deep intersection", () => {
|
|
25
|
+
const Animal = z.object({
|
|
26
|
+
properties: z.object({
|
|
27
|
+
is_animal: z.boolean(),
|
|
28
|
+
}),
|
|
29
|
+
});
|
|
30
|
+
const Cat = z
|
|
31
|
+
.object({
|
|
32
|
+
properties: z.object({
|
|
33
|
+
jumped: z.boolean(),
|
|
34
|
+
}),
|
|
35
|
+
})
|
|
36
|
+
.and(Animal);
|
|
37
|
+
|
|
38
|
+
type _Cat = z.infer<typeof Cat>;
|
|
39
|
+
// const cat:Cat = 'asdf' as any;
|
|
40
|
+
const cat = Cat.parse({ properties: { is_animal: true, jumped: true } });
|
|
41
|
+
expect(cat.properties).toEqual({ is_animal: true, jumped: true });
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test("deep intersection of arrays", async () => {
|
|
45
|
+
const Author = z.object({
|
|
46
|
+
posts: z.array(
|
|
47
|
+
z.object({
|
|
48
|
+
post_id: z.number(),
|
|
49
|
+
})
|
|
50
|
+
),
|
|
51
|
+
});
|
|
52
|
+
const Registry = z
|
|
53
|
+
.object({
|
|
54
|
+
posts: z.array(
|
|
55
|
+
z.object({
|
|
56
|
+
title: z.string(),
|
|
57
|
+
})
|
|
58
|
+
),
|
|
59
|
+
})
|
|
60
|
+
.and(Author);
|
|
61
|
+
|
|
62
|
+
const posts = [
|
|
63
|
+
{ post_id: 1, title: "Novels" },
|
|
64
|
+
{ post_id: 2, title: "Fairy tales" },
|
|
65
|
+
];
|
|
66
|
+
const cat = Registry.parse({ posts });
|
|
67
|
+
expect(cat.posts).toEqual(posts);
|
|
68
|
+
const asyncCat = await Registry.parseAsync({ posts });
|
|
69
|
+
expect(asyncCat.posts).toEqual(posts);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test("invalid intersection types", async () => {
|
|
73
|
+
const numberIntersection = z.intersection(
|
|
74
|
+
z.number(),
|
|
75
|
+
z.number().transform((x) => x + 1)
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
const syncResult = numberIntersection.safeParse(1234);
|
|
79
|
+
expect(syncResult.success).toEqual(false);
|
|
80
|
+
if (!syncResult.success) {
|
|
81
|
+
expect(syncResult.error.issues[0].code).toEqual(z.ZodIssueCode.invalid_intersection_types);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const asyncResult = await numberIntersection.spa(1234);
|
|
85
|
+
expect(asyncResult.success).toEqual(false);
|
|
86
|
+
if (!asyncResult.success) {
|
|
87
|
+
expect(asyncResult.error.issues[0].code).toEqual(z.ZodIssueCode.invalid_intersection_types);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test("invalid array merge", async () => {
|
|
92
|
+
const stringArrInt = z.intersection(
|
|
93
|
+
z.string().array(),
|
|
94
|
+
z
|
|
95
|
+
.string()
|
|
96
|
+
.array()
|
|
97
|
+
.transform((val) => [...val, "asdf"])
|
|
98
|
+
);
|
|
99
|
+
const syncResult = stringArrInt.safeParse(["asdf", "qwer"]);
|
|
100
|
+
expect(syncResult.success).toEqual(false);
|
|
101
|
+
if (!syncResult.success) {
|
|
102
|
+
expect(syncResult.error.issues[0].code).toEqual(z.ZodIssueCode.invalid_intersection_types);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const asyncResult = await stringArrInt.spa(["asdf", "qwer"]);
|
|
106
|
+
expect(asyncResult.success).toEqual(false);
|
|
107
|
+
if (!asyncResult.success) {
|
|
108
|
+
expect(asyncResult.error.issues[0].code).toEqual(z.ZodIssueCode.invalid_intersection_types);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import * as z from "zod/v3";
|
|
2
|
+
|
|
3
|
+
export const filePath = __filename;
|
|
4
|
+
|
|
5
|
+
// z.object()
|
|
6
|
+
|
|
7
|
+
export const Test = z.object({
|
|
8
|
+
f1: z.number(),
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
export type Test = z.infer<typeof Test>;
|
|
12
|
+
|
|
13
|
+
export const instanceOfTest: Test = {
|
|
14
|
+
f1: 1,
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// z.object().merge()
|
|
18
|
+
|
|
19
|
+
export const TestMerge = z
|
|
20
|
+
.object({
|
|
21
|
+
f2: z.string().optional(),
|
|
22
|
+
})
|
|
23
|
+
.merge(Test);
|
|
24
|
+
|
|
25
|
+
export type TestMerge = z.infer<typeof TestMerge>;
|
|
26
|
+
|
|
27
|
+
export const instanceOfTestMerge: TestMerge = {
|
|
28
|
+
f1: 1,
|
|
29
|
+
f2: "string",
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// z.union()
|
|
33
|
+
|
|
34
|
+
export const TestUnion = z.union([
|
|
35
|
+
z.object({
|
|
36
|
+
f2: z.string().optional(),
|
|
37
|
+
}),
|
|
38
|
+
Test,
|
|
39
|
+
]);
|
|
40
|
+
|
|
41
|
+
export type TestUnion = z.infer<typeof TestUnion>;
|
|
42
|
+
|
|
43
|
+
export const instanceOfTestUnion: TestUnion = {
|
|
44
|
+
f1: 1,
|
|
45
|
+
f2: "string",
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// z.object().partial()
|
|
49
|
+
|
|
50
|
+
export const TestPartial = Test.partial();
|
|
51
|
+
|
|
52
|
+
export type TestPartial = z.infer<typeof TestPartial>;
|
|
53
|
+
|
|
54
|
+
export const instanceOfTestPartial: TestPartial = {
|
|
55
|
+
f1: 1,
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
// z.object().pick()
|
|
59
|
+
|
|
60
|
+
export const TestPick = TestMerge.pick({ f1: true });
|
|
61
|
+
|
|
62
|
+
export type TestPick = z.infer<typeof TestPick>;
|
|
63
|
+
|
|
64
|
+
export const instanceOfTestPick: TestPick = {
|
|
65
|
+
f1: 1,
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// z.object().omit()
|
|
69
|
+
|
|
70
|
+
export const TestOmit = TestMerge.omit({ f2: true });
|
|
71
|
+
|
|
72
|
+
export type TestOmit = z.infer<typeof TestOmit>;
|
|
73
|
+
|
|
74
|
+
export const instanceOfTestOmit: TestOmit = {
|
|
75
|
+
f1: 1,
|
|
76
|
+
};
|