d1-sql-tag
Version:
A template literal for working with Cloudflare D1 database
42 lines (38 loc) • 2.2 kB
TypeScript
import { D1Database, D1DatabaseSession, D1Result, D1Response } from '@cloudflare/workers-types/experimental/index.js';
type Primitive = string | number | boolean | null;
type SqlTag = ((strings: TemplateStringsArray, ...values: (Primitive | SqlQueryFragment)[]) => SqlQueryFragment) & {
batch<T extends readonly PreparedStatementBase<object>[]>(statements: T): Promise<{
-readonly [P in keyof T]: SqlResult<RowType<T[P]>>;
}>;
};
interface SqlQueryFragment {
build<T extends object = Record<string, Primitive>>(): RawPreparedStatement<T>;
all<T extends object = Record<string, Primitive>>(): Promise<D1Result<T>>;
run(): Promise<D1Response>;
templateStrings: TemplateStringsArray;
templateValues: (Primitive | SqlQueryFragment)[];
}
interface PreparedStatementBase<T extends object> {
query: string;
values: Primitive[];
all(): Promise<D1Result<T>>;
run(): Promise<D1Response>;
[rowTypeSymbol]: T;
}
interface MappedPreparedStatement<TRaw extends object, TMapped extends object> extends PreparedStatementBase<TMapped> {
mapper: (row: TRaw) => TMapped;
}
interface RawPreparedStatement<T extends object> extends PreparedStatementBase<T> {
map<TMapped extends object>(mapper: (row: T) => TMapped): MappedPreparedStatement<T, TMapped>;
}
type RowType<T extends PreparedStatementBase<any> | ((...args: any) => PreparedStatementBase<any>)> = T extends PreparedStatementBase<any> ? T[typeof rowTypeSymbol] : T extends (...args: any) => PreparedStatementBase<any> ? ReturnType<T>[typeof rowTypeSymbol] : never;
interface SqlResult<T extends object = Record<string, Primitive>> extends D1Result<T> {
}
interface SqlTagOptions {
beforeQuery?: (id: number, queries: string[]) => void;
afterQuery?: (id: number, queries: string[], results: SqlResult[], duration: number) => void;
}
declare const rowTypeSymbol: unique symbol;
declare function createD1SqlTag(db: D1Database | D1DatabaseSession, options?: SqlTagOptions): SqlTag;
declare function logQueryResults(queries: string[], results: SqlResult[], duration?: number): void;
export { type Primitive, type RowType, type SqlQueryFragment, type SqlTag, createD1SqlTag, logQueryResults };