shelving 1.107.2 → 1.108.0

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.
Files changed (58) hide show
  1. package/change/Change.d.ts +44 -30
  2. package/change/Change.js +24 -0
  3. package/db/CacheProvider.d.ts +24 -0
  4. package/db/CacheProvider.js +58 -0
  5. package/db/ChangeProvider.d.ts +26 -0
  6. package/db/ChangeProvider.js +54 -0
  7. package/db/DebugProvider.d.ts +42 -0
  8. package/{provider → db}/DebugProvider.js +35 -18
  9. package/db/ItemStore.d.ts +13 -13
  10. package/db/ItemStore.js +6 -6
  11. package/db/MemoryProvider.d.ts +61 -0
  12. package/{provider → db}/MemoryProvider.js +96 -90
  13. package/db/Provider.d.ts +101 -0
  14. package/db/QueryStore.d.ts +20 -20
  15. package/db/QueryStore.js +18 -20
  16. package/db/ThroughProvider.d.ts +39 -0
  17. package/{provider → db}/ThroughProvider.js +6 -0
  18. package/db/ValidationProvider.d.ts +46 -0
  19. package/{provider → db}/ValidationProvider.js +34 -29
  20. package/db/index.d.ts +7 -4
  21. package/db/index.js +9 -4
  22. package/firestore/client/FirestoreClientProvider.d.ts +16 -15
  23. package/firestore/client/FirestoreClientProvider.js +21 -15
  24. package/firestore/lite/FirestoreLiteProvider.d.ts +16 -15
  25. package/firestore/lite/FirestoreLiteProvider.js +20 -14
  26. package/firestore/server/FirestoreServerProvider.d.ts +16 -15
  27. package/firestore/server/FirestoreServerProvider.js +36 -26
  28. package/index.d.ts +0 -1
  29. package/index.js +0 -1
  30. package/package.json +1 -1
  31. package/react/createDataContext.d.ts +7 -7
  32. package/react/createDataContext.js +1 -1
  33. package/schema/DataSchema.d.ts +2 -2
  34. package/test/basics.d.ts +2 -2
  35. package/test/people.d.ts +2 -2
  36. package/test/util.d.ts +4 -4
  37. package/util/data.d.ts +2 -2
  38. package/util/item.d.ts +9 -11
  39. package/util/item.js +2 -6
  40. package/util/validate.d.ts +3 -3
  41. package/db/CollectionReference.d.ts +0 -125
  42. package/db/CollectionReference.js +0 -162
  43. package/db/Database.d.ts +0 -94
  44. package/db/Database.js +0 -135
  45. package/db/ItemReference.d.ts +0 -74
  46. package/db/ItemReference.js +0 -95
  47. package/db/QueryReference.d.ts +0 -102
  48. package/db/QueryReference.js +0 -110
  49. package/provider/CacheProvider.d.ts +0 -23
  50. package/provider/CacheProvider.js +0 -64
  51. package/provider/DebugProvider.d.ts +0 -40
  52. package/provider/MemoryProvider.d.ts +0 -64
  53. package/provider/Provider.d.ts +0 -122
  54. package/provider/ThroughProvider.d.ts +0 -37
  55. package/provider/ValidationProvider.d.ts +0 -44
  56. package/provider/index.d.ts +0 -6
  57. package/provider/index.js +0 -6
  58. /package/{provider → db}/Provider.js +0 -0
@@ -1,6 +1,6 @@
1
- import type { AsyncProvider, Provider } from "../provider/Provider.js";
1
+ import type { AbstractProvider, AsyncProvider, Provider } from "../db/Provider.js";
2
2
  import type { ImmutableArray } from "../util/array.js";
3
- import type { Data } from "../util/data.js";
3
+ import type { DataKey, Database } from "../util/data.js";
4
4
  import type { ItemQuery } from "../util/item.js";
5
5
  import type { Updates } from "../util/update.js";
6
6
  import { type Optional } from "../util/optional.js";
@@ -9,75 +9,89 @@ export interface Change {
9
9
  readonly action: string;
10
10
  }
11
11
  /** A change to a database collection. */
