4352 lines
165 KiB
JavaScript
4352 lines
165 KiB
JavaScript
|
(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;
|
|||
|
}
|
|||
|
static assert(value) {
|
|||
|
if (!(value instanceof ZodError)) {
|
|||
|
throw new Error(`Not a ZodError: ${value}`);
|
|||
|
}
|
|||
|
}
|
|||
|
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,
|
|||
|
};
|
|||
|
if (issueData.message !== undefined) {
|
|||
|
return {
|
|||
|
...issueData,
|
|||
|
path: fullPath,
|
|||
|
message: issueData.message,
|
|||
|
};
|
|||
|
}
|
|||
|
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: errorMessage,
|
|||
|
};
|
|||
|
};
|
|||
|
const EMPTY_PATH = [];
|
|||
|
function addIssueToContext(ctx, issueData) {
|
|||
|
const overrideMap = getErrorMap();
|
|||
|
const issue = makeIssue({
|
|||
|
issueData: issueData,
|
|||
|
data: ctx.data,
|
|||
|
path: ctx.path,
|
|||
|
errorMaps: [
|
|||
|
ctx.common.contextualErrorMap,
|
|||
|
ctx.schemaErrorMap,
|
|||
|
overrideMap,
|
|||
|
overrideMap === errorMap ? undefined : 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) {
|
|||
|
const key = await pair.key;
|
|||
|
const value = await pair.value;
|
|||
|
syncPairs.push({
|
|||
|
key,
|
|||
|
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;
|
|||
|
|
|||
|
/******************************************************************************
|
|||
|
Copyright (c) Microsoft Corporation.
|
|||
|
|
|||
|
Permission to use, copy, modify, and/or distribute this software for any
|
|||
|
purpose with or without fee is hereby granted.
|
|||
|
|
|||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|||
|
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|||
|
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|||
|
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|||
|
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|||
|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|||
|
PERFORMANCE OF THIS SOFTWARE.
|
|||
|
***************************************************************************** */
|
|||
|
|
|||
|
function __classPrivateFieldGet(receiver, state, kind, f) {
|
|||
|
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|||
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|||
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|||
|
}
|
|||
|
|
|||
|
function __classPrivateFieldSet(receiver, state, value, kind, f) {
|
|||
|
if (kind === "m") throw new TypeError("Private method is not writable");
|
|||
|
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|||
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|||
|
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|||
|
}
|
|||
|
|
|||
|
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|||
|
var e = new Error(message);
|
|||
|
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|||
|
};
|
|||
|
|
|||
|
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 = {}));
|
|||
|
|
|||
|
var _ZodEnum_cache, _ZodNativeEnum_cache;
|
|||
|
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) => {
|
|||
|
var _a, _b;
|
|||
|
const { message } = params;
|
|||
|
if (iss.code === "invalid_enum_value") {
|
|||
|
return { message: message !== null && message !== void 0 ? message : ctx.defaultError };
|
|||
|
}
|
|||
|
if (typeof ctx.data === "undefined") {
|
|||
|
return { message: (_a = message !== null && message !== void 0 ? message : required_error) !== null && _a !== void 0 ? _a : ctx.defaultError };
|
|||
|
}
|
|||
|
if (iss.code !== "invalid_type")
|
|||
|
return { message: ctx.defaultError };
|
|||
|
return { message: (_b = message !== null && message !== void 0 ? message : invalid_type_error) !== null && _b !== void 0 ? _b : 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 = /^[0-9a-z]+$/;
|
|||
|
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;
|
|||
|
const nanoidRegex = /^[a-z0-9_-]{21}$/i;
|
|||
|
const durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/;
|
|||
|
// 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;
|
|||
|
// faster, simpler, safer
|
|||
|
const ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;
|
|||
|
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})))$/;
|
|||
|
// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript
|
|||
|
const base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;
|
|||
|
// simple
|
|||
|
// const dateRegexSource = `\\d{4}-\\d{2}-\\d{2}`;
|
|||
|
// no leap year validation
|
|||
|
// const dateRegexSource = `\\d{4}-((0[13578]|10|12)-31|(0[13-9]|1[0-2])-30|(0[1-9]|1[0-2])-(0[1-9]|1\\d|2\\d))`;
|
|||
|
// with leap year validation
|
|||
|
const dateRegexSource = `((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))`;
|
|||
|
const dateRegex = new RegExp(`^${dateRegexSource}$`);
|
|||
|
function timeRegexSource(args) {
|
|||
|
// let regex = `\\d{2}:\\d{2}:\\d{2}`;
|
|||
|
let regex = `([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d`;
|
|||
|
if (args.precision) {
|
|||
|
regex = `${regex}\\.\\d{${args.precision}}`;
|
|||
|
}
|
|||
|
else if (args.precision == null) {
|
|||
|
regex = `${regex}(\\.\\d+)?`;
|
|||
|
}
|
|||
|
return regex;
|
|||
|
}
|
|||
|
function timeRegex(args) {
|
|||
|
return new RegExp(`^${timeRegexSource(args)}$`);
|
|||
|
}
|
|||
|
// Adapted from https://stackoverflow.com/a/3143231
|
|||
|
function datetimeRegex(args) {
|
|||
|
let regex = `${dateRegexSource}T${timeRegexSource(args)}`;
|
|||
|
const opts = [];
|
|||
|
opts.push(args.local ? `Z?` : `Z`);
|
|||
|
if (args.offset)
|
|||
|
opts.push(`([+-]\\d{2}:?\\d{2})`);
|
|||
|
regex = `${regex}(${opts.join("|")})`;
|
|||
|
return new RegExp(`^${regex}$`);
|
|||
|
}
|
|||
|
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 === "nanoid") {
|
|||
|
if (!nanoidRegex.test(input.data)) {
|
|||
|
ctx = this._getOrReturnCtx(input, ctx);
|
|||
|
addIssueToContext(ctx, {
|
|||
|
validation: "nanoid",
|
|||
|
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 === "date") {
|
|||
|
const regex = dateRegex;
|
|||
|
if (!regex.test(input.data)) {
|
|||
|
ctx = this._getOrReturnCtx(input, ctx);
|
|||
|
addIssueToContext(ctx, {
|
|||
|
code: ZodIssueCode.invalid_string,
|
|||
|
validation: "date",
|
|||
|
message: check.message,
|
|||
|
});
|
|||
|
status.dirty();
|
|||
|
}
|
|||
|
}
|
|||
|
else if (check.kind === "time") {
|
|||
|
const regex = timeRegex(check);
|
|||
|
if (!regex.test(input.data)) {
|
|||
|
ctx = this._getOrReturnCtx(input, ctx);
|
|||
|
addIssueToContext(ctx, {
|
|||
|
code: ZodIssueCode.invalid_string,
|
|||
|
validation: "time",
|
|||
|
message: check.message,
|
|||
|
});
|
|||
|
status.dirty();
|
|||
|
}
|
|||
|
}
|
|||
|
else if (check.kind === "duration") {
|
|||
|
if (!durationRegex.test(input.data)) {
|
|||
|
ctx = this._getOrReturnCtx(input, ctx);
|
|||
|
addIssueToContext(ctx, {
|
|||
|
validation: "duration",
|
|||
|
code: ZodIssueCode.invalid_string,
|
|||
|
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 if (check.kind === "base64") {
|
|||
|
if (!base64Regex.test(input.data)) {
|
|||
|
ctx = this._getOrReturnCtx(input, ctx);
|
|||
|
addIssueToContext(ctx, {
|
|||
|
validation: "base64",
|
|||
|
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) });
|
|||
|
}
|
|||
|
nanoid(message) {
|
|||
|
return this._addCheck({ kind: "nanoid", ...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) });
|
|||
|
}
|
|||
|
base64(message) {
|
|||
|
return this._addCheck({ kind: "base64", ...errorUtil.errToObj(message) });
|
|||
|
}
|
|||
|
ip(options) {
|
|||
|
return this._addCheck({ kind: "ip", ...errorUtil.errToObj(options) });
|
|||
|
}
|
|||
|
datetime(options) {
|
|||
|
var _a, _b;
|
|||
|
if (typeof options === "string") {
|
|||
|
return this._addCheck({
|
|||
|
kind: "datetime",
|
|||
|
precision: null,
|
|||
|
offset: false,
|
|||
|
local: 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,
|
|||
|
local: (_b = options === null || options === void 0 ? void 0 : options.local) !== null && _b !== void 0 ? _b : false,
|
|||
|
...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),
|
|||
|
});
|
|||
|
}
|
|||
|
date(message) {
|
|||
|
return this._addCheck({ kind: "date", message });
|
|||
|
}
|
|||
|
time(options) {
|
|||
|
if (typeof options === "string") {
|
|||
|
return this._addCheck({
|
|||
|
kind: "time",
|
|||
|
precision: null,
|
|||
|
message: options,
|
|||
|
});
|
|||
|
}
|
|||
|
return this._addCheck({
|
|||
|
kind: "time",
|
|||
|
precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === "undefined" ? null : options === null || options === void 0 ? void 0 : options.precision,
|
|||
|
...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),
|
|||
|
});
|
|||
|
}
|
|||
|
duration(message) {
|
|||
|
return this._addCheck({ kind: "duration", ...errorUtil.errToObj(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 isDate() {
|
|||
|
return !!this._def.checks.find((ch) => ch.kind === "date");
|
|||
|
}
|
|||
|
get isTime() {
|
|||
|
return !!this._def.checks.find((ch) => ch.kind === "time");
|
|||
|
}
|
|||
|
get isDuration() {
|
|||
|
return !!this._def.checks.find((ch) => ch.kind === "duration");
|
|||
|
}
|
|||
|
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 isNANOID() {
|
|||
|
return !!this._def.checks.find((ch) => ch.kind === "nanoid");
|
|||
|
}
|
|||
|
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 isBase64() {
|
|||
|
return !!this._def.checks.find((ch) => ch.kind === "base64");
|
|||
|
}
|
|||
|
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;
|
|||
|
const value = await pair.value;
|
|||
|
syncPairs.push({
|
|||
|
key,
|
|||
|
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 zod@1.0.12 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 exports.util.objectValues(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 if (type instanceof ZodOptional) {
|
|||
|
return [undefined, ...getDiscriminator(type.unwrap())];
|
|||
|
}
|
|||
|
else if (type instanceof ZodNullable) {
|
|||
|
return [null, ...getDiscriminator(type.unwrap())];
|
|||
|
}
|
|||
|
else if (type instanceof ZodBranded) {
|
|||
|
return getDiscriminator(type.unwrap());
|
|||
|
}
|
|||
|
else if (type instanceof ZodReadonly) {
|
|||
|
return getDiscriminator(type.unwrap());
|
|||
|
}
|
|||
|
else if (type instanceof ZodCatch) {
|
|||
|
return getDiscriminator(type._def.innerType);
|
|||
|
}
|
|||
|
else {
|
|||
|
return [];
|
|||
|
}
|
|||
|
};
|
|||
|
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.length) {
|
|||
|
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)),
|
|||
|
alwaysSet: key in ctx.data,
|
|||
|
});
|
|||
|
}
|
|||
|
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 {
|
|||
|
constructor() {
|
|||
|
super(...arguments);
|
|||
|
_ZodEnum_cache.set(this, void 0);
|
|||
|
}
|
|||
|
_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 (!__classPrivateFieldGet(this, _ZodEnum_cache, "f")) {
|
|||
|
__classPrivateFieldSet(this, _ZodEnum_cache, new Set(this._def.values), "f");
|
|||
|
}
|
|||
|
if (!__classPrivateFieldGet(this, _ZodEnum_cache, "f").has(input.data)) {
|
|||
|
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, newDef = this._def) {
|
|||
|
return ZodEnum.create(values, {
|
|||
|
...this._def,
|
|||
|
...newDef,
|
|||
|
});
|
|||
|
}
|
|||
|
exclude(values, newDef = this._def) {
|
|||
|
return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), {
|
|||
|
...this._def,
|
|||
|
...newDef,
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
_ZodEnum_cache = new WeakMap();
|
|||
|
ZodEnum.create = createZodEnum;
|
|||
|
class ZodNativeEnum extends ZodType {
|
|||
|
constructor() {
|
|||
|
super(...arguments);
|
|||
|
_ZodNativeEnum_cache.set(this, void 0);
|
|||
|
}
|
|||
|
_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 (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, "f")) {
|
|||
|
__classPrivateFieldSet(this, _ZodNativeEnum_cache, new Set(exports.util.getValidEnumValues(this._def.values)), "f");
|
|||
|
}
|
|||
|
if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, "f").has(input.data)) {
|
|||
|
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_cache = new WeakMap();
|
|||
|
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.async) {
|
|||
|
return Promise.resolve(processed).then(async (processed) => {
|
|||
|
if (status.value === "aborted")
|
|||
|
return INVALID;
|
|||
|
const result = await this._def.schema._parseAsync({
|
|||
|
data: processed,
|
|||
|
path: ctx.path,
|
|||
|
parent: ctx,
|
|||
|
});
|
|||
|
if (result.status === "aborted")
|
|||
|
return INVALID;
|
|||
|
if (result.status === "dirty")
|
|||
|
return DIRTY(result.value);
|
|||
|
if (status.value === "dirty")
|
|||
|
return DIRTY(result.value);
|
|||
|
return result;
|
|||
|
});
|
|||
|
}
|
|||
|
else {
|
|||
|
if (status.value === "aborted")
|
|||
|
return INVALID;
|
|||
|
const result = this._def.schema._parseSync({
|
|||
|
data: processed,
|
|||
|
path: ctx.path,
|
|||
|
parent: ctx,
|
|||
|
});
|
|||
|
if (result.status === "aborted")
|
|||
|
return INVALID;
|
|||
|
if (result.status === "dirty")
|
|||
|
return DIRTY(result.value);
|
|||
|
if (status.value === "dirty")
|
|||
|
return DIRTY(result.value);
|
|||
|
return result;
|
|||
|
}
|
|||
|
}
|
|||
|
if (effect.type === "refinement") {
|
|||
|
const executeRefinement = (acc) => {
|
|||
|
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);
|
|||
|
const freeze = (data) => {
|
|||
|
if (isValid(data)) {
|
|||
|
data.value = Object.freeze(data.value);
|
|||
|
}
|
|||
|
return data;
|
|||
|
};
|
|||
|
return isAsync(result)
|
|||
|
? result.then((data) => freeze(data))
|
|||
|
: freeze(result);
|
|||
|
}
|
|||
|
unwrap() {
|
|||
|
return this._def.innerType;
|
|||
|
}
|
|||
|
}
|
|||
|
ZodReadonly.create = (type, params) => {
|
|||
|
return new ZodReadonly({
|
|||
|
innerType: type,
|
|||
|
typeName: exports.ZodFirstPartyTypeKind.ZodReadonly,
|
|||
|
...processCreateParams(params),
|
|||
|
});
|
|||
|
};
|
|||
|
function 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,
|
|||
|
datetimeRegex: datetimeRegex,
|
|||
|
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.datetimeRegex = datetimeRegex;
|
|||
|
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 });
|
|||
|
|
|||
|
}));
|