import { JsonSchemaResult, JsonSchemaTarget } from "../standard-schema/json-schema.mjs"; import { SchemaContext } from "../types/context-types.mjs"; import { ValidationResult } from "../types/result-types.mjs"; import { BaseValidator } from "./base-validator.mjs"; import { ObjectValidator } from "./object-validator.mjs"; //#region ../@warlock.js/seal/src/validators/discriminated-union-validator.d.ts /** * Discriminated union validator — routes payloads by a shared discriminator field. * * Plain `v.union()` falls back to `matchesType()` to pick a branch, which is * coarse for object-vs-object unions (every branch matches "is plain object"). * Discriminated union reads a known field's value and routes directly to the * matching branch, producing precise errors instead of confused mash from the * wrong branch. * * **Construction-time validation.** Every branch must: * - Be an `ObjectValidator` * - Declare the discriminator field * - Type the discriminator as `v.literal(...)` (single or multi-literal both work) * - Not collide with another branch's literal values * * Misconfigurations throw eagerly so tests catch them at schema-build time. * * @example * ```ts * const email = v.object({ type: v.literal("email"), email: v.string().email() }); * const sms = v.object({ type: v.literal("sms"), phone: v.string() }); * const push = v.object({ type: v.literal("push"), deviceId: v.string() }); * * const notif = v.discriminatedUnion("type", [email, sms, push]); * * await validate(notif, { type: "sms", phone: "555-1234" }); * // → routes to sms branch only; errors (if any) come from sms * ``` * * @see `domains/seal/plans/2026-05-12-discriminated-union.md` */ declare class DiscriminatedUnionValidator> = ReadonlyArray>> extends BaseValidator { discriminator: K; validators: Branches; /** Map from discriminator literal value → matching branch validator. */ private branches; constructor(discriminator: K, validators: Branches); /** * Walk every branch, pull out the discriminator's literal values, and build * the lookup map. Throws on misconfiguration (missing discriminator, * non-literal discriminator, duplicate literal value). */ private static buildBranchMap; matchesType(value: any): boolean; validate(data: any, context: SchemaContext): Promise; clone(): this; /** * Emit `oneOf` of branch schemas. Each branch's own `toJsonSchema()` handles * its `properties.{discriminator}.const` and the surrounding required/optional * structure — we just enumerate. * * For `openai-strict`: the per-branch ObjectValidator already inflates * `required` to include every field; `oneOf` is OpenAI-accepted as long as * each branch passes strict rules independently. */ toJsonSchema(target?: JsonSchemaTarget): JsonSchemaResult; } //#endregion export { DiscriminatedUnionValidator }; //# sourceMappingURL=discriminated-union-validator.d.mts.map