/* * Dexie.js - a minimalistic wrapper for IndexedDB * =============================================== * * By David Fahlander, david.fahlander@gmail.com * * Version 4.3.0, Sat Dec 20 2025 * * https://dexie.org * * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/ */ // Generated by dts-bundle-generator v9.5.1 export interface IndexSpec { name: string; keyPath: string | Array | undefined; unique: boolean | undefined; multi: boolean | undefined; auto: boolean | undefined; compound: boolean | undefined; src: string; type?: string | undefined; } export interface TableSchema { name: string; primKey: IndexSpec; indexes: IndexSpec[]; yProps?: { prop: string; updatesTable: string; }[]; // Available if y-dexie addon is used and schema defines Y.Doc properties. mappedClass: Function; idxByName: { [name: string]: IndexSpec; }; readHook?: (x: any) => any; } export type IndexableTypePart = string | number | Date | ArrayBuffer | ArrayBufferView | DataView | Array>; export type IndexableTypeArray = Array; export type IndexableTypeArrayReadonly = ReadonlyArray; export type IndexableType = IndexableTypePart | IndexableTypeArrayReadonly; export interface DexieEvent { subscribers: Function[]; fire(...args: any[]): any; subscribe(fn: (...args: any[]) => any): void; unsubscribe(fn: (...args: any[]) => any): void; } export interface DexieEventSet { (eventName: string): DexieEvent; // To be able to unsubscribe. addEventType(eventName: string, chainFunction?: (f1: Function, f2: Function) => Function, defaultFunction?: Function): DexieEvent; addEventType(events: { [eventName: string]: ("asap" | [ (f1: Function, f2: Function) => Function, Function ]); }): DexieEvent; } export interface TransactionEvents extends DexieEventSet { (eventName: "complete", subscriber: () => any): void; (eventName: "abort", subscriber: () => any): void; (eventName: "error", subscriber: (error: any) => any): void; complete: DexieEvent; abort: DexieEvent; error: DexieEvent; } export interface Transaction { db: Dexie; active: boolean; mode: IDBTransactionMode; idbtrans: IDBTransaction; //tables: { [type: string]: Table }; Deprecated since 2.0. Obsolete from v3.0. storeNames: Array; explicit?: boolean; parent?: Transaction; on: TransactionEvents; abort(): void; table(tableName: string): Table; table(tableName: string): Table; table(tableName: string): Table; table(tableName: string): Table; } export interface CreatingHookContext { onsuccess?: (primKey: Key) => void; onerror?: (err: any) => void; } export interface UpdatingHookContext { onsuccess?: (updatedObj: T) => void; onerror?: (err: any) => void; } export interface DeletingHookContext { onsuccess?: () => void; onerror?: (err: any) => void; } export interface TableHooks extends DexieEventSet { (eventName: "creating", subscriber: (this: CreatingHookContext, primKey: TKey, obj: T, transaction: Transaction) => void | undefined | TKey): void; (eventName: "reading", subscriber: (obj: T) => T | any): void; (eventName: "updating", subscriber: (this: UpdatingHookContext, modifications: Object, primKey: TKey, obj: T, transaction: Transaction) => any): void; (eventName: "deleting", subscriber: (this: DeletingHookContext, primKey: TKey, obj: T, transaction: Transaction) => any): void; creating: DexieEvent; reading: DexieEvent; updating: DexieEvent; deleting: DexieEvent; } export type ThenShortcut = (value: T) => TResult | PromiseLike; export interface WhereClause { above(key: any): Collection; aboveOrEqual(key: any): Collection; anyOf(keys: ReadonlyArray): Collection; anyOf(...keys: Array): Collection; anyOfIgnoreCase(keys: string[]): Collection; anyOfIgnoreCase(...keys: string[]): Collection; below(key: any): Collection; belowOrEqual(key: any): Collection; between(lower: any, upper: any, includeLower?: boolean, includeUpper?: boolean): Collection; equals(key: IndexableType): Collection; equalsIgnoreCase(key: string): Collection; inAnyRange(ranges: ReadonlyArray<{ 0: any; 1: any; }>, options?: { includeLowers?: boolean; includeUppers?: boolean; }): Collection; startsWith(key: string): Collection; startsWithAnyOf(prefixes: string[]): Collection; startsWithAnyOf(...prefixes: string[]): Collection; startsWithIgnoreCase(key: string): Collection; startsWithAnyOfIgnoreCase(prefixes: string[]): Collection; startsWithAnyOfIgnoreCase(...prefixes: string[]): Collection; noneOf(keys: ReadonlyArray): Collection; notEqual(key: IndexableType): Collection; } export interface PromiseExtendedConstructor extends PromiseConstructor { readonly prototype: PromiseExtended; new (executor: (resolve: (value?: T | PromiseLike) => void, reject: (reason?: any) => void) => void): PromiseExtended; all(values: [ T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike, T6 | PromiseLike, T7 | PromiseLike, T8 | PromiseLike, T9 | PromiseLike, T10 | PromiseLike ]): PromiseExtended<[ T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 ]>; all(values: [ T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike, T6 | PromiseLike, T7 | PromiseLike, T8 | PromiseLike, T9 | PromiseLike ]): PromiseExtended<[ T1, T2, T3, T4, T5, T6, T7, T8, T9 ]>; all(values: [ T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike, T6 | PromiseLike, T7 | PromiseLike, T8 | PromiseLike ]): PromiseExtended<[ T1, T2, T3, T4, T5, T6, T7, T8 ]>; all(values: [ T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike, T6 | PromiseLike, T7 | PromiseLike ]): PromiseExtended<[ T1, T2, T3, T4, T5, T6, T7 ]>; all(values: [ T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike, T6 | PromiseLike ]): PromiseExtended<[ T1, T2, T3, T4, T5, T6 ]>; all(values: [ T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike ]): PromiseExtended<[ T1, T2, T3, T4, T5 ]>; all(values: [ T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike ]): PromiseExtended<[ T1, T2, T3, T4 ]>; all(values: [ T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike ]): PromiseExtended<[ T1, T2, T3 ]>; all(values: [ T1 | PromiseLike, T2 | PromiseLike ]): PromiseExtended<[ T1, T2 ]>; all(values: (T | PromiseLike)[]): PromiseExtended; race(values: [ T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike, T6 | PromiseLike, T7 | PromiseLike, T8 | PromiseLike, T9 | PromiseLike, T10 | PromiseLike ]): PromiseExtended; race(values: [ T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike, T6 | PromiseLike, T7 | PromiseLike, T8 | PromiseLike, T9 | PromiseLike ]): PromiseExtended; race(values: [ T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike, T6 | PromiseLike, T7 | PromiseLike, T8 | PromiseLike ]): PromiseExtended; race(values: [ T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike, T6 | PromiseLike, T7 | PromiseLike ]): PromiseExtended; race(values: [ T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike, T6 | PromiseLike ]): PromiseExtended; race(values: [ T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike ]): PromiseExtended; race(values: [ T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike ]): PromiseExtended; race(values: [ T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike ]): PromiseExtended; race(values: [ T1 | PromiseLike, T2 | PromiseLike ]): PromiseExtended; race(values: (T | PromiseLike)[]): PromiseExtended; reject(reason: any): PromiseExtended; reject(reason: any): PromiseExtended; resolve(value: T | PromiseLike): PromiseExtended; resolve(): PromiseExtended; } /** The interface of Dexie.Promise, which basically extends standard Promise with methods: * * finally() - also subject for standardization * timeout() - set a completion timeout * catch(ErrorClass, handler) - java style error catching * catch(errorName, handler) - cross-domain safe type error catching (checking error.name instead of instanceof) * */ export interface PromiseExtended extends Promise { then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): PromiseExtended; catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): PromiseExtended; catch(ErrorConstructor: Function, onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): PromiseExtended; catch(errorName: string, onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): PromiseExtended; finally(onFinally?: () => U | PromiseLike): PromiseExtended; timeout(ms: number, msg?: string): PromiseExtended; } export type KeyPathIgnoreObject = ArrayBuffer | ArrayBufferView | RegExp | Blob | FileList | FileSystemFileHandle | FileSystemDirectoryHandle | DataView | ImageBitmap | ImageData | Map | Set | CryptoKey | Promise | ReadableStream | ReadableStreamDefaultReader | ReadableStreamDefaultController | { whenLoaded: Promise; }; // Y.Doc export type KeyPaths = { [P in keyof T]: P extends string ? CURRDEPTH extends MAXDEPTH ? P : T[P] extends Array ? K extends any[] // Array of arrays (issue #2026) ? P | `${P}.${number}` | `${P}.${number}.${number}` : K extends object // only drill into the array element if it's an object ? P | `${P}.${number}` | `${P}.${number}.${KeyPaths>}` : P | `${P}.${number}` : T[P] extends (...args: any[]) => any // Method ? never : T[P] extends KeyPathIgnoreObject // Not valid in update spec or where clause (+ avoid circular reference) ? P : T[P] extends object ? P | `${P}.${KeyPaths, MAXDEPTH, `${CURRDEPTH}I`>}` : P : never; }[keyof T]; export type KeyPathValue = PATH extends `${infer R}.${infer S}` ? R extends keyof T ? KeyPathValue, S> : T extends any[] ? PATH extends `${number}.${infer S}` ? KeyPathValue, S> : void : void : PATH extends `${number}` ? T extends any[] ? T[number] : void : PATH extends keyof T ? T[PATH] : any; export type PropModSpec = { replacePrefix?: [ string, string ]; add?: number | bigint | Array; remove?: number | bigint | Array; }; export class PropModification { ["@@propmod"]: PropModSpec; constructor(spec: PropModSpec); execute(value: T): T; } export type UpdateSpec = { [KP in KeyPaths>]?: KeyPathValue, KP> | PropModification; }; export interface Collection { db: Dexie; and(filter: (x: T) => boolean): Collection; clone(props?: Object): Collection; count(): PromiseExtended; count(thenShortcut: ThenShortcut): PromiseExtended; distinct(): Collection; each(callback: (obj: T, cursor: { key: IndexableType; primaryKey: TKey; }) => any): PromiseExtended; eachKey(callback: (key: IndexableType, cursor: { key: IndexableType; primaryKey: TKey; }) => any): PromiseExtended; eachPrimaryKey(callback: (key: TKey, cursor: { key: IndexableType; primaryKey: TKey; }) => any): PromiseExtended; eachUniqueKey(callback: (key: IndexableType, cursor: { key: IndexableType; primaryKey: TKey; }) => any): PromiseExtended; filter(filter: (x: T) => x is S): Collection; filter(filter: (x: T) => boolean): Collection; first(): PromiseExtended; first(thenShortcut: ThenShortcut): PromiseExtended; firstKey(): PromiseExtended; keys(): PromiseExtended; keys(thenShortcut: ThenShortcut): PromiseExtended; primaryKeys(): PromiseExtended; primaryKeys(thenShortcut: ThenShortcut): PromiseExtended; last(): PromiseExtended; last(thenShortcut: ThenShortcut): PromiseExtended; lastKey(): PromiseExtended; limit(n: number): Collection; offset(n: number): Collection; or(indexOrPrimayKey: string): WhereClause; raw(): Collection; reverse(): Collection; sortBy(keyPath: string): PromiseExtended; sortBy(keyPath: string, thenShortcut: ThenShortcut): PromiseExtended; toArray(): PromiseExtended>; toArray(thenShortcut: ThenShortcut): PromiseExtended; uniqueKeys(): PromiseExtended; uniqueKeys(thenShortcut: ThenShortcut): PromiseExtended; until(filter: (value: T) => boolean, includeStopEntry?: boolean): Collection; // Mutating methods delete(): PromiseExtended; modify(changeCallback: (obj: T, ctx: { value: TInsertType; }) => void | boolean): PromiseExtended; modify(changes: UpdateSpec): PromiseExtended; } export type IntervalTree = IntervalTreeNode | EmptyRange; export interface IntervalTreeNode { from: IndexableType; // lower bound to: IndexableType; // upper bound l?: IntervalTreeNode | null; // left r?: IntervalTreeNode | null; // right d: number; // depth } export interface EmptyRange { d: 0; } export interface RangeSetPrototype { add(rangeSet: IntervalTree | { from: IndexableType; to: IndexableType; }): RangeSet; addKey(key: IndexableType): RangeSet; addKeys(keys: IndexableType[]): RangeSet; hasKey(key: IndexableType): boolean; [Symbol.iterator](): Iterator; } export type RangeSet = RangeSetPrototype & IntervalTree; export interface RangeSetConstructor { (tree: IntervalTree): RangeSet; new (): RangeSet; new (from: IndexableType, to?: IndexableType): RangeSet; } export interface DexieOnReadyEvent { subscribe(fn: (vipDb: Dexie) => any, bSticky: boolean): void; unsubscribe(fn: (vipDb: Dexie) => any): void; fire(vipDb: Dexie): any; } export interface DexieVersionChangeEvent { subscribe(fn: (event: IDBVersionChangeEvent) => any): void; unsubscribe(fn: (event: IDBVersionChangeEvent) => any): void; fire(event: IDBVersionChangeEvent): any; } export interface DexiePopulateEvent { subscribe(fn: (trans: Transaction) => any): void; unsubscribe(fn: (trans: Transaction) => any): void; fire(trans: Transaction): any; } export interface DexieCloseEvent { subscribe(fn: (event: Event) => any): void; unsubscribe(fn: (event: Event) => any): void; fire(event: Event): any; } export interface DbEventFns { (eventName: "populate", subscriber: (trans: Transaction) => any): void; (eventName: "blocked", subscriber: (event: IDBVersionChangeEvent) => any): void; (eventName: "versionchange", subscriber: (event: IDBVersionChangeEvent) => any): void; (eventName: "close", subscriber: (event: Event) => any): void; } export interface DbEvents extends DbEventFns, DexieEventSet { (eventName: "ready", subscriber: (vipDb: Dexie) => any, bSticky?: boolean): void; ready: DexieOnReadyEvent; populate: DexiePopulateEvent; blocked: DexieEvent; versionchange: DexieVersionChangeEvent; close: DexieCloseEvent; } /** Set of mutated parts of the database */ export type ObservabilitySet = { /** Database part having been mutated. * * This structure is produced in observability-middleware.ts * and consumed in live-query.ts. * * Format of 'part': * * `idb://${dbName}/${tableName}/${indexName}` * * * dbName is the database name * * tableName is the table name * * indexName is any of: * 1. An empty string - represents the primary keys of the affected objs * 2. ":dels" - represents primary keys of deleted objects in the table * 3. The keyPath of an index, such as "name", "age" or "address.city" - * represents indexes that, if used in a query, might affect the * result of that query. * * IntervalTree * * See definition of IntervalTree type in rangeset.d.ts * * See rangesOverlap() in rangeset.ts that can be used to compare two * IntervalTrees and detect collissions. * * See RangeSet class that can be used to create an IntervalTree and add * ranges to it. */ [part: string]: IntervalTree; }; export interface DexieOnStorageMutatedEvent { subscribe(fn: (parts: ObservabilitySet) => any): void; unsubscribe(fn: (parts: ObservabilitySet) => any): void; fire(parts: ObservabilitySet): any; } export interface GlobalDexieEvents extends DexieEventSet { (eventName: "storagemutated", subscriber: (parts: ObservabilitySet) => any): void; storagemutated: DexieOnStorageMutatedEvent; } export const enum DBCoreRangeType { Equal = 1, Range = 2, Any = 3, Never = 4 } export interface DBCoreKeyRange { readonly type: DBCoreRangeType; readonly lower: any; readonly lowerOpen?: boolean; readonly upper: any; readonly upperOpen?: boolean; } export interface DBCoreTransaction { abort(): void; } export interface DbCoreTransactionOptions { durability: ChromeTransactionDurability; } export type DBCoreMutateRequest = DBCoreAddRequest | DBCorePutRequest | DBCoreDeleteRequest | DBCoreDeleteRangeRequest; export interface DBCoreMutateResponse { numFailures: number; failures: { [operationNumber: number]: Error; }; lastResult: any; results?: any[]; // Always present on responses to AddRequest and PutRequest. } export interface DBCoreAddRequest { type: "add"; trans: DBCoreTransaction; values: readonly any[]; keys?: any[]; mutatedParts?: ObservabilitySet; /** @deprecated Will always get results since 3.1.0-alpha.5 */ wantResults?: boolean; } export interface DBCorePutRequest { type: "put"; trans: DBCoreTransaction; values: readonly any[]; keys?: any[]; mutatedParts?: ObservabilitySet; upsert?: boolean; // If true, will insert the object if it does not exist. If false, will only update existing objects using the 'updates' property. criteria?: { index: string | null; range: DBCoreKeyRange; }; changeSpec?: { [keyPath: string]: any; }; // Common changeSpec for each key isAdditionalChunk?: boolean; updates?: { keys: any[]; changeSpecs: { [keyPath: string]: any; }[]; // changeSpec per key. }; /** @deprecated Will always get results since 3.1.0-alpha.5 */ wantResults?: boolean; } export interface DBCoreDeleteRequest { type: "delete"; trans: DBCoreTransaction; keys: any[]; mutatedParts?: ObservabilitySet; criteria?: { index: string | null; range: DBCoreKeyRange; }; isAdditionalChunk?: boolean; } export interface DBCoreDeleteRangeRequest { type: "deleteRange"; trans: DBCoreTransaction; range: DBCoreKeyRange; mutatedParts?: ObservabilitySet; } export interface DBCoreGetManyRequest { trans: DBCoreTransaction; keys: any[]; cache?: "immutable" | "clone"; obsSet?: ObservabilitySet; } export interface DBCoreGetRequest { trans: DBCoreTransaction; key: any; obsSet?: ObservabilitySet; } export interface DBCoreQuery { index: DBCoreIndex; //keyPath: null | string | string[]; // null represents primary key. string a property, string[] several properties. range: DBCoreKeyRange; } export interface DBCoreQueryRequest { trans: DBCoreTransaction; values?: boolean; limit?: number; query: DBCoreQuery; obsSet?: ObservabilitySet; } export interface DBCoreQueryResponse { result: any[]; } export interface DBCoreOpenCursorRequest { trans: DBCoreTransaction; values?: boolean; unique?: boolean; reverse?: boolean; query: DBCoreQuery; obsSet?: ObservabilitySet; } export interface DBCoreCountRequest { trans: DBCoreTransaction; query: DBCoreQuery; obsSet?: ObservabilitySet; } export interface DBCoreCursor { readonly trans: DBCoreTransaction; readonly key: any; readonly primaryKey: any; readonly value?: any; readonly done?: boolean; continue(key?: any): void; continuePrimaryKey(key: any, primaryKey: any): void; advance(count: number): void; start(onNext: () => void): Promise; stop(value?: any | Promise): void; next(): Promise; fail(error: Error): void; } export interface DBCoreSchema { name: string; tables: DBCoreTableSchema[]; } export interface DBCoreTableSchema { readonly name: string; readonly primaryKey: DBCoreIndex; readonly indexes: DBCoreIndex[]; readonly getIndexByKeyPath: (keyPath: null | string | string[]) => DBCoreIndex | undefined; } export interface DBCoreIndex { /** Name of the index, or null for primary key */ readonly name: string | null; /** True if this index represents the primary key */ readonly isPrimaryKey?: boolean; /** True if this index represents the primary key and is not inbound (https://dexie.org/docs/inbound) */ readonly outbound?: boolean; /** True if and only if keyPath is an array (https://dexie.org/docs/Compound-Index) */ readonly compound?: boolean; /** keyPath, null for primary key, string for single-property indexes, Array for compound indexes */ readonly keyPath: null | string | string[]; /** Auto-generated primary key (does not apply to secondary indexes) */ readonly autoIncrement?: boolean; /** Whether index is unique. Also true if index is primary key. */ readonly unique?: boolean; /** Whether index is multiEntry. */ readonly multiEntry?: boolean; /** Extract (using keyPath) a key from given value (object). Null for outbound primary keys */ readonly extractKey: ((value: any) => any) | null; /** If this index is a virtual index, lowLevelIndex represents the actual IndexedDB index behind it */ readonly lowLevelIndex?: DBCoreIndex; } export interface DBCore { stack: "dbcore"; // Transaction and Object Store transaction(stores: string[], mode: "readonly" | "readwrite", options?: DbCoreTransactionOptions): DBCoreTransaction; // Utility methods readonly MIN_KEY: any; readonly MAX_KEY: any; readonly schema: DBCoreSchema; table(name: string): DBCoreTable; } export interface DBCoreTable { readonly name: string; readonly schema: DBCoreTableSchema; mutate(req: DBCoreMutateRequest): Promise; get(req: DBCoreGetRequest): Promise; getMany(req: DBCoreGetManyRequest): Promise; query(req: DBCoreQueryRequest): Promise; openCursor(req: DBCoreOpenCursorRequest): Promise; count(req: DBCoreCountRequest): Promise; } export interface Table { db: Dexie; name: string; schema: TableSchema; hook: TableHooks; core: DBCoreTable; get(key: TKey): PromiseExtended; get(key: TKey, thenShortcut: ThenShortcut): PromiseExtended; get(equalityCriterias: { [key: string]: any; }): PromiseExtended; get(equalityCriterias: { [key: string]: any; }, thenShortcut: ThenShortcut): PromiseExtended; where(index: string | string[]): WhereClause; where(equalityCriterias: { [key: string]: any; }): Collection; filter(fn: (obj: T) => boolean): Collection; count(): PromiseExtended; count(thenShortcut: ThenShortcut): PromiseExtended; offset(n: number): Collection; limit(n: number): Collection; each(callback: (obj: T, cursor: { key: any; primaryKey: TKey; }) => any): PromiseExtended; toArray(): PromiseExtended>; toArray(thenShortcut: ThenShortcut): PromiseExtended; toCollection(): Collection; orderBy(index: string | string[]): Collection; reverse(): Collection; mapToClass(constructor: Function): Function; add(item: TInsertType, key?: TKey): PromiseExtended; update(key: TKey | T, changes: UpdateSpec | ((obj: T, ctx: { value: any; primKey: IndexableType; }) => void | boolean)): PromiseExtended; upsert(key: TKey | T, changes: UpdateSpec): PromiseExtended; put(item: TInsertType, key?: TKey): PromiseExtended; delete(key: TKey): PromiseExtended; clear(): PromiseExtended; bulkGet(keys: TKey[]): PromiseExtended<(T | undefined)[]>; bulkAdd(items: readonly TInsertType[], keys: IndexableTypeArrayReadonly, options: { allKeys: B; }): PromiseExtended; bulkAdd(items: readonly TInsertType[], options: { allKeys: B; }): PromiseExtended; bulkAdd(items: readonly TInsertType[], keys?: IndexableTypeArrayReadonly, options?: { allKeys: boolean; }): PromiseExtended; bulkPut(items: readonly TInsertType[], keys: IndexableTypeArrayReadonly, options: { allKeys: B; }): PromiseExtended; bulkPut(items: readonly TInsertType[], options: { allKeys: B; }): PromiseExtended; bulkPut(items: readonly TInsertType[], keys?: IndexableTypeArrayReadonly, options?: { allKeys: boolean; }): PromiseExtended; bulkUpdate(keysAndChanges: ReadonlyArray<{ key: TKey; changes: UpdateSpec; }>): PromiseExtended; bulkDelete(keys: TKey[]): PromiseExtended; } export type DbSchema = { [tableName: string]: TableSchema; }; export interface Version { stores(schema: { [tableName: string]: string | null; }): Version; upgrade(fn: (trans: Transaction) => PromiseLike | void): Version; } export interface ExtendableVersion extends Version { db: Dexie; _parseStoresSpec(stores: { [tableName: string]: string | null; }, outSchema: DbSchema): void; _createTableSchema(tableName: string, primKey: IndexSpec, indexes: IndexSpec[]): TableSchema; _parseIndexSyntax(primKeyAndIndexes: string): IndexSpec[]; } export type TransactionMode = "readonly" | "readwrite" | "r" | "r!" | "r?" | "rw" | "rw!" | "rw?"; export interface Middleware { stack: TStack["stack"]; create: (down: TStack) => Partial; level?: number; name?: string; } export interface DexieStacks { dbcore: DBCore; } export type TableProp = { [K in keyof DX]: DX[K] extends { schema: any; get: any; put: any; add: any; where: any; } ? K : never; }[keyof DX] & string; export type TXWithTables = Dexie extends DX ? Transaction // If not subclassed, just expect a Transaction without table props : Transaction & { [P in TableProp]: DX[P]; }; export interface Dexie { readonly name: string; readonly tables: Table[]; readonly verno: number; readonly vip: Dexie; readonly _allTables: { [name: string]: Table; }; readonly _options: DexieOptions; readonly core: DBCore; _createTransaction: (this: Dexie, mode: IDBTransactionMode, storeNames: ArrayLike, dbschema: DbSchema, parentTransaction?: Transaction | null) => Transaction; readonly _novip: Dexie; _dbSchema: DbSchema; version(versionNumber: number): Version; on: DbEvents; once: DbEventFns; open(): PromiseExtended; table(tableName: string): Table; transaction(mode: TransactionMode, tables: readonly (string | Table)[], scope: (trans: TXWithTables) => PromiseLike | U): PromiseExtended; transaction(mode: TransactionMode, table: string | Table, scope: (trans: TXWithTables) => PromiseLike | U): PromiseExtended; transaction(mode: TransactionMode, table: string | Table, table2: string | Table, scope: (trans: TXWithTables) => PromiseLike | U): PromiseExtended; transaction(mode: TransactionMode, table: string | Table, table2: string | Table, table3: string | Table, scope: (trans: TXWithTables) => PromiseLike | U): PromiseExtended; transaction(mode: TransactionMode, table: string | Table, table2: string | Table, table3: string | Table, table4: string | Table, scope: (trans: TXWithTables) => PromiseLike | U): PromiseExtended; transaction(mode: TransactionMode, table: string | Table, table2: string | Table, table3: string | Table, table5: string | Table, scope: (trans: TXWithTables) => PromiseLike | U): PromiseExtended; close(closeOptions?: { disableAutoOpen: boolean; }): void; delete(closeOptions?: { disableAutoOpen: boolean; }): PromiseExtended; isOpen(): boolean; hasBeenClosed(): boolean; hasFailed(): boolean; dynamicallyOpened(): boolean; backendDB(): IDBDatabase; use(middleware: Middleware): this; // Add more supported stacks here... : use(middleware: Middleware): this; unuse({ stack, create }: Middleware<{ stack: keyof DexieStacks; }>): this; unuse({ stack, name }: { stack: keyof DexieStacks; name: string; }): this; // Make it possible to touch physical class constructors where they reside - as properties on db instance. // For example, checking if (x instanceof db.Table). Can't do (x instanceof Dexie.Table because it's just a virtual interface) Table: { prototype: Table; }; WhereClause: { prototype: WhereClause; }; Version: Function & { prototype: ExtendableVersion; }; Transaction: { prototype: Transaction; }; Collection: { prototype: Collection; }; } /** DexieError * * Common base class for all errors originating from Dexie.js except TypeError, * SyntaxError and RangeError. * * https://dexie.org/docs/DexieErrors/DexieError * */ export interface DexieError extends Error { name: string; message: string; stack: string; inner: any; toString(): string; } /** * List of the names of auto-generated error classes that extends DexieError * and shares the interface of DexieError. * * Each error should be documented at https://dexie.org/docs/DexieErrors/Dexie. * * The generic type DexieExceptionClasses is a map of full error name to * error constructor. The DexieExceptionClasses is mixed in into Dexie, * so that it is always possible to throw or catch certain errors via * Dexie.ErrorName. Example: * * try { * throw new Dexie.InvalidTableError("Invalid table foo", innerError?); * } catch (err) { * if (err instanceof Dexie.InvalidTableError) { * // Could also have check for err.name === "InvalidTableError", or * // err.name === Dexie.errnames.InvalidTableError. * console.log("Seems to be an invalid table here..."); * } else { * throw err; * } * } */ export type DexieErrors = { // https://dexie.org/docs/DexieErrors/Dexie.OpenFailedError OpenFailed: "OpenFailedError"; // https://dexie.org/docs/DexieErrors/Dexie.VersionChangeError VersionChange: "VersionChangeError"; // https://dexie.org/docs/DexieErrors/Dexie.SchemaError Schema: "SchemaError"; // https://dexie.org/docs/DexieErrors/Dexie.UpgradeError Upgrade: "UpgradeError"; // https://dexie.org/docs/DexieErrors/Dexie.InvalidTableError InvalidTable: "InvalidTableError"; // https://dexie.org/docs/DexieErrors/Dexie.MissingAPIError MissingAPI: "MissingAPIError"; // https://dexie.org/docs/DexieErrors/Dexie.NoSuchDatabaseError NoSuchDatabase: "NoSuchDatabaseError"; // https://dexie.org/docs/DexieErrors/Dexie.InvalidArgumentError InvalidArgument: "InvalidArgumentError"; // https://dexie.org/docs/DexieErrors/Dexie.SubTransactionError SubTransaction: "SubTransactionError"; // https://dexie.org/docs/DexieErrors/Dexie.UnsupportedError Unsupported: "UnsupportedError"; // https://dexie.org/docs/DexieErrors/Dexie.InternalError Internal: "InternalError"; // https://dexie.org/docs/DexieErrors/Dexie.DatabaseClosedError DatabaseClosed: "DatabaseClosedError"; // https://dexie.org/docs/DexieErrors/Dexie.PrematureCommitError PrematureCommit: "PrematureCommitError"; // https://dexie.org/docs/DexieErrors/Dexie.ForeignAwaitError ForeignAwait: "ForeignAwaitError"; // https://dexie.org/docs/DexieErrors/Dexie.UnknownError Unknown: "UnknownError"; // https://dexie.org/docs/DexieErrors/Dexie.ConstraintError Constraint: "ConstraintError"; // https://dexie.org/docs/DexieErrors/Dexie.DataError Data: "DataError"; // https://dexie.org/docs/DexieErrors/Dexie.TransactionInactiveError TransactionInactive: "TransactionInactiveError"; // https://dexie.org/docs/DexieErrors/Dexie.ReadOnlyError ReadOnly: "ReadOnlyError"; // https://dexie.org/docs/DexieErrors/Dexie.VersionError Version: "VersionError"; // https://dexie.org/docs/DexieErrors/Dexie.NotFoundError NotFound: "NotFoundError"; // https://dexie.org/docs/DexieErrors/Dexie.InvalidStateError InvalidState: "InvalidStateError"; // https://dexie.org/docs/DexieErrors/Dexie.InvalidAccessError InvalidAccess: "InvalidAccessError"; // https://dexie.org/docs/DexieErrors/Dexie.AbortError Abort: "AbortError"; // https://dexie.org/docs/DexieErrors/Dexie.TimeoutError Timeout: "TimeoutError"; // https://dexie.org/docs/DexieErrors/Dexie.QuotaExceededError QuotaExceeded: "QuotaExceededError"; // https://dexie.org/docs/DexieErrors/Dexie.DataCloneError DataClone: "DataCloneError"; }; /** ModifyError * * https://dexie.org/docs/DexieErrors/Dexie.ModifyError */ export interface ModifyError extends DexieError { failures: Array; failedKeys: IndexableTypeArrayReadonly; successCount: number; } /** BulkError * * https://dexie.org/docs/DexieErrors/Dexie.BulkError */ export interface BulkError extends DexieError { failures: Error[]; failuresByPos: { [operationNumber: number]: Error; }; } export interface DexieErrorConstructor { new (msg?: string, inner?: Object): DexieError; new (inner: Object): DexieError; prototype: DexieError; } export interface ModifyErrorConstructor { new (msg?: string, failures?: any[], successCount?: number, failedKeys?: IndexableTypeArrayReadonly): ModifyError; prototype: ModifyError; } export interface BulkErrorConstructor { new (msg?: string, failures?: { [operationNumber: number]: Error; }): BulkError; prototype: BulkError; } export type ExceptionSet = { [P in DexieErrors[keyof DexieErrors]]: DexieErrorConstructor; }; export type DexieExceptionClasses = ExceptionSet & { DexieError: DexieErrorConstructor; ModifyError: ModifyErrorConstructor; BulkError: BulkErrorConstructor; }; export interface DexieDOMDependencies { indexedDB: IDBFactory; IDBKeyRange: typeof IDBKeyRange; } // There typings are extracted from https://github.com/tc39/proposal-observable declare global { interface SymbolConstructor { readonly observable: symbol; } } export interface Subscribable { subscribe(observer: Partial>): Unsubscribable; } export interface Unsubscribable { unsubscribe(): void; } export interface Observable { subscribe(observerOrNext?: Observer | ((value: T) => void)): Subscription; subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription; getValue?(): T; hasValue?(): boolean; [Symbol.observable]: () => Subscribable; } export interface Subscription { unsubscribe(): void; readonly closed: boolean; } export interface Observer { start?: (subscription: Subscription) => void; next?: (value: T) => void; error?: (error: any) => void; complete?: () => void; } export type GlobalQueryCache = { // TODO: Change to parts: {[part: string]: TblQueryCache} // och unsignaledParts: ObservabilitySet; [part: string]: TblQueryCache; // part is `idb://${dbName}/${tableName}` }; export interface TblQueryCache { queries: { query: { [indexName: string]: CacheEntry[]; }; count: { [indexName: string]: CacheEntry[]; }; }; objs: Map; optimisticOps: DBCoreMutateRequest[]; unsignaledParts: ObservabilitySet; } export interface CacheEntryCommon { subscribers: Set<() => void>; obsSet: ObservabilitySet; //txObsSet: ObservabilitySet; promise: Promise; dirty: boolean; } export type CacheEntry = CacheEntryCommon & ({ type: "query"; req: DBCoreQueryRequest; res?: readonly any[]; } | { type: "count"; req: DBCoreCountRequest; res?: number; }); export type ChromeTransactionDurability = "default" | "strict" | "relaxed"; export interface DexieOptions { addons?: Array<(db: Dexie) => void>; autoOpen?: boolean; indexedDB?: { open: Function; }; IDBKeyRange?: { bound: Function; lowerBound: Function; upperBound: Function; }; allowEmptyDB?: boolean; modifyChunkSize?: number | { [key: string]: number; }; chromeTransactionDurability?: ChromeTransactionDurability; cache?: "immutable" | "cloned" | "disabled"; } export interface DexieConstructor extends DexieExceptionClasses { new (databaseName: string, options?: DexieOptions): Dexie; prototype: any; addons: Array<(db: Dexie) => void>; version: number; semVer: string; currentTransaction: Transaction; waitFor(promise: PromiseLike | T, timeoutMilliseconds?: number): Promise; getDatabaseNames(): Promise; getDatabaseNames(thenShortcut: ThenShortcut): Promise; vip(scopeFunction: () => U): U; ignoreTransaction(fn: () => U): U; disableBfCache?: boolean; liveQuery(fn: () => T | Promise): Observable; extendObservabilitySet(target: ObservabilitySet, newSet: ObservabilitySet): ObservabilitySet; override(origFunc: F, overridedFactory: (fn: any) => any): F; // ? getByKeyPath(obj: Object, keyPath: string | string[]): any; setByKeyPath(obj: Object, keyPath: string | string[], value: any): void; delByKeyPath(obj: Object, keyPath: string | string[]): void; shallowClone(obj: T): T; deepClone(obj: T): T; asap(fn: Function): void; //? maxKey: Array> | string; minKey: number; exists(dbName: string): Promise; delete(dbName: string): Promise; dependencies: DexieDOMDependencies; default: Dexie; // Work-around for different build tools handling default imports differently. cache: GlobalQueryCache; debug: false | true | "dexie"; Promise: PromiseExtendedConstructor; //TableSchema: {}; // Deprecate! //IndexSpec: {new():IndexSpec}; //? Deprecate Events: (ctx?: any) => DexieEventSet; on: GlobalDexieEvents; errnames: DexieErrors; } export class Entity { protected constructor(); protected readonly db: TDexieSubClass; table(): TableProp; } export type IsStrictlyAny = (T extends never ? true : false) extends false ? false : true; /** Extract the union of literal method names in T */ export type NonInsertProps = { [P in keyof T]: IsStrictlyAny extends true ? never // Plain property of type any (not method) : T[P] extends (...args: any[]) => any ? P // a function (method) : T[P] extends { on: any; subdocs: any; gc: any; isSynced: any; isLoaded: any; shouldLoad: any; } ? P // an YDoc property - should be generated by dexie and not by user : never; }[keyof T]; /** Default insert type of T is a subset of T where: * * given optional props (such as an auto-generated primary key) are made optional * * methods are omitted */ export type InsertType = Omit> & { [P in OptionalProps]?: T[P]; }; /** IDType extract the actual type of the primary key: * * If TKey is a literal type that names a property of T, extract the type using T[TKey] * * Else, use TKey as is. */ export type IDType = IsStrictlyAny extends true ? TKeyPropNameOrKeyType : TKeyPropNameOrKeyType extends string ? TKeyPropNameOrKeyType extends keyof T ? T[TKeyPropNameOrKeyType] : TKeyPropNameOrKeyType : TKeyPropNameOrKeyType; export type EntityTable> = Table, TInsertType>; export declare var Dexie: DexieConstructor; // Alias of Table and Collection in order to be able to refer them from module below... export interface _Table extends Table { } export interface _Collection extends Collection { } // Besides being the only exported value, let Dexie also be // a namespace for types... export declare module Dexie { // The "Dexie.Promise" type. type Promise = PromiseExtended; // Because many samples have been Dexie.Promise. // The "Dexie.Table" interface. Same as named exported interface Table. interface Table extends _Table { } // Because all samples have been Dexie.Table<...> // The "Dexie.Collection" interface. Same as named exported interface Collection. interface Collection extends _Collection { } // Because app-code may declare it. } export function liveQuery(querier: () => T | Promise): Observable; export function mergeRanges(target: IntervalTree, newSet: IntervalTree): void; export function rangesOverlap(rangeSet1: IntervalTree, rangeSet2: IntervalTree): boolean; declare var RangeSet$1: RangeSetConstructor; export function cmp(a: any, b: any): number; export function replacePrefix(a: string, b: string): PropModification; export function add(num: number | bigint | any[]): PropModification; export function remove(num: number | bigint | any[]): PropModification; export { Dexie as default, RangeSet$1 as RangeSet, }; export {};