import type { ParseContext, SchemaNode } from "../types.js"; import { BaseSchema } from "./base.js"; import { ISSUE_CODES } from "../issue-codes.js"; export class RefSchema extends BaseSchema { private _ref: string; private _resolver?: () => BaseSchema; constructor(ref: string, resolver?: () => BaseSchema) { super(); this._ref = ref; this._resolver = resolver; } _validate(input: unknown, ctx: ParseContext): unknown { if (this._resolver) { const resolved = this._resolver(); return resolved._runPipeline(input, ctx); } ctx.issues.push({ code: ISSUE_CODES.UNSUPPORTED_SCHEMA_KIND, message: `Unresolved ref: ${this._ref}`, path: [...ctx.path], }); return undefined; } _runPipeline(input: unknown, ctx: ParseContext): unknown { if (this._metadata?.sensitive === true && ctx.sensitiveMode) { return super._runPipeline(input, ctx); } return this._resolver ? this._resolver()._runPipeline(input, ctx) : this._validate(input, ctx); } _toNode(): SchemaNode { return this._addDefault({ kind: "ref" as const, ref: this._ref, } as unknown as SchemaNode); } }