shelving 1.26.1 → 1.27.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/Database.d.ts CHANGED
@@ -81,19 +81,19 @@ export declare class DataQuery<T extends Data = Data> extends Query<T> implement
81
81
  * @param data Complete data to set the document to.
82
82
  * @return Nothing (possibly promised).
83
83
  */
84
- set(data: T): void | PromiseLike<void>;
84
+ set(data: T): number | PromiseLike<number>;
85
85
  /**
86
86
  * Update all matching documents with the same partial value.
87
87
  *
88
88
  * @param updates `Update` instance or set of updates to apply to every matching document.
89
89
  * @return Nothing (possibly promised).
90
90
  */
91
- update(updates: Update<T> | PropUpdates<T>): void | PromiseLike<void>;
91
+ update(updates: Update<T> | PropUpdates<T>): number | PromiseLike<number>;
92
92
  /**
93
93
  * Delete all matching documents.
94
94
  * @return Nothing (possibly promised).
95
95
  */
96
- delete(): void | PromiseLike<void>;
96
+ delete(): number | PromiseLike<number>;
97
97
  /** Iterate over the resuls (will throw `Promise` if the results are asynchronous). */
98
98
  [Symbol.iterator](): Iterator<Entry<T>, void>;
99
99
  /** Validate a set of results for this query reference. */
@@ -17,7 +17,7 @@ export declare class FirestoreClientProvider extends Provider implements Asynchr
17
17
  delete<T extends Data>(ref: DataDocument<T>): Promise<void>;
18
18
  getQuery<T extends Data>(ref: DataQuery<T>): Promise<Results<T>>;
19
19
  subscribeQuery<T extends Data>(ref: DataQuery<T>, observer: Observer<Results<T>>): Unsubscriber;
20
- setQuery<T extends Data>(ref: DataQuery<T>, data: T): Promise<void>;
21
- updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): Promise<void>;
22
- deleteQuery<T extends Data>(ref: DataQuery<T>): Promise<void>;
20
+ setQuery<T extends Data>(ref: DataQuery<T>, data: T): Promise<number>;
21
+ updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): Promise<number>;
22
+ deleteQuery<T extends Data>(ref: DataQuery<T>): Promise<number>;
23
23
  }
@@ -109,22 +109,18 @@ export class FirestoreClientProvider extends Provider {
109
109
  }
110
110
  async setQuery(ref, data) {
111
111
  const snapshot = await getDocs(getQuery(this.firestore, ref));
112
- if (data instanceof Update) {
113
- const updates = getFieldValues(data);
114
- await Promise.all(snapshot.docs.map(s => updateDoc(s.ref, updates)));
115
- }
116
- else if (data)
117
- await Promise.all(snapshot.docs.map(s => setDoc(s.ref, data)));
118
- else
119
- await Promise.all(snapshot.docs.map(s => deleteDoc(s.ref)));
112
+ await Promise.all(snapshot.docs.map(s => setDoc(s.ref, data)));
113
+ return snapshot.size;
120
114
  }
121
115
  async updateQuery(ref, updates) {
122
116
  const snapshot = await getDocs(getQuery(this.firestore, ref));
123
117
  const fieldValues = getFieldValues(updates);
124
118
  await Promise.all(snapshot.docs.map(s => updateDoc(s.ref, fieldValues)));
119
+ return snapshot.size;
125
120
  }
126
121
  async deleteQuery(ref) {
127
122
  const snapshot = await getDocs(getQuery(this.firestore, ref));
128
123
  await Promise.all(snapshot.docs.map(s => deleteDoc(s.ref)));
124
+ return snapshot.size;
129
125
  }
130
126
  }
@@ -17,7 +17,7 @@ export declare class FirestoreClientProvider extends Provider implements Asynchr
17
17
  delete<T extends Data>(ref: DataDocument<T>): Promise<void>;
18
18
  getQuery<T extends Data>(ref: DataQuery<T>): Promise<Results<T>>;
19
19
  subscribeQuery(): Unsubscriber;
20
- setQuery<T extends Data>(ref: DataQuery<T>, data: T | Update<T> | undefined): Promise<void>;
21
- updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): Promise<void>;
22
- deleteQuery<T extends Data>(ref: DataQuery<T>): Promise<void>;
20
+ setQuery<T extends Data>(ref: DataQuery<T>, data: T | Update<T> | undefined): Promise<number>;
21
+ updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): Promise<number>;
22
+ deleteQuery<T extends Data>(ref: DataQuery<T>): Promise<number>;
23
23
  }
