// Type definitions for Dexie v1.4.1 // Project: https://github.com/dfahlander/Dexie.js // Definitions by: David Fahlander // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped interface Thenable { then(onFulfilled: (value: R) => Thenable, onRejected: (error: any) => Thenable): Thenable; then(onFulfilled: (value: R) => Thenable, onRejected?: (error: any) => U): Thenable; then(onFulfilled: (value: R) => U, onRejected: (error: any) => Thenable): Thenable; then(onFulfilled?: (value: R) => U, onRejected?: (error: any) => U): Thenable; } declare type IndexableType = string | number | Date | Array; declare class Dexie { constructor(databaseName: string, options?: { addons?: Array<(db: Dexie) => void>, autoOpen?: boolean, indexedDB?: IDBFactory, IDBKeyRange?: IDBKeyRange }); name: string; tables: Dexie.Table[]; verno: number; static addons: Array<(db: Dexie) => void>; static version: number; static semVer: string; static currentTransaction: Dexie.Transaction; static getDatabaseNames(): Dexie.Promise>; static getDatabaseNames(onFulfilled: (value: Array) => Thenable): Dexie.Promise; static getDatabaseNames(onFulfilled: (value: Array) => U): Dexie.Promise; static override (origFunc:F, overridedFactory: (fn:any)=>any) : F; static getByKeyPath(obj: Object, keyPath: string): any; static setByKeyPath(obj: Object, keyPath: string, value: any): void; static delByKeyPath(obj: Object, keyPath: string): void; static shallowClone (obj: T): T; static deepClone(obj: T): T; static asap(fn: Function) : void; static maxKey: Array; static dependencies: { indexedDB: IDBFactory, IDBKeyRange: IDBKeyRange, localStorage?: Storage }; static default: Dexie; version(versionNumber: Number): Dexie.Version; on: { (eventName: string, subscriber: Function, ...args : any[]): void; (eventName: 'ready', subscriber: () => any, bSticky: boolean): void; (eventName: 'error', subscriber: (error: any) => any): void; (eventName: 'populate', subscriber: () => any): void; (eventName: 'blocked', subscriber: () => any): void; (eventName: 'versionchange', subscriber: (event: IDBVersionChangeEvent) => any): void; ready: Dexie.DexieOnReadyEvent; error: Dexie.DexieErrorEvent; populate: Dexie.DexieEvent; blocked: Dexie.DexieEvent; versionchange: Dexie.DexieVersionChangeEvent; } open(): Dexie.Promise; table(tableName: string): Dexie.Table; table(tableName: string): Dexie.Table; table(tableName: string): Dexie.Table; transaction(mode: string, table: Dexie.Table, scope: () => Thenable): Dexie.Promise; transaction(mode: string, table: Dexie.Table, table2: Dexie.Table, scope: () => Thenable): Dexie.Promise; transaction(mode: string, table: Dexie.Table, table2: Dexie.Table, table3: Dexie.Table, scope: () => Thenable): Dexie.Promise; transaction(mode: string, tables: Dexie.Table[], scope: () => Thenable): Dexie.Promise; transaction(mode: string, table: Dexie.Table, scope: () => U): Dexie.Promise; transaction(mode: string, table: Dexie.Table, table2: Dexie.Table, scope: () => U): Dexie.Promise; transaction(mode: string, table: Dexie.Table, table2: Dexie.Table, table3: Dexie.Table, scope: () => U): Dexie.Promise; transaction(mode: string, tables: Dexie.Table[], scope: () => U): Dexie.Promise; close(): void; delete(): Dexie.Promise; exists(name : string) : Dexie.Promise; isOpen(): boolean; hasFailed(): boolean; backendDB(): IDBDatabase; vip(scopeFunction: () => U): U; // 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 : new()=>Dexie.Table; WhereClause: new()=>Dexie.WhereClause; Version: new()=>Dexie.Version; WriteableTable: new()=>Dexie.Table; Transaction: new()=>Dexie.Transaction; Collection: new()=>Dexie.Collection; WriteableCollection: new()=>Dexie.Collection; } declare module Dexie { class Promise implements Thenable { constructor(callback: (resolve: (value?: Thenable) => void, reject: (error?: any) => void) => void); constructor(callback: (resolve: (value?: R) => void, reject: (error?: any) => void) => void); then(onFulfilled: (value: R) => Thenable, onRejected: (error: any) => Thenable): Promise; then(onFulfilled: (value: R) => Thenable, onRejected?: (error: any) => U): Promise; then(onFulfilled: (value: R) => U, onRejected: (error: any) => Thenable): Promise; then(onFulfilled?: (value: R) => U, onRejected?: (error: any) => U): Promise; catch(onRejected: (error: any) => Thenable): Promise; catch(onRejected: (error: any) => U): Promise; catch(ExceptionType: (new() => ET), onRejected: (error: ET) => Promise): Promise; catch(ExceptionType: (new() => ET), onRejected: (error: ET) => U): Promise; catch(errorName: string, onRejected: (error: {name: string}) => Promise): Promise; catch(errorName: string, onRejected: (error: {name: string}) => U): Promise; finally(onFinally: () => any): Promise; onuncatched: () => any; } module Promise { function resolve(value?: Thenable): Promise; function resolve(value?: R): Promise; function reject(error: any): Promise; function all(promises: Thenable[]): Promise; function all(...promises: Thenable[]): Promise; function race(promises: Thenable[]): Promise; function newPSD(scope: () => R): R; var PSD: any; var on: { (eventName: string, subscriber: Function): void; (eventName: 'error', subscriber: (error: any) => any): void; error: DexieErrorEvent; } } interface Version { stores(schema: { [key: string]: string }): Version; upgrade(fn: (trans: Transaction) => void): Version; } interface Transaction { active: boolean; db: Dexie; mode: string; idbtrans: IDBTransaction; tables: { [type: string]: Table }; storeNames: Array; on: { (eventName: string, subscriber: () => any): void; (eventName: 'complete', subscriber: () => any): void; (eventName: 'abort', subscriber: () => any): void; (eventName: 'error', subscriber: (error:any) => any): void; complete: DexieEvent; abort: DexieEvent; error: DexieEvent; } abort(): void; table(tableName: string): Table; table(tableName: string): Table; table(tableName: string): Table; } interface DexieEvent { subscribe(fn: () => any): void; unsubscribe(fn: () => any): void; fire(): any; } interface DexieErrorEvent { subscribe(fn: (error: any) => any): void; unsubscribe(fn: (error: any) => any): void; fire(error: any): any; } interface DexieVersionChangeEvent { subscribe(fn: (event: IDBVersionChangeEvent) => any): void; unsubscribe(fn: (event: IDBVersionChangeEvent) => any): void; fire(event: IDBVersionChangeEvent): any; } interface DexieOnReadyEvent { subscribe(fn: () => any, bSticky: boolean): void; unsubscribe(fn: () => any): void; fire(): any; } interface Table { name: string; schema: TableSchema; hook: { (eventName: string, subscriber: () => any): void; creating: DexieEvent; reading: DexieEvent; updating: DexieEvent; deleting: DexieEvent; } get(key: Key): Promise; where(index: string): WhereClause; filter(fn: (obj: T) => boolean): Collection; count(): Promise; count(onFulfilled: (value: number) => Thenable): Promise; count(onFulfilled: (value: number) => U): Promise; offset(n: number): Collection; limit(n: number): Collection; each(callback: (obj: T, cursor: {key: IndexableType, primaryKey: Key}) => any): Promise; toArray(): Promise>; toArray(onFulfilled: (value: Array) => Thenable): Promise; toArray(onFulfilled: (value: Array) => U): Promise; toCollection(): Collection; orderBy(index: string): Collection; reverse(): Collection; mapToClass(constructor: Function): Function; add(item: T, key?: Key): Promise; update(key: Key, changes: { [keyPath: string]: any }): Promise; put(item: T, key?: Key): Promise; delete(key: Key): Promise; clear(): Promise; bulkAdd(items: T[], keys?: IndexableType[]): Promise; bulkPut(items: T[], keys?: IndexableType[]): Promise; bulkDelete(keys: IndexableType[]) : Promise; } interface WhereClause { above(key: IndexableType): Collection; aboveOrEqual(key: IndexableType): Collection; anyOf(keys: IndexableType[]): Collection; anyOf(...keys: IndexableType[]): Collection; anyOfIgnoreCase(keys: string[]): Collection; anyOfIgnoreCase(...keys: string[]): Collection; below(key: IndexableType): Collection; belowOrEqual(key: IndexableType): Collection; between(lower: IndexableType, upper: IndexableType, includeLower?: boolean, includeUpper?: boolean): Collection; equals(key: IndexableType): Collection; equalsIgnoreCase(key: string): Collection; inAnyRange(ranges: Array): 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: Array): Collection; notEqual(key: IndexableType): Collection; } interface Collection { and(filter: (x: T) => boolean): Collection; clone(props?: Object): Collection; count(): Promise; count(onFulfilled: (value: number) => Thenable): Promise; count(onFulfilled: (value: number) => U): Promise; distinct(): Collection; each(callback: (obj: T, cursor: {key: IndexableType, primaryKey: Key}) => any): Promise; eachKey(callback: (key: IndexableType, cursor: {key: IndexableType, primaryKey: Key}) => any): Promise; eachPrimaryKey(callback: (key: Key, cursor: {key: IndexableType, primaryKey: Key}) => any): Promise; eachUniqueKey(callback: (key: IndexableType, cursor: {key: IndexableType, primaryKey: Key}) => any): Promise; filter(filter: (x: T) => boolean): Collection; first(): Promise; first(onFulfilled: (value: T) => Thenable): Promise; first(onFulfilled: (value: T) => U): Promise; keys(): Promise; keys(onFulfilled: (value: IndexableType[]) => Thenable): Promise; keys(onFulfilled: (value: IndexableType[]) => U): Promise; primaryKeys(): Promise; primaryKeys(onFulfilled: (value: Key[]) => Thenable): Promise; primaryKeys(onFulfilled: (value: Key[]) => U): Promise; last(): Promise; last(onFulfilled: (value: T) => Thenable): Promise; last(onFulfilled: (value: T) => U): Promise; limit(n: number): Collection; offset(n: number): Collection; or(indexOrPrimayKey: string): WhereClause; raw(): Collection; reverse(): Collection; sortBy(keyPath: string): Promise; sortBy(keyPath: string, onFulfilled: (value: T[]) => Thenable): Promise; sortBy(keyPath: string, onFulfilled: (value: T[]) => U): Promise; toArray(): Promise>; toArray(onFulfilled: (value: Array) => Thenable): Promise; toArray(onFulfilled: (value: Array) => U): Promise; uniqueKeys(): Promise; uniqueKeys(onFulfilled: (value: IndexableType[]) => Thenable): Promise; uniqueKeys(onFulfilled: (value: IndexableType[]) => U): Promise; until(filter: (value: T) => boolean, includeStopEntry?: boolean): Collection; // WriteableCollection: delete(): Promise; modify(changeCallback: (obj: T, ctx:{value: T}) => void): Promise; modify(changes: { [keyPath: string]: any } ): Promise; } interface TableSchema { name: string; primKey: IndexSpec; indexes: IndexSpec[]; mappedClass: Function; } interface IndexSpec { name: string; keyPath: string | Array; unique: boolean; multi: boolean; auto: boolean; compound: boolean; src: string; } // Make it possible to touch physical classes as they are var TableSchema: new()=>TableSchema, IndexSpec: new()=>IndexSpec, Events: any; // Too complex to define correctly right now. // errnames - handy spellcheck in switch (error.name) {} cases. var errnames: { // Error names generated by indexedDB: Unknown: 'UnknownError'; Constraint: 'ConstraintError'; Data: 'DataError'; TransactionInactive: 'TransactionInactiveError'; ReadOnly: 'ReadOnlyError'; Version: 'VersionError'; NotFound: 'NotFoundError'; InvalidState: 'InvalidStateError'; InvalidAccess: 'InvalidAccessError'; Abort: 'AbortError'; Timeout: 'TimeoutError'; QuotaExceeded: 'QuotaExceededError'; Syntax: 'SyntaxError'; DataClone: 'DataCloneError'; // Dexie-specific error names: Modify: 'ModifyError'; OpenFailed: 'OpenFailedError'; VersionChange: 'VersionChangeError'; Schema: 'SchemaError'; Upgrade: 'UpgradeError'; InvalidTable: 'InvalidTableError'; MissingAPI: 'MissingAPIError'; NoSuchDatabase: 'NoSuchDatabaseError'; InvalidArgument: 'InvalidArgumentError'; SubTransaction: 'Error'; Unsupported: 'UnsupportedError'; Internal: 'InternalError'; DatabaseClosed: 'DatabaseClosedError'; }; class DexieError extends Error { name: string; message: string; stack: string; inner: any; constructor (name?:string, message?:string); toString(): string; } class ModifyError extends DexieError{ constructor (msg?:string, failures?: any[], successCount?: number, failedKeys?: IndexableType[]); failures: Array; failedKeys: Array; successCount: number; } class BulkError extends DexieError{ constructor (msg?:string, failures?: any[]); failures: Array; } class OpenFailedError extends DexieError {constructor (msg?: string, inner?: Object);constructor (inner: Object);} class VersionChangeError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} class SchemaError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} class UpgradeError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} class InvalidTableError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} class MissingAPIError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} class NoSuchDatabaseError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} class InvalidArgumentError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} class SubTransactionError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} class UnsupportedError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} class InternalError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} class DatabaseClosedError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} class IncompatiblePromiseError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} class UnknownError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} class ConstraintError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} class DataError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} class TransactionInactiveError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} class ReadOnlyError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} class VersionError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} class NotFoundError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} class InvalidStateError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} class InvalidAccessError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} class AbortError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} class TimeoutError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} class QuotaExceededError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} class SyntaxError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} class DataCloneError extends DexieError {constructor (msg?: string, inner?: Object); constructor (inner: Object);} } export default Dexie;