zod
Version:
TypeScript-first schema declaration and validation library with static type inference
27 lines (21 loc) • 1.71 kB
text/typescript
import { expect, test } from "vitest";
import * as z from "../../index.js";
import * as core from "../index.js";
// Global compilation is opt-in through `import "zod/compile"`, and that opt-in mutates `globalThis.__zod_globalConfig` — process-global state, not module state. Two things therefore have to hold, and neither is evident from reading the module: importing zod must not install the post-processor, and the compile-mode vitest project must not leak its setup file into the default one. Both projects run this file and each asserts the state it is supposed to be in, so a leak in either direction fails here instead of silently turning the default suite into a second compiled run (or the compiled suite into a second uncompiled one).
const compileMode = (globalThis as any).__zodCompileStats !== undefined;
test("global compilation is installed only under compile mode", () => {
if (compileMode) {
expect(core.globalConfig.postProcessor).toBeTypeOf("function");
} else {
expect(core.globalConfig.postProcessor).toBeUndefined();
}
});
test("a freshly constructed schema is compiled only under compile mode", () => {
const schema = z.object({ a: z.string() });
// The global shim replaces `_zod.run` at construction time and tags itself with `__originalRun` so a later compile can unwrap past it. An untagged `run` is proof the post-processor never touched this schema.
const tagged = (schema._zod.run as { __originalRun?: unknown }).__originalRun !== undefined;
expect(tagged).toBe(compileMode);
// Either way the schema has to parse identically.
expect(schema.parse({ a: "x" })).toEqual({ a: "x" });
expect(schema.safeParse({ a: 1 }).success).toBe(false);
});