shelving 1.150.15 → 1.151.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.
package/db/Provider.d.ts CHANGED
@@ -1,20 +1,21 @@
1
1
  import type { DataKey, Database } from "../util/data.js";
2
- import type { Item, ItemQuery, Items, OptionalItem } from "../util/item.js";
2
+ import type { Identifier, Item, Items, OptionalItem } from "../util/item.js";
3
+ import type { ItemQuery } from "../util/query.js";
3
4
  import type { Updates } from "../util/update.js";
4
5
  /** Provides access to data (e.g. IndexedDB, Firebase, or in-memory cache providers). */
5
- export interface AbstractProvider<T extends Database> {
6
+ export interface AbstractProvider<I extends Identifier, T extends Database> {
6
7
  /**
7
8
  * Get an item.
8
9
  */
9
- getItem<K extends DataKey<T>>(collection: K, id: string): OptionalItem<T[K]> | PromiseLike<OptionalItem<T[K]>>;
10
+ getItem<K extends DataKey<T>>(collection: K, id: I): OptionalItem<I, T[K]> | PromiseLike<OptionalItem<I, T[K]>>;
10
11
  /**
11
12
  * Require an item.
12
13
  */
13
- requireItem<K extends DataKey<T>>(collection: K, id: string): Item<T[K]> | PromiseLike<Item<T[K]>>;
14
+ requireItem<K extends DataKey<T>>(collection: K, id: I): Item<I, T[K]> | PromiseLike<Item<I, T[K]>>;
14
15
  /**
15
16
  * Subscribe to the value of this item with an async iterator.
16
17
  */
17
- getItemSequence<K extends DataKey<T>>(collection: K, id: string): AsyncIterable<OptionalItem<T[K]>>;
18
+ getItemSequence<K extends DataKey<T>>(collection: K, id: I): AsyncIterable<OptionalItem<I, T[K]>>;
18
19
  /**
19
20
  * Create a new item with a random ID.
20
21
  * - Created item is guaranteed to have a unique ID.
@@ -22,98 +23,98 @@ export interface AbstractProvider<T extends Database> {
22
23
  * @param data Complete data to set the item to.
23
24
  * @return String ID for the created item (possibly promised).
24
25
  */
25
- addItem<K extends DataKey<T>>(collection: K, data: T[K]): string | PromiseLike<string>;
26
+ addItem<K extends DataKey<T>>(collection: K, data: T[K]): I | PromiseLike<I>;
26
27
  /**
27
28
  * Set an item.
28
29
  *
29
30
  * @param data Data to set the item to.
30
31
  */
31
- setItem<K extends DataKey<T>>(collection: K, id: string, data: T[K]): void | PromiseLike<void>;
32
+ setItem<K extends DataKey<T>>(collection: K, id: I, data: T[K]): void | PromiseLike<void>;
32
33
  /**
33
34
  * Update an item.
34
35
  * - Should not throw if the item doesn't exist.
35
36
  *
36
37
  * @param updates Set of property updates to apply to the item.
37
38
  */
38
- updateItem<K extends DataKey<T>>(collection: K, id: string, updates: Updates<T[K]>): void | PromiseLike<void>;
39
+ updateItem<K extends DataKey<T>>(collection: K, id: I, updates: Updates<T[K]>): void | PromiseLike<void>;
39
40
  /**
40
41
  * Delete a specified item.
41
42
  * - Should not throw if the item doesn't exist.
42
43
  */
43
- deleteItem<K extends DataKey<T>>(collection: K, id: string): void | PromiseLike<void>;
44
+ deleteItem<K extends DataKey<T>>(collection: K, id: I): void | PromiseLike<void>;
44
45
  /**
45
46
  * Count number of items in a query.
46
47
  *
47
48
  * @return Number of items the query matches.
48
49
  */
49
- countQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): number | PromiseLike<number>;
50
+ countQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<I, T[K]>): number | PromiseLike<number>;
50
51
  /**
51
52
  * Get all matching items.
52
53
  *
53
54
  * @return Set of values in `id: data` format.
54
55
  */
55
- getQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): Items<T[K]> | PromiseLike<Items<T[K]>>;
56
+ getQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<I, T[K]>): Items<I, T[K]> | PromiseLike<Items<I, T[K]>>;
56
57
  /**
57
58
  * Subscribe to all matching items with an async iterator.
58
59
  */
59
- getQuerySequence<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): AsyncIterable<Items<T[K]>>;
60
+ getQuerySequence<K extends DataKey<T>>(collection: K, query?: ItemQuery<I, T[K]>): AsyncIterable<Items<I, T[K]>>;
60
61
  /**
61
62
  * Set the data of all matching items.
62
63
  *
63
64
  * @param data Data to set matching items to.
64
65
  * @return Number of items that were set.
65
66
  */
66
- setQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, data: T[K]): void | PromiseLike<void>;
67
+ setQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>, data: T[K]): void | PromiseLike<void>;
67
68
  /**
68
69
  * Update the data of all matching items.
69
70
  *
70
71
  * @param updates Set of property updates to apply to matching items.
71
72
  * @return Number of items that were updated.
72
73
  */
73
- updateQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, updates: Updates<T[K]>): void | PromiseLike<void>;
74
+ updateQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>, updates: Updates<T[K]>): void | PromiseLike<void>;
74
75
  /**
75
76
  * Delete all matching items.
76
77
  * @return Number of items that were deleted.
77
78
  */