12
- export interface CollectionChange<T extends Data> extends Change {
13
- readonly collection: string;
12
+ export interface CollectionChange<T extends Database, K extends DataKey<T>> extends Change {
13
+ readonly collection: K;
14
14
  readonly id?: string | never;
15
- readonly query?: ItemQuery<T> | never;
15
+ readonly query?: ItemQuery<T[K]> | never;
16
16
  }
17
17
  /** Add an item to a database collection. */
18
- export interface AddItemChange<T extends Data> extends CollectionChange<T> {
18
+ export interface AddItemChange<T extends Database, K extends DataKey<T>> extends CollectionChange<T, K> {
19
19
  readonly action: "add";
20
20
  readonly id?: never;
21
21
  readonly query?: never;
22
- readonly data: T;
22
+ readonly data: T[K];
23
23
  }
24
24
  /** Change an item in a database collection. */
25
- export interface ItemChange<T extends Data> extends CollectionChange<T> {
25
+ export interface ItemChange<T extends Database, K extends DataKey<T>> extends CollectionChange<T, K> {
26
26
  readonly id: string;
27
27
  readonly query?: never;
28
28
  }
29
29
  /** Set an item in a database collection. */
30
- export interface SetItemChange<T extends Data> extends ItemChange<T> {
30
+ export interface ItemSetChange<T extends Database, K extends DataKey<T>> extends ItemChange<T, K> {
31
31
  readonly action: "set";
32
- readonly data: T;
32
+ readonly data: T[K];
33
33
  }
34
34
  /** Update an item in a database collection. */
35
- export interface UpdateItemChange<T extends Data> extends ItemChange<T> {
35
+ export interface ItemUpdateChange<T extends Database, K extends DataKey<T>> extends ItemChange<T, K> {
36
36
  readonly action: "update";
37
- readonly updates: Updates<T>;
37
+ readonly updates: Updates<T[K]>;
38
38
  }
39
39
  /** Delete an item in a database collection. */
40
- export interface DeleteItemChange<T extends Data> extends ItemChange<T> {
40
+ export interface ItemDeleteChange<T extends Database, K extends DataKey<T>> extends ItemChange<T, K> {
41
41
  readonly action: "delete";
42
42
  }
43
43
  /** Change multiple items in a database collection. */
44
- export interface QueryChange<T extends Data> extends CollectionChange<T> {
45
- readonly query: ItemQuery<T>;
44
+ export interface QueryChange<T extends Database, K extends DataKey<T>> extends CollectionChange<T, K> {
45
+ readonly query: ItemQuery<T[K]>;
46
46
  readonly id?: never;
47
47
  }
48
48
  /** Set multiple items in a database collection. */
49
- export interface SetQueryChange<T extends Data> extends QueryChange<T> {
49
+ export interface QuerySetChange<T extends Database, K extends DataKey<T>> extends QueryChange<T, K> {
50
50
  readonly action: "set";
51
- readonly data: T;
51
+ readonly data: T[K];
52
52
  }
53
53
  /** Update multiple items in a database collection. */
54
- export interface UpdateQueryChange<T extends Data> extends QueryChange<T> {
54
+ export interface QueryUpdateChange<T extends Database, K extends DataKey<T>> extends QueryChange<T, K> {
55
55
  readonly action: "update";
56
- readonly updates: Updates<T>;
56
+ readonly updates: Updates<T[K]>;
57
57
  }
58
58
  /** Delete multiple items in a database collection. */
59
- export interface DeleteQueryChange<T extends Data> extends QueryChange<T> {
59
+ export interface QueryDeleteChange<T extends Database, K extends DataKey<T>> extends QueryChange<T, K> {
60
60
  readonly action: "delete";
61
61
  }
62
- /** Write an item in a database collection. */
63
- export type WriteItemChange<T extends Data> = SetItemChange<T> | UpdateItemChange<T> | DeleteItemChange<T>;
64
- /** Write multiple item in a database collection. */
65
- export type WriteQueryChange<T extends Data> = SetQueryChange<T> | UpdateQueryChange<T> | DeleteQueryChange<T>;
66
- /** Write an item or multiple items in a database collection. */
67
- export type WriteChange<T extends Data> = AddItemChange<T> | WriteItemChange<T> | WriteQueryChange<T>;
62
+ /** Write an item in a set of collection. */
63
+ export type DatabaseItemChange<T extends Database> = ItemSetChange<T, DataKey<T>> | ItemUpdateChange<T, DataKey<T>> | ItemDeleteChange<T, DataKey<T>>;
64
+ /** Write multiple item in a set of collection. */
65
+ export type DatabaseQueryChange<T extends Database> = QuerySetChange<T, DataKey<T>> | QueryUpdateChange<T, DataKey<T>> | QueryDeleteChange<T, DataKey<T>>;
66
+ /** Write an item or multiple items in a set of collection. */
67
+ export type DatabaseChange<T extends Database> = AddItemChange<T, DataKey<T>> | DatabaseItemChange<T> | DatabaseQueryChange<T>;
68
+ /** Write an item or multiple items in a set of collection. */
69
+ export type DatabaseChanges<T extends Database> = ImmutableArray<DatabaseChange<T>>;
70
+ /** Get a set change for an item. */
71
+ export declare function getItemSet<T extends Database, K extends DataKey<T>>(provider: AbstractProvider<T>, collection: K, id: string, data: T[K]): ItemSetChange<T, K>;
72
+ /** Get an update change an item. */
73
+ export declare function getItemUpdate<T extends Database, K extends DataKey<T>>(provider: AbstractProvider<T>, collection: K, id: string, updates: Updates<T[K]>): ItemUpdateChange<T, K>;
74
+ /** Get a set change for an item. */
75
+ export declare function getItemDelete<T extends Database, K extends DataKey<T>>(provider: AbstractProvider<T>, collection: K, id: string): ItemDeleteChange<T, K>;
76
+ /** Get a set change for an query. */
77
+ export declare function getQuerySet<T extends Database, K extends DataKey<T>>(provider: AbstractProvider<T>, collection: K, query: ItemQuery<T[K]>, data: T[K]): QuerySetChange<T, K>;
78
+ /** Get an update change an query. */
79
+ export declare function getQueryUpdate<T extends Database, K extends DataKey<T>>(provider: AbstractProvider<T>, collection: K, query: ItemQuery<T[K]>, updates: Updates<T[K]>): QueryUpdateChange<T, K>;
80
+ /** Get a set change for an query. */
81
+ export declare function getQueryDelete<T extends Database, K extends DataKey<T>>(provider: AbstractProvider<T>, collection: K, query: ItemQuery<T[K]>): QueryDeleteChange<T, K>;
68
82
  /** Write a set of changes to a synchronous provider. */
69
- export declare function writeProviderChanges<T extends Data>(provider: Provider, ...changes: Optional<WriteChange<T>>[]): ImmutableArray<WriteChange<T>>;
83
+ export declare function writeProviderChanges<T extends Database>(provider: Provider<T>, ...changes: Optional<DatabaseChange<T>>[]): DatabaseChanges<T>;
70
84
  /**
71
85
  * Write a single change to a synchronous provider.
72
86
  * @param change Change that should be written.
73
87
  * @return Change that was written.
74
88
  */
75
- export declare function writeProviderChange<T extends Data>(provider: Provider, change: WriteChange<T>): WriteChange<T>;
89
+ export declare function writeProviderChange<T extends Database>(provider: Provider<T>, change: DatabaseChange<T>): DatabaseChange<T>;
76
90
  /** Write a set of changes to an asynchronous provider. */
77
- export declare function writeAsyncProviderChanges<T extends Data>(provider: AsyncProvider, ...changes: Optional<WriteChange<T>>[]): Promise<ImmutableArray<WriteChange<T>>>;
91
+ export declare function writeAsyncProviderChanges<T extends Database>(provider: AsyncProvider<T>, ...changes: Optional<DatabaseChange<T>>[]): Promise<DatabaseChanges<T>>;
78
92
  /**
79
93
  * Write a single change to an asynchronous provider.
80
94
  * @param change Change that should be written.
81
95
  * @return Change that was written.
82
96
  */
83
- export declare function writeAsyncProviderChange<T extends Data>(provider: AsyncProvider, change: WriteChange<T>): Promise<WriteChange<T>>;
97
+ export declare function writeAsyncProviderChange<T extends Database>(provider: AsyncProvider<T>, change: DatabaseChange<T>): Promise<DatabaseChange<T>>;
package/change/Change.js CHANGED
@@ -1,4 +1,28 @@
1
1
  import { notOptional } from "../util/optional.js";
2
+ /** Get a set change for an item. */
3
+ export function getItemSet(provider, collection, id, data) {
4
+ return { action: "set", collection, id, data };
5
+ }
6
+ /** Get an update change an item. */
7
+ export function getItemUpdate(provider, collection, id, updates) {
8
+ return { action: "update", collection, id, updates };
9
+ }
10
+ /** Get a set change for an item. */
11
+ export function getItemDelete(provider, collection, id) {
12
+ return { action: "delete", collection, id };
13
+ }
14
+ /** Get a set change for an query. */
15
+ export function getQuerySet(provider, collection, query, data) {
16
+ return { action: "set", collection, query, data };
17
+ }
18
+ /** Get an update change an query. */
19
+ export function getQueryUpdate(provider, collection, query, updates) {
20
+ return { action: "update", collection, query, updates };
21
+ }
22
+ /** Get a set change for an query. */
23
+ export function getQueryDelete(provider, collection, query) {
24
+ return { action: "delete", collection, query };
25
+ }
2
26
  /** Write a set of changes to a synchronous provider. */
3
27
  export function writeProviderChanges(provider, ...changes) {
4
28
  return changes.filter(notOptional).map(change => writeProviderChange(provider, change));
@@ -0,0 +1,24 @@
1
+ import type { AsyncProvider } from "./Provider.js";
2
+ import type { DataKey, Database } from "../util/data.js";
3
+ import type { ItemQuery, Items, OptionalItem } from "../util/item.js";
4
+ import type { Sourceable } from "../util/source.js";
5
+ import type { Updates } from "../util/update.js";
6
+ import { MemoryProvider } from "./MemoryProvider.js";
7
+ /** Keep a copy of asynchronous remote data in a local synchronous cache. */
8
+ export declare class CacheProvider<T extends Database> implements AsyncProvider<T>, Sourceable<AsyncProvider<T>> {
9
+ readonly source: AsyncProvider<T>;
10
+ readonly memory: MemoryProvider<T>;
11
+ constructor(source: AsyncProvider<T>, cache?: MemoryProvider<T>);
12
+ getItem<K extends DataKey<T>>(collection: K, id: string): Promise<OptionalItem<T[K]>>;
13
+ getItemSequence<K extends DataKey<T>>(collection: K, id: string): AsyncIterable<OptionalItem<T[K]>>;
14
+ addItem<K extends DataKey<T>>(collection: K, data: T[K]): Promise<string>;
15
+ setItem<K extends DataKey<T>>(collection: K, id: string, data: T[K]): Promise<void>;
16
+ updateItem<K extends DataKey<T>>(collection: K, id: string, updates: Updates<T[K]>): Promise<void>;
17
+ deleteItem<K extends DataKey<T>>(collection: K, id: string): Promise<void>;
18
+ countQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): Promise<number>;
19
+ getQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): Promise<Items<T[K]>>;
20
+ getQuerySequence<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): AsyncIterable<Items<T[K]>>;
21
+ setQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, data: T[K]): Promise<void>;
22
+ updateQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, updates: Updates<T[K]>): Promise<void>;
23
+ deleteQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): Promise<void>;
24
+ }
@@ -0,0 +1,58 @@
1
+ import { MemoryProvider } from "./MemoryProvider.js";
2
+ /** Keep a copy of asynchronous remote data in a local synchronous cache. */
3
+ export class CacheProvider {
4
+ source;
5
+ memory;
6
+ constructor(source, cache = new MemoryProvider()) {
7
+ this.source = source;
8
+ this.memory = cache;
9
+ }
10
+ async getItem(collection, id) {
11
+ const item = await this.source.getItem(collection, id);
12
+ item ? this.memory.setItem(collection, id, item) : this.memory.deleteItem(collection, id);
13
+ return item;
14
+ }
15
+ getItemSequence(collection, id) {
16
+ return this.memory.setItemSequence(collection, id, this.source.getItemSequence(collection, id));
17
+ }
18
+ async addItem(collection, data) {
19
+ const id = await this.source.addItem(collection, data);
20
+ this.memory.setItem(collection, id, data);
21
+ return id;
22
+ }
23
+ async setItem(collection, id, data) {
24
+ await this.source.setItem(collection, id, data);
25
+ this.memory.setItem(collection, id, data);
26
+ }
27
+ async updateItem(collection, id, updates) {
28
+ await this.source.updateItem(collection, id, updates);
29
+ this.memory.updateItem(collection, id, updates);
30
+ }
31
+ async deleteItem(collection, id) {
32
+ await this.source.deleteItem(collection, id);
33
+ this.memory.deleteItem(collection, id);
34
+ }
35
+ countQuery(collection, query) {
36
+ return this.source.countQuery(collection, query);
37
+ }
38
+ async getQuery(collection, query) {
39
+ const items = await this.source.getQuery(collection, query);
40
+ this.memory.setItems(collection, items, query);
41
+ return items;
42
+ }
43
+ getQuerySequence(collection, query) {
44
+ return this.memory.setItemsSequence(collection, this.source.getQuerySequence(collection, query), query);
45
+ }
46
+ async setQuery(collection, query, data) {
47
+ await this.source.setQuery(collection, query, data);
48
+ this.memory.setQuery(collection, query, data);
49
+ }
50
+ async updateQuery(collection, query, updates) {
51
+ await this.source.updateQuery(collection, query, updates);
52
+ this.memory.updateQuery(collection, query, updates);
53
+ }
54
+ async deleteQuery(collection, query) {
55
+ await this.source.deleteQuery(collection, query);
56
+ this.memory.deleteQuery(collection, query);
57
+ }
58
+ }
@@ -0,0 +1,26 @@
1
+ import type { DatabaseChange, DatabaseChanges, ItemDeleteChange, ItemSetChange, ItemUpdateChange, QueryDeleteChange, QuerySetChange, QueryUpdateChange } from "../change/Change.js";
2
+ import type { DataKey, Database } from "../util/data.js";
3
+ import type { ItemQuery } from "../util/item.js";
4
+ import type { Optional } from "../util/optional.js";
5
+ import type { Updates } from "../util/update.js";
6
+ import { AsyncThroughProvider, ThroughProvider } from "./ThroughProvider.js";
7
+ export declare class ChangeProvider<T extends Database> extends ThroughProvider<T> {
8
+ getItemSet<K extends DataKey<T>>(collection: K, id: string, data: T[K]): ItemSetChange<T, K>;
9
+ getItemUpdate<K extends DataKey<T>>(collection: K, id: string, updates: Updates<T[K]>): ItemUpdateChange<T, K>;
10
+ getItemDelete<K extends DataKey<T>>(collection: K, id: string): ItemDeleteChange<T, K>;
11
+ getQuerySet<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, data: T[K]): QuerySetChange<T, K>;
12
+ getQueryUpdate<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, updates: Updates<T[K]>): QueryUpdateChange<T, K>;
13
+ getQueryDelete<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): QueryDeleteChange<T, K>;
14
+ writeChanges(...changes: Optional<DatabaseChange<T>>[]): DatabaseChanges<T>;
15
+ writeChange(change: DatabaseChange<T>): DatabaseChange<T>;
16
+ }
17
+ export declare class AsyncChangeProvider<T extends Database> extends AsyncThroughProvider<T> {
18
+ getItemSet<K extends DataKey<T>>(collection: K, id: string, data: T[K]): ItemSetChange<T, K>;
19
+ getItemUpdate<K extends DataKey<T>>(collection: K, id: string, updates: Updates<T[K]>): ItemUpdateChange<T, K>;
20
+ getItemDelete<K extends DataKey<T>>(collection: K, id: string): ItemDeleteChange<T, K>;
21
+ getQuerySet<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, data: T[K]): QuerySetChange<T, K>;
22
+ getQueryUpdate<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, updates: Updates<T[K]>): QueryUpdateChange<T, K>;
23
+ getQueryDelete<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): QueryDeleteChange<T, K>;
24
+ writeChanges(...changes: Optional<DatabaseChange<T>>[]): Promise<DatabaseChanges<T>>;
25
+ writeChange(change: DatabaseChange<T>): Promise<DatabaseChange<T>>;
26
+ }
@@ -0,0 +1,54 @@
1
+ import { getItemDelete, getItemSet, getItemUpdate, getQueryDelete, getQuerySet, getQueryUpdate, writeAsyncProviderChange, writeAsyncProviderChanges, writeProviderChange, writeProviderChanges } from "../change/Change.js";
2
+ import { AsyncThroughProvider, ThroughProvider } from "./ThroughProvider.js";
3
+ export class ChangeProvider extends ThroughProvider {
4
+ getItemSet(collection, id, data) {
5
+ return getItemSet(this, collection, id, data);
6
+ }
7
+ getItemUpdate(collection, id, updates) {
8
+ return getItemUpdate(this, collection, id, updates);
9
+ }
10
+ getItemDelete(collection, id) {
11
+ return getItemDelete(this, collection, id);
12
+ }
13
+ getQuerySet(collection, query, data) {
14
+ return getQuerySet(this, collection, query, data);
15
+ }
16
+ getQueryUpdate(collection, query, updates) {
17
+ return getQueryUpdate(this, collection, query, updates);
18
+ }
19
+ getQueryDelete(collection, query) {
20
+ return getQueryDelete(this, collection, query);
21
+ }
22
+ writeChanges(...changes) {
23
+ return writeProviderChanges(this, ...changes);
24
+ }
25
+ writeChange(change) {
26
+ return writeProviderChange(this, change);
27
+ }
28
+ }
29
+ export class AsyncChangeProvider extends AsyncThroughProvider {
30
+ getItemSet(collection, id, data) {
31
+ return getItemSet(this, collection, id, data);
32
+ }
33
+ getItemUpdate(collection, id, updates) {
34
+ return getItemUpdate(this, collection, id, updates);
35
+ }
36
+ getItemDelete(collection, id) {
37
+ return getItemDelete(this, collection, id);
38
+ }
39
+ getQuerySet(collection, query, data) {
40
+ return getQuerySet(this, collection, query, data);
41
+ }
42
+ getQueryUpdate(collection, query, updates) {
43
+ return getQueryUpdate(this, collection, query, updates);
44
+ }
45
+ getQueryDelete(collection, query) {
46
+ return getQueryDelete(this, collection, query);
47
+ }
48
+ writeChanges(...changes) {
49
+ return writeAsyncProviderChanges(this, ...changes);
50
+ }
51
+ writeChange(change) {
52
+ return writeAsyncProviderChange(this, change);
53
+ }
54
+ }
@@ -0,0 +1,42 @@
1
+ import type { AbstractProvider, AsyncProvider, Provider } from "./Provider.js";
2
+ import type { AsyncThroughProvider, ThroughProvider } from "./ThroughProvider.js";
3
+ import type { DataKey, Database } from "../util/data.js";
4
+ import type { ItemQuery, Items, OptionalItem } from "../util/item.js";
5
+ import type { Updates } from "../util/update.js";
6
+ /** Provider that logs operations to a source provider to the console. */
7
+ declare abstract class AbstractDebugProvider<T extends Database> {
8
+ abstract readonly source: AbstractProvider<T>;
9
+ getItemSequence<K extends DataKey<T>>(collection: K, id: string): AsyncIterableIterator<OptionalItem<T[K]>>;
10
+ getQuerySequence<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): AsyncIterableIterator<Items<T[K]>>;
11
+ }
12
+ /** Provider that logs operations to a synchronous source provider to the console. */
13
+ export declare class DebugProvider<T extends Database> extends AbstractDebugProvider<T> implements ThroughProvider<T> {
14
+ readonly source: Provider<T>;
15
+ constructor(source: Provider<T>);
16
+ getItem<K extends DataKey<T>>(collection: K, id: string): OptionalItem<T[K]>;
17
+ addItem<K extends DataKey<T>>(collection: K, data: T[K]): string;
18
+ setItem<K extends DataKey<T>>(collection: K, id: string, data: T[K]): void;
19
+ updateItem<K extends DataKey<T>>(collection: K, id: string, updates: Updates): void;
20
+ deleteItem<K extends DataKey<T>>(collection: K, id: string): void;
21
+ countQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): number;
22
+ getQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): Items<T[K]>;
23
+ setQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, data: T[K]): void;
24
+ updateQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, updates: Updates): void;
25
+ deleteQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): void;
26
+ }
27
+ /** Provider that logs operations to a synchronous source provider to the console. */
28
+ export declare class AsyncDebugProvider<T extends Database> extends AbstractDebugProvider<T> implements AsyncThroughProvider<T> {
29
+ readonly source: AsyncProvider<T>;
30
+ constructor(source: AsyncProvider<T>);
31
+ getItem<K extends DataKey<T>>(collection: K, id: string): Promise<OptionalItem<T[K]>>;
32
+ addItem<K extends DataKey<T>>(collection: K, data: T[K]): Promise<string>;
33
+ setItem<K extends DataKey<T>>(collection: K, id: string, data: T[K]): Promise<void>;
34
+ updateItem<K extends DataKey<T>>(collection: K, id: string, updates: Updates): Promise<void>;
35
+ deleteItem<K extends DataKey<T>>(collection: K, id: string): Promise<void>;
36
+ countQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): Promise<number>;
37
+ getQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): Promise<Items<T[K]>>;
38
+ setQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, data: T[K]): Promise<void>;
39
+ updateQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, updates: Updates): Promise<void>;
40
+ deleteQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): Promise<void>;
41
+ }
42
+ export {};
@@ -87,6 +87,17 @@ export class DebugProvider extends AbstractDebugProvider {
87
87
  throw reason;
88
88
  }
