d1-sql-tag
Version:
A template literal for working with Cloudflare D1 database
59 lines (58 loc) • 2.99 kB
TypeScript
import { D1Database, D1DatabaseSession, D1Response, D1Result } from "@cloudflare/workers-types/experimental/index.js";
//#region src/sql-tag.d.ts
type Primitive = string | number | boolean | null;
interface JoinFragment {
templateStrings: TemplateStringsArray;
templateValues: Primitive[];
}
type SqlTag = ((strings: TemplateStringsArray, ...values: (Primitive | SqlQueryFragment | JoinFragment)[]) => SqlQueryFragment) & {
batch<T extends readonly PreparedStatementBase<object>[]>(statements: T): Promise<{ -readonly [P in keyof T]: SqlResult<RowType<T[P]>> }>;
join(values: Primitive[]): JoinFragment;
};
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: TemplateValue[];
}
type TemplateValue = Primitive | SqlQueryFragment | JoinFragment;
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;
}
interface MockSqlTagHandler {
all<T extends object>(query: string, values: Primitive[]): Promise<D1Result<T>>;
run(query: string, values: Primitive[]): Promise<D1Response>;
batch(statements: Array<{
query: string;
values: Primitive[];
}>): Promise<D1Result<object>[]>;
}
type MockSqlTag<T extends MockSqlTagHandler> = SqlTag & {
handler: T;
};
declare const rowTypeSymbol: unique symbol;
declare function createD1SqlTag(db: D1Database | D1DatabaseSession, options?: SqlTagOptions): SqlTag;
declare function createMockSqlTag<T extends MockSqlTagHandler>(handler: T): MockSqlTag<T>;
//#endregion
//#region src/logger.d.ts
declare function logQueryResults(queries: string[], results: SqlResult[], duration?: number): void;
//#endregion
export { type MockSqlTag, type MockSqlTagHandler, type Primitive, type RowType, type SqlQueryFragment, type SqlTag, createD1SqlTag, createMockSqlTag, logQueryResults };
//# sourceMappingURL=index.d.ts.map