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,64 @@
|
|
|
1
|
+
/** The Standard Schema interface. */
|
|
2
|
+
export interface StandardSchemaV1<Input = unknown, Output = Input> {
|
|
3
|
+
/** The Standard Schema properties. */
|
|
4
|
+
readonly "~standard": StandardSchemaV1.Props<Input, Output>;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export declare namespace StandardSchemaV1 {
|
|
8
|
+
/** The Standard Schema properties interface. */
|
|
9
|
+
export interface Props<Input = unknown, Output = Input> {
|
|
10
|
+
/** The version number of the standard. */
|
|
11
|
+
readonly version: 1;
|
|
12
|
+
/** The vendor name of the schema library. */
|
|
13
|
+
readonly vendor: string;
|
|
14
|
+
/** Validates unknown input values. */
|
|
15
|
+
readonly validate: (value: unknown) => Result<Output> | Promise<Result<Output>>;
|
|
16
|
+
/** Inferred types associated with the schema. */
|
|
17
|
+
readonly types?: Types<Input, Output> | undefined;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** The result interface of the validate function. */
|
|
21
|
+
export type Result<Output> = SuccessResult<Output> | FailureResult;
|
|
22
|
+
|
|
23
|
+
/** The result interface if validation succeeds. */
|
|
24
|
+
export interface SuccessResult<Output> {
|
|
25
|
+
/** The typed output value. */
|
|
26
|
+
readonly value: Output;
|
|
27
|
+
/** The non-existent issues. */
|
|
28
|
+
readonly issues?: undefined;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** The result interface if validation fails. */
|
|
32
|
+
export interface FailureResult {
|
|
33
|
+
/** The issues of failed validation. */
|
|
34
|
+
readonly issues: ReadonlyArray<Issue>;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** The issue interface of the failure output. */
|
|
38
|
+
export interface Issue {
|
|
39
|
+
/** The error message of the issue. */
|
|
40
|
+
readonly message: string;
|
|
41
|
+
/** The path of the issue, if any. */
|
|
42
|
+
readonly path?: ReadonlyArray<PropertyKey | PathSegment> | undefined;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** The path segment interface of the issue. */
|
|
46
|
+
export interface PathSegment {
|
|
47
|
+
/** The key representing a path segment. */
|
|
48
|
+
readonly key: PropertyKey;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** The Standard Schema types interface. */
|
|
52
|
+
export interface Types<Input = unknown, Output = Input> {
|
|
53
|
+
/** The input type of the schema. */
|
|
54
|
+
readonly input: Input;
|
|
55
|
+
/** The output type of the schema. */
|
|
56
|
+
readonly output: Output;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Infers the input type of a Standard Schema. */
|
|
60
|
+
export type InferInput<Schema extends StandardSchemaV1> = NonNullable<Schema["~standard"]["types"]>["input"];
|
|
61
|
+
|
|
62
|
+
/** Infers the output type of a Standard Schema. */
|
|
63
|
+
export type InferOutput<Schema extends StandardSchemaV1> = NonNullable<Schema["~standard"]["types"]>["output"];
|
|
64
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { expect, expectTypeOf, test } from "vitest";
|
|
2
|
+
import * as z from "zod/v3";
|
|
3
|
+
|
|
4
|
+
test("test", () => {
|
|
5
|
+
expect(true).toBe(true);
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
test("test2", () => {
|
|
9
|
+
expect(() => z.string().parse(234)).toThrowErrorMatchingInlineSnapshot(`
|
|
10
|
+
[ZodError: [
|
|
11
|
+
{
|
|
12
|
+
"code": "invalid_type",
|
|
13
|
+
"expected": "string",
|
|
14
|
+
"received": "number",
|
|
15
|
+
"path": [],
|
|
16
|
+
"message": "Expected string, received number"
|
|
17
|
+
}
|
|
18
|
+
]]
|
|
19
|
+
`);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test("async validation", async () => {
|
|
23
|
+
const testTuple = z
|
|
24
|
+
.tuple([z.string().refine(async () => true), z.number().refine(async () => true)])
|
|
25
|
+
.refine(async () => true);
|
|
26
|
+
expectTypeOf<typeof testTuple._output>().toEqualTypeOf<[string, number]>();
|
|
27
|
+
|
|
28
|
+
const val = await testTuple.parseAsync(["asdf", 1234]);
|
|
29
|
+
expect(val).toEqual(val);
|
|
30
|
+
|
|
31
|
+
const r1 = await testTuple.safeParseAsync(["asdf", "asdf"]);
|
|
32
|
+
expect(r1.success).toEqual(false);
|
|
33
|
+
expect(r1.error!).toMatchInlineSnapshot(`
|
|
34
|
+
[ZodError: [
|
|
35
|
+
{
|
|
36
|
+
"code": "invalid_type",
|
|
37
|
+
"expected": "number",
|
|
38
|
+
"received": "string",
|
|
39
|
+
"path": [
|
|
40
|
+
1
|
|
41
|
+
],
|
|
42
|
+
"message": "Expected number, received string"
|
|
43
|
+
}
|
|
44
|
+
]]
|
|
45
|
+
`);
|
|
46
|
+
});
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import be from "../../../locales/be.js";
|
|
3
|
+
|
|
4
|
+
describe("Belarusian localization", () => {
|
|
5
|
+
const localeError = be().localeError;
|
|
6
|
+
|
|
7
|
+
describe("pluralization rules", () => {
|
|
8
|
+
for (const { type, cases } of TEST_CASES) {
|
|
9
|
+
describe(`${type} pluralization`, () => {
|
|
10
|
+
for (const { count, expected } of cases) {
|
|
11
|
+
it(`correctly pluralizes ${count} ${type}`, () => {
|
|
12
|
+
const error = localeError({
|
|
13
|
+
code: "too_small",
|
|
14
|
+
minimum: count,
|
|
15
|
+
type: "number",
|
|
16
|
+
inclusive: true,
|
|
17
|
+
path: [],
|
|
18
|
+
origin: type,
|
|
19
|
+
input: count - 1,
|
|
20
|
+
});
|
|
21
|
+
expect(error).toContain(expected);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
it("handles negative numbers correctly", () => {
|
|
28
|
+
const error = localeError({
|
|
29
|
+
code: "too_small",
|
|
30
|
+
minimum: -2,
|
|
31
|
+
type: "number",
|
|
32
|
+
inclusive: true,
|
|
33
|
+
path: [],
|
|
34
|
+
origin: "array",
|
|
35
|
+
input: -3,
|
|
36
|
+
});
|
|
37
|
+
expect(error).toContain("-2 элементы");
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("handles zero correctly", () => {
|
|
41
|
+
const error = localeError({
|
|
42
|
+
code: "too_small",
|
|
43
|
+
minimum: 0,
|
|
44
|
+
type: "number",
|
|
45
|
+
inclusive: true,
|
|
46
|
+
path: [],
|
|
47
|
+
origin: "array",
|
|
48
|
+
input: -1,
|
|
49
|
+
});
|
|
50
|
+
expect(error).toContain("0 элементаў");
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it("handles bigint values correctly", () => {
|
|
54
|
+
const error = localeError({
|
|
55
|
+
code: "too_small",
|
|
56
|
+
minimum: BigInt(21),
|
|
57
|
+
type: "number",
|
|
58
|
+
inclusive: true,
|
|
59
|
+
path: [],
|
|
60
|
+
origin: "array",
|
|
61
|
+
input: BigInt(20),
|
|
62
|
+
});
|
|
63
|
+
expect(error).toContain("21 элемент");
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
const TEST_CASES = [
|
|
69
|
+
{
|
|
70
|
+
type: "array",
|
|
71
|
+
cases: [
|
|
72
|
+
{ count: 1, expected: "1 элемент" },
|
|
73
|
+
{ count: 2, expected: "2 элементы" },
|
|
74
|
+
{ count: 5, expected: "5 элементаў" },
|
|
75
|
+
{ count: 11, expected: "11 элементаў" },
|
|
76
|
+
{ count: 21, expected: "21 элемент" },
|
|
77
|
+
{ count: 22, expected: "22 элементы" },
|
|
78
|
+
{ count: 25, expected: "25 элементаў" },
|
|
79
|
+
{ count: 101, expected: "101 элемент" },
|
|
80
|
+
{ count: 111, expected: "111 элементаў" },
|
|
81
|
+
],
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
type: "set",
|
|
85
|
+
cases: [
|
|
86
|
+
{ count: 1, expected: "1 элемент" },
|
|
87
|
+
{ count: 2, expected: "2 элементы" },
|
|
88
|
+
{ count: 5, expected: "5 элементаў" },
|
|
89
|
+
{ count: 11, expected: "11 элементаў" },
|
|
90
|
+
{ count: 21, expected: "21 элемент" },
|
|
91
|
+
{ count: 22, expected: "22 элементы" },
|
|
92
|
+
{ count: 25, expected: "25 элементаў" },
|
|
93
|
+
{ count: 101, expected: "101 элемент" },
|
|
94
|
+
{ count: 111, expected: "111 элементаў" },
|
|
95
|
+
],
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
type: "string",
|
|
99
|
+
cases: [
|
|
100
|
+
{ count: 1, expected: "1 сімвал" },
|
|
101
|
+
{ count: 2, expected: "2 сімвалы" },
|
|
102
|
+
{ count: 5, expected: "5 сімвалаў" },
|
|
103
|
+
{ count: 11, expected: "11 сімвалаў" },
|
|
104
|
+
{ count: 21, expected: "21 сімвал" },
|
|
105
|
+
{ count: 22, expected: "22 сімвалы" },
|
|
106
|
+
{ count: 25, expected: "25 сімвалаў" },
|
|
107
|
+
],
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
type: "file",
|
|
111
|
+
cases: [
|
|
112
|
+
{ count: 0, expected: "0 байтаў" },
|
|
113
|
+
{ count: 1, expected: "1 байт" },
|
|
114
|
+
{ count: 2, expected: "2 байты" },
|
|
115
|
+
{ count: 5, expected: "5 байтаў" },
|
|
116
|
+
{ count: 11, expected: "11 байтаў" },
|
|
117
|
+
{ count: 21, expected: "21 байт" },
|
|
118
|
+
{ count: 22, expected: "22 байты" },
|
|
119
|
+
{ count: 25, expected: "25 байтаў" },
|
|
120
|
+
{ count: 101, expected: "101 байт" },
|
|
121
|
+
{ count: 110, expected: "110 байтаў" },
|
|
122
|
+
],
|
|
123
|
+
},
|
|
124
|
+
] as const;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { expect, test } from "vitest";
|
|
2
|
+
import { parsedType } from "../../../locales/en.js";
|
|
3
|
+
|
|
4
|
+
test("parsedType", () => {
|
|
5
|
+
expect(parsedType("string")).toBe("string");
|
|
6
|
+
expect(parsedType(1)).toBe("number");
|
|
7
|
+
expect(parsedType(true)).toBe("boolean");
|
|
8
|
+
expect(parsedType(null)).toBe("null");
|
|
9
|
+
expect(parsedType(undefined)).toBe("undefined");
|
|
10
|
+
expect(parsedType([])).toBe("array");
|
|
11
|
+
expect(parsedType({})).toBe("object");
|
|
12
|
+
expect(parsedType(new Date())).toBe("Date");
|
|
13
|
+
expect(parsedType(new Map())).toBe("Map");
|
|
14
|
+
expect(parsedType(new Set())).toBe("Set");
|
|
15
|
+
expect(parsedType(new Error())).toBe("Error");
|
|
16
|
+
|
|
17
|
+
const nullPrototype = Object.create(null);
|
|
18
|
+
expect(parsedType(nullPrototype)).toBe("object");
|
|
19
|
+
|
|
20
|
+
const doubleNullPrototype = Object.create(Object.create(null));
|
|
21
|
+
expect(parsedType(doubleNullPrototype)).toBe("object");
|
|
22
|
+
});
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import ru from "../../../locales/ru.js";
|
|
3
|
+
|
|
4
|
+
describe("Russian localization", () => {
|
|
5
|
+
const localeError = ru().localeError;
|
|
6
|
+
|
|
7
|
+
describe("pluralization rules", () => {
|
|
8
|
+
for (const { type, cases } of TEST_CASES) {
|
|
9
|
+
describe(`${type} pluralization`, () => {
|
|
10
|
+
for (const { count, expected } of cases) {
|
|
11
|
+
it(`correctly pluralizes ${count} ${type}`, () => {
|
|
12
|
+
const error = localeError({
|
|
13
|
+
code: "too_small",
|
|
14
|
+
minimum: count,
|
|
15
|
+
type: "number",
|
|
16
|
+
inclusive: true,
|
|
17
|
+
path: [],
|
|
18
|
+
origin: type,
|
|
19
|
+
input: count - 1,
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
expect(error).toContain(expected);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
it("handles negative numbers correctly", () => {
|
|
29
|
+
const error = localeError({
|
|
30
|
+
code: "too_small",
|
|
31
|
+
minimum: -2,
|
|
32
|
+
type: "number",
|
|
33
|
+
inclusive: true,
|
|
34
|
+
path: [],
|
|
35
|
+
origin: "array",
|
|
36
|
+
input: -3,
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
expect(error).toContain("-2 элемента");
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("handles zero correctly", () => {
|
|
43
|
+
const error = localeError({
|
|
44
|
+
code: "too_small",
|
|
45
|
+
minimum: 0,
|
|
46
|
+
type: "number",
|
|
47
|
+
inclusive: true,
|
|
48
|
+
path: [],
|
|
49
|
+
origin: "array",
|
|
50
|
+
input: -1,
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
expect(error).toContain("0 элементов");
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it("handles bigint values correctly", () => {
|
|
57
|
+
const error = localeError({
|
|
58
|
+
code: "too_small",
|
|
59
|
+
minimum: BigInt(21),
|
|
60
|
+
type: "number",
|
|
61
|
+
inclusive: true,
|
|
62
|
+
path: [],
|
|
63
|
+
origin: "array",
|
|
64
|
+
input: BigInt(20),
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
expect(error).toContain("21 элемент");
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
const TEST_CASES = [
|
|
73
|
+
{
|
|
74
|
+
type: "array",
|
|
75
|
+
cases: [
|
|
76
|
+
{ count: 1, expected: "1 элемент" },
|
|
77
|
+
{ count: 2, expected: "2 элемента" },
|
|
78
|
+
{ count: 5, expected: "5 элементов" },
|
|
79
|
+
{ count: 11, expected: "11 элементов" },
|
|
80
|
+
{ count: 21, expected: "21 элемент" },
|
|
81
|
+
{ count: 22, expected: "22 элемента" },
|
|
82
|
+
{ count: 25, expected: "25 элементов" },
|
|
83
|
+
{ count: 101, expected: "101 элемент" },
|
|
84
|
+
{ count: 111, expected: "111 элементов" },
|
|
85
|
+
],
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
type: "set",
|
|
89
|
+
cases: [
|
|
90
|
+
{ count: 1, expected: "1 элемент" },
|
|
91
|
+
{ count: 2, expected: "2 элемента" },
|
|
92
|
+
{ count: 5, expected: "5 элементов" },
|
|
93
|
+
{ count: 11, expected: "11 элементов" },
|
|
94
|
+
{ count: 21, expected: "21 элемент" },
|
|
95
|
+
{ count: 22, expected: "22 элемента" },
|
|
96
|
+
{ count: 25, expected: "25 элементов" },
|
|
97
|
+
{ count: 101, expected: "101 элемент" },
|
|
98
|
+
{ count: 111, expected: "111 элементов" },
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
type: "string",
|
|
103
|
+
cases: [
|
|
104
|
+
{ count: 1, expected: "1 символ" },
|
|
105
|
+
{ count: 2, expected: "2 символа" },
|
|
106
|
+
{ count: 5, expected: "5 символов" },
|
|
107
|
+
{ count: 11, expected: "11 символов" },
|
|
108
|
+
{ count: 21, expected: "21 символ" },
|
|
109
|
+
{ count: 22, expected: "22 символа" },
|
|
110
|
+
{ count: 25, expected: "25 символов" },
|
|
111
|
+
],
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
type: "file",
|
|
115
|
+
cases: [
|
|
116
|
+
{ count: 0, expected: "0 байт" },
|
|
117
|
+
{ count: 1, expected: "1 байт" },
|
|
118
|
+
{ count: 2, expected: "2 байта" },
|
|
119
|
+
{ count: 5, expected: "5 байт" },
|
|
120
|
+
{ count: 11, expected: "11 байт" },
|
|
121
|
+
{ count: 21, expected: "21 байт" },
|
|
122
|
+
{ count: 22, expected: "22 байта" },
|
|
123
|
+
{ count: 25, expected: "25 байт" },
|
|
124
|
+
{ count: 101, expected: "101 байт" },
|
|
125
|
+
{ count: 110, expected: "110 байт" },
|
|
126
|
+
],
|
|
127
|
+
},
|
|
128
|
+
] as const;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { expect, test } from "vitest";
|
|
2
|
+
import * as z from "zod/v4";
|
|
3
|
+
import { parsedType } from "../../../locales/tr.js";
|
|
4
|
+
|
|
5
|
+
test("parsedType", () => {
|
|
6
|
+
expect(parsedType("string")).toBe("string");
|
|
7
|
+
expect(parsedType(1)).toBe("number");
|
|
8
|
+
expect(parsedType(true)).toBe("boolean");
|
|
9
|
+
expect(parsedType(null)).toBe("null");
|
|
10
|
+
expect(parsedType(undefined)).toBe("undefined");
|
|
11
|
+
expect(parsedType([])).toBe("array");
|
|
12
|
+
expect(parsedType({})).toBe("object");
|
|
13
|
+
expect(parsedType(new Date())).toBe("Date");
|
|
14
|
+
expect(parsedType(new Map())).toBe("Map");
|
|
15
|
+
expect(parsedType(new Set())).toBe("Set");
|
|
16
|
+
expect(parsedType(new Error())).toBe("Error");
|
|
17
|
+
|
|
18
|
+
const nullPrototype = Object.create(null);
|
|
19
|
+
expect(parsedType(nullPrototype)).toBe("object");
|
|
20
|
+
|
|
21
|
+
const doubleNullPrototype = Object.create(Object.create(null));
|
|
22
|
+
expect(parsedType(doubleNullPrototype)).toBe("object");
|
|
23
|
+
|
|
24
|
+
expect(parsedType(Number.NaN)).toBe("NaN");
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test("locales - tr", () => {
|
|
28
|
+
z.config(z.locales.tr());
|
|
29
|
+
|
|
30
|
+
const invalidType = z.number().safeParse("a");
|
|
31
|
+
expect(invalidType.error!.issues[0].code).toBe("invalid_type");
|
|
32
|
+
expect(invalidType.error!.issues[0].message).toBe("Geçersiz değer: beklenen number, alınan string");
|
|
33
|
+
|
|
34
|
+
const invalidType2 = z.string().safeParse(1);
|
|
35
|
+
expect(invalidType2.error!.issues[0].code).toBe("invalid_type");
|
|
36
|
+
expect(invalidType2.error!.issues[0].message).toBe("Geçersiz değer: beklenen string, alınan number");
|
|
37
|
+
|
|
38
|
+
const invalidValue = z.enum(["a", "b"]).safeParse(1);
|
|
39
|
+
expect(invalidValue.error!.issues[0].code).toBe("invalid_value");
|
|
40
|
+
expect(invalidValue.error!.issues[0].message).toBe('Geçersiz seçenek: aşağıdakilerden biri olmalı: "a"|"b"');
|
|
41
|
+
|
|
42
|
+
const tooBig = z.number().max(10).safeParse(15);
|
|
43
|
+
expect(tooBig.error!.issues[0].code).toBe("too_big");
|
|
44
|
+
expect(tooBig.error!.issues[0].message).toBe("Çok büyük: beklenen number <=10");
|
|
45
|
+
|
|
46
|
+
const tooSmall = z.number().min(10).safeParse(5);
|
|
47
|
+
expect(tooSmall.error!.issues[0].code).toBe("too_small");
|
|
48
|
+
expect(tooSmall.error!.issues[0].message).toBe("Çok küçük: beklenen number >=10");
|
|
49
|
+
|
|
50
|
+
const invalidFormatRegex = z.string().regex(/abcd/).safeParse("invalid-string");
|
|
51
|
+
expect(invalidFormatRegex.error!.issues[0].code).toBe("invalid_format");
|
|
52
|
+
expect(invalidFormatRegex.error!.issues[0].message).toBe("Geçersiz metin: /abcd/ desenine uymalı");
|
|
53
|
+
|
|
54
|
+
const invalidFormatStartsWith = z.string().startsWith("abcd").safeParse("invalid-string");
|
|
55
|
+
expect(invalidFormatStartsWith.error!.issues[0].code).toBe("invalid_format");
|
|
56
|
+
expect(invalidFormatStartsWith.error!.issues[0].message).toBe('Geçersiz metin: "abcd" ile başlamalı');
|
|
57
|
+
|
|
58
|
+
const notMultipleOf = z.number().multipleOf(3).safeParse(10);
|
|
59
|
+
expect(notMultipleOf.error!.issues[0].code).toBe("not_multiple_of");
|
|
60
|
+
expect(notMultipleOf.error!.issues[0].message).toBe("Geçersiz sayı: 3 ile tam bölünebilmeli");
|
|
61
|
+
|
|
62
|
+
const unrecognizedKeys = z.object({ a: z.string(), b: z.number() }).strict().safeParse({ a: "a", b: 1, c: 2 });
|
|
63
|
+
expect(unrecognizedKeys.error!.issues[0].code).toBe("unrecognized_keys");
|
|
64
|
+
expect(unrecognizedKeys.error!.issues[0].message).toBe('Tanınmayan anahtar: "c"');
|
|
65
|
+
|
|
66
|
+
const invalidUnion = z.union([z.string(), z.number()]).safeParse(true);
|
|
67
|
+
expect(invalidUnion.error!.issues[0].code).toBe("invalid_union");
|
|
68
|
+
expect(invalidUnion.error!.issues[0].message).toBe("Geçersiz değer");
|
|
69
|
+
});
|