78
- deleteQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): void | PromiseLike<void>;
79
+ deleteQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>): void | PromiseLike<void>;
79
80
  /** Get the first matching item. */
80
- getFirst<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): OptionalItem<T[K]> | PromiseLike<OptionalItem<T[K]>>;
81
+ getFirst<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>): OptionalItem<I, T[K]> | PromiseLike<OptionalItem<I, T[K]>>;
81
82
  /** Require the first matching item. */
82
- requireFirst<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): Item<T[K]> | PromiseLike<Item<T[K]>>;
83
+ requireFirst<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>): Item<I, T[K]> | PromiseLike<Item<I, T[K]>>;
83
84
  }
84
85
  /** Provider with a fully synchronous interface */
85
- export declare abstract class Provider<T extends Database> implements AbstractProvider<T> {
86
- abstract getItem<K extends DataKey<T>>(collection: K, id: string): OptionalItem<T[K]>;
87
- requireItem<K extends DataKey<T>>(collection: K, id: string): Item<T[K]>;
88
- abstract getItemSequence<K extends DataKey<T>>(collection: K, id: string): AsyncIterable<OptionalItem<T[K]>>;
89
- abstract addItem<K extends DataKey<T>>(collection: K, data: T[K]): string;
90
- abstract setItem<K extends DataKey<T>>(collection: K, id: string, data: T[K]): void;
91
- abstract updateItem<K extends DataKey<T>>(collection: K, id: string, updates: Updates<T[K]>): void;
92
- abstract deleteItem<K extends DataKey<T>>(collection: K, id: string): void;
93
- abstract getQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): Items<T[K]>;
94
- countQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): number;
95
- abstract getQuerySequence<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): AsyncIterable<Items<T[K]>>;
96
- abstract setQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, data: T[K]): void;
97
- abstract updateQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, updates: Updates<T[K]>): void;
98
- abstract deleteQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): void;
99
- getFirst<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): OptionalItem<T[K]>;
100
- requireFirst<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): Item<T[K]>;
86
+ export declare abstract class Provider<I extends Identifier, T extends Database> implements AbstractProvider<I, T> {
87
+ abstract getItem<K extends DataKey<T>>(collection: K, id: I): OptionalItem<I, T[K]>;
88
+ requireItem<K extends DataKey<T>>(collection: K, id: I): Item<I, T[K]>;
89
+ abstract getItemSequence<K extends DataKey<T>>(collection: K, id: I): AsyncIterable<OptionalItem<I, T[K]>>;
90
+ abstract addItem<K extends DataKey<T>>(collection: K, data: T[K]): I;
91
+ abstract setItem<K extends DataKey<T>>(collection: K, id: I, data: T[K]): void;
92
+ abstract updateItem<K extends DataKey<T>>(collection: K, id: I, updates: Updates<T[K]>): void;
93
+ abstract deleteItem<K extends DataKey<T>>(collection: K, id: I): void;
94
+ abstract getQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<I, T[K]>): Items<I, T[K]>;
95
+ countQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<I, T[K]>): number;
96
+ abstract getQuerySequence<K extends DataKey<T>>(collection: K, query?: ItemQuery<I, T[K]>): AsyncIterable<Items<I, T[K]>>;
97
+ abstract setQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>, data: T[K]): void;
98
+ abstract updateQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>, updates: Updates<T[K]>): void;
99
+ abstract deleteQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>): void;
100
+ getFirst<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>): OptionalItem<I, T[K]>;
101
+ requireFirst<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>): Item<I, T[K]>;
101
102
  }
102
103
  /** Provider with a fully asynchronous interface */
103
- export declare abstract class AsyncProvider<T extends Database> implements AbstractProvider<T> {
104
- abstract getItem<K extends DataKey<T>>(collection: K, id: string): Promise<OptionalItem<T[K]>>;
105
- requireItem<K extends DataKey<T>>(collection: K, id: string): Promise<Item<T[K]>>;
106
- abstract getItemSequence<K extends DataKey<T>>(collection: K, id: string): AsyncIterable<OptionalItem<T[K]>>;
107
- abstract addItem<K extends DataKey<T>>(collection: K, data: T[K]): Promise<string>;
108
- abstract setItem<K extends DataKey<T>>(collection: K, id: string, data: T[K]): Promise<void>;
109
- abstract updateItem<K extends DataKey<T>>(collection: K, id: string, updates: Updates<T[K]>): Promise<void>;
110
- abstract deleteItem<K extends DataKey<T>>(collection: K, id: string): Promise<void>;
111
- abstract getQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): Promise<Items<T[K]>>;
112
- countQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): Promise<number>;
113
- abstract getQuerySequence<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): AsyncIterable<Items<T[K]>>;
114
- abstract setQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, data: T[K]): Promise<void>;
115
- abstract updateQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, updates: Updates<T[K]>): Promise<void>;
116
- abstract deleteQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): Promise<void>;
117
- getFirst<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): Promise<OptionalItem<T[K]>>;
118
- requireFirst<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): Promise<Item<T[K]>>;
104
+ export declare abstract class AsyncProvider<I extends Identifier, T extends Database> implements AbstractProvider<I, T> {
105
+ abstract getItem<K extends DataKey<T>>(collection: K, id: I): Promise<OptionalItem<I, T[K]>>;
106
+ requireItem<K extends DataKey<T>>(collection: K, id: I): Promise<Item<I, T[K]>>;
107
+ abstract getItemSequence<K extends DataKey<T>>(collection: K, id: I): AsyncIterable<OptionalItem<I, T[K]>>;
108
+ abstract addItem<K extends DataKey<T>>(collection: K, data: T[K]): Promise<I>;
109
+ abstract setItem<K extends DataKey<T>>(collection: K, id: I, data: T[K]): Promise<void>;
110
+ abstract updateItem<K extends DataKey<T>>(collection: K, id: I, updates: Updates<T[K]>): Promise<void>;
111
+ abstract deleteItem<K extends DataKey<T>>(collection: K, id: I): Promise<void>;
112
+ abstract getQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<I, T[K]>): Promise<Items<I, T[K]>>;
113
+ countQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<I, T[K]>): Promise<number>;
114
+ abstract getQuerySequence<K extends DataKey<T>>(collection: K, query?: ItemQuery<I, T[K]>): AsyncIterable<Items<I, T[K]>>;
115
+ abstract setQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>, data: T[K]): Promise<void>;
116
+ abstract updateQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>, updates: Updates<T[K]>): Promise<void>;
117
+ abstract deleteQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>): Promise<void>;
118
+ getFirst<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>): Promise<OptionalItem<I, T[K]>>;
119
+ requireFirst<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>): Promise<Item<I, T[K]>>;
119
120
  }
