var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); // node_modules/.pnpm/unenv@2.0.0-rc.24/node_modules/unenv/dist/runtime/_internal/utils.mjs // @__NO_SIDE_EFFECTS__ function createNotImplementedError(name) { return new Error(`[unenv] ${name} is not implemented yet!`); } __name(createNotImplementedError, "createNotImplementedError"); // @__NO_SIDE_EFFECTS__ function notImplemented(name) { const fn = /* @__PURE__ */ __name(() => { throw /* @__PURE__ */ createNotImplementedError(name); }, "fn"); return Object.assign(fn, { __unenv__: true }); } __name(notImplemented, "notImplemented"); // @__NO_SIDE_EFFECTS__ function notImplementedClass(name) { return class { __unenv__ = true; constructor() { throw new Error(`[unenv] ${name} is not implemented yet!`); } }; } __name(notImplementedClass, "notImplementedClass"); // node_modules/.pnpm/unenv@2.0.0-rc.24/node_modules/unenv/dist/runtime/node/internal/perf_hooks/performance.mjs var _timeOrigin = globalThis.performance?.timeOrigin ?? Date.now(); var _performanceNow = globalThis.performance?.now ? globalThis.performance.now.bind(globalThis.performance) : () => Date.now() - _timeOrigin; var nodeTiming = { name: "node", entryType: "node", startTime: 0, duration: 0, nodeStart: 0, v8Start: 0, bootstrapComplete: 0, environment: 0, loopStart: 0, loopExit: 0, idleTime: 0, uvMetricsInfo: { loopCount: 0, events: 0, eventsWaiting: 0 }, detail: void 0, toJSON() { return this; } }; var PerformanceEntry = class { static { __name(this, "PerformanceEntry"); } __unenv__ = true; detail; entryType = "event"; name; startTime; constructor(name, options) { this.name = name; this.startTime = options?.startTime || _performanceNow(); this.detail = options?.detail; } get duration() { return _performanceNow() - this.startTime; } toJSON() { return { name: this.name, entryType: this.entryType, startTime: this.startTime, duration: this.duration, detail: this.detail }; } }; var PerformanceMark = class PerformanceMark2 extends PerformanceEntry { static { __name(this, "PerformanceMark"); } entryType = "mark"; constructor() { super(...arguments); } get duration() { return 0; } }; var PerformanceMeasure = class extends PerformanceEntry { static { __name(this, "PerformanceMeasure"); } entryType = "measure"; }; var PerformanceResourceTiming = class extends PerformanceEntry { static { __name(this, "PerformanceResourceTiming"); } entryType = "resource"; serverTiming = []; connectEnd = 0; connectStart = 0; decodedBodySize = 0; domainLookupEnd = 0; domainLookupStart = 0; encodedBodySize = 0; fetchStart = 0; initiatorType = ""; name = ""; nextHopProtocol = ""; redirectEnd = 0; redirectStart = 0; requestStart = 0; responseEnd = 0; responseStart = 0; secureConnectionStart = 0; startTime = 0; transferSize = 0; workerStart = 0; responseStatus = 0; }; var PerformanceObserverEntryList = class { static { __name(this, "PerformanceObserverEntryList"); } __unenv__ = true; getEntries() { return []; } getEntriesByName(_name, _type) { return []; } getEntriesByType(type) { return []; } }; var Performance = class { static { __name(this, "Performance"); } __unenv__ = true; timeOrigin = _timeOrigin; eventCounts = /* @__PURE__ */ new Map(); _entries = []; _resourceTimingBufferSize = 0; navigation = void 0; timing = void 0; timerify(_fn, _options) { throw createNotImplementedError("Performance.timerify"); } get nodeTiming() { return nodeTiming; } eventLoopUtilization() { return {}; } markResourceTiming() { return new PerformanceResourceTiming(""); } onresourcetimingbufferfull = null; now() { if (this.timeOrigin === _timeOrigin) { return _performanceNow(); } return Date.now() - this.timeOrigin; } clearMarks(markName) { this._entries = markName ? this._entries.filter((e) => e.name !== markName) : this._entries.filter((e) => e.entryType !== "mark"); } clearMeasures(measureName) { this._entries = measureName ? this._entries.filter((e) => e.name !== measureName) : this._entries.filter((e) => e.entryType !== "measure"); } clearResourceTimings() { this._entries = this._entries.filter((e) => e.entryType !== "resource" || e.entryType !== "navigation"); } getEntries() { return this._entries; } getEntriesByName(name, type) { return this._entries.filter((e) => e.name === name && (!type || e.entryType === type)); } getEntriesByType(type) { return this._entries.filter((e) => e.entryType === type); } mark(name, options) { const entry = new PerformanceMark(name, options); this._entries.push(entry); return entry; } measure(measureName, startOrMeasureOptions, endMark) { let start; let end; if (typeof startOrMeasureOptions === "string") { start = this.getEntriesByName(startOrMeasureOptions, "mark")[0]?.startTime; end = this.getEntriesByName(endMark, "mark")[0]?.startTime; } else { start = Number.parseFloat(startOrMeasureOptions?.start) || this.now(); end = Number.parseFloat(startOrMeasureOptions?.end) || this.now(); } const entry = new PerformanceMeasure(measureName, { startTime: start, detail: { start, end } }); this._entries.push(entry); return entry; } setResourceTimingBufferSize(maxSize) { this._resourceTimingBufferSize = maxSize; } addEventListener(type, listener, options) { throw createNotImplementedError("Performance.addEventListener"); } removeEventListener(type, listener, options) { throw createNotImplementedError("Performance.removeEventListener"); } dispatchEvent(event) { throw createNotImplementedError("Performance.dispatchEvent"); } toJSON() { return this; } }; var PerformanceObserver = class { static { __name(this, "PerformanceObserver"); } __unenv__ = true; static supportedEntryTypes = []; _callback = null; constructor(callback) { this._callback = callback; } takeRecords() { return []; } disconnect() { throw createNotImplementedError("PerformanceObserver.disconnect"); } observe(options) { throw createNotImplementedError("PerformanceObserver.observe"); } bind(fn) { return fn; } runInAsyncScope(fn, thisArg, ...args) { return fn.call(thisArg, ...args); } asyncId() { return 0; } triggerAsyncId() { return 0; } emitDestroy() { return this; } }; var performance = globalThis.performance && "addEventListener" in globalThis.performance ? globalThis.performance : new Performance(); // node_modules/.pnpm/@cloudflare+unenv-preset@2.16.0_unenv@2.0.0-rc.24_workerd@1.20260415.1/node_modules/@cloudflare/unenv-preset/dist/runtime/polyfill/performance.mjs if (!("__unenv__" in performance)) { const proto = Performance.prototype; for (const key of Object.getOwnPropertyNames(proto)) { if (key !== "constructor" && !(key in performance)) { const desc = Object.getOwnPropertyDescriptor(proto, key); if (desc) { Object.defineProperty(performance, key, desc); } } } } globalThis.performance = performance; globalThis.Performance = Performance; globalThis.PerformanceEntry = PerformanceEntry; globalThis.PerformanceMark = PerformanceMark; globalThis.PerformanceMeasure = PerformanceMeasure; globalThis.PerformanceObserver = PerformanceObserver; globalThis.PerformanceObserverEntryList = PerformanceObserverEntryList; globalThis.PerformanceResourceTiming = PerformanceResourceTiming; // node_modules/.pnpm/unenv@2.0.0-rc.24/node_modules/unenv/dist/runtime/node/console.mjs import { Writable } from "node:stream"; // node_modules/.pnpm/unenv@2.0.0-rc.24/node_modules/unenv/dist/runtime/mock/noop.mjs var noop_default = Object.assign(() => { }, { __unenv__: true }); // node_modules/.pnpm/unenv@2.0.0-rc.24/node_modules/unenv/dist/runtime/node/console.mjs var _console = globalThis.console; var _ignoreErrors = true; var _stderr = new Writable(); var _stdout = new Writable(); var log = _console?.log ?? noop_default; var info = _console?.info ?? log; var trace = _console?.trace ?? info; var debug = _console?.debug ?? log; var table = _console?.table ?? log; var error = _console?.error ?? log; var warn = _console?.warn ?? error; var createTask = _console?.createTask ?? /* @__PURE__ */ notImplemented("console.createTask"); var clear = _console?.clear ?? noop_default; var count = _console?.count ?? noop_default; var countReset = _console?.countReset ?? noop_default; var dir = _console?.dir ?? noop_default; var dirxml = _console?.dirxml ?? noop_default; var group = _console?.group ?? noop_default; var groupEnd = _console?.groupEnd ?? noop_default; var groupCollapsed = _console?.groupCollapsed ?? noop_default; var profile = _console?.profile ?? noop_default; var profileEnd = _console?.profileEnd ?? noop_default; var time = _console?.time ?? noop_default; var timeEnd = _console?.timeEnd ?? noop_default; var timeLog = _console?.timeLog ?? noop_default; var timeStamp = _console?.timeStamp ?? noop_default; var Console = _console?.Console ?? /* @__PURE__ */ notImplementedClass("console.Console"); var _times = /* @__PURE__ */ new Map(); var _stdoutErrorHandler = noop_default; var _stderrErrorHandler = noop_default; // node_modules/.pnpm/@cloudflare+unenv-preset@2.16.0_unenv@2.0.0-rc.24_workerd@1.20260415.1/node_modules/@cloudflare/unenv-preset/dist/runtime/node/console.mjs var workerdConsole = globalThis["console"]; var { assert, clear: clear2, // @ts-expect-error undocumented public API context, count: count2, countReset: countReset2, // @ts-expect-error undocumented public API createTask: createTask2, debug: debug2, dir: dir2, dirxml: dirxml2, error: error2, group: group2, groupCollapsed: groupCollapsed2, groupEnd: groupEnd2, info: info2, log: log2, profile: profile2, profileEnd: profileEnd2, table: table2, time: time2, timeEnd: timeEnd2, timeLog: timeLog2, timeStamp: timeStamp2, trace: trace2, warn: warn2 } = workerdConsole; Object.assign(workerdConsole, { Console, _ignoreErrors, _stderr, _stderrErrorHandler, _stdout, _stdoutErrorHandler, _times }); var console_default = workerdConsole; // node_modules/.pnpm/wrangler@4.83.0_@cloudflare+workers-types@4.20260414.1/node_modules/wrangler/_virtual_unenv_global_polyfill-@cloudflare-unenv-preset-node-console globalThis.console = console_default; // node_modules/.pnpm/unenv@2.0.0-rc.24/node_modules/unenv/dist/runtime/node/internal/process/hrtime.mjs var hrtime = /* @__PURE__ */ Object.assign(/* @__PURE__ */ __name(function hrtime2(startTime) { const now = Date.now(); const seconds = Math.trunc(now / 1e3); const nanos = now % 1e3 * 1e6; if (startTime) { let diffSeconds = seconds - startTime[0]; let diffNanos = nanos - startTime[0]; if (diffNanos < 0) { diffSeconds = diffSeconds - 1; diffNanos = 1e9 + diffNanos; } return [diffSeconds, diffNanos]; } return [seconds, nanos]; }, "hrtime"), { bigint: /* @__PURE__ */ __name(function bigint() { return BigInt(Date.now() * 1e6); }, "bigint") }); // node_modules/.pnpm/unenv@2.0.0-rc.24/node_modules/unenv/dist/runtime/node/internal/process/process.mjs import { EventEmitter } from "node:events"; // node_modules/.pnpm/unenv@2.0.0-rc.24/node_modules/unenv/dist/runtime/node/internal/tty/read-stream.mjs var ReadStream = class { static { __name(this, "ReadStream"); } fd; isRaw = false; isTTY = false; constructor(fd) { this.fd = fd; } setRawMode(mode) { this.isRaw = mode; return this; } }; // node_modules/.pnpm/unenv@2.0.0-rc.24/node_modules/unenv/dist/runtime/node/internal/tty/write-stream.mjs var WriteStream = class { static { __name(this, "WriteStream"); } fd; columns = 80; rows = 24; isTTY = false; constructor(fd) { this.fd = fd; } clearLine(dir3, callback) { callback && callback(); return false; } clearScreenDown(callback) { callback && callback(); return false; } cursorTo(x, y, callback) { callback && typeof callback === "function" && callback(); return false; } moveCursor(dx, dy, callback) { callback && callback(); return false; } getColorDepth(env2) { return 1; } hasColors(count3, env2) { return false; } getWindowSize() { return [this.columns, this.rows]; } write(str, encoding, cb) { if (str instanceof Uint8Array) { str = new TextDecoder().decode(str); } try { console.log(str); } catch { } cb && typeof cb === "function" && cb(); return false; } }; // node_modules/.pnpm/unenv@2.0.0-rc.24/node_modules/unenv/dist/runtime/node/internal/process/node-version.mjs var NODE_VERSION = "22.14.0"; // node_modules/.pnpm/unenv@2.0.0-rc.24/node_modules/unenv/dist/runtime/node/internal/process/process.mjs var Process = class _Process extends EventEmitter { static { __name(this, "Process"); } env; hrtime; nextTick; constructor(impl) { super(); this.env = impl.env; this.hrtime = impl.hrtime; this.nextTick = impl.nextTick; for (const prop of [...Object.getOwnPropertyNames(_Process.prototype), ...Object.getOwnPropertyNames(EventEmitter.prototype)]) { const value = this[prop]; if (typeof value === "function") { this[prop] = value.bind(this); } } } // --- event emitter --- emitWarning(warning, type, code) { console.warn(`${code ? `[${code}] ` : ""}${type ? `${type}: ` : ""}${warning}`); } emit(...args) { return super.emit(...args); } listeners(eventName) { return super.listeners(eventName); } // --- stdio (lazy initializers) --- #stdin; #stdout; #stderr; get stdin() { return this.#stdin ??= new ReadStream(0); } get stdout() { return this.#stdout ??= new WriteStream(1); } get stderr() { return this.#stderr ??= new WriteStream(2); } // --- cwd --- #cwd = "/"; chdir(cwd2) { this.#cwd = cwd2; } cwd() { return this.#cwd; } // --- dummy props and getters --- arch = ""; platform = ""; argv = []; argv0 = ""; execArgv = []; execPath = ""; title = ""; pid = 200; ppid = 100; get version() { return `v${NODE_VERSION}`; } get versions() { return { node: NODE_VERSION }; } get allowedNodeEnvironmentFlags() { return /* @__PURE__ */ new Set(); } get sourceMapsEnabled() { return false; } get debugPort() { return 0; } get throwDeprecation() { return false; } get traceDeprecation() { return false; } get features() { return {}; } get release() { return {}; } get connected() { return false; } get config() { return {}; } get moduleLoadList() { return []; } constrainedMemory() { return 0; } availableMemory() { return 0; } uptime() { return 0; } resourceUsage() { return {}; } // --- noop methods --- ref() { } unref() { } // --- unimplemented methods --- umask() { throw createNotImplementedError("process.umask"); } getBuiltinModule() { return void 0; } getActiveResourcesInfo() { throw createNotImplementedError("process.getActiveResourcesInfo"); } exit() { throw createNotImplementedError("process.exit"); } reallyExit() { throw createNotImplementedError("process.reallyExit"); } kill() { throw createNotImplementedError("process.kill"); } abort() { throw createNotImplementedError("process.abort"); } dlopen() { throw createNotImplementedError("process.dlopen"); } setSourceMapsEnabled() { throw createNotImplementedError("process.setSourceMapsEnabled"); } loadEnvFile() { throw createNotImplementedError("process.loadEnvFile"); } disconnect() { throw createNotImplementedError("process.disconnect"); } cpuUsage() { throw createNotImplementedError("process.cpuUsage"); } setUncaughtExceptionCaptureCallback() { throw createNotImplementedError("process.setUncaughtExceptionCaptureCallback"); } hasUncaughtExceptionCaptureCallback() { throw createNotImplementedError("process.hasUncaughtExceptionCaptureCallback"); } initgroups() { throw createNotImplementedError("process.initgroups"); } openStdin() { throw createNotImplementedError("process.openStdin"); } assert() { throw createNotImplementedError("process.assert"); } binding() { throw createNotImplementedError("process.binding"); } // --- attached interfaces --- permission = { has: /* @__PURE__ */ notImplemented("process.permission.has") }; report = { directory: "", filename: "", signal: "SIGUSR2", compact: false, reportOnFatalError: false, reportOnSignal: false, reportOnUncaughtException: false, getReport: /* @__PURE__ */ notImplemented("process.report.getReport"), writeReport: /* @__PURE__ */ notImplemented("process.report.writeReport") }; finalization = { register: /* @__PURE__ */ notImplemented("process.finalization.register"), unregister: /* @__PURE__ */ notImplemented("process.finalization.unregister"), registerBeforeExit: /* @__PURE__ */ notImplemented("process.finalization.registerBeforeExit") }; memoryUsage = Object.assign(() => ({ arrayBuffers: 0, rss: 0, external: 0, heapTotal: 0, heapUsed: 0 }), { rss: /* @__PURE__ */ __name(() => 0, "rss") }); // --- undefined props --- mainModule = void 0; domain = void 0; // optional send = void 0; exitCode = void 0; channel = void 0; getegid = void 0; geteuid = void 0; getgid = void 0; getgroups = void 0; getuid = void 0; setegid = void 0; seteuid = void 0; setgid = void 0; setgroups = void 0; setuid = void 0; // internals _events = void 0; _eventsCount = void 0; _exiting = void 0; _maxListeners = void 0; _debugEnd = void 0; _debugProcess = void 0; _fatalException = void 0; _getActiveHandles = void 0; _getActiveRequests = void 0; _kill = void 0; _preload_modules = void 0; _rawDebug = void 0; _startProfilerIdleNotifier = void 0; _stopProfilerIdleNotifier = void 0; _tickCallback = void 0; _disconnect = void 0; _handleQueue = void 0; _pendingMessage = void 0; _channel = void 0; _send = void 0; _linkedBinding = void 0; }; // node_modules/.pnpm/@cloudflare+unenv-preset@2.16.0_unenv@2.0.0-rc.24_workerd@1.20260415.1/node_modules/@cloudflare/unenv-preset/dist/runtime/node/process.mjs var globalProcess = globalThis["process"]; var getBuiltinModule = globalProcess.getBuiltinModule; var workerdProcess = getBuiltinModule("node:process"); var unenvProcess = new Process({ env: globalProcess.env, hrtime, // `nextTick` is available from workerd process v1 nextTick: workerdProcess.nextTick }); var { exit, features, platform } = workerdProcess; var { _channel, _debugEnd, _debugProcess, _disconnect, _events, _eventsCount, _exiting, _fatalException, _getActiveHandles, _getActiveRequests, _handleQueue, _kill, _linkedBinding, _maxListeners, _pendingMessage, _preload_modules, _rawDebug, _send, _startProfilerIdleNotifier, _stopProfilerIdleNotifier, _tickCallback, abort, addListener, allowedNodeEnvironmentFlags, arch, argv, argv0, assert: assert2, availableMemory, binding, channel, chdir, config, connected, constrainedMemory, cpuUsage, cwd, debugPort, disconnect, dlopen, domain, emit, emitWarning, env, eventNames, execArgv, execPath, exitCode, finalization, getActiveResourcesInfo, getegid, geteuid, getgid, getgroups, getMaxListeners, getuid, hasUncaughtExceptionCaptureCallback, hrtime: hrtime3, initgroups, kill, listenerCount, listeners, loadEnvFile, mainModule, memoryUsage, moduleLoadList, nextTick, off, on, once, openStdin, permission, pid, ppid, prependListener, prependOnceListener, rawListeners, reallyExit, ref, release, removeAllListeners, removeListener, report, resourceUsage, send, setegid, seteuid, setgid, setgroups, setMaxListeners, setSourceMapsEnabled, setuid, setUncaughtExceptionCaptureCallback, sourceMapsEnabled, stderr, stdin, stdout, throwDeprecation, title, traceDeprecation, umask, unref, uptime, version, versions } = unenvProcess; var _process = { abort, addListener, allowedNodeEnvironmentFlags, hasUncaughtExceptionCaptureCallback, setUncaughtExceptionCaptureCallback, loadEnvFile, sourceMapsEnabled, arch, argv, argv0, chdir, config, connected, constrainedMemory, availableMemory, cpuUsage, cwd, debugPort, dlopen, disconnect, emit, emitWarning, env, eventNames, execArgv, execPath, exit, finalization, features, getBuiltinModule, getActiveResourcesInfo, getMaxListeners, hrtime: hrtime3, kill, listeners, listenerCount, memoryUsage, nextTick, on, off, once, pid, platform, ppid, prependListener, prependOnceListener, rawListeners, release, removeAllListeners, removeListener, report, resourceUsage, setMaxListeners, setSourceMapsEnabled, stderr, stdin, stdout, title, throwDeprecation, traceDeprecation, umask, uptime, version, versions, // @ts-expect-error old API domain, initgroups, moduleLoadList, reallyExit, openStdin, assert: assert2, binding, send, exitCode, channel, getegid, geteuid, getgid, getgroups, getuid, setegid, seteuid, setgid, setgroups, setuid, permission, mainModule, _events, _eventsCount, _exiting, _maxListeners, _debugEnd, _debugProcess, _fatalException, _getActiveHandles, _getActiveRequests, _kill, _preload_modules, _rawDebug, _startProfilerIdleNotifier, _stopProfilerIdleNotifier, _tickCallback, _disconnect, _handleQueue, _pendingMessage, _channel, _send, _linkedBinding }; var process_default = _process; // node_modules/.pnpm/wrangler@4.83.0_@cloudflare+workers-types@4.20260414.1/node_modules/wrangler/_virtual_unenv_global_polyfill-@cloudflare-unenv-preset-node-process globalThis.process = process_default; // node_modules/.pnpm/hono@4.12.12/node_modules/hono/dist/compose.js var compose = /* @__PURE__ */ __name((middleware, onError, onNotFound) => { return (context2, next) => { let index = -1; return dispatch(0); async function dispatch(i) { if (i <= index) { throw new Error("next() called multiple times"); } index = i; let res; let isError = false; let handler; if (middleware[i]) { handler = middleware[i][0][0]; context2.req.routeIndex = i; } else { handler = i === middleware.length && next || void 0; } if (handler) { try { res = await handler(context2, () => dispatch(i + 1)); } catch (err) { if (err instanceof Error && onError) { context2.error = err; res = await onError(err, context2); isError = true; } else { throw err; } } } else { if (context2.finalized === false && onNotFound) { res = await onNotFound(context2); } } if (res && (context2.finalized === false || isError)) { context2.res = res; } return context2; } __name(dispatch, "dispatch"); }; }, "compose"); // node_modules/.pnpm/hono@4.12.12/node_modules/hono/dist/request/constants.js var GET_MATCH_RESULT = /* @__PURE__ */ Symbol(); // node_modules/.pnpm/hono@4.12.12/node_modules/hono/dist/utils/body.js var parseBody = /* @__PURE__ */ __name(async (request, options = /* @__PURE__ */ Object.create(null)) => { const { all = false, dot = false } = options; const headers = request instanceof HonoRequest ? request.raw.headers : request.headers; const contentType = headers.get("Content-Type"); if (contentType?.startsWith("multipart/form-data") || contentType?.startsWith("application/x-www-form-urlencoded")) { return parseFormData(request, { all, dot }); } return {}; }, "parseBody"); async function parseFormData(request, options) { const formData = await request.formData(); if (formData) { return convertFormDataToBodyData(formData, options); } return {}; } __name(parseFormData, "parseFormData"); function convertFormDataToBodyData(formData, options) { const form = /* @__PURE__ */ Object.create(null); formData.forEach((value, key) => { const shouldParseAllValues = options.all || key.endsWith("[]"); if (!shouldParseAllValues) { form[key] = value; } else { handleParsingAllValues(form, key, value); } }); if (options.dot) { Object.entries(form).forEach(([key, value]) => { const shouldParseDotValues = key.includes("."); if (shouldParseDotValues) { handleParsingNestedValues(form, key, value); delete form[key]; } }); } return form; } __name(convertFormDataToBodyData, "convertFormDataToBodyData"); var handleParsingAllValues = /* @__PURE__ */ __name((form, key, value) => { if (form[key] !== void 0) { if (Array.isArray(form[key])) { ; form[key].push(value); } else { form[key] = [form[key], value]; } } else { if (!key.endsWith("[]")) { form[key] = value; } else { form[key] = [value]; } } }, "handleParsingAllValues"); var handleParsingNestedValues = /* @__PURE__ */ __name((form, key, value) => { if (/(?:^|\.)__proto__\./.test(key)) { return; } let nestedForm = form; const keys = key.split("."); keys.forEach((key2, index) => { if (index === keys.length - 1) { nestedForm[key2] = value; } else { if (!nestedForm[key2] || typeof nestedForm[key2] !== "object" || Array.isArray(nestedForm[key2]) || nestedForm[key2] instanceof File) { nestedForm[key2] = /* @__PURE__ */ Object.create(null); } nestedForm = nestedForm[key2]; } }); }, "handleParsingNestedValues"); // node_modules/.pnpm/hono@4.12.12/node_modules/hono/dist/utils/url.js var splitPath = /* @__PURE__ */ __name((path) => { const paths = path.split("/"); if (paths[0] === "") { paths.shift(); } return paths; }, "splitPath"); var splitRoutingPath = /* @__PURE__ */ __name((routePath) => { const { groups, path } = extractGroupsFromPath(routePath); const paths = splitPath(path); return replaceGroupMarks(paths, groups); }, "splitRoutingPath"); var extractGroupsFromPath = /* @__PURE__ */ __name((path) => { const groups = []; path = path.replace(/\{[^}]+\}/g, (match2, index) => { const mark = `@${index}`; groups.push([mark, match2]); return mark; }); return { groups, path }; }, "extractGroupsFromPath"); var replaceGroupMarks = /* @__PURE__ */ __name((paths, groups) => { for (let i = groups.length - 1; i >= 0; i--) { const [mark] = groups[i]; for (let j = paths.length - 1; j >= 0; j--) { if (paths[j].includes(mark)) { paths[j] = paths[j].replace(mark, groups[i][1]); break; } } } return paths; }, "replaceGroupMarks"); var patternCache = {}; var getPattern = /* @__PURE__ */ __name((label, next) => { if (label === "*") { return "*"; } const match2 = label.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/); if (match2) { const cacheKey = `${label}#${next}`; if (!patternCache[cacheKey]) { if (match2[2]) { patternCache[cacheKey] = next && next[0] !== ":" && next[0] !== "*" ? [cacheKey, match2[1], new RegExp(`^${match2[2]}(?=/${next})`)] : [label, match2[1], new RegExp(`^${match2[2]}$`)]; } else { patternCache[cacheKey] = [label, match2[1], true]; } } return patternCache[cacheKey]; } return null; }, "getPattern"); var tryDecode = /* @__PURE__ */ __name((str, decoder) => { try { return decoder(str); } catch { return str.replace(/(?:%[0-9A-Fa-f]{2})+/g, (match2) => { try { return decoder(match2); } catch { return match2; } }); } }, "tryDecode"); var tryDecodeURI = /* @__PURE__ */ __name((str) => tryDecode(str, decodeURI), "tryDecodeURI"); var getPath = /* @__PURE__ */ __name((request) => { const url = request.url; const start = url.indexOf("/", url.indexOf(":") + 4); let i = start; for (; i < url.length; i++) { const charCode = url.charCodeAt(i); if (charCode === 37) { const queryIndex = url.indexOf("?", i); const hashIndex = url.indexOf("#", i); const end = queryIndex === -1 ? hashIndex === -1 ? void 0 : hashIndex : hashIndex === -1 ? queryIndex : Math.min(queryIndex, hashIndex); const path = url.slice(start, end); return tryDecodeURI(path.includes("%25") ? path.replace(/%25/g, "%2525") : path); } else if (charCode === 63 || charCode === 35) { break; } } return url.slice(start, i); }, "getPath"); var getPathNoStrict = /* @__PURE__ */ __name((request) => { const result = getPath(request); return result.length > 1 && result.at(-1) === "/" ? result.slice(0, -1) : result; }, "getPathNoStrict"); var mergePath = /* @__PURE__ */ __name((base, sub, ...rest) => { if (rest.length) { sub = mergePath(sub, ...rest); } return `${base?.[0] === "/" ? "" : "/"}${base}${sub === "/" ? "" : `${base?.at(-1) === "/" ? "" : "/"}${sub?.[0] === "/" ? sub.slice(1) : sub}`}`; }, "mergePath"); var checkOptionalParameter = /* @__PURE__ */ __name((path) => { if (path.charCodeAt(path.length - 1) !== 63 || !path.includes(":")) { return null; } const segments = path.split("/"); const results = []; let basePath = ""; segments.forEach((segment) => { if (segment !== "" && !/\:/.test(segment)) { basePath += "/" + segment; } else if (/\:/.test(segment)) { if (/\?/.test(segment)) { if (results.length === 0 && basePath === "") { results.push("/"); } else { results.push(basePath); } const optionalSegment = segment.replace("?", ""); basePath += "/" + optionalSegment; results.push(basePath); } else { basePath += "/" + segment; } } }); return results.filter((v, i, a) => a.indexOf(v) === i); }, "checkOptionalParameter"); var _decodeURI = /* @__PURE__ */ __name((value) => { if (!/[%+]/.test(value)) { return value; } if (value.indexOf("+") !== -1) { value = value.replace(/\+/g, " "); } return value.indexOf("%") !== -1 ? tryDecode(value, decodeURIComponent_) : value; }, "_decodeURI"); var _getQueryParam = /* @__PURE__ */ __name((url, key, multiple) => { let encoded; if (!multiple && key && !/[%+]/.test(key)) { let keyIndex2 = url.indexOf("?", 8); if (keyIndex2 === -1) { return void 0; } if (!url.startsWith(key, keyIndex2 + 1)) { keyIndex2 = url.indexOf(`&${key}`, keyIndex2 + 1); } while (keyIndex2 !== -1) { const trailingKeyCode = url.charCodeAt(keyIndex2 + key.length + 1); if (trailingKeyCode === 61) { const valueIndex = keyIndex2 + key.length + 2; const endIndex = url.indexOf("&", valueIndex); return _decodeURI(url.slice(valueIndex, endIndex === -1 ? void 0 : endIndex)); } else if (trailingKeyCode == 38 || isNaN(trailingKeyCode)) { return ""; } keyIndex2 = url.indexOf(`&${key}`, keyIndex2 + 1); } encoded = /[%+]/.test(url); if (!encoded) { return void 0; } } const results = {}; encoded ??= /[%+]/.test(url); let keyIndex = url.indexOf("?", 8); while (keyIndex !== -1) { const nextKeyIndex = url.indexOf("&", keyIndex + 1); let valueIndex = url.indexOf("=", keyIndex); if (valueIndex > nextKeyIndex && nextKeyIndex !== -1) { valueIndex = -1; } let name = url.slice( keyIndex + 1, valueIndex === -1 ? nextKeyIndex === -1 ? void 0 : nextKeyIndex : valueIndex ); if (encoded) { name = _decodeURI(name); } keyIndex = nextKeyIndex; if (name === "") { continue; } let value; if (valueIndex === -1) { value = ""; } else { value = url.slice(valueIndex + 1, nextKeyIndex === -1 ? void 0 : nextKeyIndex); if (encoded) { value = _decodeURI(value); } } if (multiple) { if (!(results[name] && Array.isArray(results[name]))) { results[name] = []; } ; results[name].push(value); } else { results[name] ??= value; } } return key ? results[key] : results; }, "_getQueryParam"); var getQueryParam = _getQueryParam; var getQueryParams = /* @__PURE__ */ __name((url, key) => { return _getQueryParam(url, key, true); }, "getQueryParams"); var decodeURIComponent_ = decodeURIComponent; // node_modules/.pnpm/hono@4.12.12/node_modules/hono/dist/request.js var tryDecodeURIComponent = /* @__PURE__ */ __name((str) => tryDecode(str, decodeURIComponent_), "tryDecodeURIComponent"); var HonoRequest = class { static { __name(this, "HonoRequest"); } /** * `.raw` can get the raw Request object. * * @see {@link https://hono.dev/docs/api/request#raw} * * @example * ```ts * // For Cloudflare Workers * app.post('/', async (c) => { * const metadata = c.req.raw.cf?.hostMetadata? * ... * }) * ``` */ raw; #validatedData; // Short name of validatedData #matchResult; routeIndex = 0; /** * `.path` can get the pathname of the request. * * @see {@link https://hono.dev/docs/api/request#path} * * @example * ```ts * app.get('/about/me', (c) => { * const pathname = c.req.path // `/about/me` * }) * ``` */ path; bodyCache = {}; constructor(request, path = "/", matchResult = [[]]) { this.raw = request; this.path = path; this.#matchResult = matchResult; this.#validatedData = {}; } param(key) { return key ? this.#getDecodedParam(key) : this.#getAllDecodedParams(); } #getDecodedParam(key) { const paramKey = this.#matchResult[0][this.routeIndex][1][key]; const param = this.#getParamValue(paramKey); return param && /\%/.test(param) ? tryDecodeURIComponent(param) : param; } #getAllDecodedParams() { const decoded = {}; const keys = Object.keys(this.#matchResult[0][this.routeIndex][1]); for (const key of keys) { const value = this.#getParamValue(this.#matchResult[0][this.routeIndex][1][key]); if (value !== void 0) { decoded[key] = /\%/.test(value) ? tryDecodeURIComponent(value) : value; } } return decoded; } #getParamValue(paramKey) { return this.#matchResult[1] ? this.#matchResult[1][paramKey] : paramKey; } query(key) { return getQueryParam(this.url, key); } queries(key) { return getQueryParams(this.url, key); } header(name) { if (name) { return this.raw.headers.get(name) ?? void 0; } const headerData = {}; this.raw.headers.forEach((value, key) => { headerData[key] = value; }); return headerData; } async parseBody(options) { return parseBody(this, options); } #cachedBody = /* @__PURE__ */ __name((key) => { const { bodyCache, raw: raw2 } = this; const cachedBody = bodyCache[key]; if (cachedBody) { return cachedBody; } const anyCachedKey = Object.keys(bodyCache)[0]; if (anyCachedKey) { return bodyCache[anyCachedKey].then((body) => { if (anyCachedKey === "json") { body = JSON.stringify(body); } return new Response(body)[key](); }); } return bodyCache[key] = raw2[key](); }, "#cachedBody"); /** * `.json()` can parse Request body of type `application/json` * * @see {@link https://hono.dev/docs/api/request#json} * * @example * ```ts * app.post('/entry', async (c) => { * const body = await c.req.json() * }) * ``` */ json() { return this.#cachedBody("text").then((text) => JSON.parse(text)); } /** * `.text()` can parse Request body of type `text/plain` * * @see {@link https://hono.dev/docs/api/request#text} * * @example * ```ts * app.post('/entry', async (c) => { * const body = await c.req.text() * }) * ``` */ text() { return this.#cachedBody("text"); } /** * `.arrayBuffer()` parse Request body as an `ArrayBuffer` * * @see {@link https://hono.dev/docs/api/request#arraybuffer} * * @example * ```ts * app.post('/entry', async (c) => { * const body = await c.req.arrayBuffer() * }) * ``` */ arrayBuffer() { return this.#cachedBody("arrayBuffer"); } /** * Parses the request body as a `Blob`. * @example * ```ts * app.post('/entry', async (c) => { * const body = await c.req.blob(); * }); * ``` * @see https://hono.dev/docs/api/request#blob */ blob() { return this.#cachedBody("blob"); } /** * Parses the request body as `FormData`. * @example * ```ts * app.post('/entry', async (c) => { * const body = await c.req.formData(); * }); * ``` * @see https://hono.dev/docs/api/request#formdata */ formData() { return this.#cachedBody("formData"); } /** * Adds validated data to the request. * * @param target - The target of the validation. * @param data - The validated data to add. */ addValidatedData(target, data) { this.#validatedData[target] = data; } valid(target) { return this.#validatedData[target]; } /** * `.url()` can get the request url strings. * * @see {@link https://hono.dev/docs/api/request#url} * * @example * ```ts * app.get('/about/me', (c) => { * const url = c.req.url // `http://localhost:8787/about/me` * ... * }) * ``` */ get url() { return this.raw.url; } /** * `.method()` can get the method name of the request. * * @see {@link https://hono.dev/docs/api/request#method} * * @example * ```ts * app.get('/about/me', (c) => { * const method = c.req.method // `GET` * }) * ``` */ get method() { return this.raw.method; } get [GET_MATCH_RESULT]() { return this.#matchResult; } /** * `.matchedRoutes()` can return a matched route in the handler * * @deprecated * * Use matchedRoutes helper defined in "hono/route" instead. * * @see {@link https://hono.dev/docs/api/request#matchedroutes} * * @example * ```ts * app.use('*', async function logger(c, next) { * await next() * c.req.matchedRoutes.forEach(({ handler, method, path }, i) => { * const name = handler.name || (handler.length < 2 ? '[handler]' : '[middleware]') * console.log( * method, * ' ', * path, * ' '.repeat(Math.max(10 - path.length, 0)), * name, * i === c.req.routeIndex ? '<- respond from here' : '' * ) * }) * }) * ``` */ get matchedRoutes() { return this.#matchResult[0].map(([[, route]]) => route); } /** * `routePath()` can retrieve the path registered within the handler * * @deprecated * * Use routePath helper defined in "hono/route" instead. * * @see {@link https://hono.dev/docs/api/request#routepath} * * @example * ```ts * app.get('/posts/:id', (c) => { * return c.json({ path: c.req.routePath }) * }) * ``` */ get routePath() { return this.#matchResult[0].map(([[, route]]) => route)[this.routeIndex].path; } }; // node_modules/.pnpm/hono@4.12.12/node_modules/hono/dist/utils/html.js var HtmlEscapedCallbackPhase = { Stringify: 1, BeforeStream: 2, Stream: 3 }; var raw = /* @__PURE__ */ __name((value, callbacks) => { const escapedString = new String(value); escapedString.isEscaped = true; escapedString.callbacks = callbacks; return escapedString; }, "raw"); var resolveCallback = /* @__PURE__ */ __name(async (str, phase, preserveCallbacks, context2, buffer) => { if (typeof str === "object" && !(str instanceof String)) { if (!(str instanceof Promise)) { str = str.toString(); } if (str instanceof Promise) { str = await str; } } const callbacks = str.callbacks; if (!callbacks?.length) { return Promise.resolve(str); } if (buffer) { buffer[0] += str; } else { buffer = [str]; } const resStr = Promise.all(callbacks.map((c) => c({ phase, buffer, context: context2 }))).then( (res) => Promise.all( res.filter(Boolean).map((str2) => resolveCallback(str2, phase, false, context2, buffer)) ).then(() => buffer[0]) ); if (preserveCallbacks) { return raw(await resStr, callbacks); } else { return resStr; } }, "resolveCallback"); // node_modules/.pnpm/hono@4.12.12/node_modules/hono/dist/context.js var TEXT_PLAIN = "text/plain; charset=UTF-8"; var setDefaultContentType = /* @__PURE__ */ __name((contentType, headers) => { return { "Content-Type": contentType, ...headers }; }, "setDefaultContentType"); var createResponseInstance = /* @__PURE__ */ __name((body, init) => new Response(body, init), "createResponseInstance"); var Context = class { static { __name(this, "Context"); } #rawRequest; #req; /** * `.env` can get bindings (environment variables, secrets, KV namespaces, D1 database, R2 bucket etc.) in Cloudflare Workers. * * @see {@link https://hono.dev/docs/api/context#env} * * @example * ```ts * // Environment object for Cloudflare Workers * app.get('*', async c => { * const counter = c.env.COUNTER * }) * ``` */ env = {}; #var; finalized = false; /** * `.error` can get the error object from the middleware if the Handler throws an error. * * @see {@link https://hono.dev/docs/api/context#error} * * @example * ```ts * app.use('*', async (c, next) => { * await next() * if (c.error) { * // do something... * } * }) * ``` */ error; #status; #executionCtx; #res; #layout; #renderer; #notFoundHandler; #preparedHeaders; #matchResult; #path; /** * Creates an instance of the Context class. * * @param req - The Request object. * @param options - Optional configuration options for the context. */ constructor(req, options) { this.#rawRequest = req; if (options) { this.#executionCtx = options.executionCtx; this.env = options.env; this.#notFoundHandler = options.notFoundHandler; this.#path = options.path; this.#matchResult = options.matchResult; } } /** * `.req` is the instance of {@link HonoRequest}. */ get req() { this.#req ??= new HonoRequest(this.#rawRequest, this.#path, this.#matchResult); return this.#req; } /** * @see {@link https://hono.dev/docs/api/context#event} * The FetchEvent associated with the current request. * * @throws Will throw an error if the context does not have a FetchEvent. */ get event() { if (this.#executionCtx && "respondWith" in this.#executionCtx) { return this.#executionCtx; } else { throw Error("This context has no FetchEvent"); } } /** * @see {@link https://hono.dev/docs/api/context#executionctx} * The ExecutionContext associated with the current request. * * @throws Will throw an error if the context does not have an ExecutionContext. */ get executionCtx() { if (this.#executionCtx) { return this.#executionCtx; } else { throw Error("This context has no ExecutionContext"); } } /** * @see {@link https://hono.dev/docs/api/context#res} * The Response object for the current request. */ get res() { return this.#res ||= createResponseInstance(null, { headers: this.#preparedHeaders ??= new Headers() }); } /** * Sets the Response object for the current request. * * @param _res - The Response object to set. */ set res(_res) { if (this.#res && _res) { _res = createResponseInstance(_res.body, _res); for (const [k, v] of this.#res.headers.entries()) { if (k === "content-type") { continue; } if (k === "set-cookie") { const cookies = this.#res.headers.getSetCookie(); _res.headers.delete("set-cookie"); for (const cookie of cookies) { _res.headers.append("set-cookie", cookie); } } else { _res.headers.set(k, v); } } } this.#res = _res; this.finalized = true; } /** * `.render()` can create a response within a layout. * * @see {@link https://hono.dev/docs/api/context#render-setrenderer} * * @example * ```ts * app.get('/', (c) => { * return c.render('Hello!') * }) * ``` */ render = /* @__PURE__ */ __name((...args) => { this.#renderer ??= (content) => this.html(content); return this.#renderer(...args); }, "render"); /** * Sets the layout for the response. * * @param layout - The layout to set. * @returns The layout function. */ setLayout = /* @__PURE__ */ __name((layout) => this.#layout = layout, "setLayout"); /** * Gets the current layout for the response. * * @returns The current layout function. */ getLayout = /* @__PURE__ */ __name(() => this.#layout, "getLayout"); /** * `.setRenderer()` can set the layout in the custom middleware. * * @see {@link https://hono.dev/docs/api/context#render-setrenderer} * * @example * ```tsx * app.use('*', async (c, next) => { * c.setRenderer((content) => { * return c.html( * * *

