Notion MCP Server

by tkc
Verified
#!/usr/bin/env node // node_modules/zod/lib/index.mjs var util; (function(util2) { util2.assertEqual = (val) => val; function assertIs(_arg) {} util2.assertIs = assertIs; function assertNever(_x) { throw new Error; } util2.assertNever = assertNever; util2.arrayToEnum = (items) => { const obj = {}; for (const item of items) { obj[item] = item; } return obj; }; util2.getValidEnumValues = (obj) => { const validKeys = util2.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== "number"); const filtered = {}; for (const k of validKeys) { filtered[k] = obj[k]; } return util2.objectValues(filtered); }; util2.objectValues = (obj) => { return util2.objectKeys(obj).map(function(e) { return obj[e]; }); }; util2.objectKeys = typeof Object.keys === "function" ? (obj) => Object.keys(obj) : (object) => { const keys = []; for (const key in object) { if (Object.prototype.hasOwnProperty.call(object, key)) { keys.push(key); } } return keys; }; util2.find = (arr, checker) => { for (const item of arr) { if (checker(item)) return item; } return; }; util2.isInteger = typeof Number.isInteger === "function" ? (val) => Number.isInteger(val) : (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); } util2.joinValues = joinValues; util2.jsonStringifyReplacer = (_, value) => { if (typeof value === "bigint") { return value.toString(); } return value; }; })(util || (util = {})); var objectUtil; (function(objectUtil2) { objectUtil2.mergeShapes = (first, second) => { return { ...first, ...second }; }; })(objectUtil || (objectUtil = {})); var ZodParsedType = util.arrayToEnum([ "string", "nan", "number", "integer", "float", "boolean", "date", "bigint", "symbol", "function", "undefined", "null", "array", "object", "unknown", "promise", "void", "never", "map", "set" ]); var 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; } }; var ZodIssueCode = 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" ]); var quotelessJson = (obj) => { const json = JSON.stringify(obj, null, 2); return json.replace(/"([^"]+)":/g, "$1:"); }; class ZodError extends Error { get errors() { return this.issues; } 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) { Object.setPrototypeOf(this, actualProto); } else { this.__proto__ = actualProto; } this.name = "ZodError"; this.issues = 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: [] }; } 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, 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; }; var 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, util.jsonStringifyReplacer)}`; break; case ZodIssueCode.unrecognized_keys: message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, ", ")}`; break; case ZodIssueCode.invalid_union: message = `Invalid input`; break; case ZodIssueCode.invalid_union_discriminator: message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`; break; case ZodIssueCode.invalid_enum_value: message = `Invalid enum value. Expected ${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 { 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; util.assertNever(issue); } return { message }; }; var overrideErrorMap = errorMap; function setErrorMap(map) { overrideErrorMap = map; } function getErrorMap() { return overrideErrorMap; } var 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 }; }; var EMPTY_PATH = []; function addIssueToContext(ctx, issueData) { const overrideMap = getErrorMap(); const issue = makeIssue({ issueData, data: ctx.data, path: ctx.path, errorMaps: [ ctx.common.contextualErrorMap, ctx.schemaErrorMap, overrideMap, overrideMap === errorMap ? undefined : errorMap ].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 }; } } var INVALID = Object.freeze({ status: "aborted" }); var DIRTY = (value) => ({ status: "dirty", value }); var OK = (value) => ({ status: "valid", value }); var isAborted = (x) => x.status === "aborted"; var isDirty = (x) => x.status === "dirty"; var isValid = (x) => x.status === "valid"; var isAsync = (x) => typeof Promise !== "undefined" && x instanceof Promise; 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; } var errorUtil; (function(errorUtil2) { errorUtil2.errToObj = (message) => typeof message === "string" ? { message } : message || {}; errorUtil2.toString = (message) => typeof message === "string" ? message : message === null || message === undefined ? undefined : message.message; })(errorUtil || (errorUtil = {})); var _ZodEnum_cache; var _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; } } var 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: errorMap2, invalid_type_error, required_error, description } = params; if (errorMap2 && (invalid_type_error || required_error)) { throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`); } if (errorMap2) return { errorMap: errorMap2, description }; const customMap = (iss, ctx) => { var _a, _b; const { message } = params; if (iss.code === "invalid_enum_value") { return { message: message !== null && message !== undefined ? message : ctx.defaultError }; } if (typeof ctx.data === "undefined") { return { message: (_a = message !== null && message !== undefined ? message : required_error) !== null && _a !== undefined ? _a : ctx.defaultError }; } if (iss.code !== "invalid_type") return { message: ctx.defaultError }; return { message: (_b = message !== null && message !== undefined ? message : invalid_type_error) !== null && _b !== undefined ? _b : ctx.defaultError }; }; return { errorMap: customMap, description }; } class ZodType { 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 === undefined ? undefined : params.async) !== null && _a !== undefined ? _a : false, contextualErrorMap: params === null || params === undefined ? undefined : params.errorMap }, path: (params === null || params === undefined ? undefined : 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); } "~validate"(data) { var _a, _b; const ctx = { common: { issues: [], async: !!this["~standard"].async }, path: [], schemaErrorMap: this._def.errorMap, parent: null, data, parsedType: getParsedType(data) }; if (!this["~standard"].async) { try { const result = this._parseSync({ data, path: [], parent: ctx }); return isValid(result) ? { value: result.value } : { issues: ctx.common.issues }; } catch (err) { if ((_b = (_a = err === null || err === undefined ? undefined : err.message) === null || _a === undefined ? undefined : _a.toLowerCase()) === null || _b === undefined ? undefined : _b.includes("encountered")) { this["~standard"].async = true; } ctx.common = { issues: [], async: true }; } } return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result) ? { value: result.value } : { issues: ctx.common.issues }); } 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 === undefined ? undefined : params.errorMap, async: true }, path: (params === null || params === undefined ? undefined : 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: ZodFirstPartyTypeKind.ZodEffects, effect: { type: "refinement", refinement } }); } superRefine(refinement) { return this._refinement(refinement); } constructor(def) { 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); this["~standard"] = { version: 1, vendor: "zod", validate: (data) => this["~validate"](data) }; } optional() { return ZodOptional.create(this, this._def); } nullable() { return ZodNullable.create(this, this._def); } nullish() { return this.nullable().optional(); } array() { return ZodArray.create(this); } 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: 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: ZodFirstPartyTypeKind.ZodDefault }); } brand() { return new ZodBranded({ typeName: 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: 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; } } var cuidRegex = /^c[^\s-]{8,}$/i; var cuid2Regex = /^[0-9a-z]+$/; var ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i; var 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; var nanoidRegex = /^[a-z0-9_-]{21}$/i; var jwtRegex = /^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/; var 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)?)??$/; var emailRegex = /^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i; var _emojiRegex = `^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$`; var emojiRegex; var 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])$/; var ipv4CidrRegex = /^(?:(?: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])\/(3[0-2]|[12]?[0-9])$/; var ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/; var ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/; var base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/; var base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/; var 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])))`; var dateRegex = new RegExp(`^${dateRegexSource}$`); function timeRegexSource(args) { 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)}$`); } 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; } function isValidJWT(jwt, alg) { if (!jwtRegex.test(jwt)) return false; try { const [header] = jwt.split("."); const base64 = header.replace(/-/g, "+").replace(/_/g, "/").padEnd(header.length + (4 - header.length % 4) % 4, "="); const decoded = JSON.parse(atob(base64)); if (typeof decoded !== "object" || decoded === null) return false; if (!decoded.typ || !decoded.alg) return false; if (alg && decoded.alg !== alg) return false; return true; } catch (_a) { return false; } } function isValidCidr(ip, version) { if ((version === "v4" || !version) && ipv4CidrRegex.test(ip)) { return true; } if ((version === "v6" || !version) && ipv6CidrRegex.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 ctx2 = this._getOrReturnCtx(input); addIssueToContext(ctx2, { code: ZodIssueCode.invalid_type, expected: ZodParsedType.string, received: ctx2.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 === "jwt") { if (!isValidJWT(input.data, check.alg)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { validation: "jwt", code: ZodIssueCode.invalid_string, message: check.message }); status.dirty(); } } else if (check.kind === "cidr") { if (!isValidCidr(input.data, check.version)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { validation: "cidr", 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 if (check.kind === "base64url") { if (!base64urlRegex.test(input.data)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { validation: "base64url", code: ZodIssueCode.invalid_string, message: check.message }); status.dirty(); } } else { 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) }); } base64url(message) { return this._addCheck({ kind: "base64url", ...errorUtil.errToObj(message) }); } jwt(options) { return this._addCheck({ kind: "jwt", ...errorUtil.errToObj(options) }); } ip(options) { return this._addCheck({ kind: "ip", ...errorUtil.errToObj(options) }); } cidr(options) { return this._addCheck({ kind: "cidr", ...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 === undefined ? undefined : options.precision) === "undefined" ? null : options === null || options === undefined ? undefined : options.precision, offset: (_a = options === null || options === undefined ? undefined : options.offset) !== null && _a !== undefined ? _a : false, local: (_b = options === null || options === undefined ? undefined : options.local) !== null && _b !== undefined ? _b : false, ...errorUtil.errToObj(options === null || options === undefined ? undefined : 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 === undefined ? undefined : options.precision) === "undefined" ? null : options === null || options === undefined ? undefined : options.precision, ...errorUtil.errToObj(options === null || options === undefined ? undefined : options.message) }); } duration(message) { return this._addCheck({ kind: "duration", ...errorUtil.errToObj(message) }); } regex(regex, message) { return this._addCheck({ kind: "regex", regex, ...errorUtil.errToObj(message) }); } includes(value, options) { return this._addCheck({ kind: "includes", value, position: options === null || options === undefined ? undefined : options.position, ...errorUtil.errToObj(options === null || options === undefined ? undefined : options.message) }); } startsWith(value, message) { return this._addCheck({ kind: "startsWith", value, ...errorUtil.errToObj(message) }); } endsWith(value, message) { return this._addCheck({ kind: "endsWith", 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) }); } 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 isCIDR() { return !!this._def.checks.find((ch) => ch.kind === "cidr"); } get isBase64() { return !!this._def.checks.find((ch) => ch.kind === "base64"); } get isBase64url() { return !!this._def.checks.find((ch) => ch.kind === "base64url"); } 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: ZodFirstPartyTypeKind.ZodString, coerce: (_a = params === null || params === undefined ? undefined : params.coerce) !== null && _a !== undefined ? _a : false, ...processCreateParams(params) }); }; 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 ctx2 = this._getOrReturnCtx(input); addIssueToContext(ctx2, { code: ZodIssueCode.invalid_type, expected: ZodParsedType.number, received: ctx2.parsedType }); return INVALID; } let ctx = undefined; const status = new ParseStatus; for (const check of this._def.checks) { if (check.kind === "int") { if (!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 { 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, 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" && 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: ZodFirstPartyTypeKind.ZodNumber, coerce: (params === null || params === undefined ? undefined : 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) { try { input.data = BigInt(input.data); } catch (_a) { return this._getInvalidInput(input); } } const parsedType = this._getType(input); if (parsedType !== ZodParsedType.bigint) { return this._getInvalidInput(input); } 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 { util.assertNever(check); } } return { status: status.value, value: input.data }; } _getInvalidInput(input) { const ctx = this._getOrReturnCtx(input); addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, expected: ZodParsedType.bigint, received: ctx.parsedType }); return INVALID; } 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: ZodFirstPartyTypeKind.ZodBigInt, coerce: (_a = params === null || params === undefined ? undefined : params.coerce) !== null && _a !== undefined ? _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: ZodFirstPartyTypeKind.ZodBoolean, coerce: (params === null || params === undefined ? undefined : 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 ctx2 = this._getOrReturnCtx(input); addIssueToContext(ctx2, { code: ZodIssueCode.invalid_type, expected: ZodParsedType.date, received: ctx2.parsedType }); return INVALID; } if (isNaN(input.data.getTime())) { const ctx2 = this._getOrReturnCtx(input); addIssueToContext(ctx2, { 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 { 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 === undefined ? undefined : params.coerce) || false, typeName: 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: 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: 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: ZodFirstPartyTypeKind.ZodNull, ...processCreateParams(params) }); }; class ZodAny extends ZodType { constructor() { super(...arguments); this._any = true; } _parse(input) { return OK(input.data); } } ZodAny.create = (params) => { return new ZodAny({ typeName: ZodFirstPartyTypeKind.ZodAny, ...processCreateParams(params) }); }; class ZodUnknown extends ZodType { constructor() { super(...arguments); this._unknown = true; } _parse(input) { return OK(input.data); } } ZodUnknown.create = (params) => { return new ZodUnknown({ typeName: 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: 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: 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((result2) => { return ParseStatus.mergeArray(status, result2); }); } 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: 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; this.nonstrict = this.passthrough; this.augment = this.extend; } _getCached() { if (this._cached !== null) return this._cached; const shape = this._def.shape(); const keys = util.objectKeys(shape); return this._cached = { shape, keys }; } _parse(input) { const parsedType = this._getType(input); if (parsedType !== ZodParsedType.object) { const ctx2 = this._getOrReturnCtx(input); addIssueToContext(ctx2, { code: ZodIssueCode.invalid_type, expected: ZodParsedType.object, received: ctx2.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 { 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)), 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 === undefined ? undefined : _b.call(_a, issue, ctx).message) !== null && _c !== undefined ? _c : ctx.defaultError; if (issue.code === "unrecognized_keys") return { message: (_d = errorUtil.errToObj(message).message) !== null && _d !== undefined ? _d : defaultError }; return { message: defaultError }; } } : {} }); } strip() { return new ZodObject({ ...this._def, unknownKeys: "strip" }); } passthrough() { return new ZodObject({ ...this._def, unknownKeys: "passthrough" }); } extend(augmentation) { return new ZodObject({ ...this._def, shape: () => ({ ...this._def.shape(), ...augmentation }) }); } merge(merging) { const merged = new ZodObject({ unknownKeys: merging._def.unknownKeys, catchall: merging._def.catchall, shape: () => ({ ...this._def.shape(), ...merging._def.shape() }), typeName: ZodFirstPartyTypeKind.ZodObject }); return merged; } setKey(key, schema) { return this.augment({ [key]: schema }); } catchall(index) { return new ZodObject({ ...this._def, catchall: index }); } pick(mask) { const shape = {}; 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 = {}; util.objectKeys(this.shape).forEach((key) => { if (!mask[key]) { shape[key] = this.shape[key]; } }); return new ZodObject({ ...this._def, shape: () => shape }); } deepPartial() { return deepPartialify(this); } partial(mask) { const newShape = {}; 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 = {}; 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(util.objectKeys(this.shape)); } } ZodObject.create = (shape, params) => { return new ZodObject({ shape: () => shape, unknownKeys: "strip", catchall: ZodNever.create(), typeName: ZodFirstPartyTypeKind.ZodObject, ...processCreateParams(params) }); }; ZodObject.strictCreate = (shape, params) => { return new ZodObject({ shape: () => shape, unknownKeys: "strict", catchall: ZodNever.create(), typeName: ZodFirstPartyTypeKind.ZodObject, ...processCreateParams(params) }); }; ZodObject.lazycreate = (shape, params) => { return new ZodObject({ shape, unknownKeys: "strip", catchall: ZodNever.create(), typeName: ZodFirstPartyTypeKind.ZodObject, ...processCreateParams(params) }); }; class ZodUnion extends ZodType { _parse(input) { const { ctx } = this._processInputParams(input); const options = this._def.options; function handleResults(results) { for (const result of results) { if (result.result.status === "valid") { return result.result; } } for (const result of results) { if (result.result.status === "dirty") { ctx.common.issues.push(...result.ctx.common.issues); return result.result; } } 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((issues2) => new ZodError(issues2)); 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: ZodFirstPartyTypeKind.ZodUnion, ...processCreateParams(params) }); }; var 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) { return 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; } static create(discriminator, options, params) { const optionsMap = new Map; 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: 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 = util.objectKeys(b); const sharedKeys = 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, right, typeName: 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); 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: 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: ZodFirstPartyTypeKind.ZodRecord, ...processCreateParams(third) }); } return new ZodRecord({ keyType: ZodString.create(), valueType: first, typeName: 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: 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(elements2) { const parsedSet = new Set; for (const element of elements2) { 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((elements2) => finalizeSet(elements2)); } 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: 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) { 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 { 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: 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, typeName: 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, typeName: ZodFirstPartyTypeKind.ZodLiteral, ...processCreateParams(params) }); }; function createZodEnum(values, params) { return new ZodEnum({ values, typeName: ZodFirstPartyTypeKind.ZodEnum, ...processCreateParams(params) }); } class ZodEnum extends ZodType { constructor() { super(...arguments); _ZodEnum_cache.set(this, undefined); } _parse(input) { if (typeof input.data !== "string") { const ctx = this._getOrReturnCtx(input); const expectedValues = this._def.values; addIssueToContext(ctx, { expected: 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, undefined); } _parse(input) { const nativeEnumValues = util.getValidEnumValues(this._def.values); const ctx = this._getOrReturnCtx(input); if (ctx.parsedType !== ZodParsedType.string && ctx.parsedType !== ZodParsedType.number) { const expectedValues = util.objectValues(nativeEnumValues); addIssueToContext(ctx, { expected: util.joinValues(expectedValues), received: ctx.parsedType, code: ZodIssueCode.invalid_type }); return INVALID; } if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, "f")) { __classPrivateFieldSet(this, _ZodNativeEnum_cache, new Set(util.getValidEnumValues(this._def.values)), "f"); } if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, "f").has(input.data)) { const expectedValues = 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, typeName: 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: ZodFirstPartyTypeKind.ZodPromise, ...processCreateParams(params) }); }; class ZodEffects extends ZodType { innerType() { return this._def.schema; } sourceType() { return this._def.schema._def.typeName === 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 (processed2) => { if (status.value === "aborted") return INVALID; const result = await this._def.schema._parseAsync({ data: processed2, 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(); 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 })); }); } } util.assertNever(effect); } } ZodEffects.create = (schema, effect, params) => { return new ZodEffects({ schema, typeName: ZodFirstPartyTypeKind.ZodEffects, effect, ...processCreateParams(params) }); }; ZodEffects.createWithPreprocess = (preprocess, schema, params) => { return new ZodEffects({ schema, effect: { type: "preprocess", transform: preprocess }, typeName: 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: 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: 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: ZodFirstPartyTypeKind.ZodDefault, defaultValue: typeof params.default === "function" ? params.default : () => params.default, ...processCreateParams(params) }); }; class ZodCatch extends ZodType { _parse(input) { const { ctx } = this._processInputParams(input); 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((result2) => { return { status: "valid", value: result2.status === "valid" ? result2.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: 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: ZodFirstPartyTypeKind.ZodNaN, ...processCreateParams(params) }); }; var 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: 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: ZodFirstPartyTypeKind.ZodReadonly, ...processCreateParams(params) }); }; function cleanParams(params, data) { const p = typeof params === "function" ? params(data) : typeof params === "string" ? { message: params } : params; const p2 = typeof p === "string" ? { message: p } : p; return p2; } function custom(check, _params = {}, fatal) { if (check) return ZodAny.create().superRefine((data, ctx) => { var _a, _b; const r = check(data); if (r instanceof Promise) { return r.then((r2) => { var _a2, _b2; if (!r2) { const params = cleanParams(_params, data); const _fatal = (_b2 = (_a2 = params.fatal) !== null && _a2 !== undefined ? _a2 : fatal) !== null && _b2 !== undefined ? _b2 : true; ctx.addIssue({ code: "custom", ...params, fatal: _fatal }); } }); } if (!r) { const params = cleanParams(_params, data); const _fatal = (_b = (_a = params.fatal) !== null && _a !== undefined ? _a : fatal) !== null && _b !== undefined ? _b : true; ctx.addIssue({ code: "custom", ...params, fatal: _fatal }); } return; }); return ZodAny.create(); } var late = { object: ZodObject.lazycreate }; var ZodFirstPartyTypeKind; (function(ZodFirstPartyTypeKind2) { ZodFirstPartyTypeKind2["ZodString"] = "ZodString"; ZodFirstPartyTypeKind2["ZodNumber"] = "ZodNumber"; ZodFirstPartyTypeKind2["ZodNaN"] = "ZodNaN"; ZodFirstPartyTypeKind2["ZodBigInt"] = "ZodBigInt"; ZodFirstPartyTypeKind2["ZodBoolean"] = "ZodBoolean"; ZodFirstPartyTypeKind2["ZodDate"] = "ZodDate"; ZodFirstPartyTypeKind2["ZodSymbol"] = "ZodSymbol"; ZodFirstPartyTypeKind2["ZodUndefined"] = "ZodUndefined"; ZodFirstPartyTypeKind2["ZodNull"] = "ZodNull"; ZodFirstPartyTypeKind2["ZodAny"] = "ZodAny"; ZodFirstPartyTypeKind2["ZodUnknown"] = "ZodUnknown"; ZodFirstPartyTypeKind2["ZodNever"] = "ZodNever"; ZodFirstPartyTypeKind2["ZodVoid"] = "ZodVoid"; ZodFirstPartyTypeKind2["ZodArray"] = "ZodArray"; ZodFirstPartyTypeKind2["ZodObject"] = "ZodObject"; ZodFirstPartyTypeKind2["ZodUnion"] = "ZodUnion"; ZodFirstPartyTypeKind2["ZodDiscriminatedUnion"] = "ZodDiscriminatedUnion"; ZodFirstPartyTypeKind2["ZodIntersection"] = "ZodIntersection"; ZodFirstPartyTypeKind2["ZodTuple"] = "ZodTuple"; ZodFirstPartyTypeKind2["ZodRecord"] = "ZodRecord"; ZodFirstPartyTypeKind2["ZodMap"] = "ZodMap"; ZodFirstPartyTypeKind2["ZodSet"] = "ZodSet"; ZodFirstPartyTypeKind2["ZodFunction"] = "ZodFunction"; ZodFirstPartyTypeKind2["ZodLazy"] = "ZodLazy"; ZodFirstPartyTypeKind2["ZodLiteral"] = "ZodLiteral"; ZodFirstPartyTypeKind2["ZodEnum"] = "ZodEnum"; ZodFirstPartyTypeKind2["ZodEffects"] = "ZodEffects"; ZodFirstPartyTypeKind2["ZodNativeEnum"] = "ZodNativeEnum"; ZodFirstPartyTypeKind2["ZodOptional"] = "ZodOptional"; ZodFirstPartyTypeKind2["ZodNullable"] = "ZodNullable"; ZodFirstPartyTypeKind2["ZodDefault"] = "ZodDefault"; ZodFirstPartyTypeKind2["ZodCatch"] = "ZodCatch"; ZodFirstPartyTypeKind2["ZodPromise"] = "ZodPromise"; ZodFirstPartyTypeKind2["ZodBranded"] = "ZodBranded"; ZodFirstPartyTypeKind2["ZodPipeline"] = "ZodPipeline"; ZodFirstPartyTypeKind2["ZodReadonly"] = "ZodReadonly"; })(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {})); var instanceOfType = (cls, params = { message: `Input not instance of ${cls.name}` }) => custom((data) => data instanceof cls, params); var stringType = ZodString.create; var numberType = ZodNumber.create; var nanType = ZodNaN.create; var bigIntType = ZodBigInt.create; var booleanType = ZodBoolean.create; var dateType = ZodDate.create; var symbolType = ZodSymbol.create; var undefinedType = ZodUndefined.create; var nullType = ZodNull.create; var anyType = ZodAny.create; var unknownType = ZodUnknown.create; var neverType = ZodNever.create; var voidType = ZodVoid.create; var arrayType = ZodArray.create; var objectType = ZodObject.create; var strictObjectType = ZodObject.strictCreate; var unionType = ZodUnion.create; var discriminatedUnionType = ZodDiscriminatedUnion.create; var intersectionType = ZodIntersection.create; var tupleType = ZodTuple.create; var recordType = ZodRecord.create; var mapType = ZodMap.create; var setType = ZodSet.create; var functionType = ZodFunction.create; var lazyType = ZodLazy.create; var literalType = ZodLiteral.create; var enumType = ZodEnum.create; var nativeEnumType = ZodNativeEnum.create; var promiseType = ZodPromise.create; var effectsType = ZodEffects.create; var optionalType = ZodOptional.create; var nullableType = ZodNullable.create; var preprocessType = ZodEffects.createWithPreprocess; var pipelineType = ZodPipeline.create; var ostring = () => stringType().optional(); var onumber = () => numberType().optional(); var oboolean = () => booleanType().optional(); var 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 }) }; var NEVER = INVALID; var z = /* @__PURE__ */ Object.freeze({ __proto__: null, defaultErrorMap: errorMap, setErrorMap, getErrorMap, makeIssue, EMPTY_PATH, addIssueToContext, ParseStatus, INVALID, DIRTY, OK, isAborted, isDirty, isValid, isAsync, get util() { return util; }, get objectUtil() { return objectUtil; }, ZodParsedType, getParsedType, ZodType, datetimeRegex, ZodString, ZodNumber, ZodBigInt, ZodBoolean, ZodDate, ZodSymbol, ZodUndefined, ZodNull, ZodAny, ZodUnknown, ZodNever, ZodVoid, ZodArray, ZodObject, ZodUnion, ZodDiscriminatedUnion, ZodIntersection, ZodTuple, ZodRecord, ZodMap, ZodSet, ZodFunction, ZodLazy, ZodLiteral, ZodEnum, ZodNativeEnum, ZodPromise, ZodEffects, ZodTransformer: ZodEffects, ZodOptional, ZodNullable, ZodDefault, ZodCatch, ZodNaN, BRAND, ZodBranded, ZodPipeline, ZodReadonly, custom, Schema: ZodType, ZodSchema: ZodType, late, get ZodFirstPartyTypeKind() { return ZodFirstPartyTypeKind; }, 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, onumber, optional: optionalType, 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, ZodIssueCode, quotelessJson, ZodError }); // node_modules/@modelcontextprotocol/sdk/dist/esm/types.js var LATEST_PROTOCOL_VERSION = "2024-11-05"; var SUPPORTED_PROTOCOL_VERSIONS = [ LATEST_PROTOCOL_VERSION, "2024-10-07" ]; var JSONRPC_VERSION = "2.0"; var ProgressTokenSchema = z.union([z.string(), z.number().int()]); var CursorSchema = z.string(); var BaseRequestParamsSchema = z.object({ _meta: z.optional(z.object({ progressToken: z.optional(ProgressTokenSchema) }).passthrough()) }).passthrough(); var RequestSchema = z.object({ method: z.string(), params: z.optional(BaseRequestParamsSchema) }); var BaseNotificationParamsSchema = z.object({ _meta: z.optional(z.object({}).passthrough()) }).passthrough(); var NotificationSchema = z.object({ method: z.string(), params: z.optional(BaseNotificationParamsSchema) }); var ResultSchema = z.object({ _meta: z.optional(z.object({}).passthrough()) }).passthrough(); var RequestIdSchema = z.union([z.string(), z.number().int()]); var JSONRPCRequestSchema = z.object({ jsonrpc: z.literal(JSONRPC_VERSION), id: RequestIdSchema }).merge(RequestSchema).strict(); var JSONRPCNotificationSchema = z.object({ jsonrpc: z.literal(JSONRPC_VERSION) }).merge(NotificationSchema).strict(); var JSONRPCResponseSchema = z.object({ jsonrpc: z.literal(JSONRPC_VERSION), id: RequestIdSchema, result: ResultSchema }).strict(); var ErrorCode; (function(ErrorCode2) { ErrorCode2[ErrorCode2["ConnectionClosed"] = -32000] = "ConnectionClosed"; ErrorCode2[ErrorCode2["RequestTimeout"] = -32001] = "RequestTimeout"; ErrorCode2[ErrorCode2["ParseError"] = -32700] = "ParseError"; ErrorCode2[ErrorCode2["InvalidRequest"] = -32600] = "InvalidRequest"; ErrorCode2[ErrorCode2["MethodNotFound"] = -32601] = "MethodNotFound"; ErrorCode2[ErrorCode2["InvalidParams"] = -32602] = "InvalidParams"; ErrorCode2[ErrorCode2["InternalError"] = -32603] = "InternalError"; })(ErrorCode || (ErrorCode = {})); var JSONRPCErrorSchema = z.object({ jsonrpc: z.literal(JSONRPC_VERSION), id: RequestIdSchema, error: z.object({ code: z.number().int(), message: z.string(), data: z.optional(z.unknown()) }) }).strict(); var JSONRPCMessageSchema = z.union([ JSONRPCRequestSchema, JSONRPCNotificationSchema, JSONRPCResponseSchema, JSONRPCErrorSchema ]); var EmptyResultSchema = ResultSchema.strict(); var CancelledNotificationSchema = NotificationSchema.extend({ method: z.literal("notifications/cancelled"), params: BaseNotificationParamsSchema.extend({ requestId: RequestIdSchema, reason: z.string().optional() }) }); var ImplementationSchema = z.object({ name: z.string(), version: z.string() }).passthrough(); var ClientCapabilitiesSchema = z.object({ experimental: z.optional(z.object({}).passthrough()), sampling: z.optional(z.object({}).passthrough()), roots: z.optional(z.object({ listChanged: z.optional(z.boolean()) }).passthrough()) }).passthrough(); var InitializeRequestSchema = RequestSchema.extend({ method: z.literal("initialize"), params: BaseRequestParamsSchema.extend({ protocolVersion: z.string(), capabilities: ClientCapabilitiesSchema, clientInfo: ImplementationSchema }) }); var ServerCapabilitiesSchema = z.object({ experimental: z.optional(z.object({}).passthrough()), logging: z.optional(z.object({}).passthrough()), prompts: z.optional(z.object({ listChanged: z.optional(z.boolean()) }).passthrough()), resources: z.optional(z.object({ subscribe: z.optional(z.boolean()), listChanged: z.optional(z.boolean()) }).passthrough()), tools: z.optional(z.object({ listChanged: z.optional(z.boolean()) }).passthrough()) }).passthrough(); var InitializeResultSchema = ResultSchema.extend({ protocolVersion: z.string(), capabilities: ServerCapabilitiesSchema, serverInfo: ImplementationSchema, instructions: z.optional(z.string()) }); var InitializedNotificationSchema = NotificationSchema.extend({ method: z.literal("notifications/initialized") }); var PingRequestSchema = RequestSchema.extend({ method: z.literal("ping") }); var ProgressSchema = z.object({ progress: z.number(), total: z.optional(z.number()) }).passthrough(); var ProgressNotificationSchema = NotificationSchema.extend({ method: z.literal("notifications/progress"), params: BaseNotificationParamsSchema.merge(ProgressSchema).extend({ progressToken: ProgressTokenSchema }) }); var PaginatedRequestSchema = RequestSchema.extend({ params: BaseRequestParamsSchema.extend({ cursor: z.optional(CursorSchema) }).optional() }); var PaginatedResultSchema = ResultSchema.extend({ nextCursor: z.optional(CursorSchema) }); var ResourceContentsSchema = z.object({ uri: z.string(), mimeType: z.optional(z.string()) }).passthrough(); var TextResourceContentsSchema = ResourceContentsSchema.extend({ text: z.string() }); var BlobResourceContentsSchema = ResourceContentsSchema.extend({ blob: z.string().base64() }); var ResourceSchema = z.object({ uri: z.string(), name: z.string(), description: z.optional(z.string()), mimeType: z.optional(z.string()) }).passthrough(); var ResourceTemplateSchema = z.object({ uriTemplate: z.string(), name: z.string(), description: z.optional(z.string()), mimeType: z.optional(z.string()) }).passthrough(); var ListResourcesRequestSchema = PaginatedRequestSchema.extend({ method: z.literal("resources/list") }); var ListResourcesResultSchema = PaginatedResultSchema.extend({ resources: z.array(ResourceSchema) }); var ListResourceTemplatesRequestSchema = PaginatedRequestSchema.extend({ method: z.literal("resources/templates/list") }); var ListResourceTemplatesResultSchema = PaginatedResultSchema.extend({ resourceTemplates: z.array(ResourceTemplateSchema) }); var ReadResourceRequestSchema = RequestSchema.extend({ method: z.literal("resources/read"), params: BaseRequestParamsSchema.extend({ uri: z.string() }) }); var ReadResourceResultSchema = ResultSchema.extend({ contents: z.array(z.union([TextResourceContentsSchema, BlobResourceContentsSchema])) }); var ResourceListChangedNotificationSchema = NotificationSchema.extend({ method: z.literal("notifications/resources/list_changed") }); var SubscribeRequestSchema = RequestSchema.extend({ method: z.literal("resources/subscribe"), params: BaseRequestParamsSchema.extend({ uri: z.string() }) }); var UnsubscribeRequestSchema = RequestSchema.extend({ method: z.literal("resources/unsubscribe"), params: BaseRequestParamsSchema.extend({ uri: z.string() }) }); var ResourceUpdatedNotificationSchema = NotificationSchema.extend({ method: z.literal("notifications/resources/updated"), params: BaseNotificationParamsSchema.extend({ uri: z.string() }) }); var PromptArgumentSchema = z.object({ name: z.string(), description: z.optional(z.string()), required: z.optional(z.boolean()) }).passthrough(); var PromptSchema = z.object({ name: z.string(), description: z.optional(z.string()), arguments: z.optional(z.array(PromptArgumentSchema)) }).passthrough(); var ListPromptsRequestSchema = PaginatedRequestSchema.extend({ method: z.literal("prompts/list") }); var ListPromptsResultSchema = PaginatedResultSchema.extend({ prompts: z.array(PromptSchema) }); var GetPromptRequestSchema = RequestSchema.extend({ method: z.literal("prompts/get"), params: BaseRequestParamsSchema.extend({ name: z.string(), arguments: z.optional(z.record(z.string())) }) }); var TextContentSchema = z.object({ type: z.literal("text"), text: z.string() }).passthrough(); var ImageContentSchema = z.object({ type: z.literal("image"), data: z.string().base64(), mimeType: z.string() }).passthrough(); var EmbeddedResourceSchema = z.object({ type: z.literal("resource"), resource: z.union([TextResourceContentsSchema, BlobResourceContentsSchema]) }).passthrough(); var PromptMessageSchema = z.object({ role: z.enum(["user", "assistant"]), content: z.union([ TextContentSchema, ImageContentSchema, EmbeddedResourceSchema ]) }).passthrough(); var GetPromptResultSchema = ResultSchema.extend({ description: z.optional(z.string()), messages: z.array(PromptMessageSchema) }); var PromptListChangedNotificationSchema = NotificationSchema.extend({ method: z.literal("notifications/prompts/list_changed") }); var ToolSchema = z.object({ name: z.string(), description: z.optional(z.string()), inputSchema: z.object({ type: z.literal("object"), properties: z.optional(z.object({}).passthrough()) }).passthrough() }).passthrough(); var ListToolsRequestSchema = PaginatedRequestSchema.extend({ method: z.literal("tools/list") }); var ListToolsResultSchema = PaginatedResultSchema.extend({ tools: z.array(ToolSchema) }); var CallToolResultSchema = ResultSchema.extend({ content: z.array(z.union([TextContentSchema, ImageContentSchema, EmbeddedResourceSchema])), isError: z.boolean().default(false).optional() }); var CompatibilityCallToolResultSchema = CallToolResultSchema.or(ResultSchema.extend({ toolResult: z.unknown() })); var CallToolRequestSchema = RequestSchema.extend({ method: z.literal("tools/call"), params: BaseRequestParamsSchema.extend({ name: z.string(), arguments: z.optional(z.record(z.unknown())) }) }); var ToolListChangedNotificationSchema = NotificationSchema.extend({ method: z.literal("notifications/tools/list_changed") }); var LoggingLevelSchema = z.enum([ "debug", "info", "notice", "warning", "error", "critical", "alert", "emergency" ]); var SetLevelRequestSchema = RequestSchema.extend({ method: z.literal("logging/setLevel"), params: BaseRequestParamsSchema.extend({ level: LoggingLevelSchema }) }); var LoggingMessageNotificationSchema = NotificationSchema.extend({ method: z.literal("notifications/message"), params: BaseNotificationParamsSchema.extend({ level: LoggingLevelSchema, logger: z.optional(z.string()), data: z.unknown() }) }); var ModelHintSchema = z.object({ name: z.string().optional() }).passthrough(); var ModelPreferencesSchema = z.object({ hints: z.optional(z.array(ModelHintSchema)), costPriority: z.optional(z.number().min(0).max(1)), speedPriority: z.optional(z.number().min(0).max(1)), intelligencePriority: z.optional(z.number().min(0).max(1)) }).passthrough(); var SamplingMessageSchema = z.object({ role: z.enum(["user", "assistant"]), content: z.union([TextContentSchema, ImageContentSchema]) }).passthrough(); var CreateMessageRequestSchema = RequestSchema.extend({ method: z.literal("sampling/createMessage"), params: BaseRequestParamsSchema.extend({ messages: z.array(SamplingMessageSchema), systemPrompt: z.optional(z.string()), includeContext: z.optional(z.enum(["none", "thisServer", "allServers"])), temperature: z.optional(z.number()), maxTokens: z.number().int(), stopSequences: z.optional(z.array(z.string())), metadata: z.optional(z.object({}).passthrough()), modelPreferences: z.optional(ModelPreferencesSchema) }) }); var CreateMessageResultSchema = ResultSchema.extend({ model: z.string(), stopReason: z.optional(z.enum(["endTurn", "stopSequence", "maxTokens"]).or(z.string())), role: z.enum(["user", "assistant"]), content: z.discriminatedUnion("type", [ TextContentSchema, ImageContentSchema ]) }); var ResourceReferenceSchema = z.object({ type: z.literal("ref/resource"), uri: z.string() }).passthrough(); var PromptReferenceSchema = z.object({ type: z.literal("ref/prompt"), name: z.string() }).passthrough(); var CompleteRequestSchema = RequestSchema.extend({ method: z.literal("completion/complete"), params: BaseRequestParamsSchema.extend({ ref: z.union([PromptReferenceSchema, ResourceReferenceSchema]), argument: z.object({ name: z.string(), value: z.string() }).passthrough() }) }); var CompleteResultSchema = ResultSchema.extend({ completion: z.object({ values: z.array(z.string()).max(100), total: z.optional(z.number().int()), hasMore: z.optional(z.boolean()) }).passthrough() }); var RootSchema = z.object({ uri: z.string().startsWith("file://"), name: z.optional(z.string()) }).passthrough(); var ListRootsRequestSchema = RequestSchema.extend({ method: z.literal("roots/list") }); var ListRootsResultSchema = ResultSchema.extend({ roots: z.array(RootSchema) }); var RootsListChangedNotificationSchema = NotificationSchema.extend({ method: z.literal("notifications/roots/list_changed") }); var ClientRequestSchema = z.union([ PingRequestSchema, InitializeRequestSchema, CompleteRequestSchema, SetLevelRequestSchema, GetPromptRequestSchema, ListPromptsRequestSchema, ListResourcesRequestSchema, ListResourceTemplatesRequestSchema, ReadResourceRequestSchema, SubscribeRequestSchema, UnsubscribeRequestSchema, CallToolRequestSchema, ListToolsRequestSchema ]); var ClientNotificationSchema = z.union([ CancelledNotificationSchema, ProgressNotificationSchema, InitializedNotificationSchema, RootsListChangedNotificationSchema ]); var ClientResultSchema = z.union([ EmptyResultSchema, CreateMessageResultSchema, ListRootsResultSchema ]); var ServerRequestSchema = z.union([ PingRequestSchema, CreateMessageRequestSchema, ListRootsRequestSchema ]); var ServerNotificationSchema = z.union([ CancelledNotificationSchema, ProgressNotificationSchema, LoggingMessageNotificationSchema, ResourceUpdatedNotificationSchema, ResourceListChangedNotificationSchema, ToolListChangedNotificationSchema, PromptListChangedNotificationSchema ]); var ServerResultSchema = z.union([ EmptyResultSchema, InitializeResultSchema, CompleteResultSchema, GetPromptResultSchema, ListPromptsResultSchema, ListResourcesResultSchema, ListResourceTemplatesResultSchema, ReadResourceResultSchema, CallToolResultSchema, ListToolsResultSchema ]); class McpError extends Error { constructor(code, message, data) { super(`MCP error ${code}: ${message}`); this.code = code; this.data = data; this.name = "McpError"; } } // node_modules/@modelcontextprotocol/sdk/dist/esm/shared/protocol.js var DEFAULT_REQUEST_TIMEOUT_MSEC = 60000; class Protocol { constructor(_options) { this._options = _options; this._requestMessageId = 0; this._requestHandlers = new Map; this._requestHandlerAbortControllers = new Map; this._notificationHandlers = new Map; this._responseHandlers = new Map; this._progressHandlers = new Map; this._timeoutInfo = new Map; this.setNotificationHandler(CancelledNotificationSchema, (notification) => { const controller = this._requestHandlerAbortControllers.get(notification.params.requestId); controller === null || controller === undefined || controller.abort(notification.params.reason); }); this.setNotificationHandler(ProgressNotificationSchema, (notification) => { this._onprogress(notification); }); this.setRequestHandler(PingRequestSchema, (_request) => ({})); } _setupTimeout(messageId, timeout, maxTotalTimeout, onTimeout) { this._timeoutInfo.set(messageId, { timeoutId: setTimeout(onTimeout, timeout), startTime: Date.now(), timeout, maxTotalTimeout, onTimeout }); } _resetTimeout(messageId) { const info = this._timeoutInfo.get(messageId); if (!info) return false; const totalElapsed = Date.now() - info.startTime; if (info.maxTotalTimeout && totalElapsed >= info.maxTotalTimeout) { this._timeoutInfo.delete(messageId); throw new McpError(ErrorCode.RequestTimeout, "Maximum total timeout exceeded", { maxTotalTimeout: info.maxTotalTimeout, totalElapsed }); } clearTimeout(info.timeoutId); info.timeoutId = setTimeout(info.onTimeout, info.timeout); return true; } _cleanupTimeout(messageId) { const info = this._timeoutInfo.get(messageId); if (info) { clearTimeout(info.timeoutId); this._timeoutInfo.delete(messageId); } } async connect(transport) { this._transport = transport; this._transport.onclose = () => { this._onclose(); }; this._transport.onerror = (error) => { this._onerror(error); }; this._transport.onmessage = (message) => { if (!("method" in message)) { this._onresponse(message); } else if ("id" in message) { this._onrequest(message); } else { this._onnotification(message); } }; await this._transport.start(); } _onclose() { var _a; const responseHandlers = this._responseHandlers; this._responseHandlers = new Map; this._progressHandlers.clear(); this._transport = undefined; (_a = this.onclose) === null || _a === undefined || _a.call(this); const error = new McpError(ErrorCode.ConnectionClosed, "Connection closed"); for (const handler of responseHandlers.values()) { handler(error); } } _onerror(error) { var _a; (_a = this.onerror) === null || _a === undefined || _a.call(this, error); } _onnotification(notification) { var _a; const handler = (_a = this._notificationHandlers.get(notification.method)) !== null && _a !== undefined ? _a : this.fallbackNotificationHandler; if (handler === undefined) { return; } Promise.resolve().then(() => handler(notification)).catch((error) => this._onerror(new Error(`Uncaught error in notification handler: ${error}`))); } _onrequest(request) { var _a, _b, _c; const handler = (_a = this._requestHandlers.get(request.method)) !== null && _a !== undefined ? _a : this.fallbackRequestHandler; if (handler === undefined) { (_b = this._transport) === null || _b === undefined || _b.send({ jsonrpc: "2.0", id: request.id, error: { code: ErrorCode.MethodNotFound, message: "Method not found" } }).catch((error) => this._onerror(new Error(`Failed to send an error response: ${error}`))); return; } const abortController = new AbortController; this._requestHandlerAbortControllers.set(request.id, abortController); const extra = { signal: abortController.signal, sessionId: (_c = this._transport) === null || _c === undefined ? undefined : _c.sessionId }; Promise.resolve().then(() => handler(request, extra)).then((result) => { var _a2; if (abortController.signal.aborted) { return; } return (_a2 = this._transport) === null || _a2 === undefined ? undefined : _a2.send({ result, jsonrpc: "2.0", id: request.id }); }, (error) => { var _a2, _b2; if (abortController.signal.aborted) { return; } return (_a2 = this._transport) === null || _a2 === undefined ? undefined : _a2.send({ jsonrpc: "2.0", id: request.id, error: { code: Number.isSafeInteger(error["code"]) ? error["code"] : ErrorCode.InternalError, message: (_b2 = error.message) !== null && _b2 !== undefined ? _b2 : "Internal error" } }); }).catch((error) => this._onerror(new Error(`Failed to send response: ${error}`))).finally(() => { this._requestHandlerAbortControllers.delete(request.id); }); } _onprogress(notification) { const { progressToken, ...params } = notification.params; const messageId = Number(progressToken); const handler = this._progressHandlers.get(messageId); if (!handler) { this._onerror(new Error(`Received a progress notification for an unknown token: ${JSON.stringify(notification)}`)); return; } const responseHandler = this._responseHandlers.get(messageId); if (this._timeoutInfo.has(messageId) && responseHandler) { try { this._resetTimeout(messageId); } catch (error) { responseHandler(error); return; } } handler(params); } _onresponse(response) { const messageId = Number(response.id); const handler = this._responseHandlers.get(messageId); if (handler === undefined) { this._onerror(new Error(`Received a response for an unknown message ID: ${JSON.stringify(response)}`)); return; } this._responseHandlers.delete(messageId); this._progressHandlers.delete(messageId); this._cleanupTimeout(messageId); if ("result" in response) { handler(response); } else { const error = new McpError(response.error.code, response.error.message, response.error.data); handler(error); } } get transport() { return this._transport; } async close() { var _a; await ((_a = this._transport) === null || _a === undefined ? undefined : _a.close()); } request(request, resultSchema, options) { return new Promise((resolve, reject) => { var _a, _b, _c, _d; if (!this._transport) { reject(new Error("Not connected")); return; } if (((_a = this._options) === null || _a === undefined ? undefined : _a.enforceStrictCapabilities) === true) { this.assertCapabilityForMethod(request.method); } (_b = options === null || options === undefined ? undefined : options.signal) === null || _b === undefined || _b.throwIfAborted(); const messageId = this._requestMessageId++; const jsonrpcRequest = { ...request, jsonrpc: "2.0", id: messageId }; if (options === null || options === undefined ? undefined : options.onprogress) { this._progressHandlers.set(messageId, options.onprogress); jsonrpcRequest.params = { ...request.params, _meta: { progressToken: messageId } }; } const cancel = (reason) => { var _a2; this._responseHandlers.delete(messageId); this._progressHandlers.delete(messageId); this._cleanupTimeout(messageId); (_a2 = this._transport) === null || _a2 === undefined || _a2.send({ jsonrpc: "2.0", method: "notifications/cancelled", params: { requestId: messageId, reason: String(reason) } }).catch((error) => this._onerror(new Error(`Failed to send cancellation: ${error}`))); reject(reason); }; this._responseHandlers.set(messageId, (response) => { var _a2; if ((_a2 = options === null || options === undefined ? undefined : options.signal) === null || _a2 === undefined ? undefined : _a2.aborted) { return; } if (response instanceof Error) { return reject(response); } try { const result = resultSchema.parse(response.result); resolve(result); } catch (error) { reject(error); } }); (_c = options === null || options === undefined ? undefined : options.signal) === null || _c === undefined || _c.addEventListener("abort", () => { var _a2; cancel((_a2 = options === null || options === undefined ? undefined : options.signal) === null || _a2 === undefined ? undefined : _a2.reason); }); const timeout = (_d = options === null || options === undefined ? undefined : options.timeout) !== null && _d !== undefined ? _d : DEFAULT_REQUEST_TIMEOUT_MSEC; const timeoutHandler = () => cancel(new McpError(ErrorCode.RequestTimeout, "Request timed out", { timeout })); this._setupTimeout(messageId, timeout, options === null || options === undefined ? undefined : options.maxTotalTimeout, timeoutHandler); this._transport.send(jsonrpcRequest).catch((error) => { this._cleanupTimeout(messageId); reject(error); }); }); } async notification(notification) { if (!this._transport) { throw new Error("Not connected"); } this.assertNotificationCapability(notification.method); const jsonrpcNotification = { ...notification, jsonrpc: "2.0" }; await this._transport.send(jsonrpcNotification); } setRequestHandler(requestSchema, handler) { const method = requestSchema.shape.method.value; this.assertRequestHandlerCapability(method); this._requestHandlers.set(method, (request, extra) => Promise.resolve(handler(requestSchema.parse(request), extra))); } removeRequestHandler(method) { this._requestHandlers.delete(method); } assertCanSetRequestHandler(method) { if (this._requestHandlers.has(method)) { throw new Error(`A request handler for ${method} already exists, which would be overridden`); } } setNotificationHandler(notificationSchema, handler) { this._notificationHandlers.set(notificationSchema.shape.method.value, (notification) => Promise.resolve(handler(notificationSchema.parse(notification)))); } removeNotificationHandler(method) { this._notificationHandlers.delete(method); } } function mergeCapabilities(base, additional) { return Object.entries(additional).reduce((acc, [key, value]) => { if (value && typeof value === "object") { acc[key] = acc[key] ? { ...acc[key], ...value } : value; } else { acc[key] = value; } return acc; }, { ...base }); } // node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js class Server extends Protocol { constructor(_serverInfo, options) { var _a; super(options); this._serverInfo = _serverInfo; this._capabilities = (_a = options === null || options === undefined ? undefined : options.capabilities) !== null && _a !== undefined ? _a : {}; this._instructions = options === null || options === undefined ? undefined : options.instructions; this.setRequestHandler(InitializeRequestSchema, (request) => this._oninitialize(request)); this.setNotificationHandler(InitializedNotificationSchema, () => { var _a2; return (_a2 = this.oninitialized) === null || _a2 === undefined ? undefined : _a2.call(this); }); } registerCapabilities(capabilities) { if (this.transport) { throw new Error("Cannot register capabilities after connecting to transport"); } this._capabilities = mergeCapabilities(this._capabilities, capabilities); } assertCapabilityForMethod(method) { var _a, _b; switch (method) { case "sampling/createMessage": if (!((_a = this._clientCapabilities) === null || _a === undefined ? undefined : _a.sampling)) { throw new Error(`Client does not support sampling (required for ${method})`); } break; case "roots/list": if (!((_b = this._clientCapabilities) === null || _b === undefined ? undefined : _b.roots)) { throw new Error(`Client does not support listing roots (required for ${method})`); } break; case "ping": break; } } assertNotificationCapability(method) { switch (method) { case "notifications/message": if (!this._capabilities.logging) { throw new Error(`Server does not support logging (required for ${method})`); } break; case "notifications/resources/updated": case "notifications/resources/list_changed": if (!this._capabilities.resources) { throw new Error(`Server does not support notifying about resources (required for ${method})`); } break; case "notifications/tools/list_changed": if (!this._capabilities.tools) { throw new Error(`Server does not support notifying of tool list changes (required for ${method})`); } break; case "notifications/prompts/list_changed": if (!this._capabilities.prompts) { throw new Error(`Server does not support notifying of prompt list changes (required for ${method})`); } break; case "notifications/cancelled": break; case "notifications/progress": break; } } assertRequestHandlerCapability(method) { switch (method) { case "sampling/createMessage": if (!this._capabilities.sampling) { throw new Error(`Server does not support sampling (required for ${method})`); } break; case "logging/setLevel": if (!this._capabilities.logging) { throw new Error(`Server does not support logging (required for ${method})`); } break; case "prompts/get": case "prompts/list": if (!this._capabilities.prompts) { throw new Error(`Server does not support prompts (required for ${method})`); } break; case "resources/list": case "resources/templates/list": case "resources/read": if (!this._capabilities.resources) { throw new Error(`Server does not support resources (required for ${method})`); } break; case "tools/call": case "tools/list": if (!this._capabilities.tools) { throw new Error(`Server does not support tools (required for ${method})`); } break; case "ping": case "initialize": break; } } async _oninitialize(request) { const requestedVersion = request.params.protocolVersion; this._clientCapabilities = request.params.capabilities; this._clientVersion = request.params.clientInfo; return { protocolVersion: SUPPORTED_PROTOCOL_VERSIONS.includes(requestedVersion) ? requestedVersion : LATEST_PROTOCOL_VERSION, capabilities: this.getCapabilities(), serverInfo: this._serverInfo, ...this._instructions && { instructions: this._instructions } }; } getClientCapabilities() { return this._clientCapabilities; } getClientVersion() { return this._clientVersion; } getCapabilities() { return this._capabilities; } async ping() { return this.request({ method: "ping" }, EmptyResultSchema); } async createMessage(params, options) { return this.request({ method: "sampling/createMessage", params }, CreateMessageResultSchema, options); } async listRoots(params, options) { return this.request({ method: "roots/list", params }, ListRootsResultSchema, options); } async sendLoggingMessage(params) { return this.notification({ method: "notifications/message", params }); } async sendResourceUpdated(params) { return this.notification({ method: "notifications/resources/updated", params }); } async sendResourceListChanged() { return this.notification({ method: "notifications/resources/list_changed" }); } async sendToolListChanged() { return this.notification({ method: "notifications/tools/list_changed" }); } async sendPromptListChanged() { return this.notification({ method: "notifications/prompts/list_changed" }); } } // node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js import process2 from "node:process"; // node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.js class ReadBuffer { append(chunk) { this._buffer = this._buffer ? Buffer.concat([this._buffer, chunk]) : chunk; } readMessage() { if (!this._buffer) { return null; } const index = this._buffer.indexOf(` `); if (index === -1) { return null; } const line = this._buffer.toString("utf8", 0, index); this._buffer = this._buffer.subarray(index + 1); return deserializeMessage(line); } clear() { this._buffer = undefined; } } function deserializeMessage(line) { return JSONRPCMessageSchema.parse(JSON.parse(line)); } function serializeMessage(message) { return JSON.stringify(message) + ` `; } // node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js class StdioServerTransport { constructor(_stdin = process2.stdin, _stdout = process2.stdout) { this._stdin = _stdin; this._stdout = _stdout; this._readBuffer = new ReadBuffer; this._started = false; this._ondata = (chunk) => { this._readBuffer.append(chunk); this.processReadBuffer(); }; this._onerror = (error) => { var _a; (_a = this.onerror) === null || _a === undefined || _a.call(this, error); }; } async start() { if (this._started) { throw new Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically."); } this._started = true; this._stdin.on("data", this._ondata); this._stdin.on("error", this._onerror); } processReadBuffer() { var _a, _b; while (true) { try { const message = this._readBuffer.readMessage(); if (message === null) { break; } (_a = this.onmessage) === null || _a === undefined || _a.call(this, message); } catch (error) { (_b = this.onerror) === null || _b === undefined || _b.call(this, error); } } } async close() { var _a; this._stdin.off("data", this._ondata); this._stdin.off("error", this._onerror); const remainingDataListeners = this._stdin.listenerCount("data"); if (remainingDataListeners === 0) { this._stdin.pause(); } this._readBuffer.clear(); (_a = this.onclose) === null || _a === undefined || _a.call(this); } send(message) { return new Promise((resolve) => { const json = serializeMessage(message); if (this._stdout.write(json)) { resolve(); } else { this._stdout.once("drain", resolve); } }); } } // src/notion/utils/logger.ts class Logger { static instance; logLevel = "info"; constructor() {} static getInstance() { if (!Logger.instance) { Logger.instance = new Logger; } return Logger.instance; } setLogLevel(level) { this.logLevel = level; } isLevelEnabled(level) { const levels = { debug: 0, info: 1, warn: 2, error: 3 }; return levels[level] >= levels[this.logLevel]; } formatLog(level, message, context) { const logMsg = { level, message, timestamp: new Date().toISOString(), context }; return JSON.stringify(logMsg); } debug(message, context) { if (this.isLevelEnabled("debug")) { console.debug(this.formatLog("debug", message, context)); } } info(message, context) { if (this.isLevelEnabled("info")) { console.info(this.formatLog("info", message, context)); } } warn(message, context) { if (this.isLevelEnabled("warn")) { console.warn(this.formatLog("warn", message, context)); } } error(message, context) { if (this.isLevelEnabled("error")) { console.error(this.formatLog("error", message, context)); } } } var logger = Logger.getInstance(); // src/notion/utils/rate-limiter.ts class RateLimiter { static instance; queue = []; maxRequests; windowMs; requestTimestamps = []; constructor() { this.maxRequests = 3; this.windowMs = 1000; logger.debug("RateLimiter initialized", { maxRequests: this.maxRequests, windowMs: this.windowMs }); } static getInstance() { if (!RateLimiter.instance) { RateLimiter.instance = new RateLimiter; } return RateLimiter.instance; } cleanOldTimestamps() { const now = Date.now(); this.requestTimestamps = this.requestTimestamps.filter((timestamp) => now - timestamp < this.windowMs); } canMakeRequest() { this.cleanOldTimestamps(); return this.requestTimestamps.length < this.maxRequests; } processQueue() { if (this.queue.length === 0) return; if (this.canMakeRequest()) { const now = Date.now(); const item = this.queue.shift(); if (item) { const waitTime = now - item.timestamp; if (waitTime > 1000) { logger.warn(`Request waited ${waitTime}ms due to rate limiting`); } this.requestTimestamps.push(now); item.resolve(); } } setTimeout(() => this.processQueue(), 50); } async acquire() { if (this.canMakeRequest()) { this.requestTimestamps.push(Date.now()); return Promise.resolve(); } return new Promise((resolve) => { this.queue.push({ resolve, timestamp: Date.now() }); if (this.queue.length === 1) { this.processQueue(); } }); } updateConfig(maxRequests, windowMs) { this.maxRequests = maxRequests; this.windowMs = windowMs; logger.info("RateLimiter configuration updated", { maxRequests, windowMs }); } } var rateLimiter = RateLimiter.getInstance(); // src/notion/utils/api-client.ts class ApiClient { baseUrl; headers; timeout; constructor(baseUrl, headers, timeout = 30000) { this.baseUrl = baseUrl; this.headers = headers; this.timeout = timeout; } async request(options) { const { method, path, body, query, maxRetries = 3, retryDelay = 1000 } = options; let attempts = 0; let lastError = null; while (attempts <= maxRetries) { try { await rateLimiter.acquire(); let url = `${this.baseUrl}${path}`; if (query && Object.keys(query).length > 0) { const params = new URLSearchParams; Object.entries(query).forEach(([key, value]) => { if (value !== undefined && value !== null) { params.append(key, value); } }); url = `${url}?${params.toString()}`; } const requestOptions = { method, headers: this.headers, signal: AbortSignal.timeout(this.timeout) }; if (body) { requestOptions.body = JSON.stringify(body); } logger.debug("API request", { method, path, hasBody: !!body, attempt: attempts + 1 }); const startTime = Date.now(); const response = await fetch(url, requestOptions); const requestTime = Date.now() - startTime; const responseData = await response.json(); logger.debug("API response received", { method, path, status: response.status, time: `${requestTime}ms` }); if (!response.ok) { const error = new Error(`API Error: ${response.status} ${responseData.message || response.statusText}`); Object.assign(error, { status: response.status, data: responseData }); throw error; } return { success: true, data: responseData }; } catch (error) { lastError = error; attempts += 1; logger.warn(`API request failed (attempt ${attempts}/${maxRetries + 1})`, { method, path, error: error instanceof Error ? error.message : String(error), status: error.status }); if (attempts <= maxRetries) { const delay = retryDelay * Math.pow(2, attempts - 1) * (0.5 + Math.random() * 0.5); logger.debug(`Retrying in ${Math.round(delay)}ms`); await new Promise((resolve) => setTimeout(resolve, delay)); } } } return { success: false, error: { code: "request_failed", message: lastError?.message || "Request failed after multiple attempts", status: lastError?.status } }; } } // src/notion/client.ts class NotionClientWrapper { apiClient; customFeatures = new Map; constructor(apiToken) { const baseUrl = "https://api.notion.com/v1"; const headers = { Authorization: `Bearer ${apiToken}`, "Content-Type": "application/json", "Notion-Version": "2022-06-28" }; this.apiClient = new ApiClient(baseUrl, headers); this.customFeatures.set("workflows", false); this.customFeatures.set("csv_import", true); this.customFeatures.set("csv_export", true); this.customFeatures.set("recurring_tasks", true); logger.info("NotionClientWrapper initialized"); } isFeatureAvailable(featureName) { return this.customFeatures.get(featureName) || false; } async appendBlockChildren({ block_id, children, after }) { const body = { children }; if (after) body.after = after; const response = await this.apiClient.request({ method: "PATCH", path: `/blocks/${block_id}/children`, body }); return response.data; } async retrieveBlock({ block_id }) { const response = await this.apiClient.request({ method: "GET", path: `/blocks/${block_id}` }); return response.data; } async retrieveBlockChildren({ block_id, start_cursor, page_size }) { const query = {}; if (start_cursor) query.start_cursor = start_cursor; if (page_size) query.page_size = page_size.toString(); const response = await this.apiClient.request({ method: "GET", path: `/blocks/${block_id}/children`, query }); return response.data; } async updateBlock({ block_id, properties }) { const response = await this.apiClient.request({ method: "PATCH", path: `/blocks/${block_id}`, body: properties }); return response.data; } async deleteBlock({ block_id }) { const response = await this.apiClient.request({ method: "DELETE", path: `/blocks/${block_id}` }); return response.data; } async retrievePage({ page_id }) { const response = await this.apiClient.request({ method: "GET", path: `/pages/${page_id}` }); return response.data; } async updatePageProperties({ page_id, properties }) { const response = await this.apiClient.request({ method: "PATCH", path: `/pages/${page_id}`, body: { properties } }); return response.data; } async listAllUsers({ start_cursor, page_size } = {}) { const query = {}; if (start_cursor) query.start_cursor = start_cursor; if (page_size) query.page_size = page_size.toString(); const response = await this.apiClient.request({ method: "GET", path: "/users", query }); return response.data; } async retrieveUser({ user_id }) { const response = await this.apiClient.request({ method: "GET", path: `/users/${user_id}` }); return response.data; } async retrieveBotUser() { const response = await this.apiClient.request({ method: "GET", path: "/users/me" }); return response.data; } async createDatabase({ parent, title, properties }) { const response = await this.apiClient.request({ method: "POST", path: "/databases", body: { parent, title, properties } }); return response.data; } async queryDatabase({ database_id, filter, sorts, start_cursor, page_size }) { const body = {}; if (filter) body.filter = filter; if (sorts) body.sorts = sorts; if (start_cursor) body.start_cursor = start_cursor; if (page_size) body.page_size = page_size; const response = await this.apiClient.request({ method: "POST", path: `/databases/${database_id}/query`, body }); return response.data; } async retrieveDatabase({ database_id }) { const response = await this.apiClient.request({ method: "GET", path: `/databases/${database_id}` }); return response.data; } async updateDatabase({ database_id, title, description, properties }) { const body = {}; if (title) body.title = title; if (description) body.description = description; if (properties) body.properties = properties; const response = await this.apiClient.request({ method: "PATCH", path: `/databases/${database_id}`, body }); return response.data; } async createDatabaseItem({ database_id, properties }) { const response = await this.apiClient.request({ method: "POST", path: "/pages", body: { parent: { database_id }, properties } }); return response.data; } async createComment({ parent, discussion_id, rich_text }) { const body = { rich_text }; if (parent) body.parent = parent; if (discussion_id) body.discussion_id = discussion_id; const response = await this.apiClient.request({ method: "POST", path: "/comments", body }); return response.data; } async retrieveComments({ block_id, start_cursor, page_size }) { const query = { block_id }; if (start_cursor) query.start_cursor = start_cursor; if (page_size) query.page_size = page_size.toString(); const response = await this.apiClient.request({ method: "GET", path: "/comments", query }); return response.data; } async search({ query, filter, sort, start_cursor, page_size } = {}) { const body = {}; if (query) body.query = query; if (filter) body.filter = filter; if (sort) body.sort = sort; if (start_cursor) body.start_cursor = start_cursor; if (page_size) body.page_size = page_size; const response = await this.apiClient.request({ method: "POST", path: "/search", body }); return response.data; } async createWorkflow({ title, trigger, actions }) { if (!this.isFeatureAvailable("workflows")) { logger.warn("Workflow feature is not available"); return { object: "error", status: 400, code: "feature_not_available", message: "Workflow creation is not available with current API version." }; } logger.info(`Creating workflow: ${title} with ${actions.length} actions`); return { success: true, message: "Workflow created (simulated)", workflow_id: `wf_${Date.now()}`, title, trigger, actions }; } async importFromCSV({ database_id, csv_content, column_mappings }) { if (!this.isFeatureAvailable("csv_import")) { logger.warn("CSV import feature is not available"); return { object: "error", status: 400, code: "feature_not_available", message: "CSV import is not available with current API version." }; } logger.info(`Importing CSV data to database: ${database_id}`); try { const rows = csv_content.split(` `).map((row) => row.split(",")); const headers = rows[0]; const dataRows = rows.slice(1); logger.info(`Found ${dataRows.length} rows to import with headers: ${headers.join(", ")}`); return { object: "import", status: "success", results: { total_rows: dataRows.length, imported_rows: dataRows.length, errors: [] } }; } catch (error) { logger.error("Error parsing CSV:", { error: error.message }); return { object: "error", status: 400, code: "csv_parse_error", message: `CSV import failed: ${error.message}` }; } } async exportToCSV({ database_id, filter }) { if (!this.isFeatureAvailable("csv_export")) { logger.warn("CSV export feature is not available"); return { object: "error", status: 400, code: "feature_not_available", message: "CSV export is not available with current API version." }; } try { logger.info(`Exporting database to CSV: ${database_id}`); const queryResult = await this.queryDatabase({ database_id, filter, page_size: 100 }); const properties = queryResult.results?.length > 0 ? Object.keys(queryResult.results[0].properties || {}) : []; return { object: "export", status: "success", results: { total_rows: queryResult.results?.length || 0, format: "csv", properties } }; } catch (error) { logger.error("Error exporting to CSV:", { error: error.message }); return { object: "error", status: 400, code: "export_error", message: `CSV export failed: ${error.message}` }; } } async createRecurringTask({ database_id, task_properties, recurrence_pattern }) { if (!this.isFeatureAvailable("recurring_tasks")) { logger.warn("Recurring tasks feature is not available"); return { object: "error", status: 400, code: "feature_not_available", message: "Recurring tasks are not available with current API version." }; } logger.info(`Creating recurring task in database: ${database_id} with frequency: ${recurrence_pattern.frequency}`); try { const taskResult = await this.createDatabaseItem({ database_id, properties: { ...task_properties, Recurrence: { rich_text: [ { type: "text", text: { content: `${recurrence_pattern.frequency} (every ${recurrence_pattern.interval})` } } ] } } }); return { object: "recurring_task", id: taskResult.id, status: "success", recurrence_pattern, next_occurrence: this.calculateNextOccurrence(recurrence_pattern) }; } catch (error) { logger.error("Error creating recurring task:", { error: error.message }); return { object: "error", status: 400, code: "task_creation_error", message: `Recurring task creation failed: ${error.message}` }; } } calculateNextOccurrence(pattern) { const now = new Date; const nextDate = new Date(now); switch (pattern.frequency) { case "daily": nextDate.setDate(now.getDate() + pattern.interval); break; case "weekly": nextDate.setDate(now.getDate() + pattern.interval * 7); break; case "monthly": nextDate.setMonth(now.getMonth() + pattern.interval); break; case "yearly": nextDate.setFullYear(now.getFullYear() + pattern.interval); break; } return nextDate.toISOString().split("T")[0]; } } // src/notion/schemas.ts var commonIdDescription = "It should be a 32-character string (excluding hyphens) formatted as 8-4-4-4-12 with hyphens (-)."; var richTextObjectSchema = { type: "object", description: "A rich text object.", properties: { type: { type: "string", description: "The type of this rich text object. Possible values: text, mention, equation.", enum: ["text", "mention", "equation"] }, text: { type: "object", description: "Object containing text content and optional link info. Required if type is 'text'.", properties: { content: { type: "string", description: "The actual text content." }, link: { type: "object", description: "Optional link object with a 'url' field.", properties: { url: { type: "string", description: "The URL the text links to." } } } } }, mention: { type: "object", description: "Mention object if type is 'mention'. Represents an inline mention of a database, date, link preview, page, template mention, or user.", properties: { type: { type: "string", description: "The type of the mention.", enum: [ "database", "date", "link_preview", "page", "template_mention", "user" ] }, database: { type: "object", description: "Database mention object. Contains a database reference with an 'id' field.", properties: { id: { type: "string", description: "The ID of the mentioned database." + commonIdDescription } }, required: ["id"] }, date: { type: "object", description: "Date mention object, containing a date property value object.", properties: { start: { type: "string", description: "An ISO 8601 formatted start date or date-time." }, end: { type: ["string", "null"], description: "An ISO 8601 formatted end date or date-time, or null if not a range." }, time_zone: { type: ["string", "null"], description: "Time zone information for start and end. If null, times are in UTC." } }, required: ["start"] }, link_preview: { type: "object", description: "Link Preview mention object, containing a URL for the link preview.", properties: { url: { type: "string", description: "The URL for the link preview." } }, required: ["url"] }, page: { type: "object", description: "Page mention object, containing a page reference with an 'id' field.", properties: { id: { type: "string", description: "The ID of the mentioned page." + commonIdDescription } }, required: ["id"] }, template_mention: { type: "object", description: "Template mention object, can be a template_mention_date or template_mention_user.", properties: { type: { type: "string", enum: ["template_mention_date", "template_mention_user"], description: "The template mention type." }, template_mention_date: { type: "string", enum: ["today", "now"], description: "For template_mention_date type, the date keyword." }, template_mention_user: { type: "string", enum: ["me"], description: "For template_mention_user type, the user keyword." } } }, user: { type: "object", description: "User mention object, contains a user reference.", properties: { object: { type: "string", description: "Should be 'user'.", enum: ["user"] }, id: { type: "string", description: "The ID of the user." + commonIdDescription } }, required: ["object", "id"] } }, required: ["type"], oneOf: [ { required: ["database"] }, { required: ["date"] }, { required: ["link_preview"] }, { required: ["page"] }, { required: ["template_mention"] }, { required: ["user"] } ] }, equation: { type: "object", description: "Equation object if type is 'equation'. Represents an inline LaTeX equation.", properties: { expression: { type: "string", description: "LaTeX string representing the inline equation." } }, required: ["expression"] }, annotations: { type: "object", description: "Styling information for the text.", properties: { bold: { type: "boolean" }, italic: { type: "boolean" }, strikethrough: { type: "boolean" }, underline: { type: "boolean" }, code: { type: "boolean" }, color: { type: "string", description: "Color for the text.", enum: [ "default", "blue", "blue_background", "brown", "brown_background", "gray", "gray_background", "green", "green_background", "orange", "orange_background", "pink", "pink_background", "purple", "purple_background", "red", "red_background", "yellow", "yellow_background" ] } } }, href: { type: "string", description: "The URL of any link or mention in this text, if any." }, plain_text: { type: "string", description: "The plain text without annotations." } }, required: ["type"] }; var blockObjectSchema = { type: "object", description: "A Notion block object.", properties: { object: { type: "string", description: "Should be 'block'.", enum: ["block"] }, type: { type: "string", description: "Type of the block. Possible values include 'paragraph', 'heading_1', 'heading_2', 'heading_3', 'bulleted_list_item', 'numbered_list_item', 'to_do', 'toggle', 'child_page', 'child_database', 'embed', 'callout', 'quote', 'equation', 'divider', 'table_of_contents', 'column', 'column_list', 'link_preview', 'synced_block', 'template', 'link_to_page', 'audio', 'bookmark', 'breadcrumb', 'code', 'file', 'image', 'pdf', 'video'. Not all types are supported for creation via API." }, paragraph: { type: "object", description: "Paragraph block object.", properties: { rich_text: richTextObjectSchema, color: { type: "string", description: "The color of the block.", enum: [ "default", "blue", "blue_background", "brown", "brown_background", "gray", "gray_background", "green", "green_background", "orange", "orange_background", "pink", "pink_background", "purple", "purple_background", "red", "red_background", "yellow", "yellow_background" ] }, children: { type: "array", description: "Nested child blocks.", items: { type: "object", description: "A nested block object." } } } } }, required: ["object", "type"] }; // src/notion/tools.ts var appendBlockChildrenTool = { name: "notion_append_block_children", description: "Append new children blocks to a specified parent block in Notion. Requires insert content capabilities. You can optionally specify the 'after' parameter to append after a certain block.", inputSchema: { type: "object", properties: { block_id: { type: "string", description: "The ID of the parent block." + commonIdDescription }, children: { type: "array", description: "Array of block objects to append. Each block must follow the Notion block schema.", items: blockObjectSchema }, after: { type: "string", description: "The ID of the existing block that the new block should be appended after." + commonIdDescription } }, required: ["block_id", "children"] } }; var retrieveBlockTool = { name: "notion_retrieve_block", description: "Retrieve a block from Notion", inputSchema: { type: "object", properties: { block_id: { type: "string", description: "The ID of the block to retrieve." + commonIdDescription } }, required: ["block_id"] } }; var retrieveBlockChildrenTool = { name: "notion_retrieve_block_children", description: "Retrieve the children of a block", inputSchema: { type: "object", properties: { block_id: { type: "string", description: "The ID of the block." + commonIdDescription }, start_cursor: { type: "string", description: "Pagination cursor for next page of results" }, page_size: { type: "number", description: "Number of results per page (max 100)" } }, required: ["block_id"] } }; var updateBlockTool = { name: "notion_update_block", description: "Update an existing block in Notion", inputSchema: { type: "object", properties: { block_id: { type: "string", description: "The ID of the block to update." + commonIdDescription }, properties: { type: "object", description: "Properties to update on the block." } }, required: ["block_id", "properties"] } }; var deleteBlockTool = { name: "notion_delete_block", description: "Delete a block in Notion", inputSchema: { type: "object", properties: { block_id: { type: "string", description: "The ID of the block to delete." + commonIdDescription } }, required: ["block_id"] } }; var retrievePageTool = { name: "notion_retrieve_page", description: "Retrieve a page from Notion", inputSchema: { type: "object", properties: { page_id: { type: "string", description: "The ID of the page to retrieve." + commonIdDescription } }, required: ["page_id"] } }; var updatePagePropertiesTool = { name: "notion_update_page_properties", description: "Update properties of a page or an item in a Notion database", inputSchema: { type: "object", properties: { page_id: { type: "string", description: "The ID of the page or database item to update." + commonIdDescription }, properties: { type: "object", description: "Properties to update. These correspond to the columns or fields in the database." } }, required: ["page_id", "properties"] } }; var listAllUsersTool = { name: "notion_list_all_users", description: "List all users in the Notion workspace. **Note:** This function requires upgrading to the Notion Enterprise plan and using an Organization API key to avoid permission errors.", inputSchema: { type: "object", properties: { start_cursor: { type: "string", description: "Pagination start cursor for listing users" }, page_size: { type: "number", description: "Number of users to retrieve (max 100)" } } } }; var retrieveUserTool = { name: "notion_retrieve_user", description: "Retrieve a specific user by user_id in Notion. **Note:** This function requires upgrading to the Notion Enterprise plan and using an Organization API key to avoid permission errors.", inputSchema: { type: "object", properties: { user_id: { type: "string", description: "The ID of the user to retrieve." + commonIdDescription } }, required: ["user_id"] } }; var retrieveBotUserTool = { name: "notion_retrieve_bot_user", description: "Retrieve the bot user associated with the current token in Notion", inputSchema: { type: "object", properties: {} } }; var createDatabaseTool = { name: "notion_create_database", description: "Create a database in Notion", inputSchema: { type: "object", properties: { parent: { type: "object", description: "Parent object of the database" }, title: { type: "array", description: "Title of database as it appears in Notion. An array of rich text objects.", items: richTextObjectSchema }, properties: { type: "object", description: "Property schema of database. The keys are the names of properties as they appear in Notion and the values are property schema objects." } }, required: ["parent", "properties"] } }; var queryDatabaseTool = { name: "notion_query_database", description: "Query a database in Notion", inputSchema: { type: "object", properties: { database_id: { type: "string", description: "The ID of the database to query." + commonIdDescription }, filter: { type: "object", description: "Filter conditions" }, sorts: { type: "array", description: "Sort conditions" }, start_cursor: { type: "string", description: "Pagination cursor for next page of results" }, page_size: { type: "number", description: "Number of results per page (max 100)" } }, required: ["database_id"] } }; var retrieveDatabaseTool = { name: "notion_retrieve_database", description: "Retrieve a database in Notion", inputSchema: { type: "object", properties: { database_id: { type: "string", description: "The ID of the database to retrieve." + commonIdDescription } }, required: ["database_id"] } }; var updateDatabaseTool = { name: "notion_update_database", description: "Update a database in Notion", inputSchema: { type: "object", properties: { database_id: { type: "string", description: "The ID of the database to update." + commonIdDescription }, title: { type: "array", description: "An array of rich text objects that represents the title of the database that is displayed in the Notion UI.", items: richTextObjectSchema }, description: { type: "array", description: "An array of rich text objects that represents the description of the database that is displayed in the Notion UI." }, properties: { type: "object", description: "The properties of a database to be changed in the request, in the form of a JSON object." } }, required: ["database_id"] } }; var createDatabaseItemTool = { name: "notion_create_database_item", description: "Create a new item (page) in a Notion database", inputSchema: { type: "object", properties: { database_id: { type: "string", description: "The ID of the database to add the item to." + commonIdDescription }, properties: { type: "object", description: "Properties of the new database item. These should match the database schema." } }, required: ["database_id", "properties"] } }; var createCommentTool = { name: "notion_create_comment", description: "Create a comment in Notion. This requires the integration to have 'insert comment' capabilities. You can either specify a page parent or a discussion_id, but not both.", inputSchema: { type: "object", properties: { parent: { type: "object", description: "Parent object that specifies the page to comment on. Must include a page_id if used.", properties: { page_id: { type: "string", description: "The ID of the page to comment on." + commonIdDescription } } }, discussion_id: { type: "string", description: "The ID of an existing discussion thread to add a comment to." + commonIdDescription }, rich_text: { type: "array", description: "Array of rich text objects representing the comment content.", items: richTextObjectSchema } }, required: ["rich_text"] } }; var retrieveCommentsTool = { name: "notion_retrieve_comments", description: "Retrieve a list of unresolved comments from a Notion page or block. Requires the integration to have 'read comment' capabilities.", inputSchema: { type: "object", properties: { block_id: { type: "string", description: "The ID of the block or page whose comments you want to retrieve." + commonIdDescription }, start_cursor: { type: "string", description: "If supplied, returns a page of results starting after the cursor." }, page_size: { type: "number", description: "Number of comments to retrieve (max 100)." } }, required: ["block_id"] } }; var searchTool = { name: "notion_search", description: "Search pages or databases by title in Notion", inputSchema: { type: "object", properties: { query: { type: "string", description: "Text to search for in page or database titles" }, filter: { type: "object", description: "Filter results by object type (page or database)", properties: { property: { type: "string", description: "Must be 'object'" }, value: { type: "string", description: "Either 'page' or 'database'" } } }, sort: { type: "object", description: "Sort order of results", properties: { direction: { type: "string", enum: ["ascending", "descending"] }, timestamp: { type: "string", enum: ["last_edited_time"] } } }, start_cursor: { type: "string", description: "Pagination start cursor" }, page_size: { type: "number", description: "Number of results to return (max 100)" } } } }; var createWorkflowTool = { name: "notion_create_workflow", description: "Create an automated workflow in Notion", inputSchema: { type: "object", properties: { title: { type: "string", description: "Title of the workflow" }, trigger: { type: "object", description: "Event that triggers the workflow", properties: { type: { type: "string", description: "Type of trigger", enum: ["property_changed", "item_created", "date_reached"] }, condition: { type: "object", description: "Conditions for the trigger" } }, required: ["type"] }, actions: { type: "array", description: "Actions to perform when the workflow is triggered", items: { type: "object", properties: { type: { type: "string", description: "Type of action", enum: ["update_property", "create_item", "send_notification"] }, parameters: { type: "object", description: "Parameters for the action" } }, required: ["type", "parameters"] } } }, required: ["title", "trigger", "actions"] } }; var importFromCSVTool = { name: "notion_import_from_csv", description: "Import data from CSV into a Notion database", inputSchema: { type: "object", properties: { database_id: { type: "string", description: "ID of the database to import into" + commonIdDescription }, csv_content: { type: "string", description: "Content of the CSV file to import" }, column_mappings: { type: "object", description: "Mapping of CSV columns to database properties" } }, required: ["database_id", "csv_content"] } }; var exportToCSVTool = { name: "notion_export_to_csv", description: "Export a Notion database to CSV format", inputSchema: { type: "object", properties: { database_id: { type: "string", description: "ID of the database to export" + commonIdDescription }, filter: { type: "object", description: "Filter to apply before exporting" } }, required: ["database_id"] } }; var createRecurringTaskTool = { name: "notion_create_recurring_task", description: "Create a recurring task in a Notion database", inputSchema: { type: "object", properties: { database_id: { type: "string", description: "ID of the task database" + commonIdDescription }, task_properties: { type: "object", description: "Properties for the task" }, recurrence_pattern: { type: "object", description: "Pattern for task recurrence", properties: { frequency: { type: "string", description: "How often the task repeats", enum: ["daily", "weekly", "monthly", "yearly"] }, interval: { type: "number", description: "Interval between occurrences" }, end_date: { type: "string", description: "Date when recurrence should end (ISO format)" }, days_of_week: { type: "array", description: "Days of week for weekly recurrence", items: { type: "string", enum: [ "monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday" ] } } }, required: ["frequency", "interval"] } }, required: ["database_id", "task_properties", "recurrence_pattern"] } }; var allNotionTools = [ appendBlockChildrenTool, retrieveBlockTool, retrieveBlockChildrenTool, updateBlockTool, deleteBlockTool, retrievePageTool, updatePagePropertiesTool, listAllUsersTool, retrieveUserTool, retrieveBotUserTool, createDatabaseTool, queryDatabaseTool, retrieveDatabaseTool, updateDatabaseTool, createDatabaseItemTool, createCommentTool, retrieveCommentsTool, searchTool, createWorkflowTool, importFromCSVTool, exportToCSVTool, createRecurringTaskTool ]; // src/notion/server.ts async function startNotionServer(apiToken) { logger.info("Starting Notion MCP Server..."); if (!apiToken) { logger.error("Notion API token not provided"); throw new Error("Notion API token is required"); } const server = new Server({ name: "Notion MCP Server", version: "1.0.0" }, { capabilities: { tools: {} } }); const notionClient = new NotionClientWrapper(apiToken); server.setRequestHandler(CallToolRequestSchema, async (request) => { logger.debug("Received CallToolRequest", { requestId: request.id, tool: request.params.name }); try { if (!request.params.arguments) { throw new Error("No arguments provided"); } switch (request.params.name) { case "notion_append_block_children": { const args = request.params.arguments; const response = await notionClient.appendBlockChildren(args); return { content: [{ type: "text", text: JSON.stringify(response) }] }; } case "notion_retrieve_block": { const args = request.params.arguments; const response = await notionClient.retrieveBlock(args); return { content: [{ type: "text", text: JSON.stringify(response) }] }; } case "notion_retrieve_block_children": { const args = request.params.arguments; const response = await notionClient.retrieveBlockChildren(args); return { content: [{ type: "text", text: JSON.stringify(response) }] }; } case "notion_update_block": { const args = request.params.arguments; const response = await notionClient.updateBlock(args); return { content: [{ type: "text", text: JSON.stringify(response) }] }; } case "notion_delete_block": { const args = request.params.arguments; const response = await notionClient.deleteBlock(args); return { content: [{ type: "text", text: JSON.stringify(response) }] }; } case "notion_retrieve_page": { const args = request.params.arguments; const response = await notionClient.retrievePage(args); return { content: [{ type: "text", text: JSON.stringify(response) }] }; } case "notion_update_page_properties": { const args = request.params.arguments; const response = await notionClient.updatePageProperties(args); return { content: [{ type: "text", text: JSON.stringify(response) }] }; } case "notion_list_all_users": { const args = request.params.arguments; const response = await notionClient.listAllUsers(args); return { content: [{ type: "text", text: JSON.stringify(response) }] }; } case "notion_retrieve_user": { const args = request.params.arguments; const response = await notionClient.retrieveUser(args); return { content: [{ type: "text", text: JSON.stringify(response) }] }; } case "notion_retrieve_bot_user": { const response = await notionClient.retrieveBotUser(); return { content: [{ type: "text", text: JSON.stringify(response) }] }; } case "notion_create_database": { const args = request.params.arguments; const response = await notionClient.createDatabase(args); return { content: [{ type: "text", text: JSON.stringify(response) }] }; } case "notion_query_database": { const args = request.params.arguments; const response = await notionClient.queryDatabase(args); return { content: [{ type: "text", text: JSON.stringify(response) }] }; } case "notion_retrieve_database": { const args = request.params.arguments; const response = await notionClient.retrieveDatabase(args); return { content: [{ type: "text", text: JSON.stringify(response) }] }; } case "notion_update_database": { const args = request.params.arguments; const response = await notionClient.updateDatabase(args); return { content: [{ type: "text", text: JSON.stringify(response) }] }; } case "notion_create_database_item": { const args = request.params.arguments; const response = await notionClient.createDatabaseItem(args); return { content: [{ type: "text", text: JSON.stringify(response) }] }; } case "notion_create_comment": { const args = request.params.arguments; const response = await notionClient.createComment(args); return { content: [{ type: "text", text: JSON.stringify(response) }] }; } case "notion_retrieve_comments": { const args = request.params.arguments; const response = await notionClient.retrieveComments(args); return { content: [{ type: "text", text: JSON.stringify(response) }] }; } case "notion_search": { const args = request.params.arguments; const response = await notionClient.search(args); return { content: [{ type: "text", text: JSON.stringify(response) }] }; } case "notion_create_workflow": { const args = request.params.arguments; const response = await notionClient.createWorkflow(args); return { content: [{ type: "text", text: JSON.stringify(response) }] }; } case "notion_import_from_csv": { const args = request.params.arguments; const response = await notionClient.importFromCSV(args); return { content: [{ type: "text", text: JSON.stringify(response) }] }; } case "notion_export_to_csv": { const args = request.params.arguments; const response = await notionClient.exportToCSV(args); return { content: [{ type: "text", text: JSON.stringify(response) }] }; } case "notion_create_recurring_task": { const args = request.params.arguments; const response = await notionClient.createRecurringTask(args); return { content: [{ type: "text", text: JSON.stringify(response) }] }; } default: logger.warn(`Unknown tool requested: ${request.params.name}`); throw new Error(`Unknown tool: ${request.params.name}`); } } catch (error) { logger.error("Error executing tool", { tool: request.params.name, error: error instanceof Error ? error.message : String(error), stack: error instanceof Error ? error.stack : undefined }); return { content: [ { type: "text", text: JSON.stringify({ error: error instanceof Error ? error.message : String(error) }) } ] }; } }); server.setRequestHandler(ListToolsRequestSchema, async () => { logger.debug("Received ListToolsRequest"); return { tools: allNotionTools }; }); const transport = new StdioServerTransport; try { await server.connect(transport); logger.info("Notion MCP Server started successfully"); } catch (error) { logger.error("Failed to start server", { error: error instanceof Error ? error.message : String(error) }); throw error; } } // src/notion/index.ts function displayBanner() { const banner = ` ╔═══════════════════════════════════════════════╗ ║ ║ ║ Notion MCP Server v1.0.0 ║ ║ ║ ╚═══════════════════════════════════════════════╝ `; console.log(banner); logger.info(`Starting Notion MCP Server`); } process.on("uncaughtException", (error) => { logger.error("Uncaught exception", { error: error.message, stack: error.stack }); process.exit(1); }); process.on("unhandledRejection", (reason, promise) => { logger.error("Unhandled Rejection", { reason: reason instanceof Error ? reason.message : String(reason), stack: reason instanceof Error ? reason.stack : undefined }); process.exit(1); }); async function main() { displayBanner(); const apiToken = process.argv[2]; if (!apiToken) { logger.error("Notion API token is required. Please provide it as a command line argument."); console.error("Usage: node index.js <your_notion_api_token>"); process.exit(1); } try { await startNotionServer(apiToken); } catch (error) { logger.error("Fatal error in main()", { error: error instanceof Error ? error.message : String(error), stack: error instanceof Error ? error.stack : undefined }); process.exit(1); } } process.on("SIGINT", () => { logger.info("Received SIGINT signal"); logger.info("Shutting down Notion MCP Server..."); process.exit(0); }); process.on("SIGTERM", () => { logger.info("Received SIGTERM signal"); logger.info("Shutting down Notion MCP Server..."); process.exit(0); }); main();