89
89
  }
90
+ countQuery(collection, query) {
91
+ try {
92
+ const count = this.source.countQuery(collection, query);
93
+ console.debug("✔ GET", collection, query, count);
94
+ return count;
95
+ }
96
+ catch (reason) {
97
+ console.error("✘ GET", collection, query, reason);
98
+ throw reason;
99
+ }
100
+ }
90
101
  getQuery(collection, query) {
91
102
  try {
92
103
  const items = this.source.getQuery(collection, query);
@@ -100,9 +111,8 @@ export class DebugProvider extends AbstractDebugProvider {
100
111
  }
101
112
  setQuery(collection, query, data) {
102
113
  try {
103
- const num = this.source.setQuery(collection, query, data);
104
- console.debug("✔ SET", collection, query, data, num);
105
- return num;
114
+ this.source.setQuery(collection, query, data);
115
+ console.debug("✔ SET", collection, query, data);
106
116
  }
107
117
  catch (reason) {
108
118
  console.error("✘ SET", collection, query, data, reason);
@@ -111,9 +121,8 @@ export class DebugProvider extends AbstractDebugProvider {
111
121
  }
112
122
  updateQuery(collection, query, updates) {
113
123
  try {
114
- const num = this.source.updateQuery(collection, query, updates);
115
- console.debug("✔ UPDATE", collection, query, updates, num);
116
- return num;
124
+ this.source.updateQuery(collection, query, updates);
125
+ console.debug("✔ UPDATE", collection, query, updates);
117
126
  }
118
127
  catch (reason) {
119
128
  console.error("✘ UPDATE", collection, query, updates, reason);
@@ -122,9 +131,8 @@ export class DebugProvider extends AbstractDebugProvider {
122
131
  }
123
132
  deleteQuery(collection, query) {
124
133
  try {
125
- const num = this.source.deleteQuery(collection, query);
126
- console.debug("✔ DELETE", collection, query, num);
127
- return num;
134
+ this.source.deleteQuery(collection, query);
135
+ console.debug("✔ DELETE", collection, query);
128
136
  }
129
137
  catch (reason) {
130
138
  console.error("✘ DELETE", collection, query, reason);
@@ -196,6 +204,18 @@ export class AsyncDebugProvider extends AbstractDebugProvider {
196
204
  throw reason;
197
205
  }
198
206
  }
207
+ async countQuery(collection, query) {
208
+ try {
209
+ console.debug("⋯ COUNT", collection, query);
210
+ const count = await this.source.countQuery(collection, query);
211
+ console.debug("✔ COUNT", collection, query, count);
212
+ return count;
213
+ }
214
+ catch (reason) {
215
+ console.error("✘ COUNT", collection, query, reason);
216
+ throw reason;
217
+ }
218
+ }
199
219
  async getQuery(collection, query) {
200
220
  try {
201
221
  console.debug("⋯ GET", collection, query);
@@ -211,9 +231,8 @@ export class AsyncDebugProvider extends AbstractDebugProvider {
211
231
  async setQuery(collection, query, data) {
212
232
  try {
213
233
  console.debug("⋯ SET", collection, query, data);
214
- const num = await this.source.setQuery(collection, query, data);
215
- console.debug("✔ SET", collection, query, data, num);
216
- return num;
234
+ await this.source.setQuery(collection, query, data);
235
+ console.debug("✔ SET", collection, query, data);
217
236
  }
218
237
  catch (reason) {
219
238
  console.error("✘ SET", collection, query, data, reason);
@@ -223,9 +242,8 @@ export class AsyncDebugProvider extends AbstractDebugProvider {
223
242
  async updateQuery(collection, query, updates) {
224
243
  try {
225
244
  console.debug("⋯ UPDATE", collection, query, updates);
226
- const num = await this.source.updateQuery(collection, query, updates);
227
- console.debug("✔ UPDATE", collection, query, updates, num);
228
- return num;
245
+ await this.source.updateQuery(collection, query, updates);
246
+ console.debug("✔ UPDATE", collection, query, updates);
229
247
  }
230
248
  catch (reason) {
231
249
  console.error("✘ UPDATE", collection, query, updates, reason);
@@ -235,9 +253,8 @@ export class AsyncDebugProvider extends AbstractDebugProvider {
235
253
  async deleteQuery(collection, query) {
236
254
  try {
237
255
  console.debug("⋯ DELETE", collection, query);
238
- const num = await this.source.deleteQuery(collection, query);
239
- console.debug("✔ DELETE", collection, query, num);
240
- return num;
256
+ await this.source.deleteQuery(collection, query);
257
+ console.debug("✔ DELETE", collection, query);
241
258
  }
242
259
  catch (reason) {
243
260
  console.error("✘ DELETE", collection, query, reason);
package/db/ItemStore.d.ts CHANGED
@@ -1,30 +1,30 @@
1
- import type { AbstractProvider } from "../provider/Provider.js";
1
+ import type { AbstractProvider } from "./Provider.js";
2
2
  import type { StopCallback } from "../util/callback.js";
3
- import type { Data } from "../util/data.js";
4
- import type { ItemData, ItemValue } from "../util/item.js";
3
+ import type { DataKey, Database } from "../util/data.js";
4
+ import type { Item, OptionalItem } from "../util/item.js";
5
5
  import { BooleanStore } from "../store/BooleanStore.js";
6
6
  import { Store } from "../store/Store.js";
7
7
  /** Store a single item. */
8
- export declare class ItemStore<T extends Data = Data> extends Store<ItemValue<T>> {
9
- readonly provider: AbstractProvider;
10
- readonly collection: string;
8
+ export declare class ItemStore<T extends Database, K extends DataKey<T>> extends Store<OptionalItem<T[K]>> {
9
+ readonly provider: AbstractProvider<T>;
10
+ readonly collection: K;
11
11
  readonly id: string;
12
12
  readonly busy: BooleanStore;
13
13
  /** Get the data of this store (throws `RequiredError` if item doesn't exist). */
14
- get data(): ItemData<T>;
14
+ get data(): Item<T[K]>;
15
15
  /** Set the data of this store. */
16
- set data(data: T | ItemData<T>);
16
+ set data(data: T[K] | Item<T[K]>);
17
17
  /** Does the item exist? */
18
18
  get exists(): boolean;
19
- constructor(provider: AbstractProvider, collection: string, id: string);
19
+ constructor(provider: AbstractProvider<T>, collection: K, id: string);
20
20
  /** Refresh this store from the source provider. */
21
- refresh(provider?: AbstractProvider): void;
21
+ refresh(provider?: AbstractProvider<T>): void;
22
22
  private _refresh;
23
23
  /** Refresh this store if data in the cache is older than `maxAge` (in milliseconds). */
24
- refreshStale(maxAge: number, provider?: AbstractProvider): void;
24
+ refreshStale(maxAge: number, provider?: AbstractProvider<T>): void;
25
25
  /** Subscribe this store to a provider. */
26
- connect(provider?: AbstractProvider): StopCallback;
27
- [Symbol.asyncIterator](): AsyncGenerator<ItemValue<T>, void, void>;
26
+ connect(provider?: AbstractProvider<T>): StopCallback;
27
+ [Symbol.asyncIterator](): AsyncGenerator<OptionalItem<T[K]>, void, void>;
28
28
  private _iterating;
29
29
  /** Start subscription to `MemoryProvider` if there is one. */
30
30
  start(): void;
package/db/ItemStore.js CHANGED
@@ -1,12 +1,12 @@
1
- import { CacheProvider } from "../provider/CacheProvider.js";
2
1
  import { BooleanStore } from "../store/BooleanStore.js";
3
2
  import { Store } from "../store/Store.js";
4
3
  import { call } from "../util/callback.js";
5
4
  import { NONE } from "../util/constants.js";
6
- import { getItemData } from "../util/item.js";
5
+ import { getItem } from "../util/item.js";
7
6
  import { getRequired } from "../util/optional.js";
8
7
  import { runSequence } from "../util/sequence.js";
9
8
  import { getOptionalSource } from "../util/source.js";
9
+ import { CacheProvider } from "./CacheProvider.js";
10
10
  /** Store a single item. */
11
11
  export class ItemStore extends Store {
12
12
  provider;
@@ -19,7 +19,7 @@ export class ItemStore extends Store {
19
19
  }
20
20
  /** Set the data of this store. */
21
21
  set data(data) {
22
- this.value = getItemData(this.id, data);
22
+ this.value = getItem(this.id, data);
23
23
  }
24
24
  /** Does the item exist? */
25
25
  get exists() {
@@ -80,9 +80,9 @@ export class ItemStore extends Store {
80
80
  /** Start subscription to `MemoryProvider` if there is one. */
81
81
  start() {
82
82
  if (!this._stop) {
83
- const memory = getOptionalSource(CacheProvider, this.provider)?.memory;
84
- if (memory)
85
- this._stop = runSequence(this.through(memory.getCachedItemSequence(this.collection, this.id)));
83
+ const table = getOptionalSource(CacheProvider, this.provider)?.memory.getTable(this.collection);
84
+ if (table)
85
+ this._stop = runSequence(this.through(table.getCachedItemSequence(this.id)));
86
86
  }
87
87
  }
88
88
  /** Stop subscription to `MemoryProvider` if there is one. */
@@ -0,0 +1,61 @@
1
+ import type { Provider } from "./Provider.js";
2
+ import type { Data, DataKey, Database } from "../util/data.js";
3
+ import type { Item, ItemQuery, Items, OptionalItem } from "../util/item.js";
4
+ import type { Updates } from "../util/update.js";
5
+ import { DeferredSequence } from "../sequence/DeferredSequence.js";
6
+ /**
7
+ * Fast in-memory store for data.
8
+ * - Extremely fast (ideal for caching!), but does not persist data after the browser window is closed.
9
+ * - `get()` etc return the exact same instance of an object that's passed into `set()`
10
+ */
11
+ export declare class MemoryProvider<T extends Database> implements Provider<T> {
12
+ /** List of tables in `{ collection: Table }` format. */
13
+ private _tables;
14
+ /** Get a table for a collection. */
15
+ getTable<K extends DataKey<T>>(collection: K): MemoryTable<T[K]>;
16
+ getItemTime<K extends DataKey<T>>(collection: K, id: string): number | undefined;
17
+ getItem<K extends DataKey<T>>(collection: K, id: string): OptionalItem<T[K]>;
18
+ getItemSequence<K extends DataKey<T>>(collection: K, id: string): AsyncIterable<OptionalItem<T[K]>>;
19
+ addItem<K extends DataKey<T>>(collection: K, data: T[K]): string;
20
+ setItem<K extends DataKey<T>>(collection: K, id: string, data: T[K]): void;
21
+ setItemSequence<K extends DataKey<T>>(collection: K, id: string, sequence: AsyncIterable<OptionalItem<T[K]>>): AsyncIterable<OptionalItem<T[K]>>;
22
+ updateItem<K extends DataKey<T>>(collection: K, id: string, updates: Updates<T[K]>): void;
23
+ deleteItem<K extends DataKey<T>>(collection: K, id: string): void;
24
+ getQueryTime<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): number | undefined;
25
+ countQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): number;
26
+ getQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): Items<T[K]>;
27
+ getQuerySequence<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): AsyncIterable<Items<T[K]>>;
28
+ setQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, data: T[K]): void;
29
+ updateQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, updates: Updates<T[K]>): void;
30
+ deleteQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): void;
31
+ setItems<K extends DataKey<T>>(collection: K, items: Items<T[K]>, query?: ItemQuery<T[K]>): void;
32
+ setItemsSequence<K extends DataKey<T>>(collection: K, sequence: AsyncIterable<Items<T[K]>>, query?: ItemQuery<T[K]>): AsyncIterable<Items<T[K]>>;
33
+ }
34
+ /** An individual table of data. */
35
+ export declare class MemoryTable<T extends Data> {
36
+ /** Actual data in this table. */
37
+ protected readonly _data: Map<string, Item<T>>;
38
+ /** Times data was last updated. */
39
+ protected readonly _times: Map<string, number>;
40
+ /** Deferred sequence of next values. */
41
+ readonly _changed: DeferredSequence<void>;
42
+ getItemTime(id: string): number | undefined;
43
+ getItem(id: string): OptionalItem<T>;
44
+ getItemSequence(id: string): AsyncIterable<OptionalItem<T>>;
45
+ getCachedItemSequence(id: string): AsyncIterable<OptionalItem<T>>;
46
+ addItem(data: T): string;
47
+ setItem(id: string, data: Item<T> | T): void;
48
+ setItemSequence(id: string, sequence: AsyncIterable<OptionalItem<T>>): AsyncIterable<OptionalItem<T>>;
49
+ updateItem(id: string, updates: Updates<T>): void;
50
+ deleteItem(id: string): void;
51
+ getQueryTime(query?: ItemQuery<T>): number | undefined;
52
+ countQuery(query?: ItemQuery<T>): number;
53
+ getQuery(query?: ItemQuery<T>): Items<T>;
54
+ getQuerySequence(query?: ItemQuery<T>): AsyncIterable<Items<T>>;
55
+ getCachedQuerySequence(query?: ItemQuery<T>): AsyncIterable<Items<T>>;
56
+ setQuery(query: ItemQuery<T>, data: T): void;
57
+ updateQuery(query: ItemQuery<T>, updates: Updates<T>): void;
58
+ deleteQuery(query: ItemQuery<T>): void;
59
+ setItems(items: Items<T>, query?: ItemQuery<T>): void;
60
+ setItemsSequence(sequence: AsyncIterable<Items<T>>, query?: ItemQuery<T>): AsyncIterable<Items<T>>;
61
+ }