dexie 4.0.1-alpha.8 → 4.0.1-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  Dexie.js
2
2
  ========
3
3
 
4
- [![NPM Version][npm-image]][npm-url] [![Build Status](https://travis-ci.com/dexie/Dexie.js.svg?branch=master)](https://travis-ci.com/dexie/Dexie.js)[![Tested with Browserstack](https://dexie.org/assets/images/tested-with-browserstack2.png)](https://www.browserstack.com)
4
+ [![NPM Version][npm-image]][npm-url] ![Build Status](https://github.com/dexie/Dexie.js/actions/workflows/main.yml/badge.svg)
5
5
 
6
6
  Dexie.js is a wrapper library for indexedDB - the standard database in the browser. https://dexie.org
7
7
 
@@ -250,6 +250,9 @@ Watch
250
250
  pnpm run watch
251
251
  ```
252
252
 
253
+ <br/>
254
+
255
+ [![Browser testing via LAMDBATEST](https://dexie.org/assets/images/lambdatest2.png)](https://www.lambdatest.com/)
253
256
 
254
257
  [npm-image]: https://img.shields.io/npm/v/dexie.svg?style=flat
255
258
  [npm-url]: https://npmjs.org/package/dexie
package/SECURITY.md CHANGED
@@ -6,7 +6,7 @@
6
6
  | ------- | ------------------ | --------
7
7
  | 4.x | :white_check_mark: | master
8
8
  | 3.x | :white_check_mark: | master-3
9
- | 2.0.x | :thinking: | master-2
9
+ | 2.0.x | :x: | master-2
10
10
  | 1.5.x | :x: | master-1
11
11
  | < 1.5.1 | :x: |
12
12
 
package/dist/dexie.d.ts CHANGED
@@ -4,7 +4,7 @@
4
4
  *
5
5
  * By David Fahlander, david.fahlander@gmail.com
6
6
  *
7
- * Version 4.0.1-alpha.8, Fri Feb 17 2023
7
+ * Version 4.0.1-beta.10, Mon Feb 12 2024
8
8
  *
9
9
  * https://dexie.org
10
10
  *
@@ -65,6 +65,7 @@ export interface Transaction {
65
65
  mode: IDBTransactionMode;
66
66
  //tables: { [type: string]: Table<any, any> }; Deprecated since 2.0. Obsolete from v3.0.
67
67
  storeNames: Array<string>;
68
+ explicit?: boolean;
68
69
  parent?: Transaction;
69
70
  on: TransactionEvents;
70
71
  abort(): void;
@@ -84,7 +85,7 @@ export interface DeletingHookContext<T, Key> {
84
85
  onsuccess?: () => void;
85
86
  onerror?: (err: any) => void;
86
87
  }
87
- export interface TableHooks<T = any, TKey = IndexableType> extends DexieEventSet {
88
+ export interface TableHooks<T = any, TKey = IndexableType, TInsertType = T> extends DexieEventSet {
88
89
  (eventName: "creating", subscriber: (this: CreatingHookContext<T, TKey>, primKey: TKey, obj: T, transaction: Transaction) => void | undefined | TKey): void;
89
90
  (eventName: "reading", subscriber: (obj: T) => T | any): void;
90
91
  (eventName: "updating", subscriber: (this: UpdatingHookContext<T, TKey>, modifications: Object, primKey: TKey, obj: T, transaction: Transaction) => any): void;
@@ -95,33 +96,33 @@ export interface TableHooks<T = any, TKey = IndexableType> extends DexieEventSet
95
96
  deleting: DexieEvent;
96
97
  }
97
98
  export type ThenShortcut<T, TResult> = (value: T) => TResult | PromiseLike<TResult>;
98
- export interface WhereClause<T = any, TKey = IndexableType> {
99
- above(key: any): Collection<T, TKey>;
100
- aboveOrEqual(key: any): Collection<T, TKey>;
101
- anyOf(keys: ReadonlyArray<IndexableType>): Collection<T, TKey>;
102
- anyOf(...keys: Array<IndexableType>): Collection<T, TKey>;
103
- anyOfIgnoreCase(keys: string[]): Collection<T, TKey>;
104
- anyOfIgnoreCase(...keys: string[]): Collection<T, TKey>;
105
- below(key: any): Collection<T, TKey>;
106
- belowOrEqual(key: any): Collection<T, TKey>;
107
- between(lower: any, upper: any, includeLower?: boolean, includeUpper?: boolean): Collection<T, TKey>;
108
- equals(key: IndexableType): Collection<T, TKey>;
109
- equalsIgnoreCase(key: string): Collection<T, TKey>;
99
+ export interface WhereClause<T = any, TKey = IndexableType, TInsertType = T> {
100
+ above(key: any): Collection<T, TKey, TInsertType>;
101
+ aboveOrEqual(key: any): Collection<T, TKey, TInsertType>;
102
+ anyOf(keys: ReadonlyArray<IndexableType>): Collection<T, TKey, TInsertType>;
103
+ anyOf(...keys: Array<IndexableType>): Collection<T, TKey, TInsertType>;
104
+ anyOfIgnoreCase(keys: string[]): Collection<T, TKey, TInsertType>;
105
+ anyOfIgnoreCase(...keys: string[]): Collection<T, TKey, TInsertType>;
106
+ below(key: any): Collection<T, TKey, TInsertType>;
107
+ belowOrEqual(key: any): Collection<T, TKey, TInsertType>;
108
+ between(lower: any, upper: any, includeLower?: boolean, includeUpper?: boolean): Collection<T, TKey, TInsertType>;
109
+ equals(key: IndexableType): Collection<T, TKey, TInsertType>;
110
+ equalsIgnoreCase(key: string): Collection<T, TKey, TInsertType>;
110
111
  inAnyRange(ranges: ReadonlyArray<{
111
112
  0: any;
112
113
  1: any;
113
114
  }>, options?: {
114
115
  includeLowers?: boolean;
115
116
  includeUppers?: boolean;
116
- }): Collection<T, TKey>;
117
- startsWith(key: string): Collection<T, TKey>;
118
- startsWithAnyOf(prefixes: string[]): Collection<T, TKey>;
119
- startsWithAnyOf(...prefixes: string[]): Collection<T, TKey>;
120
- startsWithIgnoreCase(key: string): Collection<T, TKey>;
121
- startsWithAnyOfIgnoreCase(prefixes: string[]): Collection<T, TKey>;
122
- startsWithAnyOfIgnoreCase(...prefixes: string[]): Collection<T, TKey>;
123
- noneOf(keys: ReadonlyArray<IndexableType>): Collection<T, TKey>;
124
- notEqual(key: IndexableType): Collection<T, TKey>;
117
+ }): Collection<T, TKey, TInsertType>;
118
+ startsWith(key: string): Collection<T, TKey, TInsertType>;
119
+ startsWithAnyOf(prefixes: string[]): Collection<T, TKey, TInsertType>;
120
+ startsWithAnyOf(...prefixes: string[]): Collection<T, TKey, TInsertType>;
121
+ startsWithIgnoreCase(key: string): Collection<T, TKey, TInsertType>;
122
+ startsWithAnyOfIgnoreCase(prefixes: string[]): Collection<T, TKey, TInsertType>;
123
+ startsWithAnyOfIgnoreCase(...prefixes: string[]): Collection<T, TKey, TInsertType>;
124
+ noneOf(keys: ReadonlyArray<IndexableType>): Collection<T, TKey, TInsertType>;
125
+ notEqual(key: IndexableType): Collection<T, TKey, TInsertType>;
125
126
  }
126
127
  export interface PromiseExtendedConstructor extends PromiseConstructor {
127
128
  readonly prototype: PromiseExtended;
@@ -357,20 +358,21 @@ export interface PromiseExtended<T = any> extends Promise<T> {
357
358
  timeout(ms: number, msg?: string): PromiseExtended<T>;
358
359
  }
359
360
  export type KeyPaths<T> = {
360
- [P in keyof T]: P extends string ? T[P] extends any[] ? P | `${P}.${number}` | `${P}.${number}.${KeyPaths<T[P][number]>}` : T[P] extends (...args: any[]) => any // Method
361
+ [P in keyof T]: P extends string ? T[P] extends Array<infer K> ? K extends object // only drill into the array element if it's an object
362
+ ? P | `${P}.${number}` | `${P}.${number}.${KeyPaths<K>}` : P | `${P}.${number}` : T[P] extends (...args: any[]) => any // Method
361
363
  ? never : T[P] extends object ? P | `${P}.${KeyPaths<T[P]>}` : P : never;
362
364
  }[keyof T];
363
365
  export type KeyPathValue<T, PATH> = PATH extends `${infer R}.${infer S}` ? R extends keyof T ? KeyPathValue<T[R], S> : T extends any[] ? PATH extends `${number}.${infer S}` ? KeyPathValue<T[number], S> : void : void : PATH extends `${number}` ? T extends any[] ? T[number] : void : PATH extends keyof T ? T[PATH] : void;
364
366
  export type UpdateSpec<T> = {
365
367
  [KP in KeyPaths<T>]?: KeyPathValue<T, KP>;
366
368
  };
367
- export interface Collection<T = any, TKey = IndexableType> {
369
+ export interface Collection<T = any, TKey = IndexableType, TInsertType = T> {
368
370
  db: Dexie;
369
- and(filter: (x: T) => boolean): Collection<T, TKey>;
370
- clone(props?: Object): Collection<T, TKey>;
371
+ and(filter: (x: T) => boolean): Collection<T, TKey, TInsertType>;
372
+ clone(props?: Object): Collection<T, TKey, TInsertType>;
371
373
  count(): PromiseExtended<number>;
372
374
  count<R>(thenShortcut: ThenShortcut<number, R>): PromiseExtended<R>;
373
- distinct(): Collection<T, TKey>;
375
+ distinct(): Collection<T, TKey, TInsertType>;
374
376
  each(callback: (obj: T, cursor: {
375
377
  key: IndexableType;
376
378
  primaryKey: TKey;
@@ -388,7 +390,7 @@ export interface Collection<T = any, TKey = IndexableType> {
388
390
  primaryKey: TKey;
389
391
  }) => any): PromiseExtended<void>;
390
392
  filter<S extends T>(filter: (x: T) => x is S): Collection<S, TKey>;
391
- filter(filter: (x: T) => boolean): Collection<T, TKey>;
393
+ filter(filter: (x: T) => boolean): Collection<T, TKey, TInsertType>;
392
394
  first(): PromiseExtended<T | undefined>;
393
395
  first<R>(thenShortcut: ThenShortcut<T | undefined, R>): PromiseExtended<R>;
394
396
  keys(): PromiseExtended<IndexableTypeArray>;
@@ -397,24 +399,106 @@ export interface Collection<T = any, TKey = IndexableType> {
397
399
  primaryKeys<R>(thenShortcut: ThenShortcut<TKey[], R>): PromiseExtended<R>;
398
400
  last(): PromiseExtended<T | undefined>;
399
401
  last<R>(thenShortcut: ThenShortcut<T | undefined, R>): PromiseExtended<R>;
400
- limit(n: number): Collection<T, TKey>;
401
- offset(n: number): Collection<T, TKey>;
402
- or(indexOrPrimayKey: string): WhereClause<T, TKey>;
403
- raw(): Collection<T, TKey>;
404
- reverse(): Collection<T, TKey>;
402
+ limit(n: number): Collection<T, TKey, TInsertType>;
403
+ offset(n: number): Collection<T, TKey, TInsertType>;
404
+ or(indexOrPrimayKey: string): WhereClause<T, TKey, TInsertType>;
405
+ raw(): Collection<T, TKey, TInsertType>;
406
+ reverse(): Collection<T, TKey, TInsertType>;
405
407
  sortBy(keyPath: string): PromiseExtended<T[]>;
406
408
  sortBy<R>(keyPath: string, thenShortcut: ThenShortcut<T[], R>): PromiseExtended<R>;
407
409
  toArray(): PromiseExtended<Array<T>>;
408
410
  toArray<R>(thenShortcut: ThenShortcut<T[], R>): PromiseExtended<R>;
409
411
  uniqueKeys(): PromiseExtended<IndexableTypeArray>;
410
412
  uniqueKeys<R>(thenShortcut: ThenShortcut<IndexableTypeArray, R>): PromiseExtended<R>;
411
- until(filter: (value: T) => boolean, includeStopEntry?: boolean): Collection<T, TKey>;
413
+ until(filter: (value: T) => boolean, includeStopEntry?: boolean): Collection<T, TKey, TInsertType>;
412
414
  // Mutating methods
413
415
  delete(): PromiseExtended<number>;
414
416
  modify(changeCallback: (obj: T, ctx: {
415
- value: T;
417
+ value: TInsertType;
416
418
  }) => void | boolean): PromiseExtended<number>;
417
- modify(changes: UpdateSpec<T>): PromiseExtended<number>;
419
+ modify(changes: UpdateSpec<TInsertType>): PromiseExtended<number>;
420
+ }
421
+ export type IntervalTree = IntervalTreeNode | EmptyRange;
422
+ export interface IntervalTreeNode {
423
+ from: IndexableType; // lower bound
424
+ to: IndexableType; // upper bound
425
+ l: IntervalTreeNode | null; // left
426
+ r: IntervalTreeNode | null; // right
427
+ d: number; // depth
428
+ }
429
+ export interface EmptyRange {
430
+ d: 0;
431
+ }
432
+ export interface DexieOnReadyEvent {
433
+ subscribe(fn: (vipDb: Dexie) => any, bSticky: boolean): void;
434
+ unsubscribe(fn: (vipDb: Dexie) => any): void;
435
+ fire(vipDb: Dexie): any;
436
+ }
437
+ export interface DexieVersionChangeEvent {
438
+ subscribe(fn: (event: IDBVersionChangeEvent) => any): void;
439
+ unsubscribe(fn: (event: IDBVersionChangeEvent) => any): void;
440
+ fire(event: IDBVersionChangeEvent): any;
441
+ }
442
+ export interface DexiePopulateEvent {
443
+ subscribe(fn: (trans: Transaction) => any): void;
444
+ unsubscribe(fn: (trans: Transaction) => any): void;
445
+ fire(trans: Transaction): any;
446
+ }
447
+ export interface DexieCloseEvent {
448
+ subscribe(fn: (event: Event) => any): void;
449
+ unsubscribe(fn: (event: Event) => any): void;
450
+ fire(event: Event): any;
451
+ }
452
+ export interface DbEvents extends DexieEventSet {
453
+ (eventName: "ready", subscriber: (vipDb: Dexie) => any, bSticky?: boolean): void;
454
+ (eventName: "populate", subscriber: (trans: Transaction) => any): void;
455
+ (eventName: "blocked", subscriber: (event: IDBVersionChangeEvent) => any): void;
456
+ (eventName: "versionchange", subscriber: (event: IDBVersionChangeEvent) => any): void;
457
+ (eventName: "close", subscriber: (event: Event) => any): void;
458
+ ready: DexieOnReadyEvent;
459
+ populate: DexiePopulateEvent;
460
+ blocked: DexieEvent;
461
+ versionchange: DexieVersionChangeEvent;
462
+ close: DexieCloseEvent;
463
+ }
464
+ /** Set of mutated parts of the database
465
+ */
466
+ export type ObservabilitySet = {
467
+ /** Database part having been mutated.
468
+ *
469
+ * This structure is produced in observability-middleware.ts
470
+ * and consumed in live-query.ts.
471
+ *
472
+ * Format of 'part':
473
+ *
474
+ * `idb://${dbName}/${tableName}/${indexName}`
475
+ *
476
+ * * dbName is the database name
477
+ * * tableName is the table name
478
+ * * indexName is any of:
479
+ * 1. An empty string - represents the primary keys of the affected objs
480
+ * 2. ":dels" - represents primary keys of deleted objects in the table
481
+ * 3. The keyPath of an index, such as "name", "age" or "address.city" -
482
+ * represents indexes that, if used in a query, might affect the
483
+ * result of that query.
484
+ *
485
+ * IntervalTree
486
+ * * See definition of IntervalTree type in rangeset.d.ts
487
+ * * See rangesOverlap() in rangeset.ts that can be used to compare two
488
+ * IntervalTrees and detect collissions.
489
+ * * See RangeSet class that can be used to create an IntervalTree and add
490
+ * ranges to it.
491
+ */
492
+ [part: string]: IntervalTree;
493
+ };
494
+ export interface DexieOnStorageMutatedEvent {
495
+ subscribe(fn: (parts: ObservabilitySet) => any): void;
496
+ unsubscribe(fn: (parts: ObservabilitySet) => any): void;
497
+ fire(parts: ObservabilitySet): any;
498
+ }
499
+ export interface GlobalDexieEvents extends DexieEventSet {
500
+ (eventName: "storagemutated", subscriber: (parts: ObservabilitySet) => any): void;
501
+ storagemutated: DexieOnStorageMutatedEvent;
418
502
  }
419
503
  export const enum DBCoreRangeType {
420
504
  Equal = 1,
@@ -449,6 +533,7 @@ export interface DBCoreAddRequest {
449
533
  trans: DBCoreTransaction;
450
534
  values: readonly any[];
451
535
  keys?: any[];
536
+ mutatedParts?: ObservabilitySet;
452
537
  /** @deprecated Will always get results since 3.1.0-alpha.5 */
453
538
  wantResults?: boolean;
454
539
  }
@@ -457,6 +542,7 @@ export interface DBCorePutRequest {
457
542
  trans: DBCoreTransaction;
458
543
  values: readonly any[];
459
544
  keys?: any[];
545
+ mutatedParts?: ObservabilitySet;
460
546
  criteria?: {
461
547
  index: string | null;
462
548
  range: DBCoreKeyRange;
@@ -477,6 +563,7 @@ export interface DBCoreDeleteRequest {
477
563
  type: "delete";
478
564
  trans: DBCoreTransaction;
479
565
  keys: any[];
566
+ mutatedParts?: ObservabilitySet;
480
567
  criteria?: {
481
568
  index: string | null;
482
569
  range: DBCoreKeyRange;
@@ -486,15 +573,18 @@ export interface DBCoreDeleteRangeRequest {
486
573
  type: "deleteRange";
487
574
  trans: DBCoreTransaction;
488
575
  range: DBCoreKeyRange;
576
+ mutatedParts?: ObservabilitySet;
489
577
  }
490
578
  export interface DBCoreGetManyRequest {
491
579
  trans: DBCoreTransaction;
492
580
  keys: any[];
493
581
  cache?: "immutable" | "clone";
582
+ obsSet?: ObservabilitySet;
494
583
  }
495
584
  export interface DBCoreGetRequest {
496
585
  trans: DBCoreTransaction;
497
586
  key: any;
587
+ obsSet?: ObservabilitySet;
498
588
  }
499
589
  export interface DBCoreQuery {
500
590
  index: DBCoreIndex; //keyPath: null | string | string[]; // null represents primary key. string a property, string[] several properties.
@@ -505,6 +595,7 @@ export interface DBCoreQueryRequest {
505
595
  values?: boolean;
506
596
  limit?: number;
507
597
  query: DBCoreQuery;
598
+ obsSet?: ObservabilitySet;
508
599
  }
509
600
  export interface DBCoreQueryResponse {
510
601
  result: any[];
@@ -515,10 +606,12 @@ export interface DBCoreOpenCursorRequest {
515
606
  unique?: boolean;
516
607
  reverse?: boolean;
517
608
  query: DBCoreQuery;
609
+ obsSet?: ObservabilitySet;
518
610
  }
519
611
  export interface DBCoreCountRequest {
520
612
  trans: DBCoreTransaction;
521
613
  query: DBCoreQuery;
614
+ obsSet?: ObservabilitySet;
522
615
  }
523
616
  export interface DBCoreCursor {
524
617
  readonly trans: DBCoreTransaction;
@@ -563,6 +656,8 @@ export interface DBCoreIndex {
563
656
  readonly multiEntry?: boolean;
564
657
  /** Extract (using keyPath) a key from given value (object). Null for outbound primary keys */
565
658
  readonly extractKey: ((value: any) => any) | null;
659
+ /** If this index is a virtual index, lowLevelIndex represents the actual IndexedDB index behind it */
660
+ readonly lowLevelIndex?: DBCoreIndex;
566
661
  }
567
662
  export interface DBCore {
568
663
  stack: "dbcore";
@@ -584,11 +679,11 @@ export interface DBCoreTable {
584
679
  openCursor(req: DBCoreOpenCursorRequest): Promise<DBCoreCursor | null>;
585
680
  count(req: DBCoreCountRequest): Promise<number>;
586
681
  }
587
- export interface Table<T = any, TKey = IndexableType, TInsertType = T> {
682
+ export interface Table<T = any, TKey = any, TInsertType = T> {
588
683
  db: Dexie;
589
684
  name: string;
590
685
  schema: TableSchema;
591
- hook: TableHooks<T, TKey>;
686
+ hook: TableHooks<T, TKey, TInsertType>;
592
687
  core: DBCoreTable;
593
688
  get(key: TKey): PromiseExtended<T | undefined>;
594
689
  get<R>(key: TKey, thenShortcut: ThenShortcut<T | undefined, R>): PromiseExtended<R>;
@@ -598,27 +693,27 @@ export interface Table<T = any, TKey = IndexableType, TInsertType = T> {
598
693
  get<R>(equalityCriterias: {
599
694
  [key: string]: any;
600
695
  }, thenShortcut: ThenShortcut<T | undefined, R>): PromiseExtended<R>;
601
- where(index: string | string[]): WhereClause<T, TKey>;
696
+ where(index: string | string[]): WhereClause<T, TKey, TInsertType>;
602
697
  where(equalityCriterias: {
603
698
  [key: string]: any;
604
- }): Collection<T, TKey>;
605
- filter(fn: (obj: T) => boolean): Collection<T, TKey>;
699
+ }): Collection<T, TKey, TInsertType>;
700
+ filter(fn: (obj: T) => boolean): Collection<T, TKey, TInsertType>;
606
701
  count(): PromiseExtended<number>;
607
702
  count<R>(thenShortcut: ThenShortcut<number, R>): PromiseExtended<R>;
608
- offset(n: number): Collection<T, TKey>;
609
- limit(n: number): Collection<T, TKey>;
703
+ offset(n: number): Collection<T, TKey, TInsertType>;
704
+ limit(n: number): Collection<T, TKey, TInsertType>;
610
705
  each(callback: (obj: T, cursor: {
611
706
  key: any;
612
707
  primaryKey: TKey;
613
708
  }) => any): PromiseExtended<void>;
614
709
  toArray(): PromiseExtended<Array<T>>;
615
710
  toArray<R>(thenShortcut: ThenShortcut<T[], R>): PromiseExtended<R>;
616
- toCollection(): Collection<T, TKey>;
617
- orderBy(index: string | string[]): Collection<T, TKey>;
618
- reverse(): Collection<T, TKey>;
711
+ toCollection(): Collection<T, TKey, TInsertType>;
712
+ orderBy(index: string | string[]): Collection<T, TKey, TInsertType>;
713
+ reverse(): Collection<T, TKey, TInsertType>;
619
714
  mapToClass(constructor: Function): Function;
620
715
  add(item: TInsertType, key?: TKey): PromiseExtended<TKey>;
621
- update(key: TKey | T, changes: UpdateSpec<T> | ((obj: T, ctx: {
716
+ update(key: TKey | T, changes: UpdateSpec<TInsertType> | ((obj: T, ctx: {
622
717
  value: any;
623
718
  primKey: IndexableType;
624
719
  }) => void | boolean)): PromiseExtended<number>;
@@ -656,88 +751,6 @@ export interface Version {
656
751
  }): Version;
657
752
  upgrade(fn: (trans: Transaction) => PromiseLike<any> | void): Version;
658
753
  }
659
- export type IntervalTree = IntervalTreeNode | EmptyRange;
660
- export interface IntervalTreeNode {
661
- from: IndexableType; // lower bound
662
- to: IndexableType; // upper bound
663
- l: IntervalTreeNode | null; // left
664
- r: IntervalTreeNode | null; // right
665
- d: number; // depth
666
- }
667
- export interface EmptyRange {
668
- d: 0;
669
- }
670
- export interface DexieOnReadyEvent {
671
- subscribe(fn: (vipDb: Dexie) => any, bSticky: boolean): void;
672
- unsubscribe(fn: (vipDb: Dexie) => any): void;
673
- fire(vipDb: Dexie): any;
674
- }
675
- export interface DexieVersionChangeEvent {
676
- subscribe(fn: (event: IDBVersionChangeEvent) => any): void;
677
- unsubscribe(fn: (event: IDBVersionChangeEvent) => any): void;
678
- fire(event: IDBVersionChangeEvent): any;
679
- }
680
- export interface DexiePopulateEvent {
681
- subscribe(fn: (trans: Transaction) => any): void;
682
- unsubscribe(fn: (trans: Transaction) => any): void;
683
- fire(trans: Transaction): any;
684
- }
685
- export interface DexieCloseEvent {
686
- subscribe(fn: (event: Event) => any): void;
687
- unsubscribe(fn: (event: Event) => any): void;
688
- fire(event: Event): any;
689
- }
690
- export interface DbEvents extends DexieEventSet {
691
- (eventName: "ready", subscriber: (vipDb: Dexie) => any, bSticky?: boolean): void;
692
- (eventName: "populate", subscriber: (trans: Transaction) => any): void;
693
- (eventName: "blocked", subscriber: (event: IDBVersionChangeEvent) => any): void;
694
- (eventName: "versionchange", subscriber: (event: IDBVersionChangeEvent) => any): void;
695
- (eventName: "close", subscriber: (event: Event) => any): void;
696
- ready: DexieOnReadyEvent;
697
- populate: DexiePopulateEvent;
698
- blocked: DexieEvent;
699
- versionchange: DexieVersionChangeEvent;
700
- close: DexieCloseEvent;
701
- }
702
- /** Set of mutated parts of the database
703
- */
704
- export type ObservabilitySet = {
705
- /** Database part having been mutated.
706
- *
707
- * This structure is produced in observability-middleware.ts
708
- * and consumed in live-query.ts.
709
- *
710
- * Format of 'part':
711
- *
712
- * `idb://${dbName}/${tableName}/${indexName}`
713
- *
714
- * * dbName is the database name
715
- * * tableName is the table name
716
- * * indexName is any of:
717
- * 1. An empty string - represents the primary keys of the affected objs
718
- * 2. ":dels" - represents primary keys of deleted objects in the table
719
- * 3. The keyPath of an index, such as "name", "age" or "address.city" -
720
- * represents indexes that, if used in a query, might affect the
721
- * result of that query.
722
- *
723
- * IntervalTree
724
- * * See definition of IntervalTree type in rangeset.d.ts
725
- * * See rangesOverlap() in rangeset.ts that can be used to compare two
726
- * IntervalTrees and detect collissions.
727
- * * See RangeSet class that can be used to create an IntervalTree and add
728
- * ranges to it.
729
- */
730
- [part: string]: IntervalTree;
731
- };
732
- export interface DexieOnStorageMutatedEvent {
733
- subscribe(fn: (parts: ObservabilitySet) => any): void;
734
- unsubscribe(fn: (parts: ObservabilitySet) => any): void;
735
- fire(parts: ObservabilitySet): any;
736
- }
737
- export interface GlobalDexieEvents extends DexieEventSet {
738
- (eventName: "storagemutated", subscriber: (parts: ObservabilitySet) => any): void;
739
- storagemutated: DexieOnStorageMutatedEvent;
740
- }
741
754
  export type TransactionMode = "readonly" | "readwrite" | "r" | "r!" | "r?" | "rw" | "rw!" | "rw?";
742
755
  export type DbSchema = {
743
756
  [tableName: string]: TableSchema;
@@ -788,8 +801,12 @@ export interface Dexie {
788
801
  transaction<U>(mode: TransactionMode, table: string | Table, table2: string | Table, table3: string | Table, scope: (trans: TXWithTables<this>) => PromiseLike<U> | U): PromiseExtended<U>;
789
802
  transaction<U>(mode: TransactionMode, table: string | Table, table2: string | Table, table3: string | Table, table4: string | Table, scope: (trans: TXWithTables<this>) => PromiseLike<U> | U): PromiseExtended<U>;
790
803
  transaction<U>(mode: TransactionMode, table: string | Table, table2: string | Table, table3: string | Table, table5: string | Table, scope: (trans: TXWithTables<this>) => PromiseLike<U> | U): PromiseExtended<U>;
791
- close(): void;
792
- delete(): PromiseExtended<void>;
804
+ close(closeOptions?: {
805
+ disableAutoOpen: boolean;
806
+ }): void;
807
+ delete(closeOptions?: {
808
+ disableAutoOpen: boolean;
809
+ }): PromiseExtended<void>;
793
810
  isOpen(): boolean;
794
811
  hasBeenClosed(): boolean;
795
812
  hasFailed(): boolean;
@@ -967,10 +984,18 @@ declare global {
967
984
  readonly observable: symbol;
968
985
  }
969
986
  }
987
+ export interface Subscribable<T> {
988
+ subscribe(observer: Partial<Observer<T>>): Unsubscribable;
989
+ }
990
+ export interface Unsubscribable {
991
+ unsubscribe(): void;
992
+ }
970
993
  export interface Observable<T = any> {
971
- subscribe(onNext?: ((value: T) => void) | null, onError?: ((error: any) => void) | null, onComplete?: (() => void) | null): Subscription;
972
- subscribe(observer?: Observer<T> | null): Subscription;
973
- [Symbol.observable]: () => Observable<T>;
994
+ subscribe(observerOrNext?: Observer<T> | ((value: T) => void)): Subscription;
995
+ subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription;
996
+ getValue?(): T;
997
+ hasValue?(): boolean;
998
+ [Symbol.observable]: () => Subscribable<T>;
974
999
  }
975
1000
  export interface Subscription {
976
1001
  unsubscribe(): void;
@@ -982,6 +1007,40 @@ export interface Observer<T = any> {
982
1007
  error?: (error: any) => void;
983
1008
  complete?: () => void;
984
1009
  }
1010
+ export type GlobalQueryCache = {
1011
+ // TODO: Change to parts: {[part: string]: TblQueryCache}
1012
+ // och unsignaledParts: ObservabilitySet;
1013
+ [part: string]: TblQueryCache; // part is `idb://${dbName}/${tableName}`
1014
+ };
1015
+ export interface TblQueryCache {
1016
+ queries: {
1017
+ query: {
1018
+ [indexName: string]: CacheEntry[];
1019
+ };
1020
+ count: {
1021
+ [indexName: string]: CacheEntry[];
1022
+ };
1023
+ };
1024
+ objs: Map<string | number, object>;
1025
+ optimisticOps: DBCoreMutateRequest[];
1026
+ unsignaledParts: ObservabilitySet;
1027
+ }
1028
+ export interface CacheEntryCommon {
1029
+ subscribers: Set<() => void>;
1030
+ obsSet: ObservabilitySet;
1031
+ //txObsSet: ObservabilitySet;
1032
+ promise: Promise<any>;
1033
+ dirty: boolean;
1034
+ }
1035
+ export type CacheEntry = CacheEntryCommon & ({
1036
+ type: "query";
1037
+ req: DBCoreQueryRequest;
1038
+ res?: readonly any[];
1039
+ } | {
1040
+ type: "count";
1041
+ req: DBCoreCountRequest;
1042
+ res?: number;
1043
+ });
985
1044
  export type ChromeTransactionDurability = "default" | "strict" | "relaxed";
986
1045
  export interface DexieOptions {
987
1046
  addons?: Array<(db: Dexie) => void>;
@@ -997,6 +1056,7 @@ export interface DexieOptions {
997
1056
  allowEmptyDB?: boolean;
998
1057
  modifyChunkSize?: number;
999
1058
  chromeTransactionDurability?: ChromeTransactionDurability;
1059
+ cache?: "immutable" | "cloned" | "disabled";
1000
1060
  }
1001
1061
  export interface DexieConstructor extends DexieExceptionClasses {
1002
1062
  new (databaseName: string, options?: DexieOptions): Dexie;
@@ -1010,6 +1070,7 @@ export interface DexieConstructor extends DexieExceptionClasses {
1010
1070
  getDatabaseNames<R>(thenShortcut: ThenShortcut<string[], R>): Promise<R>;
1011
1071
  vip<U>(scopeFunction: () => U): U;
1012
1072
  ignoreTransaction<U>(fn: () => U): U;
1073
+ disableBfCache?: boolean;
1013
1074
  liveQuery<T>(fn: () => T | Promise<T>): Observable<T>;
1014
1075
  extendObservabilitySet(target: ObservabilitySet, newSet: ObservabilitySet): ObservabilitySet;
1015
1076
  override<F>(origFunc: F, overridedFactory: (fn: any) => any): F; // ?
@@ -1025,6 +1086,8 @@ export interface DexieConstructor extends DexieExceptionClasses {
1025
1086
  delete(dbName: string): Promise<void>;
1026
1087
  dependencies: DexieDOMDependencies;
1027
1088
  default: Dexie; // Work-around for different build tools handling default imports differently.
1089
+ cache: GlobalQueryCache;
1090
+ debug: false | true | "dexie";
1028
1091
  Promise: PromiseExtendedConstructor;
1029
1092
  //TableSchema: {}; // Deprecate!
1030
1093
  //IndexSpec: {new():IndexSpec}; //? Deprecate
@@ -1059,7 +1122,7 @@ export type InsertType<T, OptionalProps extends keyof T> = Omit<T, OptionalProps
1059
1122
  export type IDType<T, TKeyPropNameOrKeyType> = IsStrictlyAny<T> extends true ? TKeyPropNameOrKeyType : TKeyPropNameOrKeyType extends string ? TKeyPropNameOrKeyType extends keyof T ? T[TKeyPropNameOrKeyType] : TKeyPropNameOrKeyType : TKeyPropNameOrKeyType;
1060
1123
  export type EntityTable<T, TKeyPropName extends keyof T = never, TInsertType = InsertType<T, TKeyPropName>> = Table<T, IDType<T, TKeyPropName>, TInsertType>;
1061
1124
  export declare var Dexie: DexieConstructor;
1062
- export interface _Table<T, TKey> extends Table<T, TKey> {
1125
+ export interface _Table<T, TKey, TInsertType> extends Table<T, TKey, TInsertType> {
1063
1126
  }
1064
1127
  export interface _Collection<T, TKey> extends Collection<T, TKey> {
1065
1128
  }
@@ -1067,7 +1130,7 @@ export declare module Dexie {
1067
1130
  // The "Dexie.Promise" type.
1068
1131
  type Promise<T = any> = PromiseExtended<T>; // Because many samples have been Dexie.Promise.
1069
1132
  // The "Dexie.Table" interface. Same as named exported interface Table.
1070
- interface Table<T = any, Key = any> extends _Table<T, Key> {
1133
+ interface Table<T = any, Key = any, TInsertType = T> extends _Table<T, Key, TInsertType> {
1071
1134
  } // Because all samples have been Dexie.Table<...>
1072
1135
  // The "Dexie.Collection" interface. Same as named exported interface Collection.
1073
1136
  interface Collection<T = any, Key = any> extends _Collection<T, Key> {