shelving 1.52.0 → 1.55.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 (46) hide show
  1. package/db/Database.d.ts +3 -3
  2. package/db/Database.js +3 -3
  3. package/db/errors.d.ts +0 -24
  4. package/db/errors.js +0 -36
  5. package/firestore/client/FirestoreClientProvider.d.ts +3 -3
  6. package/firestore/client/FirestoreClientProvider.js +9 -13
  7. package/firestore/lite/FirestoreLiteProvider.d.ts +3 -3
  8. package/firestore/lite/FirestoreLiteProvider.js +9 -13
  9. package/firestore/server/FirestoreServerProvider.d.ts +3 -3
  10. package/firestore/server/FirestoreServerProvider.js +6 -10
  11. package/package.json +14 -14
  12. package/provider/CacheProvider.d.ts +3 -3
  13. package/provider/CacheProvider.js +6 -6
  14. package/provider/ErrorProvider.d.ts +30 -0
  15. package/provider/ErrorProvider.js +174 -0
  16. package/provider/MemoryProvider.d.ts +3 -3
  17. package/provider/MemoryProvider.js +2 -2
  18. package/provider/Provider.d.ts +11 -11
  19. package/provider/ThroughProvider.d.ts +3 -3
  20. package/provider/ThroughProvider.js +4 -4
  21. package/provider/ValidationProvider.d.ts +3 -3
  22. package/provider/ValidationProvider.js +4 -4
  23. package/provider/index.d.ts +1 -0
  24. package/provider/index.js +1 -0
  25. package/query/Query.js +1 -1
  26. package/react/index.d.ts +2 -1
  27. package/react/index.js +2 -1
  28. package/react/useDocument.js +6 -6
  29. package/react/useInstance.d.ts +10 -0
  30. package/react/useInstance.js +22 -0
  31. package/react/useLazy.d.ts +14 -0
  32. package/react/{usePureMemo.js → useLazy.js} +1 -1
  33. package/react/usePagination.js +3 -3
  34. package/react/usePureEffect.d.ts +1 -5
  35. package/react/usePureEffect.js +3 -7
  36. package/react/usePureState.d.ts +2 -9
  37. package/react/usePureState.js +1 -1
  38. package/react/useQuery.js +6 -6
  39. package/update/util.d.ts +6 -3
  40. package/update/util.js +0 -1
  41. package/util/lazy.d.ts +1 -4
  42. package/util/lazy.js +1 -2
  43. package/util/template.d.ts +3 -5
  44. package/util/template.js +15 -16
  45. package/util/transform.d.ts +2 -2
  46. package/react/usePureMemo.d.ts +0 -19
package/db/Database.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Entry, Observable, Observer, Result, Unsubscriber, Results, Validatable, Validator, Key, Data, Entries, Datas, Validators, ValidatorType, Dispatcher } from "../util/index.js";
2
- import { PropUpdates, Update } from "../update/index.js";
2
+ import { DataUpdate, PropUpdates } from "../update/index.js";
3
3
  import type { Provider } from "../provider/Provider.js";
4
4
  import { Filters, Sorts, Query, FilterProps, SortKeys } from "../query/index.js";
5
5
  /**
@@ -98,7 +98,7 @@ export declare class DatabaseQuery<T extends Data = Data> extends Query<T> imple
98
98
  * @param updates `Update` instance or set of updates to apply to every matching document.
99
99
  * @return Nothing (possibly promised).
100
100
  */
101
- update(updates: Update<T> | PropUpdates<T>): number | PromiseLike<number>;
101
+ update(updates: DataUpdate<T> | PropUpdates<T>): number | PromiseLike<number>;
102
102
  /**
103
103
  * Delete all matching documents.
104
104
  * @return Nothing (possibly promised).
@@ -154,7 +154,7 @@ export declare class DatabaseDocument<T extends Data = Data> implements Observab
154
154
  /** Set the complete data of this document. */
155
155
  set(data: T): void | PromiseLike<void>;
156
156
  /** Update this document. */
157
- update(updates: Update<T> | PropUpdates<T>): void | PromiseLike<void>;
157
+ update(updates: DataUpdate<T> | PropUpdates<T>): void | PromiseLike<void>;
158
158
  /** Delete this document. */
159
159
  delete(): void | PromiseLike<void>;
160
160
  /** Validate data for this query reference. */
