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.
- package/db/Database.d.ts +3 -3
- package/db/Database.js +3 -3
- package/db/errors.d.ts +0 -24
- package/db/errors.js +0 -36
- package/firestore/client/FirestoreClientProvider.d.ts +3 -3
- package/firestore/client/FirestoreClientProvider.js +9 -13
- package/firestore/lite/FirestoreLiteProvider.d.ts +3 -3
- package/firestore/lite/FirestoreLiteProvider.js +9 -13
- package/firestore/server/FirestoreServerProvider.d.ts +3 -3
- package/firestore/server/FirestoreServerProvider.js +6 -10
- package/package.json +14 -14
- package/provider/CacheProvider.d.ts +3 -3
- package/provider/CacheProvider.js +6 -6
- package/provider/ErrorProvider.d.ts +30 -0
- package/provider/ErrorProvider.js +174 -0
- package/provider/MemoryProvider.d.ts +3 -3
- package/provider/MemoryProvider.js +2 -2
- package/provider/Provider.d.ts +11 -11
- package/provider/ThroughProvider.d.ts +3 -3
- package/provider/ThroughProvider.js +4 -4
- package/provider/ValidationProvider.d.ts +3 -3
- package/provider/ValidationProvider.js +4 -4
- package/provider/index.d.ts +1 -0
- package/provider/index.js +1 -0
- package/query/Query.js +1 -1
- package/react/index.d.ts +2 -1
- package/react/index.js +2 -1
- package/react/useDocument.js +6 -6
- package/react/useInstance.d.ts +10 -0
- package/react/useInstance.js +22 -0
- package/react/useLazy.d.ts +14 -0
- package/react/{usePureMemo.js → useLazy.js} +1 -1
- package/react/usePagination.js +3 -3
- package/react/usePureEffect.d.ts +1 -5
- package/react/usePureEffect.js +3 -7
- package/react/usePureState.d.ts +2 -9
- package/react/usePureState.js +1 -1
- package/react/useQuery.js +6 -6
- package/update/util.d.ts +6 -3
- package/update/util.js +0 -1
- package/util/lazy.d.ts +1 -4
- package/util/lazy.js +1 -2
- package/util/template.d.ts +3 -5
- package/util/template.js +15 -16
- package/util/transform.d.ts +2 -2
- 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 {
|
|
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:
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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>,
|
|
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>,
|
|
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,
|
|
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 (
|
|
57
|
-
yield [`${prefix}${key}`,
|
|
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
|
-
|
|
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,
|
|
99
|
-
|
|
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,
|
|
111
|
+
async updateQuery(ref, update) {
|
|
116
112
|
const snapshot = await getDocs(getQuery(this.firestore, ref));
|
|
117
|
-
const fieldValues =
|
|
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>,
|
|
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>,
|
|
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,
|
|
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 (
|
|
57
|
-
yield [`${prefix}${key}`,
|
|
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
|
-
|
|
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,
|
|
100
|
-
|
|
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,
|
|
112
|
+
async updateQuery(ref, update) {
|
|
117
113
|
const snapshot = await getDocs(getQuery(this.firestore, ref));
|
|
118
|
-
const fieldValues =
|
|
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>,
|
|
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>,
|
|
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,
|
|
96
|
-
|
|
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,
|
|
111
|
-
const fieldValues =
|
|
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.
|
|
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": "^
|
|
63
|
-
"@types/jest": "^27.4.
|
|
64
|
-
"@types/react": "^17.0.
|
|
65
|
-
"@types/react-dom": "^17.0.
|
|
66
|
-
"@typescript-eslint/eslint-plugin": "^5.
|
|
67
|
-
"@typescript-eslint/parser": "^5.
|
|
68
|
-
"eslint": "^8.
|
|
69
|
-
"eslint-config-prettier": "^8.
|
|
70
|
-
"eslint-plugin-import": "^2.
|
|
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.
|
|
72
|
+
"firebase": "^9.6.11",
|
|
73
73
|
"jest": "^27.5.1",
|
|
74
74
|
"jest-ts-webcompat-resolver": "^1.0.0",
|
|
75
|
-
"prettier": "^2.
|
|
75
|
+
"prettier": "^2.6.2",
|
|
76
76
|
"react": "^17.0.2",
|
|
77
77
|
"react-dom": "^17.0.2",
|
|
78
|
-
"ts-jest": "^27.1.
|
|
79
|
-
"typescript": "^4.
|
|
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 {
|
|
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>,
|
|
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>,
|
|
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,
|
|
47
|
-
await super.update(ref,
|
|
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,
|
|
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,
|
|
87
|
-
const count = await super.updateQuery(ref,
|
|
88
|
-
this.cache.updateQuery(ref,
|
|
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
|
+
}
|