UNPKG

zod

Version:

TypeScript-first schema declaration and validation library with static type inference

1,284 lines (1,107 loc) • 37.3 kB
// import { $ZodType } from "./schemas.js"; import * as core from "./core.js"; import type * as errors from "./errors.js"; import * as regexes from "./regexes.js"; import type * as schemas from "./schemas.js"; import * as util from "./util.js"; ////////////////////////////// CHECKS /////////////////////////////////////// export interface $ZodCheckDef { check: string; error?: errors.$ZodErrorMap<never> | undefined; /** If true, no later checks will be executed if this check fails. Default `false`. */ abort?: boolean | undefined; /** If provided, this check will only be executed if the function returns `true`. Defaults to `payload => z.util.isAborted(payload)`. */ when?: ((payload: schemas.ParsePayload) => boolean) | undefined; } export interface $ZodCheckInternals<T> { def: $ZodCheckDef; /** The set of issues this check might throw. */ issc?: errors.$ZodIssueBase; check(payload: schemas.ParsePayload<T>): util.MaybeAsync<void>; onattach: ((schema: schemas.$ZodType) => void)[]; } export interface $ZodCheck<in T = never> { _zod: $ZodCheckInternals<T>; } export const $ZodCheck: core.$constructor<$ZodCheck<any>> = /*@__PURE__*/ core.$constructor( "$ZodCheck", (inst, def) => { inst._zod ??= {} as any; inst._zod.def = def; inst._zod.onattach ??= []; } ); /////////////////////////////////////// ///// $ZodCheckLessThan ///// /////////////////////////////////////// export interface $ZodCheckLessThanDef extends $ZodCheckDef { check: "less_than"; value: util.Numeric; inclusive: boolean; } export interface $ZodCheckLessThanInternals<T extends util.Numeric = util.Numeric> extends $ZodCheckInternals<T> { def: $ZodCheckLessThanDef; issc: errors.$ZodIssueTooBig<T>; } const numericOriginMap = { number: "number", bigint: "bigint", object: "date", } as const; export interface $ZodCheckLessThan<T extends util.Numeric = util.Numeric> extends $ZodCheck<T> { _zod: $ZodCheckLessThanInternals<T>; } export const $ZodCheckLessThan: core.$constructor<$ZodCheckLessThan> = /*@__PURE__*/ core.$constructor( "$ZodCheckLessThan", (inst, def) => { $ZodCheck.init(inst, def); const origin = numericOriginMap[typeof def.value as "number" | "bigint" | "object"]; inst._zod.onattach.push((inst) => { const bag = inst._zod.bag; const curr = (def.inclusive ? bag.maximum : bag.exclusiveMaximum) ?? Number.POSITIVE_INFINITY; if (def.value < curr) { if (def.inclusive) bag.maximum = def.value; else bag.exclusiveMaximum = def.value; } }); inst._zod.check = (payload) => { if (def.inclusive ? payload.value <= def.value : payload.value < def.value) { return; } payload.issues.push({ origin, code: "too_big", maximum: def.value as number, input: payload.value, inclusive: def.inclusive, inst, continue: !def.abort, }); }; } ); ///////////////////////////////////// ///// $ZodCheckGreaterThan ///// ///////////////////////////////////// export interface $ZodCheckGreaterThanDef extends $ZodCheckDef { check: "greater_than"; value: util.Numeric; inclusive: boolean; } export interface $ZodCheckGreaterThanInternals<T extends util.Numeric = util.Numeric> extends $ZodCheckInternals<T> { def: $ZodCheckGreaterThanDef; issc: errors.$ZodIssueTooSmall<T>; } export interface $ZodCheckGreaterThan<T extends util.Numeric = util.Numeric> extends $ZodCheck<T> { _zod: $ZodCheckGreaterThanInternals<T>; } export const $ZodCheckGreaterThan: core.$constructor<$ZodCheckGreaterThan> = /*@__PURE__*/ core.$constructor( "$ZodCheckGreaterThan", (inst, def) => { $ZodCheck.init(inst, def); const origin = numericOriginMap[typeof def.value as "number" | "bigint" | "object"]; inst._zod.onattach.push((inst) => { const bag = inst._zod.bag; const curr = (def.inclusive ? bag.minimum : bag.exclusiveMinimum) ?? Number.NEGATIVE_INFINITY; if (def.value > curr) { if (def.inclusive) bag.minimum = def.value; else bag.exclusiveMinimum = def.value; } }); inst._zod.check = (payload) => { if (def.inclusive ? payload.value >= def.value : payload.value > def.value) { return; } payload.issues.push({ origin, code: "too_small", minimum: def.value as number, input: payload.value, inclusive: def.inclusive, inst, continue: !def.abort, }); }; } ); ///////////////////////////////////// ///// $ZodCheckMultipleOf ///// ///////////////////////////////////// // https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034 export interface $ZodCheckMultipleOfDef<T extends number | bigint = number | bigint> extends $ZodCheckDef { check: "multiple_of"; value: T; } export interface $ZodCheckMultipleOfInternals<T extends number | bigint = number | bigint> extends $ZodCheckInternals<T> { def: $ZodCheckMultipleOfDef<T>; issc: errors.$ZodIssueNotMultipleOf; } export interface $ZodCheckMultipleOf<T extends number | bigint = number | bigint> extends $ZodCheck<T> { _zod: $ZodCheckMultipleOfInternals<T>; } export const $ZodCheckMultipleOf: core.$constructor<$ZodCheckMultipleOf<number | bigint>> = /*@__PURE__*/ core.$constructor("$ZodCheckMultipleOf", (inst, def) => { $ZodCheck.init(inst, def); inst._zod.onattach.push((inst) => { inst._zod.bag.multipleOf ??= def.value; }); inst._zod.check = (payload) => { if (typeof payload.value !== typeof def.value) throw new Error("Cannot mix number and bigint in multiple_of check."); const isMultiple = typeof payload.value === "bigint" ? payload.value % (def.value as bigint) === BigInt(0) : util.floatSafeRemainder(payload.value, def.value as number) === 0; if (isMultiple) return; payload.issues.push({ origin: typeof payload.value as "number", code: "not_multiple_of", divisor: def.value as number, input: payload.value, inst, continue: !def.abort, }); }; }); ///////////////////////////////////// ///// $ZodCheckFinite ///// ///////////////////////////////////// // interface $ZodCheckFiniteDef extends $ZodCheckDef { // check: "finite"; // } // export interface $ZodCheckFinite extends $ZodCheckInternals<number> { // _def: $ZodCheckFiniteDef; // _issc: // | errors.$ZodIssueTooBig<"number", number> // | errors.$ZodIssueTooSmall<"number", number>; // } // export const $ZodCheckFinite: core.$constructor<$ZodCheckFinite> = // core.$constructor("$ZodCheckFinite", (inst, def) => { // $ZodCheck.init(inst, def); // inst._zod.onattach = (inst) => { // inst["_bag"].finite = true; // }; // inst._zod.check = (payload) => { // if (Number.isFinite(payload.value)) return; // payload.issues.push({ // origin: "number", // ...(payload.value === Number.POSITIVE_INFINITY // ? { // code: "too_big", // maximum: Number.POSITIVE_INFINITY, // } // : { // code: "too_small", // minimum: Number.NEGATIVE_INFINITY, // }), // // code: payload.value === Number.POSITIVE_INFINITY ? "too_big" : "too_big", // // maximum: Number.POSITIVE_INFINITY, // inclusive: false, // input: payload.value, // inst, // }); // }; // }); /////////////////////////////////////// ///// $ZodCheckNumberFormat ///// /////////////////////////////////////// export type $ZodNumberFormats = "int32" | "uint32" | "float32" | "float64" | "safeint"; export interface $ZodCheckNumberFormatDef extends $ZodCheckDef { check: "number_format"; format: $ZodNumberFormats; // abort?: boolean; } export interface $ZodCheckNumberFormatInternals extends $ZodCheckInternals<number> { def: $ZodCheckNumberFormatDef; issc: errors.$ZodIssueInvalidType | errors.$ZodIssueTooBig<"number"> | errors.$ZodIssueTooSmall<"number">; // bag: util.LoosePartial<{ // minimum?: number | undefined; // }>; } export interface $ZodCheckNumberFormat extends $ZodCheck<number> { _zod: $ZodCheckNumberFormatInternals; } export const $ZodCheckNumberFormat: core.$constructor<$ZodCheckNumberFormat> = /*@__PURE__*/ core.$constructor( "$ZodCheckNumberFormat", (inst, def) => { $ZodCheck.init(inst, def); // no format checks def.format = def.format || "float64"; const isInt = def.format?.includes("int"); const origin = isInt ? "int" : "number"; const [minimum, maximum] = util.NUMBER_FORMAT_RANGES[def.format]; inst._zod.onattach.push((inst) => { const bag = inst._zod.bag; bag.format = def.format; bag.minimum = minimum; bag.maximum = maximum; if (isInt) bag.pattern = regexes.integer; }); inst._zod.check = (payload) => { const input = payload.value; if (isInt) { if (!Number.isInteger(input)) { // invalid_format issue // payload.issues.push({ // expected: def.format, // format: def.format, // code: "invalid_format", // input, // inst, // }); // invalid_type issue payload.issues.push({ expected: origin, format: def.format, code: "invalid_type", input, inst, }); return; // not_multiple_of issue // payload.issues.push({ // code: "not_multiple_of", // origin: "number", // input, // inst, // divisor: 1, // }); } if (!Number.isSafeInteger(input)) { if (input > 0) { // too_big payload.issues.push({ input, code: "too_big", maximum: Number.MAX_SAFE_INTEGER, note: "Integers must be within the safe integer range.", inst, origin, continue: !def.abort, }); } else { // too_small payload.issues.push({ input, code: "too_small", minimum: Number.MIN_SAFE_INTEGER, note: "Integers must be within the safe integer range.", inst, origin, continue: !def.abort, }); } return; } } if (input < minimum) { payload.issues.push({ origin: "number", input, code: "too_small", minimum, inclusive: true, inst, continue: !def.abort, }); } if (input > maximum) { payload.issues.push({ origin: "number", input, code: "too_big", maximum, inst, } as any); } }; } ); ///////////////////////////////////// ///// $ZodCheckBigIntFormat ///// ///////////////////////////////////// export type $ZodBigIntFormats = "int64" | "uint64"; export interface $ZodCheckBigIntFormatDef extends $ZodCheckDef { check: "bigint_format"; format: $ZodBigIntFormats | undefined; } export interface $ZodCheckBigIntFormatInternals extends $ZodCheckInternals<bigint> { def: $ZodCheckBigIntFormatDef; issc: errors.$ZodIssueTooBig<"bigint"> | errors.$ZodIssueTooSmall<"bigint">; } export interface $ZodCheckBigIntFormat extends $ZodCheck<bigint> { _zod: $ZodCheckBigIntFormatInternals; } export const $ZodCheckBigIntFormat: core.$constructor<$ZodCheckBigIntFormat> = /*@__PURE__*/ core.$constructor( "$ZodCheckBigIntFormat", (inst, def) => { $ZodCheck.init(inst, def); // no format checks const [minimum, maximum] = util.BIGINT_FORMAT_RANGES[def.format!]; inst._zod.onattach.push((inst) => { const bag = inst._zod.bag; bag.format = def.format; bag.minimum = minimum; bag.maximum = maximum; }); inst._zod.check = (payload) => { const input = payload.value; if (input < minimum) { payload.issues.push({ origin: "bigint", input, code: "too_small", minimum: minimum as any, inclusive: true, inst, continue: !def.abort, }); } if (input > maximum) { payload.issues.push({ origin: "bigint", input, code: "too_big", maximum, inst, } as any); } }; } ); ////////////////////////////////// ///// $ZodCheckMaxSize ///// ////////////////////////////////// export interface $ZodCheckMaxSizeDef extends $ZodCheckDef { check: "max_size"; maximum: number; } export interface $ZodCheckMaxSizeInternals<T extends util.HasSize = util.HasSize> extends $ZodCheckInternals<T> { def: $ZodCheckMaxSizeDef; issc: errors.$ZodIssueTooBig<T>; } export interface $ZodCheckMaxSize<T extends util.HasSize = util.HasSize> extends $ZodCheck<T> { _zod: $ZodCheckMaxSizeInternals<T>; } export const $ZodCheckMaxSize: core.$constructor<$ZodCheckMaxSize> = /*@__PURE__*/ core.$constructor( "$ZodCheckMaxSize", (inst, def) => { $ZodCheck.init(inst, def); inst._zod.def.when ??= (payload) => { const val = payload.value; return !util.nullish(val) && (val as any).size !== undefined; }; inst._zod.onattach.push((inst) => { const curr = (inst._zod.bag.maximum ?? Number.POSITIVE_INFINITY) as number; if (def.maximum < curr) inst._zod.bag.maximum = def.maximum; }); inst._zod.check = (payload) => { const input = payload.value; const size = input.size; if (size <= def.maximum) return; payload.issues.push({ origin: util.getSizableOrigin(input), code: "too_big", maximum: def.maximum, input, inst, continue: !def.abort, }); }; } ); ////////////////////////////////// ///// $ZodCheckMinSize ///// ////////////////////////////////// export interface $ZodCheckMinSizeDef extends $ZodCheckDef { check: "min_size"; minimum: number; } export interface $ZodCheckMinSizeInternals<T extends util.HasSize = util.HasSize> extends $ZodCheckInternals<T> { def: $ZodCheckMinSizeDef; issc: errors.$ZodIssueTooSmall<T>; } export interface $ZodCheckMinSize<T extends util.HasSize = util.HasSize> extends $ZodCheck<T> { _zod: $ZodCheckMinSizeInternals<T>; } export const $ZodCheckMinSize: core.$constructor<$ZodCheckMinSize> = /*@__PURE__*/ core.$constructor( "$ZodCheckMinSize", (inst, def) => { $ZodCheck.init(inst, def); inst._zod.def.when ??= (payload) => { const val = payload.value; return !util.nullish(val) && (val as any).size !== undefined; }; inst._zod.onattach.push((inst) => { const curr = (inst._zod.bag.minimum ?? Number.NEGATIVE_INFINITY) as number; if (def.minimum > curr) inst._zod.bag.minimum = def.minimum; }); inst._zod.check = (payload) => { const input = payload.value; const size = input.size; if (size >= def.minimum) return; payload.issues.push({ origin: util.getSizableOrigin(input), code: "too_small", minimum: def.minimum, input, inst, continue: !def.abort, }); }; } ); ///////////////////////////////////// ///// $ZodCheckSizeEquals ///// ///////////////////////////////////// export interface $ZodCheckSizeEqualsDef extends $ZodCheckDef { check: "size_equals"; size: number; } export interface $ZodCheckSizeEqualsInternals<T extends util.HasSize = util.HasSize> extends $ZodCheckInternals<T> { def: $ZodCheckSizeEqualsDef; issc: errors.$ZodIssueTooBig<T> | errors.$ZodIssueTooSmall<T>; } export interface $ZodCheckSizeEquals<T extends util.HasSize = util.HasSize> extends $ZodCheck<T> { _zod: $ZodCheckSizeEqualsInternals<T>; } export const $ZodCheckSizeEquals: core.$constructor<$ZodCheckSizeEquals> = /*@__PURE__*/ core.$constructor( "$ZodCheckSizeEquals", (inst, def) => { $ZodCheck.init(inst, def); inst._zod.def.when ??= (payload) => { const val = payload.value; return !util.nullish(val) && (val as any).size !== undefined; }; inst._zod.onattach.push((inst) => { const bag = inst._zod.bag; bag.minimum = def.size; bag.maximum = def.size; bag.size = def.size; }); inst._zod.check = (payload) => { const input = payload.value; const size = input.size; if (size === def.size) return; const tooBig = size > def.size; payload.issues.push({ origin: util.getSizableOrigin(input), ...(tooBig ? { code: "too_big", maximum: def.size } : { code: "too_small", minimum: def.size }), inclusive: true, exact: true, input: payload.value, inst, continue: !def.abort, }); }; } ); ////////////////////////////////// ///// $ZodCheckMaxLength ///// ////////////////////////////////// export interface $ZodCheckMaxLengthDef extends $ZodCheckDef { check: "max_length"; maximum: number; } export interface $ZodCheckMaxLengthInternals<T extends util.HasLength = util.HasLength> extends $ZodCheckInternals<T> { def: $ZodCheckMaxLengthDef; issc: errors.$ZodIssueTooBig<T>; } export interface $ZodCheckMaxLength<T extends util.HasLength = util.HasLength> extends $ZodCheck<T> { _zod: $ZodCheckMaxLengthInternals<T>; } export const $ZodCheckMaxLength: core.$constructor<$ZodCheckMaxLength> = /*@__PURE__*/ core.$constructor( "$ZodCheckMaxLength", (inst, def) => { $ZodCheck.init(inst, def); inst._zod.def.when ??= (payload) => { const val = payload.value; return !util.nullish(val) && (val as any).length !== undefined; }; inst._zod.onattach.push((inst) => { const curr = (inst._zod.bag.maximum ?? Number.POSITIVE_INFINITY) as number; if (def.maximum < curr) inst._zod.bag.maximum = def.maximum; }); inst._zod.check = (payload) => { const input = payload.value; const length = input.length; if (length <= def.maximum) return; const origin = util.getLengthableOrigin(input); payload.issues.push({ origin, code: "too_big", maximum: def.maximum, inclusive: true, input, inst, continue: !def.abort, }); }; } ); ////////////////////////////////// ///// $ZodCheckMinLength ///// ////////////////////////////////// export interface $ZodCheckMinLengthDef extends $ZodCheckDef { check: "min_length"; minimum: number; } export interface $ZodCheckMinLengthInternals<T extends util.HasLength = util.HasLength> extends $ZodCheckInternals<T> { def: $ZodCheckMinLengthDef; issc: errors.$ZodIssueTooSmall<T>; } export interface $ZodCheckMinLength<T extends util.HasLength = util.HasLength> extends $ZodCheck<T> { _zod: $ZodCheckMinLengthInternals<T>; } export const $ZodCheckMinLength: core.$constructor<$ZodCheckMinLength> = /*@__PURE__*/ core.$constructor( "$ZodCheckMinLength", (inst, def) => { $ZodCheck.init(inst, def); inst._zod.def.when ??= (payload) => { const val = payload.value; return !util.nullish(val) && (val as any).length !== undefined; }; inst._zod.onattach.push((inst) => { const curr = (inst._zod.bag.minimum ?? Number.NEGATIVE_INFINITY) as number; if (def.minimum > curr) inst._zod.bag.minimum = def.minimum; }); inst._zod.check = (payload) => { const input = payload.value; const length = input.length; if (length >= def.minimum) return; const origin = util.getLengthableOrigin(input); payload.issues.push({ origin, code: "too_small", minimum: def.minimum, inclusive: true, input, inst, continue: !def.abort, }); }; } ); ///////////////////////////////////// ///// $ZodCheckLengthEquals ///// ///////////////////////////////////// export interface $ZodCheckLengthEqualsDef extends $ZodCheckDef { check: "length_equals"; length: number; } export interface $ZodCheckLengthEqualsInternals<T extends util.HasLength = util.HasLength> extends $ZodCheckInternals<T> { def: $ZodCheckLengthEqualsDef; issc: errors.$ZodIssueTooBig<T> | errors.$ZodIssueTooSmall<T>; } export interface $ZodCheckLengthEquals<T extends util.HasLength = util.HasLength> extends $ZodCheck<T> { _zod: $ZodCheckLengthEqualsInternals<T>; } export const $ZodCheckLengthEquals: core.$constructor<$ZodCheckLengthEquals> = /*@__PURE__*/ core.$constructor( "$ZodCheckLengthEquals", (inst, def) => { $ZodCheck.init(inst, def); inst._zod.def.when ??= (payload) => { const val = payload.value; return !util.nullish(val) && (val as any).length !== undefined; }; inst._zod.onattach.push((inst) => { const bag = inst._zod.bag; bag.minimum = def.length; bag.maximum = def.length; bag.length = def.length; }); inst._zod.check = (payload) => { const input = payload.value; const length = input.length; if (length === def.length) return; const origin = util.getLengthableOrigin(input); const tooBig = length > def.length; payload.issues.push({ origin, ...(tooBig ? { code: "too_big", maximum: def.length } : { code: "too_small", minimum: def.length }), inclusive: true, exact: true, input: payload.value, inst, continue: !def.abort, }); }; } ); ///////////////////////////////////////////// ///// $ZodCheckStringFormatRegex ///// ///////////////////////////////////////////// export type $ZodStringFormats = | "email" | "url" | "emoji" | "uuid" | "guid" | "nanoid" | "cuid" | "cuid2" | "ulid" | "xid" | "ksuid" | "datetime" | "date" | "time" | "duration" | "ipv4" | "ipv6" | "cidrv4" | "cidrv6" | "base64" | "base64url" | "json_string" | "e164" | "lowercase" | "uppercase" | "regex" | "jwt" | "starts_with" | "ends_with" | "includes"; export interface $ZodCheckStringFormatDef<Format extends string = string> extends $ZodCheckDef { check: "string_format"; format: Format; pattern?: RegExp | undefined; } export interface $ZodCheckStringFormatInternals extends $ZodCheckInternals<string> { def: $ZodCheckStringFormatDef; issc: errors.$ZodIssueInvalidStringFormat; } export interface $ZodCheckStringFormat extends $ZodCheck<string> { _zod: $ZodCheckStringFormatInternals; } export const $ZodCheckStringFormat: core.$constructor<$ZodCheckStringFormat> = /*@__PURE__*/ core.$constructor( "$ZodCheckStringFormat", (inst, def) => { $ZodCheck.init(inst, def); inst._zod.onattach.push((inst) => { const bag = inst._zod.bag as schemas.$ZodStringInternals<unknown>["bag"]; bag.format = def.format; if (def.pattern) { bag.patterns ??= new Set(); bag.patterns.add(def.pattern); } }); if (def.pattern) inst._zod.check ??= (payload) => { def.pattern!.lastIndex = 0; if (def.pattern!.test(payload.value)) return; payload.issues.push({ origin: "string", code: "invalid_format", format: def.format, input: payload.value, ...(def.pattern ? { pattern: def.pattern.toString() } : {}), inst, continue: !def.abort, }); }; else inst._zod.check ??= () => {}; } ); //////////////////////////////// ///// $ZodCheckRegex ///// //////////////////////////////// export interface $ZodCheckRegexDef extends $ZodCheckStringFormatDef { format: "regex"; pattern: RegExp; } export interface $ZodCheckRegexInternals extends $ZodCheckInternals<string> { def: $ZodCheckRegexDef; issc: errors.$ZodIssueInvalidStringFormat; } export interface $ZodCheckRegex extends $ZodCheck<string> { _zod: $ZodCheckRegexInternals; } export const $ZodCheckRegex: core.$constructor<$ZodCheckRegex> = /*@__PURE__*/ core.$constructor( "$ZodCheckRegex", (inst, def) => { $ZodCheckStringFormat.init(inst, def); inst._zod.check = (payload) => { def.pattern.lastIndex = 0; if (def.pattern.test(payload.value)) return; payload.issues.push({ origin: "string", code: "invalid_format", format: "regex", input: payload.value, pattern: def.pattern.toString(), inst, continue: !def.abort, }); }; } ); /////////////////////////////////// ///// $ZodCheckJSONString ///// /////////////////////////////////// // interface $ZodCheckJSONStringDef extends $ZodCheckStringFormatDef<"json_string"> { // // check: "string_format"; // // format: "json_string"; // // error?: errors.$ZodErrorMap<errors.$ZodIssueInvalidStringFormat> | undefined; // } // export interface $ZodCheckJSONString extends $ZodCheckStringFormat { // _def: $ZodCheckJSONStringDef; // } // export const $ZodCheckJSONString: core.$constructor<$ZodCheckJSONString> = /*@__PURE__*/ core.$constructor( // "$ZodCheckJSONString", // (inst, def) => { // $ZodCheck.init(inst, def); // inst._zod.check = (payload) => { // try { // JSON.parse(payload.value); // return; // } catch (_) { // payload.issues.push({ // origin: "string", // code: "invalid_format", // format: def.format, // input: payload.value, // inst, // continue: !def.abort, // }); // } // }; // } // ); ////////////////////////////////////// ///// $ZodCheckLowerCase ///// ////////////////////////////////////// export interface $ZodCheckLowerCaseDef extends $ZodCheckStringFormatDef<"lowercase"> {} export interface $ZodCheckLowerCaseInternals extends $ZodCheckInternals<string> { def: $ZodCheckLowerCaseDef; issc: errors.$ZodIssueInvalidStringFormat; } export interface $ZodCheckLowerCase extends $ZodCheck<string> { _zod: $ZodCheckLowerCaseInternals; } export const $ZodCheckLowerCase: core.$constructor<$ZodCheckLowerCase> = /*@__PURE__*/ core.$constructor( "$ZodCheckLowerCase", (inst, def) => { def.pattern ??= regexes.lowercase; $ZodCheckStringFormat.init(inst, def); } ); ////////////////////////////////////// ///// $ZodCheckUpperCase ///// ////////////////////////////////////// export interface $ZodCheckUpperCaseDef extends $ZodCheckStringFormatDef<"uppercase"> {} export interface $ZodCheckUpperCaseInternals extends $ZodCheckInternals<string> { def: $ZodCheckUpperCaseDef; issc: errors.$ZodIssueInvalidStringFormat; } export interface $ZodCheckUpperCase extends $ZodCheck<string> { _zod: $ZodCheckUpperCaseInternals; } export const $ZodCheckUpperCase: core.$constructor<$ZodCheckUpperCase> = /*@__PURE__*/ core.$constructor( "$ZodCheckUpperCase", (inst, def) => { def.pattern ??= regexes.uppercase; $ZodCheckStringFormat.init(inst, def); } ); /////////////////////////////////// ///// $ZodCheckIncludes ///// /////////////////////////////////// export interface $ZodCheckIncludesDef extends $ZodCheckStringFormatDef<"includes"> { includes: string; position?: number | undefined; } export interface $ZodCheckIncludesInternals extends $ZodCheckInternals<string> { def: $ZodCheckIncludesDef; issc: errors.$ZodIssueInvalidStringFormat; } export interface $ZodCheckIncludes extends $ZodCheck<string> { _zod: $ZodCheckIncludesInternals; } export const $ZodCheckIncludes: core.$constructor<$ZodCheckIncludes> = /*@__PURE__*/ core.$constructor( "$ZodCheckIncludes", (inst, def) => { $ZodCheck.init(inst, def); const escapedRegex = util.escapeRegex(def.includes); const pattern = new RegExp(typeof def.position === "number" ? `^.{${def.position}}${escapedRegex}` : escapedRegex); def.pattern = pattern; inst._zod.onattach.push((inst) => { const bag = inst._zod.bag as schemas.$ZodStringInternals<unknown>["bag"]; bag.patterns ??= new Set(); bag.patterns.add(pattern); }); inst._zod.check = (payload) => { if (payload.value.includes(def.includes, def.position)) return; payload.issues.push({ origin: "string", code: "invalid_format", format: "includes", includes: def.includes, input: payload.value, inst, continue: !def.abort, }); }; } ); ///////////////////////////////////// ///// $ZodCheckStartsWith ///// ///////////////////////////////////// export interface $ZodCheckStartsWithDef extends $ZodCheckStringFormatDef<"starts_with"> { prefix: string; } export interface $ZodCheckStartsWithInternals extends $ZodCheckInternals<string> { def: $ZodCheckStartsWithDef; issc: errors.$ZodIssueInvalidStringFormat; } export interface $ZodCheckStartsWith extends $ZodCheck<string> { _zod: $ZodCheckStartsWithInternals; } export const $ZodCheckStartsWith: core.$constructor<$ZodCheckStartsWith> = /*@__PURE__*/ core.$constructor( "$ZodCheckStartsWith", (inst, def) => { $ZodCheck.init(inst, def); const pattern = new RegExp(`^${util.escapeRegex(def.prefix)}.*`); def.pattern ??= pattern; inst._zod.onattach.push((inst) => { const bag = inst._zod.bag as schemas.$ZodStringInternals<unknown>["bag"]; bag.patterns ??= new Set(); bag.patterns.add(pattern); }); inst._zod.check = (payload) => { if (payload.value.startsWith(def.prefix)) return; payload.issues.push({ origin: "string", code: "invalid_format", format: "starts_with", prefix: def.prefix, input: payload.value, inst, continue: !def.abort, }); }; } ); ////////////////////////////////// ///// $ZodCheckEndsWith ///// ////////////////////////////////// export interface $ZodCheckEndsWithDef extends $ZodCheckStringFormatDef<"ends_with"> { suffix: string; } export interface $ZodCheckEndsWithInternals extends $ZodCheckInternals<string> { def: $ZodCheckEndsWithDef; issc: errors.$ZodIssueInvalidStringFormat; } export interface $ZodCheckEndsWith extends $ZodCheckInternals<string> { _zod: $ZodCheckEndsWithInternals; } export const $ZodCheckEndsWith: core.$constructor<$ZodCheckEndsWith> = /*@__PURE__*/ core.$constructor( "$ZodCheckEndsWith", (inst, def) => { $ZodCheck.init(inst, def); const pattern = new RegExp(`.*${util.escapeRegex(def.suffix)}$`); def.pattern ??= pattern; inst._zod.onattach.push((inst) => { const bag = inst._zod.bag as schemas.$ZodStringInternals<unknown>["bag"]; bag.patterns ??= new Set(); bag.patterns.add(pattern); }); inst._zod.check = (payload) => { if (payload.value.endsWith(def.suffix)) return; payload.issues.push({ origin: "string", code: "invalid_format", format: "ends_with", suffix: def.suffix, input: payload.value, inst, continue: !def.abort, }); }; } ); /////////////////////////////////// ///// $ZodCheckProperty ///// /////////////////////////////////// function handleCheckPropertyResult( result: schemas.ParsePayload<unknown>, payload: schemas.ParsePayload<unknown>, property: string ) { if (result.issues.length) { payload.issues.push(...util.prefixIssues(property, result.issues)); } } export interface $ZodCheckPropertyDef extends $ZodCheckDef { check: "property"; property: string; schema: schemas.$ZodType; } export interface $ZodCheckPropertyInternals<T extends object = object> extends $ZodCheckInternals<T> { def: $ZodCheckPropertyDef; issc: errors.$ZodIssue; } export interface $ZodCheckProperty<T extends object = object> extends $ZodCheck<T> { _zod: $ZodCheckPropertyInternals<T>; } export const $ZodCheckProperty: core.$constructor<$ZodCheckProperty> = /*@__PURE__*/ core.$constructor( "$ZodCheckProperty", (inst, def) => { $ZodCheck.init(inst, def); inst._zod.check = (payload) => { const result = def.schema._zod.run( { value: (payload.value as any)[def.property], issues: [], }, {} ); if (result instanceof Promise) { return result.then((result) => handleCheckPropertyResult(result, payload, def.property)); } handleCheckPropertyResult(result, payload, def.property); return; }; } ); /////////////////////////////////// ///// $ZodCheckMimeType ///// /////////////////////////////////// export interface $ZodCheckMimeTypeDef extends $ZodCheckDef { check: "mime_type"; mime: util.MimeTypes[]; } export interface $ZodCheckMimeTypeInternals<T extends File = File> extends $ZodCheckInternals<T> { def: $ZodCheckMimeTypeDef; issc: errors.$ZodIssueInvalidValue; } export interface $ZodCheckMimeType<T extends File = File> extends $ZodCheck<T> { _zod: $ZodCheckMimeTypeInternals<T>; } export const $ZodCheckMimeType: core.$constructor<$ZodCheckMimeType> = /*@__PURE__*/ core.$constructor( "$ZodCheckMimeType", (inst, def) => { $ZodCheck.init(inst, def); const mimeSet = new Set(def.mime); inst._zod.onattach.push((inst) => { inst._zod.bag.mime = def.mime; }); inst._zod.check = (payload) => { if (mimeSet.has(payload.value.type)) return; payload.issues.push({ code: "invalid_value", values: def.mime, input: payload.value.type, inst, }); }; } ); /////////////////////////////////// ///// $ZodCheckFileName ///// /////////////////////////////////// // interface $ZodCheckFileNameDef extends $ZodCheckDef { // check: "file_name"; // fileName: string; // error?: errors.$ZodErrorMap<errors.$ZodIssueInvalidType> | undefined; // } // export interface $ZodCheckFileName<T extends File = File> // extends $ZodCheckInternals<T> { // _def: $ZodCheckFileNameDef; // } // export const $ZodCheckFileName: core.$constructor<$ZodCheckFileName> = // core.$constructor("$ZodCheckFileName", (inst, def) => { // $ZodCheck.init(inst, def); // inst._zod.check = (payload) => { // if (def.fileName === payload.value.name) return; // payload.issues.push({ // origin: "file", // code: "invalid_value", // options: [def.fileName], // input: payload.value, // path: ["name"], // inst, // }); // }; // }); /////////////////////////////////// ///// $ZodCheckOverwrite ///// /////////////////////////////////// export interface $ZodCheckOverwriteDef<T = unknown> extends $ZodCheckDef { check: "overwrite"; tx(value: T): T; } export interface $ZodCheckOverwriteInternals<T = unknown> extends $ZodCheckInternals<T> { def: $ZodCheckOverwriteDef<T>; issc: never; } export interface $ZodCheckOverwrite<T = unknown> extends $ZodCheck<T> { _zod: $ZodCheckOverwriteInternals<T>; } export const $ZodCheckOverwrite: core.$constructor<$ZodCheckOverwrite> = /*@__PURE__*/ core.$constructor( "$ZodCheckOverwrite", (inst, def) => { $ZodCheck.init(inst, def); inst._zod.check = (payload) => { payload.value = def.tx(payload.value); }; } ); // /////////////////////////////// // ///// $ZodCheckTrim ///// // /////////////////////////////// // export interface $ZodCheckTrimDef extends $ZodCheckDef { // check: "trim"; // error?: errors.$ZodErrorMap<never> | undefined; // } // export interface $ZodCheckTrim extends $ZodCheckInternals<string> { // _def: $ZodCheckTrimDef; // } // export const $ZodCheckTrim: core.$constructor<$ZodCheckTrim> = // core.$constructor("$ZodCheckTrim", (inst, def) => { // $ZodCheck.init(inst, def); // inst._zod.check = (payload) => { // payload.value = payload.value.trim(); // }; // }); // ////////////////////////////////////// // ///// $ZodCheckNormalize ///// // ////////////////////////////////////// // interface $ZodCheckNormalizeDef extends $ZodCheckDef { // check: "normalize"; // error?: errors.$ZodErrorMap<never> | undefined; // } // export interface $ZodCheckNormalize extends $ZodCheckInternals<string> { // _def: $ZodCheckNormalizeDef; // } // export const $ZodCheckNormalize: core.$constructor<$ZodCheckNormalize> = // core.$constructor("$ZodCheckNormalize", (inst, def) => { // $ZodCheck.init(inst, def); // inst._zod.check = (payload) => { // payload.value = payload.value.normalize(); // }; // }); export type $ZodChecks = | $ZodCheckLessThan | $ZodCheckGreaterThan | $ZodCheckMultipleOf | $ZodCheckNumberFormat | $ZodCheckBigIntFormat | $ZodCheckMaxSize | $ZodCheckMinSize | $ZodCheckSizeEquals | $ZodCheckMaxLength | $ZodCheckMinLength | $ZodCheckLengthEquals | $ZodCheckStringFormat | $ZodCheckProperty | $ZodCheckMimeType | $ZodCheckOverwrite; export type $ZodStringFormatChecks = | $ZodCheckRegex | $ZodCheckLowerCase | $ZodCheckUpperCase | $ZodCheckIncludes | $ZodCheckStartsWith | $ZodCheckEndsWith | schemas.$ZodStringFormatTypes; // union of string format schema types