import type * as core from "./core.js"; import type { $ZodType } from "./schemas.js"; export const $output: unique symbol = Symbol("ZodOutput"); export type $output = typeof $output; export const $input: unique symbol = Symbol("ZodInput"); export type $input = typeof $input; export type $replace = Meta extends $output ? core.output : Meta extends $input ? core.input : Meta extends (infer M)[] ? $replace[] : Meta extends (...args: infer P) => infer R ? ( ...args: { [K in keyof P]: $replace; // tuple } ) => $replace : // handle objects Meta extends object ? { [K in keyof Meta]: $replace } : Meta; type MetadataType = object | undefined; export class $ZodRegistry { _meta!: Meta; _schema!: Schema; _map: WeakMap> = new WeakMap(); _idmap: Map = new Map(); add( schema: S, ..._meta: undefined extends Meta ? [$replace?] : [$replace] ): this { const meta: any = _meta[0]; this._map.set(schema, meta!); if (meta && typeof meta === "object" && "id" in meta) { if (this._idmap.has(meta.id!)) { throw new Error(`ID ${meta.id} already exists in the registry`); } this._idmap.set(meta.id!, schema); } return this as any; } clear(): this { this._map = new WeakMap(); this._idmap = new Map(); return this; } remove(schema: Schema): this { const meta: any = this._map.get(schema); if (meta && typeof meta === "object" && "id" in meta) { this._idmap.delete(meta.id!); } this._map.delete(schema); return this; } get(schema: S): $replace | undefined { // return this._map.get(schema) as any; // inherit metadata const p = schema._zod.parent as Schema; if (p) { const pm: any = { ...(this.get(p) ?? {}) }; delete pm.id; // do not inherit id const f = { ...pm, ...this._map.get(schema) } as any; return Object.keys(f).length ? f : undefined; } return this._map.get(schema) as any; } has(schema: Schema): boolean { return this._map.has(schema); } } export interface JSONSchemaMeta { id?: string | undefined; title?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; [k: string]: unknown; } export interface GlobalMeta extends JSONSchemaMeta {} // registries export function registry(): $ZodRegistry { return new $ZodRegistry(); } interface GlobalThisWithRegistry { /** * The globalRegistry instance shared across both CommonJS and ESM builds. * By attaching the registry to `globalThis`, this property ensures a single, deduplicated instance * is used regardless of whether the package is loaded via `require` (CJS) or `import` (ESM). * This prevents dual package hazards and keeps registry state consistent. */ __zod_globalRegistry?: $ZodRegistry; } (globalThis as GlobalThisWithRegistry).__zod_globalRegistry ??= registry(); export const globalRegistry: $ZodRegistry = (globalThis as GlobalThisWithRegistry).__zod_globalRegistry!;