package/db/Database.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { callAsync, getFirstItem, throwAsync, validate, getMap, countItems, hasItems, ResultsObserver, } from "../util/index.js";
2
- import { DataUpdate, Update } from "../update/index.js";
2
+ import { DataUpdate } from "../update/index.js";
3
3
  import { Feedback, InvalidFeedback } from "../feedback/index.js";
4
4
  import { Filters, Sorts, Query, Filter } from "../query/index.js";
5
5
  import { DocumentRequiredError, DocumentValidationError, QueryRequiredError, QueryValidationError } from "./errors.js";
@@ -130,7 +130,7 @@ export class DatabaseQuery extends Query {
130
130
  * @return Nothing (possibly promised).
131
131
  */
132
132
  update(updates) {
133
- return this.db.provider.updateQuery(this, updates instanceof Update ? updates : new DataUpdate(updates));
133
+ return this.db.provider.updateQuery(this, updates instanceof DataUpdate ? updates : new DataUpdate(updates));
134
134
  }
135
135
  /**
136
136
  * Delete all matching documents.
@@ -236,7 +236,7 @@ export class DatabaseDocument {
236
236
  }
237
237
  /** Update this document. */
238
238
  update(updates) {
239
- return this.db.provider.update(this, updates instanceof Update ? updates : new DataUpdate(updates));
239
+ return this.db.provider.update(this, updates instanceof DataUpdate ? updates : new DataUpdate(updates));
240
240
  }
241
241
  /** Delete this document. */
242
242
  delete() {
package/db/errors.d.ts CHANGED
@@ -7,18 +7,6 @@ export declare class DocumentRequiredError<T extends Data> extends RequiredError
7
7
  ref: DatabaseDocument<T>;
8
8
  constructor(ref: DatabaseDocument<T>);
9
9
  }
10
- /** Thrown if an error occurs while reading a document. */
11
- export declare class DocumentReadError<T extends Data> extends Error {
12
- error: Error;
13
- ref: DatabaseDocument<T>;
14
- constructor(error: Error, ref: DatabaseDocument<T>);
15
- }
16
- /** Thrown if an error occurs while writing a document. */
17
- export declare class DocumentWriteError<T extends Data> extends Error {
18
- error: Error;
19
- ref: DatabaseDocument<T>;
20
- constructor(error: Error, ref: DatabaseDocument<T>);
21
- }
22
10
  /** Thrown if a document can't validate. */
23
11
  export declare class DocumentValidationError<T extends Data> extends ValidationError {
24
12
  ref: DatabaseDocument<T>;
@@ -29,18 +17,6 @@ export declare class QueryRequiredError<T extends Data> extends RequiredError {
29
17
  ref: DatabaseQuery<T>;
30
18
  constructor(ref: DatabaseQuery<T>);
31
19
  }
32
- /** Thrown if an error occurs while reading a query. */
33
- export declare class QueryReadError<T extends Data> extends Error {
34
- error: Error;
35
- ref: DatabaseQuery<T>;
36
- constructor(error: Error, ref: DatabaseQuery<T>);
37
- }
38
- /** Thrown if an error occurs while writing a query. */
39
- export declare class QueryWriteError<T extends Data> extends Error {
40
- error: Error;
41
- ref: DatabaseQuery<T>;
42
- constructor(error: Error, ref: DatabaseQuery<T>);
43
- }
44
20
  /** Thrown if a query can't validate a set of results. */
45
21
  export declare class QueryValidationError<T extends Data> extends ValidationError {
46
22
  ref: DatabaseQuery<T>;
package/db/errors.js CHANGED
@@ -7,24 +7,6 @@ export class DocumentRequiredError extends RequiredError {
7
7
  }
8
8
  }
9
9
  DocumentRequiredError.prototype.name = "DocumentRequiredError";
10
- /** Thrown if an error occurs while reading a document. */
11
- export class DocumentReadError extends Error {
12
- constructor(error, ref) {
13
- super(`Error reading document ${ref.toString()}:\n${error.message}`);
14
- this.error = error;
15
- this.ref = ref;
16
- }
17
- }
18
- DocumentReadError.prototype.name = "DocumentReadError";
19
- /** Thrown if an error occurs while writing a document. */
20
- export class DocumentWriteError extends Error {
21
- constructor(error, ref) {
22
- super(`Error writing document ${ref.toString()}:\n${error.message}`);
23
- this.error = error;
24
- this.ref = ref;
25
- }
26
- }
27
- DocumentWriteError.prototype.name = "DocumentWriteError";
28
10
  /** Thrown if a document can't validate. */
29
11
  export class DocumentValidationError extends ValidationError {
30
12
  constructor(ref, feedback) {
@@ -41,24 +23,6 @@ export class QueryRequiredError extends RequiredError {
41
23
  }
42
24
  }
43
25
  QueryRequiredError.prototype.name = "QueryRequiredError";
44
- /** Thrown if an error occurs while reading a query. */
45
- export class QueryReadError extends Error {
46
- constructor(error, ref) {
47
- super(`Error reading query ${ref.toString()}:\n${error.message}`);
48
- this.error = error;
49
- this.ref = ref;
50
- }
51
- }
52
- QueryReadError.prototype.name = "QueryReadError";
53
- /** Thrown if an error occurs while writing a query. */
54
- export class QueryWriteError extends Error {
55
- constructor(error, ref) {
56
- super(`Error writing query ${ref.toString()}:\n${error.message}`);
57
- this.error = error;
58
- this.ref = ref;
59
- }
60
- }
61
- DocumentWriteError.prototype.name = "DocumentWriteError";
62
26
  /** Thrown if a query can't validate a set of results. */
63
27
  export class QueryValidationError extends ValidationError {
64
28
  constructor(ref, feedback) {
@@ -1,5 +1,5 @@
1
1
  import type { Firestore } from "firebase/firestore";
2
- import { Entries, Provider, DatabaseDocument, DatabaseQuery, Result, Observer, Update, AsynchronousProvider, Data, Unsubscriber } from "../../index.js";
2
+ import { Entries, Provider, DatabaseDocument, DatabaseQuery, Result, Observer, AsynchronousProvider, DataUpdate, Data, Unsubscriber } from "../../index.js";
3
3
  /**
4
4
  * Firestore client database provider.
5
5
  * - Works with the Firebase JS SDK.
@@ -13,11 +13,11 @@ export declare class FirestoreClientProvider extends Provider implements Asynchr
13
13
  subscribe<T extends Data>(ref: DatabaseDocument<T>, observer: Observer<Result<T>>): Unsubscriber;
14
14
  add<T extends Data>(ref: DatabaseQuery<T>, data: T): Promise<string>;
15
15
  set<T extends Data>(ref: DatabaseDocument<T>, data: T): Promise<void>;
16
- update<T extends Data>(ref: DatabaseDocument<T>, updates: Update<T>): Promise<void>;
16
+ update<T extends Data>(ref: DatabaseDocument<T>, update: DataUpdate<T>): Promise<void>;
17
17
  delete<T extends Data>(ref: DatabaseDocument<T>): Promise<void>;
18
18
  getQuery<T extends Data>(ref: DatabaseQuery<T>): Promise<Entries<T>>;
19
19
  subscribeQuery<T extends Data>(ref: DatabaseQuery<T>, observer: Observer<Entries<T>>): Unsubscriber;
20
20
  setQuery<T extends Data>(ref: DatabaseQuery<T>, data: T): Promise<number>;
21
- updateQuery<T extends Data>(ref: DatabaseQuery<T>, updates: Update<T>): Promise<number>;
21
+ updateQuery<T extends Data>(ref: DatabaseQuery<T>, update: DataUpdate<T>): Promise<number>;
22
22
  deleteQuery<T extends Data>(ref: DatabaseQuery<T>): Promise<number>;
23
23
  }
@@ -1,5 +1,5 @@
1
1
  import { orderBy as firestoreOrderBy, where as firestoreWhere, limit as firestoreLimit, increment as firestoreIncrement, arrayUnion as firestoreArrayUnion, arrayRemove as firestoreArrayRemove, deleteField as firestoreDeleteField, collection as firestoreCollection, doc as firestoreDocument, query as firestoreQuery, onSnapshot, addDoc, setDoc, updateDoc, deleteDoc, getDoc, getDocs, } from "firebase/firestore";
2
- import { Provider, dispatchNext, dispatchError, Update, ObjectUpdate, Increment, DataUpdate, AssertionError, ArrayUpdate, UnsupportedError, } from "../../index.js";
2
+ import { Provider, dispatchNext, dispatchError, ObjectUpdate, Increment, DataUpdate, ArrayUpdate, UnsupportedError, } from "../../index.js";
3
3
  // Constants.
4
4
  // const ID = "__name__"; // DH: `__name__` is the entire path of the document. `__id__` is just ID.
5
5
  const ID = "__id__"; // Internal way Firestore Queries can reference the ID of the current document.
@@ -46,15 +46,10 @@ function* getResults(snapshot) {
46
46
  yield [s.id, s.data()];
47
47
  }
48
48
  /** Convert `Update` instances into corresponding Firestore `FieldValue` instances. */
49
- function getFieldValues(update) {
50
- if (update instanceof DataUpdate)
51
- return Object.fromEntries(yieldFieldValues(update));
52
- throw new AssertionError("Unsupported transform", update);
53
- }
54
49
  function* yieldFieldValues(updates, prefix = "") {
55
50
  for (const [key, update] of updates) {
56
- if (!(update instanceof Update))
57
- yield [`${prefix}${key}`, update !== undefined ? update : firestoreDeleteField()];
51
+ if (update === undefined)
52
+ yield [`${prefix}${key}`, firestoreDeleteField()];
58
53
  else if (update instanceof Increment)
59
54
  yield [`${prefix}${key}`, firestoreIncrement(update.amount)];
60
55
  else if (update instanceof DataUpdate || update instanceof ObjectUpdate)
@@ -68,7 +63,7 @@ function* yieldFieldValues(updates, prefix = "") {
68
63
  yield [`${prefix}${key}`, firestoreArrayRemove(...update.deletes)];
69
64
  }
70
65
  else
71
- throw new AssertionError("Unsupported transform", update);
66
+ yield [`${prefix}${key}`, update];
72
67
  }
73
68
  }
74
69
  /**
@@ -95,8 +90,9 @@ export class FirestoreClientProvider extends Provider {
95
90
  async set(ref, data) {
96
91
  await setDoc(getDocument(this.firestore, ref), data);
97
92
  }
98
- async update(ref, updates) {
99
- await updateDoc(getDocument(this.firestore, ref), getFieldValues(updates));
93
+ async update(ref, update) {
94
+ const fieldValues = Object.fromEntries(yieldFieldValues(update));
95
+ await updateDoc(getDocument(this.firestore, ref), fieldValues);
100
96
  }
101
97
  async delete(ref) {
102
98
  await deleteDoc(getDocument(this.firestore, ref));
@@ -112,9 +108,9 @@ export class FirestoreClientProvider extends Provider {
112
108
  await Promise.all(snapshot.docs.map(s => setDoc(s.ref, data)));
113
109
  return snapshot.size;
114
110
  }
115
- async updateQuery(ref, updates) {
111
+ async updateQuery(ref, update) {
116
112
  const snapshot = await getDocs(getQuery(this.firestore, ref));
117
- const fieldValues = getFieldValues(updates);
113
+ const fieldValues = Object.fromEntries(yieldFieldValues(update));
118
114
  await Promise.all(snapshot.docs.map(s => updateDoc(s.ref, fieldValues)));
119
115
  return snapshot.size;
120
116
  }
@@ -1,5 +1,5 @@
1
1
  import type { Firestore } from "firebase/firestore/lite";
2
- import { Provider, DatabaseDocument, DatabaseQuery, Result, Update, AsynchronousProvider, Data, Entries, Unsubscriber } from "../../index.js";
2
+ import { Provider, DatabaseDocument, DatabaseQuery, Result, Update, AsynchronousProvider, Data, DataUpdate, Entries, Unsubscriber } from "../../index.js";
3
3
  /**
4
4
  * Firestore Lite client database provider.
5
5
  * - Works with the Firebase JS SDK.
@@ -13,11 +13,11 @@ export declare class FirestoreClientProvider extends Provider implements Asynchr
13
13
  subscribe(): Unsubscriber;
14
14
  add<T extends Data>(ref: DatabaseQuery<T>, data: T): Promise<string>;
15
15
  set<T extends Data>(ref: DatabaseDocument<T>, data: T): Promise<void>;
16
- update<T extends Data>(ref: DatabaseDocument<T>, updates: Update<T>): Promise<void>;
16
+ update<T extends Data>(ref: DatabaseDocument<T>, update: DataUpdate<T>): Promise<void>;
17
17
  delete<T extends Data>(ref: DatabaseDocument<T>): Promise<void>;
18
18
  getQuery<T extends Data>(ref: DatabaseQuery<T>): Promise<Entries<T>>;
19
19
  subscribeQuery(): Unsubscriber;
20
20
  setQuery<T extends Data>(ref: DatabaseQuery<T>, data: T | Update<T> | undefined): Promise<number>;
21
- updateQuery<T extends Data>(ref: DatabaseQuery<T>, updates: Update<T>): Promise<number>;
21
+ updateQuery<T extends Data>(ref: DatabaseQuery<T>, update: DataUpdate<T>): Promise<number>;
22
22
  deleteQuery<T extends Data>(ref: DatabaseQuery<T>): Promise<number>;
23
23
  }
@@ -1,5 +1,5 @@
1
1
  import { orderBy as firestoreOrderBy, where as firestoreWhere, limit as firestoreLimit, increment as firestoreIncrement, arrayUnion as firestoreArrayUnion, arrayRemove as firestoreArrayRemove, deleteField as firestoreDeleteField, collection as firestoreCollection, doc as firestoreDocument, query as firestoreQuery, setDoc, addDoc, updateDoc, deleteDoc, getDoc, getDocs, } from "firebase/firestore/lite";
2
- import { Provider, Update, ObjectUpdate, Increment, AssertionError, DataUpdate, ArrayUpdate, UnsupportedError, } from "../../index.js";
2
+ import { Provider, ObjectUpdate, Increment, DataUpdate, ArrayUpdate, UnsupportedError, } from "../../index.js";
3
3
  // Constants.
4
4
  // const ID = "__name__"; // DH: `__name__` is the entire path of the document. `__id__` is just ID.
5
5
  const ID = "__id__"; // Internal way Firestore Queries can reference the ID of the current document.
@@ -46,15 +46,10 @@ function* getResults(snapshot) {
46
46
  yield [s.id, s.data()];
47
47
  }
48
48
  /** Convert `Update` instances into corresponding Firestore `FieldValue` instances. */
49
- function getFieldValues(update) {
50
- if (update instanceof DataUpdate)
51
- return Object.fromEntries(yieldFieldValues(update));
52
- throw new AssertionError("Unsupported transform", update);
53
- }
54
49
  function* yieldFieldValues(updates, prefix = "") {
55
50
  for (const [key, update] of updates) {
56
- if (!(update instanceof Update))
57
- yield [`${prefix}${key}`, update !== undefined ? update : firestoreDeleteField()];
51
+ if (update === undefined)
52
+ yield [`${prefix}${key}`, firestoreDeleteField()];
58
53
  else if (update instanceof Increment)
59
54
  yield [`${prefix}${key}`, firestoreIncrement(update.amount)];
60
55
  else if (update instanceof DataUpdate || update instanceof ObjectUpdate)
@@ -68,7 +63,7 @@ function* yieldFieldValues(updates, prefix = "") {
68
63
  yield [`${prefix}${key}`, firestoreArrayRemove(...update.deletes)];
69
64
  }
70
65
  else
71
- throw new AssertionError("Unsupported transform", update);
66
+ yield [`${prefix}${key}`, update];
72
67
  }
73
68
  }
74
69
  /**
@@ -96,8 +91,9 @@ export class FirestoreClientProvider extends Provider {
96
91
  async set(ref, data) {
97
92
  await setDoc(getDocument(this.firestore, ref), data);
98
93
  }
99
- async update(ref, updates) {
100
- await updateDoc(getDocument(this.firestore, ref), getFieldValues(updates));
94
+ async update(ref, update) {
95
+ const fieldValues = Object.fromEntries(yieldFieldValues(update));
96
+ await updateDoc(getDocument(this.firestore, ref), fieldValues);
101
97
  }
102
98
  async delete(ref) {
103
99
  await deleteDoc(getDocument(this.firestore, ref));
@@ -113,9 +109,9 @@ export class FirestoreClientProvider extends Provider {
113
109
  await Promise.all(snapshot.docs.map(s => setDoc(s.ref, data)));
114
110
  return snapshot.size;
115
111
  }
116
- async updateQuery(ref, updates) {
112
+ async updateQuery(ref, update) {
117
113
  const snapshot = await getDocs(getQuery(this.firestore, ref));
118
- const fieldValues = getFieldValues(updates);
114
+ const fieldValues = Object.fromEntries(yieldFieldValues(update));
119
115
  await Promise.all(snapshot.docs.map(s => updateDoc(s.ref, fieldValues)));
120
116
  return snapshot.size;
121
117
  }
@@ -1,5 +1,5 @@
1
1
  import { Firestore } from "@google-cloud/firestore";
2
- import { Provider, DatabaseDocument, DatabaseQuery, Observer, Result, Update, Data, AsynchronousProvider, Entry, Entries, Unsubscriber } from "../../index.js";
2
+ import { Provider, DatabaseDocument, DatabaseQuery, Observer, Result, Update, Data, AsynchronousProvider, DataUpdate, Entry, Entries, Unsubscriber } from "../../index.js";
3
3
  /**
4
4
  * Firestore server database provider.
5
5
  * - Works with the Firebase Admin SDK for Node.JS
@@ -11,11 +11,11 @@ export declare class FirestoreServerProvider extends Provider implements Asynchr
11
11
  subscribe<T extends Data>(ref: DatabaseDocument<T>, observer: Observer<Result<T>>): Unsubscriber;
12
12
  add<T extends Data>(ref: DatabaseQuery<T>, data: T): Promise<string>;
13
13
  set<T extends Data>(ref: DatabaseDocument<T>, data: T): Promise<void>;
14
- update<T extends Data>(ref: DatabaseDocument<T>, updates: Update<T>): Promise<void>;
14
+ update<T extends Data>(ref: DatabaseDocument<T>, update: DataUpdate<T>): Promise<void>;
15
15
  delete<T extends Data>(ref: DatabaseDocument<T>): Promise<void>;
16
16
  getQuery<T extends Data>(ref: DatabaseQuery<T>): Promise<Iterable<Entry<T>>>;
17
17
  subscribeQuery<T extends Data>(ref: DatabaseQuery<T>, observer: Observer<Entries<T>>): Unsubscriber;
18
18
  setQuery<T extends Data>(ref: DatabaseQuery<T>, data: T | Update<T> | undefined): Promise<number>;
19
- updateQuery<T extends Data>(ref: DatabaseQuery<T>, updates: Update<T>): Promise<number>;
19
+ updateQuery<T extends Data>(ref: DatabaseQuery<T>, update: DataUpdate<T>): Promise<number>;
20
20
  deleteQuery<T extends Data>(ref: DatabaseQuery<T>): Promise<number>;
21
21
  }
@@ -46,16 +46,11 @@ function* getResults(snapshot) {
46
46
  yield [s.id, s.data()];
47
47
  }
48
48
  /** Convert `Update` instances into corresponding Firestore `FieldValue` instances. */
49
- function getFieldValues(update) {
50
- if (update instanceof DataUpdate)
51
- return Object.fromEntries(yieldFieldValues(update));
52
- throw new AssertionError("Unsupported transform", update);
53
- }
54
49
  function* yieldFieldValues(updates, prefix = "") {
55
50
  for (const [key, update] of updates) {
56
51
  if (!(update instanceof Update))
57
52
  yield [`${prefix}${key}`, update !== undefined ? update : FieldValue.delete()];
58
- if (update instanceof Increment)
53
+ else if (update instanceof Increment)
59
54
  yield [`${prefix}${key}`, FieldValue.increment(update.amount)];
60
55
  else if (update instanceof DataUpdate || update instanceof ObjectUpdate)
61
56
  yield* yieldFieldValues(update, `${prefix}${key}.`);
@@ -92,8 +87,9 @@ export class FirestoreServerProvider extends Provider {
92
87
  async set(ref, data) {
93
88
  await getDocument(this.firestore, ref).set(data);
94
89
  }
95
- async update(ref, updates) {
96
- await getDocument(this.firestore, ref).update(getFieldValues(updates));
90
+ async update(ref, update) {
91
+ const fieldValues = Object.fromEntries(yieldFieldValues(update)); // eslint-disable-line @typescript-eslint/no-explicit-any
92
+ await getDocument(this.firestore, ref).update(fieldValues);
97
93
  }
98
94
  async delete(ref) {
99
95
  await getDocument(this.firestore, ref).delete();
@@ -107,8 +103,8 @@ export class FirestoreServerProvider extends Provider {
107
103
  async setQuery(ref, data) {
108
104
  return await bulkWrite(this.firestore, ref, (w, s) => void w.set(s.ref, data));
109
105
  }
110
- async updateQuery(ref, updates) {
111
- const fieldValues = getFieldValues(updates);
106
+ async updateQuery(ref, update) {
107
+ const fieldValues = Object.fromEntries(yieldFieldValues(update)); // eslint-disable-line @typescript-eslint/no-explicit-any
112
108
  return await bulkWrite(this.firestore, ref, (w, s) => void w.update(s.ref, fieldValues));
113
109
  }
114
110
  async deleteQuery(ref) {
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "state-management",
12
12
  "query-builder"
13
13
  ],
14
- "version": "1.52.0",
14
+ "version": "1.55.0",
15
15
  "repository": "https://github.com/dhoulb/shelving",
16
16
  "author": "Dave Houlbrooke <dave@shax.com>",
17
17
  "license": "0BSD",
@@ -59,24 +59,24 @@
59
59
  "build:jest": "node --experimental-vm-modules node_modules/jest/bin/jest.js --config=jest.config.build.cjs"
60
60
  },
61
61
  "devDependencies": {
62
- "@google-cloud/firestore": "^4.15.1",
63
- "@types/jest": "^27.4.0",
64
- "@types/react": "^17.0.39",
65
- "@types/react-dom": "^17.0.11",
66
- "@typescript-eslint/eslint-plugin": "^5.12.0",
67
- "@typescript-eslint/parser": "^5.12.0",
68
- "eslint": "^8.9.0",
69
- "eslint-config-prettier": "^8.4.0",
70
- "eslint-plugin-import": "^2.25.4",
62
+ "@google-cloud/firestore": "^5.0.2",
63
+ "@types/jest": "^27.4.1",
64
+ "@types/react": "^17.0.44",
65
+ "@types/react-dom": "^17.0.15",
66
+ "@typescript-eslint/eslint-plugin": "^5.20.0",
67
+ "@typescript-eslint/parser": "^5.20.0",
68
+ "eslint": "^8.14.0",
69
+ "eslint-config-prettier": "^8.5.0",
70
+ "eslint-plugin-import": "^2.26.0",
71
71
  "eslint-plugin-prettier": "^4.0.0",
72
- "firebase": "^9.6.7",
72
+ "firebase": "^9.6.11",
73
73
  "jest": "^27.5.1",
74
74
  "jest-ts-webcompat-resolver": "^1.0.0",
75
- "prettier": "^2.5.1",
75
+ "prettier": "^2.6.2",
76
76
  "react": "^17.0.2",
77
77
  "react-dom": "^17.0.2",
78
- "ts-jest": "^27.1.3",
79
- "typescript": "^4.5.5"
78
+ "ts-jest": "^27.1.4",
79
+ "typescript": "^4.6.3"
80
80
  },
81
81
  "peerDependencies": {
82
82
  "@google-cloud/firestore": ">=4.0.0",
@@ -1,5 +1,5 @@
1
1
  import type { DatabaseDocument, DatabaseQuery } from "../db/index.js";
2
- import { Update } from "../update/index.js";
2
+ import { DataUpdate } from "../update/index.js";
3
3
  import { Result, Unsubscriber, Observer, Entries, Data } from "../util/index.js";
4
4
  import type { Provider, AsynchronousProvider } from "./Provider.js";
5
5
  import { MemoryProvider } from "./MemoryProvider.js";
@@ -21,14 +21,14 @@ export declare class CacheProvider extends ThroughProvider implements Asynchrono
21
21
  subscribe<T extends Data>(ref: DatabaseDocument<T>, observer: Observer<Result<T>>): Unsubscriber;
22
22
  add<T extends Data>(ref: DatabaseQuery<T>, data: T): Promise<string>;
23
23
  set<T extends Data>(ref: DatabaseDocument<T>, data: T): Promise<void>;
24
- update<T extends Data>(ref: DatabaseDocument<T>, updates: Update<T>): Promise<void>;
24
+ update<T extends Data>(ref: DatabaseDocument<T>, update: DataUpdate<T>): Promise<void>;
25
25
  delete<T extends Data>(ref: DatabaseDocument<T>): Promise<void>;
26
26
  /** Cache a set of document entries. */
27
27
  private _cacheEntries;
28
28
  getQuery<T extends Data>(ref: DatabaseQuery<T>): Promise<Entries<T>>;
29
29
  subscribeQuery<T extends Data>(ref: DatabaseQuery<T>, observer: Observer<Entries<T>>): Unsubscriber;
30
30
  setQuery<T extends Data>(ref: DatabaseQuery<T>, data: T): Promise<number>;
31
- updateQuery<T extends Data>(ref: DatabaseQuery<T>, updates: Update<T>): Promise<number>;
31
+ updateQuery<T extends Data>(ref: DatabaseQuery<T>, update: DataUpdate<T>): Promise<number>;
32
32
  deleteQuery<T extends Data>(ref: DatabaseQuery<T>): Promise<number>;
33
33
  /** Reset this provider and clear all data. */
34
34
  reset(): void;
@@ -43,11 +43,11 @@ export class CacheProvider extends ThroughProvider {
43
43
  await super.set(ref, data);
44
44
  this.cache.set(ref, data);
45
45
  }
46
- async update(ref, updates) {
47
- await super.update(ref, updates);
46
+ async update(ref, update) {
47
+ await super.update(ref, update);
48
48
  // Update the document in the cache if it exists using `updateDocuments()` and an `id` query.
49
49
  // Using `updateDocument()` would throw `RequiredError` if the document didn't exist.
50
- this.cache.updateQuery(ref.optional, updates);
50
+ this.cache.updateQuery(ref.optional, update);
51
51
  }
52
52
  async delete(ref) {
53
53
  await super.delete(ref);
@@ -83,9 +83,9 @@ export class CacheProvider extends ThroughProvider {
83
83
  this.cache.setQuery(ref, data);
84
84
  return count;
85
85
  }
86
- async updateQuery(ref, updates) {
87
- const count = await super.updateQuery(ref, updates);
88
- this.cache.updateQuery(ref, updates);
86
+ async updateQuery(ref, update) {
87
+ const count = await super.updateQuery(ref, update);
88
+ this.cache.updateQuery(ref, update);
89
89
  return count;
90
90
  }
91
91
  async deleteQuery(ref) {
@@ -0,0 +1,30 @@
1
+ import { DatabaseDocument, DatabaseQuery } from "../db/index.js";
2
+ import { Data, Result, Entries, Observer, Unsubscriber } from "../util/index.js";
3
+ import { DataUpdate } from "../update/index.js";
4
+ import { ThroughProvider } from "./ThroughProvider.js";
5
+ /** Provider that wraps errors thrown from deeper providers in `DatabaseReadError` and `DatabaseWriteError` etc to make it easier to see what read/write caused the error. */
6
+ export declare class ErrorProvider extends ThroughProvider {
7
+ get<T extends Data>(ref: DatabaseDocument<T>): Result<T> | PromiseLike<Result<T>>;
8
+ subscribe<T extends Data>(ref: DatabaseDocument<T>, observer: Observer<Result<T>>): Unsubscriber;
9
+ add<T extends Data>(ref: DatabaseQuery<T>, data: T): string | PromiseLike<string>;
10
+ set<T extends Data>(ref: DatabaseDocument<T>, data: T): void | PromiseLike<void>;
11
+ update<T extends Data>(ref: DatabaseDocument<T>, update: DataUpdate<T>): void | PromiseLike<void>;
12
+ delete<T extends Data>(ref: DatabaseDocument<T>): void | PromiseLike<void>;
13
+ getQuery<T extends Data>(ref: DatabaseQuery<T>): Entries<T> | PromiseLike<Entries<T>>;
14
+ subscribeQuery<T extends Data>(ref: DatabaseQuery<T>, observer: Observer<Entries<T>>): Unsubscriber;
15
+ setQuery<T extends Data>(ref: DatabaseQuery<T>, data: T): number | PromiseLike<number>;
16
+ updateQuery<T extends Data>(ref: DatabaseQuery<T>, update: DataUpdate<T>): number | PromiseLike<number>;
17
+ deleteQuery<T extends Data>(ref: DatabaseQuery<T>): number | PromiseLike<number>;
18
+ }
19
+ /** Thrown if an error occurs while reading a query. */
20
+ export declare class DatabaseReadError<T extends Data> extends Error {
21
+ readonly error: Error;
22
+ readonly ref: DatabaseDocument<T> | DatabaseQuery<T>;
23
+ constructor(error: Error, ref: DatabaseDocument<T> | DatabaseQuery<T>);
24
+ }
25
+ /** Thrown if an error occurs while writing a document. */
26
+ export declare class DatabaseWriteError<T extends Data> extends Error {
27
+ readonly error: Error;
28
+ readonly ref: DatabaseDocument<T> | DatabaseQuery<T>;
29
+ constructor(error: Error, ref: DatabaseDocument<T> | DatabaseQuery<T>);
30
+ }