Dev Build / cleanup (push) Canceled after 0s
Dev Build / typecheck (push) Canceled after 0s
Dev Build / build (linux-arm64, ubuntu-24.04-arm, linux-arm64) (push) Canceled after 0s
Dev Build / build (linux-x64, ubuntu-latest, linux-x64) (push) Canceled after 0s
Dev Build / build (win-x64, windows-latest, win32-x64) (push) Canceled after 0s
Dev Build / dispatch-dev-docker (push) Canceled after 0s
115 lines
4.5 KiB
Plaintext
115 lines
4.5 KiB
Plaintext
// @ts-ignore TS6133
|
|
import { expect, test } from "vitest";
|
|
|
|
import * as z from "zod/v3";
|
|
import { util } from "../helpers/util.js";
|
|
|
|
enum testEnum {
|
|
A = 0,
|
|
B = 1,
|
|
}
|
|
|
|
const schemas = [
|
|
z.string().readonly(),
|
|
z.number().readonly(),
|
|
z.nan().readonly(),
|
|
z.bigint().readonly(),
|
|
z.boolean().readonly(),
|
|
z.date().readonly(),
|
|
z.undefined().readonly(),
|
|
z.null().readonly(),
|
|
z.any().readonly(),
|
|
z.unknown().readonly(),
|
|
z.void().readonly(),
|
|
z.function().args(z.string(), z.number()).readonly(),
|
|
|
|
z.array(z.string()).readonly(),
|
|
z.tuple([z.string(), z.number()]).readonly(),
|
|
z.map(z.string(), z.date()).readonly(),
|
|
z.set(z.promise(z.string())).readonly(),
|
|
z.record(z.string()).readonly(),
|
|
z.record(z.string(), z.number()).readonly(),
|
|
z.object({ a: z.string(), 1: z.number() }).readonly(),
|
|
z.nativeEnum(testEnum).readonly(),
|
|
z.promise(z.string()).readonly(),
|
|
] as const;
|
|
|
|
test("flat inference", () => {
|
|
util.assertEqual<z.infer<(typeof schemas)[0]>, string>(true);
|
|
util.assertEqual<z.infer<(typeof schemas)[1]>, number>(true);
|
|
util.assertEqual<z.infer<(typeof schemas)[2]>, number>(true);
|
|
util.assertEqual<z.infer<(typeof schemas)[3]>, bigint>(true);
|
|
util.assertEqual<z.infer<(typeof schemas)[4]>, boolean>(true);
|
|
util.assertEqual<z.infer<(typeof schemas)[5]>, Date>(true);
|
|
util.assertEqual<z.infer<(typeof schemas)[6]>, undefined>(true);
|
|
util.assertEqual<z.infer<(typeof schemas)[7]>, null>(true);
|
|
util.assertEqual<z.infer<(typeof schemas)[8]>, any>(true);
|
|
util.assertEqual<z.infer<(typeof schemas)[9]>, Readonly<unknown>>(true);
|
|
util.assertEqual<z.infer<(typeof schemas)[10]>, void>(true);
|
|
util.assertEqual<z.infer<(typeof schemas)[11]>, (args_0: string, args_1: number, ...args_2: unknown[]) => unknown>(
|
|
true
|
|
);
|
|
util.assertEqual<z.infer<(typeof schemas)[12]>, readonly string[]>(true);
|
|
|
|
util.assertEqual<z.infer<(typeof schemas)[13]>, readonly [string, number]>(true);
|
|
util.assertEqual<z.infer<(typeof schemas)[14]>, ReadonlyMap<string, Date>>(true);
|
|
util.assertEqual<z.infer<(typeof schemas)[15]>, ReadonlySet<Promise<string>>>(true);
|
|
util.assertEqual<z.infer<(typeof schemas)[16]>, Readonly<Record<string, string>>>(true);
|
|
util.assertEqual<z.infer<(typeof schemas)[17]>, Readonly<Record<string, number>>>(true);
|
|
util.assertEqual<z.infer<(typeof schemas)[18]>, { readonly a: string; readonly 1: number }>(true);
|
|
util.assertEqual<z.infer<(typeof schemas)[19]>, Readonly<testEnum>>(true);
|
|
util.assertEqual<z.infer<(typeof schemas)[20]>, Promise<string>>(true);
|
|
});
|
|
|
|
test("object freezing", () => {
|
|
expect(Object.isFrozen(z.array(z.string()).readonly().parse(["a"]))).toBe(true);
|
|
expect(Object.isFrozen(z.tuple([z.string(), z.number()]).readonly().parse(["a", 1]))).toBe(true);
|
|
expect(
|
|
Object.isFrozen(
|
|
z
|
|
.map(z.string(), z.date())
|
|
.readonly()
|
|
.parse(new Map([["a", new Date()]]))
|
|
)
|
|
).toBe(true);
|
|
expect(
|
|
Object.isFrozen(
|
|
z
|
|
.set(z.promise(z.string()))
|
|
.readonly()
|
|
.parse(new Set([Promise.resolve("a")]))
|
|
)
|
|
).toBe(true);
|
|
expect(Object.isFrozen(z.record(z.string()).readonly().parse({ a: "b" }))).toBe(true);
|
|
expect(Object.isFrozen(z.record(z.string(), z.number()).readonly().parse({ a: 1 }))).toBe(true);
|
|
expect(Object.isFrozen(z.object({ a: z.string(), 1: z.number() }).readonly().parse({ a: "b", 1: 2 }))).toBe(true);
|
|
expect(Object.isFrozen(z.promise(z.string()).readonly().parse(Promise.resolve("a")))).toBe(true);
|
|
});
|
|
|
|
test("async object freezing", async () => {
|
|
expect(Object.isFrozen(await z.array(z.string()).readonly().parseAsync(["a"]))).toBe(true);
|
|
expect(Object.isFrozen(await z.tuple([z.string(), z.number()]).readonly().parseAsync(["a", 1]))).toBe(true);
|
|
expect(
|
|
Object.isFrozen(
|
|
await z
|
|
.map(z.string(), z.date())
|
|
.readonly()
|
|
.parseAsync(new Map([["a", new Date()]]))
|
|
)
|
|
).toBe(true);
|
|
expect(
|
|
Object.isFrozen(
|
|
await z
|
|
.set(z.promise(z.string()))
|
|
.readonly()
|
|
.parseAsync(new Set([Promise.resolve("a")]))
|
|
)
|
|
).toBe(true);
|
|
expect(Object.isFrozen(await z.record(z.string()).readonly().parseAsync({ a: "b" }))).toBe(true);
|
|
expect(Object.isFrozen(await z.record(z.string(), z.number()).readonly().parseAsync({ a: 1 }))).toBe(true);
|
|
expect(
|
|
Object.isFrozen(await z.object({ a: z.string(), 1: z.number() }).readonly().parseAsync({ a: "b", 1: 2 }))
|
|
).toBe(true);
|
|
expect(Object.isFrozen(await z.promise(z.string()).readonly().parseAsync(Promise.resolve("a")))).toBe(true);
|
|
});
|