0a043701d0
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
8310 lines
245 KiB
JavaScript
8310 lines
245 KiB
JavaScript
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(
|
||
* <html>
|
||
* <body>
|
||
* <p>{content}</p>
|
||
* </body>
|
||
* </html>
|
||
* )
|
||
* })
|
||
* 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>} 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 extends ZodObjectDef>(def: Def) =>
|
||
// <Augmentation extends ZodRawShape>(
|
||
// augmentation: Augmentation
|
||
// ): ZodObject<
|
||
// extendShape<ReturnType<Def["shape"]>, Augmentation>,
|
||
// Def["unknownKeys"],
|
||
// Def["catchall"]
|
||
// > => {
|
||
// return new ZodObject({
|
||
// ...def,
|
||
// shape: () => ({
|
||
// ...def.shape(),
|
||
// ...augmentation,
|
||
// }),
|
||
// }) as any;
|
||
// };
|
||
extend(augmentation) {
|
||
return new _ZodObject({
|
||
...this._def,
|
||
shape: /* @__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<T, ReturnType<Incoming["_def"]["shape"]>>,
|
||
// Incoming["_def"]["unknownKeys"],
|
||
// Incoming["_def"]["catchall"],
|
||
// NewOutput,
|
||
// NewInput
|
||
// > {
|
||
// const merged: any = new ZodObject({
|
||
// unknownKeys: merging._def.unknownKeys,
|
||
// catchall: merging._def.catchall,
|
||
// shape: () =>
|
||
// objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),
|
||
// typeName: ZodFirstPartyTypeKind.ZodObject,
|
||
// }) as any;
|
||
// return merged;
|
||
// }
|
||
setKey(key, schema) {
|
||
return this.augment({ [key]: schema });
|
||
}
|
||
// merge<Incoming extends AnyZodObject>(
|
||
// merging: Incoming
|
||
// ): //ZodObject<T & Incoming["_shape"], UnknownKeys, Catchall> = (merging) => {
|
||
// ZodObject<
|
||
// extendShape<T, ReturnType<Incoming["_def"]["shape"]>>,
|
||
// Incoming["_def"]["unknownKeys"],
|
||
// Incoming["_def"]["catchall"]
|
||
// > {
|
||
// // const mergedShape = objectUtil.mergeShapes(
|
||
// // this._def.shape(),
|
||
// // merging._def.shape()
|
||
// // );
|
||
// const merged: any = new ZodObject({
|
||
// unknownKeys: merging._def.unknownKeys,
|
||
// catchall: merging._def.catchall,
|
||
// shape: () =>
|
||
// objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),
|
||
// typeName: ZodFirstPartyTypeKind.ZodObject,
|
||
// }) as any;
|
||
// return merged;
|
||
// }
|
||
catchall(index) {
|
||
return new _ZodObject({
|
||
...this._def,
|
||
catchall: index
|
||
});
|
||
}
|
||
pick(mask) {
|
||
const shape = {};
|
||
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
|