zod
Version:
TypeScript-first schema declaration and validation library with static type inference
40 lines (34 loc) • 1.72 kB
text/typescript
import { afterEach, expect, test } from "vitest";
import * as z from "zod/v4";
import * as core from "zod/v4/core";
// `globalConfig` is attached to `globalThis.__zod_globalConfig` so that a
// single config object is shared across CJS/ESM builds and across multiple
// bundled copies of Zod in a monorepo. This mirrors the existing
// `globalRegistry` -> `globalThis.__zod_globalRegistry` treatment.
//
// See #5789 for the footgun this fixes: users with both CJS and ESM
// instances of Zod loaded had to call `z.config({ jitless: true })`
// twice — once per instance — because each module-scope `globalConfig`
// was a different object. With this change, one call updates state seen
// by every loaded copy.
afterEach(() => {
// Don't leak config mutations into other test files.
delete core.globalConfig.jitless;
});
test("globalConfig is singleton and attached to globalThis", () => {
expect(core.globalConfig).toBe((globalThis as any).__zod_globalConfig);
});
test("z.config writes are observed via globalThis.__zod_globalConfig", () => {
z.config({ jitless: true });
expect((globalThis as any).__zod_globalConfig.jitless).toBe(true);
});
test("pre-set globalThis.__zod_globalConfig is preserved on import", () => {
// Object identity is preserved across reloads of the module: anyone who
// pre-populates `globalThis.__zod_globalConfig` before Zod loads (e.g.
// an inline script before the bundle) keeps that exact object as the
// source of truth. Mutating it directly is equivalent to z.config().
const direct = (globalThis as any).__zod_globalConfig;
direct.jitless = true;
expect(core.globalConfig.jitless).toBe(true);
expect(z.config()).toBe(core.globalConfig);
});