@@ -1,37 +1,38 @@
1
1
  import { ArrayStore } from "../store/ArrayStore.js";
2
2
  import { BooleanStore } from "../store/BooleanStore.js";
3
3
  import type { DataKey, Database } from "../util/data.js";
4
- import type { Item, ItemQuery } from "../util/item.js";
4
+ import type { Identifier, Item } from "../util/item.js";
5
+ import type { ItemQuery } from "../util/query.js";
5
6
  import type { StopCallback } from "../util/start.js";
6
7
  import type { MemoryProvider } from "./MemoryProvider.js";
7
8
  import type { AbstractProvider } from "./Provider.js";
8
9
  /** Store a set of multiple items. */
9
- export declare class QueryStore<T extends Database, K extends DataKey<T>> extends ArrayStore<Item<T[K]>> {
10
- readonly provider: AbstractProvider<T>;
10
+ export declare class QueryStore<I extends Identifier, T extends Database, K extends DataKey<T>> extends ArrayStore<Item<I, T[K]>> {
11
+ readonly provider: AbstractProvider<I, T>;
11
12
  readonly collection: K;
12
- readonly query: ItemQuery<T[K]>;
13
+ readonly query: ItemQuery<I, T[K]>;
13
14
  readonly busy: BooleanStore;
14
15
  readonly limit: number;
15
16
  /** Can more items be loaded after the current result. */
16
17
  get hasMore(): boolean;
17
18
  private _hasMore;
18
19
  /** Get the first item in this store. */
19
- get first(): Item<T[K]>;
20
+ get first(): Item<I, T[K]>;
20
21
  /** Get the last item in this store. */
21
- get last(): Item<T[K]>;
22
- constructor(collection: K, query: ItemQuery<T[K]>, provider: AbstractProvider<T>, memory?: MemoryProvider<T>);
22
+ get last(): Item<I, T[K]>;
23
+ constructor(collection: K, query: ItemQuery<I, T[K]>, provider: AbstractProvider<I, T>, memory?: MemoryProvider<I, T>);
23
24
  /** Refresh this store from the source provider. */
24
- refresh(provider?: AbstractProvider<T>): void;
25
+ refresh(provider?: AbstractProvider<I, T>): void;
25
26
  private _refresh;
26
27
  /** Refresh this store if data in the cache is older than `maxAge` (in milliseconds). */
27
28
  refreshStale(maxAge: number): void;
28
29
  /** Subscribe this store to a provider. */
29
- connect(provider?: AbstractProvider<T>): StopCallback;
30
+ connect(provider?: AbstractProvider<I, T>): StopCallback;
30
31
  /**
31
32
  * Load more items after the last once.
32
33
  * - Promise that needs to be handled.
33
34
  */
34
35
  loadMore(): void;
35
36
  private _loadMore;
36
- [Symbol.iterator](): Iterator<Item<T[K]>>;
37
+ [Symbol.iterator](): Iterator<Item<I, T[K]>>;
37
38
  }
@@ -1,45 +1,46 @@
1
1
  import type { DataKey, Database } from "../util/data.js";
2
- import type { Item, ItemQuery, Items, OptionalItem } from "../util/item.js";
2
+ import type { Identifier, Item, Items, OptionalItem } from "../util/item.js";
3
+ import type { ItemQuery } from "../util/query.js";
3
4
  import type { Sourceable } from "../util/source.js";
4
5
  import type { Updates } from "../util/update.js";
5
6
  import type { AsyncProvider, Provider } from "./Provider.js";
6
7
  /** A provider that passes through to a synchronous source. */
7
- export declare class ThroughProvider<T extends Database> implements Provider<T>, Sourceable<Provider<T>> {
8
- readonly source: Provider<T>;
9
- constructor(source: Provider<T>);
10
- getItem<K extends DataKey<T>>(collection: K, id: string): OptionalItem<T[K]>;
11
- requireItem<K extends DataKey<T>>(collection: K, id: string): Item<T[K]>;
12
- getItemSequence<K extends DataKey<T>>(collection: K, id: string): AsyncIterable<OptionalItem<T[K]>>;
13
- addItem<K extends DataKey<T>>(collection: K, data: T[K]): string;
14
- setItem<K extends DataKey<T>>(collection: K, id: string, data: T[K]): void;
15
- updateItem<K extends DataKey<T>>(collection: K, id: string, update: Updates<T[K]>): void;
16
- deleteItem<K extends DataKey<T>>(collection: K, id: string): void;
17
- countQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): number;
18
- getQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): Items<T[K]>;
19
- getQuerySequence<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): AsyncIterable<Items<T[K]>>;
20
- setQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, data: T[K]): void;
21
- updateQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, update: Updates<T[K]>): void;
22
- deleteQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): void;
23
- getFirst<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): OptionalItem<T[K]>;
24
- requireFirst<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): Item<T[K]>;
8
+ export declare class ThroughProvider<I extends Identifier, T extends Database> implements Provider<I, T>, Sourceable<Provider<I, T>> {
9
+ readonly source: Provider<I, T>;
10
+ constructor(source: Provider<I, T>);
11
+ getItem<K extends DataKey<T>>(collection: K, id: I): OptionalItem<I, T[K]>;
12
+ requireItem<K extends DataKey<T>>(collection: K, id: I): Item<I, T[K]>;
13
+ getItemSequence<K extends DataKey<T>>(collection: K, id: I): AsyncIterable<OptionalItem<I, T[K]>>;
14
+ addItem<K extends DataKey<T>>(collection: K, data: T[K]): I;
15
+ setItem<K extends DataKey<T>>(collection: K, id: I, data: T[K]): void;
16
+ updateItem<K extends DataKey<T>>(collection: K, id: I, update: Updates<T[K]>): void;
17
+ deleteItem<K extends DataKey<T>>(collection: K, id: I): void;
18
+ countQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<I, T[K]>): number;
19
+ getQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<I, T[K]>): Items<I, T[K]>;
20
+ getQuerySequence<K extends DataKey<T>>(collection: K, query?: ItemQuery<I, T[K]>): AsyncIterable<Items<I, T[K]>>;
21
+ setQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>, data: T[K]): void;
22
+ updateQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>, update: Updates<T[K]>): void;
23
+ deleteQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>): void;
24
+ getFirst<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>): OptionalItem<I, T[K]>;
25
+ requireFirst<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>): Item<I, T[K]>;
25
26
  }
