diff options
| -rw-r--r-- | .ci/.gitignore | 2 | ||||
| -rwxr-xr-x | .ci/ci.cjs | 5139 | ||||
| -rw-r--r-- | .ci/ci.json | 3 | ||||
| -rw-r--r-- | .ci/ci.ts | 67 | ||||
| -rw-r--r-- | .ci/package-lock.json | 544 | ||||
| -rw-r--r-- | .ci/package.json | 17 | ||||
| -rw-r--r-- | .ci/tsconfig.json | 28 | ||||
| -rw-r--r-- | .demo/index.html | 48 | ||||
| -rw-r--r-- | .dockerignore | 7 | ||||
| -rw-r--r-- | .gitignore | 32 | ||||
| -rw-r--r-- | Dockerfile | 10 | ||||
| -rw-r--r-- | index.html | 593 | ||||
| -rw-r--r-- | nginx.conf | 81 | ||||
| -rw-r--r-- | static/css/style.css | 1096 | ||||
| -rw-r--r-- | static/fonts/Maple.woff2 | bin | 0 -> 73444 bytes | |||
| -rw-r--r-- | static/img/bg.png | bin | 0 -> 47672 bytes | |||
| -rw-r--r-- | static/img/coffee.svg | 1 | ||||
| -rw-r--r-- | static/img/favicon.ico | bin | 0 -> 32243 bytes | |||
| -rw-r--r-- | static/js/script.js | 76 | ||||
| -rw-r--r-- | static/oneko/oneko.gif | bin | 0 -> 3316 bytes | |||
| -rw-r--r-- | static/oneko/oneko.js | 284 |
21 files changed, 8028 insertions, 0 deletions
diff --git a/.ci/.gitignore b/.ci/.gitignore new file mode 100644 index 0000000..f06235c --- /dev/null +++ b/.ci/.gitignore @@ -0,0 +1,2 @@ +node_modules +dist diff --git a/.ci/ci.cjs b/.ci/ci.cjs new file mode 100755 index 0000000..8153961 --- /dev/null +++ b/.ci/ci.cjs @@ -0,0 +1,5139 @@ +#!/usr/bin/env node +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); + +// node_modules/@emprespresso/pengueno/dist/leftpadesque/prepend.js +var require_prepend = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/leftpadesque/prepend.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.prependWith = void 0; + var prependWith = (arr, prep) => Array(arr.length * 2).fill(0).map((_, i) => i % 2 === 0).map((isPrep, i) => isPrep ? prep : arr[Math.floor(i / 2)]); + exports2.prependWith = prependWith; + } +}); + +// node_modules/@emprespresso/pengueno/dist/leftpadesque/debug.js +var require_debug = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/leftpadesque/debug.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.isDebug = exports2.isProd = void 0; + var _hasEnv = true; + var _env = _hasEnv && (process.env.ENVIRONMENT ?? "").toLowerCase().includes("prod") ? "production" : "development"; + var isProd = () => _env === "production"; + exports2.isProd = isProd; + var _debug = !(0, exports2.isProd)() || _hasEnv && ["y", "t"].some((process.env.DEBUG ?? "").toLowerCase().startsWith); + var isDebug = () => _debug; + exports2.isDebug = isDebug; + } +}); + +// node_modules/@emprespresso/pengueno/dist/leftpadesque/memoize.js +var require_memoize = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/leftpadesque/memoize.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.memoize = void 0; + var memoize = (fn) => { + const cache = /* @__PURE__ */ new Map(); + return (...args) => { + const key = JSON.stringify(args); + if (cache.has(key)) { + return cache.get(key); + } + const res = fn(...args); + cache.set(key, res); + return res; + }; + }; + exports2.memoize = memoize; + } +}); + +// node_modules/@emprespresso/pengueno/dist/leftpadesque/index.js +var require_leftpadesque = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/leftpadesque/index.js"(exports2) { + "use strict"; + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + }); + var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + __exportStar(require_prepend(), exports2); + __exportStar(require_debug(), exports2); + __exportStar(require_memoize(), exports2); + } +}); + +// node_modules/@emprespresso/pengueno/dist/types/misc.js +var require_misc = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/types/misc.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + } +}); + +// node_modules/@emprespresso/pengueno/dist/types/object.js +var require_object = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/types/object.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.isObject = void 0; + var isObject3 = (o) => typeof o === "object" && !Array.isArray(o) && !!o; + exports2.isObject = isObject3; + } +}); + +// node_modules/@emprespresso/pengueno/dist/types/tagged.js +var require_tagged = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/types/tagged.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.isTagged = void 0; + var index_1 = require_types(); + var isTagged = (o, tag) => !!((0, index_1.isObject)(o) && "_tag" in o && o._tag === tag); + exports2.isTagged = isTagged; + } +}); + +// node_modules/@emprespresso/pengueno/dist/types/fn/callable.js +var require_callable = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/types/fn/callable.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + } +}); + +// node_modules/@emprespresso/pengueno/dist/types/fn/optional.js +var require_optional = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/types/fn/optional.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.Optional = exports2.IOptionalEmptyError = exports2.isOptional = exports2.IOptionalTag = void 0; + var pengueno_1 = require_dist2(); + exports2.IOptionalTag = "IOptional"; + var isOptional = (o) => (0, pengueno_1.isTagged)(o, exports2.IOptionalTag); + exports2.isOptional = isOptional; + var IOptionalEmptyError = class extends Error { + }; + exports2.IOptionalEmptyError = IOptionalEmptyError; + var OSomeTag = "O.Some"; + var ONoneTag = "O.None"; + var isNone = (o) => (0, pengueno_1.isTagged)(o, ONoneTag); + var isSome = (o) => (0, pengueno_1.isTagged)(o, OSomeTag); + var _Tagged = class { + _tag; + constructor(_tag = exports2.IOptionalTag) { + this._tag = _tag; + } + }; + var Optional = class _Optional extends _Tagged { + self; + constructor(self) { + super(); + this.self = self; + } + move(t) { + return this.map(() => t); + } + orSome(supplier) { + if (isNone(this.self)) + return _Optional.from(supplier()); + return this; + } + get() { + if (isNone(this.self)) + throw new IOptionalEmptyError("called get() on None optional"); + return this.self.value; + } + filter(mapper) { + if (isNone(this.self) || !mapper(this.self.value)) + return _Optional.none(); + return _Optional.some(this.self.value); + } + map(mapper) { + if (isNone(this.self)) + return _Optional.none(); + return _Optional.from(mapper(this.self.value)); + } + flatMap(mapper) { + if (isNone(this.self)) + return _Optional.none(); + return _Optional.from(mapper(this.self.value)).orSome(() => _Optional.none()).get(); + } + present() { + return isSome(this.self); + } + *[Symbol.iterator]() { + if (isSome(this.self)) + yield this.self.value; + } + static some(value) { + return new _Optional({ value, _tag: OSomeTag }); + } + static _none = new _Optional({ _tag: ONoneTag }); + static none() { + return this._none; + } + static from(value) { + if (value === null || value === void 0) + return _Optional.none(); + return _Optional.some(value); + } + }; + exports2.Optional = Optional; + } +}); + +// node_modules/@emprespresso/pengueno/dist/types/fn/either.js +var require_either = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/types/fn/either.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.Either = exports2.isRight = exports2.isLeft = exports2.isEither = exports2.IEitherTag = void 0; + var pengueno_1 = require_dist2(); + exports2.IEitherTag = "IEither"; + var isEither = (o) => (0, pengueno_1.isTagged)(o, exports2.IEitherTag); + exports2.isEither = isEither; + var ELeftTag = "E.Left"; + var isLeft = (o) => (0, pengueno_1.isTagged)(o, ELeftTag); + exports2.isLeft = isLeft; + var ERightTag = "E.Right"; + var isRight = (o) => (0, pengueno_1.isTagged)(o, ERightTag); + exports2.isRight = isRight; + var _Tagged = class { + _tag; + constructor(_tag = exports2.IEitherTag) { + this._tag = _tag; + } + }; + var Either2 = class _Either extends _Tagged { + self; + constructor(self) { + super(); + this.self = self; + } + moveRight(t) { + return this.mapRight(() => t); + } + mapBoth(errBranch, okBranch) { + if ((0, exports2.isLeft)(this.self)) + return _Either.left(errBranch(this.self.err)); + return _Either.right(okBranch(this.self.ok)); + } + mapRight(mapper) { + if ((0, exports2.isRight)(this.self)) + return _Either.right(mapper(this.self.ok)); + return _Either.left(this.self.err); + } + mapLeft(mapper) { + if ((0, exports2.isLeft)(this.self)) + return _Either.left(mapper(this.self.err)); + return _Either.right(this.self.ok); + } + flatMap(mapper) { + if ((0, exports2.isRight)(this.self)) + return mapper(this.self.ok); + return _Either.left(this.self.err); + } + filter(mapper) { + if ((0, exports2.isLeft)(this.self)) + return _Either.left(this.self.err); + return _Either.fromFailable(() => this.right().filter(mapper).get()); + } + async flatMapAsync(mapper) { + if ((0, exports2.isLeft)(this.self)) + return Promise.resolve(_Either.left(this.self.err)); + return await mapper(this.self.ok).catch((err) => _Either.left(err)); + } + fold(leftFolder, rightFolder) { + if ((0, exports2.isLeft)(this.self)) + return leftFolder(this.self.err); + return rightFolder(this.self.ok); + } + left() { + if ((0, exports2.isLeft)(this.self)) + return pengueno_1.Optional.from(this.self.err); + return pengueno_1.Optional.none(); + } + right() { + if ((0, exports2.isRight)(this.self)) + return pengueno_1.Optional.from(this.self.ok); + return pengueno_1.Optional.none(); + } + joinRight(other, mapper) { + return this.flatMap((t) => other.mapRight((o) => mapper(o, t))); + } + joinRightAsync(other, mapper) { + return this.flatMapAsync(async (t) => { + const o = typeof other === "function" ? other() : other; + return await o.then((other2) => other2.mapRight((o2) => mapper(o2, t))); + }); + } + swap() { + if ((0, exports2.isRight)(this.self)) + return _Either.left(this.self.ok); + return _Either.right(this.self.err); + } + static left(e) { + return new _Either({ err: e, _tag: ELeftTag }); + } + static right(t) { + return new _Either({ ok: t, _tag: ERightTag }); + } + static fromFailable(s) { + try { + return _Either.right(s()); + } catch (e) { + return _Either.left(e); + } + } + static async fromFailableAsync(s) { + return await (typeof s === "function" ? s() : s).then((t) => _Either.right(t)).catch((e) => _Either.left(e)); + } + static async retrying(s, attempts = 3, interval = (attempt) => _Either.attemptWait(attempt)) { + let result = _Either.right(new Error("No attempts made")); + for (let attempt = 0; attempt < attempts && result.right().present(); attempt++) { + await interval(attempt); + const currentAttempt = await s().then((s2) => s2.swap()); + result = await result.joinRightAsync(() => Promise.resolve(currentAttempt), (res, _prevError) => res); + } + return result.swap(); + } + static attemptWait(attempt, backoffFactor = 500, jitter = 300, exponent = 1.3) { + if (attempt === 0) { + return Promise.resolve(); + } + const wait = Math.pow(exponent, attempt) * backoffFactor + jitter * Math.random() * Math.pow(exponent, attempt); + return new Promise((res) => setTimeout(res, wait)); + } + }; + exports2.Either = Either2; + } +}); + +// node_modules/@emprespresso/pengueno/dist/types/fn/index.js +var require_fn = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/types/fn/index.js"(exports2) { + "use strict"; + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + }); + var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + __exportStar(require_callable(), exports2); + __exportStar(require_optional(), exports2); + __exportStar(require_either(), exports2); + } +}); + +// node_modules/@emprespresso/pengueno/dist/types/collections/cons.js +var require_cons = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/types/collections/cons.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ListZipper = exports2.Cons = void 0; + var pengueno_1 = require_dist2(); + var Cons = class _Cons { + value; + next; + constructor(value, next = pengueno_1.Optional.none()) { + this.value = value; + this.next = next; + } + before(head) { + return new _Cons(this.value, head); + } + replace(_value) { + return new _Cons(_value, this.next); + } + *[Symbol.iterator]() { + for (let cur = pengueno_1.Optional.some(this); cur.present(); cur = cur.flatMap((cur2) => cur2.next)) { + yield cur.get().value; + } + } + static addOnto(items, tail) { + return Array.from(items).reverse().reduce((cons, value) => pengueno_1.Optional.from(new _Cons(value, cons)), tail); + } + static from(items) { + return _Cons.addOnto(items, pengueno_1.Optional.none()); + } + }; + exports2.Cons = Cons; + var ListZipper = class _ListZipper { + reversedPathToHead; + currentHead; + constructor(reversedPathToHead, currentHead) { + this.reversedPathToHead = reversedPathToHead; + this.currentHead = currentHead; + } + read() { + return this.currentHead.map(({ value }) => value); + } + next() { + return this.currentHead.map((head) => new _ListZipper(pengueno_1.Optional.some(head.before(this.reversedPathToHead)), head.next)); + } + previous() { + return this.reversedPathToHead.map((lastVisited) => new _ListZipper(lastVisited.next, pengueno_1.Optional.some(lastVisited.before(this.currentHead)))); + } + prependChunk(values) { + return new _ListZipper(Cons.addOnto(Array.from(values).reverse(), this.reversedPathToHead), this.currentHead); + } + prepend(value) { + return this.prependChunk([value]); + } + remove() { + const newHead = this.currentHead.flatMap((right) => right.next); + return new _ListZipper(this.reversedPathToHead, newHead); + } + replace(value) { + const newHead = this.currentHead.map((right) => right.replace(value)); + return new _ListZipper(this.reversedPathToHead, newHead); + } + *[Symbol.iterator]() { + let head = this; + for (let prev = head.previous(); prev.present(); prev = prev.flatMap((p) => p.previous())) { + head = prev.get(); + } + if (head.currentHead.present()) + yield* head.currentHead.get(); + } + collection() { + return Array.from(this); + } + static from(iterable) { + return new _ListZipper(pengueno_1.Optional.none(), Cons.from(iterable)); + } + }; + exports2.ListZipper = ListZipper; + } +}); + +// node_modules/@emprespresso/pengueno/dist/types/collections/jsonds.js +var require_jsonds = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/types/collections/jsonds.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.JSONHashMap = exports2.JSONSet = void 0; + var JSONSet = class { + items; + constructor(items = /* @__PURE__ */ new Set()) { + this.items = items; + } + add(item) { + const itemJson = JSON.stringify(item, Object.keys(item).sort()); + this.items.add(itemJson); + } + has(item) { + const itemJson = JSON.stringify(item, Object.keys(item).sort()); + return this.items.has(itemJson); + } + delete(item) { + const itemJson = JSON.stringify(item, Object.keys(item).sort()); + return this.items.delete(itemJson); + } + clear() { + this.items.clear(); + } + size() { + return this.items.size; + } + }; + exports2.JSONSet = JSONSet; + var JSONHashMap = class { + map; + constructor(map = /* @__PURE__ */ new Map()) { + this.map = map; + } + set(key, value) { + const keyJson = JSON.stringify(key, Object.keys(key).sort()); + this.map.set(keyJson, value); + } + get(key) { + const keyJson = JSON.stringify(key, Object.keys(key).sort()); + return this.map.get(keyJson); + } + has(key) { + const keyJson = JSON.stringify(key, Object.keys(key).sort()); + return this.map.has(keyJson); + } + keys() { + return Array.from(this.map.keys()).map((x) => JSON.parse(x)); + } + delete(key) { + const keyJson = JSON.stringify(key, Object.keys(key).sort()); + return this.map.delete(keyJson); + } + clear() { + this.map.clear(); + } + size() { + return this.map.size; + } + }; + exports2.JSONHashMap = JSONHashMap; + } +}); + +// node_modules/@emprespresso/pengueno/dist/types/collections/index.js +var require_collections = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/types/collections/index.js"(exports2) { + "use strict"; + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + }); + var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + __exportStar(require_cons(), exports2); + __exportStar(require_jsonds(), exports2); + } +}); + +// node_modules/@emprespresso/pengueno/dist/types/index.js +var require_types = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/types/index.js"(exports2) { + "use strict"; + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + }); + var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + __exportStar(require_misc(), exports2); + __exportStar(require_object(), exports2); + __exportStar(require_tagged(), exports2); + __exportStar(require_fn(), exports2); + __exportStar(require_collections(), exports2); + } +}); + +// node_modules/@emprespresso/pengueno/dist/trace/itrace.js +var require_itrace = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/trace/itrace.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.TraceableImpl = void 0; + var TraceableImpl = class _TraceableImpl { + item; + trace; + constructor(item, trace) { + this.item = item; + this.trace = trace; + } + map(mapper) { + const result = mapper(this); + return new _TraceableImpl(result, this.trace); + } + coExtend(mapper) { + const results = mapper(this); + return Array.from(results).map((result) => this.move(result)); + } + flatMap(mapper) { + return mapper(this); + } + flatMapAsync(mapper) { + return new _TraceableImpl(mapper(this).then((t) => t.get()), this.trace); + } + traceScope(mapper) { + return new _TraceableImpl(this.get(), this.trace.traceScope(mapper(this))); + } + peek(peek) { + peek(this); + return this; + } + move(t) { + return this.map(() => t); + } + bimap(mapper) { + const { item, trace: _trace } = mapper(this); + return this.move(item).traceScope(() => _trace); + } + get() { + return this.item; + } + }; + exports2.TraceableImpl = TraceableImpl; + } +}); + +// node_modules/@emprespresso/pengueno/dist/trace/metric/emittable.js +var require_emittable = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/trace/metric/emittable.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.EmittableMetric = void 0; + var index_1 = require_metric2(); + var EmittableMetric = class { + name; + unit; + constructor(name, unit) { + this.name = name; + this.unit = unit; + } + withValue(value) { + return { + name: this.name, + unit: this.unit, + emissionTimestamp: Date.now(), + value, + _tag: index_1.MetricValueTag + }; + } + }; + exports2.EmittableMetric = EmittableMetric; + } +}); + +// node_modules/@emprespresso/pengueno/dist/trace/metric/metric.js +var require_metric = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/trace/metric/metric.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ResultMetric = exports2.Metric = void 0; + var index_1 = require_metric2(); + var _Tagged = class { + _tag; + constructor(_tag = index_1.IMetricTag) { + this._tag = _tag; + } + }; + var Metric = class _Metric extends _Tagged { + name; + parent; + count; + time; + static DELIM = "."; + constructor(name, parent = void 0, count = new index_1.EmittableMetric(_Metric.join(name, "count"), index_1.Unit.COUNT), time = new index_1.EmittableMetric(_Metric.join(name, "time"), index_1.Unit.MILLISECONDS)) { + super(); + this.name = name; + this.parent = parent; + this.count = count; + this.time = time; + } + child(_name) { + const childName = _Metric.join(this.name, _name); + return new _Metric(childName, this); + } + asResult() { + return ResultMetric.from(this); + } + static join(...name) { + return name.join(_Metric.DELIM); + } + static fromName(name) { + return new _Metric(name); + } + }; + exports2.Metric = Metric; + var ResultMetric = class _ResultMetric extends Metric { + name; + parent; + failure; + success; + warn; + constructor(name, parent = void 0, failure, success, warn) { + super(name, parent); + this.name = name; + this.parent = parent; + this.failure = failure; + this.success = success; + this.warn = warn; + } + static from(metric) { + const failure = metric.child("failure"); + const success = metric.child("success"); + const warn = metric.child("warn"); + return new _ResultMetric(metric.name, metric.parent, failure, success, warn); + } + }; + exports2.ResultMetric = ResultMetric; + } +}); + +// node_modules/@emprespresso/pengueno/dist/trace/metric/trace.js +var require_trace = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/trace/metric/trace.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.MetricsTrace = exports2.isMetricsTraceSupplier = void 0; + var pengueno_1 = require_dist2(); + var isMetricsTraceSupplier = (t) => (0, pengueno_1.isMetricValue)(t) || (0, pengueno_1.isIMetric)(t) || Array.isArray(t) && t.every((_m) => (0, pengueno_1.isMetricValue)(_m) || (0, pengueno_1.isIMetric)(_m)); + exports2.isMetricsTraceSupplier = isMetricsTraceSupplier; + var MetricsTrace = class _MetricsTrace { + metricConsumer; + activeTraces; + completedTraces; + constructor(metricConsumer, activeTraces = /* @__PURE__ */ new Map(), completedTraces = /* @__PURE__ */ new Set()) { + this.metricConsumer = metricConsumer; + this.activeTraces = activeTraces; + this.completedTraces = completedTraces; + } + traceScope(trace) { + const now = Date.now(); + const metricsToTrace = (Array.isArray(trace) ? trace : [trace]).filter(pengueno_1.isIMetric); + const initialTraces = new Map(metricsToTrace.map((metric) => [metric.name, now])); + return new _MetricsTrace(this.metricConsumer, initialTraces, this.completedTraces); + } + trace(metrics) { + if (!metrics || typeof metrics === "string") { + return this; + } + const now = Date.now(); + const allMetrics = Array.isArray(metrics) ? metrics : [metrics]; + const valuesToEmit = allMetrics.filter(pengueno_1.isMetricValue); + const traceableMetrics = allMetrics.filter(pengueno_1.isIMetric); + const metricsToStart = traceableMetrics.filter((m) => !this.activeTraces.has(m.name)); + const metricsToEnd = traceableMetrics.filter((m) => this.activeTraces.has(m.name) && !this.completedTraces.has(m.name)); + const endedMetricValues = metricsToEnd.flatMap((metric) => [ + metric.count.withValue(1), + metric.time.withValue(now - this.activeTraces.get(metric.name)) + ]); + const parentBasedMetrics = metricsToStart.filter((metric) => { + const parent = metric.parent; + return parent && this.activeTraces.has(parent.name); + }); + const parentBasedValues = parentBasedMetrics.flatMap((metric) => { + const parentStart = this.activeTraces.get(metric.parent.name); + return [metric.count.withValue(1), metric.time.withValue(now - parentStart)]; + }); + const allMetricsToEmit = [...valuesToEmit, ...endedMetricValues, ...parentBasedValues]; + if (allMetricsToEmit.length > 0) { + this.metricConsumer(allMetricsToEmit); + } + const nextActiveTraces = new Map([ + ...this.activeTraces, + ...metricsToStart.map((m) => [m.name, now]) + ]); + const nextCompletedTraces = /* @__PURE__ */ new Set([ + ...this.completedTraces, + ...metricsToEnd.map((m) => m.name), + ...parentBasedMetrics.map((m) => m.name) + ]); + return new _MetricsTrace(this.metricConsumer, nextActiveTraces, nextCompletedTraces); + } + }; + exports2.MetricsTrace = MetricsTrace; + } +}); + +// node_modules/@emprespresso/pengueno/dist/trace/metric/index.js +var require_metric2 = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/trace/metric/index.js"(exports2) { + "use strict"; + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + }); + var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.isIMetric = exports2.IMetricTag = exports2.isMetricValue = exports2.MetricValueTag = exports2.Unit = void 0; + var pengueno_1 = require_dist2(); + var Unit; + (function(Unit2) { + Unit2["COUNT"] = "COUNT"; + Unit2["MILLISECONDS"] = "MILLISECONDS"; + })(Unit || (exports2.Unit = Unit = {})); + exports2.MetricValueTag = "MetricValue"; + var isMetricValue = (t) => (0, pengueno_1.isTagged)(t, exports2.MetricValueTag); + exports2.isMetricValue = isMetricValue; + exports2.IMetricTag = "IMetric"; + var isIMetric = (t) => (0, pengueno_1.isTagged)(t, exports2.IMetricTag); + exports2.isIMetric = isIMetric; + __exportStar(require_emittable(), exports2); + __exportStar(require_metric(), exports2); + __exportStar(require_trace(), exports2); + } +}); + +// node_modules/@emprespresso/pengueno/dist/trace/log/ansi.js +var require_ansi = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/trace/log/ansi.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ANSI = void 0; + exports2.ANSI = { + RESET: "\x1B[0m", + BOLD: "\x1B[1m", + DIM: "\x1B[2m", + RED: "\x1B[31m", + GREEN: "\x1B[32m", + YELLOW: "\x1B[33m", + BLUE: "\x1B[34m", + MAGENTA: "\x1B[35m", + CYAN: "\x1B[36m", + WHITE: "\x1B[37m", + BRIGHT_RED: "\x1B[91m", + BRIGHT_YELLOW: "\x1B[93m", + GRAY: "\x1B[90m" + }; + } +}); + +// node_modules/@emprespresso/pengueno/dist/trace/log/level.js +var require_level = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/trace/log/level.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.isLogLevel = exports2.logLevelOrder = exports2.LogLevel = void 0; + var LogLevel; + (function(LogLevel2) { + LogLevel2["UNKNOWN"] = "UNKNOWN"; + LogLevel2["INFO"] = "INFO"; + LogLevel2["WARN"] = "WARN"; + LogLevel2["DEBUG"] = "DEBUG"; + LogLevel2["ERROR"] = "ERROR"; + LogLevel2["SYS"] = "SYS"; + })(LogLevel || (exports2.LogLevel = LogLevel = {})); + exports2.logLevelOrder = [ + LogLevel.DEBUG, + LogLevel.INFO, + LogLevel.WARN, + LogLevel.ERROR, + LogLevel.SYS + ]; + var isLogLevel = (l) => typeof l === "string" && exports2.logLevelOrder.some((level) => level === l); + exports2.isLogLevel = isLogLevel; + } +}); + +// node_modules/@emprespresso/pengueno/dist/trace/log/logger.js +var require_logger = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/trace/log/logger.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + } +}); + +// node_modules/@emprespresso/pengueno/dist/trace/log/pretty_json_console.js +var require_pretty_json_console = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/trace/log/pretty_json_console.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.PrettyJsonConsoleLogger = void 0; + var index_1 = require_log(); + var PrettyJsonConsoleLogger = class { + log(level, ...trace) { + const message = JSON.stringify({ + level, + trace + }, null, 4); + const styled = `${this.getStyle(level)}${message}${index_1.ANSI.RESET} +`; + this.getStream(level)(styled); + } + getStream(level) { + if (level === index_1.LogLevel.ERROR) { + return console.error; + } + return console.log; + } + getStyle(level) { + switch (level) { + case index_1.LogLevel.UNKNOWN: + case index_1.LogLevel.INFO: + return `${index_1.ANSI.MAGENTA}`; + case index_1.LogLevel.DEBUG: + return `${index_1.ANSI.CYAN}`; + case index_1.LogLevel.WARN: + return `${index_1.ANSI.BRIGHT_YELLOW}`; + case index_1.LogLevel.ERROR: + return `${index_1.ANSI.BRIGHT_RED}`; + case index_1.LogLevel.SYS: + return `${index_1.ANSI.DIM}${index_1.ANSI.BLUE}`; + } + } + }; + exports2.PrettyJsonConsoleLogger = PrettyJsonConsoleLogger; + } +}); + +// node_modules/@emprespresso/pengueno/dist/trace/log/trace.js +var require_trace2 = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/trace/log/trace.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.LogTrace = void 0; + var pengueno_1 = require_dist2(); + var index_1 = require_log(); + var LogTrace = class _LogTrace { + logger; + traces; + defaultLevel; + allowedLevels; + constructor(logger = new index_1.PrettyJsonConsoleLogger(), traces = [defaultTrace], defaultLevel = index_1.LogLevel.INFO, allowedLevels = defaultAllowedLevelsSupplier) { + this.logger = logger; + this.traces = traces; + this.defaultLevel = defaultLevel; + this.allowedLevels = allowedLevels; + } + traceScope(trace) { + return new _LogTrace(this.logger, this.traces.concat(trace), this.defaultLevel, this.allowedLevels); + } + trace(trace) { + const { traces, level: _level } = this.foldTraces(this.traces.concat(trace)); + if (!this.allowedLevels().has(_level)) + return; + const level = _level === index_1.LogLevel.UNKNOWN ? this.defaultLevel : _level; + this.logger.log(level, ...traces); + } + foldTraces(_traces) { + const _logTraces = _traces.map((trace) => typeof trace === "function" ? trace() : trace); + const _level = _logTraces.filter((trace) => (0, index_1.isLogLevel)(trace)).reduce((acc, level2) => Math.max(index_1.logLevelOrder.indexOf(level2), acc), -1); + const level = index_1.logLevelOrder[_level] ?? index_1.LogLevel.UNKNOWN; + const traces = _logTraces.filter((trace) => !(0, index_1.isLogLevel)(trace)).map((trace) => { + if (typeof trace === "object") { + return `TracedException.Name = ${trace.name}, TracedException.Message = ${trace.message}, TracedException.Stack = ${trace.stack}`; + } + return trace; + }); + return { + level, + traces + }; + } + }; + exports2.LogTrace = LogTrace; + var defaultTrace = () => `TimeStamp = ${(/* @__PURE__ */ new Date()).toISOString()}`; + var defaultAllowedLevels = (0, pengueno_1.memoize)((isDebug) => /* @__PURE__ */ new Set([ + index_1.LogLevel.UNKNOWN, + ...isDebug ? [index_1.LogLevel.DEBUG] : [], + index_1.LogLevel.INFO, + index_1.LogLevel.WARN, + index_1.LogLevel.ERROR, + index_1.LogLevel.SYS + ])); + var defaultAllowedLevelsSupplier = () => defaultAllowedLevels((0, pengueno_1.isDebug)()); + } +}); + +// node_modules/@emprespresso/pengueno/dist/trace/log/index.js +var require_log = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/trace/log/index.js"(exports2) { + "use strict"; + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + }); + var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + __exportStar(require_ansi(), exports2); + __exportStar(require_level(), exports2); + __exportStar(require_logger(), exports2); + __exportStar(require_pretty_json_console(), exports2); + __exportStar(require_trace2(), exports2); + } +}); + +// node_modules/@emprespresso/pengueno/dist/trace/trace.js +var require_trace3 = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/trace/trace.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.LogMetricTraceable = exports2.LogMetricTrace = exports2.EmbeddedMetricsTraceable = exports2.LogTraceable = void 0; + var _1 = require_trace4(); + var LogTraceable = class _LogTraceable extends _1.TraceableImpl { + static LogTrace = new _1.LogTrace(); + static of(t) { + return new _LogTraceable(t, _LogTraceable.LogTrace); + } + }; + exports2.LogTraceable = LogTraceable; + var getEmbeddedMetricConsumer = (logTrace) => (metrics) => { + if (metrics.length === 0) + return; + logTrace.traceScope(_1.LogLevel.SYS).trace(`Metrics = <metrics>${JSON.stringify(metrics)}</metrics>`); + }; + var EmbeddedMetricsTraceable = class _EmbeddedMetricsTraceable extends _1.TraceableImpl { + static MetricsTrace = new _1.MetricsTrace(getEmbeddedMetricConsumer(LogTraceable.LogTrace)); + static of(t, metricsTrace = _EmbeddedMetricsTraceable.MetricsTrace) { + return new _EmbeddedMetricsTraceable(t, metricsTrace); + } + }; + exports2.EmbeddedMetricsTraceable = EmbeddedMetricsTraceable; + var LogMetricTrace = class _LogMetricTrace { + logTrace; + metricsTrace; + constructor(logTrace, metricsTrace) { + this.logTrace = logTrace; + this.metricsTrace = metricsTrace; + } + traceScope(trace) { + if ((0, _1.isMetricsTraceSupplier)(trace)) { + return new _LogMetricTrace(this.logTrace, this.metricsTrace.traceScope(trace)); + } + return new _LogMetricTrace(this.logTrace.traceScope(trace), this.metricsTrace); + } + trace(trace) { + if ((0, _1.isMetricsTraceSupplier)(trace)) { + this.metricsTrace.trace(trace); + return this; + } + this.logTrace.trace(trace); + return this; + } + }; + exports2.LogMetricTrace = LogMetricTrace; + var LogMetricTraceable = class _LogMetricTraceable extends _1.TraceableImpl { + static ofLogTraceable(t) { + const metricsTrace = new _1.MetricsTrace(getEmbeddedMetricConsumer(t.trace)); + return new _LogMetricTraceable(t.get(), new LogMetricTrace(t.trace, metricsTrace)); + } + static of(t) { + const logTrace = LogTraceable.of(t); + return _LogMetricTraceable.ofLogTraceable(logTrace); + } + }; + exports2.LogMetricTraceable = LogMetricTraceable; + } +}); + +// node_modules/@emprespresso/pengueno/dist/trace/util.js +var require_util = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/trace/util.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.TraceUtil = void 0; + var pengueno_1 = require_dist2(); + var TraceUtil = class _TraceUtil { + static promiseify(mapper) { + return (traceablePromise) => traceablePromise.flatMapAsync(async (t) => t.move(await t.get()).map(mapper)).get(); + } + static traceResultingEither(metric, warnOnFailure = false) { + return (t) => { + if (metric) + t.trace.trace(t.get().fold((_err) => warnOnFailure ? metric.warn : metric.failure, (_ok) => metric.success)); + return t.traceScope((_t) => _t.get().fold((_err) => warnOnFailure ? pengueno_1.LogLevel.WARN : pengueno_1.LogLevel.ERROR, (_ok) => pengueno_1.LogLevel.INFO)); + }; + } + static withTrace(trace) { + return (t) => t.traceScope(() => trace); + } + static withMetricTrace(metric) { + return _TraceUtil.withTrace(metric); + } + static withFunctionTrace(f) { + return _TraceUtil.withTrace(`fn.${f.name}`); + } + static withClassTrace(c) { + return _TraceUtil.withTrace(`class.${c.constructor.name}`); + } + }; + exports2.TraceUtil = TraceUtil; + } +}); + +// node_modules/@emprespresso/pengueno/dist/trace/index.js +var require_trace4 = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/trace/index.js"(exports2) { + "use strict"; + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + }); + var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + __exportStar(require_itrace(), exports2); + __exportStar(require_metric2(), exports2); + __exportStar(require_log(), exports2); + __exportStar(require_trace3(), exports2); + __exportStar(require_util(), exports2); + } +}); + +// node_modules/@emprespresso/pengueno/dist/process/exec.js +var require_exec = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/process/exec.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getStdoutMany = exports2.getStdout = exports2.CmdMetric = void 0; + var pengueno_1 = require_dist2(); + var node_child_process_1 = require("node:child_process"); + exports2.CmdMetric = pengueno_1.Metric.fromName("Exec").asResult(); + var getStdout = (cmd, options = { streamTraceable: [] }) => cmd.flatMap(pengueno_1.TraceUtil.withFunctionTrace(exports2.getStdout)).flatMap((tCmd) => tCmd.traceScope(() => `Command = ${tCmd.get()}`)).map((tCmd) => { + const cmd2 = tCmd.get(); + const _exec = typeof cmd2 === "string" ? cmd2 : cmd2.join(" "); + const env = options.clearEnv ? options.env : { ...process.env, ...options.env }; + return pengueno_1.Either.fromFailableAsync(new Promise((res, rej) => { + const proc = (0, node_child_process_1.exec)(_exec, { env }); + let stdout = ""; + proc.stdout?.on("data", (d) => { + const s = d.toString(); + stdout += s; + if (options.streamTraceable?.includes("stdout")) { + tCmd.trace.trace(s); + } + }); + const stderr = ""; + proc.stderr?.on("data", (d) => { + const s = d.toString(); + stdout += s; + if (options.streamTraceable?.includes("stderr")) { + tCmd.trace.trace(s); + } + }); + proc.on("exit", (code) => { + const streams = { stdout, stderr }; + if (code === 0) { + res(streams); + } else { + rej(new Error(`exited with non-zero code: ${code}. ${stderr}`)); + } + }); + })); + }).map(pengueno_1.TraceUtil.promiseify((tEitherStdStreams) => tEitherStdStreams.get().mapRight(({ stderr, stdout }) => { + if (stderr) + tEitherStdStreams.trace.traceScope(pengueno_1.LogLevel.DEBUG).trace(`StdErr = ${stderr}`); + return stdout; + }))).peek(pengueno_1.TraceUtil.promiseify(pengueno_1.TraceUtil.traceResultingEither(exports2.CmdMetric))).get(); + exports2.getStdout = getStdout; + var getStdoutMany = (cmds, options = { streamTraceable: [] }) => cmds.coExtend((t) => t.get()).reduce(async (_result, tCmd) => { + const result = await _result; + return result.joinRightAsync(() => tCmd.map((cmd) => (0, exports2.getStdout)(cmd, options)).get(), (stdout, pre) => pre.concat(stdout)); + }, Promise.resolve(pengueno_1.Either.right([]))); + exports2.getStdoutMany = getStdoutMany; + } +}); + +// node_modules/@emprespresso/pengueno/dist/process/env.js +var require_env = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/process/env.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getRequiredEnvVars = exports2.getRequiredEnv = exports2.getEnv = void 0; + var pengueno_1 = require_dist2(); + var getEnv = (name) => pengueno_1.Optional.from(process.env[name]); + exports2.getEnv = getEnv; + var getRequiredEnv = (name) => pengueno_1.Either.fromFailable(() => (0, exports2.getEnv)(name).get()).mapLeft(() => new Error(`environment variable "${name}" is required D:`)); + exports2.getRequiredEnv = getRequiredEnv; + var getRequiredEnvVars = (vars) => { + const emptyEnvironment = pengueno_1.Either.right({}); + const addTo = (env, key, val) => ({ + ...env, + [key]: val + }); + return vars.reduce((environment, key) => environment.joinRight((0, exports2.getRequiredEnv)(key), (value, environment2) => addTo(environment2, key, value)), emptyEnvironment); + }; + exports2.getRequiredEnvVars = getRequiredEnvVars; + } +}); + +// node_modules/@emprespresso/pengueno/dist/process/validate_identifier.js +var require_validate_identifier = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/process/validate_identifier.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.validateExecutionEntries = exports2.validateIdentifier = void 0; + var pengueno_1 = require_dist2(); + var validateIdentifier = (token) => { + return /^[a-zA-Z0-9_\?\&\=\-:. \/]+$/.test(token) && !token.includes(".."); + }; + exports2.validateIdentifier = validateIdentifier; + var validateExecutionEntries = (obj) => { + const invalidEntries = Object.entries(obj).filter((e) => !e.every((x) => typeof x === "string" && (0, exports2.validateIdentifier)(x))); + if (invalidEntries.length > 0) + return pengueno_1.Either.left(invalidEntries); + return pengueno_1.Either.right(obj); + }; + exports2.validateExecutionEntries = validateExecutionEntries; + } +}); + +// node_modules/@emprespresso/pengueno/dist/process/argv.js +var require_argv = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/process/argv.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.argv = exports2.getArg = exports2.isArgKey = void 0; + var pengueno_1 = require_dist2(); + var isArgKey = (k) => k.startsWith("--"); + exports2.isArgKey = isArgKey; + var getArg = (arg, argv2, whenValue) => { + const argIndex = pengueno_1.Optional.from(argv2.findIndex((_argv) => (0, exports2.isArgKey)(_argv) && _argv.split("=")[0] === arg)).filter((index) => index >= 0 && index < argv2.length); + if (!argIndex.present()) { + return pengueno_1.Optional.from(whenValue.absent).map((v) => pengueno_1.Either.right(v)).orSome(() => pengueno_1.Either.left(new Error(`arg ${arg} is not present in arguments list and does not have an 'absent' value`))).get(); + } + return argIndex.flatMap((idx) => pengueno_1.Optional.from(argv2.at(idx)).map((_argv) => _argv.includes("=") ? _argv.split("=")[1] : argv2.at(idx + 1))).filter((next) => !(0, exports2.isArgKey)(next)).map((next) => whenValue.present(next)).orSome(() => whenValue.unspecified).map((v) => pengueno_1.Either.right(v)).get(); + }; + exports2.getArg = getArg; + var argv = (args, handlers, argv2 = process.argv.slice(2)) => { + const defaultHandler = { present: (value) => value }; + const processArg = (arg) => { + const handler = handlers?.[arg] ?? defaultHandler; + return (0, exports2.getArg)(arg, argv2, handler).mapRight((value) => [arg, value]); + }; + const res = args.map(processArg).reduce((acc, current) => acc.flatMap((accValue) => current.mapRight(([key, value]) => ({ + ...accValue, + [key]: value + }))), pengueno_1.Either.right({})).mapRight((result) => result); + return res; + }; + exports2.argv = argv; + } +}); + +// node_modules/@emprespresso/pengueno/dist/process/signals.js +var require_signals = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/process/signals.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.Signals = exports2.SigTermMetric = exports2.SigIntMetric = void 0; + var pengueno_1 = require_dist2(); + exports2.SigIntMetric = pengueno_1.Metric.fromName("SigInt").asResult(); + exports2.SigTermMetric = pengueno_1.Metric.fromName("SigTerm").asResult(); + var Signals = class { + static async awaitClose(t) { + const success = pengueno_1.Either.right(void 0); + return new Promise((res) => { + const metricizedInterruptHandler = (metric) => (err) => t.flatMap(pengueno_1.TraceUtil.withMetricTrace(metric)).peek((_t) => _t.trace.trace("closing")).move(pengueno_1.Optional.from(err).map((e) => pengueno_1.Either.left(e)).orSome(() => success).get()).flatMap(pengueno_1.TraceUtil.traceResultingEither(metric)).map((e) => res(e.get())).peek((_t) => _t.trace.trace("finished")).get(); + const sigintCloser = metricizedInterruptHandler(exports2.SigIntMetric); + const sigtermCloser = metricizedInterruptHandler(exports2.SigTermMetric); + process.on("SIGINT", () => t.flatMap(pengueno_1.TraceUtil.withTrace("SIGINT")).get().close(sigintCloser)); + process.on("SIGTERM", () => t.flatMap(pengueno_1.TraceUtil.withTrace("SIGTERM")).get().close(sigtermCloser)); + }); + } + }; + exports2.Signals = Signals; + } +}); + +// node_modules/@emprespresso/pengueno/dist/process/index.js +var require_process = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/process/index.js"(exports2) { + "use strict"; + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + }); + var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + __exportStar(require_exec(), exports2); + __exportStar(require_env(), exports2); + __exportStar(require_validate_identifier(), exports2); + __exportStar(require_argv(), exports2); + __exportStar(require_signals(), exports2); + } +}); + +// node_modules/@emprespresso/pengueno/dist/server/http/body.js +var require_body = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/server/http/body.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + } +}); + +// node_modules/@emprespresso/pengueno/dist/server/http/status.js +var require_status = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/server/http/status.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.HttpStatusCodes = void 0; + exports2.HttpStatusCodes = { + 100: "Continue", + 101: "Switching Protocols", + 102: "Processing (WebDAV)", + 200: "OK", + 201: "Created", + 202: "Accepted", + 203: "Non-Authoritative Information", + 204: "No Content", + 205: "Reset Content", + 206: "Partial Content", + 207: "Multi-Status (WebDAV)", + 208: "Already Reported (WebDAV)", + 226: "IM Used", + 300: "Multiple Choices", + 301: "Moved Permanently", + 302: "Found", + 303: "See Other", + 304: "Not Modified", + 305: "Use Proxy", + 306: "(Unused)", + 307: "Temporary Redirect", + 308: "Permanent Redirect (experimental)", + 400: "Bad Request", + 401: "Unauthorized", + 402: "Payment Required", + 403: "Forbidden", + 404: "Not Found", + 405: "Method Not Allowed", + 406: "Not Acceptable", + 407: "Proxy Authentication Required", + 408: "Request Timeout", + 409: "Conflict", + 410: "Gone", + 411: "Length Required", + 412: "Precondition Failed", + 413: "Request Entity Too Large", + 414: "Request-URI Too Long", + 415: "Unsupported Media Type", + 416: "Requested Range Not Satisfiable", + 417: "Expectation Failed", + 418: "I'm a teapot (RFC 2324)", + 420: "Enhance Your Calm (Twitter)", + 422: "Unprocessable Entity (WebDAV)", + 423: "Locked (WebDAV)", + 424: "Failed Dependency (WebDAV)", + 425: "Reserved for WebDAV", + 426: "Upgrade Required", + 428: "Precondition Required", + 429: "Too Many Requests", + 431: "Request Header Fields Too Large", + 444: "No Response (Nginx)", + 449: "Retry With (Microsoft)", + 450: "Blocked by Windows Parental Controls (Microsoft)", + 451: "Unavailable For Legal Reasons", + 499: "Client Closed Request (Nginx)", + 500: "Internal Server Error", + 501: "Not Implemented", + 502: "Bad Gateway", + 503: "Service Unavailable", + 504: "Gateway Timeout", + 505: "HTTP Version Not Supported", + 506: "Variant Also Negotiates (Experimental)", + 507: "Insufficient Storage (WebDAV)", + 508: "Loop Detected (WebDAV)", + 509: "Bandwidth Limit Exceeded (Apache)", + 510: "Not Extended", + 511: "Network Authentication Required", + 598: "Network read timeout error", + 599: "Network connect timeout error" + }; + } +}); + +// node_modules/@emprespresso/pengueno/dist/server/http/method.js +var require_method = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/server/http/method.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + } +}); + +// node_modules/@emprespresso/pengueno/dist/server/http/index.js +var require_http = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/server/http/index.js"(exports2) { + "use strict"; + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + }); + var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + __exportStar(require_body(), exports2); + __exportStar(require_status(), exports2); + __exportStar(require_method(), exports2); + } +}); + +// node_modules/@emprespresso/pengueno/dist/server/response/pengueno.js +var require_pengueno = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/server/response/pengueno.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.JsonResponse = exports2.PenguenoResponse = exports2.getResponseMetrics = void 0; + var pengueno_1 = require_dist2(); + var getHeaders = (req, extraHeaders) => { + const optHeaders = { + ...req.getResponseHeaders(), + ...extraHeaders + }; + optHeaders["Content-Type"] = (optHeaders["Content-Type"] ?? "text/plain") + "; charset=utf-8"; + return optHeaders; + }; + var ResponseCodeMetrics = [0, 1, 2, 3, 4, 5].map((x) => pengueno_1.Metric.fromName(`response.${x}xx`).asResult()); + var getResponseMetrics = (status, elapsedMs) => { + const index = Math.floor(status / 100); + return ResponseCodeMetrics.flatMap((metric, i) => pengueno_1.Optional.from(i).filter((i2) => i2 === index).map(() => [metric.count.withValue(1)]).flatMap((metricValues) => pengueno_1.Optional.from(elapsedMs).map((ms) => metricValues.concat(metric.time.withValue(ms))).orSome(() => metricValues)).orSome(() => [metric.count.withValue(0)]).get()); + }; + exports2.getResponseMetrics = getResponseMetrics; + var PenguenoResponse = class { + _body; + statusText; + status; + headers; + constructor(req, _body, opts) { + this._body = _body; + this.headers = getHeaders(req.get(), opts?.headers ?? {}); + this.status = opts.status; + this.statusText = opts.statusText ?? pengueno_1.HttpStatusCodes[this.status]; + req.trace.trace((0, exports2.getResponseMetrics)(opts.status, req.get().elapsedTimeMs())); + } + body() { + return this._body; + } + }; + exports2.PenguenoResponse = PenguenoResponse; + var JsonResponse = class extends PenguenoResponse { + constructor(req, e, _opts) { + const opts = { ..._opts, headers: { ..._opts.headers, "Content-Type": "application/json" } }; + if ((0, pengueno_1.isEither)(e)) { + super(req, JSON.stringify(e.fold((error) => ({ error, ok: void 0 }), (ok) => ({ ok }))), opts); + return; + } + super(req, JSON.stringify(Math.floor(opts.status / 100) > 4 ? { error: e } : { ok: e }), opts); + } + }; + exports2.JsonResponse = JsonResponse; + } +}); + +// node_modules/@emprespresso/pengueno/dist/server/response/index.js +var require_response = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/server/response/index.js"(exports2) { + "use strict"; + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + }); + var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + __exportStar(require_pengueno(), exports2); + } +}); + +// node_modules/@emprespresso/pengueno/dist/server/request/pengueno.js +var require_pengueno2 = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/server/request/pengueno.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.PenguenoRequest = void 0; + var greetings = ["hewwo :D", "hiya cutie", "boop!", "sending virtual hugs!", "stay pawsitive"]; + var penguenoGreeting = () => greetings[Math.floor(Math.random() * greetings.length)]; + var PenguenoRequest = class _PenguenoRequest { + req; + id; + at; + constructor(req, id, at) { + this.req = req; + this.id = id; + this.at = at; + } + elapsedTimeMs(after = () => Date.now()) { + return after() - this.at.getTime(); + } + getResponseHeaders() { + const RequestId = this.id; + const RequestReceivedUnix = this.at.getTime(); + const RequestHandleUnix = Date.now(); + const DeltaUnix = this.elapsedTimeMs(() => RequestHandleUnix); + const Hai = penguenoGreeting(); + return Object.entries({ + RequestId, + RequestReceivedUnix, + RequestHandleUnix, + DeltaUnix, + Hai + }).reduce((acc, [key, val]) => ({ ...acc, [key]: val.toString() }), {}); + } + static from(request) { + const id = crypto.randomUUID(); + return request.bimap((tRequest) => { + const request2 = tRequest.get(); + const url = new URL(request2.url); + const { pathname } = url; + const trace = `RequestId = ${id}, Method = ${request2.method}, Path = ${pathname}`; + return { item: new _PenguenoRequest(request2, id, /* @__PURE__ */ new Date()), trace }; + }); + } + }; + exports2.PenguenoRequest = PenguenoRequest; + } +}); + +// node_modules/@emprespresso/pengueno/dist/server/request/index.js +var require_request = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/server/request/index.js"(exports2) { + "use strict"; + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + }); + var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + __exportStar(require_pengueno2(), exports2); + } +}); + +// node_modules/@emprespresso/pengueno/dist/server/activity/health.js +var require_health = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/server/activity/health.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.HealthCheckActivityImpl = exports2.HealthCheckOutput = exports2.HealthCheckInput = void 0; + var pengueno_1 = require_dist2(); + var HealthCheckInput; + (function(HealthCheckInput2) { + HealthCheckInput2[HealthCheckInput2["CHECK"] = 0] = "CHECK"; + })(HealthCheckInput || (exports2.HealthCheckInput = HealthCheckInput = {})); + var HealthCheckOutput; + (function(HealthCheckOutput2) { + HealthCheckOutput2[HealthCheckOutput2["YAASSSLAYQUEEN"] = 0] = "YAASSSLAYQUEEN"; + })(HealthCheckOutput || (exports2.HealthCheckOutput = HealthCheckOutput = {})); + var healthCheckMetric = pengueno_1.Metric.fromName("Health").asResult(); + var HealthCheckActivityImpl = class { + check; + constructor(check) { + this.check = check; + } + checkHealth(req) { + return req.flatMap(pengueno_1.TraceUtil.withFunctionTrace(this.checkHealth)).flatMap(pengueno_1.TraceUtil.withMetricTrace(healthCheckMetric)).flatMap((r) => r.move(HealthCheckInput.CHECK).map((input) => this.check(input))).peek(pengueno_1.TraceUtil.promiseify(pengueno_1.TraceUtil.traceResultingEither(healthCheckMetric))).map(pengueno_1.TraceUtil.promiseify((h) => { + const { status, message } = h.get().fold(() => ({ status: 500, message: "err" }), () => ({ status: 200, message: "ok" })); + return new pengueno_1.JsonResponse(req, message, { status }); + })).get(); + } + }; + exports2.HealthCheckActivityImpl = HealthCheckActivityImpl; + } +}); + +// node_modules/@emprespresso/pengueno/dist/server/activity/fourohfour.js +var require_fourohfour = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/server/activity/fourohfour.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.FourOhFourActivityImpl = void 0; + var pengueno_1 = require_dist2(); + var messages = [ + "D: meow-t found! your api call ran away!", + "404-bidden! but like...in a cute way >:3 !", + ":< your data went on a paw-sible vacation!", + "uwu~ not found, but found our hearts instead!" + ]; + var randomFourOhFour = () => messages[Math.floor(Math.random() * messages.length)]; + var FourOhFourActivityImpl = class { + fourOhFour(req) { + return req.move(new pengueno_1.JsonResponse(req, randomFourOhFour(), { status: 404 })).map((resp) => Promise.resolve(resp.get())).get(); + } + }; + exports2.FourOhFourActivityImpl = FourOhFourActivityImpl; + } +}); + +// node_modules/@emprespresso/pengueno/dist/server/activity/index.js +var require_activity = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/server/activity/index.js"(exports2) { + "use strict"; + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + }); + var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + __exportStar(require_health(), exports2); + __exportStar(require_fourohfour(), exports2); + } +}); + +// node_modules/@emprespresso/pengueno/dist/server/filter/method.js +var require_method2 = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/server/filter/method.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.requireMethod = void 0; + var pengueno_1 = require_dist2(); + var requireMethod = (methods) => (req) => req.flatMap(pengueno_1.TraceUtil.withFunctionTrace(exports2.requireMethod)).map((t) => { + const { req: { method } } = t.get(); + if (!methods.includes(method)) { + const msg = "that's not how you pet me (\u22DF\uFE4F\u22DE)~"; + t.trace.traceScope(pengueno_1.LogLevel.WARN).trace(msg); + return pengueno_1.Either.left(new pengueno_1.PenguenoError(msg, 405)); + } + return pengueno_1.Either.right(method); + }).get(); + exports2.requireMethod = requireMethod; + } +}); + +// node_modules/@emprespresso/pengueno/dist/server/filter/json.js +var require_json = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/server/filter/json.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.jsonModel = void 0; + var pengueno_1 = require_dist2(); + var ParseJsonMetric = pengueno_1.Metric.fromName("JsonParse").asResult(); + var jsonModel = (jsonTransformer) => (r) => r.flatMap(pengueno_1.TraceUtil.withFunctionTrace(exports2.jsonModel)).flatMap(pengueno_1.TraceUtil.withMetricTrace(ParseJsonMetric)).map((j) => pengueno_1.Either.fromFailableAsync(j.get().req.json()).then((either) => either.mapLeft((errReason) => { + j.trace.traceScope(pengueno_1.LogLevel.WARN).trace(errReason); + return new pengueno_1.PenguenoError("seems to be invalid JSON (>//<) can you fix?", 400); + }))).flatMapAsync(pengueno_1.TraceUtil.promiseify(pengueno_1.TraceUtil.traceResultingEither(ParseJsonMetric))).map(pengueno_1.TraceUtil.promiseify((traceableEitherJson) => traceableEitherJson.get().mapRight((j) => traceableEitherJson.move(j)).flatMap(jsonTransformer))).get(); + exports2.jsonModel = jsonModel; + } +}); + +// node_modules/@emprespresso/pengueno/dist/server/filter/index.js +var require_filter = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/server/filter/index.js"(exports2) { + "use strict"; + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + }); + var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.PenguenoError = exports2.ErrorSource = void 0; + var pengueno_1 = require_dist2(); + var ErrorSource; + (function(ErrorSource2) { + ErrorSource2["USER"] = "WARN"; + ErrorSource2["SYSTEM"] = "ERROR"; + })(ErrorSource || (exports2.ErrorSource = ErrorSource = {})); + var PenguenoError = class extends Error { + message; + status; + source; + constructor(message, status) { + super(message); + this.message = message; + this.status = status; + this.source = Math.floor(status / 100) === 4 ? ErrorSource.USER : ErrorSource.SYSTEM; + } + }; + exports2.PenguenoError = PenguenoError; + __exportStar(require_method2(), exports2); + __exportStar(require_json(), exports2); + } +}); + +// node_modules/hono/dist/cjs/compose.js +var require_compose = __commonJS({ + "node_modules/hono/dist/cjs/compose.js"(exports2, module2) { + "use strict"; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var compose_exports = {}; + __export(compose_exports, { + compose: () => compose + }); + module2.exports = __toCommonJS(compose_exports); + var compose = (middleware, onError, onNotFound) => { + return (context, 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]; + context.req.routeIndex = i; + } else { + handler = i === middleware.length && next || void 0; + } + if (handler) { + try { + res = await handler(context, () => dispatch(i + 1)); + } catch (err) { + if (err instanceof Error && onError) { + context.error = err; + res = await onError(err, context); + isError = true; + } else { + throw err; + } + } + } else { + if (context.finalized === false && onNotFound) { + res = await onNotFound(context); + } + } + if (res && (context.finalized === false || isError)) { + context.res = res; + } + return context; + } + }; + }; + } +}); + +// node_modules/hono/dist/cjs/http-exception.js +var require_http_exception = __commonJS({ + "node_modules/hono/dist/cjs/http-exception.js"(exports2, module2) { + "use strict"; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var http_exception_exports = {}; + __export(http_exception_exports, { + HTTPException: () => HTTPException + }); + module2.exports = __toCommonJS(http_exception_exports); + var HTTPException = class extends Error { + res; + status; + constructor(status = 500, options) { + super(options?.message, { cause: options?.cause }); + this.res = options?.res; + this.status = status; + } + getResponse() { + if (this.res) { + const newResponse = new Response(this.res.body, { + status: this.status, + headers: this.res.headers + }); + return newResponse; + } + return new Response(this.message, { + status: this.status + }); + } + }; + } +}); + +// node_modules/hono/dist/cjs/request/constants.js +var require_constants = __commonJS({ + "node_modules/hono/dist/cjs/request/constants.js"(exports2, module2) { + "use strict"; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var constants_exports = {}; + __export(constants_exports, { + GET_MATCH_RESULT: () => GET_MATCH_RESULT + }); + module2.exports = __toCommonJS(constants_exports); + var GET_MATCH_RESULT = Symbol(); + } +}); + +// node_modules/hono/dist/cjs/utils/body.js +var require_body2 = __commonJS({ + "node_modules/hono/dist/cjs/utils/body.js"(exports2, module2) { + "use strict"; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var body_exports = {}; + __export(body_exports, { + parseBody: () => parseBody + }); + module2.exports = __toCommonJS(body_exports); + var import_request = require_request2(); + var parseBody = async (request, options = /* @__PURE__ */ Object.create(null)) => { + const { all = false, dot = false } = options; + const headers = request instanceof import_request.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 {}; + }; + async function parseFormData(request, options) { + const formData = await request.formData(); + if (formData) { + return convertFormDataToBodyData(formData, options); + } + return {}; + } + 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; + } + var handleParsingAllValues = (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]; + } + } + }; + var handleParsingNestedValues = (form, key, value) => { + 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]; + } + }); + }; + } +}); + +// node_modules/hono/dist/cjs/utils/url.js +var require_url = __commonJS({ + "node_modules/hono/dist/cjs/utils/url.js"(exports2, module2) { + "use strict"; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var url_exports = {}; + __export(url_exports, { + checkOptionalParameter: () => checkOptionalParameter, + decodeURIComponent_: () => decodeURIComponent_, + getPath: () => getPath, + getPathNoStrict: () => getPathNoStrict, + getPattern: () => getPattern, + getQueryParam: () => getQueryParam, + getQueryParams: () => getQueryParams, + getQueryStrings: () => getQueryStrings, + mergePath: () => mergePath, + splitPath: () => splitPath, + splitRoutingPath: () => splitRoutingPath, + tryDecode: () => tryDecode + }); + module2.exports = __toCommonJS(url_exports); + var splitPath = (path) => { + const paths = path.split("/"); + if (paths[0] === "") { + paths.shift(); + } + return paths; + }; + var splitRoutingPath = (routePath) => { + const { groups, path } = extractGroupsFromPath(routePath); + const paths = splitPath(path); + return replaceGroupMarks(paths, groups); + }; + var extractGroupsFromPath = (path) => { + const groups = []; + path = path.replace(/\{[^}]+\}/g, (match, index) => { + const mark = `@${index}`; + groups.push([mark, match]); + return mark; + }); + return { groups, path }; + }; + var replaceGroupMarks = (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; + }; + var patternCache = {}; + var getPattern = (label, next) => { + if (label === "*") { + return "*"; + } + const match = label.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/); + if (match) { + const cacheKey = `${label}#${next}`; + if (!patternCache[cacheKey]) { + if (match[2]) { + patternCache[cacheKey] = next && next[0] !== ":" && next[0] !== "*" ? [cacheKey, match[1], new RegExp(`^${match[2]}(?=/${next})`)] : [label, match[1], new RegExp(`^${match[2]}$`)]; + } else { + patternCache[cacheKey] = [label, match[1], true]; + } + } + return patternCache[cacheKey]; + } + return null; + }; + var tryDecode = (str, decoder) => { + try { + return decoder(str); + } catch { + return str.replace(/(?:%[0-9A-Fa-f]{2})+/g, (match) => { + try { + return decoder(match); + } catch { + return match; + } + }); + } + }; + var tryDecodeURI = (str) => tryDecode(str, decodeURI); + var getPath = (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 path = url.slice(start, queryIndex === -1 ? void 0 : queryIndex); + return tryDecodeURI(path.includes("%25") ? path.replace(/%25/g, "%2525") : path); + } else if (charCode === 63) { + break; + } + } + return url.slice(start, i); + }; + var getQueryStrings = (url) => { + const queryIndex = url.indexOf("?", 8); + return queryIndex === -1 ? "" : "?" + url.slice(queryIndex + 1); + }; + var getPathNoStrict = (request) => { + const result = getPath(request); + return result.length > 1 && result.at(-1) === "/" ? result.slice(0, -1) : result; + }; + var mergePath = (base, sub, ...rest) => { + if (rest.length) { + sub = mergePath(sub, ...rest); + } + return `${base?.[0] === "/" ? "" : "/"}${base}${sub === "/" ? "" : `${base?.at(-1) === "/" ? "" : "/"}${sub?.[0] === "/" ? sub.slice(1) : sub}`}`; + }; + var checkOptionalParameter = (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); + }; + var _decodeURI = (value) => { + if (!/[%+]/.test(value)) { + return value; + } + if (value.indexOf("+") !== -1) { + value = value.replace(/\+/g, " "); + } + return value.indexOf("%") !== -1 ? tryDecode(value, decodeURIComponent_) : value; + }; + var _getQueryParam = (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; + }; + var getQueryParam = _getQueryParam; + var getQueryParams = (url, key) => { + return _getQueryParam(url, key, true); + }; + var decodeURIComponent_ = decodeURIComponent; + } +}); + +// node_modules/hono/dist/cjs/request.js +var require_request2 = __commonJS({ + "node_modules/hono/dist/cjs/request.js"(exports2, module2) { + "use strict"; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var request_exports = {}; + __export(request_exports, { + HonoRequest: () => HonoRequest, + cloneRawRequest: () => cloneRawRequest + }); + module2.exports = __toCommonJS(request_exports); + var import_http_exception = require_http_exception(); + var import_constants = require_constants(); + var import_body = require_body2(); + var import_url = require_url(); + var tryDecodeURIComponent = (str) => (0, import_url.tryDecode)(str, import_url.decodeURIComponent_); + var HonoRequest = class { + raw; + #validatedData; + #matchResult; + routeIndex = 0; + 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 (0, import_url.getQueryParam)(this.url, key); + } + queries(key) { + return (0, import_url.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 this.bodyCache.parsedBody ??= await (0, import_body.parseBody)(this, options); + } + #cachedBody = (key) => { + const { bodyCache, raw } = 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] = raw[key](); + }; + json() { + return this.#cachedBody("text").then((text) => JSON.parse(text)); + } + text() { + return this.#cachedBody("text"); + } + arrayBuffer() { + return this.#cachedBody("arrayBuffer"); + } + blob() { + return this.#cachedBody("blob"); + } + formData() { + return this.#cachedBody("formData"); + } + addValidatedData(target, data) { + this.#validatedData[target] = data; + } + valid(target) { + return this.#validatedData[target]; + } + get url() { + return this.raw.url; + } + get method() { + return this.raw.method; + } + get [import_constants.GET_MATCH_RESULT]() { + return this.#matchResult; + } + get matchedRoutes() { + return this.#matchResult[0].map(([[, route]]) => route); + } + get routePath() { + return this.#matchResult[0].map(([[, route]]) => route)[this.routeIndex].path; + } + }; + var cloneRawRequest = async (req) => { + if (!req.raw.bodyUsed) { + return req.raw.clone(); + } + const cacheKey = Object.keys(req.bodyCache)[0]; + if (!cacheKey) { + throw new import_http_exception.HTTPException(500, { + message: "Cannot clone request: body was already consumed and not cached. Please use HonoRequest methods (e.g., req.json(), req.text()) instead of consuming req.raw directly." + }); + } + const requestInit = { + body: await req[cacheKey](), + cache: req.raw.cache, + credentials: req.raw.credentials, + headers: req.header(), + integrity: req.raw.integrity, + keepalive: req.raw.keepalive, + method: req.method, + mode: req.raw.mode, + redirect: req.raw.redirect, + referrer: req.raw.referrer, + referrerPolicy: req.raw.referrerPolicy, + signal: req.raw.signal + }; + return new Request(req.url, requestInit); + }; + } +}); + +// node_modules/hono/dist/cjs/utils/html.js +var require_html = __commonJS({ + "node_modules/hono/dist/cjs/utils/html.js"(exports2, module2) { + "use strict"; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var html_exports = {}; + __export(html_exports, { + HtmlEscapedCallbackPhase: () => HtmlEscapedCallbackPhase, + escapeToBuffer: () => escapeToBuffer, + raw: () => raw, + resolveCallback: () => resolveCallback, + resolveCallbackSync: () => resolveCallbackSync, + stringBufferToString: () => stringBufferToString + }); + module2.exports = __toCommonJS(html_exports); + var HtmlEscapedCallbackPhase = { + Stringify: 1, + BeforeStream: 2, + Stream: 3 + }; + var raw = (value, callbacks) => { + const escapedString = new String(value); + escapedString.isEscaped = true; + escapedString.callbacks = callbacks; + return escapedString; + }; + var escapeRe = /[&<>'"]/; + var stringBufferToString = async (buffer, callbacks) => { + let str = ""; + callbacks ||= []; + const resolvedBuffer = await Promise.all(buffer); + for (let i = resolvedBuffer.length - 1; ; i--) { + str += resolvedBuffer[i]; + i--; + if (i < 0) { + break; + } + let r = resolvedBuffer[i]; + if (typeof r === "object") { + callbacks.push(...r.callbacks || []); + } + const isEscaped = r.isEscaped; + r = await (typeof r === "object" ? r.toString() : r); + if (typeof r === "object") { + callbacks.push(...r.callbacks || []); + } + if (r.isEscaped ?? isEscaped) { + str += r; + } else { + const buf = [str]; + escapeToBuffer(r, buf); + str = buf[0]; + } + } + return raw(str, callbacks); + }; + var escapeToBuffer = (str, buffer) => { + const match = str.search(escapeRe); + if (match === -1) { + buffer[0] += str; + return; + } + let escape; + let index; + let lastIndex = 0; + for (index = match; index < str.length; index++) { + switch (str.charCodeAt(index)) { + case 34: + escape = """; + break; + case 39: + escape = "'"; + break; + case 38: + escape = "&"; + break; + case 60: + escape = "<"; + break; + case 62: + escape = ">"; + break; + default: + continue; + } + buffer[0] += str.substring(lastIndex, index) + escape; + lastIndex = index + 1; + } + buffer[0] += str.substring(lastIndex, index); + }; + var resolveCallbackSync = (str) => { + const callbacks = str.callbacks; + if (!callbacks?.length) { + return str; + } + const buffer = [str]; + const context = {}; + callbacks.forEach((c) => c({ phase: HtmlEscapedCallbackPhase.Stringify, buffer, context })); + return buffer[0]; + }; + var resolveCallback = async (str, phase, preserveCallbacks, context, 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 }))).then( + (res) => Promise.all( + res.filter(Boolean).map((str2) => resolveCallback(str2, phase, false, context, buffer)) + ).then(() => buffer[0]) + ); + if (preserveCallbacks) { + return raw(await resStr, callbacks); + } else { + return resStr; + } + }; + } +}); + +// node_modules/hono/dist/cjs/context.js +var require_context = __commonJS({ + "node_modules/hono/dist/cjs/context.js"(exports2, module2) { + "use strict"; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var context_exports = {}; + __export(context_exports, { + Context: () => Context, + TEXT_PLAIN: () => TEXT_PLAIN + }); + module2.exports = __toCommonJS(context_exports); + var import_request = require_request2(); + var import_html = require_html(); + var TEXT_PLAIN = "text/plain; charset=UTF-8"; + var setDefaultContentType = (contentType, headers) => { + return { + "Content-Type": contentType, + ...headers + }; + }; + var Context = class { + #rawRequest; + #req; + env = {}; + #var; + finalized = false; + error; + #status; + #executionCtx; + #res; + #layout; + #renderer; + #notFoundHandler; + #preparedHeaders; + #matchResult; + #path; + 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; + } + } + get req() { + this.#req ??= new import_request.HonoRequest(this.#rawRequest, this.#path, this.#matchResult); + return this.#req; + } + get event() { + if (this.#executionCtx && "respondWith" in this.#executionCtx) { + return this.#executionCtx; + } else { + throw Error("This context has no FetchEvent"); + } + } + get executionCtx() { + if (this.#executionCtx) { + return this.#executionCtx; + } else { + throw Error("This context has no ExecutionContext"); + } + } + get res() { + return this.#res ||= new Response(null, { + headers: this.#preparedHeaders ??= new Headers() + }); + } + set res(_res) { + if (this.#res && _res) { + _res = new Response(_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 = (...args) => { + this.#renderer ??= (content) => this.html(content); + return this.#renderer(...args); + }; + setLayout = (layout) => this.#layout = layout; + getLayout = () => this.#layout; + setRenderer = (renderer) => { + this.#renderer = renderer; + }; + header = (name, value, options) => { + if (this.finalized) { + this.#res = new Response(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); + } + }; + status = (status) => { + this.#status = status; + }; + set = (key, value) => { + this.#var ??= /* @__PURE__ */ new Map(); + this.#var.set(key, value); + }; + get = (key) => { + return this.#var ? this.#var.get(key) : void 0; + }; + 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 new Response(data, { status, headers: responseHeaders }); + } + newResponse = (...args) => this.#newResponse(...args); + body = (data, arg, headers) => this.#newResponse(data, arg, headers); + text = (text, arg, headers) => { + return !this.#preparedHeaders && !this.#status && !arg && !headers && !this.finalized ? new Response(text) : this.#newResponse( + text, + arg, + setDefaultContentType(TEXT_PLAIN, headers) + ); + }; + json = (object, arg, headers) => { + return this.#newResponse( + JSON.stringify(object), + arg, + setDefaultContentType("application/json", headers) + ); + }; + html = (html, arg, headers) => { + const res = (html2) => this.#newResponse(html2, arg, setDefaultContentType("text/html; charset=UTF-8", headers)); + return typeof html === "object" ? (0, import_html.resolveCallback)(html, import_html.HtmlEscapedCallbackPhase.Stringify, false, {}).then(res) : res(html); + }; + redirect = (location, status) => { + const locationString = String(location); + this.header( + "Location", + !/[^\x00-\xFF]/.test(locationString) ? locationString : encodeURI(locationString) + ); + return this.newResponse(null, status ?? 302); + }; + notFound = () => { + this.#notFoundHandler ??= () => new Response(); + return this.#notFoundHandler(this); + }; + }; + } +}); + +// node_modules/hono/dist/cjs/router.js +var require_router = __commonJS({ + "node_modules/hono/dist/cjs/router.js"(exports2, module2) { + "use strict"; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var router_exports = {}; + __export(router_exports, { + MESSAGE_MATCHER_IS_ALREADY_BUILT: () => MESSAGE_MATCHER_IS_ALREADY_BUILT, + METHODS: () => METHODS, + METHOD_NAME_ALL: () => METHOD_NAME_ALL, + METHOD_NAME_ALL_LOWERCASE: () => METHOD_NAME_ALL_LOWERCASE, + UnsupportedPathError: () => UnsupportedPathError + }); + module2.exports = __toCommonJS(router_exports); + 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 { + }; + } +}); + +// node_modules/hono/dist/cjs/utils/constants.js +var require_constants2 = __commonJS({ + "node_modules/hono/dist/cjs/utils/constants.js"(exports2, module2) { + "use strict"; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var constants_exports = {}; + __export(constants_exports, { + COMPOSED_HANDLER: () => COMPOSED_HANDLER + }); + module2.exports = __toCommonJS(constants_exports); + var COMPOSED_HANDLER = "__COMPOSED_HANDLER"; + } +}); + +// node_modules/hono/dist/cjs/hono-base.js +var require_hono_base = __commonJS({ + "node_modules/hono/dist/cjs/hono-base.js"(exports2, module2) { + "use strict"; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var hono_base_exports = {}; + __export(hono_base_exports, { + HonoBase: () => Hono2 + }); + module2.exports = __toCommonJS(hono_base_exports); + var import_compose = require_compose(); + var import_context = require_context(); + var import_router = require_router(); + var import_constants = require_constants2(); + var import_url = require_url(); + var notFoundHandler = (c) => { + return c.text("404 Not Found", 404); + }; + var errorHandler = (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); + }; + var Hono2 = class _Hono { + get; + post; + put; + delete; + options; + patch; + all; + on; + use; + router; + getPath; + _basePath = "/"; + #path = "/"; + routes = []; + constructor(options = {}) { + const allMethods = [...import_router.METHODS, import_router.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(import_router.METHOD_NAME_ALL, this.#path, handler); + }); + return this; + }; + const { strict, ...optionsWithoutStrict } = options; + Object.assign(this, optionsWithoutStrict); + this.getPath = strict ?? true ? options.getPath ?? import_url.getPath : import_url.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; + errorHandler = errorHandler; + route(path, app) { + const subApp = this.basePath(path); + app.routes.map((r) => { + let handler; + if (app.errorHandler === errorHandler) { + handler = r.handler; + } else { + handler = async (c, next) => (await (0, import_compose.compose)([], app.errorHandler)(c, () => r.handler(c, next))).res; + handler[import_constants.COMPOSED_HANDLER] = r.handler; + } + subApp.#addRoute(r.method, r.path, handler); + }); + return this; + } + basePath(path) { + const subApp = this.#clone(); + subApp._basePath = (0, import_url.mergePath)(this._basePath, path); + return subApp; + } + onError = (handler) => { + this.errorHandler = handler; + return this; + }; + notFound = (handler) => { + this.#notFoundHandler = handler; + return this; + }; + 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 = (request) => request; + } 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 = (0, import_url.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 = async (c, next) => { + const res = await applicationHandler(replaceRequest(c.req.raw), ...getOptions(c)); + if (res) { + return res; + } + await next(); + }; + this.#addRoute(import_router.METHOD_NAME_ALL, (0, import_url.mergePath)(path, "*"), handler); + return this; + } + #addRoute(method, path, handler) { + method = method.toUpperCase(); + path = (0, import_url.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, env, method) { + if (method === "HEAD") { + return (async () => new Response(null, await this.#dispatch(request, executionCtx, env, "GET")))(); + } + const path = this.getPath(request, { env }); + const matchResult = this.router.match(method, path); + const c = new import_context.Context(request, { + path, + matchResult, + env, + 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 = (0, import_compose.compose)(matchResult[0], this.errorHandler, this.#notFoundHandler); + return (async () => { + try { + const context = await composed(c); + if (!context.finalized) { + throw new Error( + "Context is not finalized. Did you forget to return a Response object or `await next()`?" + ); + } + return context.res; + } catch (err) { + return this.#handleError(err, c); + } + })(); + } + fetch = (request, ...rest) => { + return this.#dispatch(request, rest[1], rest[0], request.method); + }; + request = (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${(0, import_url.mergePath)("/", input)}`, + requestInit + ), + Env, + executionCtx + ); + }; + fire = () => { + addEventListener("fetch", (event) => { + event.respondWith(this.#dispatch(event.request, event, void 0, event.request.method)); + }); + }; + }; + } +}); + +// node_modules/hono/dist/cjs/router/reg-exp-router/matcher.js +var require_matcher = __commonJS({ + "node_modules/hono/dist/cjs/router/reg-exp-router/matcher.js"(exports2, module2) { + "use strict"; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var matcher_exports = {}; + __export(matcher_exports, { + emptyParam: () => emptyParam, + match: () => match + }); + module2.exports = __toCommonJS(matcher_exports); + var import_router = require_router(); + var emptyParam = []; + function match(method, path) { + const matchers = this.buildAllMatchers(); + const match2 = (method2, path2) => { + const matcher = matchers[method2] || matchers[import_router.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]; + }; + this.match = match2; + return match2(method, path); + } + } +}); + +// node_modules/hono/dist/cjs/router/reg-exp-router/node.js +var require_node = __commonJS({ + "node_modules/hono/dist/cjs/router/reg-exp-router/node.js"(exports2, module2) { + "use strict"; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var node_exports = {}; + __export(node_exports, { + Node: () => Node, + PATH_ERROR: () => PATH_ERROR + }); + module2.exports = __toCommonJS(node_exports); + var LABEL_REG_EXP_STR = "[^/]+"; + var ONLY_WILDCARD_REG_EXP_STR = ".*"; + var TAIL_WILDCARD_REG_EXP_STR = "(?:|/.*)"; + var PATH_ERROR = 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; + } + var Node = class _Node { + #index; + #varIndex; + #children = /* @__PURE__ */ Object.create(null); + insert(tokens, index, paramMap, context, 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 = context.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, context, 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/hono/dist/cjs/router/reg-exp-router/trie.js +var require_trie = __commonJS({ + "node_modules/hono/dist/cjs/router/reg-exp-router/trie.js"(exports2, module2) { + "use strict"; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var trie_exports = {}; + __export(trie_exports, { + Trie: () => Trie + }); + module2.exports = __toCommonJS(trie_exports); + var import_node = require_node(); + var Trie = class { + #context = { varIndex: 0 }; + #root = new import_node.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/hono/dist/cjs/router/reg-exp-router/router.js +var require_router2 = __commonJS({ + "node_modules/hono/dist/cjs/router/reg-exp-router/router.js"(exports2, module2) { + "use strict"; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var router_exports = {}; + __export(router_exports, { + RegExpRouter: () => RegExpRouter2 + }); + module2.exports = __toCommonJS(router_exports); + var import_router = require_router(); + var import_url = require_url(); + var import_matcher = require_matcher(); + var import_node = require_node(); + var import_trie = require_trie(); + 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}` : "(?:|/.*)" + )}$` + ); + } + function clearWildcardRegExpCache() { + wildcardRegExpCache = /* @__PURE__ */ Object.create(null); + } + function buildMatcherFromPreprocessedRoutes(routes) { + const trie = new import_trie.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)]), import_matcher.emptyParam]; + } else { + j++; + } + let paramAssoc; + try { + paramAssoc = trie.insert(path, j, pathErrorCheckOnly); + } catch (e) { + throw e === import_node.PATH_ERROR ? new import_router.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]; + } + 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; + } + var RegExpRouter2 = class { + name = "RegExpRouter"; + #middleware; + #routes; + constructor() { + this.#middleware = { [import_router.METHOD_NAME_ALL]: /* @__PURE__ */ Object.create(null) }; + this.#routes = { [import_router.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(import_router.MESSAGE_MATCHER_IS_ALREADY_BUILT); + } + if (!middleware[method]) { + ; + [middleware, routes].forEach((handlerMap) => { + handlerMap[method] = /* @__PURE__ */ Object.create(null); + Object.keys(handlerMap[import_router.METHOD_NAME_ALL]).forEach((p) => { + handlerMap[method][p] = [...handlerMap[import_router.METHOD_NAME_ALL][p]]; + }); + }); + } + if (path === "/*") { + path = "*"; + } + const paramCount = (path.match(/\/:/g) || []).length; + if (/\*$/.test(path)) { + const re = buildWildcardRegExp(path); + if (method === import_router.METHOD_NAME_ALL) { + Object.keys(middleware).forEach((m) => { + middleware[m][path] ||= findMiddleware(middleware[m], path) || findMiddleware(middleware[import_router.METHOD_NAME_ALL], path) || []; + }); + } else { + middleware[method][path] ||= findMiddleware(middleware[method], path) || findMiddleware(middleware[import_router.METHOD_NAME_ALL], path) || []; + } + Object.keys(middleware).forEach((m) => { + if (method === import_router.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 === import_router.METHOD_NAME_ALL || method === m) { + Object.keys(routes[m]).forEach( + (p) => re.test(p) && routes[m][p].push([handler, paramCount]) + ); + } + }); + return; + } + const paths = (0, import_url.checkOptionalParameter)(path) || [path]; + for (let i = 0, len = paths.length; i < len; i++) { + const path2 = paths[i]; + Object.keys(routes).forEach((m) => { + if (method === import_router.METHOD_NAME_ALL || method === m) { + routes[m][path2] ||= [ + ...findMiddleware(middleware[m], path2) || findMiddleware(middleware[import_router.METHOD_NAME_ALL], path2) || [] + ]; + routes[m][path2].push([handler, paramCount - len + i + 1]); + } + }); + } + } + match = import_matcher.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 === import_router.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 !== import_router.METHOD_NAME_ALL) { + routes.push( + ...Object.keys(r[import_router.METHOD_NAME_ALL]).map((path) => [path, r[import_router.METHOD_NAME_ALL][path]]) + ); + } + }); + if (!hasOwnRoute) { + return null; + } else { + return buildMatcherFromPreprocessedRoutes(routes); + } + } + }; + } +}); + +// node_modules/hono/dist/cjs/router/reg-exp-router/prepared-router.js +var require_prepared_router = __commonJS({ + "node_modules/hono/dist/cjs/router/reg-exp-router/prepared-router.js"(exports2, module2) { + "use strict"; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var prepared_router_exports = {}; + __export(prepared_router_exports, { + PreparedRegExpRouter: () => PreparedRegExpRouter2, + buildInitParams: () => buildInitParams2, + serializeInitParams: () => serializeInitParams2 + }); + module2.exports = __toCommonJS(prepared_router_exports); + var import_router = require_router(); + var import_matcher = require_matcher(); + var import_router2 = require_router2(); + var PreparedRegExpRouter2 = class { + name = "PreparedRegExpRouter"; + #matchers; + #relocateMap; + constructor(matchers, relocateMap) { + this.#matchers = matchers; + this.#relocateMap = relocateMap; + } + #addWildcard(method, handlerData) { + const matcher = this.#matchers[method]; + matcher[1].forEach((list) => list && list.push(handlerData)); + Object.values(matcher[2]).forEach((list) => list[0].push(handlerData)); + } + #addPath(method, path, handler, indexes, map) { + const matcher = this.#matchers[method]; + if (!map) { + matcher[2][path][0].push([handler, {}]); + } else { + indexes.forEach((index) => { + if (typeof index === "number") { + matcher[1][index].push([handler, map]); + } else { + ; + matcher[2][index || path][0].push([handler, map]); + } + }); + } + } + add(method, path, handler) { + if (!this.#matchers[method]) { + const all = this.#matchers[import_router.METHOD_NAME_ALL]; + const staticMap = {}; + for (const key in all[2]) { + staticMap[key] = [all[2][key][0].slice(), import_matcher.emptyParam]; + } + this.#matchers[method] = [ + all[0], + all[1].map((list) => Array.isArray(list) ? list.slice() : 0), + staticMap + ]; + } + if (path === "/*" || path === "*") { + const handlerData = [handler, {}]; + if (method === import_router.METHOD_NAME_ALL) { + for (const m in this.#matchers) { + this.#addWildcard(m, handlerData); + } + } else { + this.#addWildcard(method, handlerData); + } + return; + } + const data = this.#relocateMap[path]; + if (!data) { + throw new Error(`Path ${path} is not registered`); + } + for (const [indexes, map] of data) { + if (method === import_router.METHOD_NAME_ALL) { + for (const m in this.#matchers) { + this.#addPath(m, path, handler, indexes, map); + } + } else { + this.#addPath(method, path, handler, indexes, map); + } + } + } + buildAllMatchers() { + return this.#matchers; + } + match = import_matcher.match; + }; + var buildInitParams2 = ({ paths }) => { + const RegExpRouterWithMatcherExport = class extends import_router2.RegExpRouter { + buildAndExportAllMatchers() { + return this.buildAllMatchers(); + } + }; + const router = new RegExpRouterWithMatcherExport(); + for (const path of paths) { + router.add(import_router.METHOD_NAME_ALL, path, path); + } + const matchers = router.buildAndExportAllMatchers(); + const all = matchers[import_router.METHOD_NAME_ALL]; + const relocateMap = {}; + for (const path of paths) { + if (path === "/*" || path === "*") { + continue; + } + all[1].forEach((list, i) => { + list.forEach(([p, map]) => { + if (p === path) { + if (relocateMap[path]) { + relocateMap[path][0][1] = { + ...relocateMap[path][0][1], + ...map + }; + } else { + relocateMap[path] = [[[], map]]; + } + if (relocateMap[path][0][0].findIndex((j) => j === i) === -1) { + relocateMap[path][0][0].push(i); + } + } + }); + }); + for (const path2 in all[2]) { + all[2][path2][0].forEach(([p]) => { + if (p === path) { + relocateMap[path] ||= [[[]]]; + const value = path2 === path ? "" : path2; + if (relocateMap[path][0][0].findIndex((v) => v === value) === -1) { + relocateMap[path][0][0].push(value); + } + } + }); + } + } + for (let i = 0, len = all[1].length; i < len; i++) { + all[1][i] = all[1][i] ? [] : 0; + } + for (const path in all[2]) { + all[2][path][0] = []; + } + return [matchers, relocateMap]; + }; + var serializeInitParams2 = ([matchers, relocateMap]) => { + const matchersStr = JSON.stringify( + matchers, + (_, value) => value instanceof RegExp ? `##${value.toString()}##` : value + ).replace(/"##(.+?)##"/g, (_, str) => str.replace(/\\\\/g, "\\")); + const relocateMapStr = JSON.stringify(relocateMap); + return `[${matchersStr},${relocateMapStr}]`; + }; + } +}); + +// node_modules/hono/dist/cjs/router/reg-exp-router/index.js +var require_reg_exp_router = __commonJS({ + "node_modules/hono/dist/cjs/router/reg-exp-router/index.js"(exports2, module2) { + "use strict"; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var reg_exp_router_exports = {}; + __export(reg_exp_router_exports, { + PreparedRegExpRouter: () => import_prepared_router.PreparedRegExpRouter, + RegExpRouter: () => import_router.RegExpRouter, + buildInitParams: () => import_prepared_router.buildInitParams, + serializeInitParams: () => import_prepared_router.serializeInitParams + }); + module2.exports = __toCommonJS(reg_exp_router_exports); + var import_router = require_router2(); + var import_prepared_router = require_prepared_router(); + } +}); + +// node_modules/hono/dist/cjs/router/smart-router/router.js +var require_router3 = __commonJS({ + "node_modules/hono/dist/cjs/router/smart-router/router.js"(exports2, module2) { + "use strict"; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var router_exports = {}; + __export(router_exports, { + SmartRouter: () => SmartRouter2 + }); + module2.exports = __toCommonJS(router_exports); + var import_router = require_router(); + var SmartRouter2 = class { + name = "SmartRouter"; + #routers = []; + #routes = []; + constructor(init) { + this.#routers = init.routers; + } + add(method, path, handler) { + if (!this.#routes) { + throw new Error(import_router.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 import_router.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/hono/dist/cjs/router/smart-router/index.js +var require_smart_router = __commonJS({ + "node_modules/hono/dist/cjs/router/smart-router/index.js"(exports2, module2) { + "use strict"; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var smart_router_exports = {}; + __export(smart_router_exports, { + SmartRouter: () => import_router.SmartRouter + }); + module2.exports = __toCommonJS(smart_router_exports); + var import_router = require_router3(); + } +}); + +// node_modules/hono/dist/cjs/router/trie-router/node.js +var require_node2 = __commonJS({ + "node_modules/hono/dist/cjs/router/trie-router/node.js"(exports2, module2) { + "use strict"; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var node_exports = {}; + __export(node_exports, { + Node: () => Node + }); + module2.exports = __toCommonJS(node_exports); + var import_router = require_router(); + var import_url = require_url(); + var emptyParams = /* @__PURE__ */ Object.create(null); + var Node = class _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 = (0, import_url.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 = (0, import_url.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 _Node(); + 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; + } + #getHandlerSets(node, method, nodeParams, params) { + const handlerSets = []; + for (let i = 0, len = node.#methods.length; i < len; i++) { + const m = node.#methods[i]; + const handlerSet = m[method] || m[import_router.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; + } + } + } + } + return handlerSets; + } + search(method, path) { + const handlerSets = []; + this.#params = emptyParams; + const curNode = this; + let curNodes = [curNode]; + const parts = (0, import_url.splitPath)(path); + const curNodesQueue = []; + for (let i = 0, len = parts.length; 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["*"]) { + handlerSets.push( + ...this.#getHandlerSets(nextNode.#children["*"], method, node.#params) + ); + } + handlerSets.push(...this.#getHandlerSets(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) { + handlerSets.push(...this.#getHandlerSets(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]; + const restPathString = parts.slice(i).join("/"); + if (matcher instanceof RegExp) { + const m = matcher.exec(restPathString); + if (m) { + params[name] = m[0]; + handlerSets.push(...this.#getHandlerSets(child, method, node.#params, params)); + if (Object.keys(child.#children).length) { + 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) { + handlerSets.push(...this.#getHandlerSets(child, method, params, node.#params)); + if (child.#children["*"]) { + handlerSets.push( + ...this.#getHandlerSets(child.#children["*"], method, params, node.#params) + ); + } + } else { + child.#params = params; + tempNodes.push(child); + } + } + } + } + curNodes = tempNodes.concat(curNodesQueue.shift() ?? []); + } + if (handlerSets.length > 1) { + handlerSets.sort((a, b) => { + return a.score - b.score; + }); + } + return [handlerSets.map(({ handler, params }) => [handler, params])]; + } + }; + } +}); + +// node_modules/hono/dist/cjs/router/trie-router/router.js +var require_router4 = __commonJS({ + "node_modules/hono/dist/cjs/router/trie-router/router.js"(exports2, module2) { + "use strict"; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var router_exports = {}; + __export(router_exports, { + TrieRouter: () => TrieRouter2 + }); + module2.exports = __toCommonJS(router_exports); + var import_url = require_url(); + var import_node = require_node2(); + var TrieRouter2 = class { + name = "TrieRouter"; + #node; + constructor() { + this.#node = new import_node.Node(); + } + add(method, path, handler) { + const results = (0, import_url.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/hono/dist/cjs/router/trie-router/index.js +var require_trie_router = __commonJS({ + "node_modules/hono/dist/cjs/router/trie-router/index.js"(exports2, module2) { + "use strict"; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var trie_router_exports = {}; + __export(trie_router_exports, { + TrieRouter: () => import_router.TrieRouter + }); + module2.exports = __toCommonJS(trie_router_exports); + var import_router = require_router4(); + } +}); + +// node_modules/hono/dist/cjs/hono.js +var require_hono = __commonJS({ + "node_modules/hono/dist/cjs/hono.js"(exports2, module2) { + "use strict"; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var hono_exports = {}; + __export(hono_exports, { + Hono: () => Hono2 + }); + module2.exports = __toCommonJS(hono_exports); + var import_hono_base = require_hono_base(); + var import_reg_exp_router = require_reg_exp_router(); + var import_smart_router = require_smart_router(); + var import_trie_router = require_trie_router(); + var Hono2 = class extends import_hono_base.HonoBase { + constructor(options = {}) { + super(options); + this.router = options.router ?? new import_smart_router.SmartRouter({ + routers: [new import_reg_exp_router.RegExpRouter(), new import_trie_router.TrieRouter()] + }); + } + }; + } +}); + +// node_modules/hono/dist/cjs/index.js +var require_cjs = __commonJS({ + "node_modules/hono/dist/cjs/index.js"(exports2, module2) { + "use strict"; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var src_exports = {}; + __export(src_exports, { + Hono: () => import_hono.Hono + }); + module2.exports = __toCommonJS(src_exports); + var import_hono = require_hono(); + } +}); + +// node_modules/@hono/node-server/dist/index.js +var require_dist = __commonJS({ + "node_modules/@hono/node-server/dist/index.js"(exports2, module2) { + "use strict"; + var __create2 = Object.create; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __getProtoOf2 = Object.getPrototypeOf; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toESM2 = (mod, isNodeMode, target) => (target = mod != null ? __create2(__getProtoOf2(mod)) : {}, __copyProps2( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp2(target, "default", { value: mod, enumerable: true }) : target, + mod + )); + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var src_exports = {}; + __export(src_exports, { + RequestError: () => RequestError, + createAdaptorServer: () => createAdaptorServer, + getRequestListener: () => getRequestListener, + serve: () => serve + }); + module2.exports = __toCommonJS(src_exports); + var import_node_http = require("http"); + var import_node_http22 = require("http2"); + var import_node_http2 = require("http2"); + var import_node_stream = require("stream"); + var RequestError = class extends Error { + constructor(message, options) { + super(message, options); + this.name = "RequestError"; + } + }; + var toRequestError = (e) => { + if (e instanceof RequestError) { + return e; + } + return new RequestError(e.message, { cause: e }); + }; + var GlobalRequest = global.Request; + var Request2 = class extends GlobalRequest { + constructor(input, options) { + if (typeof input === "object" && getRequestCache in input) { + input = input[getRequestCache](); + } + if (typeof options?.body?.getReader !== "undefined") { + ; + options.duplex ??= "half"; + } + super(input, options); + } + }; + var newHeadersFromIncoming = (incoming) => { + const headerRecord = []; + const rawHeaders = incoming.rawHeaders; + for (let i = 0; i < rawHeaders.length; i += 2) { + const { [i]: key, [i + 1]: value } = rawHeaders; + if (key.charCodeAt(0) !== /*:*/ + 58) { + headerRecord.push([key, value]); + } + } + return new Headers(headerRecord); + }; + var wrapBodyStream = Symbol("wrapBodyStream"); + var newRequestFromIncoming = (method, url, headers, incoming, abortController) => { + const init = { + method, + headers, + signal: abortController.signal + }; + if (method === "TRACE") { + init.method = "GET"; + const req = new Request2(url, init); + Object.defineProperty(req, "method", { + get() { + return "TRACE"; + } + }); + return req; + } + if (!(method === "GET" || method === "HEAD")) { + if ("rawBody" in incoming && incoming.rawBody instanceof Buffer) { + init.body = new ReadableStream({ + start(controller) { + controller.enqueue(incoming.rawBody); + controller.close(); + } + }); + } else if (incoming[wrapBodyStream]) { + let reader; + init.body = new ReadableStream({ + async pull(controller) { + try { + reader ||= import_node_stream.Readable.toWeb(incoming).getReader(); + const { done, value } = await reader.read(); + if (done) { + controller.close(); + } else { + controller.enqueue(value); + } + } catch (error) { + controller.error(error); + } + } + }); + } else { + init.body = import_node_stream.Readable.toWeb(incoming); + } + } + return new Request2(url, init); + }; + var getRequestCache = Symbol("getRequestCache"); + var requestCache = Symbol("requestCache"); + var incomingKey = Symbol("incomingKey"); + var urlKey = Symbol("urlKey"); + var headersKey = Symbol("headersKey"); + var abortControllerKey = Symbol("abortControllerKey"); + var getAbortController = Symbol("getAbortController"); + var requestPrototype = { + get method() { + return this[incomingKey].method || "GET"; + }, + get url() { + return this[urlKey]; + }, + get headers() { + return this[headersKey] ||= newHeadersFromIncoming(this[incomingKey]); + }, + [getAbortController]() { + this[getRequestCache](); + return this[abortControllerKey]; + }, + [getRequestCache]() { + this[abortControllerKey] ||= new AbortController(); + return this[requestCache] ||= newRequestFromIncoming( + this.method, + this[urlKey], + this.headers, + this[incomingKey], + this[abortControllerKey] + ); + } + }; + [ + "body", + "bodyUsed", + "cache", + "credentials", + "destination", + "integrity", + "mode", + "redirect", + "referrer", + "referrerPolicy", + "signal", + "keepalive" + ].forEach((k) => { + Object.defineProperty(requestPrototype, k, { + get() { + return this[getRequestCache]()[k]; + } + }); + }); + ["arrayBuffer", "blob", "clone", "formData", "json", "text"].forEach((k) => { + Object.defineProperty(requestPrototype, k, { + value: function() { + return this[getRequestCache]()[k](); + } + }); + }); + Object.setPrototypeOf(requestPrototype, Request2.prototype); + var newRequest = (incoming, defaultHostname) => { + const req = Object.create(requestPrototype); + req[incomingKey] = incoming; + const incomingUrl = incoming.url || ""; + if (incomingUrl[0] !== "/" && // short-circuit for performance. most requests are relative URL. + (incomingUrl.startsWith("http://") || incomingUrl.startsWith("https://"))) { + if (incoming instanceof import_node_http2.Http2ServerRequest) { + throw new RequestError("Absolute URL for :path is not allowed in HTTP/2"); + } + try { + const url2 = new URL(incomingUrl); + req[urlKey] = url2.href; + } catch (e) { + throw new RequestError("Invalid absolute URL", { cause: e }); + } + return req; + } + const host = (incoming instanceof import_node_http2.Http2ServerRequest ? incoming.authority : incoming.headers.host) || defaultHostname; + if (!host) { + throw new RequestError("Missing host header"); + } + let scheme; + if (incoming instanceof import_node_http2.Http2ServerRequest) { + scheme = incoming.scheme; + if (!(scheme === "http" || scheme === "https")) { + throw new RequestError("Unsupported scheme"); + } + } else { + scheme = incoming.socket && incoming.socket.encrypted ? "https" : "http"; + } + const url = new URL(`${scheme}://${host}${incomingUrl}`); + if (url.hostname.length !== host.length && url.hostname !== host.replace(/:\d+$/, "")) { + throw new RequestError("Invalid host header"); + } + req[urlKey] = url.href; + return req; + }; + var responseCache = Symbol("responseCache"); + var getResponseCache = Symbol("getResponseCache"); + var cacheKey = Symbol("cache"); + var GlobalResponse = global.Response; + var Response2 = class _Response { + #body; + #init; + [getResponseCache]() { + delete this[cacheKey]; + return this[responseCache] ||= new GlobalResponse(this.#body, this.#init); + } + constructor(body, init) { + let headers; + this.#body = body; + if (init instanceof _Response) { + const cachedGlobalResponse = init[responseCache]; + if (cachedGlobalResponse) { + this.#init = cachedGlobalResponse; + this[getResponseCache](); + return; + } else { + this.#init = init.#init; + headers = new Headers(init.#init.headers); + } + } else { + this.#init = init; + } + if (typeof body === "string" || typeof body?.getReader !== "undefined" || body instanceof Blob || body instanceof Uint8Array) { + headers ||= init?.headers || { "content-type": "text/plain; charset=UTF-8" }; + this[cacheKey] = [init?.status || 200, body, headers]; + } + } + get headers() { + const cache = this[cacheKey]; + if (cache) { + if (!(cache[2] instanceof Headers)) { + cache[2] = new Headers(cache[2]); + } + return cache[2]; + } + return this[getResponseCache]().headers; + } + get status() { + return this[cacheKey]?.[0] ?? this[getResponseCache]().status; + } + get ok() { + const status = this.status; + return status >= 200 && status < 300; + } + }; + ["body", "bodyUsed", "redirected", "statusText", "trailers", "type", "url"].forEach((k) => { + Object.defineProperty(Response2.prototype, k, { + get() { + return this[getResponseCache]()[k]; + } + }); + }); + ["arrayBuffer", "blob", "clone", "formData", "json", "text"].forEach((k) => { + Object.defineProperty(Response2.prototype, k, { + value: function() { + return this[getResponseCache]()[k](); + } + }); + }); + Object.setPrototypeOf(Response2, GlobalResponse); + Object.setPrototypeOf(Response2.prototype, GlobalResponse.prototype); + async function readWithoutBlocking(readPromise) { + return Promise.race([readPromise, Promise.resolve().then(() => Promise.resolve(void 0))]); + } + function writeFromReadableStreamDefaultReader(reader, writable, currentReadPromise) { + const cancel = (error) => { + reader.cancel(error).catch(() => { + }); + }; + writable.on("close", cancel); + writable.on("error", cancel); + (currentReadPromise ?? reader.read()).then(flow, handleStreamError); + return reader.closed.finally(() => { + writable.off("close", cancel); + writable.off("error", cancel); + }); + function handleStreamError(error) { + if (error) { + writable.destroy(error); + } + } + function onDrain() { + reader.read().then(flow, handleStreamError); + } + function flow({ done, value }) { + try { + if (done) { + writable.end(); + } else if (!writable.write(value)) { + writable.once("drain", onDrain); + } else { + return reader.read().then(flow, handleStreamError); + } + } catch (e) { + handleStreamError(e); + } + } + } + function writeFromReadableStream(stream, writable) { + if (stream.locked) { + throw new TypeError("ReadableStream is locked."); + } else if (writable.destroyed) { + return; + } + return writeFromReadableStreamDefaultReader(stream.getReader(), writable); + } + var buildOutgoingHttpHeaders = (headers) => { + const res = {}; + if (!(headers instanceof Headers)) { + headers = new Headers(headers ?? void 0); + } + const cookies = []; + for (const [k, v] of headers) { + if (k === "set-cookie") { + cookies.push(v); + } else { + res[k] = v; + } + } + if (cookies.length > 0) { + res["set-cookie"] = cookies; + } + res["content-type"] ??= "text/plain; charset=UTF-8"; + return res; + }; + var X_ALREADY_SENT = "x-hono-already-sent"; + var import_node_crypto = __toESM2(require("crypto")); + var webFetch = global.fetch; + if (typeof global.crypto === "undefined") { + global.crypto = import_node_crypto.default; + } + global.fetch = (info, init) => { + init = { + // Disable compression handling so people can return the result of a fetch + // directly in the loader without messing with the Content-Encoding header. + compress: false, + ...init + }; + return webFetch(info, init); + }; + var outgoingEnded = Symbol("outgoingEnded"); + var handleRequestError = () => new Response(null, { + status: 400 + }); + var handleFetchError = (e) => new Response(null, { + status: e instanceof Error && (e.name === "TimeoutError" || e.constructor.name === "TimeoutError") ? 504 : 500 + }); + var handleResponseError = (e, outgoing) => { + const err = e instanceof Error ? e : new Error("unknown error", { cause: e }); + if (err.code === "ERR_STREAM_PREMATURE_CLOSE") { + console.info("The user aborted a request."); + } else { + console.error(e); + if (!outgoing.headersSent) { + outgoing.writeHead(500, { "Content-Type": "text/plain" }); + } + outgoing.end(`Error: ${err.message}`); + outgoing.destroy(err); + } + }; + var flushHeaders = (outgoing) => { + if ("flushHeaders" in outgoing && outgoing.writable) { + outgoing.flushHeaders(); + } + }; + var responseViaCache = async (res, outgoing) => { + let [status, body, header] = res[cacheKey]; + if (header instanceof Headers) { + header = buildOutgoingHttpHeaders(header); + } + if (typeof body === "string") { + header["Content-Length"] = Buffer.byteLength(body); + } else if (body instanceof Uint8Array) { + header["Content-Length"] = body.byteLength; + } else if (body instanceof Blob) { + header["Content-Length"] = body.size; + } + outgoing.writeHead(status, header); + if (typeof body === "string" || body instanceof Uint8Array) { + outgoing.end(body); + } else if (body instanceof Blob) { + outgoing.end(new Uint8Array(await body.arrayBuffer())); + } else { + flushHeaders(outgoing); + await writeFromReadableStream(body, outgoing)?.catch( + (e) => handleResponseError(e, outgoing) + ); + } + ; + outgoing[outgoingEnded]?.(); + }; + var isPromise = (res) => typeof res.then === "function"; + var responseViaResponseObject = async (res, outgoing, options = {}) => { + if (isPromise(res)) { + if (options.errorHandler) { + try { + res = await res; + } catch (err) { + const errRes = await options.errorHandler(err); + if (!errRes) { + return; + } + res = errRes; + } + } else { + res = await res.catch(handleFetchError); + } + } + if (cacheKey in res) { + return responseViaCache(res, outgoing); + } + const resHeaderRecord = buildOutgoingHttpHeaders(res.headers); + if (res.body) { + const reader = res.body.getReader(); + const values = []; + let done = false; + let currentReadPromise = void 0; + if (resHeaderRecord["transfer-encoding"] !== "chunked") { + let maxReadCount = 2; + for (let i = 0; i < maxReadCount; i++) { + currentReadPromise ||= reader.read(); + const chunk = await readWithoutBlocking(currentReadPromise).catch((e) => { + console.error(e); + done = true; + }); + if (!chunk) { + if (i === 1) { + await new Promise((resolve) => setTimeout(resolve)); + maxReadCount = 3; + continue; + } + break; + } + currentReadPromise = void 0; + if (chunk.value) { + values.push(chunk.value); + } + if (chunk.done) { + done = true; + break; + } + } + if (done && !("content-length" in resHeaderRecord)) { + resHeaderRecord["content-length"] = values.reduce((acc, value) => acc + value.length, 0); + } + } + outgoing.writeHead(res.status, resHeaderRecord); + values.forEach((value) => { + ; + outgoing.write(value); + }); + if (done) { + outgoing.end(); + } else { + if (values.length === 0) { + flushHeaders(outgoing); + } + await writeFromReadableStreamDefaultReader(reader, outgoing, currentReadPromise); + } + } else if (resHeaderRecord[X_ALREADY_SENT]) { + } else { + outgoing.writeHead(res.status, resHeaderRecord); + outgoing.end(); + } + ; + outgoing[outgoingEnded]?.(); + }; + var getRequestListener = (fetchCallback, options = {}) => { + const autoCleanupIncoming = options.autoCleanupIncoming ?? true; + if (options.overrideGlobalObjects !== false && global.Request !== Request2) { + Object.defineProperty(global, "Request", { + value: Request2 + }); + Object.defineProperty(global, "Response", { + value: Response2 + }); + } + return async (incoming, outgoing) => { + let res, req; + try { + req = newRequest(incoming, options.hostname); + let incomingEnded = !autoCleanupIncoming || incoming.method === "GET" || incoming.method === "HEAD"; + if (!incomingEnded) { + ; + incoming[wrapBodyStream] = true; + incoming.on("end", () => { + incomingEnded = true; + }); + if (incoming instanceof import_node_http22.Http2ServerRequest) { + ; + outgoing[outgoingEnded] = () => { + if (!incomingEnded) { + setTimeout(() => { + if (!incomingEnded) { + setTimeout(() => { + incoming.destroy(); + outgoing.destroy(); + }); + } + }); + } + }; + } + } + outgoing.on("close", () => { + const abortController = req[abortControllerKey]; + if (abortController) { + if (incoming.errored) { + req[abortControllerKey].abort(incoming.errored.toString()); + } else if (!outgoing.writableFinished) { + req[abortControllerKey].abort("Client connection prematurely closed."); + } + } + if (!incomingEnded) { + setTimeout(() => { + if (!incomingEnded) { + setTimeout(() => { + incoming.destroy(); + }); + } + }); + } + }); + res = fetchCallback(req, { incoming, outgoing }); + if (cacheKey in res) { + return responseViaCache(res, outgoing); + } + } catch (e) { + if (!res) { + if (options.errorHandler) { + res = await options.errorHandler(req ? e : toRequestError(e)); + if (!res) { + return; + } + } else if (!req) { + res = handleRequestError(); + } else { + res = handleFetchError(e); + } + } else { + return handleResponseError(e, outgoing); + } + } + try { + return await responseViaResponseObject(res, outgoing, options); + } catch (e) { + return handleResponseError(e, outgoing); + } + }; + }; + var createAdaptorServer = (options) => { + const fetchCallback = options.fetch; + const requestListener = getRequestListener(fetchCallback, { + hostname: options.hostname, + overrideGlobalObjects: options.overrideGlobalObjects, + autoCleanupIncoming: options.autoCleanupIncoming + }); + const createServer = options.createServer || import_node_http.createServer; + const server = createServer(options.serverOptions || {}, requestListener); + return server; + }; + var serve = (options, listeningListener) => { + const server = createAdaptorServer(options); + server.listen(options?.port ?? 3e3, options.hostname, () => { + const serverInfo = server.address(); + listeningListener && listeningListener(serverInfo); + }); + return server; + }; + } +}); + +// node_modules/@emprespresso/pengueno/dist/server/hono/proxy.js +var require_proxy = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/server/hono/proxy.js"(exports2) { + "use strict"; + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || /* @__PURE__ */ function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + }(); + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.HonoProxy = void 0; + var pengueno_1 = require_dist2(); + var AppLifetimeMetric = pengueno_1.Metric.fromName("HonoAppLifetime").asResult(); + var AppRequestMetric = pengueno_1.Metric.fromName("HonoAppRequest"); + var HonoProxy = class { + server; + app; + constructor(server) { + this.server = server; + } + async initializeApp() { + if (this.app) + return this.app; + const { Hono: Hono2 } = await Promise.resolve().then(() => __importStar(require_cjs())); + this.app = pengueno_1.LogMetricTraceable.of(new Hono2()).flatMap(pengueno_1.TraceUtil.withTrace(`AppId = ${crypto.randomUUID()}`)).flatMap(pengueno_1.TraceUtil.withMetricTrace(AppLifetimeMetric)); + return this.app; + } + async serve(port, hostname) { + const { serve } = await Promise.resolve().then(() => __importStar(require_dist())); + const app = await this.initializeApp(); + return app.map((tApp) => pengueno_1.Either.fromFailable(() => { + const app2 = tApp.get(); + app2.all("*", async (c) => tApp.flatMap(pengueno_1.TraceUtil.withMetricTrace(AppRequestMetric)).move(c.req).flatMap((tRequest) => pengueno_1.PenguenoRequest.from(tRequest)).map((req) => this.server.serve(req)).map(pengueno_1.TraceUtil.promiseify((tResponse) => { + tResponse.trace.trace(AppRequestMetric.count.withValue(1)); + return new Response(tResponse.get().body(), tResponse.get()); + })).get()); + return serve({ + fetch: (_r) => app2.fetch(_r), + port, + hostname + }); + })).peek(pengueno_1.TraceUtil.traceResultingEither()).peek((tServe) => tServe.get().mapRight(() => tServe.trace.trace(`haii im still listening at http://${hostname}:${port} ~uwu dont think i forgot`))).map((tEitherServer) => tEitherServer.get().mapRight((server) => tEitherServer.move(server)).flatMapAsync((tServer) => pengueno_1.Signals.awaitClose(tServer))).peek(pengueno_1.TraceUtil.promiseify(pengueno_1.TraceUtil.traceResultingEither(AppLifetimeMetric))).get(); + } + }; + exports2.HonoProxy = HonoProxy; + } +}); + +// node_modules/@emprespresso/pengueno/dist/server/hono/index.js +var require_hono2 = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/server/hono/index.js"(exports2) { + "use strict"; + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + }); + var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + __exportStar(require_proxy(), exports2); + } +}); + +// node_modules/@emprespresso/pengueno/dist/server/index.js +var require_server = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/server/index.js"(exports2) { + "use strict"; + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + }); + var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + __exportStar(require_http(), exports2); + __exportStar(require_response(), exports2); + __exportStar(require_request(), exports2); + __exportStar(require_activity(), exports2); + __exportStar(require_filter(), exports2); + __exportStar(require_hono2(), exports2); + } +}); + +// node_modules/@emprespresso/pengueno/dist/index.js +var require_dist2 = __commonJS({ + "node_modules/@emprespresso/pengueno/dist/index.js"(exports2) { + "use strict"; + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + }); + var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + __exportStar(require_leftpadesque(), exports2); + __exportStar(require_types(), exports2); + __exportStar(require_trace4(), exports2); + __exportStar(require_process(), exports2); + __exportStar(require_server(), exports2); + } +}); + +// node_modules/@emprespresso/ci_model/dist/job/index.js +var import_pengueno = __toESM(require_dist2(), 1); +var JobTypes = [ + "fetch_code", + "ci_pipeline", + "build_docker_image.js", + "ansible_playbook.js", + "checkout_ci.js", + "npm_publish.js", + "coolify_webhook.js" +]; +var isJobType = (j) => typeof j === "string" && JobTypes.includes(j); +var isJob = (j) => !!((0, import_pengueno.isObject)(j) && "arguments" in j && (0, import_pengueno.isObject)(j.arguments) && "type" in j && isJobType(j.type) && j); + +// node_modules/@emprespresso/ci_model/dist/pipeline/index.js +var import_pengueno3 = __toESM(require_dist2(), 1); + +// node_modules/@emprespresso/ci_model/dist/pipeline/builder.js +var BasePipelineBuilder = class { + stages = []; + addStage(stage) { + this.stages.push(stage); + return this; + } + build() { + return new PipelineImpl(this.stages); + } +}; +var DefaultGitHookPipelineBuilder = class extends BasePipelineBuilder { + remoteUrl; + refname; + constructor(remoteUrl = process.env.remote, rev = process.env.rev, refname = process.env.refname) { + super(); + this.remoteUrl = remoteUrl; + this.refname = refname; + this.addStage({ + parallelJobs: [ + { + type: "fetch_code", + arguments: { + remoteUrl, + checkout: rev, + path: this.getSourceDestination() + } + } + ] + }); + } + getSourceDestination() { + return this.remoteUrl.replace(".git", "").split("/").at(-1) ?? "src"; + } + getBranch() { + const branchRefPrefix = "refs/heads/"; + return this.refname.split(branchRefPrefix).at(1); + } +}; + +// node_modules/@emprespresso/ci_model/dist/pipeline/impl.js +var import_pengueno2 = __toESM(require_dist2(), 1); +var PipelineImpl = class _PipelineImpl { + serialJobs; + constructor(serialJobs) { + this.serialJobs = serialJobs; + } + serialize() { + return JSON.stringify({ serialJobs: this.serialJobs }); + } + static from(s) { + return import_pengueno2.Either.fromFailable(() => JSON.parse(s)).flatMap((eitherPipelineJson) => isPipeline(eitherPipelineJson) ? import_pengueno2.Either.right(eitherPipelineJson) : import_pengueno2.Either.left(new Error("oh noes D: its a bad pipewine :(("))).mapRight((pipeline) => new _PipelineImpl(pipeline.serialJobs)); + } +}; + +// node_modules/@emprespresso/ci_model/dist/pipeline/index.js +var isPipelineStage = (t) => (0, import_pengueno3.isObject)(t) && "parallelJobs" in t && Array.isArray(t.parallelJobs) && t.parallelJobs.every((j) => isJob(j)); +var isPipeline = (t) => (0, import_pengueno3.isObject)(t) && "serialJobs" in t && Array.isArray(t.serialJobs) && t.serialJobs.every((p) => isPipelineStage(p)); + +// dist/ci.js +var REGISTRY = "img.liz.coffee"; +var NAMESPACE = "emprespresso"; +var IMG = "adelie"; +var getPipeline = () => { + const gitHookPipeline = new DefaultGitHookPipelineBuilder(); + const branch = gitHookPipeline.getBranch(); + if (!branch) + return gitHookPipeline.build(); + const commonBuildArgs = { + context: gitHookPipeline.getSourceDestination(), + registry: REGISTRY, + namespace: NAMESPACE, + imageTag: branch + }; + const adeliePackageBuild = { + type: "build_docker_image.js", + arguments: { + ...commonBuildArgs, + repository: IMG, + buildTarget: IMG, + dockerfile: "Dockerfile" + } + }; + gitHookPipeline.addStage({ + parallelJobs: [adeliePackageBuild] + }); + const isRelease = branch === "release"; + if (!isRelease) { + return gitHookPipeline.build(); + } + const release = { + type: "coolify_webhook.js", + arguments: { + webhookUrl: "https://plane.liz.coffee/api/v1/deploy?uuid=mkgcsgw800cwkog004sco44w&force=false" + } + }; + gitHookPipeline.addStage({ parallelJobs: [ + release + ] }); + return gitHookPipeline.build(); +}; +var main = () => { + const data = getPipeline().serialize(); + process.stdout.write(data); +}; +main(); diff --git a/.ci/ci.json b/.ci/ci.json new file mode 100644 index 0000000..6a51028 --- /dev/null +++ b/.ci/ci.json @@ -0,0 +1,3 @@ +{ + "workflow": ".ci/ci.cjs" +} diff --git a/.ci/ci.ts b/.ci/ci.ts new file mode 100644 index 0000000..e04f11d --- /dev/null +++ b/.ci/ci.ts @@ -0,0 +1,67 @@ +#!/usr/bin/env node + +import { + AnsiblePlaybookJob, + BuildDockerImageJob, + DefaultGitHookPipelineBuilder, + NpmPublishJob, + FetchCodeJob, + CoolifyWebhookJob, + Job, +} from '@emprespresso/ci_model'; +import { join } from 'path'; + +const REGISTRY = 'img.liz.coffee'; +const NAMESPACE = 'emprespresso'; +const IMG = 'adelie'; +const REMOTE = 'https://code.liz.coffee'; + +const getPipeline = () => { + const gitHookPipeline = new DefaultGitHookPipelineBuilder(); + const branch = gitHookPipeline.getBranch(); + if (!branch) return gitHookPipeline.build(); + + const commonBuildArgs = { + context: gitHookPipeline.getSourceDestination(), + registry: REGISTRY, + namespace: NAMESPACE, + imageTag: branch, + }; + + const adeliePackageBuild: BuildDockerImageJob = { + type: 'build_docker_image.js', + arguments: { + ...commonBuildArgs, + repository: IMG, + buildTarget: IMG, + dockerfile: 'Dockerfile', + }, + }; + gitHookPipeline.addStage({ + parallelJobs: [adeliePackageBuild], + }); + + const isRelease = branch === 'release'; + if (!isRelease) { + return gitHookPipeline.build(); + } + + const release: CoolifyWebhookJob = { + type: 'coolify_webhook.js', + arguments: { + webhookUrl: 'https://plane.liz.coffee/api/v1/deploy?uuid=mkgcsgw800cwkog004sco44w&force=false', + }, + }; + gitHookPipeline.addStage({ parallelJobs: [ + release + ] }); + + return gitHookPipeline.build(); +}; + +const main = () => { + const data = getPipeline().serialize(); + process.stdout.write(data); +}; + +main(); diff --git a/.ci/package-lock.json b/.ci/package-lock.json new file mode 100644 index 0000000..b400133 --- /dev/null +++ b/.ci/package-lock.json @@ -0,0 +1,544 @@ +{ + "name": ".ci", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@emprespresso/ci_model": "^0.3.0" + }, + "devDependencies": { + "@types/node": "^24.10.1", + "esbuild": "0.25.5" + } + }, + "node_modules/@emprespresso/ci_model": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@emprespresso/ci_model/-/ci_model-0.3.0.tgz", + "integrity": "sha512-Ik7hYZXqsTr+VH70F+ms8HGHb0QeSOpojiFYgQoyW4iXvEdih5jsAH5npWOqxOHviynRu8PIeqJ3z5HizvO1JQ==", + "dependencies": { + "@emprespresso/pengueno": "^0.0.17" + } + }, + "node_modules/@emprespresso/pengueno": { + "version": "0.0.17", + "resolved": "https://registry.npmjs.org/@emprespresso/pengueno/-/pengueno-0.0.17.tgz", + "integrity": "sha512-pyfXLYGoLlQlMQAyYptRLLiRrnQmCju4I1/sv1KtsJv06oPvNqzHqUzJJGHrXg/90krg7GRcxLKQ0TnQ2Bskjw==", + "license": "MIT", + "engines": { + "node": ">=22.16.0", + "npm": ">=10.0.0" + }, + "optionalDependencies": { + "@hono/node-server": "^1.18.2", + "hono": "^4.8.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hono/node-server": { + "version": "1.19.7", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.7.tgz", + "integrity": "sha512-vUcD0uauS7EU2caukW8z5lJKtoGMokxNbJtBiwHgpqxEXokaHCBkQUmCHhjFB1VUTWdqj25QoMkMKzgjq+uhrw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, + "node_modules/@types/node": { + "version": "24.10.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.3.tgz", + "integrity": "sha512-gqkrWUsS8hcm0r44yn7/xZeV1ERva/nLgrLxFRUGb7aoNMIJfZJ3AC261zDQuOAKC7MiXai1WCpYc48jAHoShQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/esbuild": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" + } + }, + "node_modules/hono": { + "version": "4.10.8", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.10.8.tgz", + "integrity": "sha512-DDT0A0r6wzhe8zCGoYOmMeuGu3dyTAE40HHjwUsWFTEy5WxK1x2WDSsBPlEXgPbRIFY6miDualuUDbasPogIww==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/.ci/package.json b/.ci/package.json new file mode 100644 index 0000000..e8b3c72 --- /dev/null +++ b/.ci/package.json @@ -0,0 +1,17 @@ +{ + "scripts": { + "build": "tsc && esbuild --format=cjs --target=node22 --platform=node --bundle --outfile=ci.cjs dist/ci.js && chmod +x ci.cjs", + "clean": "rm -rf dist ci.cjs" + }, + "dependencies": { + "@emprespresso/ci_model": "^0.3.0" + }, + "devDependencies": { + "@types/node": "^24.10.1", + "esbuild": "0.25.5" + }, + "files": [ + "dist/**/*", + "package.json" + ] +} diff --git a/.ci/tsconfig.json b/.ci/tsconfig.json new file mode 100644 index 0000000..7cfeadc --- /dev/null +++ b/.ci/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "lib": ["ES2022"], + "moduleResolution": "node", + "outDir": "./dist", + "rootDir": "./", + "composite": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "noEmit": false, + "strict": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["**/*.ts"], + "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.spec.ts"] +} diff --git a/.demo/index.html b/.demo/index.html new file mode 100644 index 0000000..1b93990 --- /dev/null +++ b/.demo/index.html @@ -0,0 +1,48 @@ +<!doctype html> +<html lang="en"> + <head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <title>Liz Dot Coffee!</title> + <link rel="stylesheet" href="/static/css/style.css" /> + <link rel="icon" href="/static/img/favicon.ico" /> + </head> + <body> + <header> + <nav> + <a href="#home">Home</a> + <a href="#about">About</a> + <a href="#archive">Archive</a> + </nav> + <input type="checkbox" id="theme-toggle" class="toggle" aria-label="Toggle dark mode" /> + </header> + + <main> + <article> + <h2>Welcome to the 90s</h2> + <p><small>Posted on December 9, 2025</small></p> + <p> + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do + eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad + minim veniam, quis nostrud exercitation ullamco laboris nisi ut + aliquip ex ea commodo consequat. + </p> + <p> + Duis aute irure dolor in reprehenderit in voluptate velit esse cillum + dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non + proident, sunt in culpa qui officia deserunt mollit anim id est + laborum. + </p> + <a href="#read-more">Read more →</a> + </article> + + </main> + + <footer> + <p>© 2025 My Retro Blog. Made with coffee and nostalgia.</p> + </footer> + + <script src="/static/js/script.js"></script> + <script src="/static/oneko/oneko.js"></script> + </body> +</html> diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..c336721 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,7 @@ +.git +.gitignore +.claude +.demo +.DS_Store +README.md +*.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8b32a77 --- /dev/null +++ b/.gitignore @@ -0,0 +1,32 @@ +# OS +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# IDE +.vscode +.idea +*.swp +*.swo +*~ +.vim + +# Environment +.env +.env.local + +# Node (if you add build tooling later) +node_modules/ +npm-debug.log +yarn-error.log + +# Docker +.docker + +# Temporary files +*.tmp +*.log diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f993163 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM nginx:alpine as adelie + +COPY static/ /usr/share/nginx/html/ + +COPY nginx.conf /etc/nginx/nginx.conf + +EXPOSE 80 + +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ + CMD wget --quiet --tries=1 --spider http://localhost/ || exit 1 diff --git a/index.html b/index.html new file mode 100644 index 0000000..dcaa56b --- /dev/null +++ b/index.html @@ -0,0 +1,593 @@ +<!doctype html> +<html lang="en"> + <head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <title>Liz CSS - Framework Demo</title> + <link rel="stylesheet" href="/static/css/style.css" /> + <link rel="icon" href="/static/img/favicon.ico" /> + <style> + .demo-section { + margin-bottom: var(--space-xl); + } + + .component-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: var(--space-md); + margin: var(--space-md) 0; + } + + .component-box { + border: 2px solid var(--border-light); + padding: var(--space-md); + background: var(--surface); + box-shadow: var(--shadow-box); + } + + .component-box > :last-child { + margin-bottom: 0; + } + + .component-label { + display: block; + font-size: 0.75rem; + color: var(--muted); + margin-bottom: var(--space-xs); + text-transform: uppercase; + letter-spacing: 0.05em; + } + + .button-row { + display: flex; + gap: var(--space-sm); + flex-wrap: wrap; + margin: var(--space-md) 0; + } + + .form-group { + margin-bottom: var(--space-md); + } + + code { + background: var(--bg); + padding: 0.25rem 0.5rem; + border: 1px solid var(--border-light); + font-size: 0.875rem; + font-family: var(--font-mono); + } + + .color-swatch { + display: inline-block; + width: 40px; + height: 40px; + border: 2px solid var(--border-light); + margin-right: var(--space-sm); + vertical-align: middle; + box-shadow: var(--shadow-sm); + } + </style> + </head> + <body> + <header> + <nav> + <a href="/">Home</a> + <a href="/demo.html">Components</a> + </nav> + <input type="checkbox" id="theme-toggle" class="toggle" aria-label="Toggle dark mode" /> + </header> + + <main> + <!-- Color Palette --> + <article> + <h2>Color Palette</h2> + <p>A retro-themed minimal CSS framework with carefully selected colors for light and dark modes.</p> + + <h3>Primary Colors</h3> + <div class="component-grid"> + <div class="component-box"> + <span class="component-label">Primary</span> + <div style="display: flex; align-items: center;"> + <div + class="color-swatch" + style="background: var(--primary);" + ></div> + <code>#ff69b4</code> + </div> + </div> + <div class="component-box"> + <span class="component-label">Primary Light</span> + <div style="display: flex; align-items: center;"> + <div + class="color-swatch" + style="background: var(--primary-light);" + ></div> + <code>#ff85c0</code> + </div> + </div> + <div class="component-box"> + <span class="component-label">Primary Dark</span> + <div style="display: flex; align-items: center;"> + <div + class="color-swatch" + style="background: var(--primary-dark);" + ></div> + <code>#ff4a9f</code> + </div> + </div> + </div> + + <h3>Secondary Colors</h3> + <div class="component-grid"> + <div class="component-box"> + <span class="component-label">Secondary</span> + <div style="display: flex; align-items: center;"> + <div + class="color-swatch" + style="background: var(--secondary);" + ></div> + <code>#b19cd9</code> + </div> + </div> + <div class="component-box"> + <span class="component-label">Secondary Light</span> + <div style="display: flex; align-items: center;"> + <div + class="color-swatch" + style="background: var(--secondary-light);" + ></div> + <code>#c4b5fd</code> + </div> + </div> + <div class="component-box"> + <span class="component-label">Secondary Dark</span> + <div style="display: flex; align-items: center;"> + <div + class="color-swatch" + style="background: var(--secondary-dark);" + ></div> + <code>#9d7eb8</code> + </div> + </div> + </div> + + <h3>Status Colors</h3> + <div class="component-grid"> + <div class="component-box"> + <span class="component-label">Success</span> + <div style="display: flex; align-items: center;"> + <div + class="color-swatch" + style="background: var(--success);" + ></div> + <code>#4caf50</code> + </div> + </div> + <div class="component-box"> + <span class="component-label">Error</span> + <div style="display: flex; align-items: center;"> + <div class="color-swatch" style="background: var(--error);"></div> + <code>#f44336</code> + </div> + </div> + <div class="component-box"> + <span class="component-label">Warning</span> + <div style="display: flex; align-items: center;"> + <div + class="color-swatch" + style="background: var(--warning);" + ></div> + <code>#ff9800</code> + </div> + </div> + <div class="component-box"> + <span class="component-label">Info</span> + <div style="display: flex; align-items: center;"> + <div class="color-swatch" style="background: var(--info);"></div> + <code>#2196f3</code> + </div> + </div> + </div> + </article> + + <!-- Buttons --> + <article> + <h2>Buttons</h2> + <p>Retro-styled buttons with multiple variants and states.</p> + + <h3>Basic Buttons</h3> + <div class="button-row"> + <button>Default (Secondary)</button> + <button class="primary">Primary</button> + <button class="secondary">Secondary</button> + <button class="contrast">Contrast</button> + </div> + + <h3>Status Buttons</h3> + <div class="button-row"> + <button class="success">Success</button> + <button class="error">Error</button> + <button class="warning">Warning</button> + <button class="info">Info</button> + </div> + + <h3>Button States</h3> + <div class="button-row"> + <button>Normal</button> + <button disabled>Disabled</button> + </div> + </article> + + <!-- Forms --> + <article> + <h2>Forms</h2> + <p>Complete form styling with retro aesthetics.</p> + + <form> + <div class="form-group"> + <label for="text-input">Text Input</label> + <input + type="text" + id="text-input" + placeholder="Enter some text..." + /> + </div> + + <div class="form-group"> + <label for="email-input">Email Input</label> + <input + type="email" + id="email-input" + placeholder="you@example.com" + /> + </div> + + <div class="form-group"> + <label for="number-input">Number Input</label> + <input type="number" id="number-input" placeholder="42" /> + </div> + + <div class="form-group"> + <label for="textarea">Textarea</label> + <textarea + id="textarea" + placeholder="Write your message here..." + ></textarea> + </div> + + <div class="form-group"> + <label for="select">Select Dropdown</label> + <select id="select"> + <option>Choose an option</option> + <option>Option 1</option> + <option>Option 2</option> + <option>Option 3</option> + </select> + </div> + + <fieldset> + <legend>Checkboxes</legend> + <div class="form-group"> + <input type="checkbox" id="check1" /> + <label for="check1" style="display: inline; margin: 0;"> + Checkbox 1 + </label> + </div> + <div class="form-group"> + <input type="checkbox" id="check2" /> + <label for="check2" style="display: inline; margin: 0;"> + Checkbox 2 + </label> + </div> + </fieldset> + + <fieldset> + <legend>Radio Buttons</legend> + <div class="form-group"> + <input type="radio" id="radio1" name="radio-group" /> + <label for="radio1" style="display: inline; margin: 0;"> + Option A + </label> + </div> + <div class="form-group"> + <input type="radio" id="radio2" name="radio-group" /> + <label for="radio2" style="display: inline; margin: 0;"> + Option B + </label> + </div> + </fieldset> + + <div class="button-row mt-md"> + <button type="submit" class="primary">Submit</button> + <button type="reset" class="secondary">Reset</button> + <button type="button" class="contrast">Cancel</button> + </div> + </form> + </article> + + <!-- Alerts --> + <article> + <h2>Alerts</h2> + <p>Status messages and notifications with semantic colors.</p> + + <div class="alert info"> + <strong>ℹ️ Info:</strong> This is an informational message. + </div> + + <div class="alert success"> + <strong>✓ Success:</strong> Operation completed successfully! + </div> + + <div class="alert warning"> + <strong>⚠️ Warning:</strong> Please review this before proceeding. + </div> + + <div class="alert error"> + <strong>✗ Error:</strong> Something went wrong. Please try again. + </div> + </article> + + <!-- Badges --> + <article> + <h2>Badges & Pills</h2> + <p>Small inline elements for labels, tags, and status indicators.</p> + + <h3>Default Badges</h3> + <p> + <span class="badge">Default</span> + <span class="badge primary">Primary</span> + <span class="badge secondary">Secondary</span> + <span class="badge contrast">Contrast</span> + </p> + + <h3>Status Badges</h3> + <p> + <span class="badge success">✓ Success</span> + <span class="badge error">✗ Error</span> + <span class="badge warning">⚠️ Warning</span> + <span class="badge info">ℹ️ Info</span> + </p> + </article> + + <!-- Typography & Helpers --> + <article> + <h2>Typography & Helper Classes</h2> + <p>Text utilities and spacing helpers for quick styling.</p> + + <h3>Text Colors</h3> + <p> + Default text <span class="text-muted">(muted)</span> + <span class="text-success">success text</span> + <span class="text-error">error text</span> + <span class="text-warning">warning text</span> + <span class="text-info">info text</span> + <span class="text-contrast">contrast text</span> + </p> + + <h3>Text Alignment</h3> + <p class="text-left">Left aligned</p> + <p class="text-center">Center aligned</p> + <p class="text-right">Right aligned</p> + + <h3>Spacing Helpers</h3> + <p> + Use <code>.mt-xs</code>, <code>.mt-sm</code>, <code>.mt-md</code>, + <code>.mt-lg</code>, <code>.mt-xl</code> for margin-top. + </p> + <p> + Use <code>.mb-xs</code>, <code>.mb-sm</code>, <code>.mb-md</code>, + <code>.mb-lg</code>, <code>.mb-xl</code> for margin-bottom. + </p> + <p> + Use <code>.mx-auto</code> for horizontal centering and + <code>.py-md</code> for vertical padding. + </p> + + <div class="component-box mt-md mb-lg mx-auto" style="max-width: 400px;"> + <p class="text-center">Example: Component with margin and padding utilities</p> + </div> + </article> + + <!-- Headings --> + <article> + <h2>Heading Styles</h2> + <h1>Heading 1</h1> + <h2>Heading 2</h2> + <h3>Heading 3</h3> + <h4>Heading 4</h4> + <h5>Heading 5</h5> + <h6>Heading 6</h6> + </article> + + <!-- Lists --> + <article> + <h2>Lists</h2> + + <h3>Unordered List</h3> + <ul> + <li>Item one with some text</li> + <li>Item two with more text</li> + <li>Item three with even more text</li> + <li>Nested lists: + <ul> + <li>Sub-item one</li> + <li>Sub-item two</li> + </ul> + </li> + </ul> + + <h3>Ordered List</h3> + <ol> + <li>First step in the process</li> + <li>Second step follows naturally</li> + <li>Third step completes the sequence</li> + </ol> + </article> + + <!-- Blockquotes --> + <article> + <h2>Blockquotes</h2> + <blockquote> + "The best time to plant a tree was 20 years ago. The second best time is now." + <br /> + <small>— Chinese Proverb</small> + </blockquote> + </article> + + <!-- Links --> + <article> + <h2>Links</h2> + <p> + This is a <a href="#demo">hyperlink</a> styled with the framework. Links + have a bottom border and change color on hover. You can use them + <a href="#inline">inline within text</a> or as standalone elements. + </p> + </article> + + <!-- Tables --> + <article> + <h2>Tables</h2> + <p>Tables with retro styling, alternating row colors, and hover effects.</p> + <table> + <thead> + <tr> + <th>Feature</th> + <th>Light Mode</th> + <th>Dark Mode</th> + </tr> + </thead> + <tbody> + <tr> + <td>Background</td> + <td>Warm cream</td> + <td>Warm taupe</td> + </tr> + <tr> + <td>Buttons</td> + <td>Lavender primary</td> + <td>Rose primary</td> + </tr> + <tr> + <td>Borders</td> + <td>Retro 90s beveled</td> + <td>Retro 90s beveled</td> + </tr> + <tr> + <td>Accents</td> + <td>Pink & brown</td> + <td>Pink & brown</td> + </tr> + </tbody> + </table> + </article> + + <!-- Code --> + <article> + <h2>Code</h2> + <p>Inline <code>const x = 42;</code> looks different from block code:</p> + <pre><code>function retro() { + return "That's totally rad!"; +} + +retro(); // "That's totally rad!"</code></pre> + </article> + + <!-- Dividers --> + <article> + <h2>Dividers</h2> + <p>Use <code><hr></code> to separate content sections:</p> + <hr /> + <p>Content after the divider looks fresh and organized.</p> + </article> + + <!-- Form Validation --> + <article> + <h2>Form Validation</h2> + <p>Invalid inputs show a red border when they fail validation.</p> + <form> + <div class="form-group"> + <label for="valid-email">Valid Email</label> + <input + type="email" + id="valid-email" + placeholder="you@example.com" + value="user@example.com" + /> + </div> + <div class="form-group"> + <label for="invalid-email">Invalid Email</label> + <input + type="email" + id="invalid-email" + placeholder="you@example.com" + value="not-an-email" + /> + </div> + <div class="form-group"> + <label for="required-field">Required Field (empty = invalid)</label> + <input + type="text" + id="required-field" + placeholder="This field is required" + required + /> + </div> + </form> + </article> + + <!-- Button Groups --> + <article> + <h2>Button Groups</h2> + <p>Combine buttons into a group with the <code>.button-group</code> class:</p> + <div class="button-group mt-md"> + <button class="primary">First</button> + <button class="secondary">Second</button> + <button class="contrast">Third</button> + </div> + </article> + + <!-- Toggle Switches --> + <article> + <h2>Toggle Switches</h2> + <p>Use checkboxes with the <code>.toggle</code> class to create stylish toggle switches:</p> + <div class="form-group mt-md"> + <input type="checkbox" id="toggle1" class="toggle" /> + <label for="toggle1">Dark mode</label> + </div> + <div class="form-group"> + <input type="checkbox" id="toggle2" class="toggle" checked /> + <label for="toggle2">Notifications enabled</label> + </div> + <div class="form-group"> + <input type="checkbox" id="toggle3" class="toggle" /> + <label for="toggle3">Auto-save</label> + </div> + </article> + + <!-- Range Sliders --> + <article> + <h2>Range Sliders</h2> + <p>Native range inputs styled with retro beveled appearance:</p> + <div class="form-group mt-md"> + <label for="volume">Volume</label> + <input type="range" id="volume" min="0" max="100" value="50" /> + </div> + <div class="form-group"> + <label for="brightness">Brightness</label> + <input type="range" id="brightness" min="0" max="100" value="75" /> + </div> + <div class="form-group"> + <label for="saturation">Saturation</label> + <input type="range" id="saturation" min="0" max="100" value="25" /> + </div> + </article> + + </main> + + <footer> + <p>© 2025 Liz CSS Framework. Made with coffee and retro vibes.</p> + </footer> + + <script src="/static/js/script.js"></script> + </body> +</html> diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..2024c55 --- /dev/null +++ b/nginx.conf @@ -0,0 +1,81 @@ +user nginx; +worker_processes auto; +error_log /var/log/nginx/error.log warn; +pid /var/run/nginx.pid; + +events { + worker_connections 1024; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main; + + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 65; + types_hash_max_size 2048; + client_max_body_size 20M; + + # Gzip compression + gzip on; + gzip_vary on; + gzip_min_length 1024; + gzip_types text/plain text/css text/xml text/javascript + application/x-javascript application/xml+rss + application/javascript application/json; + + server { + listen 80; + server_name _; + root /usr/share/nginx/html; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + add_header Referrer-Policy "no-referrer-when-downgrade" always; + + # CORS headers - allow requests from any origin + add_header Access-Control-Allow-Origin "*" always; + add_header Access-Control-Allow-Methods "GET, OPTIONS" always; + add_header Access-Control-Allow-Headers "Content-Type" always; + + # Handle preflight requests + if ($request_method = 'OPTIONS') { + return 204; + } + + # CSS and JS - long cache, versioning handled by filenames + location ~* \.(css|js)$ { + expires 1y; + add_header Cache-Control "public, immutable, max-age=31536000" always; + } + + # Fonts - long cache + location ~* \.(woff|woff2|ttf|otf|eot)$ { + expires 1y; + add_header Cache-Control "public, immutable, max-age=31536000" always; + } + + # Images - moderate cache + location ~* \.(jpg|jpeg|png|gif|svg|ico|webp)$ { + expires 30d; + add_header Cache-Control "public, max-age=2592000" always; + } + + # Everything else - short cache + location / { + expires 1h; + add_header Cache-Control "public, max-age=3600" always; + try_files $uri $uri/ =404; + } + } +} diff --git a/static/css/style.css b/static/css/style.css new file mode 100644 index 0000000..c51d1e0 --- /dev/null +++ b/static/css/style.css @@ -0,0 +1,1096 @@ +:root { + --bg: #f9f5f0; + --bg-pattern: #f0ebe5; + --fg: #2a1810; + + /* Primary colors */ + --primary: #e8739d; + --primary-light: #f08db5; + --primary-dark: #d85980; + + /* Secondary colors */ + --secondary: #b19cd9; + --secondary-light: #c4b5fd; + --secondary-dark: #9d7eb8; + + /* Accent colors */ + --accent-brown: #8b6f47; + --accent-brown-light: #a8865b; + --accent-brown-dark: #6e5837; + + /* Status colors */ + --success: #4caf50; + --error: #d32f2f; + --warning: #ff9800; + --info: #2196f3; + + /* Neutral colors */ + --border: #2a1810; + --surface: #ffe8f0; + --surface-alt: #fdfcfb; + --muted: #6b5d54; + --border-light: #c0c0c0; + + /* Legacy aliases */ + --accent-pink: #e8739d; + --accent-lavender: #b19cd9; + + --space-xs: 0.5rem; + --space-sm: 1rem; + --space-md: 1.5rem; + --space-lg: 2rem; + --space-xl: 3rem; + + --border-width: 2px; + --border-style: solid; + + --font-mono: "Mono", monospace; + --line-height: 1.4; + + --shadow-sm: 1px 1px 0, 2px 2px 0, 1px 2px 0; + --shadow-md: 1px 1px 0, 2px 2px 0, 3px 3px 0, 2px 1px 0; + --shadow-lg: 1px 1px 0, 2px 2px 0, 3px 3px 0, 4px 4px 0, 2px 1px 0, 1px 2px 0, + 3px 1px 0; + --shadow-color: rgba(42, 24, 16, 0.5); + --shadow-box: 3px 3px 0 rgba(0, 0, 0, 0.2); + --shadow-button: 2px 2px 0 rgba(0, 0, 0, 0.2); + --highlight: rgba(255, 255, 255, 0.4); + --lowlight: rgba(42, 24, 16, 0.6); + + --content-max-width: 1000px; +} + +[data-theme="dark"] { + --bg: #35302a; + --bg-pattern: #2b2620; + --fg: #f5f5f5; + + --primary: #e8739d; + --primary-light: #f08db5; + --primary-dark: #d85980; + + --secondary: #b19cd9; + --secondary-light: #c4b5fd; + --secondary-dark: #9d7eb8; + + --accent-brown: #d4a574; + --accent-brown-light: #e8b896; + --accent-brown-dark: #b8885a; + + --border: #e8e8e8; + --border-light: #8b7d6b; + --surface: #3f3932; + --surface-alt: #47403a; + --muted: #a89f94; + + --accent-pink: #e8739d; + --accent-lavender: #b19cd9; + + --shadow-color: rgba(0, 0, 0, 0.8); + --highlight: rgba(255, 255, 255, 0.3); + --lowlight: rgba(0, 0, 0, 0.8); +} + +@font-face { + font-family: "Mono"; + src: url("/static/fonts/Maple.woff2") format("woff2"); + font-display: swap; + font-weight: normal; +} + +@supports (font-synthesis: none) { + @font-face { + font-family: "Mono"; + src: url("/static/fonts/Maple.woff2") format("woff2"); + font-synthesis: none; + } +} + +/* base */ + +* { + box-sizing: border-box; + margin: 0; + padding: 0; + cursor: + url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 24" width="32" height="24"><path d="M1 3h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v2H9v1h1v2h1v2h-1v1H8v-1H7v-2H6v-2H5v1H4v1H3v1H1" fill="%23ff69b4" stroke="%23b19cd9" stroke-width="0.5"/><path d="M2 5h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1H8v2h1v2h1v2H8v-2H7v-2H6v-1H5v1H4v1H3v1H2" fill="white" stroke="%23ff69b4" stroke-width="0.5"/></svg>') + 0 0, + auto !important; +} + +html { + font-size: 16px; + background-color: var(--bg); + position: relative; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + height: 100vh; +} + +html::before { + content: ""; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: linear-gradient( + 45deg, + rgba(0, 0, 0, 0.2) 25%, + transparent 25%, + transparent 75%, + rgba(0, 0, 0, 0.2) 75% + ), + linear-gradient( + 45deg, + rgba(0, 0, 0, 0.2) 25%, + transparent 25%, + transparent 75%, + rgba(0, 0, 0, 0.2) 75% + ), + url("/static/img/bg.png"); + background-size: + 10px 10px, + 10px 10px, + auto; + background-position: + 0 0, + 5px 5px, + 0 0; + background-repeat: repeat; + opacity: 0.15; + z-index: -1; + pointer-events: none; +} + +body { + background: transparent; + color: var(--fg); + line-height: var(--line-height); + padding: var(--space-md); + padding-top: calc(var(--space-md) + 3rem); + max-width: var(--content-max-width); + margin: 0 auto; + font-family: var(--font-mono); + scrollbar-color: var(--accent-lavender) var(--bg); + scrollbar-width: thin; + display: flex; + flex-direction: column; + height: 100vh; +} + +/* webkit scrollbar (chrome, safari, edge) */ +::-webkit-scrollbar { + width: 12px; +} + +::-webkit-scrollbar-track { + background: var(--bg); + border: 2px solid var(--border-light); +} + +::-webkit-scrollbar-thumb { + background: var(--accent-lavender); + border: 2px outset var(--border-light); + box-shadow: + inset 1px 1px 0 var(--highlight), + inset -1px -1px 0 var(--lowlight); +} + +::-webkit-scrollbar-thumb:hover { + background: var(--accent-pink); +} + +.div-centered { + max-width: var(--content-max-width); + margin: auto; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + min-height: calc(100vh - 4.5rem); + text-align: justify; +} + +/* typography */ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: var(--font-mono); + font-weight: bold; + line-height: 1.2; + margin-bottom: var(--space-md); + border: 2px solid var(--border-light); + padding: var(--space-sm); + background-size: 4px 4px; + background-color: var(--accent-pink); + background-position: + 0 0, + 2px 2px; + color: var(--bg); +} + +h1 { + font-size: 2rem; + margin-bottom: var(--space-lg); +} +h2 { + font-size: 1.5rem; + background-size: 4px 4px; + background-position: + 0 0, + 2px 2px; + background-color: var(--accent-lavender); + margin-bottom: var(--space-md); +} +h3 { + font-size: 1.25rem; + background-size: 4px 4px; + background-position: + 0 0, + 2px 2px; + background-color: var(--accent-brown); + box-shadow: var(--shadow-box); +} +h4 { + font-size: 1.1rem; +} +h5 { + font-size: 1rem; +} +h6 { + font-size: 0.9rem; +} + +p { + margin-bottom: var(--space-sm); +} + +a { + color: var(--accent-pink); + text-decoration: none; + border-bottom: 2px solid var(--accent-pink); + font-weight: bold; +} + +a:hover { + background: var(--accent-pink); + color: var(--bg); +} + +small { + color: var(--muted); + font-size: 0.875rem; +} + +blockquote { + border-left: 3px solid var(--accent-brown); + padding-left: var(--space-md); + margin: var(--space-md) 0; + font-style: italic; + color: var(--muted); +} + +/* lists */ + +ul, +ol { + margin: var(--space-sm) 0; + padding-left: var(--space-lg); +} + +li { + margin-bottom: var(--space-xs); +} + +/* tables */ + +table { + width: 100%; + border-collapse: collapse; + margin: var(--space-md) 0; + border: 2px solid var(--border-light); + background: var(--bg); + box-shadow: + inset 1px 1px 0 rgba(255, 255, 255, 0.3), + inset -1px -1px 0 rgba(0, 0, 0, 0.6), + 3px 3px 0 rgba(0, 0, 0, 0.15); +} + +thead { + background: var(--secondary); + color: var(--bg); + font-weight: bold; +} + +th, +td { + padding: var(--space-xs) var(--space-sm); + border: 1px solid var(--border-light); + text-align: left; +} + +tbody tr:nth-child(odd) { + background: var(--surface-alt); +} + +tbody tr:nth-child(even) { + background: var(--bg); +} + +tbody tr:hover { + background: rgba(232, 115, 157, 0.1); +} + +/* code */ + +code { + background: var(--bg); + padding: 0.25rem 0.5rem; + border: 1px solid var(--border-light); + font-size: 0.875rem; + font-family: var(--font-mono); +} + +pre { + background: var(--bg); + border: 2px solid var(--border-light); + padding: var(--space-md); + margin: var(--space-md) 0; + overflow-x: auto; + box-shadow: + inset 1px 1px 0 rgba(255, 255, 255, 0.3), + inset -1px -1px 0 rgba(0, 0, 0, 0.6), + 3px 3px 0 rgba(0, 0, 0, 0.15); +} + +pre code { + background: transparent; + border: none; + padding: 0; + font-size: 0.875rem; +} + +/* dividers */ + +hr { + border: none; + border-top: 2px solid var(--border-light); + margin: var(--space-lg) 0; + height: 0; +} + +/* layout */ + +header { + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 1000; + border-bottom: 2px outset var(--border-light); + padding: 0.4rem var(--space-md); + margin-bottom: 0; + background: var(--surface); + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--space-md); +} + +header h1 { + display: none; +} + +header::before { + content: ""; + display: inline-block; + width: 1.5rem; + height: 1.5rem; + background-image: url("/static/img/coffee.svg"); + background-size: contain; + background-repeat: no-repeat; + margin-right: 0.5rem; +} + +nav { + display: flex; + gap: var(--space-md); + flex-wrap: wrap; + align-items: center; + margin: 0; + flex: 1; +} + +nav a { + font-size: 0.85rem; + padding: 0.2rem 0.4rem; + color: var(--fg); + border-bottom: 2px solid var(--accent-pink); +} + +main { + flex: 1; +} + +article { + border: 2px solid var(--border-light); + padding: var(--space-md); + margin-bottom: var(--space-lg); + background: var(--surface); + box-shadow: + inset 1px 1px 0 rgba(255, 255, 255, 0.3), + inset -1px -1px 0 rgba(0, 0, 0, 0.6), + 4px 4px 0 rgba(0, 0, 0, 0.2), + 5px 5px 0 rgba(0, 0, 0, 0.08); +} + +article > :last-child { + margin-bottom: 0; +} + +article h2 { + margin: calc(var(--space-md) * -1) calc(var(--space-md) * -1) var(--space-md); + border-left: none; + border-right: none; + border-top: none; +} + +footer { + border: 2px solid var(--border-light); + padding: var(--space-md); + text-align: center; + background: var(--surface); + font-size: 0.875rem; + box-shadow: + inset 1px 1px 0 rgba(255, 255, 255, 0.3), + inset -1px -1px 0 rgba(0, 0, 0, 0.6), + 4px 4px 0 rgba(0, 0, 0, 0.2), + 5px 5px 0 rgba(0, 0, 0, 0.08); +} + +footer > :last-child { + margin-bottom: 0; +} + +/* components */ + +/* forms */ + +input, +textarea, +select { + font-family: var(--font-mono); + padding: var(--space-xs) var(--space-sm); + border: 2px outset var(--border-light); + background: var(--bg); + color: var(--fg); + font-size: 0.875rem; + box-shadow: + inset 1px 1px 0 var(--highlight), + inset -1px -1px 0 var(--lowlight), + inset 2px 2px 0 rgba(255, 255, 255, 0.2), + inset -2px -2px 0 rgba(0, 0, 0, 0.4); + transition: border-color 0.2s, box-shadow 0.2s; + width: 100%; + max-width: 100%; +} + +input::placeholder, +textarea::placeholder, +select::placeholder { + color: var(--muted); + opacity: 0.8; +} + +[data-theme="dark"] input::placeholder, +[data-theme="dark"] textarea::placeholder, +[data-theme="dark"] select::placeholder { + color: #b8b0a0; + opacity: 1; +} + +input:focus, +textarea:focus, +select:focus { + outline: none; + border-color: var(--primary); + box-shadow: + inset 1px 1px 0 var(--highlight), + inset -1px -1px 0 var(--lowlight), + 0 0 0 2px var(--primary); +} + +input:invalid, +textarea:invalid { + border-color: var(--error); +} + +input:invalid:focus, +textarea:invalid:focus { + box-shadow: + inset 1px 1px 0 var(--highlight), + inset -1px -1px 0 var(--lowlight), + 0 0 0 2px var(--error); +} + +textarea { + resize: vertical; + min-height: 4rem; + width: 100%; +} + +select { + cursor: pointer; + appearance: none; + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232a1810' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 0.5rem center; + background-size: 1.2em; + padding-right: 2.5rem; +} + +[data-theme="dark"] select { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23f5e6e8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); +} + +option { + background: var(--bg); + color: var(--fg); + padding: var(--space-sm); +} + +option:checked { + background: linear-gradient(var(--primary), var(--primary)); + color: var(--bg); +} + +input[type="checkbox"], +input[type="radio"] { + appearance: none; + width: 1.3rem; + height: 1.3rem; + min-width: 1.3rem; + min-height: 1.3rem; + padding: 0; + cursor: pointer; + margin: 0 0.5rem 0 0; + vertical-align: middle; + border: 2px solid var(--border-light); + box-shadow: inset 1px 1px 0 var(--highlight), inset -1px -1px 0 var(--lowlight); + background: var(--bg); + display: inline-flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + font-weight: normal; +} + +input[type="radio"] { + border-radius: 50%; +} + +input[type="checkbox"]:checked, +input[type="radio"]:checked { + background: var(--primary); +} + +label { + display: block; + margin-bottom: var(--space-xs); + font-weight: bold; + color: var(--fg); +} + +input[type="checkbox"] + label, +input[type="radio"] + label { + display: inline; + margin: 0; + font-weight: normal; +} + +/* toggle switches */ + +input[type="checkbox"].toggle { + appearance: none; + width: 2.8rem; + height: 1.6rem; + padding: 0; + margin: 0 0.5rem 0 0; + border: 2px outset var(--border-light); + background: var(--muted); + cursor: pointer; + position: relative; + vertical-align: middle; + box-shadow: + inset 1px 1px 0 rgba(255, 255, 255, 0.3), + inset -1px -1px 0 rgba(0, 0, 0, 0.6); + transition: background 0.2s; +} + +input[type="checkbox"].toggle:checked { + background: var(--primary); +} + +input[type="checkbox"].toggle::after { + content: ""; + position: absolute; + width: 0.6rem; + height: 0.6rem; + background: var(--surface); + border: 2px outset var(--border-light); + top: 50%; + transform: translateY(-50%); + left: 0.2rem; + transition: left 0.2s; + box-shadow: + inset 1px 1px 0 var(--highlight), + inset -1px -1px 0 var(--lowlight); +} + +input[type="checkbox"].toggle:checked::after { + left: 1.5rem; +} + +[data-theme="dark"] input[type="checkbox"].toggle { + background: var(--secondary); +} + +[data-theme="dark"] input[type="checkbox"].toggle:checked { + background: var(--primary); +} + +[data-theme="dark"] input[type="checkbox"].toggle::after { + background: var(--accent-brown-light); +} + +#theme-toggle::before { + content: "☾"; + position: absolute; + right: 0.4rem; + top: 50%; + transform: translateY(-50%); + font-size: 0.9rem; + line-height: 1; + color: var(--bg); + transition: opacity 0.2s; +} + +#theme-toggle:checked::before { + content: "☀"; + right: auto; + left: 0.4rem; +} + +/* range sliders */ + +input[type="range"] { + width: 100%; + height: 2.2rem; + background: transparent; + cursor: pointer; + appearance: none; + vertical-align: middle; +} + +input[type="range"]::-webkit-slider-thumb { + appearance: none; + width: 1.5rem; + height: 1rem; + margin-top: -0.25rem; + background: linear-gradient(135deg, var(--primary-light) 0%, var(--primary) 50%, var(--primary-dark) 100%); + border: 2px outset var(--border-light); + cursor: pointer; + box-shadow: + inset 1px 1px 0 var(--highlight), + inset -1px -1px 0 var(--lowlight), + 2px 2px 0 rgba(0, 0, 0, 0.3), + 3px 3px 0 rgba(0, 0, 0, 0.1); +} + +input[type="range"]::-webkit-slider-thumb:active { + box-shadow: + inset 1px 1px 0 var(--lowlight), + inset -1px -1px 0 var(--highlight), + 1px 1px 0 rgba(0, 0, 0, 0.2); +} + +input[type="range"]::-moz-range-thumb { + width: 1.5rem; + height: 0.8rem; + margin-top: -0.15rem; + background: linear-gradient(135deg, var(--primary-light) 0%, var(--primary) 50%, var(--primary-dark) 100%); + border: 2px outset var(--border-light); + cursor: pointer; + box-shadow: + inset 1px 1px 0 var(--highlight), + inset -1px -1px 0 var(--lowlight), + 2px 2px 0 rgba(0, 0, 0, 0.3), + 3px 3px 0 rgba(0, 0, 0, 0.1); + border-radius: 0.3rem; +} + +input[type="range"]::-moz-range-thumb:active { + box-shadow: + inset 1px 1px 0 var(--lowlight), + inset -1px -1px 0 var(--highlight), + 1px 1px 0 rgba(0, 0, 0, 0.2); +} + +input[type="range"]::-webkit-slider-runnable-track { + background: linear-gradient(180deg, + #c0c0c0 0%, + #e8e8e8 1px, + #dfdfdf 2px, + #d0d0d0 100%); + border: 2px inset var(--border-light); + height: 0.8rem; + box-shadow: + inset 2px 2px 0 rgba(255, 255, 255, 0.8), + inset -2px -2px 0 rgba(0, 0, 0, 0.4), + inset 1px 1px 0 rgba(0, 0, 0, 0.1); +} + +input[type="range"]::-moz-range-track { + background: transparent; + border: none; +} + +input[type="range"]::-moz-range-progress { + background: linear-gradient(180deg, + var(--secondary-light) 0%, + var(--secondary) 50%, + var(--secondary-dark) 100%); + height: 0.8rem; + border: 2px inset var(--border-light); + box-shadow: + inset 2px 2px 0 rgba(255, 255, 255, 0.6), + inset -2px -2px 0 rgba(0, 0, 0, 0.3); +} + +fieldset { + border: 2px solid var(--border-light); + padding: var(--space-md); + margin: var(--space-md) 0; + background: var(--surface); + box-shadow: + inset 1px 1px 0 rgba(255, 255, 255, 0.3), + inset -1px -1px 0 rgba(0, 0, 0, 0.6); +} + +fieldset > :last-child { + margin-bottom: 0; +} + +legend { + padding: 0 var(--space-xs); + margin-left: calc(var(--space-xs) * -1); + font-weight: bold; + color: var(--fg); + background: var(--surface); +} + +/* buttons */ + +button { + font-family: var(--font-mono); + font-weight: bold; + padding: var(--space-xs) var(--space-sm); + border: 2px outset var(--border-light); + background: var(--secondary); + color: var(--bg); + font-size: 0.875rem; + box-shadow: + inset 1px 1px 0 rgba(255, 255, 255, 0.6), + inset -1px -1px 0 rgba(0, 0, 0, 0.8), + 3px 3px 0 rgba(0, 0, 0, 0.3), + 4px 4px 0 rgba(0, 0, 0, 0.1); + transition: + transform 0.05s, + box-shadow 0.05s; + cursor: pointer; +} + +button:hover { + background: var(--secondary-dark); + transform: translate(1px, 1px); + box-shadow: + inset 1px 1px 0 rgba(255, 255, 255, 0.6), + inset -1px -1px 0 rgba(0, 0, 0, 0.8), + 2px 2px 0 rgba(0, 0, 0, 0.3), + 3px 3px 0 rgba(0, 0, 0, 0.1); +} + +button:active { + transform: translate(4px, 4px); + box-shadow: + inset 1px 1px 0 rgba(0, 0, 0, 0.6), + inset -1px -1px 0 rgba(255, 255, 255, 0.3); +} + +/* button variants */ + +button.primary { + background: var(--primary); + color: var(--bg); +} + +button.primary:hover { + background: var(--primary-dark); +} + +button.secondary { + background: var(--secondary); + color: var(--bg); +} + +button.secondary:hover { + background: var(--secondary-dark); +} + +button.success { + background: var(--success); + color: white; +} + +button.success:hover { + background: #45a049; +} + +button.error { + background: var(--error); + color: white; +} + +button.error:hover { + background: #da190b; +} + +button.warning { + background: var(--warning); + color: white; +} + +button.warning:hover { + background: #e68900; +} + +button.info { + background: var(--info); + color: white; +} + +button.info:hover { + background: #0b7dda; +} + +button.contrast { + background: var(--fg); + color: var(--bg); +} + +button.contrast:hover { + background: var(--muted); +} + +button:disabled { + opacity: 0.6; + cursor: not-allowed; + transform: none !important; +} + +/* button groups */ + +.button-group { + display: inline-flex; + border: 2px solid var(--border-light); + box-shadow: + inset 1px 1px 0 rgba(255, 255, 255, 0.3), + inset -1px -1px 0 rgba(0, 0, 0, 0.6), + 3px 3px 0 rgba(0, 0, 0, 0.15); +} + +.button-group button { + border: none; + margin: 0; + border-radius: 0; + box-shadow: none; +} + +.button-group button:not(:last-child) { + border-right: 1px solid var(--border-light); +} + +.button-group button:hover { + box-shadow: none; + transform: none; +} + +.button-group button:active { + box-shadow: none; + transform: none; +} + +/* alerts & messages */ + +.alert { + padding: var(--space-md); + margin: var(--space-md) 0; + border: 2px solid var(--border-light); + border-left: 4px solid var(--info); + background: var(--surface); + box-shadow: + inset 1px 1px 0 rgba(255, 255, 255, 0.3), + inset -1px -1px 0 rgba(0, 0, 0, 0.6), + 3px 3px 0 rgba(0, 0, 0, 0.15); +} + +.alert.success { + border-left-color: var(--success); + background-color: rgba(76, 175, 80, 0.1); +} + +.alert.error { + border-left-color: var(--error); + background-color: rgba(244, 67, 54, 0.1); +} + +.alert.warning { + border-left-color: var(--warning); + background-color: rgba(255, 152, 0, 0.1); +} + +.alert.info { + border-left-color: var(--info); + background-color: rgba(33, 150, 243, 0.1); +} + +/* badges & pills */ + +.badge { + display: inline-block; + padding: 0.25rem 0.5rem; + margin: 0 0.25rem; + background: var(--secondary); + color: var(--bg); + font-size: 0.75rem; + font-weight: bold; + border: 1px solid var(--border-light); +} + +.badge.primary { + background: var(--primary); +} + +.badge.success { + background: var(--success); + color: white; +} + +.badge.error { + background: var(--error); + color: white; +} + +.badge.warning { + background: var(--warning); + color: white; +} + +.badge.info { + background: var(--info); + color: white; +} + +.badge.contrast { + background: var(--fg); + color: var(--bg); +} + +/* helpers */ + +.text-success { + color: var(--success); + font-weight: bold; +} + +.text-error { + color: var(--error); + font-weight: bold; +} + +.text-warning { + color: var(--warning); + font-weight: bold; +} + +.text-info { + color: var(--info); + font-weight: bold; +} + +.text-muted { + color: var(--muted); +} + +.text-contrast { + color: var(--fg); + font-weight: bold; +} + +.text-center { + text-align: center; +} + +.text-right { + text-align: right; +} + +.text-left { + text-align: left; +} + +.mt-xs { margin-top: var(--space-xs); } +.mt-sm { margin-top: var(--space-sm); } +.mt-md { margin-top: var(--space-md); } +.mt-lg { margin-top: var(--space-lg); } +.mt-xl { margin-top: var(--space-xl); } + +.mb-xs { margin-bottom: var(--space-xs); } +.mb-sm { margin-bottom: var(--space-sm); } +.mb-md { margin-bottom: var(--space-md); } +.mb-lg { margin-bottom: var(--space-lg); } +.mb-xl { margin-bottom: var(--space-xl); } + +.mx-auto { + margin-left: auto; + margin-right: auto; +} + +.py-md { + padding-top: var(--space-md); + padding-bottom: var(--space-md); +} + +#theme-toggle { + margin-left: auto; + margin-bottom: 0; +} + +/* fairy dust */ + +@keyframes fairy-float { + 0% { + opacity: 1; + transform: translateY(0) scale(1); + } + 100% { + opacity: 0; + transform: translateY(40px) scale(0.5); + } +} diff --git a/static/fonts/Maple.woff2 b/static/fonts/Maple.woff2 Binary files differnew file mode 100644 index 0000000..d3641fe --- /dev/null +++ b/static/fonts/Maple.woff2 diff --git a/static/img/bg.png b/static/img/bg.png Binary files differnew file mode 100644 index 0000000..ea94170 --- /dev/null +++ b/static/img/bg.png diff --git a/static/img/coffee.svg b/static/img/coffee.svg new file mode 100644 index 0000000..6af3eb0 --- /dev/null +++ b/static/img/coffee.svg @@ -0,0 +1 @@ +<svg width="204px" height="204px" viewBox="-18.84 -18.84 194.68 194.68" fill="none" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-width="0.0015700000000000002"><g id="SVGRepo_bgCarrier" stroke-width="0" transform="translate(0,0), scale(1)"><path transform="translate(-18.84, -18.84), scale(6.08375)" d="M16,28.672317050397396C18.31019580278986,28.2492161923862,20.2732111521931,26.99234854284714,22.22073913936633,25.679659043211117C24.127366861271128,24.394537490790135,25.84350121926335,22.969351099553855,27.207365683721115,21.11823241156485C28.855289926924616,18.881570747242566,31.555662342817374,16.560601341223236,30.934563352822963,13.852733959571268C30.302022488817116,11.09498229551077,26.31418626067045,10.80293362739891,24.369898252036975,8.747441879726399C22.55386301116009,6.827538329157004,22.39818646202665,3.463064528936453,20.018930330343107,2.312780259965523C17.59833094374456,1.1425080228546827,14.7175880565881,2.0894044150766757,12.133389019927773,2.8315323274189463C9.536657763486245,3.5772592311590525,7.109482085544481,4.741066569459143,5.13648206207502,6.586708122017956C3.006323451987645,8.579363569332521,1.0783726105729996,10.91609544657453,0.4467599464953871,13.763781679012817C-0.2082631527120915,16.71701610198979,0.17394751493839977,19.907649932952697,1.588898275944473,22.581329637307697C2.966376966040265,25.184202414500273,5.406992313651175,27.115734563799965,8.11954849467532,28.262221895045247C10.592483099379827,29.307430917857573,13.359176898336845,29.155970651888726,16,28.672317050397396" fill="#d789c2" strokewidth="0"></path></g><g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round" stroke="#CCCCCC" stroke-width="0.314"></g><g id="SVGRepo_iconCarrier"> <path d="M110.141 105.576C96.714 121.559 78.41 126.921 57.8404 126.461C48.0426 126.242 38.5532 124.287 29.6507 119.996C21.0151 115.849 13.8877 109.113 9.26087 100.725C1.31196 86.7238 -1.51423 71.802 1.42616 55.9055C1.95451 53.0504 2.78281 50.6968 5.77702 48.7921C14.6953 43.12 24.5975 40.5643 34.7215 39.0179C52.2556 36.3394 69.9583 35.5137 87.6256 37.4768C96.4862 38.571 105.282 40.1405 113.974 42.1782C120.873 43.7088 121.161 44.4426 122.299 51.0283C124.826 50.076 127.287 48.8407 129.89 48.2244C137.928 46.321 146.036 49.694 150.971 56.8566C159.312 68.9647 159.897 90.8936 141.598 103.408C134.633 108.171 127.062 111.108 118.467 109.068C115.705 108.414 113.157 106.871 110.141 105.576ZM7.48613 60.7776C6.80916 74.4717 10.5484 88.0212 18.1529 99.4299C21.9884 105.486 27.6061 110.205 34.2332 112.938C53.1758 120.589 72.1183 120.798 90.7281 111.8C97.8239 108.467 103.608 102.867 107.169 95.8831C113.287 83.9521 114.614 71.1562 114.163 57.8476C111.421 58.838 108.948 60.1448 106.327 60.6043C98.0568 62.0482 89.7633 63.9515 81.4246 64.2738C56.7705 65.2183 32.089 65.4822 7.48613 60.7776ZM12.0851 53.445L12.2439 54.5108C14.8968 54.9591 17.5373 55.7014 20.2033 55.8071C38.4174 56.5291 56.6301 57.4086 74.8546 57.633C84.5454 57.7518 94.2875 56.8966 103.682 54.0559C105.551 53.4814 107.344 52.6811 109.019 51.6728C109.387 51.396 109.684 51.035 109.884 50.6201C110.085 50.2052 110.183 49.7483 110.171 49.2876C110.01 48.8628 109.754 48.4803 109.424 48.169C109.093 47.8577 108.695 47.626 108.262 47.4913C105.439 46.6892 102.579 45.7946 99.6799 45.5393C90.8804 44.7629 82.0645 44.0738 73.24 43.7062C55.8983 42.9842 38.7672 44.4538 22.1113 49.6618C18.7056 50.7257 15.4232 52.1736 12.0851 53.445ZM121.919 60.9351C123.237 60.5505 123.934 60.3174 124.645 60.1435C131.837 58.3871 138.888 61.7272 141.406 68.1935C142.991 72.3095 143.243 76.8194 142.128 81.0866C139.165 93.009 127.383 100.055 114.914 97.4334L113.81 99.9977C117.765 100.51 121.481 101.729 124.999 101.306C134.8 100.125 141.801 94.4096 145.446 85.4289C148.98 76.7285 147.977 67.9605 142.516 60.1743C137.774 53.4167 126.476 53.6386 121.919 60.9351ZM118.297 91.057C129.417 92.5219 138.779 81.0564 135.039 70.2117C133.499 65.7433 126.466 63.7048 122.963 66.7843C122.391 67.4073 122.029 68.194 121.928 69.0336C120.691 76.3012 119.52 83.58 118.297 91.057Z" fill="#000000"></path> <path d="M71.5597 23.6403C71.4213 27.5784 70.4781 30.6284 67.9781 32.7844C67.3946 33.2055 66.7338 33.5073 66.0335 33.6726C65.3332 33.838 64.6072 33.8635 63.897 33.7479C61.9989 33.3941 61.8768 31.3924 62.392 29.9983C64.2009 25.0994 63.2229 20.5332 61.909 15.673C60.6179 10.8982 62.2233 6.19353 64.8671 1.98247C65.8516 0.417761 67.2509 -0.428245 69.002 0.453873C70.6809 1.29792 70.7085 2.96437 70.0226 4.44967C67.7687 9.34923 67.965 14.0801 70.3639 18.9022C71.1666 20.5096 71.2788 22.4589 71.5597 23.6403Z" fill="#000000"></path> <path d="M30.7492 33.957C30.8056 33.4942 30.9415 33.0446 31.1509 32.6279C33.4395 29.2537 32.4839 26.0645 30.8811 22.7533C27.625 16.0245 28.6037 9.86546 33.6305 4.36207C34.214 3.7228 34.8415 2.84596 35.5798 2.68581C36.8453 2.41277 38.5334 2.12988 39.4667 2.73765C40.8844 3.65652 40.1545 5.12214 39.2921 6.44269C38.0646 8.36348 36.9638 10.3623 35.9966 12.4265C34.7135 15.0971 35.421 17.6877 36.3904 20.3367C37.4965 23.0444 38.2923 25.8687 38.7624 28.7555C39.1989 32.3122 37.1387 35.4974 34.4825 36.5358C32.2207 37.4185 30.6534 36.4387 30.7492 33.957Z" fill="#000000"></path> <path d="M81.2775 21.5097C80.6356 19.1049 80.1322 16.7644 79.3827 14.506C77.8672 9.93984 79.1582 5.90791 81.5486 2.06833C82.5633 0.437333 84.0808 -0.588516 85.9651 0.369081C87.9479 1.37722 87.2666 3.14804 86.5558 4.65827C85.7964 6.17182 85.4249 7.85033 85.4747 9.54299C85.5245 11.2356 85.9941 12.8894 86.8413 14.3557C89.4778 19.4003 89.6163 24.519 85.6245 28.9749C84.3315 30.4188 82.3283 31.4126 80.461 32.0951C78.9836 32.6353 77.8902 31.8326 78.5294 29.922C79.4588 27.1516 80.3462 24.368 81.2775 21.5097Z" fill="#000000"></path> <path d="M53.649 2.89527C53.3685 3.81941 53.0419 4.72891 52.6704 5.62037C50.9055 9.27223 51.3163 12.7528 53.2381 16.2281C55.11 19.6135 56.4811 23.2667 55.8851 27.1509C55.4731 29.3524 54.5625 31.4303 53.223 33.2253C52.6454 34.0274 50.574 34.3791 49.5199 33.9971C48.7862 33.7346 48.0839 31.7479 48.3083 30.7417C49.4346 25.6997 48.4685 21.171 46.2954 16.5373C43.8538 11.3305 45.0404 6.26947 48.7547 1.96324C49.432 1.17563 50.979 0.854745 52.1131 0.877061C52.6513 0.887562 53.1633 2.21596 53.649 2.89527Z" fill="#000000"></path> </g></svg>
\ No newline at end of file diff --git a/static/img/favicon.ico b/static/img/favicon.ico Binary files differnew file mode 100644 index 0000000..e441116 --- /dev/null +++ b/static/img/favicon.ico diff --git a/static/js/script.js b/static/js/script.js new file mode 100644 index 0000000..d04c09d --- /dev/null +++ b/static/js/script.js @@ -0,0 +1,76 @@ +(() => { + const toggleButton = document.getElementById("theme-toggle"); + const html = document.documentElement; + + const sessionTheme = sessionStorage.getItem("theme"); + const systemPrefersDark = window.matchMedia( + "(prefers-color-scheme: dark)", + ).matches; + + const initialTheme = sessionTheme || (systemPrefersDark ? "dark" : "light"); + + if (initialTheme === "dark") { + html.setAttribute("data-theme", "dark"); + toggleButton.checked = true; + } + + toggleButton.addEventListener("change", () => { + const theme = html.getAttribute("data-theme"); + + if (theme === "dark") { + html.removeAttribute("data-theme"); + sessionStorage.setItem("theme", "light"); + toggleButton.checked = false; + } else { + html.setAttribute("data-theme", "dark"); + sessionStorage.setItem("theme", "dark"); + toggleButton.checked = true; + } + }); +})(); + +(() => { + const colors = [ + "#ff69b4", + "#b19cd9", + "#8b6f47", + "#ff85c0", + "#c4b5fd", + "#d4a574", + ]; + const shapes = ["❀", "✿", "✽", "✾", "✻", "❊", "❋", "✼"]; + + document.addEventListener("mousemove", (e) => { + createParticle(e.clientX, e.clientY); + }); + + const createParticle = (x, y) => { + const particle = document.createElement("div"); + particle.className = "fairy-dust"; + + const shape = shapes[Math.floor(Math.random() * shapes.length)]; + const size = Math.random() * 8 + 6; + const color = colors[Math.floor(Math.random() * colors.length)]; + const offsetX = (Math.random() - 0.5) * 20; + const offsetY = (Math.random() - 0.5) * 20; + const rotation = Math.random() * 360; + + particle.textContent = shape; + particle.style.cssText = ` + position: fixed; + left: ${x + offsetX}px; + top: ${y + offsetY}px; + font-size: ${size}px; + color: ${color}; + opacity: 0.4; + pointer-events: none; + z-index: 9001; /* it's over 9000 */ + line-height: 1; + transform: rotate(${rotation}deg); + animation: fairy-float 0.8s ease-out forwards; + `; + + document.body.appendChild(particle); + setTimeout(() => particle.remove(), 800); + }; +})(); diff --git a/static/oneko/oneko.gif b/static/oneko/oneko.gif Binary files differnew file mode 100644 index 0000000..a009c2c --- /dev/null +++ b/static/oneko/oneko.gif diff --git a/static/oneko/oneko.js b/static/oneko/oneko.js new file mode 100644 index 0000000..058f168 --- /dev/null +++ b/static/oneko/oneko.js @@ -0,0 +1,284 @@ +// oneko.js: https://github.com/adryd325/oneko.js + +(function oneko() { + const isReducedMotion = + window.matchMedia(`(prefers-reduced-motion: reduce)`) === true || + window.matchMedia(`(prefers-reduced-motion: reduce)`).matches === true; + + if (isReducedMotion) return; + + const nekoEl = document.createElement("div"); + let persistPosition = true; + + let nekoPosX = 32; + let nekoPosY = 32; + + let mousePosX = 0; + let mousePosY = 0; + + let frameCount = 0; + let idleTime = 0; + let idleAnimation = null; + let idleAnimationFrame = 0; + + const nekoSpeed = 10; + const spriteSets = { + idle: [[-3, -3]], + alert: [[-7, -3]], + scratchSelf: [ + [-5, 0], + [-6, 0], + [-7, 0], + ], + scratchWallN: [ + [0, 0], + [0, -1], + ], + scratchWallS: [ + [-7, -1], + [-6, -2], + ], + scratchWallE: [ + [-2, -2], + [-2, -3], + ], + scratchWallW: [ + [-4, 0], + [-4, -1], + ], + tired: [[-3, -2]], + sleeping: [ + [-2, 0], + [-2, -1], + ], + N: [ + [-1, -2], + [-1, -3], + ], + NE: [ + [0, -2], + [0, -3], + ], + E: [ + [-3, 0], + [-3, -1], + ], + SE: [ + [-5, -1], + [-5, -2], + ], + S: [ + [-6, -3], + [-7, -2], + ], + SW: [ + [-5, -3], + [-6, -1], + ], + W: [ + [-4, -2], + [-4, -3], + ], + NW: [ + [-1, 0], + [-1, -1], + ], + }; + + function init() { + let nekoFile = "/static/oneko/oneko.gif"; + const curScript = document.currentScript; + if (curScript && curScript.dataset.cat) { + nekoFile = curScript.dataset.cat; + } + if (curScript && curScript.dataset.persistPosition) { + if (curScript.dataset.persistPosition === "") { + persistPosition = true; + } else { + persistPosition = JSON.parse( + curScript.dataset.persistPosition.toLowerCase(), + ); + } + } + + if (persistPosition) { + let storedNeko = JSON.parse(window.localStorage.getItem("oneko")); + if (storedNeko !== null) { + nekoPosX = storedNeko.nekoPosX; + nekoPosY = storedNeko.nekoPosY; + mousePosX = storedNeko.mousePosX; + mousePosY = storedNeko.mousePosY; + frameCount = storedNeko.frameCount; + idleTime = storedNeko.idleTime; + idleAnimation = storedNeko.idleAnimation; + idleAnimationFrame = storedNeko.idleAnimationFrame; + nekoEl.style.backgroundPosition = storedNeko.bgPos; + } + } + + nekoEl.id = "oneko"; + nekoEl.ariaHidden = true; + nekoEl.style.width = "32px"; + nekoEl.style.height = "32px"; + nekoEl.style.position = "fixed"; + nekoEl.style.pointerEvents = "none"; + nekoEl.style.imageRendering = "pixelated"; + nekoEl.style.left = `${nekoPosX - 16}px`; + nekoEl.style.top = `${nekoPosY - 16}px`; + nekoEl.style.zIndex = 2147483647; + + nekoEl.style.backgroundImage = `url(${nekoFile})`; + + document.body.appendChild(nekoEl); + + document.addEventListener("mousemove", function (event) { + mousePosX = event.clientX; + mousePosY = event.clientY; + }); + + if (persistPosition) { + window.addEventListener("beforeunload", function (event) { + window.localStorage.setItem( + "oneko", + JSON.stringify({ + nekoPosX: nekoPosX, + nekoPosY: nekoPosY, + mousePosX: mousePosX, + mousePosY: mousePosY, + frameCount: frameCount, + idleTime: idleTime, + idleAnimation: idleAnimation, + idleAnimationFrame: idleAnimationFrame, + bgPos: nekoEl.style.backgroundPosition, + }), + ); + }); + } + + window.requestAnimationFrame(onAnimationFrame); + } + + let lastFrameTimestamp; + + function onAnimationFrame(timestamp) { + // Stops execution if the neko element is removed from DOM + if (!nekoEl.isConnected) { + return; + } + if (!lastFrameTimestamp) { + lastFrameTimestamp = timestamp; + } + if (timestamp - lastFrameTimestamp > 100) { + lastFrameTimestamp = timestamp; + frame(); + } + window.requestAnimationFrame(onAnimationFrame); + } + + function setSprite(name, frame) { + const sprite = spriteSets[name][frame % spriteSets[name].length]; + nekoEl.style.backgroundPosition = `${sprite[0] * 32}px ${sprite[1] * 32}px`; + } + + function resetIdleAnimation() { + idleAnimation = null; + idleAnimationFrame = 0; + } + + function idle() { + idleTime += 1; + + // every ~ 20 seconds + if ( + idleTime > 10 && + Math.floor(Math.random() * 200) == 0 && + idleAnimation == null + ) { + let avalibleIdleAnimations = ["sleeping", "scratchSelf"]; + if (nekoPosX < 32) { + avalibleIdleAnimations.push("scratchWallW"); + } + if (nekoPosY < 32) { + avalibleIdleAnimations.push("scratchWallN"); + } + if (nekoPosX > window.innerWidth - 32) { + avalibleIdleAnimations.push("scratchWallE"); + } + if (nekoPosY > window.innerHeight - 32) { + avalibleIdleAnimations.push("scratchWallS"); + } + idleAnimation = + avalibleIdleAnimations[ + Math.floor(Math.random() * avalibleIdleAnimations.length) + ]; + } + + switch (idleAnimation) { + case "sleeping": + if (idleAnimationFrame < 8) { + setSprite("tired", 0); + break; + } + setSprite("sleeping", Math.floor(idleAnimationFrame / 4)); + if (idleAnimationFrame > 192) { + resetIdleAnimation(); + } + break; + case "scratchWallN": + case "scratchWallS": + case "scratchWallE": + case "scratchWallW": + case "scratchSelf": + setSprite(idleAnimation, idleAnimationFrame); + if (idleAnimationFrame > 9) { + resetIdleAnimation(); + } + break; + default: + setSprite("idle", 0); + return; + } + idleAnimationFrame += 1; + } + + function frame() { + frameCount += 1; + const diffX = nekoPosX - mousePosX; + const diffY = nekoPosY - mousePosY; + const distance = Math.sqrt(diffX ** 2 + diffY ** 2); + + if (distance < nekoSpeed || distance < 48) { + idle(); + return; + } + + idleAnimation = null; + idleAnimationFrame = 0; + + if (idleTime > 1) { + setSprite("alert", 0); + // count down after being alerted before moving + idleTime = Math.min(idleTime, 7); + idleTime -= 1; + return; + } + + let direction; + direction = diffY / distance > 0.5 ? "N" : ""; + direction += diffY / distance < -0.5 ? "S" : ""; + direction += diffX / distance > 0.5 ? "W" : ""; + direction += diffX / distance < -0.5 ? "E" : ""; + setSprite(direction, frameCount); + + nekoPosX -= (diffX / distance) * nekoSpeed; + nekoPosY -= (diffY / distance) * nekoSpeed; + + nekoPosX = Math.min(Math.max(16, nekoPosX), window.innerWidth - 16); + nekoPosY = Math.min(Math.max(16, nekoPosY), window.innerHeight - 16); + + nekoEl.style.left = `${nekoPosX - 16}px`; + nekoEl.style.top = `${nekoPosY - 16}px`; + } + + init(); +})(); |
