break up library, move bots to their own repositories

This commit is contained in:
jb
2026-02-12 21:05:15 -05:00
parent 415aa3dbfe
commit cb39431a11
289 changed files with 1931 additions and 6235 deletions
+99
View File
@@ -0,0 +1,99 @@
import { Database } from 'bun:sqlite';
export function dynamicInsert<T extends {} = any>(db: Database, table: string, item: T) {
const keys = Object.keys(item);
const values = keys.map((k) => item[k]);
const stmt = db.prepare(`INSERT INTO ${table} (${keys.join(', ')}) VALUES (${keys.map((k) => '?').join(', ')})`);
return stmt.run(...values).lastInsertRowid;
}
export function dynamicUpdate<T extends {} = any>(db: Database, table: string, item: T, key: string, keyValue: any) {
const keys = Object.keys(item);
const values = keys.map((k) => item[k]);
const stmt = db.prepare(`UPDATE ${table} SET ${keys.map((k) => `${k} = ?`).join(', ')} WHERE ${key} = ?`);
return stmt.run(...values, keyValue).changes;
}
export interface QueryOptions<T extends {}> {
skip?: number;
limit?: number;
orderBy?: Partial<Record<keyof T, 'ASC' | 'DESC'>>;
}
type Where<T> = Partial<Record<keyof T, any>> & { or?: Partial<Record<keyof T, any>> };
export function select<T extends {}>(db: Database, table: string, options?: QueryOptions<T>, select: string = '*', where?: Where<T>): T[] {
let query = `SELECT ${select} FROM ${table}\n`;
const values = [];
if (where) {
query += `WHERE `;
if (where.or) {
query += `${Object.keys(where.or)
.map((k) => {
values.push(where.or[k]);
return `${k} = ?\n`;
})
.join('OR ')}`;
delete where.or;
}
if (Object.keys(where).length > 0) {
query += `${Object.keys(where)
.map((k) => {
values.push(where[k]);
return `${k} = ?\n`;
})
.join('AND ')}`;
}
}
if (options?.orderBy) {
query += `ORDER BY\n${Object.keys(options.orderBy)
.map((k) => {
values.push(options.orderBy[k]);
return `${k} ?`;
})
.join(',\n')}\n`;
}
if (options?.skip) {
values.push(options.limit || -1);
values.push(options.skip);
query += `LIMIT ? OFFSET ?`;
}
return db.prepare(query).all(...values) as T[];
}
export function remove<T>(db: Database, table: string, where?: Where<T>) {
let query = `DELETE FROM ${table}`;
const values = [];
if (where) {
query += `WHERE `;
if (where.or) {
query += `${Object.keys(where.or)
.map((k) => {
values.push(where.or[k]);
return `${k} = ?\n`;
})
.join('OR ')}`;
delete where.or;
}
if (Object.keys(where).length > 0) {
query += `${Object.keys(where)
.map((k) => {
values.push(where[k]);
return `${k} = ?\n`;
})
.join('AND ')}`;
}
}
return db.prepare(query).run(...values).changes;
}