@@ -110,14 +110,17 @@ export class FirestoreClientProvider extends Provider {
110
110
  async setQuery(ref, data) {
111
111
  const snapshot = await getDocs(getQuery(this.firestore, ref));
112
112
  await Promise.all(snapshot.docs.map(s => setDoc(s.ref, data)));
113
+ return snapshot.size;
113
114
  }
114
115
  async updateQuery(ref, updates) {
115
116
  const snapshot = await getDocs(getQuery(this.firestore, ref));
116
117
  const fieldValues = getFieldValues(updates);
117
118
  await Promise.all(snapshot.docs.map(s => updateDoc(s.ref, fieldValues)));
119
+ return snapshot.size;
118
120
  }
119
121
  async deleteQuery(ref) {
120
122
  const snapshot = await getDocs(getQuery(this.firestore, ref));
121
123
  await Promise.all(snapshot.docs.map(s => deleteDoc(s.ref)));
124
+ return snapshot.size;
122
125
  }
123
126
  }
@@ -15,7 +15,7 @@ export declare class FirestoreServerProvider extends Provider implements Asynchr
15
15
  delete<T extends Data>(ref: DataDocument<T>): Promise<void>;
16
16
  getQuery<T extends Data>(ref: DataQuery<T>): Promise<Iterable<Entry<T>>>;
17
17
  subscribeQuery<T extends Data>(ref: DataQuery<T>, observer: Observer<Results<T>>): Unsubscriber;
18
- setQuery<T extends Data>(ref: DataQuery<T>, data: T | Update<T> | undefined): Promise<void>;
19
- updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): Promise<void>;
20
- deleteQuery<T extends Data>(ref: DataQuery<T>): Promise<void>;
18
+ setQuery<T extends Data>(ref: DataQuery<T>, data: T | Update<T> | undefined): Promise<number>;
19
+ updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): Promise<number>;
20
+ deleteQuery<T extends Data>(ref: DataQuery<T>): Promise<number>;
21
21
  }
@@ -104,28 +104,31 @@ export class FirestoreServerProvider extends Provider {
104
104
  return getQuery(this.firestore, ref).onSnapshot(snapshot => dispatchNext(observer, getResults(snapshot)), thrown => dispatchError(observer, thrown));
105
105
  }
106
106
  async setQuery(ref, data) {
107
- await bulkWrite(this.firestore, ref, (w, s) => void w.set(s.ref, data));
107
+ return await bulkWrite(this.firestore, ref, (w, s) => void w.set(s.ref, data));
108
108
  }
109
109
  async updateQuery(ref, updates) {
110
110
  const fieldValues = getFieldValues(updates);
111
- await bulkWrite(this.firestore, ref, (w, s) => void w.update(s.ref, fieldValues));
111
+ return await bulkWrite(this.firestore, ref, (w, s) => void w.update(s.ref, fieldValues));
112
112
  }
113
113
  async deleteQuery(ref) {
114
- await bulkWrite(this.firestore, ref, (w, s) => void w.delete(s.ref));
114
+ return await bulkWrite(this.firestore, ref, (w, s) => void w.delete(s.ref));
115
115
  }
116
116
  }
117
117
  /** Perform a bulk update on a set of documents using a `BulkWriter` */
118
118
  async function bulkWrite(firestore, ref, callback) {
119
+ let count = 0;
119
120
  const writer = firestore.bulkWriter();
120
121
  const query = getQuery(firestore, ref).limit(BATCH_SIZE).select(); // `select()` turs the query into a field mask query (with no field masks) which saves data transfer and memory.
121
122
  let current = query;
122
123
  while (current) {
123
- const snapshot = await current.get();
124
- for (const s of snapshot.docs)
124
+ const { docs, size } = await current.get();
125
+ count += size;
126
+ for (const s of docs)
125
127
  callback(writer, s);
126
- current = snapshot.size >= BATCH_SIZE && query.startAfter(snapshot.docs.pop()).select();
128
+ current = size >= BATCH_SIZE && query.startAfter(docs.pop()).select();
127
129
  void writer.flush();
128
130
  }
129
131
  await writer.close();
132
+ return count;
130
133
  }
131
134
  const BATCH_SIZE = 1000;
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "state-management",
12
12
  "query-builder"
13
13
  ],
14
- "version": "1.26.1",
14
+ "version": "1.27.0",
15
15
  "repository": "https://github.com/dhoulb/shelving",
16
16
  "author": "Dave Houlbrooke <dave@shax.com>",
17
17
  "license": "0BSD",
@@ -27,9 +27,9 @@ export declare class CacheProvider extends ThroughProvider implements Asynchrono
27
27
  private _cacheResults;
28
28
  getQuery<T extends Data>(ref: DataQuery<T>): Promise<Results<T>>;
29
29
  subscribeQuery<T extends Data>(ref: DataQuery<T>, observer: Observer<Results<T>>): Unsubscriber;