26
27
  /** A provider that passes through to an asynchronous source. */
27
- export declare class AsyncThroughProvider<T extends Database> implements AsyncProvider<T>, Sourceable<AsyncProvider<T>> {
28
- readonly source: AsyncProvider<T>;
29
- constructor(source: AsyncProvider<T>);
30
- getItem<K extends DataKey<T>>(collection: K, id: string): Promise<OptionalItem<T[K]>>;
31
- requireItem<K extends DataKey<T>>(collection: K, id: string): Promise<Item<T[K]>>;
32
- getItemSequence<K extends DataKey<T>>(collection: K, id: string): AsyncIterable<OptionalItem<T[K]>>;
33
- addItem<K extends DataKey<T>>(collection: K, data: T[K]): Promise<string>;
34
- setItem<K extends DataKey<T>>(collection: K, id: string, data: T[K]): Promise<void>;
35
- updateItem<K extends DataKey<T>>(collection: K, id: string, updates: Updates<T[K]>): Promise<void>;
36
- deleteItem<K extends DataKey<T>>(collection: K, id: string): Promise<void>;
37
- countQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): Promise<number>;
38
- getQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): Promise<Items<T[K]>>;
39
- getQuerySequence<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): AsyncIterable<Items<T[K]>>;
40
- setQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, data: T[K]): Promise<void>;
41
- updateQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, updates: Updates<T[K]>): Promise<void>;
42
- deleteQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): Promise<void>;
43
- getFirst<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): Promise<OptionalItem<T[K]>>;
44
- requireFirst<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): Promise<Item<T[K]>>;
28
+ export declare class AsyncThroughProvider<I extends Identifier, T extends Database> implements AsyncProvider<I, T>, Sourceable<AsyncProvider<I, T>> {
29
+ readonly source: AsyncProvider<I, T>;
30
+ constructor(source: AsyncProvider<I, T>);
31
+ getItem<K extends DataKey<T>>(collection: K, id: I): Promise<OptionalItem<I, T[K]>>;
32
+ requireItem<K extends DataKey<T>>(collection: K, id: I): Promise<Item<I, T[K]>>;
33
+ getItemSequence<K extends DataKey<T>>(collection: K, id: I): AsyncIterable<OptionalItem<I, T[K]>>;
34
+ addItem<K extends DataKey<T>>(collection: K, data: T[K]): Promise<I>;
35
+ setItem<K extends DataKey<T>>(collection: K, id: I, data: T[K]): Promise<void>;
36
+ updateItem<K extends DataKey<T>>(collection: K, id: I, updates: Updates<T[K]>): Promise<void>;
37
+ deleteItem<K extends DataKey<T>>(collection: K, id: I): Promise<void>;
38
+ countQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<I, T[K]>): Promise<number>;
39
+ getQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<I, T[K]>): Promise<Items<I, T[K]>>;
40
+ getQuerySequence<K extends DataKey<T>>(collection: K, query?: ItemQuery<I, T[K]>): AsyncIterable<Items<I, T[K]>>;
41
+ setQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>, data: T[K]): Promise<void>;
42
+ updateQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>, updates: Updates<T[K]>): Promise<void>;
43
+ deleteQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>): Promise<void>;
44
+ getFirst<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>): Promise<OptionalItem<I, T[K]>>;
45
+ requireFirst<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>): Promise<Item<I, T[K]>>;
45
46
  }
