Spaces:
Configuration error
Configuration error
(function (global, factory) { | |
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : | |
typeof define === 'function' && define.amd ? define(['exports'], factory) : | |
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Zod = {})); | |
})(this, (function (exports) { 'use strict'; | |
exports.util = void 0; | |
(function (util) { | |
util.assertEqual = (val) => val; | |
function assertIs(_arg) { } | |
util.assertIs = assertIs; | |
function assertNever(_x) { | |
throw new Error(); | |
} | |
util.assertNever = assertNever; | |
util.arrayToEnum = (items) => { | |
const obj = {}; | |
for (const item of items) { | |
obj[item] = item; | |
} | |
return obj; | |
}; | |
util.getValidEnumValues = (obj) => { | |
const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== "number"); | |
const filtered = {}; | |
for (const k of validKeys) { | |
filtered[k] = obj[k]; | |
} | |
return util.objectValues(filtered); | |
}; | |
util.objectValues = (obj) => { | |
return util.objectKeys(obj).map(function (e) { | |
return obj[e]; | |
}); | |
}; | |
util.objectKeys = typeof Object.keys === "function" // eslint-disable-line ban/ban | |
? (obj) => Object.keys(obj) // eslint-disable-line ban/ban | |
: (object) => { | |
const keys = []; | |
for (const key in object) { | |
if (Object.prototype.hasOwnProperty.call(object, key)) { | |
keys.push(key); | |
} | |
} | |
return keys; | |
}; | |
util.find = (arr, checker) => { | |
for (const item of arr) { | |
if (checker(item)) | |
return item; | |
} | |
return undefined; | |
}; | |
util.isInteger = typeof Number.isInteger === "function" | |
? (val) => Number.isInteger(val) // eslint-disable-line ban/ban | |
: (val) => typeof val === "number" && isFinite(val) && Math.floor(val) === val; | |
function joinValues(array, separator = " | ") { | |
return array | |
.map((val) => (typeof val === "string" ? `'${val}'` : val)) | |
.join(separator); | |
} | |
util.joinValues = joinValues; | |
util.jsonStringifyReplacer = (_, value) => { | |
if (typeof value === "bigint") { | |
return value.toString(); | |
} | |
return value; | |
}; | |
})(exports.util || (exports.util = {})); | |
exports.objectUtil = void 0; | |
(function (objectUtil) { | |
objectUtil.mergeShapes = (first, second) => { | |
return { | |
...first, | |
...second, // second overwrites first | |
}; | |
}; | |
})(exports.objectUtil || (exports.objectUtil = {})); | |
const ZodParsedType = exports.util.arrayToEnum([ | |
"string", | |
"nan", | |
"number", | |
"integer", | |
"float", | |
"boolean", | |
"date", | |
"bigint", | |
"symbol", | |
"function", | |
"undefined", | |
"null", | |
"array", | |
"object", | |
"unknown", | |
"promise", | |
"void", | |
"never", | |
"map", | |
"set", | |
]); | |
const getParsedType = (data) => { | |
const t = typeof data; | |
switch (t) { | |
case "undefined": | |
return ZodParsedType.undefined; | |
case "string": | |
return ZodParsedType.string; | |
case "number": | |
return isNaN(data) ? ZodParsedType.nan : ZodParsedType.number; | |
case "boolean": | |
return ZodParsedType.boolean; | |
case "function": | |
return ZodParsedType.function; | |
case "bigint": | |
return ZodParsedType.bigint; | |
case "symbol": | |
return ZodParsedType.symbol; | |
case "object": | |
if (Array.isArray(data)) { | |
return ZodParsedType.array; | |
} | |
if (data === null) { | |
return ZodParsedType.null; | |
} | |
if (data.then && | |
typeof data.then === "function" && | |
data.catch && | |
typeof data.catch === "function") { | |
return ZodParsedType.promise; | |
} | |
if (typeof Map !== "undefined" && data instanceof Map) { | |
return ZodParsedType.map; | |
} | |
if (typeof Set !== "undefined" && data instanceof Set) { | |
return ZodParsedType.set; | |
} | |
if (typeof Date !== "undefined" && data instanceof Date) { | |
return ZodParsedType.date; | |
} | |
return ZodParsedType.object; | |
default: | |
return ZodParsedType.unknown; | |
} | |
}; | |
const ZodIssueCode = exports.util.arrayToEnum([ | |
"invalid_type", | |
"invalid_literal", | |
"custom", | |
"invalid_union", | |
"invalid_union_discriminator", | |
"invalid_enum_value", | |
"unrecognized_keys", | |
"invalid_arguments", | |
"invalid_return_type", | |
"invalid_date", | |
"invalid_string", | |
"too_small", | |
"too_big", | |
"invalid_intersection_types", | |
"not_multiple_of", | |
"not_finite", | |
]); | |
const quotelessJson = (obj) => { | |
const json = JSON.stringify(obj, null, 2); | |
return json.replace(/"([^"]+)":/g, "$1:"); | |
}; | |
class ZodError extends Error { | |
constructor(issues) { | |
super(); | |
this.issues = []; | |
this.addIssue = (sub) => { | |
this.issues = [...this.issues, sub]; | |
}; | |
this.addIssues = (subs = []) => { | |
this.issues = [...this.issues, ...subs]; | |
}; | |
const actualProto = new.target.prototype; | |
if (Object.setPrototypeOf) { | |
// eslint-disable-next-line ban/ban | |
Object.setPrototypeOf(this, actualProto); | |
} | |
else { | |
this.__proto__ = actualProto; | |
} | |
this.name = "ZodError"; | |
this.issues = issues; | |
} | |
get errors() { | |
return this.issues; | |
} | |
format(_mapper) { | |
const mapper = _mapper || | |
function (issue) { | |
return issue.message; | |
}; | |
const fieldErrors = { _errors: [] }; | |
const processError = (error) => { | |
for (const issue of error.issues) { | |
if (issue.code === "invalid_union") { | |
issue.unionErrors.map(processError); | |
} | |
else if (issue.code === "invalid_return_type") { | |
processError(issue.returnTypeError); | |
} | |
else if (issue.code === "invalid_arguments") { | |
processError(issue.argumentsError); | |
} | |
else if (issue.path.length === 0) { | |
fieldErrors._errors.push(mapper(issue)); | |
} | |
else { | |
let curr = fieldErrors; | |
let i = 0; | |
while (i < issue.path.length) { | |
const el = issue.path[i]; | |
const terminal = i === issue.path.length - 1; | |
if (!terminal) { | |
curr[el] = curr[el] || { _errors: [] }; | |
// if (typeof el === "string") { | |
// curr[el] = curr[el] || { _errors: [] }; | |
// } else if (typeof el === "number") { | |
// const errorArray: any = []; | |
// errorArray._errors = []; | |
// curr[el] = curr[el] || errorArray; | |
// } | |
} | |
else { | |
curr[el] = curr[el] || { _errors: [] }; | |
curr[el]._errors.push(mapper(issue)); | |
} | |
curr = curr[el]; | |
i++; | |
} | |
} | |
} | |
}; | |
processError(this); | |
return fieldErrors; | |
} | |
toString() { | |
return this.message; | |
} | |
get message() { | |
return JSON.stringify(this.issues, exports.util.jsonStringifyReplacer, 2); | |
} | |
get isEmpty() { | |
return this.issues.length === 0; | |
} | |
flatten(mapper = (issue) => issue.message) { | |
const fieldErrors = {}; | |
const formErrors = []; | |
for (const sub of this.issues) { | |
if (sub.path.length > 0) { | |
fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || []; | |
fieldErrors[sub.path[0]].push(mapper(sub)); | |
} | |
else { | |
formErrors.push(mapper(sub)); | |
} | |
} | |
return { formErrors, fieldErrors }; | |
} | |
get formErrors() { | |
return this.flatten(); | |
} | |
} | |
ZodError.create = (issues) => { | |
const error = new ZodError(issues); | |
return error; | |
}; | |
const errorMap = (issue, _ctx) => { | |
let message; | |
switch (issue.code) { | |
case ZodIssueCode.invalid_type: | |
if (issue.received === ZodParsedType.undefined) { | |
message = "Required"; | |
} | |
else { | |
message = `Expected ${issue.expected}, received ${issue.received}`; | |
} | |
break; | |
case ZodIssueCode.invalid_literal: | |
message = `Invalid literal value, expected ${JSON.stringify(issue.expected, exports.util.jsonStringifyReplacer)}`; | |
break; | |
case ZodIssueCode.unrecognized_keys: | |
message = `Unrecognized key(s) in object: ${exports.util.joinValues(issue.keys, ", ")}`; | |
break; | |
case ZodIssueCode.invalid_union: | |
message = `Invalid input`; | |
break; | |
case ZodIssueCode.invalid_union_discriminator: | |
message = `Invalid discriminator value. Expected ${exports.util.joinValues(issue.options)}`; | |
break; | |
case ZodIssueCode.invalid_enum_value: | |
message = `Invalid enum value. Expected ${exports.util.joinValues(issue.options)}, received '${issue.received}'`; | |
break; | |
case ZodIssueCode.invalid_arguments: | |
message = `Invalid function arguments`; | |
break; | |
case ZodIssueCode.invalid_return_type: | |
message = `Invalid function return type`; | |
break; | |
case ZodIssueCode.invalid_date: | |
message = `Invalid date`; | |
break; | |
case ZodIssueCode.invalid_string: | |
if (typeof issue.validation === "object") { | |
if ("includes" in issue.validation) { | |
message = `Invalid input: must include "${issue.validation.includes}"`; | |
if (typeof issue.validation.position === "number") { | |
message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`; | |
} | |
} | |
else if ("startsWith" in issue.validation) { | |
message = `Invalid input: must start with "${issue.validation.startsWith}"`; | |
} | |
else if ("endsWith" in issue.validation) { | |
message = `Invalid input: must end with "${issue.validation.endsWith}"`; | |
} | |
else { | |
exports.util.assertNever(issue.validation); | |
} | |
} | |
else if (issue.validation !== "regex") { | |
message = `Invalid ${issue.validation}`; | |
} | |
else { | |
message = "Invalid"; | |
} | |
break; | |
case ZodIssueCode.too_small: | |
if (issue.type === "array") | |
message = `Array must contain ${issue.exact ? "exactly" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`; | |
else if (issue.type === "string") | |
message = `String must contain ${issue.exact ? "exactly" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`; | |
else if (issue.type === "number") | |
message = `Number must be ${issue.exact | |
? `exactly equal to ` | |
: issue.inclusive | |
? `greater than or equal to ` | |
: `greater than `}${issue.minimum}`; | |
else if (issue.type === "date") | |
message = `Date must be ${issue.exact | |
? `exactly equal to ` | |
: issue.inclusive | |
? `greater than or equal to ` | |
: `greater than `}${new Date(Number(issue.minimum))}`; | |
else | |
message = "Invalid input"; | |
break; | |
case ZodIssueCode.too_big: | |
if (issue.type === "array") | |
message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`; | |
else if (issue.type === "string") | |
message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`; | |
else if (issue.type === "number") | |
message = `Number must be ${issue.exact | |
? `exactly` | |
: issue.inclusive | |
? `less than or equal to` | |
: `less than`} ${issue.maximum}`; | |
else if (issue.type === "bigint") | |
message = `BigInt must be ${issue.exact | |
? `exactly` | |
: issue.inclusive | |
? `less than or equal to` | |
: `less than`} ${issue.maximum}`; | |
else if (issue.type === "date") | |
message = `Date must be ${issue.exact | |
? `exactly` | |
: issue.inclusive | |
? `smaller than or equal to` | |
: `smaller than`} ${new Date(Number(issue.maximum))}`; | |
else | |
message = "Invalid input"; | |
break; | |
case ZodIssueCode.custom: | |
message = `Invalid input`; | |
break; | |
case ZodIssueCode.invalid_intersection_types: | |
message = `Intersection results could not be merged`; | |
break; | |
case ZodIssueCode.not_multiple_of: | |
message = `Number must be a multiple of ${issue.multipleOf}`; | |
break; | |
case ZodIssueCode.not_finite: | |
message = "Number must be finite"; | |
break; | |
default: | |
message = _ctx.defaultError; | |
exports.util.assertNever(issue); | |
} | |
return { message }; | |
}; | |
let overrideErrorMap = errorMap; | |
function setErrorMap(map) { | |
overrideErrorMap = map; | |
} | |
function getErrorMap() { | |
return overrideErrorMap; | |
} | |
const makeIssue = (params) => { | |
const { data, path, errorMaps, issueData } = params; | |
const fullPath = [...path, ...(issueData.path || [])]; | |
const fullIssue = { | |
...issueData, | |
path: fullPath, | |
}; | |
let errorMessage = ""; | |
const maps = errorMaps | |
.filter((m) => !!m) | |
.slice() | |
.reverse(); | |
for (const map of maps) { | |
errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message; | |
} | |
return { | |
...issueData, | |
path: fullPath, | |
message: issueData.message || errorMessage, | |
}; | |
}; | |
const EMPTY_PATH = []; | |
function addIssueToContext(ctx, issueData) { | |
const issue = makeIssue({ | |
issueData: issueData, | |
data: ctx.data, | |
path: ctx.path, | |
errorMaps: [ | |
ctx.common.contextualErrorMap, | |
ctx.schemaErrorMap, | |
getErrorMap(), | |
errorMap, // then global default map | |
].filter((x) => !!x), | |
}); | |
ctx.common.issues.push(issue); | |
} | |
class ParseStatus { | |
constructor() { | |
this.value = "valid"; | |
} | |
dirty() { | |
if (this.value === "valid") | |
this.value = "dirty"; | |
} | |
abort() { | |
if (this.value !== "aborted") | |
this.value = "aborted"; | |
} | |
static mergeArray(status, results) { | |
const arrayValue = []; | |
for (const s of results) { | |
if (s.status === "aborted") | |
return INVALID; | |
if (s.status === "dirty") | |
status.dirty(); | |
arrayValue.push(s.value); | |
} | |
return { status: status.value, value: arrayValue }; | |
} | |
static async mergeObjectAsync(status, pairs) { | |
const syncPairs = []; | |
for (const pair of pairs) { | |
syncPairs.push({ | |
key: await pair.key, | |
value: await pair.value, | |
}); | |
} | |
return ParseStatus.mergeObjectSync(status, syncPairs); | |
} | |
static mergeObjectSync(status, pairs) { | |
const finalObject = {}; | |
for (const pair of pairs) { | |
const { key, value } = pair; | |
if (key.status === "aborted") | |
return INVALID; | |
if (value.status === "aborted") | |
return INVALID; | |
if (key.status === "dirty") | |
status.dirty(); | |
if (value.status === "dirty") | |
status.dirty(); | |
if (key.value !== "__proto__" && | |
(typeof value.value !== "undefined" || pair.alwaysSet)) { | |
finalObject[key.value] = value.value; | |
} | |
} | |
return { status: status.value, value: finalObject }; | |
} | |
} | |
const INVALID = Object.freeze({ | |
status: "aborted", | |
}); | |
const DIRTY = (value) => ({ status: "dirty", value }); | |
const OK = (value) => ({ status: "valid", value }); | |
const isAborted = (x) => x.status === "aborted"; | |
const isDirty = (x) => x.status === "dirty"; | |
const isValid = (x) => x.status === "valid"; | |
const isAsync = (x) => typeof Promise !== "undefined" && x instanceof Promise; | |
var errorUtil; | |
(function (errorUtil) { | |
errorUtil.errToObj = (message) => typeof message === "string" ? { message } : message || {}; | |
errorUtil.toString = (message) => typeof message === "string" ? message : message === null || message === void 0 ? void 0 : message.message; | |
})(errorUtil || (errorUtil = {})); | |
class ParseInputLazyPath { | |
constructor(parent, value, path, key) { | |
this._cachedPath = []; | |
this.parent = parent; | |
this.data = value; | |
this._path = path; | |
this._key = key; | |
} | |
get path() { | |
if (!this._cachedPath.length) { | |
if (this._key instanceof Array) { | |
this._cachedPath.push(...this._path, ...this._key); | |
} | |
else { | |
this._cachedPath.push(...this._path, this._key); | |
} | |
} | |
return this._cachedPath; | |
} | |
} | |
const handleResult = (ctx, result) => { | |
if (isValid(result)) { | |
return { success: true, data: result.value }; | |
} | |
else { | |
if (!ctx.common.issues.length) { | |
throw new Error("Validation failed but no issues detected."); | |
} | |
return { | |
success: false, | |
get error() { | |
if (this._error) | |
return this._error; | |
const error = new ZodError(ctx.common.issues); | |
this._error = error; | |
return this._error; | |
}, | |
}; | |
} | |
}; | |
function processCreateParams(params) { | |
if (!params) | |
return {}; | |
const { errorMap, invalid_type_error, required_error, description } = params; | |
if (errorMap && (invalid_type_error || required_error)) { | |
throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`); | |
} | |
if (errorMap) | |
return { errorMap: errorMap, description }; | |
const customMap = (iss, ctx) => { | |
if (iss.code !== "invalid_type") | |
return { message: ctx.defaultError }; | |
if (typeof ctx.data === "undefined") { | |
return { message: required_error !== null && required_error !== void 0 ? required_error : ctx.defaultError }; | |
} | |
return { message: invalid_type_error !== null && invalid_type_error !== void 0 ? invalid_type_error : ctx.defaultError }; | |
}; | |
return { errorMap: customMap, description }; | |
} | |
class ZodType { | |
constructor(def) { | |
/** Alias of safeParseAsync */ | |
this.spa = this.safeParseAsync; | |
this._def = def; | |
this.parse = this.parse.bind(this); | |
this.safeParse = this.safeParse.bind(this); | |
this.parseAsync = this.parseAsync.bind(this); | |
this.safeParseAsync = this.safeParseAsync.bind(this); | |
this.spa = this.spa.bind(this); | |
this.refine = this.refine.bind(this); | |
this.refinement = this.refinement.bind(this); | |
this.superRefine = this.superRefine.bind(this); | |
this.optional = this.optional.bind(this); | |
this.nullable = this.nullable.bind(this); | |
this.nullish = this.nullish.bind(this); | |
this.array = this.array.bind(this); | |
this.promise = this.promise.bind(this); | |
this.or = this.or.bind(this); | |
this.and = this.and.bind(this); | |
this.transform = this.transform.bind(this); | |
this.brand = this.brand.bind(this); | |
this.default = this.default.bind(this); | |
this.catch = this.catch.bind(this); | |
this.describe = this.describe.bind(this); | |
this.pipe = this.pipe.bind(this); | |
this.readonly = this.readonly.bind(this); | |
this.isNullable = this.isNullable.bind(this); | |
this.isOptional = this.isOptional.bind(this); | |
} | |
get description() { | |
return this._def.description; | |
} | |
_getType(input) { | |
return getParsedType(input.data); | |
} | |
_getOrReturnCtx(input, ctx) { | |
return (ctx || { | |
common: input.parent.common, | |
data: input.data, | |
parsedType: getParsedType(input.data), | |
schemaErrorMap: this._def.errorMap, | |
path: input.path, | |
parent: input.parent, | |
}); | |
} | |
_processInputParams(input) { | |
return { | |
status: new ParseStatus(), | |
ctx: { | |
common: input.parent.common, | |
data: input.data, | |
parsedType: getParsedType(input.data), | |
schemaErrorMap: this._def.errorMap, | |
path: input.path, | |
parent: input.parent, | |
}, | |
}; | |
} | |
_parseSync(input) { | |
const result = this._parse(input); | |
if (isAsync(result)) { | |
throw new Error("Synchronous parse encountered promise."); | |
} | |
return result; | |
} | |
_parseAsync(input) { | |
const result = this._parse(input); | |
return Promise.resolve(result); | |
} | |
parse(data, params) { | |
const result = this.safeParse(data, params); | |
if (result.success) | |
return result.data; | |
throw result.error; | |
} | |
safeParse(data, params) { | |
var _a; | |
const ctx = { | |
common: { | |
issues: [], | |
async: (_a = params === null || params === void 0 ? void 0 : params.async) !== null && _a !== void 0 ? _a : false, | |
contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap, | |
}, | |
path: (params === null || params === void 0 ? void 0 : params.path) || [], | |
schemaErrorMap: this._def.errorMap, | |
parent: null, | |
data, | |
parsedType: getParsedType(data), | |
}; | |
const result = this._parseSync({ data, path: ctx.path, parent: ctx }); | |
return handleResult(ctx, result); | |
} | |
async parseAsync(data, params) { | |
const result = await this.safeParseAsync(data, params); | |
if (result.success) | |
return result.data; | |
throw result.error; | |
} | |
async safeParseAsync(data, params) { | |
const ctx = { | |
common: { | |
issues: [], | |
contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap, | |
async: true, | |
}, | |
path: (params === null || params === void 0 ? void 0 : params.path) || [], | |
schemaErrorMap: this._def.errorMap, | |
parent: null, | |
data, | |
parsedType: getParsedType(data), | |
}; | |
const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx }); | |
const result = await (isAsync(maybeAsyncResult) | |
? maybeAsyncResult | |
: Promise.resolve(maybeAsyncResult)); | |
return handleResult(ctx, result); | |
} | |
refine(check, message) { | |
const getIssueProperties = (val) => { | |
if (typeof message === "string" || typeof message === "undefined") { | |
return { message }; | |
} | |
else if (typeof message === "function") { | |
return message(val); | |
} | |
else { | |
return message; | |
} | |
}; | |
return this._refinement((val, ctx) => { | |
const result = check(val); | |
const setError = () => ctx.addIssue({ | |
code: ZodIssueCode.custom, | |
...getIssueProperties(val), | |
}); | |
if (typeof Promise !== "undefined" && result instanceof Promise) { | |
return result.then((data) => { | |
if (!data) { | |
setError(); | |
return false; | |
} | |
else { | |
return true; | |
} | |
}); | |
} | |
if (!result) { | |
setError(); | |
return false; | |
} | |
else { | |
return true; | |
} | |
}); | |
} | |
refinement(check, refinementData) { | |
return this._refinement((val, ctx) => { | |
if (!check(val)) { | |
ctx.addIssue(typeof refinementData === "function" | |
? refinementData(val, ctx) | |
: refinementData); | |
return false; | |
} | |
else { | |
return true; | |
} | |
}); | |
} | |
_refinement(refinement) { | |
return new ZodEffects({ | |
schema: this, | |
typeName: exports.ZodFirstPartyTypeKind.ZodEffects, | |
effect: { type: "refinement", refinement }, | |
}); | |
} | |
superRefine(refinement) { | |
return this._refinement(refinement); | |
} | |
optional() { | |
return ZodOptional.create(this, this._def); | |
} | |
nullable() { | |
return ZodNullable.create(this, this._def); | |
} | |
nullish() { | |
return this.nullable().optional(); | |
} | |
array() { | |
return ZodArray.create(this, this._def); | |
} | |
promise() { | |
return ZodPromise.create(this, this._def); | |
} | |
or(option) { | |
return ZodUnion.create([this, option], this._def); | |
} | |
and(incoming) { | |
return ZodIntersection.create(this, incoming, this._def); | |
} | |
transform(transform) { | |
return new ZodEffects({ | |
...processCreateParams(this._def), | |
schema: this, | |
typeName: exports.ZodFirstPartyTypeKind.ZodEffects, | |
effect: { type: "transform", transform }, | |
}); | |
} | |
default(def) { | |
const defaultValueFunc = typeof def === "function" ? def : () => def; | |
return new ZodDefault({ | |
...processCreateParams(this._def), | |
innerType: this, | |
defaultValue: defaultValueFunc, | |
typeName: exports.ZodFirstPartyTypeKind.ZodDefault, | |
}); | |
} | |
brand() { | |
return new ZodBranded({ | |
typeName: exports.ZodFirstPartyTypeKind.ZodBranded, | |
type: this, | |
...processCreateParams(this._def), | |
}); | |
} | |
catch(def) { | |
const catchValueFunc = typeof def === "function" ? def : () => def; | |
return new ZodCatch({ | |
...processCreateParams(this._def), | |
innerType: this, | |
catchValue: catchValueFunc, | |
typeName: exports.ZodFirstPartyTypeKind.ZodCatch, | |
}); | |
} | |
describe(description) { | |
const This = this.constructor; | |
return new This({ | |
...this._def, | |
description, | |
}); | |
} | |
pipe(target) { | |
return ZodPipeline.create(this, target); | |
} | |
readonly() { | |
return ZodReadonly.create(this); | |
} | |
isOptional() { | |
return this.safeParse(undefined).success; | |
} | |
isNullable() { | |
return this.safeParse(null).success; | |
} | |
} | |
const cuidRegex = /^c[^\s-]{8,}$/i; | |
const cuid2Regex = /^[a-z][a-z0-9]*$/; | |
const ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/; | |
// const uuidRegex = | |
// /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i; | |
const uuidRegex = /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i; | |
// from https://stackoverflow.com/a/46181/1550155 | |
// old version: too slow, didn't support unicode | |
// const emailRegex = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i; | |
//old email regex | |
// const emailRegex = /^(([^<>()[\].,;:\s@"]+(\.[^<>()[\].,;:\s@"]+)*)|(".+"))@((?!-)([^<>()[\].,;:\s@"]+\.)+[^<>()[\].,;:\s@"]{1,})[^-<>()[\].,;:\s@"]$/i; | |
// eslint-disable-next-line | |
// const emailRegex = | |
// /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\])|(\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\.[A-Za-z]{2,})+))$/; | |
// const emailRegex = | |
// /^[a-zA-Z0-9\.\!\#\$\%\&\'\*\+\/\=\?\^\_\`\{\|\}\~\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/; | |
// const emailRegex = | |
// /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/i; | |
const emailRegex = /^(?!\.)(?!.*\.\.)([A-Z0-9_+-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i; | |
// const emailRegex = | |
// /^[a-z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\.[a-z0-9\-]+)*$/i; | |
// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression | |
const _emojiRegex = `^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$`; | |
let emojiRegex; | |
const ipv4Regex = /^(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))$/; | |
const ipv6Regex = /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/; | |
// Adapted from https://stackoverflow.com/a/3143231 | |
const datetimeRegex = (args) => { | |
if (args.precision) { | |
if (args.offset) { | |
return new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${args.precision}}(([+-]\\d{2}(:?\\d{2})?)|Z)$`); | |
} | |
else { | |
return new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${args.precision}}Z$`); | |
} | |
} | |
else if (args.precision === 0) { | |
if (args.offset) { | |
return new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(([+-]\\d{2}(:?\\d{2})?)|Z)$`); | |
} | |
else { | |
return new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$`); | |
} | |
} | |
else { | |
if (args.offset) { | |
return new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}(:?\\d{2})?)|Z)$`); | |
} | |
else { | |
return new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$`); | |
} | |
} | |
}; | |
function isValidIP(ip, version) { | |
if ((version === "v4" || !version) && ipv4Regex.test(ip)) { | |
return true; | |
} | |
if ((version === "v6" || !version) && ipv6Regex.test(ip)) { | |
return true; | |
} | |
return false; | |
} | |
class ZodString extends ZodType { | |
_parse(input) { | |
if (this._def.coerce) { | |
input.data = String(input.data); | |
} | |
const parsedType = this._getType(input); | |
if (parsedType !== ZodParsedType.string) { | |
const ctx = this._getOrReturnCtx(input); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_type, | |
expected: ZodParsedType.string, | |
received: ctx.parsedType, | |
} | |
// | |
); | |
return INVALID; | |
} | |
const status = new ParseStatus(); | |
let ctx = undefined; | |
for (const check of this._def.checks) { | |
if (check.kind === "min") { | |
if (input.data.length < check.value) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.too_small, | |
minimum: check.value, | |
type: "string", | |
inclusive: true, | |
exact: false, | |
message: check.message, | |
}); | |
status.dirty(); | |
} | |
} | |
else if (check.kind === "max") { | |
if (input.data.length > check.value) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.too_big, | |
maximum: check.value, | |
type: "string", | |
inclusive: true, | |
exact: false, | |
message: check.message, | |
}); | |
status.dirty(); | |
} | |
} | |
else if (check.kind === "length") { | |
const tooBig = input.data.length > check.value; | |
const tooSmall = input.data.length < check.value; | |
if (tooBig || tooSmall) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
if (tooBig) { | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.too_big, | |
maximum: check.value, | |
type: "string", | |
inclusive: true, | |
exact: true, | |
message: check.message, | |
}); | |
} | |
else if (tooSmall) { | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.too_small, | |
minimum: check.value, | |
type: "string", | |
inclusive: true, | |
exact: true, | |
message: check.message, | |
}); | |
} | |
status.dirty(); | |
} | |
} | |
else if (check.kind === "email") { | |
if (!emailRegex.test(input.data)) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
addIssueToContext(ctx, { | |
validation: "email", | |
code: ZodIssueCode.invalid_string, | |
message: check.message, | |
}); | |
status.dirty(); | |
} | |
} | |
else if (check.kind === "emoji") { | |
if (!emojiRegex) { | |
emojiRegex = new RegExp(_emojiRegex, "u"); | |
} | |
if (!emojiRegex.test(input.data)) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
addIssueToContext(ctx, { | |
validation: "emoji", | |
code: ZodIssueCode.invalid_string, | |
message: check.message, | |
}); | |
status.dirty(); | |
} | |
} | |
else if (check.kind === "uuid") { | |
if (!uuidRegex.test(input.data)) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
addIssueToContext(ctx, { | |
validation: "uuid", | |
code: ZodIssueCode.invalid_string, | |
message: check.message, | |
}); | |
status.dirty(); | |
} | |
} | |
else if (check.kind === "cuid") { | |
if (!cuidRegex.test(input.data)) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
addIssueToContext(ctx, { | |
validation: "cuid", | |
code: ZodIssueCode.invalid_string, | |
message: check.message, | |
}); | |
status.dirty(); | |
} | |
} | |
else if (check.kind === "cuid2") { | |
if (!cuid2Regex.test(input.data)) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
addIssueToContext(ctx, { | |
validation: "cuid2", | |
code: ZodIssueCode.invalid_string, | |
message: check.message, | |
}); | |
status.dirty(); | |
} | |
} | |
else if (check.kind === "ulid") { | |
if (!ulidRegex.test(input.data)) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
addIssueToContext(ctx, { | |
validation: "ulid", | |
code: ZodIssueCode.invalid_string, | |
message: check.message, | |
}); | |
status.dirty(); | |
} | |
} | |
else if (check.kind === "url") { | |
try { | |
new URL(input.data); | |
} | |
catch (_a) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
addIssueToContext(ctx, { | |
validation: "url", | |
code: ZodIssueCode.invalid_string, | |
message: check.message, | |
}); | |
status.dirty(); | |
} | |
} | |
else if (check.kind === "regex") { | |
check.regex.lastIndex = 0; | |
const testResult = check.regex.test(input.data); | |
if (!testResult) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
addIssueToContext(ctx, { | |
validation: "regex", | |
code: ZodIssueCode.invalid_string, | |
message: check.message, | |
}); | |
status.dirty(); | |
} | |
} | |
else if (check.kind === "trim") { | |
input.data = input.data.trim(); | |
} | |
else if (check.kind === "includes") { | |
if (!input.data.includes(check.value, check.position)) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_string, | |
validation: { includes: check.value, position: check.position }, | |
message: check.message, | |
}); | |
status.dirty(); | |
} | |
} | |
else if (check.kind === "toLowerCase") { | |
input.data = input.data.toLowerCase(); | |
} | |
else if (check.kind === "toUpperCase") { | |
input.data = input.data.toUpperCase(); | |
} | |
else if (check.kind === "startsWith") { | |
if (!input.data.startsWith(check.value)) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_string, | |
validation: { startsWith: check.value }, | |
message: check.message, | |
}); | |
status.dirty(); | |
} | |
} | |
else if (check.kind === "endsWith") { | |
if (!input.data.endsWith(check.value)) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_string, | |
validation: { endsWith: check.value }, | |
message: check.message, | |
}); | |
status.dirty(); | |
} | |
} | |
else if (check.kind === "datetime") { | |
const regex = datetimeRegex(check); | |
if (!regex.test(input.data)) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_string, | |
validation: "datetime", | |
message: check.message, | |
}); | |
status.dirty(); | |
} | |
} | |
else if (check.kind === "ip") { | |
if (!isValidIP(input.data, check.version)) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
addIssueToContext(ctx, { | |
validation: "ip", | |
code: ZodIssueCode.invalid_string, | |
message: check.message, | |
}); | |
status.dirty(); | |
} | |
} | |
else { | |
exports.util.assertNever(check); | |
} | |
} | |
return { status: status.value, value: input.data }; | |
} | |
_regex(regex, validation, message) { | |
return this.refinement((data) => regex.test(data), { | |
validation, | |
code: ZodIssueCode.invalid_string, | |
...errorUtil.errToObj(message), | |
}); | |
} | |
_addCheck(check) { | |
return new ZodString({ | |
...this._def, | |
checks: [...this._def.checks, check], | |
}); | |
} | |
email(message) { | |
return this._addCheck({ kind: "email", ...errorUtil.errToObj(message) }); | |
} | |
url(message) { | |
return this._addCheck({ kind: "url", ...errorUtil.errToObj(message) }); | |
} | |
emoji(message) { | |
return this._addCheck({ kind: "emoji", ...errorUtil.errToObj(message) }); | |
} | |
uuid(message) { | |
return this._addCheck({ kind: "uuid", ...errorUtil.errToObj(message) }); | |
} | |
cuid(message) { | |
return this._addCheck({ kind: "cuid", ...errorUtil.errToObj(message) }); | |
} | |
cuid2(message) { | |
return this._addCheck({ kind: "cuid2", ...errorUtil.errToObj(message) }); | |
} | |
ulid(message) { | |
return this._addCheck({ kind: "ulid", ...errorUtil.errToObj(message) }); | |
} | |
ip(options) { | |
return this._addCheck({ kind: "ip", ...errorUtil.errToObj(options) }); | |
} | |
datetime(options) { | |
var _a; | |
if (typeof options === "string") { | |
return this._addCheck({ | |
kind: "datetime", | |
precision: null, | |
offset: false, | |
message: options, | |
}); | |
} | |
return this._addCheck({ | |
kind: "datetime", | |
precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === "undefined" ? null : options === null || options === void 0 ? void 0 : options.precision, | |
offset: (_a = options === null || options === void 0 ? void 0 : options.offset) !== null && _a !== void 0 ? _a : false, | |
...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message), | |
}); | |
} | |
regex(regex, message) { | |
return this._addCheck({ | |
kind: "regex", | |
regex: regex, | |
...errorUtil.errToObj(message), | |
}); | |
} | |
includes(value, options) { | |
return this._addCheck({ | |
kind: "includes", | |
value: value, | |
position: options === null || options === void 0 ? void 0 : options.position, | |
...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message), | |
}); | |
} | |
startsWith(value, message) { | |
return this._addCheck({ | |
kind: "startsWith", | |
value: value, | |
...errorUtil.errToObj(message), | |
}); | |
} | |
endsWith(value, message) { | |
return this._addCheck({ | |
kind: "endsWith", | |
value: value, | |
...errorUtil.errToObj(message), | |
}); | |
} | |
min(minLength, message) { | |
return this._addCheck({ | |
kind: "min", | |
value: minLength, | |
...errorUtil.errToObj(message), | |
}); | |
} | |
max(maxLength, message) { | |
return this._addCheck({ | |
kind: "max", | |
value: maxLength, | |
...errorUtil.errToObj(message), | |
}); | |
} | |
length(len, message) { | |
return this._addCheck({ | |
kind: "length", | |
value: len, | |
...errorUtil.errToObj(message), | |
}); | |
} | |
/** | |
* @deprecated Use z.string().min(1) instead. | |
* @see {@link ZodString.min} | |
*/ | |
nonempty(message) { | |
return this.min(1, errorUtil.errToObj(message)); | |
} | |
trim() { | |
return new ZodString({ | |
...this._def, | |
checks: [...this._def.checks, { kind: "trim" }], | |
}); | |
} | |
toLowerCase() { | |
return new ZodString({ | |
...this._def, | |
checks: [...this._def.checks, { kind: "toLowerCase" }], | |
}); | |
} | |
toUpperCase() { | |
return new ZodString({ | |
...this._def, | |
checks: [...this._def.checks, { kind: "toUpperCase" }], | |
}); | |
} | |
get isDatetime() { | |
return !!this._def.checks.find((ch) => ch.kind === "datetime"); | |
} | |
get isEmail() { | |
return !!this._def.checks.find((ch) => ch.kind === "email"); | |
} | |
get isURL() { | |
return !!this._def.checks.find((ch) => ch.kind === "url"); | |
} | |
get isEmoji() { | |
return !!this._def.checks.find((ch) => ch.kind === "emoji"); | |
} | |
get isUUID() { | |
return !!this._def.checks.find((ch) => ch.kind === "uuid"); | |
} | |
get isCUID() { | |
return !!this._def.checks.find((ch) => ch.kind === "cuid"); | |
} | |
get isCUID2() { | |
return !!this._def.checks.find((ch) => ch.kind === "cuid2"); | |
} | |
get isULID() { | |
return !!this._def.checks.find((ch) => ch.kind === "ulid"); | |
} | |
get isIP() { | |
return !!this._def.checks.find((ch) => ch.kind === "ip"); | |
} | |
get minLength() { | |
let min = null; | |
for (const ch of this._def.checks) { | |
if (ch.kind === "min") { | |
if (min === null || ch.value > min) | |
min = ch.value; | |
} | |
} | |
return min; | |
} | |
get maxLength() { | |
let max = null; | |
for (const ch of this._def.checks) { | |
if (ch.kind === "max") { | |
if (max === null || ch.value < max) | |
max = ch.value; | |
} | |
} | |
return max; | |
} | |
} | |
ZodString.create = (params) => { | |
var _a; | |
return new ZodString({ | |
checks: [], | |
typeName: exports.ZodFirstPartyTypeKind.ZodString, | |
coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false, | |
...processCreateParams(params), | |
}); | |
}; | |
// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034 | |
function floatSafeRemainder(val, step) { | |
const valDecCount = (val.toString().split(".")[1] || "").length; | |
const stepDecCount = (step.toString().split(".")[1] || "").length; | |
const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount; | |
const valInt = parseInt(val.toFixed(decCount).replace(".", "")); | |
const stepInt = parseInt(step.toFixed(decCount).replace(".", "")); | |
return (valInt % stepInt) / Math.pow(10, decCount); | |
} | |
class ZodNumber extends ZodType { | |
constructor() { | |
super(...arguments); | |
this.min = this.gte; | |
this.max = this.lte; | |
this.step = this.multipleOf; | |
} | |
_parse(input) { | |
if (this._def.coerce) { | |
input.data = Number(input.data); | |
} | |
const parsedType = this._getType(input); | |
if (parsedType !== ZodParsedType.number) { | |
const ctx = this._getOrReturnCtx(input); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_type, | |
expected: ZodParsedType.number, | |
received: ctx.parsedType, | |
}); | |
return INVALID; | |
} | |
let ctx = undefined; | |
const status = new ParseStatus(); | |
for (const check of this._def.checks) { | |
if (check.kind === "int") { | |
if (!exports.util.isInteger(input.data)) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_type, | |
expected: "integer", | |
received: "float", | |
message: check.message, | |
}); | |
status.dirty(); | |
} | |
} | |
else if (check.kind === "min") { | |
const tooSmall = check.inclusive | |
? input.data < check.value | |
: input.data <= check.value; | |
if (tooSmall) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.too_small, | |
minimum: check.value, | |
type: "number", | |
inclusive: check.inclusive, | |
exact: false, | |
message: check.message, | |
}); | |
status.dirty(); | |
} | |
} | |
else if (check.kind === "max") { | |
const tooBig = check.inclusive | |
? input.data > check.value | |
: input.data >= check.value; | |
if (tooBig) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.too_big, | |
maximum: check.value, | |
type: "number", | |
inclusive: check.inclusive, | |
exact: false, | |
message: check.message, | |
}); | |
status.dirty(); | |
} | |
} | |
else if (check.kind === "multipleOf") { | |
if (floatSafeRemainder(input.data, check.value) !== 0) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.not_multiple_of, | |
multipleOf: check.value, | |
message: check.message, | |
}); | |
status.dirty(); | |
} | |
} | |
else if (check.kind === "finite") { | |
if (!Number.isFinite(input.data)) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.not_finite, | |
message: check.message, | |
}); | |
status.dirty(); | |
} | |
} | |
else { | |
exports.util.assertNever(check); | |
} | |
} | |
return { status: status.value, value: input.data }; | |
} | |
gte(value, message) { | |
return this.setLimit("min", value, true, errorUtil.toString(message)); | |
} | |
gt(value, message) { | |
return this.setLimit("min", value, false, errorUtil.toString(message)); | |
} | |
lte(value, message) { | |
return this.setLimit("max", value, true, errorUtil.toString(message)); | |
} | |
lt(value, message) { | |
return this.setLimit("max", value, false, errorUtil.toString(message)); | |
} | |
setLimit(kind, value, inclusive, message) { | |
return new ZodNumber({ | |
...this._def, | |
checks: [ | |
...this._def.checks, | |
{ | |
kind, | |
value, | |
inclusive, | |
message: errorUtil.toString(message), | |
}, | |
], | |
}); | |
} | |
_addCheck(check) { | |
return new ZodNumber({ | |
...this._def, | |
checks: [...this._def.checks, check], | |
}); | |
} | |
int(message) { | |
return this._addCheck({ | |
kind: "int", | |
message: errorUtil.toString(message), | |
}); | |
} | |
positive(message) { | |
return this._addCheck({ | |
kind: "min", | |
value: 0, | |
inclusive: false, | |
message: errorUtil.toString(message), | |
}); | |
} | |
negative(message) { | |
return this._addCheck({ | |
kind: "max", | |
value: 0, | |
inclusive: false, | |
message: errorUtil.toString(message), | |
}); | |
} | |
nonpositive(message) { | |
return this._addCheck({ | |
kind: "max", | |
value: 0, | |
inclusive: true, | |
message: errorUtil.toString(message), | |
}); | |
} | |
nonnegative(message) { | |
return this._addCheck({ | |
kind: "min", | |
value: 0, | |
inclusive: true, | |
message: errorUtil.toString(message), | |
}); | |
} | |
multipleOf(value, message) { | |
return this._addCheck({ | |
kind: "multipleOf", | |
value: value, | |
message: errorUtil.toString(message), | |
}); | |
} | |
finite(message) { | |
return this._addCheck({ | |
kind: "finite", | |
message: errorUtil.toString(message), | |
}); | |
} | |
safe(message) { | |
return this._addCheck({ | |
kind: "min", | |
inclusive: true, | |
value: Number.MIN_SAFE_INTEGER, | |
message: errorUtil.toString(message), | |
})._addCheck({ | |
kind: "max", | |
inclusive: true, | |
value: Number.MAX_SAFE_INTEGER, | |
message: errorUtil.toString(message), | |
}); | |
} | |
get minValue() { | |
let min = null; | |
for (const ch of this._def.checks) { | |
if (ch.kind === "min") { | |
if (min === null || ch.value > min) | |
min = ch.value; | |
} | |
} | |
return min; | |
} | |
get maxValue() { | |
let max = null; | |
for (const ch of this._def.checks) { | |
if (ch.kind === "max") { | |
if (max === null || ch.value < max) | |
max = ch.value; | |
} | |
} | |
return max; | |
} | |
get isInt() { | |
return !!this._def.checks.find((ch) => ch.kind === "int" || | |
(ch.kind === "multipleOf" && exports.util.isInteger(ch.value))); | |
} | |
get isFinite() { | |
let max = null, min = null; | |
for (const ch of this._def.checks) { | |
if (ch.kind === "finite" || | |
ch.kind === "int" || | |
ch.kind === "multipleOf") { | |
return true; | |
} | |
else if (ch.kind === "min") { | |
if (min === null || ch.value > min) | |
min = ch.value; | |
} | |
else if (ch.kind === "max") { | |
if (max === null || ch.value < max) | |
max = ch.value; | |
} | |
} | |
return Number.isFinite(min) && Number.isFinite(max); | |
} | |
} | |
ZodNumber.create = (params) => { | |
return new ZodNumber({ | |
checks: [], | |
typeName: exports.ZodFirstPartyTypeKind.ZodNumber, | |
coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, | |
...processCreateParams(params), | |
}); | |
}; | |
class ZodBigInt extends ZodType { | |
constructor() { | |
super(...arguments); | |
this.min = this.gte; | |
this.max = this.lte; | |
} | |
_parse(input) { | |
if (this._def.coerce) { | |
input.data = BigInt(input.data); | |
} | |
const parsedType = this._getType(input); | |
if (parsedType !== ZodParsedType.bigint) { | |
const ctx = this._getOrReturnCtx(input); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_type, | |
expected: ZodParsedType.bigint, | |
received: ctx.parsedType, | |
}); | |
return INVALID; | |
} | |
let ctx = undefined; | |
const status = new ParseStatus(); | |
for (const check of this._def.checks) { | |
if (check.kind === "min") { | |
const tooSmall = check.inclusive | |
? input.data < check.value | |
: input.data <= check.value; | |
if (tooSmall) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.too_small, | |
type: "bigint", | |
minimum: check.value, | |
inclusive: check.inclusive, | |
message: check.message, | |
}); | |
status.dirty(); | |
} | |
} | |
else if (check.kind === "max") { | |
const tooBig = check.inclusive | |
? input.data > check.value | |
: input.data >= check.value; | |
if (tooBig) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.too_big, | |
type: "bigint", | |
maximum: check.value, | |
inclusive: check.inclusive, | |
message: check.message, | |
}); | |
status.dirty(); | |
} | |
} | |
else if (check.kind === "multipleOf") { | |
if (input.data % check.value !== BigInt(0)) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.not_multiple_of, | |
multipleOf: check.value, | |
message: check.message, | |
}); | |
status.dirty(); | |
} | |
} | |
else { | |
exports.util.assertNever(check); | |
} | |
} | |
return { status: status.value, value: input.data }; | |
} | |
gte(value, message) { | |
return this.setLimit("min", value, true, errorUtil.toString(message)); | |
} | |
gt(value, message) { | |
return this.setLimit("min", value, false, errorUtil.toString(message)); | |
} | |
lte(value, message) { | |
return this.setLimit("max", value, true, errorUtil.toString(message)); | |
} | |
lt(value, message) { | |
return this.setLimit("max", value, false, errorUtil.toString(message)); | |
} | |
setLimit(kind, value, inclusive, message) { | |
return new ZodBigInt({ | |
...this._def, | |
checks: [ | |
...this._def.checks, | |
{ | |
kind, | |
value, | |
inclusive, | |
message: errorUtil.toString(message), | |
}, | |
], | |
}); | |
} | |
_addCheck(check) { | |
return new ZodBigInt({ | |
...this._def, | |
checks: [...this._def.checks, check], | |
}); | |
} | |
positive(message) { | |
return this._addCheck({ | |
kind: "min", | |
value: BigInt(0), | |
inclusive: false, | |
message: errorUtil.toString(message), | |
}); | |
} | |
negative(message) { | |
return this._addCheck({ | |
kind: "max", | |
value: BigInt(0), | |
inclusive: false, | |
message: errorUtil.toString(message), | |
}); | |
} | |
nonpositive(message) { | |
return this._addCheck({ | |
kind: "max", | |
value: BigInt(0), | |
inclusive: true, | |
message: errorUtil.toString(message), | |
}); | |
} | |
nonnegative(message) { | |
return this._addCheck({ | |
kind: "min", | |
value: BigInt(0), | |
inclusive: true, | |
message: errorUtil.toString(message), | |
}); | |
} | |
multipleOf(value, message) { | |
return this._addCheck({ | |
kind: "multipleOf", | |
value, | |
message: errorUtil.toString(message), | |
}); | |
} | |
get minValue() { | |
let min = null; | |
for (const ch of this._def.checks) { | |
if (ch.kind === "min") { | |
if (min === null || ch.value > min) | |
min = ch.value; | |
} | |
} | |
return min; | |
} | |
get maxValue() { | |
let max = null; | |
for (const ch of this._def.checks) { | |
if (ch.kind === "max") { | |
if (max === null || ch.value < max) | |
max = ch.value; | |
} | |
} | |
return max; | |
} | |
} | |
ZodBigInt.create = (params) => { | |
var _a; | |
return new ZodBigInt({ | |
checks: [], | |
typeName: exports.ZodFirstPartyTypeKind.ZodBigInt, | |
coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false, | |
...processCreateParams(params), | |
}); | |
}; | |
class ZodBoolean extends ZodType { | |
_parse(input) { | |
if (this._def.coerce) { | |
input.data = Boolean(input.data); | |
} | |
const parsedType = this._getType(input); | |
if (parsedType !== ZodParsedType.boolean) { | |
const ctx = this._getOrReturnCtx(input); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_type, | |
expected: ZodParsedType.boolean, | |
received: ctx.parsedType, | |
}); | |
return INVALID; | |
} | |
return OK(input.data); | |
} | |
} | |
ZodBoolean.create = (params) => { | |
return new ZodBoolean({ | |
typeName: exports.ZodFirstPartyTypeKind.ZodBoolean, | |
coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, | |
...processCreateParams(params), | |
}); | |
}; | |
class ZodDate extends ZodType { | |
_parse(input) { | |
if (this._def.coerce) { | |
input.data = new Date(input.data); | |
} | |
const parsedType = this._getType(input); | |
if (parsedType !== ZodParsedType.date) { | |
const ctx = this._getOrReturnCtx(input); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_type, | |
expected: ZodParsedType.date, | |
received: ctx.parsedType, | |
}); | |
return INVALID; | |
} | |
if (isNaN(input.data.getTime())) { | |
const ctx = this._getOrReturnCtx(input); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_date, | |
}); | |
return INVALID; | |
} | |
const status = new ParseStatus(); | |
let ctx = undefined; | |
for (const check of this._def.checks) { | |
if (check.kind === "min") { | |
if (input.data.getTime() < check.value) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.too_small, | |
message: check.message, | |
inclusive: true, | |
exact: false, | |
minimum: check.value, | |
type: "date", | |
}); | |
status.dirty(); | |
} | |
} | |
else if (check.kind === "max") { | |
if (input.data.getTime() > check.value) { | |
ctx = this._getOrReturnCtx(input, ctx); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.too_big, | |
message: check.message, | |
inclusive: true, | |
exact: false, | |
maximum: check.value, | |
type: "date", | |
}); | |
status.dirty(); | |
} | |
} | |
else { | |
exports.util.assertNever(check); | |
} | |
} | |
return { | |
status: status.value, | |
value: new Date(input.data.getTime()), | |
}; | |
} | |
_addCheck(check) { | |
return new ZodDate({ | |
...this._def, | |
checks: [...this._def.checks, check], | |
}); | |
} | |
min(minDate, message) { | |
return this._addCheck({ | |
kind: "min", | |
value: minDate.getTime(), | |
message: errorUtil.toString(message), | |
}); | |
} | |
max(maxDate, message) { | |
return this._addCheck({ | |
kind: "max", | |
value: maxDate.getTime(), | |
message: errorUtil.toString(message), | |
}); | |
} | |
get minDate() { | |
let min = null; | |
for (const ch of this._def.checks) { | |
if (ch.kind === "min") { | |
if (min === null || ch.value > min) | |
min = ch.value; | |
} | |
} | |
return min != null ? new Date(min) : null; | |
} | |
get maxDate() { | |
let max = null; | |
for (const ch of this._def.checks) { | |
if (ch.kind === "max") { | |
if (max === null || ch.value < max) | |
max = ch.value; | |
} | |
} | |
return max != null ? new Date(max) : null; | |
} | |
} | |
ZodDate.create = (params) => { | |
return new ZodDate({ | |
checks: [], | |
coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, | |
typeName: exports.ZodFirstPartyTypeKind.ZodDate, | |
...processCreateParams(params), | |
}); | |
}; | |
class ZodSymbol extends ZodType { | |
_parse(input) { | |
const parsedType = this._getType(input); | |
if (parsedType !== ZodParsedType.symbol) { | |
const ctx = this._getOrReturnCtx(input); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_type, | |
expected: ZodParsedType.symbol, | |
received: ctx.parsedType, | |
}); | |
return INVALID; | |
} | |
return OK(input.data); | |
} | |
} | |
ZodSymbol.create = (params) => { | |
return new ZodSymbol({ | |
typeName: exports.ZodFirstPartyTypeKind.ZodSymbol, | |
...processCreateParams(params), | |
}); | |
}; | |
class ZodUndefined extends ZodType { | |
_parse(input) { | |
const parsedType = this._getType(input); | |
if (parsedType !== ZodParsedType.undefined) { | |
const ctx = this._getOrReturnCtx(input); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_type, | |
expected: ZodParsedType.undefined, | |
received: ctx.parsedType, | |
}); | |
return INVALID; | |
} | |
return OK(input.data); | |
} | |
} | |
ZodUndefined.create = (params) => { | |
return new ZodUndefined({ | |
typeName: exports.ZodFirstPartyTypeKind.ZodUndefined, | |
...processCreateParams(params), | |
}); | |
}; | |
class ZodNull extends ZodType { | |
_parse(input) { | |
const parsedType = this._getType(input); | |
if (parsedType !== ZodParsedType.null) { | |
const ctx = this._getOrReturnCtx(input); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_type, | |
expected: ZodParsedType.null, | |
received: ctx.parsedType, | |
}); | |
return INVALID; | |
} | |
return OK(input.data); | |
} | |
} | |
ZodNull.create = (params) => { | |
return new ZodNull({ | |
typeName: exports.ZodFirstPartyTypeKind.ZodNull, | |
...processCreateParams(params), | |
}); | |
}; | |
class ZodAny extends ZodType { | |
constructor() { | |
super(...arguments); | |
// to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject. | |
this._any = true; | |
} | |
_parse(input) { | |
return OK(input.data); | |
} | |
} | |
ZodAny.create = (params) => { | |
return new ZodAny({ | |
typeName: exports.ZodFirstPartyTypeKind.ZodAny, | |
...processCreateParams(params), | |
}); | |
}; | |
class ZodUnknown extends ZodType { | |
constructor() { | |
super(...arguments); | |
// required | |
this._unknown = true; | |
} | |
_parse(input) { | |
return OK(input.data); | |
} | |
} | |
ZodUnknown.create = (params) => { | |
return new ZodUnknown({ | |
typeName: exports.ZodFirstPartyTypeKind.ZodUnknown, | |
...processCreateParams(params), | |
}); | |
}; | |
class ZodNever extends ZodType { | |
_parse(input) { | |
const ctx = this._getOrReturnCtx(input); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_type, | |
expected: ZodParsedType.never, | |
received: ctx.parsedType, | |
}); | |
return INVALID; | |
} | |
} | |
ZodNever.create = (params) => { | |
return new ZodNever({ | |
typeName: exports.ZodFirstPartyTypeKind.ZodNever, | |
...processCreateParams(params), | |
}); | |
}; | |
class ZodVoid extends ZodType { | |
_parse(input) { | |
const parsedType = this._getType(input); | |
if (parsedType !== ZodParsedType.undefined) { | |
const ctx = this._getOrReturnCtx(input); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_type, | |
expected: ZodParsedType.void, | |
received: ctx.parsedType, | |
}); | |
return INVALID; | |
} | |
return OK(input.data); | |
} | |
} | |
ZodVoid.create = (params) => { | |
return new ZodVoid({ | |
typeName: exports.ZodFirstPartyTypeKind.ZodVoid, | |
...processCreateParams(params), | |
}); | |
}; | |
class ZodArray extends ZodType { | |
_parse(input) { | |
const { ctx, status } = this._processInputParams(input); | |
const def = this._def; | |
if (ctx.parsedType !== ZodParsedType.array) { | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_type, | |
expected: ZodParsedType.array, | |
received: ctx.parsedType, | |
}); | |
return INVALID; | |
} | |
if (def.exactLength !== null) { | |
const tooBig = ctx.data.length > def.exactLength.value; | |
const tooSmall = ctx.data.length < def.exactLength.value; | |
if (tooBig || tooSmall) { | |
addIssueToContext(ctx, { | |
code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small, | |
minimum: (tooSmall ? def.exactLength.value : undefined), | |
maximum: (tooBig ? def.exactLength.value : undefined), | |
type: "array", | |
inclusive: true, | |
exact: true, | |
message: def.exactLength.message, | |
}); | |
status.dirty(); | |
} | |
} | |
if (def.minLength !== null) { | |
if (ctx.data.length < def.minLength.value) { | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.too_small, | |
minimum: def.minLength.value, | |
type: "array", | |
inclusive: true, | |
exact: false, | |
message: def.minLength.message, | |
}); | |
status.dirty(); | |
} | |
} | |
if (def.maxLength !== null) { | |
if (ctx.data.length > def.maxLength.value) { | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.too_big, | |
maximum: def.maxLength.value, | |
type: "array", | |
inclusive: true, | |
exact: false, | |
message: def.maxLength.message, | |
}); | |
status.dirty(); | |
} | |
} | |
if (ctx.common.async) { | |
return Promise.all([...ctx.data].map((item, i) => { | |
return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i)); | |
})).then((result) => { | |
return ParseStatus.mergeArray(status, result); | |
}); | |
} | |
const result = [...ctx.data].map((item, i) => { | |
return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i)); | |
}); | |
return ParseStatus.mergeArray(status, result); | |
} | |
get element() { | |
return this._def.type; | |
} | |
min(minLength, message) { | |
return new ZodArray({ | |
...this._def, | |
minLength: { value: minLength, message: errorUtil.toString(message) }, | |
}); | |
} | |
max(maxLength, message) { | |
return new ZodArray({ | |
...this._def, | |
maxLength: { value: maxLength, message: errorUtil.toString(message) }, | |
}); | |
} | |
length(len, message) { | |
return new ZodArray({ | |
...this._def, | |
exactLength: { value: len, message: errorUtil.toString(message) }, | |
}); | |
} | |
nonempty(message) { | |
return this.min(1, message); | |
} | |
} | |
ZodArray.create = (schema, params) => { | |
return new ZodArray({ | |
type: schema, | |
minLength: null, | |
maxLength: null, | |
exactLength: null, | |
typeName: exports.ZodFirstPartyTypeKind.ZodArray, | |
...processCreateParams(params), | |
}); | |
}; | |
function deepPartialify(schema) { | |
if (schema instanceof ZodObject) { | |
const newShape = {}; | |
for (const key in schema.shape) { | |
const fieldSchema = schema.shape[key]; | |
newShape[key] = ZodOptional.create(deepPartialify(fieldSchema)); | |
} | |
return new ZodObject({ | |
...schema._def, | |
shape: () => newShape, | |
}); | |
} | |
else if (schema instanceof ZodArray) { | |
return new ZodArray({ | |
...schema._def, | |
type: deepPartialify(schema.element), | |
}); | |
} | |
else if (schema instanceof ZodOptional) { | |
return ZodOptional.create(deepPartialify(schema.unwrap())); | |
} | |
else if (schema instanceof ZodNullable) { | |
return ZodNullable.create(deepPartialify(schema.unwrap())); | |
} | |
else if (schema instanceof ZodTuple) { | |
return ZodTuple.create(schema.items.map((item) => deepPartialify(item))); | |
} | |
else { | |
return schema; | |
} | |
} | |
class ZodObject extends ZodType { | |
constructor() { | |
super(...arguments); | |
this._cached = null; | |
/** | |
* @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped. | |
* If you want to pass through unknown properties, use `.passthrough()` instead. | |
*/ | |
this.nonstrict = this.passthrough; | |
// extend< | |
// Augmentation extends ZodRawShape, | |
// NewOutput extends util.flatten<{ | |
// [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation | |
// ? Augmentation[k]["_output"] | |
// : k extends keyof Output | |
// ? Output[k] | |
// : never; | |
// }>, | |
// NewInput extends util.flatten<{ | |
// [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation | |
// ? Augmentation[k]["_input"] | |
// : k extends keyof Input | |
// ? Input[k] | |
// : never; | |
// }> | |
// >( | |
// augmentation: Augmentation | |
// ): ZodObject< | |
// extendShape<T, Augmentation>, | |
// UnknownKeys, | |
// Catchall, | |
// NewOutput, | |
// NewInput | |
// > { | |
// return new ZodObject({ | |
// ...this._def, | |
// shape: () => ({ | |
// ...this._def.shape(), | |
// ...augmentation, | |
// }), | |
// }) as any; | |
// } | |
/** | |
* @deprecated Use `.extend` instead | |
* */ | |
this.augment = this.extend; | |
} | |
_getCached() { | |
if (this._cached !== null) | |
return this._cached; | |
const shape = this._def.shape(); | |
const keys = exports.util.objectKeys(shape); | |
return (this._cached = { shape, keys }); | |
} | |
_parse(input) { | |
const parsedType = this._getType(input); | |
if (parsedType !== ZodParsedType.object) { | |
const ctx = this._getOrReturnCtx(input); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_type, | |
expected: ZodParsedType.object, | |
received: ctx.parsedType, | |
}); | |
return INVALID; | |
} | |
const { status, ctx } = this._processInputParams(input); | |
const { shape, keys: shapeKeys } = this._getCached(); | |
const extraKeys = []; | |
if (!(this._def.catchall instanceof ZodNever && | |
this._def.unknownKeys === "strip")) { | |
for (const key in ctx.data) { | |
if (!shapeKeys.includes(key)) { | |
extraKeys.push(key); | |
} | |
} | |
} | |
const pairs = []; | |
for (const key of shapeKeys) { | |
const keyValidator = shape[key]; | |
const value = ctx.data[key]; | |
pairs.push({ | |
key: { status: "valid", value: key }, | |
value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)), | |
alwaysSet: key in ctx.data, | |
}); | |
} | |
if (this._def.catchall instanceof ZodNever) { | |
const unknownKeys = this._def.unknownKeys; | |
if (unknownKeys === "passthrough") { | |
for (const key of extraKeys) { | |
pairs.push({ | |
key: { status: "valid", value: key }, | |
value: { status: "valid", value: ctx.data[key] }, | |
}); | |
} | |
} | |
else if (unknownKeys === "strict") { | |
if (extraKeys.length > 0) { | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.unrecognized_keys, | |
keys: extraKeys, | |
}); | |
status.dirty(); | |
} | |
} | |
else if (unknownKeys === "strip") ; | |
else { | |
throw new Error(`Internal ZodObject error: invalid unknownKeys value.`); | |
} | |
} | |
else { | |
// run catchall validation | |
const catchall = this._def.catchall; | |
for (const key of extraKeys) { | |
const value = ctx.data[key]; | |
pairs.push({ | |
key: { status: "valid", value: key }, | |
value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value) | |
), | |
alwaysSet: key in ctx.data, | |
}); | |
} | |
} | |
if (ctx.common.async) { | |
return Promise.resolve() | |
.then(async () => { | |
const syncPairs = []; | |
for (const pair of pairs) { | |
const key = await pair.key; | |
syncPairs.push({ | |
key, | |
value: await pair.value, | |
alwaysSet: pair.alwaysSet, | |
}); | |
} | |
return syncPairs; | |
}) | |
.then((syncPairs) => { | |
return ParseStatus.mergeObjectSync(status, syncPairs); | |
}); | |
} | |
else { | |
return ParseStatus.mergeObjectSync(status, pairs); | |
} | |
} | |
get shape() { | |
return this._def.shape(); | |
} | |
strict(message) { | |
errorUtil.errToObj; | |
return new ZodObject({ | |
...this._def, | |
unknownKeys: "strict", | |
...(message !== undefined | |
? { | |
errorMap: (issue, ctx) => { | |
var _a, _b, _c, _d; | |
const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError; | |
if (issue.code === "unrecognized_keys") | |
return { | |
message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError, | |
}; | |
return { | |
message: defaultError, | |
}; | |
}, | |
} | |
: {}), | |
}); | |
} | |
strip() { | |
return new ZodObject({ | |
...this._def, | |
unknownKeys: "strip", | |
}); | |
} | |
passthrough() { | |
return new ZodObject({ | |
...this._def, | |
unknownKeys: "passthrough", | |
}); | |
} | |
// const AugmentFactory = | |
// <Def extends ZodObjectDef>(def: Def) => | |
// <Augmentation extends ZodRawShape>( | |
// augmentation: Augmentation | |
// ): ZodObject< | |
// extendShape<ReturnType<Def["shape"]>, Augmentation>, | |
// Def["unknownKeys"], | |
// Def["catchall"] | |
// > => { | |
// return new ZodObject({ | |
// ...def, | |
// shape: () => ({ | |
// ...def.shape(), | |
// ...augmentation, | |
// }), | |
// }) as any; | |
// }; | |
extend(augmentation) { | |
return new ZodObject({ | |
...this._def, | |
shape: () => ({ | |
...this._def.shape(), | |
...augmentation, | |
}), | |
}); | |
} | |
/** | |
* Prior to [email protected] there was a bug in the | |
* inferred type of merged objects. Please | |
* upgrade if you are experiencing issues. | |
*/ | |
merge(merging) { | |
const merged = new ZodObject({ | |
unknownKeys: merging._def.unknownKeys, | |
catchall: merging._def.catchall, | |
shape: () => ({ | |
...this._def.shape(), | |
...merging._def.shape(), | |
}), | |
typeName: exports.ZodFirstPartyTypeKind.ZodObject, | |
}); | |
return merged; | |
} | |
// merge< | |
// Incoming extends AnyZodObject, | |
// Augmentation extends Incoming["shape"], | |
// NewOutput extends { | |
// [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation | |
// ? Augmentation[k]["_output"] | |
// : k extends keyof Output | |
// ? Output[k] | |
// : never; | |
// }, | |
// NewInput extends { | |
// [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation | |
// ? Augmentation[k]["_input"] | |
// : k extends keyof Input | |
// ? Input[k] | |
// : never; | |
// } | |
// >( | |
// merging: Incoming | |
// ): ZodObject< | |
// extendShape<T, ReturnType<Incoming["_def"]["shape"]>>, | |
// Incoming["_def"]["unknownKeys"], | |
// Incoming["_def"]["catchall"], | |
// NewOutput, | |
// NewInput | |
// > { | |
// const merged: any = new ZodObject({ | |
// unknownKeys: merging._def.unknownKeys, | |
// catchall: merging._def.catchall, | |
// shape: () => | |
// objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), | |
// typeName: ZodFirstPartyTypeKind.ZodObject, | |
// }) as any; | |
// return merged; | |
// } | |
setKey(key, schema) { | |
return this.augment({ [key]: schema }); | |
} | |
// merge<Incoming extends AnyZodObject>( | |
// merging: Incoming | |
// ): //ZodObject<T & Incoming["_shape"], UnknownKeys, Catchall> = (merging) => { | |
// ZodObject< | |
// extendShape<T, ReturnType<Incoming["_def"]["shape"]>>, | |
// Incoming["_def"]["unknownKeys"], | |
// Incoming["_def"]["catchall"] | |
// > { | |
// // const mergedShape = objectUtil.mergeShapes( | |
// // this._def.shape(), | |
// // merging._def.shape() | |
// // ); | |
// const merged: any = new ZodObject({ | |
// unknownKeys: merging._def.unknownKeys, | |
// catchall: merging._def.catchall, | |
// shape: () => | |
// objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), | |
// typeName: ZodFirstPartyTypeKind.ZodObject, | |
// }) as any; | |
// return merged; | |
// } | |
catchall(index) { | |
return new ZodObject({ | |
...this._def, | |
catchall: index, | |
}); | |
} | |
pick(mask) { | |
const shape = {}; | |
exports.util.objectKeys(mask).forEach((key) => { | |
if (mask[key] && this.shape[key]) { | |
shape[key] = this.shape[key]; | |
} | |
}); | |
return new ZodObject({ | |
...this._def, | |
shape: () => shape, | |
}); | |
} | |
omit(mask) { | |
const shape = {}; | |
exports.util.objectKeys(this.shape).forEach((key) => { | |
if (!mask[key]) { | |
shape[key] = this.shape[key]; | |
} | |
}); | |
return new ZodObject({ | |
...this._def, | |
shape: () => shape, | |
}); | |
} | |
/** | |
* @deprecated | |
*/ | |
deepPartial() { | |
return deepPartialify(this); | |
} | |
partial(mask) { | |
const newShape = {}; | |
exports.util.objectKeys(this.shape).forEach((key) => { | |
const fieldSchema = this.shape[key]; | |
if (mask && !mask[key]) { | |
newShape[key] = fieldSchema; | |
} | |
else { | |
newShape[key] = fieldSchema.optional(); | |
} | |
}); | |
return new ZodObject({ | |
...this._def, | |
shape: () => newShape, | |
}); | |
} | |
required(mask) { | |
const newShape = {}; | |
exports.util.objectKeys(this.shape).forEach((key) => { | |
if (mask && !mask[key]) { | |
newShape[key] = this.shape[key]; | |
} | |
else { | |
const fieldSchema = this.shape[key]; | |
let newField = fieldSchema; | |
while (newField instanceof ZodOptional) { | |
newField = newField._def.innerType; | |
} | |
newShape[key] = newField; | |
} | |
}); | |
return new ZodObject({ | |
...this._def, | |
shape: () => newShape, | |
}); | |
} | |
keyof() { | |
return createZodEnum(exports.util.objectKeys(this.shape)); | |
} | |
} | |
ZodObject.create = (shape, params) => { | |
return new ZodObject({ | |
shape: () => shape, | |
unknownKeys: "strip", | |
catchall: ZodNever.create(), | |
typeName: exports.ZodFirstPartyTypeKind.ZodObject, | |
...processCreateParams(params), | |
}); | |
}; | |
ZodObject.strictCreate = (shape, params) => { | |
return new ZodObject({ | |
shape: () => shape, | |
unknownKeys: "strict", | |
catchall: ZodNever.create(), | |
typeName: exports.ZodFirstPartyTypeKind.ZodObject, | |
...processCreateParams(params), | |
}); | |
}; | |
ZodObject.lazycreate = (shape, params) => { | |
return new ZodObject({ | |
shape, | |
unknownKeys: "strip", | |
catchall: ZodNever.create(), | |
typeName: exports.ZodFirstPartyTypeKind.ZodObject, | |
...processCreateParams(params), | |
}); | |
}; | |
class ZodUnion extends ZodType { | |
_parse(input) { | |
const { ctx } = this._processInputParams(input); | |
const options = this._def.options; | |
function handleResults(results) { | |
// return first issue-free validation if it exists | |
for (const result of results) { | |
if (result.result.status === "valid") { | |
return result.result; | |
} | |
} | |
for (const result of results) { | |
if (result.result.status === "dirty") { | |
// add issues from dirty option | |
ctx.common.issues.push(...result.ctx.common.issues); | |
return result.result; | |
} | |
} | |
// return invalid | |
const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues)); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_union, | |
unionErrors, | |
}); | |
return INVALID; | |
} | |
if (ctx.common.async) { | |
return Promise.all(options.map(async (option) => { | |
const childCtx = { | |
...ctx, | |
common: { | |
...ctx.common, | |
issues: [], | |
}, | |
parent: null, | |
}; | |
return { | |
result: await option._parseAsync({ | |
data: ctx.data, | |
path: ctx.path, | |
parent: childCtx, | |
}), | |
ctx: childCtx, | |
}; | |
})).then(handleResults); | |
} | |
else { | |
let dirty = undefined; | |
const issues = []; | |
for (const option of options) { | |
const childCtx = { | |
...ctx, | |
common: { | |
...ctx.common, | |
issues: [], | |
}, | |
parent: null, | |
}; | |
const result = option._parseSync({ | |
data: ctx.data, | |
path: ctx.path, | |
parent: childCtx, | |
}); | |
if (result.status === "valid") { | |
return result; | |
} | |
else if (result.status === "dirty" && !dirty) { | |
dirty = { result, ctx: childCtx }; | |
} | |
if (childCtx.common.issues.length) { | |
issues.push(childCtx.common.issues); | |
} | |
} | |
if (dirty) { | |
ctx.common.issues.push(...dirty.ctx.common.issues); | |
return dirty.result; | |
} | |
const unionErrors = issues.map((issues) => new ZodError(issues)); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_union, | |
unionErrors, | |
}); | |
return INVALID; | |
} | |
} | |
get options() { | |
return this._def.options; | |
} | |
} | |
ZodUnion.create = (types, params) => { | |
return new ZodUnion({ | |
options: types, | |
typeName: exports.ZodFirstPartyTypeKind.ZodUnion, | |
...processCreateParams(params), | |
}); | |
}; | |
///////////////////////////////////////////////////// | |
///////////////////////////////////////////////////// | |
////////// ////////// | |
////////// ZodDiscriminatedUnion ////////// | |
////////// ////////// | |
///////////////////////////////////////////////////// | |
///////////////////////////////////////////////////// | |
const getDiscriminator = (type) => { | |
if (type instanceof ZodLazy) { | |
return getDiscriminator(type.schema); | |
} | |
else if (type instanceof ZodEffects) { | |
return getDiscriminator(type.innerType()); | |
} | |
else if (type instanceof ZodLiteral) { | |
return [type.value]; | |
} | |
else if (type instanceof ZodEnum) { | |
return type.options; | |
} | |
else if (type instanceof ZodNativeEnum) { | |
// eslint-disable-next-line ban/ban | |
return Object.keys(type.enum); | |
} | |
else if (type instanceof ZodDefault) { | |
return getDiscriminator(type._def.innerType); | |
} | |
else if (type instanceof ZodUndefined) { | |
return [undefined]; | |
} | |
else if (type instanceof ZodNull) { | |
return [null]; | |
} | |
else { | |
return null; | |
} | |
}; | |
class ZodDiscriminatedUnion extends ZodType { | |
_parse(input) { | |
const { ctx } = this._processInputParams(input); | |
if (ctx.parsedType !== ZodParsedType.object) { | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_type, | |
expected: ZodParsedType.object, | |
received: ctx.parsedType, | |
}); | |
return INVALID; | |
} | |
const discriminator = this.discriminator; | |
const discriminatorValue = ctx.data[discriminator]; | |
const option = this.optionsMap.get(discriminatorValue); | |
if (!option) { | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_union_discriminator, | |
options: Array.from(this.optionsMap.keys()), | |
path: [discriminator], | |
}); | |
return INVALID; | |
} | |
if (ctx.common.async) { | |
return option._parseAsync({ | |
data: ctx.data, | |
path: ctx.path, | |
parent: ctx, | |
}); | |
} | |
else { | |
return option._parseSync({ | |
data: ctx.data, | |
path: ctx.path, | |
parent: ctx, | |
}); | |
} | |
} | |
get discriminator() { | |
return this._def.discriminator; | |
} | |
get options() { | |
return this._def.options; | |
} | |
get optionsMap() { | |
return this._def.optionsMap; | |
} | |
/** | |
* The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor. | |
* However, it only allows a union of objects, all of which need to share a discriminator property. This property must | |
* have a different value for each object in the union. | |
* @param discriminator the name of the discriminator property | |
* @param types an array of object schemas | |
* @param params | |
*/ | |
static create(discriminator, options, params) { | |
// Get all the valid discriminator values | |
const optionsMap = new Map(); | |
// try { | |
for (const type of options) { | |
const discriminatorValues = getDiscriminator(type.shape[discriminator]); | |
if (!discriminatorValues) { | |
throw new Error(`A discriminator value for key \`${discriminator}\` could not be extracted from all schema options`); | |
} | |
for (const value of discriminatorValues) { | |
if (optionsMap.has(value)) { | |
throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`); | |
} | |
optionsMap.set(value, type); | |
} | |
} | |
return new ZodDiscriminatedUnion({ | |
typeName: exports.ZodFirstPartyTypeKind.ZodDiscriminatedUnion, | |
discriminator, | |
options, | |
optionsMap, | |
...processCreateParams(params), | |
}); | |
} | |
} | |
function mergeValues(a, b) { | |
const aType = getParsedType(a); | |
const bType = getParsedType(b); | |
if (a === b) { | |
return { valid: true, data: a }; | |
} | |
else if (aType === ZodParsedType.object && bType === ZodParsedType.object) { | |
const bKeys = exports.util.objectKeys(b); | |
const sharedKeys = exports.util | |
.objectKeys(a) | |
.filter((key) => bKeys.indexOf(key) !== -1); | |
const newObj = { ...a, ...b }; | |
for (const key of sharedKeys) { | |
const sharedValue = mergeValues(a[key], b[key]); | |
if (!sharedValue.valid) { | |
return { valid: false }; | |
} | |
newObj[key] = sharedValue.data; | |
} | |
return { valid: true, data: newObj }; | |
} | |
else if (aType === ZodParsedType.array && bType === ZodParsedType.array) { | |
if (a.length !== b.length) { | |
return { valid: false }; | |
} | |
const newArray = []; | |
for (let index = 0; index < a.length; index++) { | |
const itemA = a[index]; | |
const itemB = b[index]; | |
const sharedValue = mergeValues(itemA, itemB); | |
if (!sharedValue.valid) { | |
return { valid: false }; | |
} | |
newArray.push(sharedValue.data); | |
} | |
return { valid: true, data: newArray }; | |
} | |
else if (aType === ZodParsedType.date && | |
bType === ZodParsedType.date && | |
+a === +b) { | |
return { valid: true, data: a }; | |
} | |
else { | |
return { valid: false }; | |
} | |
} | |
class ZodIntersection extends ZodType { | |
_parse(input) { | |
const { status, ctx } = this._processInputParams(input); | |
const handleParsed = (parsedLeft, parsedRight) => { | |
if (isAborted(parsedLeft) || isAborted(parsedRight)) { | |
return INVALID; | |
} | |
const merged = mergeValues(parsedLeft.value, parsedRight.value); | |
if (!merged.valid) { | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_intersection_types, | |
}); | |
return INVALID; | |
} | |
if (isDirty(parsedLeft) || isDirty(parsedRight)) { | |
status.dirty(); | |
} | |
return { status: status.value, value: merged.data }; | |
}; | |
if (ctx.common.async) { | |
return Promise.all([ | |
this._def.left._parseAsync({ | |
data: ctx.data, | |
path: ctx.path, | |
parent: ctx, | |
}), | |
this._def.right._parseAsync({ | |
data: ctx.data, | |
path: ctx.path, | |
parent: ctx, | |
}), | |
]).then(([left, right]) => handleParsed(left, right)); | |
} | |
else { | |
return handleParsed(this._def.left._parseSync({ | |
data: ctx.data, | |
path: ctx.path, | |
parent: ctx, | |
}), this._def.right._parseSync({ | |
data: ctx.data, | |
path: ctx.path, | |
parent: ctx, | |
})); | |
} | |
} | |
} | |
ZodIntersection.create = (left, right, params) => { | |
return new ZodIntersection({ | |
left: left, | |
right: right, | |
typeName: exports.ZodFirstPartyTypeKind.ZodIntersection, | |
...processCreateParams(params), | |
}); | |
}; | |
class ZodTuple extends ZodType { | |
_parse(input) { | |
const { status, ctx } = this._processInputParams(input); | |
if (ctx.parsedType !== ZodParsedType.array) { | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_type, | |
expected: ZodParsedType.array, | |
received: ctx.parsedType, | |
}); | |
return INVALID; | |
} | |
if (ctx.data.length < this._def.items.length) { | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.too_small, | |
minimum: this._def.items.length, | |
inclusive: true, | |
exact: false, | |
type: "array", | |
}); | |
return INVALID; | |
} | |
const rest = this._def.rest; | |
if (!rest && ctx.data.length > this._def.items.length) { | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.too_big, | |
maximum: this._def.items.length, | |
inclusive: true, | |
exact: false, | |
type: "array", | |
}); | |
status.dirty(); | |
} | |
const items = [...ctx.data] | |
.map((item, itemIndex) => { | |
const schema = this._def.items[itemIndex] || this._def.rest; | |
if (!schema) | |
return null; | |
return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex)); | |
}) | |
.filter((x) => !!x); // filter nulls | |
if (ctx.common.async) { | |
return Promise.all(items).then((results) => { | |
return ParseStatus.mergeArray(status, results); | |
}); | |
} | |
else { | |
return ParseStatus.mergeArray(status, items); | |
} | |
} | |
get items() { | |
return this._def.items; | |
} | |
rest(rest) { | |
return new ZodTuple({ | |
...this._def, | |
rest, | |
}); | |
} | |
} | |
ZodTuple.create = (schemas, params) => { | |
if (!Array.isArray(schemas)) { | |
throw new Error("You must pass an array of schemas to z.tuple([ ... ])"); | |
} | |
return new ZodTuple({ | |
items: schemas, | |
typeName: exports.ZodFirstPartyTypeKind.ZodTuple, | |
rest: null, | |
...processCreateParams(params), | |
}); | |
}; | |
class ZodRecord extends ZodType { | |
get keySchema() { | |
return this._def.keyType; | |
} | |
get valueSchema() { | |
return this._def.valueType; | |
} | |
_parse(input) { | |
const { status, ctx } = this._processInputParams(input); | |
if (ctx.parsedType !== ZodParsedType.object) { | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_type, | |
expected: ZodParsedType.object, | |
received: ctx.parsedType, | |
}); | |
return INVALID; | |
} | |
const pairs = []; | |
const keyType = this._def.keyType; | |
const valueType = this._def.valueType; | |
for (const key in ctx.data) { | |
pairs.push({ | |
key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)), | |
value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)), | |
}); | |
} | |
if (ctx.common.async) { | |
return ParseStatus.mergeObjectAsync(status, pairs); | |
} | |
else { | |
return ParseStatus.mergeObjectSync(status, pairs); | |
} | |
} | |
get element() { | |
return this._def.valueType; | |
} | |
static create(first, second, third) { | |
if (second instanceof ZodType) { | |
return new ZodRecord({ | |
keyType: first, | |
valueType: second, | |
typeName: exports.ZodFirstPartyTypeKind.ZodRecord, | |
...processCreateParams(third), | |
}); | |
} | |
return new ZodRecord({ | |
keyType: ZodString.create(), | |
valueType: first, | |
typeName: exports.ZodFirstPartyTypeKind.ZodRecord, | |
...processCreateParams(second), | |
}); | |
} | |
} | |
class ZodMap extends ZodType { | |
get keySchema() { | |
return this._def.keyType; | |
} | |
get valueSchema() { | |
return this._def.valueType; | |
} | |
_parse(input) { | |
const { status, ctx } = this._processInputParams(input); | |
if (ctx.parsedType !== ZodParsedType.map) { | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_type, | |
expected: ZodParsedType.map, | |
received: ctx.parsedType, | |
}); | |
return INVALID; | |
} | |
const keyType = this._def.keyType; | |
const valueType = this._def.valueType; | |
const pairs = [...ctx.data.entries()].map(([key, value], index) => { | |
return { | |
key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, "key"])), | |
value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, "value"])), | |
}; | |
}); | |
if (ctx.common.async) { | |
const finalMap = new Map(); | |
return Promise.resolve().then(async () => { | |
for (const pair of pairs) { | |
const key = await pair.key; | |
const value = await pair.value; | |
if (key.status === "aborted" || value.status === "aborted") { | |
return INVALID; | |
} | |
if (key.status === "dirty" || value.status === "dirty") { | |
status.dirty(); | |
} | |
finalMap.set(key.value, value.value); | |
} | |
return { status: status.value, value: finalMap }; | |
}); | |
} | |
else { | |
const finalMap = new Map(); | |
for (const pair of pairs) { | |
const key = pair.key; | |
const value = pair.value; | |
if (key.status === "aborted" || value.status === "aborted") { | |
return INVALID; | |
} | |
if (key.status === "dirty" || value.status === "dirty") { | |
status.dirty(); | |
} | |
finalMap.set(key.value, value.value); | |
} | |
return { status: status.value, value: finalMap }; | |
} | |
} | |
} | |
ZodMap.create = (keyType, valueType, params) => { | |
return new ZodMap({ | |
valueType, | |
keyType, | |
typeName: exports.ZodFirstPartyTypeKind.ZodMap, | |
...processCreateParams(params), | |
}); | |
}; | |
class ZodSet extends ZodType { | |
_parse(input) { | |
const { status, ctx } = this._processInputParams(input); | |
if (ctx.parsedType !== ZodParsedType.set) { | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_type, | |
expected: ZodParsedType.set, | |
received: ctx.parsedType, | |
}); | |
return INVALID; | |
} | |
const def = this._def; | |
if (def.minSize !== null) { | |
if (ctx.data.size < def.minSize.value) { | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.too_small, | |
minimum: def.minSize.value, | |
type: "set", | |
inclusive: true, | |
exact: false, | |
message: def.minSize.message, | |
}); | |
status.dirty(); | |
} | |
} | |
if (def.maxSize !== null) { | |
if (ctx.data.size > def.maxSize.value) { | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.too_big, | |
maximum: def.maxSize.value, | |
type: "set", | |
inclusive: true, | |
exact: false, | |
message: def.maxSize.message, | |
}); | |
status.dirty(); | |
} | |
} | |
const valueType = this._def.valueType; | |
function finalizeSet(elements) { | |
const parsedSet = new Set(); | |
for (const element of elements) { | |
if (element.status === "aborted") | |
return INVALID; | |
if (element.status === "dirty") | |
status.dirty(); | |
parsedSet.add(element.value); | |
} | |
return { status: status.value, value: parsedSet }; | |
} | |
const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i))); | |
if (ctx.common.async) { | |
return Promise.all(elements).then((elements) => finalizeSet(elements)); | |
} | |
else { | |
return finalizeSet(elements); | |
} | |
} | |
min(minSize, message) { | |
return new ZodSet({ | |
...this._def, | |
minSize: { value: minSize, message: errorUtil.toString(message) }, | |
}); | |
} | |
max(maxSize, message) { | |
return new ZodSet({ | |
...this._def, | |
maxSize: { value: maxSize, message: errorUtil.toString(message) }, | |
}); | |
} | |
size(size, message) { | |
return this.min(size, message).max(size, message); | |
} | |
nonempty(message) { | |
return this.min(1, message); | |
} | |
} | |
ZodSet.create = (valueType, params) => { | |
return new ZodSet({ | |
valueType, | |
minSize: null, | |
maxSize: null, | |
typeName: exports.ZodFirstPartyTypeKind.ZodSet, | |
...processCreateParams(params), | |
}); | |
}; | |
class ZodFunction extends ZodType { | |
constructor() { | |
super(...arguments); | |
this.validate = this.implement; | |
} | |
_parse(input) { | |
const { ctx } = this._processInputParams(input); | |
if (ctx.parsedType !== ZodParsedType.function) { | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_type, | |
expected: ZodParsedType.function, | |
received: ctx.parsedType, | |
}); | |
return INVALID; | |
} | |
function makeArgsIssue(args, error) { | |
return makeIssue({ | |
data: args, | |
path: ctx.path, | |
errorMaps: [ | |
ctx.common.contextualErrorMap, | |
ctx.schemaErrorMap, | |
getErrorMap(), | |
errorMap, | |
].filter((x) => !!x), | |
issueData: { | |
code: ZodIssueCode.invalid_arguments, | |
argumentsError: error, | |
}, | |
}); | |
} | |
function makeReturnsIssue(returns, error) { | |
return makeIssue({ | |
data: returns, | |
path: ctx.path, | |
errorMaps: [ | |
ctx.common.contextualErrorMap, | |
ctx.schemaErrorMap, | |
getErrorMap(), | |
errorMap, | |
].filter((x) => !!x), | |
issueData: { | |
code: ZodIssueCode.invalid_return_type, | |
returnTypeError: error, | |
}, | |
}); | |
} | |
const params = { errorMap: ctx.common.contextualErrorMap }; | |
const fn = ctx.data; | |
if (this._def.returns instanceof ZodPromise) { | |
// Would love a way to avoid disabling this rule, but we need | |
// an alias (using an arrow function was what caused 2651). | |
// eslint-disable-next-line @typescript-eslint/no-this-alias | |
const me = this; | |
return OK(async function (...args) { | |
const error = new ZodError([]); | |
const parsedArgs = await me._def.args | |
.parseAsync(args, params) | |
.catch((e) => { | |
error.addIssue(makeArgsIssue(args, e)); | |
throw error; | |
}); | |
const result = await Reflect.apply(fn, this, parsedArgs); | |
const parsedReturns = await me._def.returns._def.type | |
.parseAsync(result, params) | |
.catch((e) => { | |
error.addIssue(makeReturnsIssue(result, e)); | |
throw error; | |
}); | |
return parsedReturns; | |
}); | |
} | |
else { | |
// Would love a way to avoid disabling this rule, but we need | |
// an alias (using an arrow function was what caused 2651). | |
// eslint-disable-next-line @typescript-eslint/no-this-alias | |
const me = this; | |
return OK(function (...args) { | |
const parsedArgs = me._def.args.safeParse(args, params); | |
if (!parsedArgs.success) { | |
throw new ZodError([makeArgsIssue(args, parsedArgs.error)]); | |
} | |
const result = Reflect.apply(fn, this, parsedArgs.data); | |
const parsedReturns = me._def.returns.safeParse(result, params); | |
if (!parsedReturns.success) { | |
throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]); | |
} | |
return parsedReturns.data; | |
}); | |
} | |
} | |
parameters() { | |
return this._def.args; | |
} | |
returnType() { | |
return this._def.returns; | |
} | |
args(...items) { | |
return new ZodFunction({ | |
...this._def, | |
args: ZodTuple.create(items).rest(ZodUnknown.create()), | |
}); | |
} | |
returns(returnType) { | |
return new ZodFunction({ | |
...this._def, | |
returns: returnType, | |
}); | |
} | |
implement(func) { | |
const validatedFunc = this.parse(func); | |
return validatedFunc; | |
} | |
strictImplement(func) { | |
const validatedFunc = this.parse(func); | |
return validatedFunc; | |
} | |
static create(args, returns, params) { | |
return new ZodFunction({ | |
args: (args | |
? args | |
: ZodTuple.create([]).rest(ZodUnknown.create())), | |
returns: returns || ZodUnknown.create(), | |
typeName: exports.ZodFirstPartyTypeKind.ZodFunction, | |
...processCreateParams(params), | |
}); | |
} | |
} | |
class ZodLazy extends ZodType { | |
get schema() { | |
return this._def.getter(); | |
} | |
_parse(input) { | |
const { ctx } = this._processInputParams(input); | |
const lazySchema = this._def.getter(); | |
return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx }); | |
} | |
} | |
ZodLazy.create = (getter, params) => { | |
return new ZodLazy({ | |
getter: getter, | |
typeName: exports.ZodFirstPartyTypeKind.ZodLazy, | |
...processCreateParams(params), | |
}); | |
}; | |
class ZodLiteral extends ZodType { | |
_parse(input) { | |
if (input.data !== this._def.value) { | |
const ctx = this._getOrReturnCtx(input); | |
addIssueToContext(ctx, { | |
received: ctx.data, | |
code: ZodIssueCode.invalid_literal, | |
expected: this._def.value, | |
}); | |
return INVALID; | |
} | |
return { status: "valid", value: input.data }; | |
} | |
get value() { | |
return this._def.value; | |
} | |
} | |
ZodLiteral.create = (value, params) => { | |
return new ZodLiteral({ | |
value: value, | |
typeName: exports.ZodFirstPartyTypeKind.ZodLiteral, | |
...processCreateParams(params), | |
}); | |
}; | |
function createZodEnum(values, params) { | |
return new ZodEnum({ | |
values, | |
typeName: exports.ZodFirstPartyTypeKind.ZodEnum, | |
...processCreateParams(params), | |
}); | |
} | |
class ZodEnum extends ZodType { | |
_parse(input) { | |
if (typeof input.data !== "string") { | |
const ctx = this._getOrReturnCtx(input); | |
const expectedValues = this._def.values; | |
addIssueToContext(ctx, { | |
expected: exports.util.joinValues(expectedValues), | |
received: ctx.parsedType, | |
code: ZodIssueCode.invalid_type, | |
}); | |
return INVALID; | |
} | |
if (this._def.values.indexOf(input.data) === -1) { | |
const ctx = this._getOrReturnCtx(input); | |
const expectedValues = this._def.values; | |
addIssueToContext(ctx, { | |
received: ctx.data, | |
code: ZodIssueCode.invalid_enum_value, | |
options: expectedValues, | |
}); | |
return INVALID; | |
} | |
return OK(input.data); | |
} | |
get options() { | |
return this._def.values; | |
} | |
get enum() { | |
const enumValues = {}; | |
for (const val of this._def.values) { | |
enumValues[val] = val; | |
} | |
return enumValues; | |
} | |
get Values() { | |
const enumValues = {}; | |
for (const val of this._def.values) { | |
enumValues[val] = val; | |
} | |
return enumValues; | |
} | |
get Enum() { | |
const enumValues = {}; | |
for (const val of this._def.values) { | |
enumValues[val] = val; | |
} | |
return enumValues; | |
} | |
extract(values) { | |
return ZodEnum.create(values); | |
} | |
exclude(values) { | |
return ZodEnum.create(this.options.filter((opt) => !values.includes(opt))); | |
} | |
} | |
ZodEnum.create = createZodEnum; | |
class ZodNativeEnum extends ZodType { | |
_parse(input) { | |
const nativeEnumValues = exports.util.getValidEnumValues(this._def.values); | |
const ctx = this._getOrReturnCtx(input); | |
if (ctx.parsedType !== ZodParsedType.string && | |
ctx.parsedType !== ZodParsedType.number) { | |
const expectedValues = exports.util.objectValues(nativeEnumValues); | |
addIssueToContext(ctx, { | |
expected: exports.util.joinValues(expectedValues), | |
received: ctx.parsedType, | |
code: ZodIssueCode.invalid_type, | |
}); | |
return INVALID; | |
} | |
if (nativeEnumValues.indexOf(input.data) === -1) { | |
const expectedValues = exports.util.objectValues(nativeEnumValues); | |
addIssueToContext(ctx, { | |
received: ctx.data, | |
code: ZodIssueCode.invalid_enum_value, | |
options: expectedValues, | |
}); | |
return INVALID; | |
} | |
return OK(input.data); | |
} | |
get enum() { | |
return this._def.values; | |
} | |
} | |
ZodNativeEnum.create = (values, params) => { | |
return new ZodNativeEnum({ | |
values: values, | |
typeName: exports.ZodFirstPartyTypeKind.ZodNativeEnum, | |
...processCreateParams(params), | |
}); | |
}; | |
class ZodPromise extends ZodType { | |
unwrap() { | |
return this._def.type; | |
} | |
_parse(input) { | |
const { ctx } = this._processInputParams(input); | |
if (ctx.parsedType !== ZodParsedType.promise && | |
ctx.common.async === false) { | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_type, | |
expected: ZodParsedType.promise, | |
received: ctx.parsedType, | |
}); | |
return INVALID; | |
} | |
const promisified = ctx.parsedType === ZodParsedType.promise | |
? ctx.data | |
: Promise.resolve(ctx.data); | |
return OK(promisified.then((data) => { | |
return this._def.type.parseAsync(data, { | |
path: ctx.path, | |
errorMap: ctx.common.contextualErrorMap, | |
}); | |
})); | |
} | |
} | |
ZodPromise.create = (schema, params) => { | |
return new ZodPromise({ | |
type: schema, | |
typeName: exports.ZodFirstPartyTypeKind.ZodPromise, | |
...processCreateParams(params), | |
}); | |
}; | |
class ZodEffects extends ZodType { | |
innerType() { | |
return this._def.schema; | |
} | |
sourceType() { | |
return this._def.schema._def.typeName === exports.ZodFirstPartyTypeKind.ZodEffects | |
? this._def.schema.sourceType() | |
: this._def.schema; | |
} | |
_parse(input) { | |
const { status, ctx } = this._processInputParams(input); | |
const effect = this._def.effect || null; | |
const checkCtx = { | |
addIssue: (arg) => { | |
addIssueToContext(ctx, arg); | |
if (arg.fatal) { | |
status.abort(); | |
} | |
else { | |
status.dirty(); | |
} | |
}, | |
get path() { | |
return ctx.path; | |
}, | |
}; | |
checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx); | |
if (effect.type === "preprocess") { | |
const processed = effect.transform(ctx.data, checkCtx); | |
if (ctx.common.issues.length) { | |
return { | |
status: "dirty", | |
value: ctx.data, | |
}; | |
} | |
if (ctx.common.async) { | |
return Promise.resolve(processed).then((processed) => { | |
return this._def.schema._parseAsync({ | |
data: processed, | |
path: ctx.path, | |
parent: ctx, | |
}); | |
}); | |
} | |
else { | |
return this._def.schema._parseSync({ | |
data: processed, | |
path: ctx.path, | |
parent: ctx, | |
}); | |
} | |
} | |
if (effect.type === "refinement") { | |
const executeRefinement = (acc | |
// effect: RefinementEffect<any> | |
) => { | |
const result = effect.refinement(acc, checkCtx); | |
if (ctx.common.async) { | |
return Promise.resolve(result); | |
} | |
if (result instanceof Promise) { | |
throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead."); | |
} | |
return acc; | |
}; | |
if (ctx.common.async === false) { | |
const inner = this._def.schema._parseSync({ | |
data: ctx.data, | |
path: ctx.path, | |
parent: ctx, | |
}); | |
if (inner.status === "aborted") | |
return INVALID; | |
if (inner.status === "dirty") | |
status.dirty(); | |
// return value is ignored | |
executeRefinement(inner.value); | |
return { status: status.value, value: inner.value }; | |
} | |
else { | |
return this._def.schema | |
._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }) | |
.then((inner) => { | |
if (inner.status === "aborted") | |
return INVALID; | |
if (inner.status === "dirty") | |
status.dirty(); | |
return executeRefinement(inner.value).then(() => { | |
return { status: status.value, value: inner.value }; | |
}); | |
}); | |
} | |
} | |
if (effect.type === "transform") { | |
if (ctx.common.async === false) { | |
const base = this._def.schema._parseSync({ | |
data: ctx.data, | |
path: ctx.path, | |
parent: ctx, | |
}); | |
if (!isValid(base)) | |
return base; | |
const result = effect.transform(base.value, checkCtx); | |
if (result instanceof Promise) { | |
throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`); | |
} | |
return { status: status.value, value: result }; | |
} | |
else { | |
return this._def.schema | |
._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }) | |
.then((base) => { | |
if (!isValid(base)) | |
return base; | |
return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ status: status.value, value: result })); | |
}); | |
} | |
} | |
exports.util.assertNever(effect); | |
} | |
} | |
ZodEffects.create = (schema, effect, params) => { | |
return new ZodEffects({ | |
schema, | |
typeName: exports.ZodFirstPartyTypeKind.ZodEffects, | |
effect, | |
...processCreateParams(params), | |
}); | |
}; | |
ZodEffects.createWithPreprocess = (preprocess, schema, params) => { | |
return new ZodEffects({ | |
schema, | |
effect: { type: "preprocess", transform: preprocess }, | |
typeName: exports.ZodFirstPartyTypeKind.ZodEffects, | |
...processCreateParams(params), | |
}); | |
}; | |
class ZodOptional extends ZodType { | |
_parse(input) { | |
const parsedType = this._getType(input); | |
if (parsedType === ZodParsedType.undefined) { | |
return OK(undefined); | |
} | |
return this._def.innerType._parse(input); | |
} | |
unwrap() { | |
return this._def.innerType; | |
} | |
} | |
ZodOptional.create = (type, params) => { | |
return new ZodOptional({ | |
innerType: type, | |
typeName: exports.ZodFirstPartyTypeKind.ZodOptional, | |
...processCreateParams(params), | |
}); | |
}; | |
class ZodNullable extends ZodType { | |
_parse(input) { | |
const parsedType = this._getType(input); | |
if (parsedType === ZodParsedType.null) { | |
return OK(null); | |
} | |
return this._def.innerType._parse(input); | |
} | |
unwrap() { | |
return this._def.innerType; | |
} | |
} | |
ZodNullable.create = (type, params) => { | |
return new ZodNullable({ | |
innerType: type, | |
typeName: exports.ZodFirstPartyTypeKind.ZodNullable, | |
...processCreateParams(params), | |
}); | |
}; | |
class ZodDefault extends ZodType { | |
_parse(input) { | |
const { ctx } = this._processInputParams(input); | |
let data = ctx.data; | |
if (ctx.parsedType === ZodParsedType.undefined) { | |
data = this._def.defaultValue(); | |
} | |
return this._def.innerType._parse({ | |
data, | |
path: ctx.path, | |
parent: ctx, | |
}); | |
} | |
removeDefault() { | |
return this._def.innerType; | |
} | |
} | |
ZodDefault.create = (type, params) => { | |
return new ZodDefault({ | |
innerType: type, | |
typeName: exports.ZodFirstPartyTypeKind.ZodDefault, | |
defaultValue: typeof params.default === "function" | |
? params.default | |
: () => params.default, | |
...processCreateParams(params), | |
}); | |
}; | |
class ZodCatch extends ZodType { | |
_parse(input) { | |
const { ctx } = this._processInputParams(input); | |
// newCtx is used to not collect issues from inner types in ctx | |
const newCtx = { | |
...ctx, | |
common: { | |
...ctx.common, | |
issues: [], | |
}, | |
}; | |
const result = this._def.innerType._parse({ | |
data: newCtx.data, | |
path: newCtx.path, | |
parent: { | |
...newCtx, | |
}, | |
}); | |
if (isAsync(result)) { | |
return result.then((result) => { | |
return { | |
status: "valid", | |
value: result.status === "valid" | |
? result.value | |
: this._def.catchValue({ | |
get error() { | |
return new ZodError(newCtx.common.issues); | |
}, | |
input: newCtx.data, | |
}), | |
}; | |
}); | |
} | |
else { | |
return { | |
status: "valid", | |
value: result.status === "valid" | |
? result.value | |
: this._def.catchValue({ | |
get error() { | |
return new ZodError(newCtx.common.issues); | |
}, | |
input: newCtx.data, | |
}), | |
}; | |
} | |
} | |
removeCatch() { | |
return this._def.innerType; | |
} | |
} | |
ZodCatch.create = (type, params) => { | |
return new ZodCatch({ | |
innerType: type, | |
typeName: exports.ZodFirstPartyTypeKind.ZodCatch, | |
catchValue: typeof params.catch === "function" ? params.catch : () => params.catch, | |
...processCreateParams(params), | |
}); | |
}; | |
class ZodNaN extends ZodType { | |
_parse(input) { | |
const parsedType = this._getType(input); | |
if (parsedType !== ZodParsedType.nan) { | |
const ctx = this._getOrReturnCtx(input); | |
addIssueToContext(ctx, { | |
code: ZodIssueCode.invalid_type, | |
expected: ZodParsedType.nan, | |
received: ctx.parsedType, | |
}); | |
return INVALID; | |
} | |
return { status: "valid", value: input.data }; | |
} | |
} | |
ZodNaN.create = (params) => { | |
return new ZodNaN({ | |
typeName: exports.ZodFirstPartyTypeKind.ZodNaN, | |
...processCreateParams(params), | |
}); | |
}; | |
const BRAND = Symbol("zod_brand"); | |
class ZodBranded extends ZodType { | |
_parse(input) { | |
const { ctx } = this._processInputParams(input); | |
const data = ctx.data; | |
return this._def.type._parse({ | |
data, | |
path: ctx.path, | |
parent: ctx, | |
}); | |
} | |
unwrap() { | |
return this._def.type; | |
} | |
} | |
class ZodPipeline extends ZodType { | |
_parse(input) { | |
const { status, ctx } = this._processInputParams(input); | |
if (ctx.common.async) { | |
const handleAsync = async () => { | |
const inResult = await this._def.in._parseAsync({ | |
data: ctx.data, | |
path: ctx.path, | |
parent: ctx, | |
}); | |
if (inResult.status === "aborted") | |
return INVALID; | |
if (inResult.status === "dirty") { | |
status.dirty(); | |
return DIRTY(inResult.value); | |
} | |
else { | |
return this._def.out._parseAsync({ | |
data: inResult.value, | |
path: ctx.path, | |
parent: ctx, | |
}); | |
} | |
}; | |
return handleAsync(); | |
} | |
else { | |
const inResult = this._def.in._parseSync({ | |
data: ctx.data, | |
path: ctx.path, | |
parent: ctx, | |
}); | |
if (inResult.status === "aborted") | |
return INVALID; | |
if (inResult.status === "dirty") { | |
status.dirty(); | |
return { | |
status: "dirty", | |
value: inResult.value, | |
}; | |
} | |
else { | |
return this._def.out._parseSync({ | |
data: inResult.value, | |
path: ctx.path, | |
parent: ctx, | |
}); | |
} | |
} | |
} | |
static create(a, b) { | |
return new ZodPipeline({ | |
in: a, | |
out: b, | |
typeName: exports.ZodFirstPartyTypeKind.ZodPipeline, | |
}); | |
} | |
} | |
class ZodReadonly extends ZodType { | |
_parse(input) { | |
const result = this._def.innerType._parse(input); | |
if (isValid(result)) { | |
result.value = Object.freeze(result.value); | |
} | |
return result; | |
} | |
} | |
ZodReadonly.create = (type, params) => { | |
return new ZodReadonly({ | |
innerType: type, | |
typeName: exports.ZodFirstPartyTypeKind.ZodReadonly, | |
...processCreateParams(params), | |
}); | |
}; | |
const custom = (check, params = {}, | |
/** | |
* @deprecated | |
* | |
* Pass `fatal` into the params object instead: | |
* | |
* ```ts | |
* z.string().custom((val) => val.length > 5, { fatal: false }) | |
* ``` | |
* | |
*/ | |
fatal) => { | |
if (check) | |
return ZodAny.create().superRefine((data, ctx) => { | |
var _a, _b; | |
if (!check(data)) { | |
const p = typeof params === "function" | |
? params(data) | |
: typeof params === "string" | |
? { message: params } | |
: params; | |
const _fatal = (_b = (_a = p.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true; | |
const p2 = typeof p === "string" ? { message: p } : p; | |
ctx.addIssue({ code: "custom", ...p2, fatal: _fatal }); | |
} | |
}); | |
return ZodAny.create(); | |
}; | |
const late = { | |
object: ZodObject.lazycreate, | |
}; | |
exports.ZodFirstPartyTypeKind = void 0; | |
(function (ZodFirstPartyTypeKind) { | |
ZodFirstPartyTypeKind["ZodString"] = "ZodString"; | |
ZodFirstPartyTypeKind["ZodNumber"] = "ZodNumber"; | |
ZodFirstPartyTypeKind["ZodNaN"] = "ZodNaN"; | |
ZodFirstPartyTypeKind["ZodBigInt"] = "ZodBigInt"; | |
ZodFirstPartyTypeKind["ZodBoolean"] = "ZodBoolean"; | |
ZodFirstPartyTypeKind["ZodDate"] = "ZodDate"; | |
ZodFirstPartyTypeKind["ZodSymbol"] = "ZodSymbol"; | |
ZodFirstPartyTypeKind["ZodUndefined"] = "ZodUndefined"; | |
ZodFirstPartyTypeKind["ZodNull"] = "ZodNull"; | |
ZodFirstPartyTypeKind["ZodAny"] = "ZodAny"; | |
ZodFirstPartyTypeKind["ZodUnknown"] = "ZodUnknown"; | |
ZodFirstPartyTypeKind["ZodNever"] = "ZodNever"; | |
ZodFirstPartyTypeKind["ZodVoid"] = "ZodVoid"; | |
ZodFirstPartyTypeKind["ZodArray"] = "ZodArray"; | |
ZodFirstPartyTypeKind["ZodObject"] = "ZodObject"; | |
ZodFirstPartyTypeKind["ZodUnion"] = "ZodUnion"; | |
ZodFirstPartyTypeKind["ZodDiscriminatedUnion"] = "ZodDiscriminatedUnion"; | |
ZodFirstPartyTypeKind["ZodIntersection"] = "ZodIntersection"; | |
ZodFirstPartyTypeKind["ZodTuple"] = "ZodTuple"; | |
ZodFirstPartyTypeKind["ZodRecord"] = "ZodRecord"; | |
ZodFirstPartyTypeKind["ZodMap"] = "ZodMap"; | |
ZodFirstPartyTypeKind["ZodSet"] = "ZodSet"; | |
ZodFirstPartyTypeKind["ZodFunction"] = "ZodFunction"; | |
ZodFirstPartyTypeKind["ZodLazy"] = "ZodLazy"; | |
ZodFirstPartyTypeKind["ZodLiteral"] = "ZodLiteral"; | |
ZodFirstPartyTypeKind["ZodEnum"] = "ZodEnum"; | |
ZodFirstPartyTypeKind["ZodEffects"] = "ZodEffects"; | |
ZodFirstPartyTypeKind["ZodNativeEnum"] = "ZodNativeEnum"; | |
ZodFirstPartyTypeKind["ZodOptional"] = "ZodOptional"; | |
ZodFirstPartyTypeKind["ZodNullable"] = "ZodNullable"; | |
ZodFirstPartyTypeKind["ZodDefault"] = "ZodDefault"; | |
ZodFirstPartyTypeKind["ZodCatch"] = "ZodCatch"; | |
ZodFirstPartyTypeKind["ZodPromise"] = "ZodPromise"; | |
ZodFirstPartyTypeKind["ZodBranded"] = "ZodBranded"; | |
ZodFirstPartyTypeKind["ZodPipeline"] = "ZodPipeline"; | |
ZodFirstPartyTypeKind["ZodReadonly"] = "ZodReadonly"; | |
})(exports.ZodFirstPartyTypeKind || (exports.ZodFirstPartyTypeKind = {})); | |
const instanceOfType = ( | |
// const instanceOfType = <T extends new (...args: any[]) => any>( | |
cls, params = { | |
message: `Input not instance of ${cls.name}`, | |
}) => custom((data) => data instanceof cls, params); | |
const stringType = ZodString.create; | |
const numberType = ZodNumber.create; | |
const nanType = ZodNaN.create; | |
const bigIntType = ZodBigInt.create; | |
const booleanType = ZodBoolean.create; | |
const dateType = ZodDate.create; | |
const symbolType = ZodSymbol.create; | |
const undefinedType = ZodUndefined.create; | |
const nullType = ZodNull.create; | |
const anyType = ZodAny.create; | |
const unknownType = ZodUnknown.create; | |
const neverType = ZodNever.create; | |
const voidType = ZodVoid.create; | |
const arrayType = ZodArray.create; | |
const objectType = ZodObject.create; | |
const strictObjectType = ZodObject.strictCreate; | |
const unionType = ZodUnion.create; | |
const discriminatedUnionType = ZodDiscriminatedUnion.create; | |
const intersectionType = ZodIntersection.create; | |
const tupleType = ZodTuple.create; | |
const recordType = ZodRecord.create; | |
const mapType = ZodMap.create; | |
const setType = ZodSet.create; | |
const functionType = ZodFunction.create; | |
const lazyType = ZodLazy.create; | |
const literalType = ZodLiteral.create; | |
const enumType = ZodEnum.create; | |
const nativeEnumType = ZodNativeEnum.create; | |
const promiseType = ZodPromise.create; | |
const effectsType = ZodEffects.create; | |
const optionalType = ZodOptional.create; | |
const nullableType = ZodNullable.create; | |
const preprocessType = ZodEffects.createWithPreprocess; | |
const pipelineType = ZodPipeline.create; | |
const ostring = () => stringType().optional(); | |
const onumber = () => numberType().optional(); | |
const oboolean = () => booleanType().optional(); | |
const coerce = { | |
string: ((arg) => ZodString.create({ ...arg, coerce: true })), | |
number: ((arg) => ZodNumber.create({ ...arg, coerce: true })), | |
boolean: ((arg) => ZodBoolean.create({ | |
...arg, | |
coerce: true, | |
})), | |
bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })), | |
date: ((arg) => ZodDate.create({ ...arg, coerce: true })), | |
}; | |
const NEVER = INVALID; | |
var z = /*#__PURE__*/Object.freeze({ | |
__proto__: null, | |
defaultErrorMap: errorMap, | |
setErrorMap: setErrorMap, | |
getErrorMap: getErrorMap, | |
makeIssue: makeIssue, | |
EMPTY_PATH: EMPTY_PATH, | |
addIssueToContext: addIssueToContext, | |
ParseStatus: ParseStatus, | |
INVALID: INVALID, | |
DIRTY: DIRTY, | |
OK: OK, | |
isAborted: isAborted, | |
isDirty: isDirty, | |
isValid: isValid, | |
isAsync: isAsync, | |
get util () { return exports.util; }, | |
get objectUtil () { return exports.objectUtil; }, | |
ZodParsedType: ZodParsedType, | |
getParsedType: getParsedType, | |
ZodType: ZodType, | |
ZodString: ZodString, | |
ZodNumber: ZodNumber, | |
ZodBigInt: ZodBigInt, | |
ZodBoolean: ZodBoolean, | |
ZodDate: ZodDate, | |
ZodSymbol: ZodSymbol, | |
ZodUndefined: ZodUndefined, | |
ZodNull: ZodNull, | |
ZodAny: ZodAny, | |
ZodUnknown: ZodUnknown, | |
ZodNever: ZodNever, | |
ZodVoid: ZodVoid, | |
ZodArray: ZodArray, | |
ZodObject: ZodObject, | |
ZodUnion: ZodUnion, | |
ZodDiscriminatedUnion: ZodDiscriminatedUnion, | |
ZodIntersection: ZodIntersection, | |
ZodTuple: ZodTuple, | |
ZodRecord: ZodRecord, | |
ZodMap: ZodMap, | |
ZodSet: ZodSet, | |
ZodFunction: ZodFunction, | |
ZodLazy: ZodLazy, | |
ZodLiteral: ZodLiteral, | |
ZodEnum: ZodEnum, | |
ZodNativeEnum: ZodNativeEnum, | |
ZodPromise: ZodPromise, | |
ZodEffects: ZodEffects, | |
ZodTransformer: ZodEffects, | |
ZodOptional: ZodOptional, | |
ZodNullable: ZodNullable, | |
ZodDefault: ZodDefault, | |
ZodCatch: ZodCatch, | |
ZodNaN: ZodNaN, | |
BRAND: BRAND, | |
ZodBranded: ZodBranded, | |
ZodPipeline: ZodPipeline, | |
ZodReadonly: ZodReadonly, | |
custom: custom, | |
Schema: ZodType, | |
ZodSchema: ZodType, | |
late: late, | |
get ZodFirstPartyTypeKind () { return exports.ZodFirstPartyTypeKind; }, | |
coerce: coerce, | |
any: anyType, | |
array: arrayType, | |
bigint: bigIntType, | |
boolean: booleanType, | |
date: dateType, | |
discriminatedUnion: discriminatedUnionType, | |
effect: effectsType, | |
'enum': enumType, | |
'function': functionType, | |
'instanceof': instanceOfType, | |
intersection: intersectionType, | |
lazy: lazyType, | |
literal: literalType, | |
map: mapType, | |
nan: nanType, | |
nativeEnum: nativeEnumType, | |
never: neverType, | |
'null': nullType, | |
nullable: nullableType, | |
number: numberType, | |
object: objectType, | |
oboolean: oboolean, | |
onumber: onumber, | |
optional: optionalType, | |
ostring: ostring, | |
pipeline: pipelineType, | |
preprocess: preprocessType, | |
promise: promiseType, | |
record: recordType, | |
set: setType, | |
strictObject: strictObjectType, | |
string: stringType, | |
symbol: symbolType, | |
transformer: effectsType, | |
tuple: tupleType, | |
'undefined': undefinedType, | |
union: unionType, | |
unknown: unknownType, | |
'void': voidType, | |
NEVER: NEVER, | |
ZodIssueCode: ZodIssueCode, | |
quotelessJson: quotelessJson, | |
ZodError: ZodError | |
}); | |
exports.BRAND = BRAND; | |
exports.DIRTY = DIRTY; | |
exports.EMPTY_PATH = EMPTY_PATH; | |
exports.INVALID = INVALID; | |
exports.NEVER = NEVER; | |
exports.OK = OK; | |
exports.ParseStatus = ParseStatus; | |
exports.Schema = ZodType; | |
exports.ZodAny = ZodAny; | |
exports.ZodArray = ZodArray; | |
exports.ZodBigInt = ZodBigInt; | |
exports.ZodBoolean = ZodBoolean; | |
exports.ZodBranded = ZodBranded; | |
exports.ZodCatch = ZodCatch; | |
exports.ZodDate = ZodDate; | |
exports.ZodDefault = ZodDefault; | |
exports.ZodDiscriminatedUnion = ZodDiscriminatedUnion; | |
exports.ZodEffects = ZodEffects; | |
exports.ZodEnum = ZodEnum; | |
exports.ZodError = ZodError; | |
exports.ZodFunction = ZodFunction; | |
exports.ZodIntersection = ZodIntersection; | |
exports.ZodIssueCode = ZodIssueCode; | |
exports.ZodLazy = ZodLazy; | |
exports.ZodLiteral = ZodLiteral; | |
exports.ZodMap = ZodMap; | |
exports.ZodNaN = ZodNaN; | |
exports.ZodNativeEnum = ZodNativeEnum; | |
exports.ZodNever = ZodNever; | |
exports.ZodNull = ZodNull; | |
exports.ZodNullable = ZodNullable; | |
exports.ZodNumber = ZodNumber; | |
exports.ZodObject = ZodObject; | |
exports.ZodOptional = ZodOptional; | |
exports.ZodParsedType = ZodParsedType; | |
exports.ZodPipeline = ZodPipeline; | |
exports.ZodPromise = ZodPromise; | |
exports.ZodReadonly = ZodReadonly; | |
exports.ZodRecord = ZodRecord; | |
exports.ZodSchema = ZodType; | |
exports.ZodSet = ZodSet; | |
exports.ZodString = ZodString; | |
exports.ZodSymbol = ZodSymbol; | |
exports.ZodTransformer = ZodEffects; | |
exports.ZodTuple = ZodTuple; | |
exports.ZodType = ZodType; | |
exports.ZodUndefined = ZodUndefined; | |
exports.ZodUnion = ZodUnion; | |
exports.ZodUnknown = ZodUnknown; | |
exports.ZodVoid = ZodVoid; | |
exports.addIssueToContext = addIssueToContext; | |
exports.any = anyType; | |
exports.array = arrayType; | |
exports.bigint = bigIntType; | |
exports.boolean = booleanType; | |
exports.coerce = coerce; | |
exports.custom = custom; | |
exports.date = dateType; | |
exports["default"] = z; | |
exports.defaultErrorMap = errorMap; | |
exports.discriminatedUnion = discriminatedUnionType; | |
exports.effect = effectsType; | |
exports["enum"] = enumType; | |
exports["function"] = functionType; | |
exports.getErrorMap = getErrorMap; | |
exports.getParsedType = getParsedType; | |
exports["instanceof"] = instanceOfType; | |
exports.intersection = intersectionType; | |
exports.isAborted = isAborted; | |
exports.isAsync = isAsync; | |
exports.isDirty = isDirty; | |
exports.isValid = isValid; | |
exports.late = late; | |
exports.lazy = lazyType; | |
exports.literal = literalType; | |
exports.makeIssue = makeIssue; | |
exports.map = mapType; | |
exports.nan = nanType; | |
exports.nativeEnum = nativeEnumType; | |
exports.never = neverType; | |
exports["null"] = nullType; | |
exports.nullable = nullableType; | |
exports.number = numberType; | |
exports.object = objectType; | |
exports.oboolean = oboolean; | |
exports.onumber = onumber; | |
exports.optional = optionalType; | |
exports.ostring = ostring; | |
exports.pipeline = pipelineType; | |
exports.preprocess = preprocessType; | |
exports.promise = promiseType; | |
exports.quotelessJson = quotelessJson; | |
exports.record = recordType; | |
exports.set = setType; | |
exports.setErrorMap = setErrorMap; | |
exports.strictObject = strictObjectType; | |
exports.string = stringType; | |
exports.symbol = symbolType; | |
exports.transformer = effectsType; | |
exports.tuple = tupleType; | |
exports["undefined"] = undefinedType; | |
exports.union = unionType; | |
exports.unknown = unknownType; | |
exports["void"] = voidType; | |
exports.z = z; | |
Object.defineProperty(exports, '__esModule', { value: true }); | |
})); | |