/// // FIXME: Is this `any` really necessary? type VariableArgFunction = (...params: any[]) => unknown; type ArgumentTypes = F extends (...args: infer A) => unknown ? A : never; type ElementOf = T extends Array ? E : T; declare const enum ScanStatOpcode { SQLITE_SCANSTAT_NLOOP = 0, SQLITE_SCANSTAT_NVISIT = 1, SQLITE_SCANSTAT_EST = 2, SQLITE_SCANSTAT_NAME = 3, SQLITE_SCANSTAT_EXPLAIN = 4, SQLITE_SCANSTAT_SELECTID = 5, SQLITE_SCANSTAT_PARENTID = 6, SQLITE_SCANSTAT_NCYCLE = 7, } declare namespace BetterSqlite3 { interface Statement { database: Database; source: string; reader: boolean; readonly: boolean; busy: boolean; run(...params: BindParameters): Database.RunResult; get(...params: BindParameters): Result | undefined; all(...params: BindParameters): Result[]; iterate(...params: BindParameters): IterableIterator; pluck(toggleState?: boolean): this; expand(toggleState?: boolean): this; raw(toggleState?: boolean): this; bind(...params: BindParameters): this; columns(): ColumnDefinition[]; safeIntegers(toggleState?: boolean): this; scanStatusV2(idx: number, opcode: ScanStatOpcode.SQLITE_SCANSTAT_NAME, resetFlag: number): string | undefined; scanStatusV2(idx: number, opcode: ScanStatOpcode.SQLITE_SCANSTAT_EXPLAIN, resetFlag: number): string | undefined; scanStatusV2(idx: number, opcode: ScanStatOpcode.SQLITE_SCANSTAT_NLOOP, resetFlag: number): number | undefined; scanStatusV2(idx: number, opcode: ScanStatOpcode.SQLITE_SCANSTAT_NVISIT, resetFlag: number): number | undefined; scanStatusV2(idx: number, opcode: ScanStatOpcode.SQLITE_SCANSTAT_EST, resetFlag: number): number | undefined; scanStatusV2(idx: number, opcode: ScanStatOpcode.SQLITE_SCANSTAT_SELECTID, resetFlag: number): number | undefined; scanStatusV2(idx: number, opcode: ScanStatOpcode.SQLITE_SCANSTAT_PARENTID, resetFlag: number): number | undefined; scanStatusV2(idx: number, opcode: ScanStatOpcode.SQLITE_SCANSTAT_NCYCLE, resetFlag: number): number | undefined; scanStatusV2(idx: number, opcode: ScanStatOpcode, resetFlag: number): number | string | undefined; scanStatusReset(): this; explainQueryPlan(...params: BindParameters | []): Result[]; } interface ColumnDefinition { name: string; column: string | null; table: string | null; database: string | null; type: string | null; } interface Transaction { (...params: ArgumentTypes): ReturnType; default(...params: ArgumentTypes): ReturnType; deferred(...params: ArgumentTypes): ReturnType; immediate(...params: ArgumentTypes): ReturnType; exclusive(...params: ArgumentTypes): ReturnType; } interface VirtualTableOptions { rows: (...params: unknown[]) => Generator; columns: string[]; parameters?: string[] | undefined; safeIntegers?: boolean | undefined; directOnly?: boolean | undefined; } interface Database { memory: boolean; readonly: boolean; name: string; open: boolean; inTransaction: boolean; prepare( source: string, ): BindParameters extends unknown[] ? Statement : Statement<[BindParameters], Result>; transaction(fn: F): Transaction; exec(source: string): this; pragma(source: string, options?: Database.PragmaOptions): unknown; function(name: string, cb: (...params: unknown[]) => unknown): this; function(name: string, options: Database.RegistrationOptions, cb: (...params: unknown[]) => unknown): this; aggregate( name: string, options: Database.RegistrationOptions & { start?: T | (() => T); // eslint-disable-next-line @typescript-eslint/no-invalid-void-type step: (total: T, next: ElementOf) => T | void; inverse?: ((total: T, dropped: T) => T) | undefined; result?: ((total: T) => unknown) | undefined; }, ): this; loadExtension(path: string, entryPoint?: string): this; close(): this; defaultSafeIntegers(toggleState?: boolean): this; backup(destinationFile: string, options?: Database.BackupOptions): Promise; table(name: string, options: VirtualTableOptions): this; unsafeMode(unsafe?: boolean): this; serialize(options?: Database.SerializeOptions): Buffer; } interface DatabaseConstructor { new(filename?: string | Buffer, options?: Database.Options): Database; (filename?: string, options?: Database.Options): Database; prototype: Database; SqliteError: typeof SqliteError; // scanstatus constants SQLITE_SCANSTAT_NLOOP: ScanStatOpcode.SQLITE_SCANSTAT_NLOOP; SQLITE_SCANSTAT_NVISIT: ScanStatOpcode.SQLITE_SCANSTAT_NVISIT; SQLITE_SCANSTAT_EST: ScanStatOpcode.SQLITE_SCANSTAT_EST; SQLITE_SCANSTAT_NAME: ScanStatOpcode.SQLITE_SCANSTAT_NAME; SQLITE_SCANSTAT_EXPLAIN: ScanStatOpcode.SQLITE_SCANSTAT_EXPLAIN; SQLITE_SCANSTAT_SELECTID: ScanStatOpcode.SQLITE_SCANSTAT_SELECTID; SQLITE_SCANSTAT_PARENTID: ScanStatOpcode.SQLITE_SCANSTAT_PARENTID; SQLITE_SCANSTAT_NCYCLE: ScanStatOpcode.SQLITE_SCANSTAT_NCYCLE; } } declare class SqliteError extends Error { name: string; message: string; code: string; constructor(message: string, code: string); } declare namespace Database { interface RunResult { changes: number; lastInsertRowid: number | bigint; } interface Options { readonly?: boolean | undefined; fileMustExist?: boolean | undefined; timeout?: number | undefined; verbose?: ((message?: unknown, ...additionalArgs: unknown[]) => void) | undefined; nativeBinding?: string | undefined; } interface SerializeOptions { attached?: string; } interface PragmaOptions { simple?: boolean | undefined; } interface RegistrationOptions { varargs?: boolean | undefined; deterministic?: boolean | undefined; safeIntegers?: boolean | undefined; directOnly?: boolean | undefined; } type AggregateOptions = Parameters[1]; interface BackupMetadata { totalPages: number; remainingPages: number; } interface BackupOptions { progress: (info: BackupMetadata) => number; } type SqliteError = typeof SqliteError; type Statement = BindParameters extends unknown[] ? BetterSqlite3.Statement : BetterSqlite3.Statement<[BindParameters], Result>; type ColumnDefinition = BetterSqlite3.ColumnDefinition; type Transaction = BetterSqlite3.Transaction; type Database = BetterSqlite3.Database; } declare const Database: BetterSqlite3.DatabaseConstructor; export = Database;