@@ -1,45 +1,49 @@
1
1
  import type { DataSchema, DataSchemas } from "../schema/DataSchema.js";
2
+ import type { Schema } from "../schema/Schema.js";
2
3
  import type { DataKey, Database } from "../util/data.js";
3
- import type { ItemQuery, Items, OptionalItem } from "../util/item.js";
4
+ import type { Identifier, Items, OptionalItem } from "../util/item.js";
5
+ import type { ItemQuery } from "../util/query.js";
4
6
  import type { Sourceable } from "../util/source.js";
5
7
  import type { Updates } from "../util/update.js";
6
8
  import type { AsyncProvider, Provider } from "./Provider.js";
7
9
  import { AsyncThroughProvider, ThroughProvider } from "./ThroughProvider.js";
8
10
  /** Validate a synchronous source provider (source can have any type because validation guarantees the type). */
9
- export declare class ValidationProvider<T extends Database> extends ThroughProvider<T> implements Provider<T>, Sourceable<Provider<T>> {
11
+ export declare class ValidationProvider<I extends Identifier, T extends Database> extends ThroughProvider<I, T> implements Provider<I, T>, Sourceable<Provider<I, T>> {
12
+ readonly identifier: Schema<I>;
10
13
  readonly schemas: DataSchemas<T>;
11
- constructor(schemas: DataSchemas<T>, source: Provider<T>);
14
+ constructor(id: Schema<I>, schemas: DataSchemas<T>, source: Provider<I, T>);
12
15
  /** Get a named schema. */
13
16
  getSchema<K extends DataKey<T>>(collection: K): DataSchema<T[K]>;
14
- getItem<K extends DataKey<T>>(collection: K, id: string): OptionalItem<T[K]>;
15
- getItemSequence<K extends DataKey<T>>(collection: K, id: string): AsyncIterable<OptionalItem<T[K]>>;
16
- addItem<K extends DataKey<T>>(collection: K, data: T[K]): string;
17
- setItem<K extends DataKey<T>>(collection: K, id: string, data: T[K]): void;
18
- updateItem<K extends DataKey<T>>(collection: K, id: string, updates: Updates<T[K]>): void;
19
- deleteItem<K extends DataKey<T>>(collection: K, id: string): void;
20
- countQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): number;
21
- getQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): Items<T[K]>;
22
- setQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, data: T[K]): void;
23
- updateQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, updates: Updates<T[K]>): void;
24
- deleteQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): void;
25
- getQuerySequence<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): AsyncIterable<Items<T[K]>>;
17
+ getItem<K extends DataKey<T>>(collection: K, id: I): OptionalItem<I, T[K]>;
18
+ getItemSequence<K extends DataKey<T>>(collection: K, id: I): AsyncIterable<OptionalItem<I, T[K]>>;
19
+ addItem<K extends DataKey<T>>(collection: K, data: T[K]): I;
20
+ setItem<K extends DataKey<T>>(collection: K, id: I, data: T[K]): void;
21
+ updateItem<K extends DataKey<T>>(collection: K, id: I, updates: Updates<T[K]>): void;
22
+ deleteItem<K extends DataKey<T>>(collection: K, id: I): void;
23
+ countQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<I, T[K]>): number;
24
+ getQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<I, T[K]>): Items<I, T[K]>;
25
+ setQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>, data: T[K]): void;
26
+ updateQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>, updates: Updates<T[K]>): void;
27
+ deleteQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>): void;
28
+ getQuerySequence<K extends DataKey<T>>(collection: K, query?: ItemQuery<I, T[K]>): AsyncIterable<Items<I, T[K]>>;
26
29
  }
27
30
  /** Validate an asynchronous source provider (source can have any type because validation guarantees the type). */
28
- export declare class AsyncValidationProvider<T extends Database> extends AsyncThroughProvider<T> implements AsyncProvider<T>, Sourceable<AsyncProvider<T>> {
31
+ export declare class AsyncValidationProvider<I extends Identifier, T extends Database> extends AsyncThroughProvider<I, T> implements AsyncProvider<I, T>, Sourceable<AsyncProvider<I, T>> {
32
+ readonly identifier: Schema<I>;
29
33
  readonly schemas: DataSchemas<T>;
30
- constructor(schemas: DataSchemas<T>, source: AsyncProvider<T>);
34
+ constructor(id: Schema<I>, schemas: DataSchemas<T>, source: AsyncProvider<I, T>);
31
35
  /** Get a named data schema for this database. */
32
36
  getSchema<K extends DataKey<T>>(collection: K): DataSchema<T[K]>;
33
- getItem<K extends DataKey<T>>(collection: K, id: string): Promise<OptionalItem<T[K]>>;
34
- getItemSequence<K extends DataKey<T>>(collection: K, id: string): AsyncIterable<OptionalItem<T[K]>>;
35
- addItem<K extends DataKey<T>>(collection: K, data: T[K]): Promise<string>;
36
- setItem<K extends DataKey<T>>(collection: K, id: string, data: T[K]): Promise<void>;
37
- updateItem<K extends DataKey<T>>(collection: K, id: string, updates: Updates<T[K]>): Promise<void>;
38
- deleteItem<K extends DataKey<T>>(collection: K, id: string): Promise<void>;
39
- countQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): Promise<number>;
40
- getQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): Promise<Items<T[K]>>;
41
- getQuerySequence<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): AsyncIterable<Items<T[K]>>;
42
- setQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, data: T[K]): Promise<void>;
43
- updateQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, updates: Updates<T[K]>): Promise<void>;
44
- deleteQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): Promise<void>;
37
+ getItem<K extends DataKey<T>>(collection: K, id: I): Promise<OptionalItem<I, T[K]>>;
38
+ getItemSequence<K extends DataKey<T>>(collection: K, id: I): AsyncIterable<OptionalItem<I, T[K]>>;
39
+ addItem<K extends DataKey<T>>(collection: K, data: T[K]): Promise<I>;
40
+ setItem<K extends DataKey<T>>(collection: K, id: I, data: T[K]): Promise<void>;
41
+ updateItem<K extends DataKey<T>>(collection: K, id: I, updates: Updates<T[K]>): Promise<void>;
42
+ deleteItem<K extends DataKey<T>>(collection: K, id: I): Promise<void>;
43
+ countQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<I, T[K]>): Promise<number>;
44
+ getQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<I, T[K]>): Promise<Items<I, T[K]>>;
45
+ getQuerySequence<K extends DataKey<T>>(collection: K, query?: ItemQuery<I, T[K]>): AsyncIterable<Items<I, T[K]>>;
46
+ setQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>, data: T[K]): Promise<void>;
47
+ updateQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>, updates: Updates<T[K]>): Promise<void>;
48
+ deleteQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<I, T[K]>): Promise<void>;
45
49
  }