30
- setQuery<T extends Data>(ref: DataQuery<T>, data: T): Promise<void>;
31
- updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): Promise<void>;
32
- deleteQuery<T extends Data>(ref: DataQuery<T>): Promise<void>;
30
+ setQuery<T extends Data>(ref: DataQuery<T>, data: T): Promise<number>;
31
+ updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): Promise<number>;
32
+ deleteQuery<T extends Data>(ref: DataQuery<T>): Promise<number>;
33
33
  /** Reset this provider and clear all data. */
34
34
  reset(): void;
35
35
  }
@@ -79,16 +79,19 @@ export class CacheProvider extends ThroughProvider {
79
79
  return super.subscribeQuery(ref, new TransformObserver(results => this._cacheResults(ref, results), observer));
80
80
  }
81
81
  async setQuery(ref, data) {
82
- await super.setQuery(ref, data);
82
+ const count = await super.setQuery(ref, data);
83
83
  this.cache.setQuery(ref, data);
84
+ return count;
84
85
  }
85
86
  async updateQuery(ref, updates) {
86
- await super.updateQuery(ref, updates);
87
+ const count = await super.updateQuery(ref, updates);
87
88
  this.cache.updateQuery(ref, updates);
89
+ return count;
88
90
  }
89
91
  async deleteQuery(ref) {
90
- await super.deleteQuery(ref);
92
+ const count = await super.deleteQuery(ref);
91
93
  this.cache.deleteQuery(ref);
94
+ return count;
92
95
  }
93
96
  /** Reset this provider and clear all data. */
94
97
  reset() {
@@ -19,9 +19,9 @@ export declare class MemoryProvider extends Provider implements SynchronousProvi
19
19
  delete<T extends Data>(ref: DataDocument<T>): void;
20
20
  getQuery<T extends Data>(ref: DataQuery<T>): Results<T>;
21
21
  subscribeQuery<T extends Data>(ref: DataQuery<T>, observer: Observer<Results<T>>): Unsubscriber;
22
- setQuery<T extends Data>(ref: DataQuery<T>, data: T): void;
23
- updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): void;
24
- deleteQuery<T extends Data>(ref: DataQuery<T>): void;
22
+ setQuery<T extends Data>(ref: DataQuery<T>, data: T): number;
23
+ updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): number;
24
+ deleteQuery<T extends Data>(ref: DataQuery<T>): number;
25
25
  /** Reset this provider and clear all data. */
26
26
  reset(): void;
27
27
  }
@@ -86,22 +86,34 @@ export class MemoryProvider extends Provider {
86
86
  const table = this._table(ref);
87
87
  // If there's a limit set: run the full query.
88
88
  // If there's no limit set: only need to run the filtering (more efficient because sort order doesn't matter).
89
- for (const [id] of ref.limit ? ref.transform(table.data) : ref.filters.transform(table.data))
89
+ let count = 0;
90
+ for (const [id] of ref.limit ? ref.transform(table.data) : ref.filters.transform(table.data)) {
90
91
  table.write(id, data);
92
+ count++;
93
+ }
94
+ return count;
91
95
  }
92
96
  updateQuery(ref, updates) {
93
97
  const table = this._table(ref);
94
98
  // If there's a limit set: run the full query.
95
99
  // If there's no limit set: only need to run the filtering (more efficient because sort order doesn't matter).
96
- for (const [id, existing] of ref.limit ? ref.transform(table.data) : ref.filters.transform(table.data))
100
+ let count = 0;
101
+ for (const [id, existing] of ref.limit ? ref.transform(table.data) : ref.filters.transform(table.data)) {
97
102
  table.write(id, updates.transform(existing));
103
+ count++;
104
+ }
105
+ return count;
98
106
  }
99
107
  deleteQuery(ref) {
100
108
  const table = this._table(ref);
101
109
  // If there's a limit set: run the full query.
102
110
  // If there's no limit set: only need to run the filtering (more efficient because sort order doesn't matter).
103
- for (const [id] of ref.limit ? ref.transform(table.data) : ref.filters.transform(table.data))
111
+ let count = 0;
112
+ for (const [id] of ref.limit ? ref.transform(table.data) : ref.filters.transform(table.data)) {
104
113
  table.write(id, undefined);
114
+ count++;
115
+ }
116
+ return count;
105
117
  }
106
118
  /** Reset this provider and clear all data. */
