import { ILockedDatabase } from "./LockedDatabase";
export declare abstract class Db {
    private database;
    constructor(database: () => ILockedDatabase);
    txn(description: string, actions: (txnId: string) => void): void;
    txnAsync(description: string, actions: (txnId: string) => Promise<void>): Promise<void>;
    initted: boolean;
    init(): void;
    /**
    * Used to query from console, or for advanced querying scenarios in code
    * @example //from console
    * console.table(await window.db.query('select * from FieldDefinitionData f join CalculatedFieldDefinitionData c on f.id = c.fieldId;'));
    * @example //from code - advanced query - join tables and union the data types:
    * await doc.query<FieldDefinitionData & CalculatedFieldDefinitionData, {fJson: string, cJson: string}>(
    * 'select f.json fJson, c.json cJson from FieldDefinitionData f join CalculatedFieldDefinitionData c on f.id = c.fieldId',
    * undefined, row => _.merge(<FieldDefinitionData>JSON.parse(row.fJson), <CalculatedFieldDefinitionData>JSON.parse(row.cJson)));
    * @example //from code - less type checking:
    * <(FieldDefinitionData & CalculatedFieldDefinitionData)[]> await doc.query(
    * 'select f.json fJson, c.json cJson from FieldDefinitionData f join CalculatedFieldDefinitionData c on f.id = c.fieldId',
    * undefined, row => _.merge(JSON.parse(row.fJson), JSON.parse(row.cJson)));
    */
    query<T = unknown, TRow = T>(sql: string, params?: unknown[], projection?: (row: TRow) => T): T[];
}