@@ -1,14 +1,16 @@
1
1
  import { ValueError } from "../error/ValueError.js";
2
2
  import { Feedback } from "../feedback/Feedback.js";
3
- import { KEY } from "../schema/KeySchema.js";
3
+ import { getNamedMessage } from "../index.js";
4
4
  import { updateData } from "../util/update.js";
5
5
  import { validateData } from "../util/validate.js";
6
6
  import { AsyncThroughProvider, ThroughProvider } from "./ThroughProvider.js";
7
7
  /** Validate a synchronous source provider (source can have any type because validation guarantees the type). */
8
8
  export class ValidationProvider extends ThroughProvider {
9
+ identifier;
9
10
  schemas;
10
- constructor(schemas, source) {
11
+ constructor(id, schemas, source) {
11
12
  super(source);
13
+ this.identifier = id;
12
14
  this.schemas = schemas;
13
15
  }
14
16
  /** Get a named schema. */
@@ -16,12 +18,12 @@ export class ValidationProvider extends ThroughProvider {
16
18
  return this.schemas[collection];
17
19
  }
18
20
  getItem(collection, id) {
19
- return _validateItem(collection, super.getItem(collection, id), this.getSchema(collection), this.getItem);
21
+ return _validateItem(collection, super.getItem(collection, id), this.identifier, this.getSchema(collection), this.getItem);
20
22
  }
21
23
  async *getItemSequence(collection, id) {
22
24
  const schema = this.getSchema(collection);
23
25
  for await (const item of super.getItemSequence(collection, id))
24
- yield _validateItem(collection, item, schema, this.getItemSequence);
26
+ yield _validateItem(collection, item, this.identifier, schema, this.getItemSequence);
25
27
  }
26
28
  addItem(collection, data) {
27
29
  return super.addItem(collection, validateData(data, this.getSchema(collection).props));
@@ -40,7 +42,7 @@ export class ValidationProvider extends ThroughProvider {
40
42
  return super.countQuery(collection, query);
41
43
  }
42
44
  getQuery(collection, query) {
43
- return _validateItems(collection, super.getQuery(collection, query), this.getSchema(collection), this.getQuery);
45
+ return _validateItems(collection, super.getQuery(collection, query), this.identifier, this.getSchema(collection), this.getQuery);
44
46
  }
45
47
  setQuery(collection, query, data) {
46
48
  super.setQuery(collection, query, this.getSchema(collection).validate(data));
@@ -55,14 +57,16 @@ export class ValidationProvider extends ThroughProvider {
55
57
  async *getQuerySequence(collection, query) {
56
58
  const schema = this.getSchema(collection);
57
59
  for await (const items of super.getQuerySequence(collection, query))
58
- yield _validateItems(collection, items, schema, this.getQuerySequence);
60
+ yield _validateItems(collection, items, this.identifier, schema, this.getQuerySequence);
59
61
  }
60
62
  }
61
63
  /** Validate an asynchronous source provider (source can have any type because validation guarantees the type). */
62
64
  export class AsyncValidationProvider extends AsyncThroughProvider {
65
+ identifier;
63
66
  schemas;
64
- constructor(schemas, source) {
67
+ constructor(id, schemas, source) {
65
68
  super(source);
69
+ this.identifier = id;
66
70
  this.schemas = schemas;
67
71
  }
68
72
  /** Get a named data schema for this database. */
@@ -70,12 +74,12 @@ export class AsyncValidationProvider extends AsyncThroughProvider {
70
74
  return this.schemas[collection];
71
75
  }
72
76
  async getItem(collection, id) {
73
- return _validateItem(collection, await super.getItem(collection, id), this.getSchema(collection), this.getItem);
77
+ return _validateItem(collection, await super.getItem(collection, id), this.identifier, this.getSchema(collection), this.getItem);
74
78
  }
75
79
  async *getItemSequence(collection, id) {
76
80
  const schema = this.getSchema(collection);
77
81
  for await (const item of super.getItemSequence(collection, id))
78
- yield _validateItem(collection, item, schema, this.getItemSequence);
82
+ yield _validateItem(collection, item, this.identifier, schema, this.getItemSequence);
79
83
  }
80
84
  addItem(collection, data) {
81
85
  return super.addItem(collection, validateData(data, this.getSchema(collection).props));
@@ -94,12 +98,12 @@ export class AsyncValidationProvider extends AsyncThroughProvider {
94
98
  return super.countQuery(collection, query);
95
99
  }
96
100
  async getQuery(collection, query) {
97
- return _validateItems(collection, await super.getQuery(collection, query), this.getSchema(collection), this.getQuery);
101
+ return _validateItems(collection, await super.getQuery(collection, query), this.identifier, this.getSchema(collection), this.getQuery);
98
102
  }
99
103
  async *getQuerySequence(collection, query) {
100
104
  const schema = this.getSchema(collection);
101
105
  for await (const items of super.getQuerySequence(collection, query))
102
- yield _validateItems(collection, items, schema, this.getQuerySequence);
106
+ yield _validateItems(collection, items, this.identifier, schema, this.getQuerySequence);
103
107
  }
104
108
  setQuery(collection, query, data) {
105
109
  return super.setQuery(collection, query, validateData(data, this.getSchema(collection).props));
@@ -112,28 +116,27 @@ export class AsyncValidationProvider extends AsyncThroughProvider {
112
116
  return super.deleteQuery(collection, query);
113
117
  }
114
118
  }
115
- function _validateItem(collection, item, schema, caller) {
119
+ function _validateItem(collection, item, identifier, schema, caller) {
116
120
  if (!item)
117
121
  return undefined;
118
122
  try {
119
- return validateData(item, { id: KEY, ...schema.props });
123
+ return validateData(item, { id: identifier, ...schema.props });
120
124
  }
121
125
  catch (thrown) {
122
126
  if (!(thrown instanceof Feedback))
123
127
  throw thrown;
124
- throw new ValueError(`Invalid data for "${collection}"`, { collection, item, cause: thrown, caller });
128
+ throw new ValueError(`Invalid data for "${collection}"\n${thrown.message}`, { item, caller });
125
129
  }
126
130
  }
127
131
  /**
128
132
  * Validate a set of entities for this query reference.
129
133
  * @throws `ValueError` if one or more items did not validate (conflict because the program is not in an expected state).
130
134
  */
131
- function _validateItems(collection, items, schema, caller) {
132
- return Array.from(_yieldValidItems(collection, items, { id: KEY, ...schema.props }, caller));
135
+ function _validateItems(collection, items, identifier, schema, caller) {
136
+ return Array.from(_yieldValidItems(collection, items, { id: identifier, ...schema.props }, caller));
133
137
  }
134
138
  function* _yieldValidItems(collection, items, validators, caller) {
135
- let invalid = false;
136
- const feedbacks = {};
139
+ const messages = [];
137
140
  for (const item of items) {
138
141
  try {
139
142
  yield validateData(item, validators);
@@ -141,10 +144,9 @@ function* _yieldValidItems(collection, items, validators, caller) {
141
144
  catch (thrown) {
142
145
  if (!(thrown instanceof Feedback))
143
146
  throw thrown;
144
- invalid = true;
145
- feedbacks[item.id] = thrown;
147
+ messages.push(getNamedMessage(item.id, thrown.message));
146
148
  }
147
149
  }
148
- if (invalid)
149
- throw new ValueError(`Invalid data for "${collection}"`, { collection, items, cause: feedbacks, caller });
150
+ if (messages.length)
151
+ throw new ValueError(`Invalid data for "${collection}"\n${messages.join("\n")}`, { items, caller });
150
152
  }
@@ -1,7 +1,8 @@
1
1
  import type { Firestore } from "firebase/firestore";
2
2
  import { AsyncProvider } from "../../db/Provider.js";
3
3
  import type { Data, DataKey, Database } from "../../util/data.js";
4
- import type { ItemQuery, Items, OptionalItem } from "../../util/item.js";
4
+ import type { Items, OptionalItem } from "../../util/item.js";
5
+ import type { ItemQuery } from "../../util/query.js";
5
6
  import type { Updates } from "../../util/update.js";
6
7
  /**
7
8
  * Firestore client database provider.
@@ -9,19 +10,19 @@ import type { Updates } from "../../util/update.js";
9
10
  * - Supports offline mode.
10
11
  * - Supports realtime subscriptions.
11
12
  */
12
- export declare class FirestoreClientProvider<T extends Database> extends AsyncProvider<T> {
13
+ export declare class FirestoreClientProvider<T extends Database> extends AsyncProvider<string, T> {
13
14
  private readonly _firestore;
14
15
  constructor(firestore: Firestore);
15
- getItem<K extends DataKey<T>>(c: K, id: string): Promise<OptionalItem<T[K]>>;
16
- getItemSequence<K extends DataKey<T>>(c: K, id: string): AsyncIterable<OptionalItem<T[K]>>;
16
+ getItem<K extends DataKey<T>>(c: K, id: string): Promise<OptionalItem<string, T[K]>>;
17
+ getItemSequence<K extends DataKey<T>>(c: K, id: string): AsyncIterable<OptionalItem<string, T[K]>>;
17
18
  addItem<K extends DataKey<T>>(c: K, data: Data): Promise<string>;
18
19
  setItem<K extends DataKey<T>>(c: K, id: string, data: Data): Promise<void>;
19
20
  updateItem<K extends DataKey<T>>(c: K, id: string, updates: Updates<T[K]>): Promise<void>;
20
21
  deleteItem<K extends DataKey<T>>(c: K, id: string): Promise<void>;
21
- countQuery<K extends DataKey<T>>(c: K, q?: ItemQuery<T[K]>): Promise<number>;
22
- getQuery<K extends DataKey<T>>(c: K, q?: ItemQuery<T[K]>): Promise<Items<T[K]>>;
23
- getQuerySequence<K extends DataKey<T>>(c: K, q?: ItemQuery<T[K]>): AsyncIterable<Items<T[K]>>;
24
- setQuery<K extends DataKey<T>>(c: K, q: ItemQuery<T[K]>, data: Data): Promise<void>;
25
- updateQuery<K extends DataKey<T>>(c: K, q: ItemQuery<T[K]>, updates: Updates<T[K]>): Promise<void>;
26
- deleteQuery<K extends DataKey<T>>(c: K, q: ItemQuery<T[K]>): Promise<void>;
22
+ countQuery<K extends DataKey<T>>(c: K, q?: ItemQuery<string, T[K]>): Promise<number>;
23
+ getQuery<K extends DataKey<T>>(c: K, q?: ItemQuery<string, T[K]>): Promise<Items<string, T[K]>>;
24
+ getQuerySequence<K extends DataKey<T>>(c: K, q?: ItemQuery<string, T[K]>): AsyncIterable<Items<string, T[K]>>;
25
+ setQuery<K extends DataKey<T>>(c: K, q: ItemQuery<string, T[K]>, data: Data): Promise<void>;
26
+ updateQuery<K extends DataKey<T>>(c: K, q: ItemQuery<string, T[K]>, updates: Updates<T[K]>): Promise<void>;
27
+ deleteQuery<K extends DataKey<T>>(c: K, q: ItemQuery<string, T[K]>): Promise<void>;
27
28
  }
@@ -1,7 +1,8 @@
1
1
  import type { Firestore } from "firebase/firestore/lite";
2
2
  import { AsyncProvider } from "../../db/Provider.js";
3
3
  import type { Data, DataKey, Database } from "../../util/data.js";
4
- import type { ItemQuery, Items, OptionalItem } from "../../util/item.js";
4
+ import type { Items, OptionalItem } from "../../util/item.js";
5
+ import type { ItemQuery } from "../../util/query.js";
5
6
  import type { Updates } from "../../util/update.js";
6
7
  /**
7
8
  * Firestore Lite client database provider.
@@ -9,19 +10,19 @@ import type { Updates } from "../../util/update.js";
9
10
  * - Does not support offline mode.
10
11
  * - Does not support realtime subscriptions.
11
12
  */
12
- export declare class FirestoreLiteProvider<T extends Database> extends AsyncProvider<T> {
13
+ export declare class FirestoreLiteProvider<T extends Database> extends AsyncProvider<string, T> {
13
14
  private readonly _firestore;
14
15
  constructor(firestore: Firestore);
15
- getItem<K extends DataKey<T>>(c: K, id: string): Promise<OptionalItem<T[K]>>;
16
- getItemSequence<K extends DataKey<T>>(): AsyncIterableIterator<OptionalItem<T[K]>>;
16
+ getItem<K extends DataKey<T>>(c: K, id: string): Promise<OptionalItem<string, T[K]>>;
17
+ getItemSequence<K extends DataKey<T>>(): AsyncIterableIterator<OptionalItem<string, T[K]>>;
17
18
  addItem<K extends DataKey<T>>(c: K, data: Data): Promise<string>;
18
19
  setItem<K extends DataKey<T>>(c: K, id: string, data: Data): Promise<void>;
19
20
  updateItem<K extends DataKey<T>>(c: K, id: string, updates: Updates): Promise<void>;
20
21
  deleteItem<K extends DataKey<T>>(c: K, id: string): Promise<void>;
21
- countQuery<K extends DataKey<T>>(c: K, q?: ItemQuery<T[K]>): Promise<number>;
22
- getQuery<K extends DataKey<T>>(c: K, q?: ItemQuery<T[K]>): Promise<Items<T[K]>>;
23
- getQuerySequence<K extends DataKey<T>>(): AsyncIterableIterator<Items<T[K]>>;
24
- setQuery<K extends DataKey<T>>(c: K, q: ItemQuery<T[K]>, data: Data): Promise<void>;
25
- updateQuery<K extends DataKey<T>>(c: K, q: ItemQuery<T[K]>, updates: Updates): Promise<void>;
26
- deleteQuery<K extends DataKey<T>>(c: K, q: ItemQuery<T[K]>): Promise<void>;
22
+ countQuery<K extends DataKey<T>>(c: K, q?: ItemQuery<string, T[K]>): Promise<number>;
23
+ getQuery<K extends DataKey<T>>(c: K, q?: ItemQuery<string, T[K]>): Promise<Items<string, T[K]>>;
24
+ getQuerySequence<K extends DataKey<T>>(): AsyncIterableIterator<Items<string, T[K]>>;
25
+ setQuery<K extends DataKey<T>>(c: K, q: ItemQuery<string, T[K]>, data: Data): Promise<void>;
26
+ updateQuery<K extends DataKey<T>>(c: K, q: ItemQuery<string, T[K]>, updates: Updates): Promise<void>;
27
+ deleteQuery<K extends DataKey<T>>(c: K, q: ItemQuery<string, T[K]>): Promise<void>;
27
28
  }