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 = Record | undefined; export class $ZodRegistry { _meta!: Meta; _schema!: Schema; _map: Map> = new Map(); _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 Map(); 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 return { ...pm, ...this._map.get(schema) } as any; } 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(); } export const globalRegistry: $ZodRegistry = /*@__PURE__*/ registry();