{content}

* * * ) * }) * await next() * }) * ``` */ setRenderer = /* @__PURE__ */ __name((renderer) => { this.#renderer = renderer; }, "setRenderer"); /** * `.header()` can set headers. * * @see {@link https://hono.dev/docs/api/context#header} * * @example * ```ts * app.get('/welcome', (c) => { * // Set headers * c.header('X-Message', 'Hello!') * c.header('Content-Type', 'text/plain') * * return c.body('Thank you for coming') * }) * ``` */ header = /* @__PURE__ */ __name((name, value, options) => { if (this.finalized) { this.#res = createResponseInstance(this.#res.body, this.#res); } const headers = this.#res ? this.#res.headers : this.#preparedHeaders ??= new Headers(); if (value === void 0) { headers.delete(name); } else if (options?.append) { headers.append(name, value); } else { headers.set(name, value); } }, "header"); status = /* @__PURE__ */ __name((status) => { this.#status = status; }, "status"); /** * `.set()` can set the value specified by the key. * * @see {@link https://hono.dev/docs/api/context#set-get} * * @example * ```ts * app.use('*', async (c, next) => { * c.set('message', 'Hono is hot!!') * await next() * }) * ``` */ set = /* @__PURE__ */ __name((key, value) => { this.#var ??= /* @__PURE__ */ new Map(); this.#var.set(key, value); }, "set"); /** * `.get()` can use the value specified by the key. * * @see {@link https://hono.dev/docs/api/context#set-get} * * @example * ```ts * app.get('/', (c) => { * const message = c.get('message') * return c.text(`The message is "${message}"`) * }) * ``` */ get = /* @__PURE__ */ __name((key) => { return this.#var ? this.#var.get(key) : void 0; }, "get"); /** * `.var` can access the value of a variable. * * @see {@link https://hono.dev/docs/api/context#var} * * @example * ```ts * const result = c.var.client.oneMethod() * ``` */ // c.var.propName is a read-only get var() { if (!this.#var) { return {}; } return Object.fromEntries(this.#var); } #newResponse(data, arg, headers) { const responseHeaders = this.#res ? new Headers(this.#res.headers) : this.#preparedHeaders ?? new Headers(); if (typeof arg === "object" && "headers" in arg) { const argHeaders = arg.headers instanceof Headers ? arg.headers : new Headers(arg.headers); for (const [key, value] of argHeaders) { if (key.toLowerCase() === "set-cookie") { responseHeaders.append(key, value); } else { responseHeaders.set(key, value); } } } if (headers) { for (const [k, v] of Object.entries(headers)) { if (typeof v === "string") { responseHeaders.set(k, v); } else { responseHeaders.delete(k); for (const v2 of v) { responseHeaders.append(k, v2); } } } } const status = typeof arg === "number" ? arg : arg?.status ?? this.#status; return createResponseInstance(data, { status, headers: responseHeaders }); } newResponse = /* @__PURE__ */ __name((...args) => this.#newResponse(...args), "newResponse"); /** * `.body()` can return the HTTP response. * You can set headers with `.header()` and set HTTP status code with `.status`. * This can also be set in `.text()`, `.json()` and so on. * * @see {@link https://hono.dev/docs/api/context#body} * * @example * ```ts * app.get('/welcome', (c) => { * // Set headers * c.header('X-Message', 'Hello!') * c.header('Content-Type', 'text/plain') * // Set HTTP status code * c.status(201) * * // Return the response body * return c.body('Thank you for coming') * }) * ``` */ body = /* @__PURE__ */ __name((data, arg, headers) => this.#newResponse(data, arg, headers), "body"); /** * `.text()` can render text as `Content-Type:text/plain`. * * @see {@link https://hono.dev/docs/api/context#text} * * @example * ```ts * app.get('/say', (c) => { * return c.text('Hello!') * }) * ``` */ text = /* @__PURE__ */ __name((text, arg, headers) => { return !this.#preparedHeaders && !this.#status && !arg && !headers && !this.finalized ? new Response(text) : this.#newResponse( text, arg, setDefaultContentType(TEXT_PLAIN, headers) ); }, "text"); /** * `.json()` can render JSON as `Content-Type:application/json`. * * @see {@link https://hono.dev/docs/api/context#json} * * @example * ```ts * app.get('/api', (c) => { * return c.json({ message: 'Hello!' }) * }) * ``` */ json = /* @__PURE__ */ __name((object, arg, headers) => { return this.#newResponse( JSON.stringify(object), arg, setDefaultContentType("application/json", headers) ); }, "json"); html = /* @__PURE__ */ __name((html, arg, headers) => { const res = /* @__PURE__ */ __name((html2) => this.#newResponse(html2, arg, setDefaultContentType("text/html; charset=UTF-8", headers)), "res"); return typeof html === "object" ? resolveCallback(html, HtmlEscapedCallbackPhase.Stringify, false, {}).then(res) : res(html); }, "html"); /** * `.redirect()` can Redirect, default status code is 302. * * @see {@link https://hono.dev/docs/api/context#redirect} * * @example * ```ts * app.get('/redirect', (c) => { * return c.redirect('/') * }) * app.get('/redirect-permanently', (c) => { * return c.redirect('/', 301) * }) * ``` */ redirect = /* @__PURE__ */ __name((location, status) => { const locationString = String(location); this.header( "Location", // Multibyes should be encoded // eslint-disable-next-line no-control-regex !/[^\x00-\xFF]/.test(locationString) ? locationString : encodeURI(locationString) ); return this.newResponse(null, status ?? 302); }, "redirect"); /** * `.notFound()` can return the Not Found Response. * * @see {@link https://hono.dev/docs/api/context#notfound} * * @example * ```ts * app.get('/notfound', (c) => { * return c.notFound() * }) * ``` */ notFound = /* @__PURE__ */ __name(() => { this.#notFoundHandler ??= () => createResponseInstance(); return this.#notFoundHandler(this); }, "notFound"); }; // node_modules/.pnpm/hono@4.12.12/node_modules/hono/dist/router.js var METHOD_NAME_ALL = "ALL"; var METHOD_NAME_ALL_LOWERCASE = "all"; var METHODS = ["get", "post", "put", "delete", "options", "patch"]; var MESSAGE_MATCHER_IS_ALREADY_BUILT = "Can not add a route since the matcher is already built."; var UnsupportedPathError = class extends Error { static { __name(this, "UnsupportedPathError"); } }; // node_modules/.pnpm/hono@4.12.12/node_modules/hono/dist/utils/constants.js var COMPOSED_HANDLER = "__COMPOSED_HANDLER"; // node_modules/.pnpm/hono@4.12.12/node_modules/hono/dist/hono-base.js var notFoundHandler = /* @__PURE__ */ __name((c) => { return c.text("404 Not Found", 404); }, "notFoundHandler"); var errorHandler = /* @__PURE__ */ __name((err, c) => { if ("getResponse" in err) { const res = err.getResponse(); return c.newResponse(res.body, res); } console.error(err); return c.text("Internal Server Error", 500); }, "errorHandler"); var Hono = class _Hono { static { __name(this, "_Hono"); } get; post; put; delete; options; patch; all; on; use; /* This class is like an abstract class and does not have a router. To use it, inherit the class and implement router in the constructor. */ router; getPath; // Cannot use `#` because it requires visibility at JavaScript runtime. _basePath = "/"; #path = "/"; routes = []; constructor(options = {}) { const allMethods = [...METHODS, METHOD_NAME_ALL_LOWERCASE]; allMethods.forEach((method) => { this[method] = (args1, ...args) => { if (typeof args1 === "string") { this.#path = args1; } else { this.#addRoute(method, this.#path, args1); } args.forEach((handler) => { this.#addRoute(method, this.#path, handler); }); return this; }; }); this.on = (method, path, ...handlers) => { for (const p of [path].flat()) { this.#path = p; for (const m of [method].flat()) { handlers.map((handler) => { this.#addRoute(m.toUpperCase(), this.#path, handler); }); } } return this; }; this.use = (arg1, ...handlers) => { if (typeof arg1 === "string") { this.#path = arg1; } else { this.#path = "*"; handlers.unshift(arg1); } handlers.forEach((handler) => { this.#addRoute(METHOD_NAME_ALL, this.#path, handler); }); return this; }; const { strict, ...optionsWithoutStrict } = options; Object.assign(this, optionsWithoutStrict); this.getPath = strict ?? true ? options.getPath ?? getPath : getPathNoStrict; } #clone() { const clone = new _Hono({ router: this.router, getPath: this.getPath }); clone.errorHandler = this.errorHandler; clone.#notFoundHandler = this.#notFoundHandler; clone.routes = this.routes; return clone; } #notFoundHandler = notFoundHandler; // Cannot use `#` because it requires visibility at JavaScript runtime. errorHandler = errorHandler; /** * `.route()` allows grouping other Hono instance in routes. * * @see {@link https://hono.dev/docs/api/routing#grouping} * * @param {string} path - base Path * @param {Hono} app - other Hono instance * @returns {Hono} routed Hono instance * * @example * ```ts * const app = new Hono() * const app2 = new Hono() * * app2.get("/user", (c) => c.text("user")) * app.route("/api", app2) // GET /api/user * ``` */ route(path, app8) { const subApp = this.basePath(path); app8.routes.map((r) => { let handler; if (app8.errorHandler === errorHandler) { handler = r.handler; } else { handler = /* @__PURE__ */ __name(async (c, next) => (await compose([], app8.errorHandler)(c, () => r.handler(c, next))).res, "handler"); handler[COMPOSED_HANDLER] = r.handler; } subApp.#addRoute(r.method, r.path, handler); }); return this; } /** * `.basePath()` allows base paths to be specified. * * @see {@link https://hono.dev/docs/api/routing#base-path} * * @param {string} path - base Path * @returns {Hono} changed Hono instance * * @example * ```ts * const api = new Hono().basePath('/api') * ``` */ basePath(path) { const subApp = this.#clone(); subApp._basePath = mergePath(this._basePath, path); return subApp; } /** * `.onError()` handles an error and returns a customized Response. * * @see {@link https://hono.dev/docs/api/hono#error-handling} * * @param {ErrorHandler} handler - request Handler for error * @returns {Hono} changed Hono instance * * @example * ```ts * app.onError((err, c) => { * console.error(`${err}`) * return c.text('Custom Error Message', 500) * }) * ``` */ onError = /* @__PURE__ */ __name((handler) => { this.errorHandler = handler; return this; }, "onError"); /** * `.notFound()` allows you to customize a Not Found Response. * * @see {@link https://hono.dev/docs/api/hono#not-found} * * @param {NotFoundHandler} handler - request handler for not-found * @returns {Hono} changed Hono instance * * @example * ```ts * app.notFound((c) => { * return c.text('Custom 404 Message', 404) * }) * ``` */ notFound = /* @__PURE__ */ __name((handler) => { this.#notFoundHandler = handler; return this; }, "notFound"); /** * `.mount()` allows you to mount applications built with other frameworks into your Hono application. * * @see {@link https://hono.dev/docs/api/hono#mount} * * @param {string} path - base Path * @param {Function} applicationHandler - other Request Handler * @param {MountOptions} [options] - options of `.mount()` * @returns {Hono} mounted Hono instance * * @example * ```ts * import { Router as IttyRouter } from 'itty-router' * import { Hono } from 'hono' * // Create itty-router application * const ittyRouter = IttyRouter() * // GET /itty-router/hello * ittyRouter.get('/hello', () => new Response('Hello from itty-router')) * * const app = new Hono() * app.mount('/itty-router', ittyRouter.handle) * ``` * * @example * ```ts * const app = new Hono() * // Send the request to another application without modification. * app.mount('/app', anotherApp, { * replaceRequest: (req) => req, * }) * ``` */ mount(path, applicationHandler, options) { let replaceRequest; let optionHandler; if (options) { if (typeof options === "function") { optionHandler = options; } else { optionHandler = options.optionHandler; if (options.replaceRequest === false) { replaceRequest = /* @__PURE__ */ __name((request) => request, "replaceRequest"); } else { replaceRequest = options.replaceRequest; } } } const getOptions = optionHandler ? (c) => { const options2 = optionHandler(c); return Array.isArray(options2) ? options2 : [options2]; } : (c) => { let executionContext = void 0; try { executionContext = c.executionCtx; } catch { } return [c.env, executionContext]; }; replaceRequest ||= (() => { const mergedPath = mergePath(this._basePath, path); const pathPrefixLength = mergedPath === "/" ? 0 : mergedPath.length; return (request) => { const url = new URL(request.url); url.pathname = url.pathname.slice(pathPrefixLength) || "/"; return new Request(url, request); }; })(); const handler = /* @__PURE__ */ __name(async (c, next) => { const res = await applicationHandler(replaceRequest(c.req.raw), ...getOptions(c)); if (res) { return res; } await next(); }, "handler"); this.#addRoute(METHOD_NAME_ALL, mergePath(path, "*"), handler); return this; } #addRoute(method, path, handler) { method = method.toUpperCase(); path = mergePath(this._basePath, path); const r = { basePath: this._basePath, path, method, handler }; this.router.add(method, path, [handler, r]); this.routes.push(r); } #handleError(err, c) { if (err instanceof Error) { return this.errorHandler(err, c); } throw err; } #dispatch(request, executionCtx, env2, method) { if (method === "HEAD") { return (async () => new Response(null, await this.#dispatch(request, executionCtx, env2, "GET")))(); } const path = this.getPath(request, { env: env2 }); const matchResult = this.router.match(method, path); const c = new Context(request, { path, matchResult, env: env2, executionCtx, notFoundHandler: this.#notFoundHandler }); if (matchResult[0].length === 1) { let res; try { res = matchResult[0][0][0][0](c, async () => { c.res = await this.#notFoundHandler(c); }); } catch (err) { return this.#handleError(err, c); } return res instanceof Promise ? res.then( (resolved) => resolved || (c.finalized ? c.res : this.#notFoundHandler(c)) ).catch((err) => this.#handleError(err, c)) : res ?? this.#notFoundHandler(c); } const composed = compose(matchResult[0], this.errorHandler, this.#notFoundHandler); return (async () => { try { const context2 = await composed(c); if (!context2.finalized) { throw new Error( "Context is not finalized. Did you forget to return a Response object or `await next()`?" ); } return context2.res; } catch (err) { return this.#handleError(err, c); } })(); } /** * `.fetch()` will be entry point of your app. * * @see {@link https://hono.dev/docs/api/hono#fetch} * * @param {Request} request - request Object of request * @param {Env} Env - env Object * @param {ExecutionContext} - context of execution * @returns {Response | Promise} response of request * */ fetch = /* @__PURE__ */ __name((request, ...rest) => { return this.#dispatch(request, rest[1], rest[0], request.method); }, "fetch"); /** * `.request()` is a useful method for testing. * You can pass a URL or pathname to send a GET request. * app will return a Response object. * ```ts * test('GET /hello is ok', async () => { * const res = await app.request('/hello') * expect(res.status).toBe(200) * }) * ``` * @see https://hono.dev/docs/api/hono#request */ request = /* @__PURE__ */ __name((input, requestInit, Env, executionCtx) => { if (input instanceof Request) { return this.fetch(requestInit ? new Request(input, requestInit) : input, Env, executionCtx); } input = input.toString(); return this.fetch( new Request( /^https?:\/\//.test(input) ? input : `http://localhost${mergePath("/", input)}`, requestInit ), Env, executionCtx ); }, "request"); /** * `.fire()` automatically adds a global fetch event listener. * This can be useful for environments that adhere to the Service Worker API, such as non-ES module Cloudflare Workers. * @deprecated * Use `fire` from `hono/service-worker` instead. * ```ts * import { Hono } from 'hono' * import { fire } from 'hono/service-worker' * * const app = new Hono() * // ... * fire(app) * ``` * @see https://hono.dev/docs/api/hono#fire * @see https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API * @see https://developers.cloudflare.com/workers/reference/migrate-to-module-workers/ */ fire = /* @__PURE__ */ __name(() => { addEventListener("fetch", (event) => { event.respondWith(this.#dispatch(event.request, event, void 0, event.request.method)); }); }, "fire"); }; // node_modules/.pnpm/hono@4.12.12/node_modules/hono/dist/router/reg-exp-router/matcher.js var emptyParam = []; function match(method, path) { const matchers = this.buildAllMatchers(); const match2 = /* @__PURE__ */ __name(((method2, path2) => { const matcher = matchers[method2] || matchers[METHOD_NAME_ALL]; const staticMatch = matcher[2][path2]; if (staticMatch) { return staticMatch; } const match3 = path2.match(matcher[0]); if (!match3) { return [[], emptyParam]; } const index = match3.indexOf("", 1); return [matcher[1][index], match3]; }), "match2"); this.match = match2; return match2(method, path); } __name(match, "match"); // node_modules/.pnpm/hono@4.12.12/node_modules/hono/dist/router/reg-exp-router/node.js var LABEL_REG_EXP_STR = "[^/]+"; var ONLY_WILDCARD_REG_EXP_STR = ".*"; var TAIL_WILDCARD_REG_EXP_STR = "(?:|/.*)"; var PATH_ERROR = /* @__PURE__ */ Symbol(); var regExpMetaChars = new Set(".\\+*[^]$()"); function compareKey(a, b) { if (a.length === 1) { return b.length === 1 ? a < b ? -1 : 1 : -1; } if (b.length === 1) { return 1; } if (a === ONLY_WILDCARD_REG_EXP_STR || a === TAIL_WILDCARD_REG_EXP_STR) { return 1; } else if (b === ONLY_WILDCARD_REG_EXP_STR || b === TAIL_WILDCARD_REG_EXP_STR) { return -1; } if (a === LABEL_REG_EXP_STR) { return 1; } else if (b === LABEL_REG_EXP_STR) { return -1; } return a.length === b.length ? a < b ? -1 : 1 : b.length - a.length; } __name(compareKey, "compareKey"); var Node = class _Node { static { __name(this, "_Node"); } #index; #varIndex; #children = /* @__PURE__ */ Object.create(null); insert(tokens, index, paramMap, context2, pathErrorCheckOnly) { if (tokens.length === 0) { if (this.#index !== void 0) { throw PATH_ERROR; } if (pathErrorCheckOnly) { return; } this.#index = index; return; } const [token, ...restTokens] = tokens; const pattern = token === "*" ? restTokens.length === 0 ? ["", "", ONLY_WILDCARD_REG_EXP_STR] : ["", "", LABEL_REG_EXP_STR] : token === "/*" ? ["", "", TAIL_WILDCARD_REG_EXP_STR] : token.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/); let node; if (pattern) { const name = pattern[1]; let regexpStr = pattern[2] || LABEL_REG_EXP_STR; if (name && pattern[2]) { if (regexpStr === ".*") { throw PATH_ERROR; } regexpStr = regexpStr.replace(/^\((?!\?:)(?=[^)]+\)$)/, "(?:"); if (/\((?!\?:)/.test(regexpStr)) { throw PATH_ERROR; } } node = this.#children[regexpStr]; if (!node) { if (Object.keys(this.#children).some( (k) => k !== ONLY_WILDCARD_REG_EXP_STR && k !== TAIL_WILDCARD_REG_EXP_STR )) { throw PATH_ERROR; } if (pathErrorCheckOnly) { return; } node = this.#children[regexpStr] = new _Node(); if (name !== "") { node.#varIndex = context2.varIndex++; } } if (!pathErrorCheckOnly && name !== "") { paramMap.push([name, node.#varIndex]); } } else { node = this.#children[token]; if (!node) { if (Object.keys(this.#children).some( (k) => k.length > 1 && k !== ONLY_WILDCARD_REG_EXP_STR && k !== TAIL_WILDCARD_REG_EXP_STR )) { throw PATH_ERROR; } if (pathErrorCheckOnly) { return; } node = this.#children[token] = new _Node(); } } node.insert(restTokens, index, paramMap, context2, pathErrorCheckOnly); } buildRegExpStr() { const childKeys = Object.keys(this.#children).sort(compareKey); const strList = childKeys.map((k) => { const c = this.#children[k]; return (typeof c.#varIndex === "number" ? `(${k})@${c.#varIndex}` : regExpMetaChars.has(k) ? `\\${k}` : k) + c.buildRegExpStr(); }); if (typeof this.#index === "number") { strList.unshift(`#${this.#index}`); } if (strList.length === 0) { return ""; } if (strList.length === 1) { return strList[0]; } return "(?:" + strList.join("|") + ")"; } }; // node_modules/.pnpm/hono@4.12.12/node_modules/hono/dist/router/reg-exp-router/trie.js var Trie = class { static { __name(this, "Trie"); } #context = { varIndex: 0 }; #root = new Node(); insert(path, index, pathErrorCheckOnly) { const paramAssoc = []; const groups = []; for (let i = 0; ; ) { let replaced = false; path = path.replace(/\{[^}]+\}/g, (m) => { const mark = `@\\${i}`; groups[i] = [mark, m]; i++; replaced = true; return mark; }); if (!replaced) { break; } } const tokens = path.match(/(?::[^\/]+)|(?:\/\*$)|./g) || []; for (let i = groups.length - 1; i >= 0; i--) { const [mark] = groups[i]; for (let j = tokens.length - 1; j >= 0; j--) { if (tokens[j].indexOf(mark) !== -1) { tokens[j] = tokens[j].replace(mark, groups[i][1]); break; } } } this.#root.insert(tokens, index, paramAssoc, this.#context, pathErrorCheckOnly); return paramAssoc; } buildRegExp() { let regexp = this.#root.buildRegExpStr(); if (regexp === "") { return [/^$/, [], []]; } let captureIndex = 0; const indexReplacementMap = []; const paramReplacementMap = []; regexp = regexp.replace(/#(\d+)|@(\d+)|\.\*\$/g, (_, handlerIndex, paramIndex) => { if (handlerIndex !== void 0) { indexReplacementMap[++captureIndex] = Number(handlerIndex); return "$()"; } if (paramIndex !== void 0) { paramReplacementMap[Number(paramIndex)] = ++captureIndex; return ""; } return ""; }); return [new RegExp(`^${regexp}`), indexReplacementMap, paramReplacementMap]; } }; // node_modules/.pnpm/hono@4.12.12/node_modules/hono/dist/router/reg-exp-router/router.js var nullMatcher = [/^$/, [], /* @__PURE__ */ Object.create(null)]; var wildcardRegExpCache = /* @__PURE__ */ Object.create(null); function buildWildcardRegExp(path) { return wildcardRegExpCache[path] ??= new RegExp( path === "*" ? "" : `^${path.replace( /\/\*$|([.\\+*[^\]$()])/g, (_, metaChar) => metaChar ? `\\${metaChar}` : "(?:|/.*)" )}$` ); } __name(buildWildcardRegExp, "buildWildcardRegExp"); function clearWildcardRegExpCache() { wildcardRegExpCache = /* @__PURE__ */ Object.create(null); } __name(clearWildcardRegExpCache, "clearWildcardRegExpCache"); function buildMatcherFromPreprocessedRoutes(routes) { const trie = new Trie(); const handlerData = []; if (routes.length === 0) { return nullMatcher; } const routesWithStaticPathFlag = routes.map( (route) => [!/\*|\/:/.test(route[0]), ...route] ).sort( ([isStaticA, pathA], [isStaticB, pathB]) => isStaticA ? 1 : isStaticB ? -1 : pathA.length - pathB.length ); const staticMap = /* @__PURE__ */ Object.create(null); for (let i = 0, j = -1, len = routesWithStaticPathFlag.length; i < len; i++) { const [pathErrorCheckOnly, path, handlers] = routesWithStaticPathFlag[i]; if (pathErrorCheckOnly) { staticMap[path] = [handlers.map(([h]) => [h, /* @__PURE__ */ Object.create(null)]), emptyParam]; } else { j++; } let paramAssoc; try { paramAssoc = trie.insert(path, j, pathErrorCheckOnly); } catch (e) { throw e === PATH_ERROR ? new UnsupportedPathError(path) : e; } if (pathErrorCheckOnly) { continue; } handlerData[j] = handlers.map(([h, paramCount]) => { const paramIndexMap = /* @__PURE__ */ Object.create(null); paramCount -= 1; for (; paramCount >= 0; paramCount--) { const [key, value] = paramAssoc[paramCount]; paramIndexMap[key] = value; } return [h, paramIndexMap]; }); } const [regexp, indexReplacementMap, paramReplacementMap] = trie.buildRegExp(); for (let i = 0, len = handlerData.length; i < len; i++) { for (let j = 0, len2 = handlerData[i].length; j < len2; j++) { const map = handlerData[i][j]?.[1]; if (!map) { continue; } const keys = Object.keys(map); for (let k = 0, len3 = keys.length; k < len3; k++) { map[keys[k]] = paramReplacementMap[map[keys[k]]]; } } } const handlerMap = []; for (const i in indexReplacementMap) { handlerMap[i] = handlerData[indexReplacementMap[i]]; } return [regexp, handlerMap, staticMap]; } __name(buildMatcherFromPreprocessedRoutes, "buildMatcherFromPreprocessedRoutes"); function findMiddleware(middleware, path) { if (!middleware) { return void 0; } for (const k of Object.keys(middleware).sort((a, b) => b.length - a.length)) { if (buildWildcardRegExp(k).test(path)) { return [...middleware[k]]; } } return void 0; } __name(findMiddleware, "findMiddleware"); var RegExpRouter = class { static { __name(this, "RegExpRouter"); } name = "RegExpRouter"; #middleware; #routes; constructor() { this.#middleware = { [METHOD_NAME_ALL]: /* @__PURE__ */ Object.create(null) }; this.#routes = { [METHOD_NAME_ALL]: /* @__PURE__ */ Object.create(null) }; } add(method, path, handler) { const middleware = this.#middleware; const routes = this.#routes; if (!middleware || !routes) { throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT); } if (!middleware[method]) { ; [middleware, routes].forEach((handlerMap) => { handlerMap[method] = /* @__PURE__ */ Object.create(null); Object.keys(handlerMap[METHOD_NAME_ALL]).forEach((p) => { handlerMap[method][p] = [...handlerMap[METHOD_NAME_ALL][p]]; }); }); } if (path === "/*") { path = "*"; } const paramCount = (path.match(/\/:/g) || []).length; if (/\*$/.test(path)) { const re = buildWildcardRegExp(path); if (method === METHOD_NAME_ALL) { Object.keys(middleware).forEach((m) => { middleware[m][path] ||= findMiddleware(middleware[m], path) || findMiddleware(middleware[METHOD_NAME_ALL], path) || []; }); } else { middleware[method][path] ||= findMiddleware(middleware[method], path) || findMiddleware(middleware[METHOD_NAME_ALL], path) || []; } Object.keys(middleware).forEach((m) => { if (method === METHOD_NAME_ALL || method === m) { Object.keys(middleware[m]).forEach((p) => { re.test(p) && middleware[m][p].push([handler, paramCount]); }); } }); Object.keys(routes).forEach((m) => { if (method === METHOD_NAME_ALL || method === m) { Object.keys(routes[m]).forEach( (p) => re.test(p) && routes[m][p].push([handler, paramCount]) ); } }); return; } const paths = checkOptionalParameter(path) || [path]; for (let i = 0, len = paths.length; i < len; i++) { const path2 = paths[i]; Object.keys(routes).forEach((m) => { if (method === METHOD_NAME_ALL || method === m) { routes[m][path2] ||= [ ...findMiddleware(middleware[m], path2) || findMiddleware(middleware[METHOD_NAME_ALL], path2) || [] ]; routes[m][path2].push([handler, paramCount - len + i + 1]); } }); } } match = match; buildAllMatchers() { const matchers = /* @__PURE__ */ Object.create(null); Object.keys(this.#routes).concat(Object.keys(this.#middleware)).forEach((method) => { matchers[method] ||= this.#buildMatcher(method); }); this.#middleware = this.#routes = void 0; clearWildcardRegExpCache(); return matchers; } #buildMatcher(method) { const routes = []; let hasOwnRoute = method === METHOD_NAME_ALL; [this.#middleware, this.#routes].forEach((r) => { const ownRoute = r[method] ? Object.keys(r[method]).map((path) => [path, r[method][path]]) : []; if (ownRoute.length !== 0) { hasOwnRoute ||= true; routes.push(...ownRoute); } else if (method !== METHOD_NAME_ALL) { routes.push( ...Object.keys(r[METHOD_NAME_ALL]).map((path) => [path, r[METHOD_NAME_ALL][path]]) ); } }); if (!hasOwnRoute) { return null; } else { return buildMatcherFromPreprocessedRoutes(routes); } } }; // node_modules/.pnpm/hono@4.12.12/node_modules/hono/dist/router/smart-router/router.js var SmartRouter = class { static { __name(this, "SmartRouter"); } name = "SmartRouter"; #routers = []; #routes = []; constructor(init) { this.#routers = init.routers; } add(method, path, handler) { if (!this.#routes) { throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT); } this.#routes.push([method, path, handler]); } match(method, path) { if (!this.#routes) { throw new Error("Fatal error"); } const routers = this.#routers; const routes = this.#routes; const len = routers.length; let i = 0; let res; for (; i < len; i++) { const router = routers[i]; try { for (let i2 = 0, len2 = routes.length; i2 < len2; i2++) { router.add(...routes[i2]); } res = router.match(method, path); } catch (e) { if (e instanceof UnsupportedPathError) { continue; } throw e; } this.match = router.match.bind(router); this.#routers = [router]; this.#routes = void 0; break; } if (i === len) { throw new Error("Fatal error"); } this.name = `SmartRouter + ${this.activeRouter.name}`; return res; } get activeRouter() { if (this.#routes || this.#routers.length !== 1) { throw new Error("No active router has been determined yet."); } return this.#routers[0]; } }; // node_modules/.pnpm/hono@4.12.12/node_modules/hono/dist/router/trie-router/node.js var emptyParams = /* @__PURE__ */ Object.create(null); var hasChildren = /* @__PURE__ */ __name((children) => { for (const _ in children) { return true; } return false; }, "hasChildren"); var Node2 = class _Node2 { static { __name(this, "_Node"); } #methods; #children; #patterns; #order = 0; #params = emptyParams; constructor(method, handler, children) { this.#children = children || /* @__PURE__ */ Object.create(null); this.#methods = []; if (method && handler) { const m = /* @__PURE__ */ Object.create(null); m[method] = { handler, possibleKeys: [], score: 0 }; this.#methods = [m]; } this.#patterns = []; } insert(method, path, handler) { this.#order = ++this.#order; let curNode = this; const parts = splitRoutingPath(path); const possibleKeys = []; for (let i = 0, len = parts.length; i < len; i++) { const p = parts[i]; const nextP = parts[i + 1]; const pattern = getPattern(p, nextP); const key = Array.isArray(pattern) ? pattern[0] : p; if (key in curNode.#children) { curNode = curNode.#children[key]; if (pattern) { possibleKeys.push(pattern[1]); } continue; } curNode.#children[key] = new _Node2(); if (pattern) { curNode.#patterns.push(pattern); possibleKeys.push(pattern[1]); } curNode = curNode.#children[key]; } curNode.#methods.push({ [method]: { handler, possibleKeys: possibleKeys.filter((v, i, a) => a.indexOf(v) === i), score: this.#order } }); return curNode; } #pushHandlerSets(handlerSets, node, method, nodeParams, params) { for (let i = 0, len = node.#methods.length; i < len; i++) { const m = node.#methods[i]; const handlerSet = m[method] || m[METHOD_NAME_ALL]; const processedSet = {}; if (handlerSet !== void 0) { handlerSet.params = /* @__PURE__ */ Object.create(null); handlerSets.push(handlerSet); if (nodeParams !== emptyParams || params && params !== emptyParams) { for (let i2 = 0, len2 = handlerSet.possibleKeys.length; i2 < len2; i2++) { const key = handlerSet.possibleKeys[i2]; const processed = processedSet[handlerSet.score]; handlerSet.params[key] = params?.[key] && !processed ? params[key] : nodeParams[key] ?? params?.[key]; processedSet[handlerSet.score] = true; } } } } } search(method, path) { const handlerSets = []; this.#params = emptyParams; const curNode = this; let curNodes = [curNode]; const parts = splitPath(path); const curNodesQueue = []; const len = parts.length; let partOffsets = null; for (let i = 0; i < len; i++) { const part = parts[i]; const isLast = i === len - 1; const tempNodes = []; for (let j = 0, len2 = curNodes.length; j < len2; j++) { const node = curNodes[j]; const nextNode = node.#children[part]; if (nextNode) { nextNode.#params = node.#params; if (isLast) { if (nextNode.#children["*"]) { this.#pushHandlerSets(handlerSets, nextNode.#children["*"], method, node.#params); } this.#pushHandlerSets(handlerSets, nextNode, method, node.#params); } else { tempNodes.push(nextNode); } } for (let k = 0, len3 = node.#patterns.length; k < len3; k++) { const pattern = node.#patterns[k]; const params = node.#params === emptyParams ? {} : { ...node.#params }; if (pattern === "*") { const astNode = node.#children["*"]; if (astNode) { this.#pushHandlerSets(handlerSets, astNode, method, node.#params); astNode.#params = params; tempNodes.push(astNode); } continue; } const [key, name, matcher] = pattern; if (!part && !(matcher instanceof RegExp)) { continue; } const child = node.#children[key]; if (matcher instanceof RegExp) { if (partOffsets === null) { partOffsets = new Array(len); let offset = path[0] === "/" ? 1 : 0; for (let p = 0; p < len; p++) { partOffsets[p] = offset; offset += parts[p].length + 1; } } const restPathString = path.substring(partOffsets[i]); const m = matcher.exec(restPathString); if (m) { params[name] = m[0]; this.#pushHandlerSets(handlerSets, child, method, node.#params, params); if (hasChildren(child.#children)) { child.#params = params; const componentCount = m[0].match(/\//)?.length ?? 0; const targetCurNodes = curNodesQueue[componentCount] ||= []; targetCurNodes.push(child); } continue; } } if (matcher === true || matcher.test(part)) { params[name] = part; if (isLast) { this.#pushHandlerSets(handlerSets, child, method, params, node.#params); if (child.#children["*"]) { this.#pushHandlerSets( handlerSets, child.#children["*"], method, params, node.#params ); } } else { child.#params = params; tempNodes.push(child); } } } } const shifted = curNodesQueue.shift(); curNodes = shifted ? tempNodes.concat(shifted) : tempNodes; } if (handlerSets.length > 1) { handlerSets.sort((a, b) => { return a.score - b.score; }); } return [handlerSets.map(({ handler, params }) => [handler, params])]; } }; // node_modules/.pnpm/hono@4.12.12/node_modules/hono/dist/router/trie-router/router.js var TrieRouter = class { static { __name(this, "TrieRouter"); } name = "TrieRouter"; #node; constructor() { this.#node = new Node2(); } add(method, path, handler) { const results = checkOptionalParameter(path); if (results) { for (let i = 0, len = results.length; i < len; i++) { this.#node.insert(method, results[i], handler); } return; } this.#node.insert(method, path, handler); } match(method, path) { return this.#node.search(method, path); } }; // node_modules/.pnpm/hono@4.12.12/node_modules/hono/dist/hono.js var Hono2 = class extends Hono { static { __name(this, "Hono"); } /** * Creates an instance of the Hono class. * * @param options - Optional configuration options for the Hono instance. */ constructor(options = {}) { super(options); this.router = options.router ?? new SmartRouter({ routers: [new RegExpRouter(), new TrieRouter()] }); } }; // node_modules/.pnpm/hono@4.12.12/node_modules/hono/dist/middleware/cors/index.js var cors = /* @__PURE__ */ __name((options) => { const defaults = { origin: "*", allowMethods: ["GET", "HEAD", "PUT", "POST", "DELETE", "PATCH"], allowHeaders: [], exposeHeaders: [] }; const opts = { ...defaults, ...options }; const findAllowOrigin = ((optsOrigin) => { if (typeof optsOrigin === "string") { if (optsOrigin === "*") { if (opts.credentials) { return (origin) => origin || null; } return () => optsOrigin; } else { return (origin) => optsOrigin === origin ? origin : null; } } else if (typeof optsOrigin === "function") { return optsOrigin; } else { return (origin) => optsOrigin.includes(origin) ? origin : null; } })(opts.origin); const findAllowMethods = ((optsAllowMethods) => { if (typeof optsAllowMethods === "function") { return optsAllowMethods; } else if (Array.isArray(optsAllowMethods)) { return () => optsAllowMethods; } else { return () => []; } })(opts.allowMethods); return /* @__PURE__ */ __name(async function cors2(c, next) { function set(key, value) { c.res.headers.set(key, value); } __name(set, "set"); const allowOrigin = await findAllowOrigin(c.req.header("origin") || "", c); if (allowOrigin) { set("Access-Control-Allow-Origin", allowOrigin); } if (opts.credentials) { set("Access-Control-Allow-Credentials", "true"); } if (opts.exposeHeaders?.length) { set("Access-Control-Expose-Headers", opts.exposeHeaders.join(",")); } if (c.req.method === "OPTIONS") { if (opts.origin !== "*" || opts.credentials) { set("Vary", "Origin"); } if (opts.maxAge != null) { set("Access-Control-Max-Age", opts.maxAge.toString()); } const allowMethods = await findAllowMethods(c.req.header("origin") || "", c); if (allowMethods.length) { set("Access-Control-Allow-Methods", allowMethods.join(",")); } let headers = opts.allowHeaders; if (!headers?.length) { const requestHeaders = c.req.header("Access-Control-Request-Headers"); if (requestHeaders) { headers = requestHeaders.split(/\s*,\s*/); } } if (headers?.length) { set("Access-Control-Allow-Headers", headers.join(",")); c.res.headers.append("Vary", "Access-Control-Request-Headers"); } c.res.headers.delete("Content-Length"); c.res.headers.delete("Content-Type"); return new Response(null, { headers: c.res.headers, status: 204, statusText: "No Content" }); } await next(); if (opts.origin !== "*" || opts.credentials) { c.header("Vary", "Origin", { append: true }); } }, "cors2"); }, "cors"); // src/actions/getGuide.ts function getGuide() { return `# u6u Component Authoring Guide ## \u6982\u89BD u6u \u96F6\u4EF6\u662F\u4EE5 WASI preview1 \u683C\u5F0F\u7DE8\u8B6F\u7684 WebAssembly \u6A21\u7D44\uFF0C\u552F\u4E00\u5408\u6CD5\u7684 I/O \u6A21\u578B\u662F **stdin/stdout JSON**\u3002 --- ## TinyGo \u767D\u540D\u55AE {#tinygo-whitelist} \u7B2C\u4E00\u6CE2\u5167\u90E8\u96F6\u4EF6\u4F7F\u7528 TinyGo \u958B\u767C\u3002**\u53EA\u5141\u8A31**\u4EE5\u4E0B import\uFF1A \`\`\`go import ( "os" // \u53EA\u7528 os.Stdin / os.Stdout / os.Stderr "io" // io.ReadAll(os.Stdin) "encoding/json" // json.Unmarshal / json.Marshal ) \`\`\` ### \u5141\u8A31\u7684\u64CD\u4F5C - \`io.ReadAll(os.Stdin)\` \u8B80\u53D6 input JSON - \`json.Unmarshal\` \u89E3\u6790 input - \`json.Marshal\` + \`os.Stdout.Write\` \u8F38\u51FA output JSON - \u57FA\u672C\u578B\u5225\u64CD\u4F5C\uFF08string\u3001int64\u3001float64\u3001bool\u3001[]byte\u3001map[string]interface{}\uFF09 - \u932F\u8AA4\u7528 stdout \u8F38\u51FA\uFF1A\`{"error": "\u8AAA\u660E"}\`\uFF0C\u4E0D\u8981 panic --- ## \u7981\u6B62\u884C\u70BA {#forbidden-behaviors} \u4EE5\u4E0B\u884C\u70BA\u6703\u5C0E\u81F4\u6C99\u76D2\u9A57\u6536\u5931\u6557\uFF1A - **\u7DB2\u8DEF syscall**\uFF1A\`net/*\`\u3001\`sock_connect\`\u3001\`sock_accept\` \u7B49 - **\u6A94\u6848\u7CFB\u7D71 syscall**\uFF1A\`os.Open\`\u3001\`os.Create\`\u3001\`path_open\` \u7B49 - **goroutine / channel**\uFF1AWASM \u74B0\u5883\u4E0D\u652F\u63F4 - **syscall.*\`**\uFF1A\u4EFB\u4F55\u76F4\u63A5 syscall - **\u7B2C\u4E09\u65B9 module**\uFF1A\u53EA\u7528\u6A19\u6E96\u5EAB - **\u6253\u5305 runtime**\uFF1A\u4E0D\u5F97\u6253\u5305 QuickJS\u3001Node.js \u7B49 - **\u8D85\u904E 2MB**\uFF1A\u9AD4\u7A4D\u4E0A\u9650 2048KB - **\u6DF7\u5408\u524D\u5F8C\u7AEF\u908F\u8F2F**\uFF1A\u4E00\u500B\u96F6\u4EF6\u53EA\u505A\u4E00\u4EF6\u4E8B --- ## I/O \u6A21\u578B {#io-model} \u552F\u4E00\u5408\u6CD5\u7684 I/O \u6A21\u578B\uFF1A\`stdin_stdout_json\` \`\`\` stdin \u2192 JSON.stringify(input) \u2192 \u96F6\u4EF6\u8B80\u53D6 stdout \u2190 JSON.stringify(output) \u2190 \u96F6\u4EF6\u8F38\u51FA \`\`\` --- ## TinyGo \u6700\u5C0F\u53EF\u904B\u884C\u7BC4\u4F8B {#tinygo-example} \`\`\`go package main import ( "encoding/json" "io" "os" ) type Input struct { JsonString string \`json:"json_string"\` } type Output struct { Valid bool \`json:"valid"\` Error string \`json:"error,omitempty"\` } func main() { data, err := io.ReadAll(os.Stdin) if err != nil { writeError("\u8B80\u53D6 stdin \u5931\u6557: " + err.Error()) return } var input Input if err := json.Unmarshal(data, &input); err != nil { writeError("\u89E3\u6790 input JSON \u5931\u6557: " + err.Error()) return } var result interface{} valid := json.Unmarshal([]byte(input.JsonString), &result) == nil out := Output{Valid: valid} if !valid { out.Error = "\u4E0D\u5408\u6CD5\u7684 JSON \u683C\u5F0F" } outBytes, _ := json.Marshal(out) os.Stdout.Write(outBytes) } func writeError(msg string) { out, _ := json.Marshal(map[string]string{"error": msg}) os.Stdout.Write(out) } \`\`\` --- ## component.contract.yaml \u5B8C\u6574\u7BC4\u4F8B {#contract-example} \`\`\`yaml canonical_id: "validate_json" display_name: "JSON \u683C\u5F0F\u9A57\u8B49\u5668" category: "logic" version: "v1" wasi_target: "preview1" stability: "floating" runtime_compat: - "cf-workers" - "workerd" - "wazero" constraints: max_size_kb: 2048 max_cold_start_ms: 50 no_network_syscall: true io_model: "stdin_stdout_json" input_schema: type: object required: ["json_string"] properties: json_string: type: string description: "\u5F85\u9A57\u8B49\u7684 JSON \u5B57\u4E32" output_schema: type: object properties: valid: type: boolean error: type: string gherkin_tests: - scenario: "\u5408\u6CD5 JSON \u901A\u904E\u9A57\u8B49" given: '{"json_string":"{\\"key\\":\\"value\\"}"}' then_contains: '{"valid":true}' - scenario: "\u975E\u6CD5 JSON \u56DE\u50B3\u932F\u8AA4" given: '{"json_string":"not-json"}' then_contains: '{"valid":false,"error":' tags: ["validation", "json", "utility"] description: "\u9A57\u8B49\u8F38\u5165\u5B57\u4E32\u662F\u5426\u70BA\u5408\u6CD5 JSON \u683C\u5F0F" \`\`\` --- ## \u672C\u5730\u6E2C\u8A66\u6307\u4EE4 {#local-testing} \u4F7F\u7528 \`wasmtime\` \u5728\u672C\u5730\u6E2C\u8A66\u96F6\u4EF6\uFF1A \`\`\`bash # \u7DE8\u8B6F\uFF08TinyGo\uFF09 tinygo build -o validate_json.wasm -target wasi ./main.go # \u6E2C\u8A66 happy path echo '{"json_string":"{}"}' | wasmtime validate_json.wasm # \u9810\u671F\u8F38\u51FA\uFF1A{"valid":true} # \u6E2C\u8A66 error path echo '{"json_string":"not-json"}' | wasmtime validate_json.wasm # \u9810\u671F\u8F38\u51FA\uFF1A{"valid":false,"error":"..."} \`\`\` --- ## syscall \u9650\u5236 {#syscall-constraints} \u6C99\u76D2\u9A57\u6536\u6703\u6383\u63CF .wasm binary \u4E2D\u7684 import\uFF0C\u4EE5\u4E0B syscall \u4E00\u5F8B\u62D2\u7D55\uFF1A - \`sock_connect\`\u3001\`sock_accept\`\u3001\`sock_recv\`\u3001\`sock_send\`\u3001\`sock_shutdown\` - \`fd_open\`\u3001\`path_open\`\u3001\`path_create_directory\`\u3001\`path_remove_directory\` - \`path_rename\`\u3001\`path_unlink_file\`\u3001\`path_filestat_get\` --- ## \u5E38\u898B\u932F\u8AA4\u8207\u89E3\u6CD5 {#common-errors} | \u932F\u8AA4 | \u539F\u56E0 | \u89E3\u6CD5 | |---|---|---| | \`size_check \u5931\u6557\` | .wasm \u8D85\u904E 2048KB | \u79FB\u9664\u4E0D\u5FC5\u8981\u7684\u4F9D\u8CF4\uFF0C\u4F7F\u7528 TinyGo \u800C\u975E Go | | \`syscall_scan \u5931\u6557\` | \u542B\u6709\u7DB2\u8DEF/\u6A94\u6848 syscall | \u79FB\u9664 \`net/*\`\u3001\`os.Open\` \u7B49 import | | \`gherkin_tests \u5931\u6557\` | \u8F38\u51FA\u4E0D\u7B26\u5408\u9810\u671F | \u78BA\u8A8D stdout \u8F38\u51FA\u70BA\u5408\u6CD5 JSON | | \`contract \u9A57\u8B49\u5931\u6557\` | \u7F3A\u5C11\u5FC5\u586B\u6B04\u4F4D | \u53C3\u8003\u4E0A\u65B9 contract \u7BC4\u4F8B\u88DC\u9F4A\u6B04\u4F4D | --- ## contract.yaml JSON Schema {#contract-schema} \`\`\`json { "type": "object", "required": ["canonical_id", "display_name", "category", "version", "wasi_target", "stability", "runtime_compat", "constraints", "input_schema", "output_schema", "gherkin_tests"], "properties": { "canonical_id": { "type": "string", "pattern": "^[a-z][a-z0-9_]*$" }, "display_name": { "type": "string" }, "category": { "type": "string", "enum": ["logic", "api", "ui", "style", "anim"] }, "version": { "type": "string", "pattern": "^v\\\\d+$" }, "wasi_target": { "type": "string", "enum": ["preview1"] }, "stability": { "type": "string", "enum": ["floating", "stable", "pinned"] }, "runtime_compat": { "type": "array", "items": { "type": "string", "enum": ["cf-workers", "workerd", "wazero"] }, "minItems": 1 }, "constraints": { "type": "object", "required": ["max_size_kb", "max_cold_start_ms", "no_network_syscall", "io_model"], "properties": { "max_size_kb": { "type": "number", "maximum": 2048 }, "max_cold_start_ms": { "type": "number", "maximum": 50 }, "no_network_syscall": { "type": "boolean" }, "io_model": { "type": "string", "enum": ["stdin_stdout_json"] } } }, "input_schema": { "type": "object" }, "output_schema": { "type": "object" }, "gherkin_tests": { "type": "array", "minItems": 2 } } } \`\`\` `; } __name(getGuide, "getGuide"); // src/routes/guide.ts var app = new Hono2(); app.get("/", (c) => { const markdown = getGuide(); return c.text(markdown, 200, { "Content-Type": "text/markdown; charset=utf-8" }); }); var guide_default = app; // node_modules/.pnpm/zod@3.23.8/node_modules/zod/lib/index.mjs var util; (function(util2) { util2.assertEqual = (val) => val; function assertIs(_arg) { } __name(assertIs, "assertIs"); util2.assertIs = assertIs; function assertNever(_x) { throw new Error(); } __name(assertNever, "assertNever"); 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 void 0; }; 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); } __name(joinValues, "joinValues"); 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 // second overwrites first }; }; })(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 = /* @__PURE__ */ __name((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; } }, "getParsedType"); 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 = /* @__PURE__ */ __name((obj) => { const json = JSON.stringify(obj, null, 2); return json.replace(/"([^"]+)":/g, "$1:"); }, "quotelessJson"); var ZodError = class _ZodError extends Error { static { __name(this, "ZodError"); } 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; } get errors() { return this.issues; } format(_mapper) { const mapper = _mapper || function(issue) { return issue.message; }; const fieldErrors = { _errors: [] }; const processError = /* @__PURE__ */ __name((error3) => { for (const issue of error3.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"); 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 error3 = new ZodError(issues); return error3; }; var errorMap = /* @__PURE__ */ __name((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 }; }, "errorMap"); var overrideErrorMap = errorMap; function setErrorMap(map) { overrideErrorMap = map; } __name(setErrorMap, "setErrorMap"); function getErrorMap() { return overrideErrorMap; } __name(getErrorMap, "getErrorMap"); var makeIssue = /* @__PURE__ */ __name((params) => { const { data, path, errorMaps, issueData } = params; const fullPath = [...path, ...issueData.path || []]; const fullIssue = { ...issueData, path: fullPath }; if (issueData.message !== void 0) { 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 }; }, "makeIssue"); 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 ? void 0 : errorMap // then global default map ].filter((x) => !!x) }); ctx.common.issues.push(issue); } __name(addIssueToContext, "addIssueToContext"); var ParseStatus = class _ParseStatus { static { __name(this, "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 = /* @__PURE__ */ __name((value) => ({ status: "dirty", value }), "DIRTY"); var OK = /* @__PURE__ */ __name((value) => ({ status: "valid", value }), "OK"); var isAborted = /* @__PURE__ */ __name((x) => x.status === "aborted", "isAborted"); var isDirty = /* @__PURE__ */ __name((x) => x.status === "dirty", "isDirty"); var isValid = /* @__PURE__ */ __name((x) => x.status === "valid", "isValid"); var isAsync = /* @__PURE__ */ __name((x) => typeof Promise !== "undefined" && x instanceof Promise, "isAsync"); 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); } __name(__classPrivateFieldGet, "__classPrivateFieldGet"); 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; } __name(__classPrivateFieldSet, "__classPrivateFieldSet"); var errorUtil; (function(errorUtil2) { errorUtil2.errToObj = (message) => typeof message === "string" ? { message } : message || {}; errorUtil2.toString = (message) => typeof message === "string" ? message : message === null || message === void 0 ? void 0 : message.message; })(errorUtil || (errorUtil = {})); var _ZodEnum_cache; var _ZodNativeEnum_cache; var ParseInputLazyPath = class { static { __name(this, "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 = /* @__PURE__ */ __name((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 error3 = new ZodError(ctx.common.issues); this._error = error3; return this._error; } }; } }, "handleResult"); 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 = /* @__PURE__ */ __name((iss, ctx) => { var _a, _b; const { message } = params; if (iss.code === "invalid_enum_value") { return { message: message !== null && message !== void 0 ? message : ctx.defaultError }; } if (typeof ctx.data === "undefined") { return { message: (_a = message !== null && message !== void 0 ? message : required_error) !== null && _a !== void 0 ? _a : ctx.defaultError }; } if (iss.code !== "invalid_type") return { message: ctx.defaultError }; return { message: (_b = message !== null && message !== void 0 ? message : invalid_type_error) !== null && _b !== void 0 ? _b : ctx.defaultError }; }, "customMap"); return { errorMap: customMap, description }; } __name(processCreateParams, "processCreateParams"); var ZodType = class { static { __name(this, "ZodType"); } 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); } get description() { return this._def.description; } _getType(input) { return getParsedType(input.data); } _getOrReturnCtx(input, ctx) { return ctx || { common: input.parent.common, data: input.data, parsedType: getParsedType(input.data), schemaErrorMap: this._def.errorMap, path: input.path, parent: input.parent }; } _processInputParams(input) { return { status: new ParseStatus(), ctx: { common: input.parent.common, data: input.data, parsedType: getParsedType(input.data), schemaErrorMap: this._def.errorMap, path: input.path, parent: input.parent } }; } _parseSync(input) { const result = this._parse(input); if (isAsync(result)) { throw new Error("Synchronous parse encountered promise."); } return result; } _parseAsync(input) { const result = this._parse(input); return Promise.resolve(result); } parse(data, params) { const result = this.safeParse(data, params); if (result.success) return result.data; throw result.error; } safeParse(data, params) { var _a; const ctx = { common: { issues: [], async: (_a = params === null || params === void 0 ? void 0 : params.async) !== null && _a !== void 0 ? _a : false, contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap }, path: (params === null || params === void 0 ? void 0 : params.path) || [], schemaErrorMap: this._def.errorMap, parent: null, data, parsedType: getParsedType(data) }; const result = this._parseSync({ data, path: ctx.path, parent: ctx }); return handleResult(ctx, result); } async parseAsync(data, params) { const result = await this.safeParseAsync(data, params); if (result.success) return result.data; throw result.error; } async safeParseAsync(data, params) { const ctx = { common: { issues: [], contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap, async: true }, path: (params === null || params === void 0 ? void 0 : params.path) || [], schemaErrorMap: this._def.errorMap, parent: null, data, parsedType: getParsedType(data) }; const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx }); const result = await (isAsync(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult)); return handleResult(ctx, result); } refine(check, message) { const getIssueProperties = /* @__PURE__ */ __name((val) => { if (typeof message === "string" || typeof message === "undefined") { return { message }; } else if (typeof message === "function") { return message(val); } else { return message; } }, "getIssueProperties"); return this._refinement((val, ctx) => { const result = check(val); const setError = /* @__PURE__ */ __name(() => ctx.addIssue({ code: ZodIssueCode.custom, ...getIssueProperties(val) }), "setError"); 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); } optional() { return ZodOptional.create(this, this._def); } nullable() { return ZodNullable.create(this, this._def); } nullish() { return this.nullable().optional(); } array() { return ZodArray.create(this, this._def); } promise() { return ZodPromise.create(this, this._def); } or(option) { return ZodUnion.create([this, option], this._def); } and(incoming) { return ZodIntersection.create(this, incoming, this._def); } transform(transform) { return new ZodEffects({ ...processCreateParams(this._def), schema: this, typeName: 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(void 0).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}$/; 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 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 ipv6Regex = /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/; var base64Regex = /^([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; } __name(timeRegexSource, "timeRegexSource"); function timeRegex(args) { return new RegExp(`^${timeRegexSource(args)}$`); } __name(timeRegex, "timeRegex"); 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}$`); } __name(datetimeRegex, "datetimeRegex"); function isValidIP(ip, version2) { if ((version2 === "v4" || !version2) && ipv4Regex.test(ip)) { return true; } if ((version2 === "v6" || !version2) && ipv6Regex.test(ip)) { return true; } return false; } __name(isValidIP, "isValidIP"); var ZodString = class _ZodString extends ZodType { static { __name(this, "ZodString"); } _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 = void 0; for (const check of this._def.checks) { if (check.kind === "min") { if (input.data.length < check.value) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { code: ZodIssueCode.too_small, minimum: check.value, type: "string", inclusive: true, exact: false, message: check.message }); status.dirty(); } } else if (check.kind === "max") { if (input.data.length > check.value) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { code: ZodIssueCode.too_big, maximum: check.value, type: "string", inclusive: true, exact: false, message: check.message }); status.dirty(); } } else if (check.kind === "length") { const tooBig = input.data.length > check.value; const tooSmall = input.data.length < check.value; if (tooBig || tooSmall) { ctx = this._getOrReturnCtx(input, ctx); if (tooBig) { addIssueToContext(ctx, { code: ZodIssueCode.too_big, maximum: check.value, type: "string", inclusive: true, exact: true, message: check.message }); } else if (tooSmall) { addIssueToContext(ctx, { code: ZodIssueCode.too_small, minimum: check.value, type: "string", inclusive: true, exact: true, message: check.message }); } status.dirty(); } } else if (check.kind === "email") { if (!emailRegex.test(input.data)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { validation: "email", code: ZodIssueCode.invalid_string, message: check.message }); status.dirty(); } } else if (check.kind === "emoji") { if (!emojiRegex) { emojiRegex = new RegExp(_emojiRegex, "u"); } if (!emojiRegex.test(input.data)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { validation: "emoji", code: ZodIssueCode.invalid_string, message: check.message }); status.dirty(); } } else if (check.kind === "uuid") { if (!uuidRegex.test(input.data)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { validation: "uuid", code: ZodIssueCode.invalid_string, message: check.message }); status.dirty(); } } else if (check.kind === "nanoid") { if (!nanoidRegex.test(input.data)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { validation: "nanoid", code: ZodIssueCode.invalid_string, message: check.message }); status.dirty(); } } else if (check.kind === "cuid") { if (!cuidRegex.test(input.data)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { validation: "cuid", code: ZodIssueCode.invalid_string, message: check.message }); status.dirty(); } } else if (check.kind === "cuid2") { if (!cuid2Regex.test(input.data)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { validation: "cuid2", code: ZodIssueCode.invalid_string, message: check.message }); status.dirty(); } } else if (check.kind === "ulid") { if (!ulidRegex.test(input.data)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { validation: "ulid", code: ZodIssueCode.invalid_string, message: check.message }); status.dirty(); } } else if (check.kind === "url") { try { new URL(input.data); } catch (_a) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { validation: "url", code: ZodIssueCode.invalid_string, message: check.message }); status.dirty(); } } else if (check.kind === "regex") { check.regex.lastIndex = 0; const testResult = check.regex.test(input.data); if (!testResult) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { validation: "regex", code: ZodIssueCode.invalid_string, message: check.message }); status.dirty(); } } else if (check.kind === "trim") { input.data = input.data.trim(); } else if (check.kind === "includes") { if (!input.data.includes(check.value, check.position)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { code: ZodIssueCode.invalid_string, validation: { includes: check.value, position: check.position }, message: check.message }); status.dirty(); } } else if (check.kind === "toLowerCase") { input.data = input.data.toLowerCase(); } else if (check.kind === "toUpperCase") { input.data = input.data.toUpperCase(); } else if (check.kind === "startsWith") { if (!input.data.startsWith(check.value)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { code: ZodIssueCode.invalid_string, validation: { startsWith: check.value }, message: check.message }); status.dirty(); } } else if (check.kind === "endsWith") { if (!input.data.endsWith(check.value)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { code: ZodIssueCode.invalid_string, validation: { endsWith: check.value }, message: check.message }); status.dirty(); } } else if (check.kind === "datetime") { const regex = datetimeRegex(check); if (!regex.test(input.data)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { code: ZodIssueCode.invalid_string, validation: "datetime", message: check.message }); status.dirty(); } } else if (check.kind === "date") { const regex = dateRegex; if (!regex.test(input.data)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { code: ZodIssueCode.invalid_string, validation: "date", message: check.message }); status.dirty(); } } else if (check.kind === "time") { const regex = timeRegex(check); if (!regex.test(input.data)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { code: ZodIssueCode.invalid_string, validation: "time", message: check.message }); status.dirty(); } } else if (check.kind === "duration") { if (!durationRegex.test(input.data)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { validation: "duration", code: ZodIssueCode.invalid_string, message: check.message }); status.dirty(); } } else if (check.kind === "ip") { if (!isValidIP(input.data, check.version)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { validation: "ip", code: ZodIssueCode.invalid_string, message: check.message }); status.dirty(); } } else if (check.kind === "base64") { if (!base64Regex.test(input.data)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { validation: "base64", code: ZodIssueCode.invalid_string, message: check.message }); status.dirty(); } } else { util.assertNever(check); } } return { status: status.value, value: input.data }; } _regex(regex, validation, message) { return this.refinement((data) => regex.test(data), { validation, code: ZodIssueCode.invalid_string, ...errorUtil.errToObj(message) }); } _addCheck(check) { return new _ZodString({ ...this._def, checks: [...this._def.checks, check] }); } email(message) { return this._addCheck({ kind: "email", ...errorUtil.errToObj(message) }); } url(message) { return this._addCheck({ kind: "url", ...errorUtil.errToObj(message) }); } emoji(message) { return this._addCheck({ kind: "emoji", ...errorUtil.errToObj(message) }); } uuid(message) { return this._addCheck({ kind: "uuid", ...errorUtil.errToObj(message) }); } nanoid(message) { return this._addCheck({ kind: "nanoid", ...errorUtil.errToObj(message) }); } cuid(message) { return this._addCheck({ kind: "cuid", ...errorUtil.errToObj(message) }); } cuid2(message) { return this._addCheck({ kind: "cuid2", ...errorUtil.errToObj(message) }); } ulid(message) { return this._addCheck({ kind: "ulid", ...errorUtil.errToObj(message) }); } base64(message) { return this._addCheck({ kind: "base64", ...errorUtil.errToObj(message) }); } ip(options) { return this._addCheck({ kind: "ip", ...errorUtil.errToObj(options) }); } datetime(options) { var _a, _b; if (typeof options === "string") { return this._addCheck({ kind: "datetime", precision: null, offset: false, local: false, message: options }); } return this._addCheck({ kind: "datetime", precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === "undefined" ? null : options === null || options === void 0 ? void 0 : options.precision, offset: (_a = options === null || options === void 0 ? void 0 : options.offset) !== null && _a !== void 0 ? _a : false, local: (_b = options === null || options === void 0 ? void 0 : options.local) !== null && _b !== void 0 ? _b : false, ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message) }); } date(message) { return this._addCheck({ kind: "date", message }); } time(options) { if (typeof options === "string") { return this._addCheck({ kind: "time", precision: null, message: options }); } return this._addCheck({ kind: "time", precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === "undefined" ? null : options === null || options === void 0 ? void 0 : options.precision, ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message) }); } duration(message) { return this._addCheck({ kind: "duration", ...errorUtil.errToObj(message) }); } regex(regex, message) { return this._addCheck({ kind: "regex", regex, ...errorUtil.errToObj(message) }); } includes(value, options) { return this._addCheck({ kind: "includes", value, position: options === null || options === void 0 ? void 0 : options.position, ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message) }); } startsWith(value, message) { return this._addCheck({ kind: "startsWith", value, ...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) }); } /** * @deprecated Use z.string().min(1) instead. * @see {@link ZodString.min} */ nonempty(message) { return this.min(1, errorUtil.errToObj(message)); } trim() { return new _ZodString({ ...this._def, checks: [...this._def.checks, { kind: "trim" }] }); } toLowerCase() { return new _ZodString({ ...this._def, checks: [...this._def.checks, { kind: "toLowerCase" }] }); } toUpperCase() { return new _ZodString({ ...this._def, checks: [...this._def.checks, { kind: "toUpperCase" }] }); } get isDatetime() { return !!this._def.checks.find((ch) => ch.kind === "datetime"); } get isDate() { return !!this._def.checks.find((ch) => ch.kind === "date"); } get isTime() { return !!this._def.checks.find((ch) => ch.kind === "time"); } get isDuration() { return !!this._def.checks.find((ch) => ch.kind === "duration"); } get isEmail() { return !!this._def.checks.find((ch) => ch.kind === "email"); } get isURL() { return !!this._def.checks.find((ch) => ch.kind === "url"); } get isEmoji() { return !!this._def.checks.find((ch) => ch.kind === "emoji"); } get isUUID() { return !!this._def.checks.find((ch) => ch.kind === "uuid"); } get isNANOID() { return !!this._def.checks.find((ch) => ch.kind === "nanoid"); } get isCUID() { return !!this._def.checks.find((ch) => ch.kind === "cuid"); } get isCUID2() { return !!this._def.checks.find((ch) => ch.kind === "cuid2"); } get isULID() { return !!this._def.checks.find((ch) => ch.kind === "ulid"); } get isIP() { return !!this._def.checks.find((ch) => ch.kind === "ip"); } get isBase64() { return !!this._def.checks.find((ch) => ch.kind === "base64"); } get minLength() { let min = null; for (const ch of this._def.checks) { if (ch.kind === "min") { if (min === null || ch.value > min) min = ch.value; } } return min; } get maxLength() { let max = null; for (const ch of this._def.checks) { if (ch.kind === "max") { if (max === null || ch.value < max) max = ch.value; } } return max; } }; ZodString.create = (params) => { var _a; return new ZodString({ checks: [], typeName: ZodFirstPartyTypeKind.ZodString, coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _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); } __name(floatSafeRemainder, "floatSafeRemainder"); var ZodNumber = class _ZodNumber extends ZodType { static { __name(this, "ZodNumber"); } 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 = void 0; 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 === void 0 ? void 0 : params.coerce) || false, ...processCreateParams(params) }); }; var ZodBigInt = class _ZodBigInt extends ZodType { static { __name(this, "ZodBigInt"); } constructor() { super(...arguments); this.min = this.gte; this.max = this.lte; } _parse(input) { if (this._def.coerce) { input.data = BigInt(input.data); } const parsedType = this._getType(input); if (parsedType !== ZodParsedType.bigint) { const ctx2 = this._getOrReturnCtx(input); addIssueToContext(ctx2, { code: ZodIssueCode.invalid_type, expected: ZodParsedType.bigint, received: ctx2.parsedType }); return INVALID; } let ctx = void 0; 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 }; } 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 === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false, ...processCreateParams(params) }); }; var ZodBoolean = class extends ZodType { static { __name(this, "ZodBoolean"); } _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 === void 0 ? void 0 : params.coerce) || false, ...processCreateParams(params) }); }; var ZodDate = class _ZodDate extends ZodType { static { __name(this, "ZodDate"); } _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 = void 0; 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 === void 0 ? void 0 : params.coerce) || false, typeName: ZodFirstPartyTypeKind.ZodDate, ...processCreateParams(params) }); }; var ZodSymbol = class extends ZodType { static { __name(this, "ZodSymbol"); } _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) }); }; var ZodUndefined = class extends ZodType { static { __name(this, "ZodUndefined"); } _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) }); }; var ZodNull = class extends ZodType { static { __name(this, "ZodNull"); } _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) }); }; var ZodAny = class extends ZodType { static { __name(this, "ZodAny"); } constructor() { super(...arguments); this._any = true; } _parse(input) { return OK(input.data); } }; ZodAny.create = (params) => { return new ZodAny({ typeName: ZodFirstPartyTypeKind.ZodAny, ...processCreateParams(params) }); }; var ZodUnknown = class extends ZodType { static { __name(this, "ZodUnknown"); } constructor() { super(...arguments); this._unknown = true; } _parse(input) { return OK(input.data); } }; ZodUnknown.create = (params) => { return new ZodUnknown({ typeName: ZodFirstPartyTypeKind.ZodUnknown, ...processCreateParams(params) }); }; var ZodNever = class extends ZodType { static { __name(this, "ZodNever"); } _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) }); }; var ZodVoid = class extends ZodType { static { __name(this, "ZodVoid"); } _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) }); }; var ZodArray = class _ZodArray extends ZodType { static { __name(this, "ZodArray"); } _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 : void 0, maximum: tooBig ? def.exactLength.value : void 0, 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: /* @__PURE__ */ __name(() => newShape, "shape") }); } 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; } } __name(deepPartialify, "deepPartialify"); var ZodObject = class _ZodObject extends ZodType { static { __name(this, "ZodObject"); } 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) //, ctx.child(key), value, getParsedType(value) ), alwaysSet: key in ctx.data }); } } if (ctx.common.async) { return Promise.resolve().then(async () => { const syncPairs = []; for (const pair of pairs) { const key = await pair.key; const value = await pair.value; syncPairs.push({ key, value, alwaysSet: pair.alwaysSet }); } return syncPairs; }).then((syncPairs) => { return ParseStatus.mergeObjectSync(status, syncPairs); }); } else { return ParseStatus.mergeObjectSync(status, pairs); } } get shape() { return this._def.shape(); } strict(message) { errorUtil.errToObj; return new _ZodObject({ ...this._def, unknownKeys: "strict", ...message !== void 0 ? { errorMap: /* @__PURE__ */ __name((issue, ctx) => { var _a, _b, _c, _d; const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError; if (issue.code === "unrecognized_keys") return { message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError }; return { message: defaultError }; }, "errorMap") } : {} }); } strip() { return new _ZodObject({ ...this._def, unknownKeys: "strip" }); } passthrough() { return new _ZodObject({ ...this._def, unknownKeys: "passthrough" }); } // const AugmentFactory = // (def: Def) => // ( // augmentation: Augmentation // ): ZodObject< // extendShape, Augmentation>, // Def["unknownKeys"], // Def["catchall"] // > => { // return new ZodObject({ // ...def, // shape: () => ({ // ...def.shape(), // ...augmentation, // }), // }) as any; // }; extend(augmentation) { return new _ZodObject({ ...this._def, shape: /* @__PURE__ */ __name(() => ({ ...this._def.shape(), ...augmentation }), "shape") }); } /** * Prior to zod@1.0.12 there was a bug in the * inferred type of merged objects. Please * upgrade if you are experiencing issues. */ merge(merging) { const merged = new _ZodObject({ unknownKeys: merging._def.unknownKeys, catchall: merging._def.catchall, shape: /* @__PURE__ */ __name(() => ({ ...this._def.shape(), ...merging._def.shape() }), "shape"), typeName: ZodFirstPartyTypeKind.ZodObject }); return merged; } // merge< // Incoming extends AnyZodObject, // Augmentation extends Incoming["shape"], // NewOutput extends { // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation // ? Augmentation[k]["_output"] // : k extends keyof Output // ? Output[k] // : never; // }, // NewInput extends { // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation // ? Augmentation[k]["_input"] // : k extends keyof Input // ? Input[k] // : never; // } // >( // merging: Incoming // ): ZodObject< // extendShape>, // Incoming["_def"]["unknownKeys"], // Incoming["_def"]["catchall"], // NewOutput, // NewInput // > { // const merged: any = new ZodObject({ // unknownKeys: merging._def.unknownKeys, // catchall: merging._def.catchall, // shape: () => // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), // typeName: ZodFirstPartyTypeKind.ZodObject, // }) as any; // return merged; // } setKey(key, schema) { return this.augment({ [key]: schema }); } // merge( // merging: Incoming // ): //ZodObject = (merging) => { // ZodObject< // extendShape>, // Incoming["_def"]["unknownKeys"], // Incoming["_def"]["catchall"] // > { // // const mergedShape = objectUtil.mergeShapes( // // this._def.shape(), // // merging._def.shape() // // ); // const merged: any = new ZodObject({ // unknownKeys: merging._def.unknownKeys, // catchall: merging._def.catchall, // shape: () => // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), // typeName: ZodFirstPartyTypeKind.ZodObject, // }) as any; // return merged; // } catchall(index) { return new _ZodObject({ ...this._def, catchall: index }); } pick(mask) { const shape = {}; util.objectKeys(mask).forEach((key) => { if (mask[key] && this.shape[key]) { shape[key] = this.shape[key]; } }); return new _ZodObject({ ...this._def, shape: /* @__PURE__ */ __name(() => 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: /* @__PURE__ */ __name(() => shape, "shape") }); } /** * @deprecated */ 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: /* @__PURE__ */ __name(() => newShape, "shape") }); } 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: /* @__PURE__ */ __name(() => newShape, "shape") }); } keyof() { return createZodEnum(util.objectKeys(this.shape)); } }; ZodObject.create = (shape, params) => { return new ZodObject({ shape: /* @__PURE__ */ __name(() => shape, "shape"), unknownKeys: "strip", catchall: ZodNever.create(), typeName: ZodFirstPartyTypeKind.ZodObject, ...processCreateParams(params) }); }; ZodObject.strictCreate = (shape, params) => { return new ZodObject({ shape: /* @__PURE__ */ __name(() => 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) }); }; var ZodUnion = class extends ZodType { static { __name(this, "ZodUnion"); } _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; } __name(handleResults, "handleResults"); 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 = void 0; 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 = /* @__PURE__ */ __name((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 [void 0]; } else if (type instanceof ZodNull) { return [null]; } else if (type instanceof ZodOptional) { return [void 0, ...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 []; } }, "getDiscriminator"); var ZodDiscriminatedUnion = class _ZodDiscriminatedUnion extends ZodType { static { __name(this, "ZodDiscriminatedUnion"); } _parse(input) { const { ctx } = this._processInputParams(input); if (ctx.parsedType !== ZodParsedType.object) { addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, expected: ZodParsedType.object, received: ctx.parsedType }); return INVALID; } const discriminator = this.discriminator; const discriminatorValue = ctx.data[discriminator]; const option = this.optionsMap.get(discriminatorValue); if (!option) { addIssueToContext(ctx, { code: ZodIssueCode.invalid_union_discriminator, options: Array.from(this.optionsMap.keys()), path: [discriminator] }); return INVALID; } if (ctx.common.async) { return option._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }); } else { return option._parseSync({ data: ctx.data, path: ctx.path, parent: ctx }); } } get discriminator() { return this._def.discriminator; } get options() { return this._def.options; } get optionsMap() { return this._def.optionsMap; } /** * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor. * However, it only allows a union of objects, all of which need to share a discriminator property. This property must * have a different value for each object in the union. * @param discriminator the name of the discriminator property * @param types an array of object schemas * @param params */ static create(discriminator, options, params) { const optionsMap = /* @__PURE__ */ 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 }; } } __name(mergeValues, "mergeValues"); var ZodIntersection = class extends ZodType { static { __name(this, "ZodIntersection"); } _parse(input) { const { status, ctx } = this._processInputParams(input); const handleParsed = /* @__PURE__ */ __name((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 }; }, "handleParsed"); 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) }); }; var ZodTuple = class _ZodTuple extends ZodType { static { __name(this, "ZodTuple"); } _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) }); }; var ZodRecord = class _ZodRecord extends ZodType { static { __name(this, "ZodRecord"); } 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) }); } }; var ZodMap = class extends ZodType { static { __name(this, "ZodMap"); } 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 = /* @__PURE__ */ 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 = /* @__PURE__ */ 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) }); }; var ZodSet = class _ZodSet extends ZodType { static { __name(this, "ZodSet"); } _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 = /* @__PURE__ */ 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 }; } __name(finalizeSet, "finalizeSet"); 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) }); }; var ZodFunction = class _ZodFunction extends ZodType { static { __name(this, "ZodFunction"); } 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, error3) { return makeIssue({ data: args, path: ctx.path, errorMaps: [ ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), errorMap ].filter((x) => !!x), issueData: { code: ZodIssueCode.invalid_arguments, argumentsError: error3 } }); } __name(makeArgsIssue, "makeArgsIssue"); function makeReturnsIssue(returns, error3) { 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: error3 } }); } __name(makeReturnsIssue, "makeReturnsIssue"); 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 error3 = new ZodError([]); const parsedArgs = await me._def.args.parseAsync(args, params).catch((e) => { error3.addIssue(makeArgsIssue(args, e)); throw error3; }); const result = await Reflect.apply(fn, this, parsedArgs); const parsedReturns = await me._def.returns._def.type.parseAsync(result, params).catch((e) => { error3.addIssue(makeReturnsIssue(result, e)); throw error3; }); 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) }); } }; var ZodLazy = class extends ZodType { static { __name(this, "ZodLazy"); } 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) }); }; var ZodLiteral = class extends ZodType { static { __name(this, "ZodLiteral"); } _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) }); } __name(createZodEnum, "createZodEnum"); var ZodEnum = class _ZodEnum extends ZodType { static { __name(this, "ZodEnum"); } constructor() { super(...arguments); _ZodEnum_cache.set(this, void 0); } _parse(input) { if (typeof input.data !== "string") { const ctx = this._getOrReturnCtx(input); const expectedValues = this._def.values; addIssueToContext(ctx, { expected: 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 = /* @__PURE__ */ new WeakMap(); ZodEnum.create = createZodEnum; var ZodNativeEnum = class extends ZodType { static { __name(this, "ZodNativeEnum"); } constructor() { super(...arguments); _ZodNativeEnum_cache.set(this, void 0); } _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 = /* @__PURE__ */ new WeakMap(); ZodNativeEnum.create = (values, params) => { return new ZodNativeEnum({ values, typeName: ZodFirstPartyTypeKind.ZodNativeEnum, ...processCreateParams(params) }); }; var ZodPromise = class extends ZodType { static { __name(this, "ZodPromise"); } 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) }); }; var ZodEffects = class extends ZodType { static { __name(this, "ZodEffects"); } 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: /* @__PURE__ */ __name((arg) => { addIssueToContext(ctx, arg); if (arg.fatal) { status.abort(); } else { status.dirty(); } }, "addIssue"), 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 = /* @__PURE__ */ __name((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; }, "executeRefinement"); 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) }); }; var ZodOptional = class extends ZodType { static { __name(this, "ZodOptional"); } _parse(input) { const parsedType = this._getType(input); if (parsedType === ZodParsedType.undefined) { return OK(void 0); } 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) }); }; var ZodNullable = class extends ZodType { static { __name(this, "ZodNullable"); } _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) }); }; var ZodDefault = class extends ZodType { static { __name(this, "ZodDefault"); } _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) }); }; var ZodCatch = class extends ZodType { static { __name(this, "ZodCatch"); } _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) }); }; var ZodNaN = class extends ZodType { static { __name(this, "ZodNaN"); } _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 = /* @__PURE__ */ Symbol("zod_brand"); var ZodBranded = class extends ZodType { static { __name(this, "ZodBranded"); } _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; } }; var ZodPipeline = class _ZodPipeline extends ZodType { static { __name(this, "ZodPipeline"); } _parse(input) { const { status, ctx } = this._processInputParams(input); if (ctx.common.async) { const handleAsync = /* @__PURE__ */ __name(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 }); } }, "handleAsync"); 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 }); } }; var ZodReadonly = class extends ZodType { static { __name(this, "ZodReadonly"); } _parse(input) { const result = this._def.innerType._parse(input); const freeze = /* @__PURE__ */ __name((data) => { if (isValid(data)) { data.value = Object.freeze(data.value); } return data; }, "freeze"); 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 custom(check, params = {}, fatal) { if (check) return ZodAny.create().superRefine((data, ctx) => { var _a, _b; if (!check(data)) { const p = typeof params === "function" ? params(data) : typeof params === "string" ? { message: params } : params; const _fatal = (_b = (_a = p.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true; const p2 = typeof p === "string" ? { message: p } : p; ctx.addIssue({ code: "custom", ...p2, fatal: _fatal }); } }); return ZodAny.create(); } __name(custom, "custom"); 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 = /* @__PURE__ */ __name((cls, params = { message: `Input not instance of ${cls.name}` }) => custom((data) => data instanceof cls, params), "instanceOfType"); 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 = /* @__PURE__ */ __name(() => stringType().optional(), "ostring"); var onumber = /* @__PURE__ */ __name(() => numberType().optional(), "onumber"); var oboolean = /* @__PURE__ */ __name(() => booleanType().optional(), "oboolean"); var coerce = { string: /* @__PURE__ */ __name(((arg) => ZodString.create({ ...arg, coerce: true })), "string"), number: /* @__PURE__ */ __name(((arg) => ZodNumber.create({ ...arg, coerce: true })), "number"), boolean: /* @__PURE__ */ __name(((arg) => ZodBoolean.create({ ...arg, coerce: true })), "boolean"), bigint: /* @__PURE__ */ __name(((arg) => ZodBigInt.create({ ...arg, coerce: true })), "bigint"), date: /* @__PURE__ */ __name(((arg) => ZodDate.create({ ...arg, coerce: true })), "date") }; 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 }); // src/types.ts var ConstraintsSchema = z.object({ max_size_kb: z.number().positive().max(8192), max_cold_start_ms: z.number().positive().max(500), no_network_syscall: z.boolean().optional(), no_filesystem_syscall: z.boolean().optional(), io_model: z.literal("stdin_stdout_json") }); var GherkinTestSchema = z.object({ scenario: z.string().min(1), given: z.string().min(1), then_contains: z.string().min(1) }); var ComponentContractSchema = z.object({ // canonical_id:提交者填寫的可讀名稱(小寫底線),用於搜尋與 workflow 引用 // component_hash_id:由 Registry 在提交時派發,格式 cmp_{8碼hex},workflow 引用此 id 才能保證永久不壞 // 兩者都可以在 workflow 中引用,Registry 會互相解析 canonical_id: z.string().min(1).regex(/^[a-z][a-z0-9_]*$/, "canonical_id \u5FC5\u9808\u70BA\u5C0F\u5BEB\u5E95\u7DDA\u683C\u5F0F"), display_name: z.string().min(1), // category 擴充:auth (auth primitive)、ai (Claude/AI 推論)、platform (平台底層 crypto/system) category: z.enum(["logic", "api", "ui", "style", "anim", "data", "auth", "ai", "platform"]), version: z.string().min(1).regex(/^v\d+$/, "version \u683C\u5F0F\u5FC5\u9808\u70BA vN"), wasi_target: z.literal("preview1"), stability: z.enum(["floating", "stable", "pinned"]), runtime_compat: z.array(z.enum(["cf-workers", "workerd", "wazero"])).min(1), constraints: ConstraintsSchema, input_schema: z.record(z.unknown()), output_schema: z.record(z.unknown()), gherkin_tests: z.array(GherkinTestSchema).min(2, "\u81F3\u5C11\u9700\u8981\u4E00\u500B happy path \u548C\u4E00\u500B error path"), // 選填欄位 component_type: z.enum(["wasm", "service_binding"]).optional(), max_size_kb: z.number().optional(), max_cold_start_ms: z.number().optional(), no_network_syscall: z.boolean().optional(), service_binding_key: z.string().optional(), description: z.string().optional(), // aliases:搜尋同義詞,不作為識別符使用 // 從 registry/aliases.yaml 的 scope 同義詞表自動合併,也可在 contract 內手動補充 // 未來接入 KBDB 後,canonical_id 將獲得系統派發的唯一 hash id aliases: z.array(z.string()).optional(), tags: z.array(z.string()).optional() }); var FORBIDDEN_SYSCALLS = [ "sock_connect", "sock_accept", "sock_recv", "sock_send", "sock_shutdown", "fd_open", "path_open", "path_create_directory", "path_remove_directory", "path_rename", "path_unlink_file", "path_filestat_get", "path_filestat_set_times", "path_link", "path_readlink", "path_symlink" ]; // src/actions/validateContract.ts function validateContract(raw2) { const result = ComponentContractSchema.safeParse(raw2); if (result.success) { return { valid: true, missing_fields: [], errors: [], contract: result.data }; } const missing_fields = []; const errors = []; for (const issue of result.error.issues) { const path = issue.path.join("."); if (issue.code === "invalid_type" && issue.received === "undefined") { missing_fields.push(path || issue.message); } else { errors.push(path ? `${path}: ${issue.message}` : issue.message); } } return { valid: false, missing_fields, errors }; } __name(validateContract, "validateContract"); // src/routes/validateContract.ts var app2 = new Hono2(); app2.post("/", async (c) => { let body; try { body = await c.req.json(); } catch { return c.json({ valid: false, missing_fields: [], errors: ["request body \u5FC5\u9808\u70BA\u5408\u6CD5 JSON"] }, 400); } const result = validateContract(body); if (result.valid) { return c.json({ valid: true, missing_fields: [], errors: [] }, 200); } return c.json({ valid: false, missing_fields: result.missing_fields, errors: result.errors }, 422); }); var validateContract_default = app2; // src/actions/detectFakeComponent.ts var EXEMPT_IDS = /* @__PURE__ */ new Set([ "http_request", "auth_static_key", "auth_oauth2", "auth_service_account", "auth_mtls" ]); var URL_SCHEME_RE = /\bhttps?:\/\/[^\s"'`)]+/i; var BARE_DOMAIN_RE = /\b[a-z0-9][a-z0-9-]*(\.[a-z0-9-]+)*\.(com|org|net|dev|io|me|click|app|co|googleapis\.com|telegram\.org)\b/i; function flattenContractText(contract) { const parts = [ contract.display_name ?? "", contract.description ?? "", JSON.stringify(contract.input_schema ?? {}), JSON.stringify(contract.output_schema ?? {}), (contract.tags ?? []).join(" "), (contract.aliases ?? []).join(" ") ]; return parts.join("\n"); } __name(flattenContractText, "flattenContractText"); function detectFakeComponent(contract, wasmBytes) { if (EXEMPT_IDS.has(contract.canonical_id)) { return null; } const pointToRecipe = "\u3002\u9019\u8A72\u662F API recipe\uFF08http_request + \u56FA\u5B9A\u8A2D\u5B9A\uFF09\u6216\u5DE5\u4F5C\u6D41\uFF0C\u4E0D\u662F\u96F6\u4EF6\u3002\u96F6\u4EF6 = \u5C01\u9589\u908F\u8F2F\uFF08\u6D41\u7A0B\u63A7\u5236 / \u8CC7\u6599\u8655\u7406\uFF09\uFF0C\u4E0D\u9023\u5916\u90E8\u670D\u52D9\u3002\u898B DECISIONS \xA71\u3002"; const contractText = flattenContractText(contract); const schemeHit = contractText.match(URL_SCHEME_RE); if (schemeHit) { return `\u5075\u6E2C\u5230 contract \u542B\u5916\u90E8 URL\uFF1A${schemeHit[0].slice(0, 80)}${pointToRecipe}`; } const domainHit = contractText.match(BARE_DOMAIN_RE); if (domainHit) { return `\u5075\u6E2C\u5230 contract \u542B\u5916\u90E8 domain\uFF1A${domainHit[0]}${pointToRecipe}`; } const wasmText = new TextDecoder("utf-8").decode(wasmBytes); const wasmSchemeHit = wasmText.match(URL_SCHEME_RE); if (wasmSchemeHit) { return `\u5075\u6E2C\u5230 wasm \u5167\u5D4C\u5916\u90E8 URL\uFF1A${wasmSchemeHit[0].slice(0, 80)}${pointToRecipe}`; } const desc = (contract.description ?? "") + " " + contract.display_name; const inputKeys = Object.keys(contract.input_schema ?? {}).join(" ").toLowerCase(); const hasUrlField = /\b(url|endpoint|api_url|base_url|host)\b/.test(inputKeys); const describesHttpCall = /(打|呼叫|call|fetch|request|POST|GET|PUT|DELETE)\s*.*(api|endpoint|url|https?)/i.test(desc); if (hasUrlField && describesHttpCall) { return `\u5075\u6E2C\u5230\u7591\u4F3C http_request \u5B50\u96C6\uFF08input \u6709 url \u6B04\u4F4D + \u63CF\u8FF0\u70BA\u6253 API\uFF09${pointToRecipe}`; } return null; } __name(detectFakeComponent, "detectFakeComponent"); // src/actions/wasmImports.ts var ALLOWED_IMPORT_MODULES = /* @__PURE__ */ new Set([ "wasi_snapshot_preview1", "u6u" ]); function readULEB(buf, offset) { let result = 0; let shift = 0; let pos = offset; for (; ; ) { const byte = buf[pos++]; result |= (byte & 127) << shift; if ((byte & 128) === 0) break; shift += 7; } return [result, pos]; } __name(readULEB, "readULEB"); function parseWasmImportModules(wasmBytes) { if (wasmBytes.length < 8) return null; if (wasmBytes[0] !== 0 || wasmBytes[1] !== 97 || wasmBytes[2] !== 115 || wasmBytes[3] !== 109) { return null; } const decoder = new TextDecoder("utf-8"); const modules = /* @__PURE__ */ new Set(); let offset = 8; try { while (offset < wasmBytes.length) { const sectionId = wasmBytes[offset++]; const [sectionSize, afterSize] = readULEB(wasmBytes, offset); offset = afterSize; const sectionEnd = offset + sectionSize; if (sectionId === 2) { let p = offset; const [count3, afterCount] = readULEB(wasmBytes, p); p = afterCount; for (let i = 0; i < count3; i++) { const [modLen, afterModLen] = readULEB(wasmBytes, p); p = afterModLen; const moduleName = decoder.decode(wasmBytes.subarray(p, p + modLen)); p += modLen; modules.add(moduleName); const [nameLen, afterNameLen] = readULEB(wasmBytes, p); p = afterNameLen; p += nameLen; const kind = wasmBytes[p++]; if (kind === 0) { const [, afterType] = readULEB(wasmBytes, p); p = afterType; } else if (kind === 1) { p += 1; const [flags, afterFlags] = readULEB(wasmBytes, p); p = afterFlags; const [, afterMin] = readULEB(wasmBytes, p); p = afterMin; if (flags === 1) { const [, afterMax] = readULEB(wasmBytes, p); p = afterMax; } } else if (kind === 2) { const [flags, afterFlags] = readULEB(wasmBytes, p); p = afterFlags; const [, afterMin] = readULEB(wasmBytes, p); p = afterMin; if (flags === 1) { const [, afterMax] = readULEB(wasmBytes, p); p = afterMax; } } else if (kind === 3) { p += 2; } else { return modules.size > 0 ? modules : null; } } } offset = sectionEnd; } } catch { return modules.size > 0 ? modules : null; } return modules; } __name(parseWasmImportModules, "parseWasmImportModules"); function checkPureWasi(wasmBytes) { const modules = parseWasmImportModules(wasmBytes); if (modules === null) { return "WASM import section \u7121\u6CD5\u89E3\u6790\uFF08\u975E\u5408\u6CD5 WASI preview1 wasm\uFF1F\uFF09"; } for (const mod of modules) { if (!ALLOWED_IMPORT_MODULES.has(mod)) { return `\u5075\u6E2C\u5230\u975E\u767D\u540D\u55AE import module\uFF1A\u300C${mod}\u300D\u3002\u96F6\u4EF6\u53EA\u51C6\u4F9D\u8CF4 wasi_snapshot_preview1 + u6u host functions\uFF08\u907F\u514D runtime \u9396\u5B9A\uFF0C\u898B DECISIONS \xA74\uFF09`; } } return null; } __name(checkPureWasi, "checkPureWasi"); // src/actions/sandboxAcceptance.ts function checkFakeComponent(wasmBytes, contract) { return detectFakeComponent(contract, wasmBytes); } __name(checkFakeComponent, "checkFakeComponent"); function checkSize(wasmBytes, contract) { const maxSizeKb = contract.constraints.max_size_kb; const actualKb = wasmBytes.byteLength / 1024; if (actualKb > maxSizeKb) { return `\u9AD4\u7A4D ${actualKb.toFixed(1)}KB \u8D85\u904E\u4E0A\u9650 ${maxSizeKb}KB`; } return null; } __name(checkSize, "checkSize"); function scanSyscalls(wasmBytes) { const pureWasiError = checkPureWasi(wasmBytes); if (pureWasiError !== null) { return pureWasiError; } const text = new TextDecoder("utf-8").decode(wasmBytes); for (const syscall of FORBIDDEN_SYSCALLS) { if (text.includes(syscall)) { return `\u767C\u73FE\u7981\u6B62\u7684 syscall\uFF1A${syscall}`; } } return null; } __name(scanSyscalls, "scanSyscalls"); var STEPS = [ { name: "fake_component_scan", run: checkFakeComponent, guideAnchor: "#fake-component" }, { name: "size_check", run: checkSize, guideAnchor: "#common-errors" }, { name: "syscall_scan", run: scanSyscalls, guideAnchor: "#syscall-constraints" } ]; var UNIMPLEMENTED_STEPS = ["gherkin_tests", "cold_start", "runtime_compat"]; function fail(step, reason, guideAnchor, contract) { return { success: false, failed_step: step, reason, guide_anchor: guideAnchor, component_hash_id: "", canonical_id: contract.canonical_id, version: contract.version }; } __name(fail, "fail"); function checkGherkinEvidence(contract, evidence) { if (!evidence || evidence.length === 0) return null; const evidenceScenarios = new Set(evidence.map((e) => e.scenario)); for (const test of contract.gherkin_tests) { if (!evidenceScenarios.has(test.scenario)) { return `gherkin_evidence \u7F3A\u5C11 scenario\u300C${test.scenario}\u300D\u7684\u672C\u5730\u6E2C\u8A66\u7D50\u679C`; } } for (const e of evidence) { if (!e.passed) { return `gherkin_evidence scenario\u300C${e.scenario}\u300D\u672C\u5730\u672A\u901A\u904E\uFF08passed=false\uFF09`; } } return null; } __name(checkGherkinEvidence, "checkGherkinEvidence"); function runSandboxAcceptance(wasmBytes, contract, gherkinEvidence) { for (const step of STEPS) { const error3 = step.run(wasmBytes, contract); if (error3 !== null) { return fail(step.name, error3, step.guideAnchor, contract); } } const evidenceError = checkGherkinEvidence(contract, gherkinEvidence); if (evidenceError !== null) { return fail("gherkin_tests", evidenceError, "#local-testing", contract); } return { success: true, unimplemented_steps: UNIMPLEMENTED_STEPS, // gherkin(本地跑,registry未重跑) / cold_start / runtime_compat component_hash_id: "", // 由 submitComponent 在驗收通過後填入 canonical_id: contract.canonical_id, version: contract.version }; } __name(runSandboxAcceptance, "runSandboxAcceptance"); // src/actions/submitComponent.ts function gateError(contract, reason) { return { success: false, failed_step: "fake_component_scan", // 復用最前步驟欄位語意:未過閘門 reason, guide_anchor: "#human-gate", component_hash_id: "", canonical_id: contract.canonical_id, version: contract.version }; } __name(gateError, "gateError"); async function deriveHashId(canonicalId) { const encoder = new TextEncoder(); const data = encoder.encode(canonicalId); const hashBuffer = await crypto.subtle.digest("SHA-256", data); const hashArray = Array.from(new Uint8Array(hashBuffer)); const hex = hashArray.map((b) => b.toString(16).padStart(2, "0")).join(""); return "cmp_" + hex.slice(0, 8); } __name(deriveHashId, "deriveHashId"); async function submitComponent(wasmBytes, contract, env2, options = {}) { const { skip_acceptance, human_confirmation, gherkin_evidence } = options; if (!skip_acceptance) { if (!human_confirmation || human_confirmation.confirmed_by_human !== true || !human_confirmation.reason_why_not_workflow || human_confirmation.reason_why_not_workflow.trim() === "") { return gateError( contract, "\u5EFA\u96F6\u4EF6\u9700\u4EBA\u985E\u78BA\u8A8D\u3002\u8ACB\u7528 `acr component create`\uFF08\u6703\u4E92\u52D5\u5F0F\u554F\u4F60\uFF09\uFF0C\u4E26\u8AAA\u660E\u300C\u70BA\u4F55\u9019\u4EF6\u4E8B\u7121\u6CD5\u7528\u5DE5\u4F5C\u6D41\u9054\u6210\u300D\u3002\u9810\u8A2D\u5047\u8A2D\u5DE5\u4F5C\u6D41 / recipe \u80FD\u505A\u2014\u2014\u5148\u8A66\u5DE5\u4F5C\u6D41\u3002" ); } } if (!skip_acceptance) { const sandboxResult = runSandboxAcceptance(wasmBytes, contract, gherkin_evidence); if (!sandboxResult.success) { return sandboxResult; } } const hashId = await deriveHashId(contract.canonical_id); const kvKey = `comp:${hashId}:${contract.version}`; const existing = await env2.SUBMISSIONS_KV.get(kvKey); if (existing) { return { success: true, component_hash_id: hashId, canonical_id: contract.canonical_id, version: contract.version }; } const record = { component_hash_id: hashId, canonical_id: contract.canonical_id, display_name: contract.display_name, category: contract.category, version: contract.version, wasi_target: contract.wasi_target, stability: contract.stability, runtime_compat: contract.runtime_compat, component_type: contract.component_type ?? "wasm", constraints: contract.constraints, input_schema: contract.input_schema, output_schema: contract.output_schema, gherkin_tests: contract.gherkin_tests, description: contract.description ?? "", aliases: contract.aliases ?? [], tags: contract.tags ?? [], success_rate: 1, avg_duration_ms: 0, call_count: 0, visibility: "public", status: "active", submitted_at: (/* @__PURE__ */ new Date()).toISOString(), deprecated_at: null, // G0 軌跡可審:人類為何建此零件(舉證)+ 投稿者本地 Gherkin 結果證據 human_confirmation: human_confirmation ?? null, gherkin_evidence: gherkin_evidence ?? null }; await env2.SUBMISSIONS_KV.put(kvKey, JSON.stringify(record)); await env2.SUBMISSIONS_KV.put(`idx:${contract.canonical_id}`, hashId); return { success: true, component_hash_id: hashId, canonical_id: contract.canonical_id, version: contract.version }; } __name(submitComponent, "submitComponent"); // src/actions/indexOnlyComponent.ts async function deriveHashId2(canonicalId) { const encoder = new TextEncoder(); const data = encoder.encode(canonicalId); const hashBuffer = await crypto.subtle.digest("SHA-256", data); const hashArray = Array.from(new Uint8Array(hashBuffer)); const hex = hashArray.map((b) => b.toString(16).padStart(2, "0")).join(""); return "cmp_" + hex.slice(0, 8); } __name(deriveHashId2, "deriveHashId"); async function indexOnlyComponent(contract, env2) { const hashId = await deriveHashId2(contract.canonical_id); const kvKey = `comp:${hashId}:${contract.version}`; const existing = await env2.SUBMISSIONS_KV.get(kvKey); if (existing) { return { success: true, component_hash_id: hashId, canonical_id: contract.canonical_id, version: contract.version, already_indexed: true }; } const record = { component_hash_id: hashId, canonical_id: contract.canonical_id, display_name: contract.display_name, category: contract.category, version: contract.version, wasi_target: contract.wasi_target, stability: contract.stability, runtime_compat: contract.runtime_compat, component_type: contract.component_type ?? "wasm", constraints: contract.constraints, input_schema: contract.input_schema, output_schema: contract.output_schema, gherkin_tests: contract.gherkin_tests, description: contract.description ?? "", aliases: contract.aliases ?? [], tags: contract.tags ?? [], success_rate: 1, avg_duration_ms: 0, call_count: 0, visibility: "public", status: "active", submitted_at: (/* @__PURE__ */ new Date()).toISOString(), deprecated_at: null, indexed_only: true }; await env2.SUBMISSIONS_KV.put(kvKey, JSON.stringify(record)); await env2.SUBMISSIONS_KV.put(`idx:${contract.canonical_id}`, hashId); return { success: true, component_hash_id: hashId, canonical_id: contract.canonical_id, version: contract.version, already_indexed: false }; } __name(indexOnlyComponent, "indexOnlyComponent"); // src/routes/components.ts var app3 = new Hono2(); app3.post("/", async (c) => { let contract; let wasmBytes; const submitOptions = {}; const contentType = c.req.header("content-type") ?? ""; if (contentType.includes("multipart/form-data")) { const formData = await c.req.formData(); const contractStr = formData.get("contract"); const wasmFile = formData.get("wasm"); if (!contractStr || typeof contractStr !== "string") { return c.json({ success: false, error: "\u7F3A\u5C11 contract \u6B04\u4F4D" }, 400); } if (!wasmFile || !(wasmFile instanceof File)) { return c.json({ success: false, error: "\u7F3A\u5C11 wasm \u6B04\u4F4D" }, 400); } try { contract = JSON.parse(contractStr); } catch { return c.json({ success: false, error: "contract \u5FC5\u9808\u70BA\u5408\u6CD5 JSON" }, 400); } wasmBytes = new Uint8Array(await wasmFile.arrayBuffer()); const hc = formData.get("human_confirmation"); if (typeof hc === "string") { try { submitOptions.human_confirmation = JSON.parse(hc); } catch { } } const ge = formData.get("gherkin_evidence"); if (typeof ge === "string") { try { submitOptions.gherkin_evidence = JSON.parse(ge); } catch { } } if (formData.get("skip_acceptance") === "true") submitOptions.skip_acceptance = true; } else { let body; try { body = await c.req.json(); } catch { return c.json({ success: false, error: "request body \u5FC5\u9808\u70BA multipart/form-data \u6216 JSON" }, 400); } contract = body.contract; const wasmBase64 = body.wasm_base64; if (!contract) { return c.json({ success: false, error: "\u7F3A\u5C11 contract \u6B04\u4F4D" }, 400); } if (!wasmBase64 || typeof wasmBase64 !== "string") { return c.json({ success: false, error: "\u7F3A\u5C11 wasm_base64 \u6B04\u4F4D" }, 400); } const binaryStr = atob(wasmBase64); wasmBytes = new Uint8Array(binaryStr.length); for (let i = 0; i < binaryStr.length; i++) { wasmBytes[i] = binaryStr.charCodeAt(i); } if (body.human_confirmation) submitOptions.human_confirmation = body.human_confirmation; if (body.gherkin_evidence) submitOptions.gherkin_evidence = body.gherkin_evidence; if (body.skip_acceptance === true) submitOptions.skip_acceptance = true; } const validation = validateContract(contract); if (!validation.valid) { return c.json({ success: false, failed_step: "contract_validation", reason: `\u5408\u7D04\u683C\u5F0F\u9A57\u8B49\u5931\u6557\uFF1A${validation.errors.join(", ")}`, missing_fields: validation.missing_fields, guide_anchor: "#contract-example" }, 422); } const result = await submitComponent(wasmBytes, validation.contract, c.env, submitOptions); if (!result.success) { return c.json(result, 422); } return c.json(result, 201); }); app3.post("/index-only", async (c) => { let body; try { body = await c.req.json(); } catch { return c.json({ success: false, error: "request body \u5FC5\u9808\u70BA JSON" }, 400); } const contract = body.contract; if (!contract) { return c.json({ success: false, error: "\u7F3A\u5C11 contract \u6B04\u4F4D" }, 400); } if (typeof contract === "object" && contract !== null) { const c2 = contract; if (!c2.gherkin_tests || Array.isArray(c2.gherkin_tests) && c2.gherkin_tests.length < 2) { c2.gherkin_tests = [ { scenario: "placeholder happy", given: "{}", then_contains: "{" }, { scenario: "placeholder fail", given: "{}", then_contains: "}" } ]; } if (!c2.description) c2.description = ""; if (!c2.tags) c2.tags = []; } const validation = validateContract(contract); if (!validation.valid) { return c.json({ success: false, failed_step: "contract_validation", reason: `\u5408\u7D04\u683C\u5F0F\u9A57\u8B49\u5931\u6557\uFF1A${validation.errors.join(", ")}`, missing_fields: validation.missing_fields }, 422); } const result = await indexOnlyComponent(validation.contract, c.env); return c.json(result, result.already_indexed ? 200 : 201); }); var components_default = app3; // src/actions/queryComponents.ts async function resolveHashId(id, env2) { if (id.startsWith("cmp_")) return id; const hashId = await env2.SUBMISSIONS_KV.get(`idx:${id}`); return hashId; } __name(resolveHashId, "resolveHashId"); async function listVersions(hashId, env2) { const prefix = `comp:${hashId}:`; const list = await env2.SUBMISSIONS_KV.list({ prefix }); const records = []; for (const key of list.keys) { const raw2 = await env2.SUBMISSIONS_KV.get(key.name); if (!raw2) continue; try { const v = JSON.parse(raw2); if (v.status === "tombstone") continue; records.push(toComponentRecord(v)); } catch { continue; } } return records; } __name(listVersions, "listVersions"); async function getComponent(id, env2) { const hashId = await resolveHashId(id, env2); if (!hashId) return null; const versions2 = await listVersions(hashId, env2); if (versions2.length === 0) return null; versions2.sort((a, b) => b.score - a.score); return versions2[0]; } __name(getComponent, "getComponent"); async function getComponentVersions(id, env2) { const hashId = await resolveHashId(id, env2); if (!hashId) return []; const versions2 = await listVersions(hashId, env2); versions2.sort((a, b) => b.score - a.score); return versions2.slice(0, 10); } __name(getComponentVersions, "getComponentVersions"); async function searchComponents(query, env2) { const q = query.toLowerCase(); const list = await env2.SUBMISSIONS_KV.list({ prefix: "comp:" }); const seen = /* @__PURE__ */ new Set(); const candidates = []; for (const key of list.keys) { const raw2 = await env2.SUBMISSIONS_KV.get(key.name); if (!raw2) continue; let v; try { v = JSON.parse(raw2); } catch { continue; } if (v.status === "tombstone" || v.visibility !== "public") continue; const searchable = [ String(v.canonical_id ?? ""), String(v.display_name ?? ""), String(v.description ?? ""), ...Array.isArray(v.aliases) ? v.aliases.map(String) : [], ...Array.isArray(v.tags) ? v.tags.map(String) : [] ].join(" ").toLowerCase(); if (!searchable.includes(q)) continue; const hashId = String(v.component_hash_id ?? ""); if (seen.has(`${hashId}:${v.version}`)) continue; seen.add(`${hashId}:${v.version}`); candidates.push(toComponentRecord(v)); } candidates.sort((a, b) => b.score - a.score); return candidates.slice(0, 10); } __name(searchComponents, "searchComponents"); function computeScore(v) { const successRate = parseFloat(String(v.success_rate ?? "1")); const avgDuration = parseFloat(String(v.avg_duration_ms ?? "10")); const callCount = parseInt(String(v.call_count ?? "0"), 10); const speedScore = Math.max(0, 1 - avgDuration / 1e3); return successRate * speedScore * Math.log(callCount + 2); } __name(computeScore, "computeScore"); function toComponentRecord(v) { return { component_hash_id: String(v.component_hash_id ?? ""), canonical_id: String(v.canonical_id ?? ""), display_name: String(v.display_name ?? ""), version: String(v.version ?? "v1"), category: String(v.category ?? "logic"), stability: String(v.stability ?? "floating"), status: String(v.status ?? "active"), description: String(v.description ?? ""), aliases: Array.isArray(v.aliases) ? v.aliases.map(String) : [], tags: Array.isArray(v.tags) ? v.tags.map(String) : [], success_rate: parseFloat(String(v.success_rate ?? "1")), avg_duration_ms: parseFloat(String(v.avg_duration_ms ?? "0")), call_count: parseInt(String(v.call_count ?? "0"), 10), wasm_r2_key: v.wasm_r2_key ? String(v.wasm_r2_key) : void 0, score: computeScore(v), input_schema: isPlainObject(v.input_schema) ? v.input_schema : void 0, output_schema: isPlainObject(v.output_schema) ? v.output_schema : void 0 }; } __name(toComponentRecord, "toComponentRecord"); function isPlainObject(x) { return typeof x === "object" && x !== null && !Array.isArray(x); } __name(isPlainObject, "isPlainObject"); // src/routes/query.ts var app4 = new Hono2(); app4.get("/catalog", async (c) => { const list = await c.env.SUBMISSIONS_KV.list({ prefix: "comp:" }); const seen = /* @__PURE__ */ new Set(); const components = []; for (const key of list.keys) { const raw2 = await c.env.SUBMISSIONS_KV.get(key.name); if (!raw2) continue; let v; try { v = JSON.parse(raw2); } catch { continue; } if (v.status === "tombstone" || v.visibility !== "public") continue; const dedup = `${String(v.component_hash_id ?? "")}:${String(v.version ?? "")}`; if (seen.has(dedup)) continue; seen.add(dedup); components.push(toComponentRecord(v)); } return c.json({ success: true, data: { components, count: components.length } }); }); app4.get("/search", async (c) => { const q = c.req.query("q"); if (!q || q.trim() === "") { return c.json({ success: false, error: "q \u53C3\u6578\u5FC5\u586B" }, 400); } const results = await searchComponents(q.trim(), c.env); return c.json({ success: true, data: { results, count: results.length } }); }); app4.get("/:id/versions", async (c) => { const id = c.req.param("id"); const versions2 = await getComponentVersions(id, c.env); if (versions2.length === 0) { return c.json({ success: false, error: `\u96F6\u4EF6 ${id} \u4E0D\u5B58\u5728` }, 404); } return c.json({ success: true, data: { versions: versions2, count: versions2.length } }); }); app4.get("/:id", async (c) => { const id = c.req.param("id"); const component = await getComponent(id, c.env); if (!component) { return c.json({ success: false, error: `\u96F6\u4EF6 ${id} \u4E0D\u5B58\u5728` }, 404); } return c.json({ success: true, data: component }); }); var query_default = app4; // src/actions/ensureTemplate.ts async function ensureTemplate(env2) { const testKey = "_init_health_check"; await env2.SUBMISSIONS_KV.put(testKey, "1", { expirationTtl: 60 }); const val = await env2.SUBMISSIONS_KV.get(testKey); if (val !== "1") { throw new Error("SUBMISSIONS_KV binding \u7570\u5E38\uFF1A\u5BEB\u5165\u5F8C\u7121\u6CD5\u8B80\u53D6"); } return { created: true, template_id: "submissions_kv" }; } __name(ensureTemplate, "ensureTemplate"); // src/routes/init.ts var app5 = new Hono2(); app5.post("/", async (c) => { try { const result = await ensureTemplate(c.env); return c.json({ success: true, ...result }); } catch (err) { const message = err instanceof Error ? err.message : String(err); return c.json({ success: false, error: message }, 500); } }); var init_default = app5; // src/actions/recordAnalytics.ts async function recordAnalytics(input, env2) { const hashId = input.canonical_id.startsWith("cmp_") ? input.canonical_id : await env2.SUBMISSIONS_KV.get(`idx:${input.canonical_id}`); if (!hashId) { return { ok: false, error: `\u96F6\u4EF6 ${input.canonical_id} \u4E0D\u5728\u7D22\u5F15` }; } const list = await env2.SUBMISSIONS_KV.list({ prefix: `comp:${hashId}:` }); let targetKey = null; let targetRecord = null; let bestScore = -Infinity; for (const key of list.keys) { const raw2 = await env2.SUBMISSIONS_KV.get(key.name); if (!raw2) continue; let v; try { v = JSON.parse(raw2); } catch { continue; } if (v.status === "tombstone") continue; if (input.version) { if (String(v.version) === input.version) { targetKey = key.name; targetRecord = v; break; } continue; } const score = computeScore(v); if (score > bestScore) { bestScore = score; targetKey = key.name; targetRecord = v; } } if (!targetKey || !targetRecord) { return { ok: false, error: `\u96F6\u4EF6 ${input.canonical_id} \u7121\u53EF\u7528\u7248\u672C\u8A18\u9304` }; } const version2 = String(targetRecord.version ?? "v1"); const canonicalId = String(targetRecord.canonical_id ?? input.canonical_id); const statsKey = `stats:${hashId}:${version2}`; let counters = { total_runs: 0, success_runs: 0, total_ms: 0 }; const rawStats = await env2.ANALYTICS_KV.get(statsKey); if (rawStats) { try { const parsed = JSON.parse(rawStats); counters = { total_runs: Number(parsed.total_runs) || 0, success_runs: Number(parsed.success_runs) || 0, total_ms: Number(parsed.total_ms) || 0 }; } catch { } } counters.total_runs += 1; counters.success_runs += input.success ? 1 : 0; counters.total_ms += Math.max(0, Number(input.duration_ms) || 0); await env2.ANALYTICS_KV.put(statsKey, JSON.stringify(counters)); const successRate = counters.success_runs / counters.total_runs; const avgDurationMs = Math.round(counters.total_ms / counters.total_runs); targetRecord.success_rate = successRate; targetRecord.avg_duration_ms = avgDurationMs; targetRecord.call_count = counters.total_runs; await env2.SUBMISSIONS_KV.put(targetKey, JSON.stringify(targetRecord)); return { ok: true, canonical_id: canonicalId, version: version2, total_runs: counters.total_runs, success_runs: counters.success_runs, success_rate: successRate, avg_duration_ms: avgDurationMs }; } __name(recordAnalytics, "recordAnalytics"); // src/routes/analytics.ts var app6 = new Hono2(); app6.post("/record", async (c) => { const body = await c.req.json().catch(() => null); if (!body || typeof body.canonical_id !== "string" || body.canonical_id.trim() === "") { return c.json({ ok: false, error: "canonical_id \u5FC5\u586B" }, 400); } if (typeof body.success !== "boolean") { return c.json({ ok: false, error: "success \u5FC5\u9808\u70BA boolean" }, 400); } const result = await recordAnalytics({ canonical_id: body.canonical_id.trim(), version: typeof body.version === "string" && body.version !== "" ? body.version : void 0, success: body.success, duration_ms: typeof body.duration_ms === "number" ? body.duration_ms : 0 }, c.env); if (!result.ok) return c.json(result, 404); return c.json(result); }); var analytics_default = app6; // src/index.ts var app7 = new Hono2(); app7.use("*", cors()); app7.get("/", (c) => c.json({ service: "component-registry", version: "1.0.0", status: "ok" })); app7.route("/components/guide", guide_default); app7.route("/components/validate-contract", validateContract_default); app7.route("/components", query_default); app7.route("/components", components_default); app7.route("/init", init_default); app7.route("/analytics", analytics_default); var index_default = app7; export { index_default as default }; //# sourceMappingURL=index.js.map