107
119
  reset() {
@@ -77,20 +77,23 @@ export declare abstract class Provider {
77
77
  *
78
78
  * @param ref Documents reference specifying which collection to set.
79
79
  * @param value Value to set the document to.
80
+ * @return Number of documents that were set.
80
81
  */
81
- abstract setQuery<T extends Data>(ref: DataQuery<T>, data: T): void | PromiseLike<void>;
82
+ abstract setQuery<T extends Data>(ref: DataQuery<T>, data: T): number | PromiseLike<number>;
82
83
  /**
83
84
  * Update the data of all matching documents.
84
85
  *
85
86
  * @param ref Documents reference specifying which collection to set.
86
87
  * @param updates Update instance to set the document to.
88
+ * @return Number of documents that were updated.
87
89
  */
88
- abstract updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): void | PromiseLike<void>;
90
+ abstract updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): number | PromiseLike<number>;
89
91
  /**
90
92
  * Delete all matching documents.
91
93
  * @param ref Document reference specifying which document to delete.
94
+ * @return Number of documents that were deleted.
92
95
  */
93
- abstract deleteQuery<T extends Data>(ref: DataQuery<T>): void | PromiseLike<void>;
96
+ abstract deleteQuery<T extends Data>(ref: DataQuery<T>): number | PromiseLike<number>;
94
97
  }
95
98
  /** Provider with a fully synchronous interface */
96
99
  export interface SynchronousProvider extends Provider {
@@ -100,9 +103,9 @@ export interface SynchronousProvider extends Provider {
100
103
  update<T extends Data>(ref: DataDocument<T>, value: Update<T>): void;
101
104
  delete<T extends Data>(ref: DataDocument<T>): void;
102
105
  getQuery<T extends Data>(ref: DataQuery<T>): Results<T>;
103
- setQuery<T extends Data>(ref: DataQuery<T>, value: T): void;
104
- updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): void;
105
- deleteQuery<T extends Data>(ref: DataQuery<T>): void;
106
+ setQuery<T extends Data>(ref: DataQuery<T>, value: T): number;
107
+ updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): number;
108
+ deleteQuery<T extends Data>(ref: DataQuery<T>): number;
106
109
  }
107
110
  /** Provider with a fully asynchronous interface */
108
111
  export interface AsynchronousProvider extends Provider {
@@ -112,7 +115,7 @@ export interface AsynchronousProvider extends Provider {
112
115
  update<T extends Data>(ref: DataDocument<T>, updates: Update<T>): PromiseLike<void>;
113
116
  delete<T extends Data>(ref: DataDocument<T>): PromiseLike<void>;
114
117
  getQuery<T extends Data>(ref: DataQuery<T>): PromiseLike<Results<T>>;
115
- setQuery<T extends Data>(ref: DataQuery<T>, value: T): PromiseLike<void>;
116
- updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): PromiseLike<void>;
117
- deleteQuery<T extends Data>(ref: DataQuery<T>): PromiseLike<void>;
118
+ setQuery<T extends Data>(ref: DataQuery<T>, value: T): PromiseLike<number>;
119
+ updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): PromiseLike<number>;
120
+ deleteQuery<T extends Data>(ref: DataQuery<T>): PromiseLike<number>;
118
121
  }
@@ -16,9 +16,9 @@ export declare class ThroughProvider extends Provider {
16
16
  delete<T extends Data>(ref: DataDocument<T>): void | PromiseLike<void>;
17
17
  getQuery<T extends Data>(ref: DataQuery<T>): Results<T> | PromiseLike<Results<T>>;
18
18
  subscribeQuery<T extends Data>(ref: DataQuery<T>, observer: Observer<Results<T>>): Unsubscriber;
19
- setQuery<T extends Data>(ref: DataQuery<T>, data: T): void | PromiseLike<void>;
20
- updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): void | PromiseLike<void>;
21
- deleteQuery<T extends Data>(ref: DataQuery<T>): void | PromiseLike<void>;
19
+ setQuery<T extends Data>(ref: DataQuery<T>, data: T): number | PromiseLike<number>;
20
+ updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): number | PromiseLike<number>;
21
+ deleteQuery<T extends Data>(ref: DataQuery<T>): number | PromiseLike<number>;
22
22
  }
23
23
  /** Find a specific source provider in a database's provider stack. */
24
24
  export declare function findSourceProvider<P extends Provider>(provider: Provider, type: Class<P>): P;
@@ -11,6 +11,6 @@ export declare class ValidationProvider extends ThroughProvider {
11
11
  update<T extends Data>(ref: DataDocument<T>, updates: Update<T>): void | PromiseLike<void>;
12
12
  getQuery<T extends Data>(ref: DataQuery<T>): Results<T> | PromiseLike<Results<T>>;
13
13
  subscribeQuery<T extends Data>(ref: DataQuery<T>, observer: Observer<Results<T>>): Unsubscriber;
14
- setQuery<T extends Data>(ref: DataQuery<T>, value: T): void | PromiseLike<void>;
15
- updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): void | PromiseLike<void>;
14
+ setQuery<T extends Data>(ref: DataQuery<T>, value: T): number | PromiseLike<number>;
15
+ updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): number | PromiseLike<number>;
16
16
  }