UNPKG

mastercache

Version:

Multi-tier cache module for Node.js. Redis, Upstash, CloudfareKV, File, in-memory and others drivers

1,892 lines (1,824 loc) 137 kB
// ../../node_modules/.pnpm/@lukeed+ms@2.0.2/node_modules/@lukeed/ms/dist/index.mjs var RGX = /^(-?(?:\d+)?\.?\d+) *(m(?:illiseconds?|s(?:ecs?)?))?(s(?:ec(?:onds?|s)?)?)?(m(?:in(?:utes?|s)?)?)?(h(?:ours?|rs?)?)?(d(?:ays?)?)?(w(?:eeks?|ks?)?)?(y(?:ears?|rs?)?)?$/; var SEC = 1e3; var MIN = SEC * 60; var HOUR = MIN * 60; var DAY = HOUR * 24; var YEAR = DAY * 365.25; function parse(val) { var num, arr = val.toLowerCase().match(RGX); if (arr != null && (num = parseFloat(arr[1]))) { if (arr[3] != null) return num * SEC; if (arr[4] != null) return num * MIN; if (arr[5] != null) return num * HOUR; if (arr[6] != null) return num * DAY; if (arr[7] != null) return num * DAY * 7; if (arr[8] != null) return num * YEAR; return num; } } // src/helpers.ts function resolveTtl(ttl, defaultTtl = 3e4) { if (typeof ttl === "number") return ttl; if (ttl === null) { return void 0; } if (ttl === void 0) { if (typeof defaultTtl === "number") return defaultTtl; if (typeof defaultTtl === "string") return parse(defaultTtl); return void 0; } return parse(ttl); } // src/drivers/base-driver.ts var BaseDriver = class { constructor(config) { this.config = config; this.prefix = this.#sanitizePrefix(config.prefix); } /** * Current cache prefix */ prefix; /** * Sanitizes the cache prefix by removing any trailing colons */ #sanitizePrefix(prefix) { if (!prefix) return ""; return prefix.replace(/:+$/, ""); } /** * Creates a namespace prefix by concatenating the cache prefix with the given namespace * If the cache prefix is not defined, the namespace is returned as is */ createNamespacePrefix(namespace) { const sanitizedPrefix = this.#sanitizePrefix(this.prefix); return sanitizedPrefix ? `${sanitizedPrefix}:${namespace}` : namespace; } /** * Returns the cache key with the prefix added to it, if a prefix is defined */ getItemKey(key) { return this.prefix ? `${this.prefix}:${key}` : key; } }; // src/drivers/database/database.ts var DatabaseDriver = class extends BaseDriver { type = "l2"; /** * The underlying adapter */ #adapter; /** * A promise that resolves when the table is created */ #initialized; /** * Pruning interval */ #pruneInterval; constructor(adapter, config, isNamespace = false) { super(config); this.#adapter = adapter; if (isNamespace) { this.#initialized = Promise.resolve(); return; } this.#adapter.setTableName(config.tableName || "mastercache"); if (config.autoCreateTable !== false) { this.#initialized = this.#adapter.createTableIfNotExists(); } else { this.#initialized = Promise.resolve(); } if (config.pruneInterval === false) return; this.#startPruneInterval(resolveTtl(config.pruneInterval)); } /** * Start the interval that will prune expired entries * Maybe rework this using a node Worker ? */ #startPruneInterval(interval) { this.#pruneInterval = setInterval(async () => { await this.#initialized; await this.#adapter.pruneExpiredEntries().catch((err) => console.error("[mastercache] failed to prune expired entries", err)); }, interval); } /** * Check if the given timestamp is expired */ #isExpired(expiration) { return expiration !== null && expiration < Date.now(); } /** * Returns a new instance of the driver namespaced */ namespace(namespace) { const store = new this.constructor( this.#adapter, { ...this.config, prefix: this.createNamespacePrefix(namespace) }, true ); return store; } /** * Get a value from the cache */ async get(key) { await this.#initialized; const result = await this.#adapter.get(this.getItemKey(key)); if (!result) return; if (this.#isExpired(result.expiresAt)) { await this.#adapter.delete(key); return; } return result.value; } /** * Get the value of a key and delete it * * Returns the value if the key exists, undefined otherwise */ async pull(key) { const value = await this.get(key); if (value) await this.delete(key); return value; } /** * Set a value in the cache * Returns true if the value was set, false otherwise */ async set(key, value, ttl) { await this.#initialized; await this.#adapter.set({ key: this.getItemKey(key), value, expiresAt: ttl ? new Date(Date.now() + ttl) : null }); return true; } /** * Check if a key exists in the cache */ async has(key) { await this.#initialized; const result = await this.get(key); if (!result) return false; return true; } /** * Remove all items from the cache */ async clear() { await this.#initialized; await this.#adapter.clear(this.prefix); } /** * Delete a key from the cache * Returns true if the key was deleted, false otherwise */ async delete(key) { await this.#initialized; return this.#adapter.delete(this.getItemKey(key)); } /** * Delete multiple keys from the cache */ async deleteMany(keys) { await this.#initialized; keys = keys.map((key) => this.getItemKey(key)); const result = await this.#adapter.deleteMany(keys); return result > 0; } /** * Disconnect from the database */ async disconnect() { if (this.#pruneInterval) { clearInterval(this.#pruneInterval); } await this.#adapter.disconnect(); } }; // src/drivers/database/adapters/knex.ts var KnexAdapter = class { #connection; #tableName; constructor(config) { this.#connection = config.connection; } setTableName(tableName) { this.#tableName = tableName; } async get(key) { const result = await this.#connection.from(this.#tableName).select(["value", "expires_at"]).where("key", key).first(); if (!result) return; return { value: result.value, expiresAt: result.expires_at }; } async delete(key) { const result = await this.#connection.from(this.#tableName).where("key", key).delete(); return result > 0; } async deleteMany(keys) { return await this.#connection.from(this.#tableName).whereIn("key", keys).delete(); } async disconnect() { await this.#connection.destroy(); } async createTableIfNotExists() { const hasTable = await this.#connection.schema.hasTable(this.#tableName); if (hasTable) return; await this.#connection.schema.createTable(this.#tableName, (table) => { table.string("key", 255).notNullable().primary(); table.text("value", "longtext"); table.timestamp("expires_at").nullable(); }); } async pruneExpiredEntries() { await this.#connection.from(this.#tableName).where("expires_at", "<", /* @__PURE__ */ new Date()).delete(); } async clear(prefix) { await this.#connection.from(this.#tableName).where("key", "like", `${prefix}%`).delete(); } async set(row) { await this.#connection.from(this.#tableName).insert({ key: row.key, value: row.value, expires_at: row.expiresAt }).onConflict("key").merge(["value", "expires_at"]); } }; function knexDriver(options) { return { options, factory: (config) => { const adapter = new KnexAdapter(config); return new DatabaseDriver(adapter, config); } }; } // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/util/object-utils.js function isUndefined(obj) { return typeof obj === "undefined" || obj === void 0; } function isString(obj) { return typeof obj === "string"; } function isNumber(obj) { return typeof obj === "number"; } function isBoolean(obj) { return typeof obj === "boolean"; } function isNull(obj) { return obj === null; } function isBigInt(obj) { return typeof obj === "bigint"; } function isFunction(obj) { return typeof obj === "function"; } function isObject(obj) { return typeof obj === "object" && obj !== null; } function freeze(obj) { return Object.freeze(obj); } function asArray(arg) { if (isReadonlyArray(arg)) { return arg; } else { return [arg]; } } function isReadonlyArray(arg) { return Array.isArray(arg); } // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/identifier-node.js var IdentifierNode = freeze({ is(node) { return node.kind === "IdentifierNode"; }, create(name) { return freeze({ kind: "IdentifierNode", name }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/schemable-identifier-node.js var SchemableIdentifierNode = freeze({ is(node) { return node.kind === "SchemableIdentifierNode"; }, create(identifier) { return freeze({ kind: "SchemableIdentifierNode", identifier: IdentifierNode.create(identifier) }); }, createWithSchema(schema, identifier) { return freeze({ kind: "SchemableIdentifierNode", schema: IdentifierNode.create(schema), identifier: IdentifierNode.create(identifier) }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/alias-node.js var AliasNode = freeze({ is(node) { return node.kind === "AliasNode"; }, create(node, alias) { return freeze({ kind: "AliasNode", node, alias }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/table-node.js var TableNode = freeze({ is(node) { return node.kind === "TableNode"; }, create(table) { return freeze({ kind: "TableNode", table: SchemableIdentifierNode.create(table) }); }, createWithSchema(schema, table) { return freeze({ kind: "TableNode", table: SchemableIdentifierNode.createWithSchema(schema, table) }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/operation-node-source.js function isOperationNodeSource(obj) { return isObject(obj) && isFunction(obj.toOperationNode); } // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/expression/expression.js function isExpression(obj) { return isObject(obj) && "expressionType" in obj && isOperationNodeSource(obj); } function isAliasedExpression(obj) { return isObject(obj) && "expression" in obj && isString(obj.alias) && isOperationNodeSource(obj); } // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/select-modifier-node.js var SelectModifierNode = freeze({ is(node) { return node.kind === "SelectModifierNode"; }, create(modifier, of) { return freeze({ kind: "SelectModifierNode", modifier, of }); }, createWithExpression(modifier) { return freeze({ kind: "SelectModifierNode", rawModifier: modifier }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/and-node.js var AndNode = freeze({ is(node) { return node.kind === "AndNode"; }, create(left, right) { return freeze({ kind: "AndNode", left, right }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/or-node.js var OrNode = freeze({ is(node) { return node.kind === "OrNode"; }, create(left, right) { return freeze({ kind: "OrNode", left, right }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/on-node.js var OnNode = freeze({ is(node) { return node.kind === "OnNode"; }, create(filter) { return freeze({ kind: "OnNode", on: filter }); }, cloneWithOperation(onNode, operator, operation) { return freeze({ ...onNode, on: operator === "And" ? AndNode.create(onNode.on, operation) : OrNode.create(onNode.on, operation) }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/join-node.js var JoinNode = freeze({ is(node) { return node.kind === "JoinNode"; }, create(joinType, table) { return freeze({ kind: "JoinNode", joinType, table, on: void 0 }); }, createWithOn(joinType, table, on) { return freeze({ kind: "JoinNode", joinType, table, on: OnNode.create(on) }); }, cloneWithOn(joinNode, operation) { return freeze({ ...joinNode, on: joinNode.on ? OnNode.cloneWithOperation(joinNode.on, "And", operation) : OnNode.create(operation) }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/binary-operation-node.js var BinaryOperationNode = freeze({ is(node) { return node.kind === "BinaryOperationNode"; }, create(leftOperand, operator, rightOperand) { return freeze({ kind: "BinaryOperationNode", leftOperand, operator, rightOperand }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/operator-node.js var COMPARISON_OPERATORS = [ "=", "==", "!=", "<>", ">", ">=", "<", "<=", "in", "not in", "is", "is not", "like", "not like", "match", "ilike", "not ilike", "@>", "<@", "^@", "&&", "?", "?&", "?|", "!<", "!>", "<=>", "!~", "~", "~*", "!~*", "@@", "@@@", "!!", "<->", "regexp", "is distinct from", "is not distinct from" ]; var ARITHMETIC_OPERATORS = [ "+", "-", "*", "/", "%", "^", "&", "|", "#", "<<", ">>" ]; var JSON_OPERATORS = ["->", "->>"]; var BINARY_OPERATORS = [ ...COMPARISON_OPERATORS, ...ARITHMETIC_OPERATORS, "&&", "||" ]; var UNARY_FILTER_OPERATORS = ["exists", "not exists"]; var UNARY_OPERATORS = ["not", "-", ...UNARY_FILTER_OPERATORS]; var OPERATORS = [ ...BINARY_OPERATORS, ...JSON_OPERATORS, ...UNARY_OPERATORS, "between", "between symmetric" ]; var OperatorNode = freeze({ is(node) { return node.kind === "OperatorNode"; }, create(operator) { return freeze({ kind: "OperatorNode", operator }); } }); function isJSONOperator(op) { return isString(op) && JSON_OPERATORS.includes(op); } // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/column-node.js var ColumnNode = freeze({ is(node) { return node.kind === "ColumnNode"; }, create(column) { return freeze({ kind: "ColumnNode", column: IdentifierNode.create(column) }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/select-all-node.js var SelectAllNode = freeze({ is(node) { return node.kind === "SelectAllNode"; }, create() { return freeze({ kind: "SelectAllNode" }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/reference-node.js var ReferenceNode = freeze({ is(node) { return node.kind === "ReferenceNode"; }, create(column, table) { return freeze({ kind: "ReferenceNode", table, column }); }, createSelectAll(table) { return freeze({ kind: "ReferenceNode", table, column: SelectAllNode.create() }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/dynamic/dynamic-reference-builder.js function isDynamicReferenceBuilder(obj) { return isObject(obj) && isOperationNodeSource(obj) && isString(obj.dynamicReference); } // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/order-by-item-node.js var OrderByItemNode = freeze({ is(node) { return node.kind === "OrderByItemNode"; }, create(orderBy, direction) { return freeze({ kind: "OrderByItemNode", orderBy, direction }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/raw-node.js var RawNode = freeze({ is(node) { return node.kind === "RawNode"; }, create(sqlFragments, parameters) { return freeze({ kind: "RawNode", sqlFragments: freeze(sqlFragments), parameters: freeze(parameters) }); }, createWithSql(sql2) { return RawNode.create([sql2], []); }, createWithChild(child) { return RawNode.create(["", ""], [child]); }, createWithChildren(children) { return RawNode.create(new Array(children.length + 1).fill(""), children); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/parser/order-by-parser.js function isOrderByDirection(thing) { return thing === "asc" || thing === "desc"; } function parseOrderBy(args) { if (args.length === 2) { return [parseOrderByItem(args[0], args[1])]; } if (args.length === 1) { const [orderBy] = args; if (Array.isArray(orderBy)) { return orderBy.map((item) => parseOrderByItem(item)); } return [parseOrderByItem(orderBy)]; } throw new Error(`Invalid number of arguments at order by! expected 1-2, received ${args.length}`); } function parseOrderByItem(ref, direction) { const parsedRef = parseOrderByExpression(ref); if (OrderByItemNode.is(parsedRef)) { if (direction) { throw new Error("Cannot specify direction twice!"); } return parsedRef; } return OrderByItemNode.create(parsedRef, parseOrderByDirectionExpression(direction)); } function parseOrderByExpression(expr) { if (isExpressionOrFactory(expr)) { return parseExpression(expr); } if (isDynamicReferenceBuilder(expr)) { return expr.toOperationNode(); } const [ref, direction] = expr.split(" "); if (direction) { if (!isOrderByDirection(direction)) { throw new Error(`Invalid order by direction: ${direction}`); } return OrderByItemNode.create(parseStringReference(ref), parseOrderByDirectionExpression(direction)); } return parseStringReference(expr); } function parseOrderByDirectionExpression(expr) { if (!expr) { return void 0; } if (expr === "asc" || expr === "desc") { return RawNode.createWithSql(expr); } return expr.toOperationNode(); } // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/json-reference-node.js var JSONReferenceNode = freeze({ is(node) { return node.kind === "JSONReferenceNode"; }, create(reference, traversal) { return freeze({ kind: "JSONReferenceNode", reference, traversal }); }, cloneWithTraversal(node, traversal) { return freeze({ ...node, traversal }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/json-operator-chain-node.js var JSONOperatorChainNode = freeze({ is(node) { return node.kind === "JSONOperatorChainNode"; }, create(operator) { return freeze({ kind: "JSONOperatorChainNode", operator, values: freeze([]) }); }, cloneWithValue(node, value) { return freeze({ ...node, values: freeze([...node.values, value]) }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/json-path-node.js var JSONPathNode = freeze({ is(node) { return node.kind === "JSONPathNode"; }, create(inOperator) { return freeze({ kind: "JSONPathNode", inOperator, pathLegs: freeze([]) }); }, cloneWithLeg(jsonPathNode, pathLeg) { return freeze({ ...jsonPathNode, pathLegs: freeze([...jsonPathNode.pathLegs, pathLeg]) }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/parser/reference-parser.js function parseSimpleReferenceExpression(exp) { if (isString(exp)) { return parseStringReference(exp); } return exp.toOperationNode(); } function parseReferenceExpressionOrList(arg) { if (isReadonlyArray(arg)) { return arg.map((it) => parseReferenceExpression(it)); } else { return [parseReferenceExpression(arg)]; } } function parseReferenceExpression(exp) { if (isExpressionOrFactory(exp)) { return parseExpression(exp); } return parseSimpleReferenceExpression(exp); } function parseJSONReference(ref, op) { const referenceNode = parseStringReference(ref); if (isJSONOperator(op)) { return JSONReferenceNode.create(referenceNode, JSONOperatorChainNode.create(OperatorNode.create(op))); } const opWithoutLastChar = op.slice(0, -1); if (isJSONOperator(opWithoutLastChar)) { return JSONReferenceNode.create(referenceNode, JSONPathNode.create(OperatorNode.create(opWithoutLastChar))); } throw new Error(`Invalid JSON operator: ${op}`); } function parseStringReference(ref) { const COLUMN_SEPARATOR = "."; if (!ref.includes(COLUMN_SEPARATOR)) { return ReferenceNode.create(ColumnNode.create(ref)); } const parts = ref.split(COLUMN_SEPARATOR).map(trim); if (parts.length === 3) { return parseStringReferenceWithTableAndSchema(parts); } if (parts.length === 2) { return parseStringReferenceWithTable(parts); } throw new Error(`invalid column reference ${ref}`); } function parseAliasedStringReference(ref) { const ALIAS_SEPARATOR = " as "; if (ref.includes(ALIAS_SEPARATOR)) { const [columnRef, alias] = ref.split(ALIAS_SEPARATOR).map(trim); return AliasNode.create(parseStringReference(columnRef), IdentifierNode.create(alias)); } else { return parseStringReference(ref); } } function parseStringReferenceWithTableAndSchema(parts) { const [schema, table, column] = parts; return ReferenceNode.create(ColumnNode.create(column), TableNode.createWithSchema(schema, table)); } function parseStringReferenceWithTable(parts) { const [table, column] = parts; return ReferenceNode.create(ColumnNode.create(column), TableNode.create(table)); } function trim(str) { return str.trim(); } // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/primitive-value-list-node.js var PrimitiveValueListNode = freeze({ is(node) { return node.kind === "PrimitiveValueListNode"; }, create(values) { return freeze({ kind: "PrimitiveValueListNode", values: freeze([...values]) }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/value-list-node.js var ValueListNode = freeze({ is(node) { return node.kind === "ValueListNode"; }, create(values) { return freeze({ kind: "ValueListNode", values: freeze(values) }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/value-node.js var ValueNode = freeze({ is(node) { return node.kind === "ValueNode"; }, create(value) { return freeze({ kind: "ValueNode", value }); }, createImmediate(value) { return freeze({ kind: "ValueNode", value, immediate: true }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/parser/value-parser.js function parseValueExpressionOrList(arg) { if (isReadonlyArray(arg)) { return parseValueExpressionList(arg); } return parseValueExpression(arg); } function parseValueExpression(exp) { if (isExpressionOrFactory(exp)) { return parseExpression(exp); } return ValueNode.create(exp); } function isSafeImmediateValue(value) { return isNumber(value) || isBoolean(value) || isNull(value); } function parseSafeImmediateValue(value) { if (!isSafeImmediateValue(value)) { throw new Error(`unsafe immediate value ${JSON.stringify(value)}`); } return ValueNode.createImmediate(value); } function parseValueExpressionList(arg) { if (arg.some(isExpressionOrFactory)) { return ValueListNode.create(arg.map((it) => parseValueExpression(it))); } return PrimitiveValueListNode.create(arg); } // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/parens-node.js var ParensNode = freeze({ is(node) { return node.kind === "ParensNode"; }, create(node) { return freeze({ kind: "ParensNode", node }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/parser/binary-operation-parser.js function parseValueBinaryOperationOrExpression(args) { if (args.length === 3) { return parseValueBinaryOperation(args[0], args[1], args[2]); } else if (args.length === 1) { return parseValueExpression(args[0]); } throw new Error(`invalid arguments: ${JSON.stringify(args)}`); } function parseValueBinaryOperation(left, operator, right) { if (isIsOperator(operator) && needsIsOperator(right)) { return BinaryOperationNode.create(parseReferenceExpression(left), parseOperator(operator), ValueNode.createImmediate(right)); } return BinaryOperationNode.create(parseReferenceExpression(left), parseOperator(operator), parseValueExpressionOrList(right)); } function parseReferentialBinaryOperation(left, operator, right) { return BinaryOperationNode.create(parseReferenceExpression(left), parseOperator(operator), parseReferenceExpression(right)); } function parseFilterObject(obj, combinator) { return parseFilterList(Object.entries(obj).filter(([, v]) => !isUndefined(v)).map(([k, v]) => parseValueBinaryOperation(k, needsIsOperator(v) ? "is" : "=", v)), combinator); } function parseFilterList(list, combinator, withParens = true) { const combine = combinator === "and" ? AndNode.create : OrNode.create; if (list.length === 0) { return BinaryOperationNode.create(ValueNode.createImmediate(1), OperatorNode.create("="), ValueNode.createImmediate(combinator === "and" ? 1 : 0)); } let node = toOperationNode(list[0]); for (let i = 1; i < list.length; ++i) { node = combine(node, toOperationNode(list[i])); } if (list.length > 1 && withParens) { return ParensNode.create(node); } return node; } function isIsOperator(operator) { return operator === "is" || operator === "is not"; } function needsIsOperator(value) { return isNull(value) || isBoolean(value); } function parseOperator(operator) { if (isString(operator) && OPERATORS.includes(operator)) { return OperatorNode.create(operator); } if (isOperationNodeSource(operator)) { return operator.toOperationNode(); } throw new Error(`invalid operator ${JSON.stringify(operator)}`); } function toOperationNode(nodeOrSource) { return isOperationNodeSource(nodeOrSource) ? nodeOrSource.toOperationNode() : nodeOrSource; } // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/order-by-node.js var OrderByNode = freeze({ is(node) { return node.kind === "OrderByNode"; }, create(items) { return freeze({ kind: "OrderByNode", items: freeze([...items]) }); }, cloneWithItems(orderBy, items) { return freeze({ ...orderBy, items: freeze([...orderBy.items, ...items]) }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/partition-by-node.js var PartitionByNode = freeze({ is(node) { return node.kind === "PartitionByNode"; }, create(items) { return freeze({ kind: "PartitionByNode", items: freeze(items) }); }, cloneWithItems(partitionBy, items) { return freeze({ ...partitionBy, items: freeze([...partitionBy.items, ...items]) }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/over-node.js var OverNode = freeze({ is(node) { return node.kind === "OverNode"; }, create() { return freeze({ kind: "OverNode" }); }, cloneWithOrderByItems(overNode, items) { return freeze({ ...overNode, orderBy: overNode.orderBy ? OrderByNode.cloneWithItems(overNode.orderBy, items) : OrderByNode.create(items) }); }, cloneWithPartitionByItems(overNode, items) { return freeze({ ...overNode, partitionBy: overNode.partitionBy ? PartitionByNode.cloneWithItems(overNode.partitionBy, items) : PartitionByNode.create(items) }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/from-node.js var FromNode = freeze({ is(node) { return node.kind === "FromNode"; }, create(froms) { return freeze({ kind: "FromNode", froms: freeze(froms) }); }, cloneWithFroms(from, froms) { return freeze({ ...from, froms: freeze([...from.froms, ...froms]) }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/group-by-node.js var GroupByNode = freeze({ is(node) { return node.kind === "GroupByNode"; }, create(items) { return freeze({ kind: "GroupByNode", items: freeze(items) }); }, cloneWithItems(groupBy, items) { return freeze({ ...groupBy, items: freeze([...groupBy.items, ...items]) }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/having-node.js var HavingNode = freeze({ is(node) { return node.kind === "HavingNode"; }, create(filter) { return freeze({ kind: "HavingNode", having: filter }); }, cloneWithOperation(havingNode, operator, operation) { return freeze({ ...havingNode, having: operator === "And" ? AndNode.create(havingNode.having, operation) : OrNode.create(havingNode.having, operation) }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/select-query-node.js var SelectQueryNode = freeze({ is(node) { return node.kind === "SelectQueryNode"; }, create(withNode) { return freeze({ kind: "SelectQueryNode", ...withNode && { with: withNode } }); }, createFrom(fromItems, withNode) { return freeze({ kind: "SelectQueryNode", from: FromNode.create(fromItems), ...withNode && { with: withNode } }); }, cloneWithSelections(select, selections) { return freeze({ ...select, selections: select.selections ? freeze([...select.selections, ...selections]) : freeze(selections) }); }, cloneWithDistinctOn(select, expressions) { return freeze({ ...select, distinctOn: select.distinctOn ? freeze([...select.distinctOn, ...expressions]) : freeze(expressions) }); }, cloneWithFrontModifier(select, modifier) { return freeze({ ...select, frontModifiers: select.frontModifiers ? freeze([...select.frontModifiers, modifier]) : freeze([modifier]) }); }, cloneWithEndModifier(select, modifier) { return freeze({ ...select, endModifiers: select.endModifiers ? freeze([...select.endModifiers, modifier]) : freeze([modifier]) }); }, cloneWithOrderByItems(selectNode, items) { return freeze({ ...selectNode, orderBy: selectNode.orderBy ? OrderByNode.cloneWithItems(selectNode.orderBy, items) : OrderByNode.create(items) }); }, cloneWithGroupByItems(selectNode, items) { return freeze({ ...selectNode, groupBy: selectNode.groupBy ? GroupByNode.cloneWithItems(selectNode.groupBy, items) : GroupByNode.create(items) }); }, cloneWithLimit(selectNode, limit) { return freeze({ ...selectNode, limit }); }, cloneWithOffset(selectNode, offset) { return freeze({ ...selectNode, offset }); }, cloneWithFetch(selectNode, fetch) { return freeze({ ...selectNode, fetch }); }, cloneWithHaving(selectNode, operation) { return freeze({ ...selectNode, having: selectNode.having ? HavingNode.cloneWithOperation(selectNode.having, "And", operation) : HavingNode.create(operation) }); }, cloneWithSetOperations(selectNode, setOperations) { return freeze({ ...selectNode, setOperations: selectNode.setOperations ? freeze([...selectNode.setOperations, ...setOperations]) : freeze([...setOperations]) }); }, cloneWithoutSelections(select) { return freeze({ ...select, selections: [] }); }, cloneWithoutLimit(select) { return freeze({ ...select, limit: void 0 }); }, cloneWithoutOffset(select) { return freeze({ ...select, offset: void 0 }); }, cloneWithoutOrderBy(select) { return freeze({ ...select, orderBy: void 0 }); }, cloneWithoutGroupBy(select) { return freeze({ ...select, groupBy: void 0 }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/util/prevent-await.js function preventAwait(clazz, message) { Object.defineProperties(clazz.prototype, { then: { enumerable: false, value: () => { throw new Error(message); } } }); } // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/query-builder/join-builder.js var JoinBuilder = class _JoinBuilder { #props; constructor(props) { this.#props = freeze(props); } on(...args) { return new _JoinBuilder({ ...this.#props, joinNode: JoinNode.cloneWithOn(this.#props.joinNode, parseValueBinaryOperationOrExpression(args)) }); } /** * Just like {@link WhereInterface.whereRef} but adds an item to the join's * `on` clause instead. * * See {@link WhereInterface.whereRef} for documentation and examples. */ onRef(lhs, op, rhs) { return new _JoinBuilder({ ...this.#props, joinNode: JoinNode.cloneWithOn(this.#props.joinNode, parseReferentialBinaryOperation(lhs, op, rhs)) }); } /** * Adds `on true`. */ onTrue() { return new _JoinBuilder({ ...this.#props, joinNode: JoinNode.cloneWithOn(this.#props.joinNode, RawNode.createWithSql("true")) }); } /** * Simply calls the provided function passing `this` as the only argument. `$call` returns * what the provided function returns. */ $call(func) { return func(this); } toOperationNode() { return this.#props.joinNode; } }; preventAwait(JoinBuilder, "don't await JoinBuilder instances. They are never executed directly and are always just a part of a query."); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/partition-by-item-node.js var PartitionByItemNode = freeze({ is(node) { return node.kind === "PartitionByItemNode"; }, create(partitionBy) { return freeze({ kind: "PartitionByItemNode", partitionBy }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/parser/partition-by-parser.js function parsePartitionBy(partitionBy) { return parseReferenceExpressionOrList(partitionBy).map(PartitionByItemNode.create); } // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/query-builder/over-builder.js var OverBuilder = class _OverBuilder { #props; constructor(props) { this.#props = freeze(props); } /** * Adds an order by clause item inside the over function. * * ```ts * const result = await db * .selectFrom('person') * .select( * (eb) => eb.fn.avg<number>('age').over( * ob => ob.orderBy('first_name', 'asc').orderBy('last_name', 'asc') * ).as('average_age') * ) * .execute() * ``` * * The generated SQL (PostgreSQL): * * ```sql * select avg("age") over(order by "first_name" asc, "last_name" asc) as "average_age" * from "person" * ``` */ orderBy(orderBy, direction) { return new _OverBuilder({ overNode: OverNode.cloneWithOrderByItems(this.#props.overNode, parseOrderBy([orderBy, direction])) }); } partitionBy(partitionBy) { return new _OverBuilder({ overNode: OverNode.cloneWithPartitionByItems(this.#props.overNode, parsePartitionBy(partitionBy)) }); } /** * Simply calls the provided function passing `this` as the only argument. `$call` returns * what the provided function returns. */ $call(func) { return func(this); } toOperationNode() { return this.#props.overNode; } }; preventAwait(OverBuilder, "don't await OverBuilder instances. They are never executed directly and are always just a part of a query."); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/selection-node.js var SelectionNode = freeze({ is(node) { return node.kind === "SelectionNode"; }, create(selection) { return freeze({ kind: "SelectionNode", selection }); }, createSelectAll() { return freeze({ kind: "SelectionNode", selection: SelectAllNode.create() }); }, createSelectAllFromTable(table) { return freeze({ kind: "SelectionNode", selection: ReferenceNode.createSelectAll(table) }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/parser/select-parser.js function parseSelectArg(selection) { if (isFunction(selection)) { return parseSelectArg(selection(expressionBuilder())); } else if (isReadonlyArray(selection)) { return selection.map((it) => parseSelectExpression(it)); } else { return [parseSelectExpression(selection)]; } } function parseSelectExpression(selection) { if (isString(selection)) { return SelectionNode.create(parseAliasedStringReference(selection)); } else if (isDynamicReferenceBuilder(selection)) { return SelectionNode.create(selection.toOperationNode()); } else { return SelectionNode.create(parseAliasedExpression(selection)); } } function parseSelectAll(table) { if (!table) { return [SelectionNode.createSelectAll()]; } else if (Array.isArray(table)) { return table.map(parseSelectAllArg); } else { return [parseSelectAllArg(table)]; } } function parseSelectAllArg(table) { if (isString(table)) { return SelectionNode.createSelectAllFromTable(parseTable(table)); } throw new Error(`invalid value selectAll expression: ${JSON.stringify(table)}`); } // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/insert-query-node.js var InsertQueryNode = freeze({ is(node) { return node.kind === "InsertQueryNode"; }, create(into, withNode, replace) { return freeze({ kind: "InsertQueryNode", into, ...withNode && { with: withNode }, replace }); }, createWithoutInto() { return freeze({ kind: "InsertQueryNode" }); }, cloneWith(insertQuery, props) { return freeze({ ...insertQuery, ...props }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/update-query-node.js var UpdateQueryNode = freeze({ is(node) { return node.kind === "UpdateQueryNode"; }, create(table, withNode) { return freeze({ kind: "UpdateQueryNode", table, ...withNode && { with: withNode } }); }, createWithoutTable() { return freeze({ kind: "UpdateQueryNode" }); }, cloneWithFromItems(updateQuery, fromItems) { return freeze({ ...updateQuery, from: updateQuery.from ? FromNode.cloneWithFroms(updateQuery.from, fromItems) : FromNode.create(fromItems) }); }, cloneWithUpdates(updateQuery, updates) { return freeze({ ...updateQuery, updates: updateQuery.updates ? freeze([...updateQuery.updates, ...updates]) : updates }); }, cloneWithLimit(updateQuery, limit) { return freeze({ ...updateQuery, limit }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/using-node.js var UsingNode = freeze({ is(node) { return node.kind === "UsingNode"; }, create(tables) { return freeze({ kind: "UsingNode", tables: freeze(tables) }); }, cloneWithTables(using, tables) { return freeze({ ...using, tables: freeze([...using.tables, ...tables]) }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/delete-query-node.js var DeleteQueryNode = freeze({ is(node) { return node.kind === "DeleteQueryNode"; }, create(fromItems, withNode) { return freeze({ kind: "DeleteQueryNode", from: FromNode.create(fromItems), ...withNode && { with: withNode } }); }, cloneWithOrderByItems(deleteNode, items) { return freeze({ ...deleteNode, orderBy: deleteNode.orderBy ? OrderByNode.cloneWithItems(deleteNode.orderBy, items) : OrderByNode.create(items) }); }, cloneWithoutOrderBy(deleteNode) { return freeze({ ...deleteNode, orderBy: void 0 }); }, cloneWithLimit(deleteNode, limit) { return freeze({ ...deleteNode, limit }); }, cloneWithoutLimit(deleteNode) { return freeze({ ...deleteNode, limit: void 0 }); }, cloneWithUsing(deleteNode, tables) { return freeze({ ...deleteNode, using: deleteNode.using !== void 0 ? UsingNode.cloneWithTables(deleteNode.using, tables) : UsingNode.create(tables) }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/where-node.js var WhereNode = freeze({ is(node) { return node.kind === "WhereNode"; }, create(filter) { return freeze({ kind: "WhereNode", where: filter }); }, cloneWithOperation(whereNode, operator, operation) { return freeze({ ...whereNode, where: operator === "And" ? AndNode.create(whereNode.where, operation) : OrNode.create(whereNode.where, operation) }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/returning-node.js var ReturningNode = freeze({ is(node) { return node.kind === "ReturningNode"; }, create(selections) { return freeze({ kind: "ReturningNode", selections: freeze(selections) }); }, cloneWithSelections(returning, selections) { return freeze({ ...returning, selections: returning.selections ? freeze([...returning.selections, ...selections]) : freeze(selections) }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/explain-node.js var ExplainNode = freeze({ is(node) { return node.kind === "ExplainNode"; }, create(format, options) { return freeze({ kind: "ExplainNode", format, options }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/when-node.js var WhenNode = freeze({ is(node) { return node.kind === "WhenNode"; }, create(condition) { return freeze({ kind: "WhenNode", condition }); }, cloneWithResult(whenNode, result) { return freeze({ ...whenNode, result }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/merge-query-node.js var MergeQueryNode = freeze({ is(node) { return node.kind === "MergeQueryNode"; }, create(into, withNode) { return freeze({ kind: "MergeQueryNode", into, ...withNode && { with: withNode } }); }, cloneWithUsing(mergeNode, using) { return freeze({ ...mergeNode, using }); }, cloneWithWhen(mergeNode, when) { return freeze({ ...mergeNode, whens: mergeNode.whens ? freeze([...mergeNode.whens, when]) : freeze([when]) }); }, cloneWithThen(mergeNode, then) { return freeze({ ...mergeNode, whens: mergeNode.whens ? freeze([ ...mergeNode.whens.slice(0, -1), WhenNode.cloneWithResult(mergeNode.whens[mergeNode.whens.length - 1], then) ]) : void 0 }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/output-node.js var OutputNode = freeze({ is(node) { return node.kind === "OutputNode"; }, create(selections) { return freeze({ kind: "OutputNode", selections: freeze(selections) }); }, cloneWithSelections(output, selections) { return freeze({ ...output, selections: output.selections ? freeze([...output.selections, ...selections]) : freeze(selections) }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/query-node.js var QueryNode = freeze({ is(node) { return SelectQueryNode.is(node) || InsertQueryNode.is(node) || UpdateQueryNode.is(node) || DeleteQueryNode.is(node) || MergeQueryNode.is(node); }, cloneWithWhere(node, operation) { return freeze({ ...node, where: node.where ? WhereNode.cloneWithOperation(node.where, "And", operation) : WhereNode.create(operation) }); }, cloneWithJoin(node, join) { return freeze({ ...node, joins: node.joins ? freeze([...node.joins, join]) : freeze([join]) }); }, cloneWithReturning(node, selections) { return freeze({ ...node, returning: node.returning ? ReturningNode.cloneWithSelections(node.returning, selections) : ReturningNode.create(selections) }); }, cloneWithoutReturning(node) { return freeze({ ...node, returning: void 0 }); }, cloneWithoutWhere(node) { return freeze({ ...node, where: void 0 }); }, cloneWithExplain(node, format, options) { return freeze({ ...node, explain: ExplainNode.create(format, options?.toOperationNode()) }); }, cloneWithTop(node, top) { return freeze({ ...node, top }); }, cloneWithOutput(node, selections) { return freeze({ ...node, output: node.output ? OutputNode.cloneWithSelections(node.output, selections) : OutputNode.create(selections) }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/query-builder/no-result-error.js var NoResultError = class extends Error { /** * The operation node tree of the query that was executed. */ node; constructor(node) { super("no result"); this.node = node; } }; function isNoResultErrorConstructor(fn) { return Object.prototype.hasOwnProperty.call(fn, "prototype"); } // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/top-node.js var TopNode = freeze({ is(node) { return node.kind === "TopNode"; }, create(expression, modifiers) { return freeze({ kind: "TopNode", expression, modifiers }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/parser/top-parser.js function parseTop(expression, modifiers) { if (!isNumber(expression) && !isBigInt(expression)) { throw new Error(`Invalid top expression: ${expression}`); } if (!isUndefined(modifiers) && !isTopModifiers(modifiers)) { throw new Error(`Invalid top modifiers: ${modifiers}`); } return TopNode.create(expression, modifiers); } function isTopModifiers(modifiers) { return modifiers === "percent" || modifiers === "with ties" || modifiers === "percent with ties"; } // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/limit-node.js var LimitNode = freeze({ is(node) { return node.kind === "LimitNode"; }, create(limit) { return freeze({ kind: "LimitNode", limit }); } }); // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/util/random-string.js var CHARS = [ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ]; function randomString(length) { let chars = ""; for (let i = 0; i < length; ++i) { chars += randomChar(); } return chars; } function randomChar() { return CHARS[~~(Math.random() * CHARS.length)]; } // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/util/query-id.js function createQueryId() { return new LazyQueryId(); } var LazyQueryId = class { #queryId; get queryId() { if (this.#queryId === void 0) { this.#queryId = randomString(8); } return this.#queryId; } }; // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/util/require-all-props.js function requireAllProps(obj) { return obj; } // ../../node_modules/.pnpm/kysely@0.27.4/node_modules/kysely/dist/esm/operation-node/operation-node-transformer.js var OperationNodeTransformer = class { nodeStack = []; #transformers = freeze({ AliasNode: this.transformAlias.bind(this), ColumnNode: this.transformColumn.bind(this), IdentifierNode: this.transformIdentifier.bind(this), SchemableIdentifierNode: this.transformSchemableIdentifier.bind(this), RawNode: this.transformRaw.bind(this), ReferenceNode: this.transformReference.bind(this), SelectQueryNode: this.transformSelectQuery.bind(this), SelectionNode: this.transformSelection.bind(this), TableNode: this.transformTable.bind(this), FromNode: this.transformFrom.bind(this), SelectAllNode: this.transformSelectAll.bind(this), AndNode: this.transformAnd.bind(this), OrNode: this.transformOr.bind(this), ValueNode: this.transformValue.bind(this), ValueListNode: this.transformValueList.bind(this), PrimitiveValueListNode: this.transformPrimitiveValueList.bind(this), ParensNode: this.transformParens.bind(this), JoinNode: this.transformJoin.bind(this), OperatorNode: this.transformOperator.bind(this), WhereNode: this.transformWhere.bind(this), InsertQueryNode: this.transformInsertQuery.bind(this), DeleteQueryNode: this.transformDeleteQuery.bind(this), ReturningNode: this.transformReturning.bind(this), CreateTableNode: this.transformCreateTable.bind(this), AddColumnNode: this.transformAddColumn.bind(this), ColumnDefinitionNode: this.transformColumnDefinition.bind(this), DropTableNode: this.transformDropTable.bind(this), DataTypeNode: this.transformDataType.bin