shelving 1.35.0 → 1.39.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/api/Resource.js +2 -2
- package/db/Database.d.ts +13 -18
- package/db/Database.js +22 -27
- package/db/Pagination.d.ts +3 -3
- package/db/Pagination.js +5 -5
- package/firestore/client/FirestoreClientProvider.d.ts +3 -3
- package/firestore/lite/FirestoreLiteProvider.d.ts +2 -2
- package/firestore/server/FirestoreServerProvider.d.ts +2 -2
- package/package.json +6 -6
- package/provider/BatchProvider.d.ts +3 -3
- package/provider/BatchProvider.js +3 -3
- package/provider/CacheProvider.d.ts +5 -5
- package/provider/CacheProvider.js +6 -6
- package/provider/MemoryProvider.d.ts +3 -3
- package/provider/Provider.d.ts +5 -5
- package/provider/ThroughProvider.d.ts +3 -3
- package/provider/ValidationProvider.d.ts +3 -3
- package/query/Filter.d.ts +8 -9
- package/query/Filter.js +17 -18
- package/query/Filters.d.ts +2 -2
- package/query/Filters.js +6 -6
- package/query/Query.d.ts +2 -2
- package/query/Query.js +3 -3
- package/query/Rule.d.ts +3 -3
- package/query/Rules.d.ts +1 -1
- package/query/Rules.js +1 -1
- package/query/Sort.d.ts +2 -2
- package/query/Sort.js +3 -3
- package/query/Sorts.d.ts +2 -2
- package/react/usePagination.d.ts +2 -2
- package/react/useQuery.d.ts +5 -5
- package/react/useQuery.js +7 -7
- package/schema/ArraySchema.js +2 -2
- package/stream/ArrayState.d.ts +2 -2
- package/stream/ArrayState.js +4 -4
- package/stream/LazyState.d.ts +1 -1
- package/stream/LazyState.js +2 -2
- package/stream/LazyStream.d.ts +1 -1
- package/stream/LazyStream.js +2 -2
- package/stream/State.d.ts +1 -1
- package/stream/State.js +2 -2
- package/stream/Stream.d.ts +2 -2
- package/stream/Stream.js +4 -4
- package/test/util.js +3 -3
- package/update/ObjectUpdate.js +3 -3
- package/util/array.d.ts +16 -2
- package/util/array.js +10 -1
- package/util/assert.d.ts +12 -6
- package/util/assert.js +19 -9
- package/util/data.d.ts +10 -12
- package/util/data.js +6 -6
- package/util/date.d.ts +3 -3
- package/util/date.js +3 -3
- package/util/entry.d.ts +23 -11
- package/util/entry.js +9 -6
- package/util/filter.d.ts +22 -22
- package/util/filter.js +24 -24
- package/util/iterate.d.ts +10 -5
- package/util/iterate.js +19 -9
- package/util/map.d.ts +4 -2
- package/util/map.js +1 -1
- package/util/null.d.ts +7 -7
- package/util/null.js +6 -6
- package/util/number.d.ts +6 -2
- package/util/number.js +17 -2
- package/util/observable.d.ts +6 -0
- package/util/observable.js +10 -0
- package/util/sort.d.ts +6 -6
- package/util/sort.js +12 -12
- package/util/string.d.ts +1 -1
- package/util/string.js +1 -1
- package/util/transform.js +2 -2
- package/util/undefined.d.ts +3 -4
- package/util/undefined.js +3 -4
package/api/Resource.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { UNDEFINED, validate } from "../util/index.js";
|
|
2
2
|
import { Feedback } from "../feedback/index.js";
|
|
3
3
|
import { ResourceValidationError } from "./errors.js";
|
|
4
4
|
/**
|
|
@@ -37,6 +37,6 @@ export class Resource {
|
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
|
-
export function RESOURCE(payload =
|
|
40
|
+
export function RESOURCE(payload = UNDEFINED, result = UNDEFINED) {
|
|
41
41
|
return new Resource(payload, result);
|
|
42
42
|
}
|
package/db/Database.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Entry, Observable, Observer, Result, Unsubscriber,
|
|
1
|
+
import { Entry, Observable, Observer, Result, Unsubscriber, Results, Validatable, Validator, Key, Data, Entries, Datas, Validators, ValidatorType, Dispatcher, Nullish } from "../util/index.js";
|
|
2
2
|
import { PropUpdates, Update } from "../update/index.js";
|
|
3
3
|
import type { Provider } from "../provider/Provider.js";
|
|
4
4
|
import { Filters, Sorts, Query } from "../query/index.js";
|
|
@@ -24,7 +24,7 @@ export declare class Database<V extends Validators<Datas> = Validators<Datas>> {
|
|
|
24
24
|
write(...writes: Nullish<Write>[]): Promise<Write>;
|
|
25
25
|
}
|
|
26
26
|
/** A documents reference within a specific database. */
|
|
27
|
-
export declare class DataQuery<T extends Data = Data> extends Query<T> implements Observable<Results<T>>, Validatable<
|
|
27
|
+
export declare class DataQuery<T extends Data = Data> extends Query<T> implements Observable<Results<T>>, Validatable<Entries<T>>, Iterable<Entry<T>> {
|
|
28
28
|
readonly provider: Provider;
|
|
29
29
|
readonly validator: Validator<T>;
|
|
30
30
|
readonly collection: string;
|
|
@@ -43,17 +43,22 @@ export declare class DataQuery<T extends Data = Data> extends Query<T> implement
|
|
|
43
43
|
* Get an iterable that yields the results of this entry.
|
|
44
44
|
* @return Map containing the results.
|
|
45
45
|
*/
|
|
46
|
-
get
|
|
46
|
+
get entries(): Entries<T> | PromiseLike<Entries<T>>;
|
|
47
47
|
/**
|
|
48
48
|
* Get an iterable that yields the results of this entry.
|
|
49
49
|
* @return Map containing the results.
|
|
50
50
|
*/
|
|
51
|
-
get
|
|
51
|
+
get results(): Results<T> | PromiseLike<Results<T>>;
|
|
52
52
|
/**
|
|
53
53
|
* Count the number of results of this set of documents.
|
|
54
|
-
* @return Number of documents
|
|
54
|
+
* @return Number of documents matching the query (possibly promised).
|
|
55
55
|
*/
|
|
56
56
|
get count(): number | PromiseLike<number>;
|
|
57
|
+
/**
|
|
58
|
+
* Does at least one document exist for this query?
|
|
59
|
+
* @return `true` if a document exists or `false` otherwise (possibly promised).
|
|
60
|
+
*/
|
|
61
|
+
get exists(): boolean | PromiseLike<boolean>;
|
|
57
62
|
/**
|
|
58
63
|
* Get an entry for the first document matched by this query or `undefined` if this query has no results.
|
|
59
64
|
*
|
|
@@ -76,14 +81,6 @@ export declare class DataQuery<T extends Data = Data> extends Query<T> implement
|
|
|
76
81
|
* @return Function that ends the subscription.
|
|
77
82
|
*/
|
|
78
83
|
subscribe(next: Observer<Results<T>> | Dispatcher<[Results<T>]>): Unsubscriber;
|
|
79
|
-
/**
|
|
80
|
-
* Subscribe to all matching documents.
|
|
81
|
-
* - `next()` is called once with the initial results, and again any time the results change.
|
|
82
|
-
*
|
|
83
|
-
* @param next Observer with `next`, `error`, or `complete` methods or a `next()` dispatcher.
|
|
84
|
-
* @return Function that ends the subscription.
|
|
85
|
-
*/
|
|
86
|
-
subscribeMap(next: Observer<ResultsMap<T>> | Dispatcher<[ResultsMap<T>]>): Unsubscriber;
|
|
87
84
|
/**
|
|
88
85
|
* Set all matching documents to the same exact value.
|
|
89
86
|
*
|
|
@@ -106,11 +103,11 @@ export declare class DataQuery<T extends Data = Data> extends Query<T> implement
|
|
|
106
103
|
/** Iterate over the resuls (will throw `Promise` if the results are asynchronous). */
|
|
107
104
|
[Symbol.iterator](): Iterator<Entry<T>, void>;
|
|
108
105
|
/** Validate a set of results for this query reference. */
|
|
109
|
-
validate(unsafeEntries:
|
|
106
|
+
validate(unsafeEntries: Entries): Entries<T>;
|
|
110
107
|
toString(): string;
|
|
111
108
|
}
|
|
112
109
|
/** Get the data for a document from a result for that document. */
|
|
113
|
-
export declare function getQueryData<T extends Data>(
|
|
110
|
+
export declare function getQueryData<T extends Data>(entries: Entries<T>, ref: DataQuery<T>): Entry<T>;
|
|
114
111
|
/** A document reference within a specific database. */
|
|
115
112
|
export declare class DataDocument<T extends Data = Data> implements Observable<Result<T>>, Validatable<T> {
|
|
116
113
|
readonly provider: Provider;
|
|
@@ -124,13 +121,11 @@ export declare class DataDocument<T extends Data = Data> implements Observable<R
|
|
|
124
121
|
get optional(): DataQuery<T>;
|
|
125
122
|
/**
|
|
126
123
|
* Does this document exist?
|
|
127
|
-
*
|
|
128
|
-
* @return Document's data, or `undefined` if the document doesn't exist (possibly promised).
|
|
124
|
+
* @return `true` if a document exists or `false` otherwise (possibly promised).
|
|
129
125
|
*/
|
|
130
126
|
get exists(): boolean | PromiseLike<boolean>;
|
|
131
127
|
/**
|
|
132
128
|
* Get the result of this document.
|
|
133
|
-
*
|
|
134
129
|
* @return Document's data, or `undefined` if the document doesn't exist (possibly promised).
|
|
135
130
|
*/
|
|
136
131
|
get result(): Result<T> | PromiseLike<Result<T>>;
|
package/db/Database.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { callAsync, getFirstItem, throwAsync, validate,
|
|
1
|
+
import { callAsync, getFirstItem, throwAsync, validate, getMap, countItems, isNotNullish, hasItems, ResultsObserver, } from "../util/index.js";
|
|
2
2
|
import { DataUpdate, Update } from "../update/index.js";
|
|
3
3
|
import { Feedback, InvalidFeedback } from "../feedback/index.js";
|
|
4
4
|
import { Filters, Query, EqualFilter } from "../query/index.js";
|
|
@@ -27,11 +27,11 @@ export class Database {
|
|
|
27
27
|
}
|
|
28
28
|
/** Create a writer for this database from a set of separate writes. */
|
|
29
29
|
writer(...writes) {
|
|
30
|
-
return new Writes(...writes.filter(
|
|
30
|
+
return new Writes(...writes.filter(isNotNullish));
|
|
31
31
|
}
|
|
32
32
|
/** Perform one or more writes on this database and return the `Writes` instance representing the combined changes. */
|
|
33
33
|
async write(...writes) {
|
|
34
|
-
const write = new Writes(...writes.filter(
|
|
34
|
+
const write = new Writes(...writes.filter(isNotNullish));
|
|
35
35
|
await write.transform(this);
|
|
36
36
|
return write;
|
|
37
37
|
}
|
|
@@ -62,22 +62,29 @@ export class DataQuery extends Query {
|
|
|
62
62
|
* Get an iterable that yields the results of this entry.
|
|
63
63
|
* @return Map containing the results.
|
|
64
64
|
*/
|
|
65
|
-
get
|
|
65
|
+
get entries() {
|
|
66
66
|
return this.provider.getQuery(this);
|
|
67
67
|
}
|
|
68
68
|
/**
|
|
69
69
|
* Get an iterable that yields the results of this entry.
|
|
70
70
|
* @return Map containing the results.
|
|
71
71
|
*/
|
|
72
|
-
get
|
|
73
|
-
return callAsync(
|
|
72
|
+
get results() {
|
|
73
|
+
return callAsync(getMap, this.provider.getQuery(this));
|
|
74
74
|
}
|
|
75
75
|
/**
|
|
76
76
|
* Count the number of results of this set of documents.
|
|
77
|
-
* @return Number of documents
|
|
77
|
+
* @return Number of documents matching the query (possibly promised).
|
|
78
78
|
*/
|
|
79
79
|
get count() {
|
|
80
|
-
return callAsync(countItems, this.
|
|
80
|
+
return callAsync(countItems, this.entries);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Does at least one document exist for this query?
|
|
84
|
+
* @return `true` if a document exists or `false` otherwise (possibly promised).
|
|
85
|
+
*/
|
|
86
|
+
get exists() {
|
|
87
|
+
return callAsync(hasItems, this.provider.getQuery(this.max(1)));
|
|
81
88
|
}
|
|
82
89
|
/**
|
|
83
90
|
* Get an entry for the first document matched by this query or `undefined` if this query has no results.
|
|
@@ -86,7 +93,7 @@ export class DataQuery extends Query {
|
|
|
86
93
|
* @throws RequiredError if there were no results for this query.
|
|
87
94
|
*/
|
|
88
95
|
get result() {
|
|
89
|
-
return callAsync(getFirstItem, this.max(1)
|
|
96
|
+
return callAsync(getFirstItem, this.provider.getQuery(this.max(1)));
|
|
90
97
|
}
|
|
91
98
|
/**
|
|
92
99
|
* Get an entry for the first document matched by this query.
|
|
@@ -95,7 +102,7 @@ export class DataQuery extends Query {
|
|
|
95
102
|
* @throws RequiredError if there were no results for this query.
|
|
96
103
|
*/
|
|
97
104
|
get data() {
|
|
98
|
-
return callAsync(getQueryData, this.max(1)
|
|
105
|
+
return callAsync(getQueryData, this.provider.getQuery(this.max(1)), this);
|
|
99
106
|
}
|
|
100
107
|
/**
|
|
101
108
|
* Subscribe to all matching documents.
|
|
@@ -105,17 +112,7 @@ export class DataQuery extends Query {
|
|
|
105
112
|
* @return Function that ends the subscription.
|
|
106
113
|
*/
|
|
107
114
|
subscribe(next) {
|
|
108
|
-
return this.provider.subscribeQuery(this, typeof next === "function" ? { next } : next);
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Subscribe to all matching documents.
|
|
112
|
-
* - `next()` is called once with the initial results, and again any time the results change.
|
|
113
|
-
*
|
|
114
|
-
* @param next Observer with `next`, `error`, or `complete` methods or a `next()` dispatcher.
|
|
115
|
-
* @return Function that ends the subscription.
|
|
116
|
-
*/
|
|
117
|
-
subscribeMap(next) {
|
|
118
|
-
return this.provider.subscribeQuery(this, new TransformObserver(toMap, typeof next === "function" ? { next } : next));
|
|
115
|
+
return this.provider.subscribeQuery(this, new ResultsObserver(typeof next === "function" ? { next } : next));
|
|
119
116
|
}
|
|
120
117
|
/**
|
|
121
118
|
* Set all matching documents to the same exact value.
|
|
@@ -144,7 +141,7 @@ export class DataQuery extends Query {
|
|
|
144
141
|
}
|
|
145
142
|
/** Iterate over the resuls (will throw `Promise` if the results are asynchronous). */
|
|
146
143
|
[Symbol.iterator]() {
|
|
147
|
-
return throwAsync(this.
|
|
144
|
+
return throwAsync(this.entries)[Symbol.iterator]();
|
|
148
145
|
}
|
|
149
146
|
/** Validate a set of results for this query reference. */
|
|
150
147
|
*validate(unsafeEntries) {
|
|
@@ -170,8 +167,8 @@ export class DataQuery extends Query {
|
|
|
170
167
|
}
|
|
171
168
|
}
|
|
172
169
|
/** Get the data for a document from a result for that document. */
|
|
173
|
-
export function getQueryData(
|
|
174
|
-
const first = getFirstItem(
|
|
170
|
+
export function getQueryData(entries, ref) {
|
|
171
|
+
const first = getFirstItem(entries);
|
|
175
172
|
if (first)
|
|
176
173
|
return first;
|
|
177
174
|
throw new QueryRequiredError(ref);
|
|
@@ -194,15 +191,13 @@ export class DataDocument {
|
|
|
194
191
|
}
|
|
195
192
|
/**
|
|
196
193
|
* Does this document exist?
|
|
197
|
-
*
|
|
198
|
-
* @return Document's data, or `undefined` if the document doesn't exist (possibly promised).
|
|
194
|
+
* @return `true` if a document exists or `false` otherwise (possibly promised).
|
|
199
195
|
*/
|
|
200
196
|
get exists() {
|
|
201
197
|
return callAsync(Boolean, this.provider.get(this));
|
|
202
198
|
}
|
|
203
199
|
/**
|
|
204
200
|
* Get the result of this document.
|
|
205
|
-
*
|
|
206
201
|
* @return Document's data, or `undefined` if the document doesn't exist (possibly promised).
|
|
207
202
|
*/
|
|
208
203
|
get result() {
|
package/db/Pagination.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Results, Entry, Entries, Data } from "../util/index.js";
|
|
2
2
|
import { State } from "../stream/index.js";
|
|
3
3
|
import { DataQuery } from "./Database.js";
|
|
4
4
|
/**
|
|
@@ -6,7 +6,7 @@ import { DataQuery } from "./Database.js";
|
|
|
6
6
|
* - If you pass in initial values, it will use that as the first page.
|
|
7
7
|
* - If you don't pass in initial values, it will autoload the first page.
|
|
8
8
|
*/
|
|
9
|
-
export declare class Pagination<T extends Data> extends State<
|
|
9
|
+
export declare class Pagination<T extends Data> extends State<Results<T>> implements Iterable<Entry<T>> {
|
|
10
10
|
protected _pending: boolean;
|
|
11
11
|
readonly ref: DataQuery<T>;
|
|
12
12
|
readonly limit: number;
|
|
@@ -20,7 +20,7 @@ export declare class Pagination<T extends Data> extends State<ResultsMap<T>> imp
|
|
|
20
20
|
* Merge more results into this pagination.
|
|
21
21
|
* @return The change in the number of results.
|
|
22
22
|
*/
|
|
23
|
-
merge(more:
|
|
23
|
+
merge(more: Entries<T>): void;
|
|
24
24
|
/** Iterate over the entries of the values currently in the pagination. */
|
|
25
25
|
[Symbol.iterator](): Iterator<Entry<T>>;
|
|
26
26
|
}
|
package/db/Pagination.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getLastItem,
|
|
1
|
+
import { getLastItem, assertNumber, yieldMerged, getMap, LOADING, assertMax } from "../util/index.js";
|
|
2
2
|
import { State } from "../stream/index.js";
|
|
3
3
|
import { ConditionError } from "../index.js";
|
|
4
4
|
/**
|
|
@@ -22,7 +22,7 @@ export class Pagination extends State {
|
|
|
22
22
|
if (!this.loading) {
|
|
23
23
|
const lastItem = getLastItem(this.value);
|
|
24
24
|
if (lastItem) {
|
|
25
|
-
const next = await this.ref.after(lastItem[0], lastItem[1]).
|
|
25
|
+
const next = await this.ref.after(lastItem[0], lastItem[1]).results;
|
|
26
26
|
this.merge(next);
|
|
27
27
|
if (next.size < this.limit)
|
|
28
28
|
this.complete();
|
|
@@ -31,7 +31,7 @@ export class Pagination extends State {
|
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
this._value === LOADING;
|
|
34
|
-
const next = await this.ref.
|
|
34
|
+
const next = await this.ref.results;
|
|
35
35
|
this.next(next);
|
|
36
36
|
if (next.size < this.limit)
|
|
37
37
|
this.complete();
|
|
@@ -40,7 +40,7 @@ export class Pagination extends State {
|
|
|
40
40
|
};
|
|
41
41
|
this.ref = ref;
|
|
42
42
|
assertNumber(ref.limit); // Collection must have a numeric limit to paginate (otherwise you'd be retrieving the entire set of documents).
|
|
43
|
-
|
|
43
|
+
assertMax(ref.sorts.size, 1); // Collection must have at least one sort order to paginate.
|
|
44
44
|
this.limit = ref.limit;
|
|
45
45
|
}
|
|
46
46
|
/**
|
|
@@ -48,7 +48,7 @@ export class Pagination extends State {
|
|
|
48
48
|
* @return The change in the number of results.
|
|
49
49
|
*/
|
|
50
50
|
merge(more) {
|
|
51
|
-
this.next(
|
|
51
|
+
this.next(getMap(this.ref.sorts.transform(yieldMerged(more, this.value))));
|
|
52
52
|
}
|
|
53
53
|
/** Iterate over the entries of the values currently in the pagination. */
|
|
54
54
|
[Symbol.iterator]() {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Firestore } from "firebase/firestore";
|
|
2
|
-
import {
|
|
2
|
+
import { Entries, Provider, DataDocument, DataQuery, Result, Observer, Update, AsynchronousProvider, Data, Unsubscriber } from "../../index.js";
|
|
3
3
|
/**
|
|
4
4
|
* Firestore client database provider.
|
|
5
5
|
* - Works with the Firebase JS SDK.
|
|
@@ -15,8 +15,8 @@ export declare class FirestoreClientProvider extends Provider implements Asynchr
|
|
|
15
15
|
set<T extends Data>(ref: DataDocument<T>, data: T): Promise<void>;
|
|
16
16
|
update<T extends Data>(ref: DataDocument<T>, updates: Update<T>): Promise<void>;
|
|
17
17
|
delete<T extends Data>(ref: DataDocument<T>): Promise<void>;
|
|
18
|
-
getQuery<T extends Data>(ref: DataQuery<T>): Promise<
|
|
19
|
-
subscribeQuery<T extends Data>(ref: DataQuery<T>, observer: Observer<
|
|
18
|
+
getQuery<T extends Data>(ref: DataQuery<T>): Promise<Entries<T>>;
|
|
19
|
+
subscribeQuery<T extends Data>(ref: DataQuery<T>, observer: Observer<Entries<T>>): Unsubscriber;
|
|
20
20
|
setQuery<T extends Data>(ref: DataQuery<T>, data: T): Promise<number>;
|
|
21
21
|
updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): Promise<number>;
|
|
22
22
|
deleteQuery<T extends Data>(ref: DataQuery<T>): Promise<number>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Firestore } from "firebase/firestore/lite";
|
|
2
|
-
import { Provider, DataDocument, DataQuery, Result, Update, AsynchronousProvider, Data,
|
|
2
|
+
import { Provider, DataDocument, DataQuery, Result, Update, AsynchronousProvider, Data, Entries, Unsubscriber } from "../../index.js";
|
|
3
3
|
/**
|
|
4
4
|
* Firestore Lite client database provider.
|
|
5
5
|
* - Works with the Firebase JS SDK.
|
|
@@ -15,7 +15,7 @@ export declare class FirestoreClientProvider extends Provider implements Asynchr
|
|
|
15
15
|
set<T extends Data>(ref: DataDocument<T>, data: T): Promise<void>;
|
|
16
16
|
update<T extends Data>(ref: DataDocument<T>, updates: Update<T>): Promise<void>;
|
|
17
17
|
delete<T extends Data>(ref: DataDocument<T>): Promise<void>;
|
|
18
|
-
getQuery<T extends Data>(ref: DataQuery<T>): Promise<
|
|
18
|
+
getQuery<T extends Data>(ref: DataQuery<T>): Promise<Entries<T>>;
|
|
19
19
|
subscribeQuery(): Unsubscriber;
|
|
20
20
|
setQuery<T extends Data>(ref: DataQuery<T>, data: T | Update<T> | undefined): Promise<number>;
|
|
21
21
|
updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): Promise<number>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Firestore } from "@google-cloud/firestore";
|
|
2
|
-
import { Provider, DataDocument, DataQuery, Observer, Result, Update, Data, AsynchronousProvider, Entry,
|
|
2
|
+
import { Provider, DataDocument, DataQuery, Observer, Result, Update, Data, AsynchronousProvider, 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
|
|
@@ -14,7 +14,7 @@ export declare class FirestoreServerProvider extends Provider implements Asynchr
|
|
|
14
14
|
update<T extends Data>(ref: DataDocument<T>, updates: Update<T>): Promise<void>;
|
|
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
|
-
subscribeQuery<T extends Data>(ref: DataQuery<T>, observer: Observer<
|
|
17
|
+
subscribeQuery<T extends Data>(ref: DataQuery<T>, observer: Observer<Entries<T>>): Unsubscriber;
|
|
18
18
|
setQuery<T extends Data>(ref: DataQuery<T>, data: T | Update<T> | undefined): Promise<number>;
|
|
19
19
|
updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): Promise<number>;
|
|
20
20
|
deleteQuery<T extends Data>(ref: DataQuery<T>): Promise<number>;
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"state-management",
|
|
12
12
|
"query-builder"
|
|
13
13
|
],
|
|
14
|
-
"version": "1.
|
|
14
|
+
"version": "1.39.0",
|
|
15
15
|
"repository": "https://github.com/dhoulb/shelving",
|
|
16
16
|
"author": "Dave Houlbrooke <dave@shax.com>",
|
|
17
17
|
"license": "0BSD",
|
|
@@ -60,12 +60,12 @@
|
|
|
60
60
|
},
|
|
61
61
|
"devDependencies": {
|
|
62
62
|
"@google-cloud/firestore": "^4.15.1",
|
|
63
|
-
"@types/jest": "^27.0
|
|
64
|
-
"@types/react": "^17.0.
|
|
63
|
+
"@types/jest": "^27.4.0",
|
|
64
|
+
"@types/react": "^17.0.38",
|
|
65
65
|
"@types/react-dom": "^17.0.11",
|
|
66
|
-
"@typescript-eslint/eslint-plugin": "^5.
|
|
67
|
-
"@typescript-eslint/parser": "^5.
|
|
68
|
-
"eslint": "^8.
|
|
66
|
+
"@typescript-eslint/eslint-plugin": "^5.8.1",
|
|
67
|
+
"@typescript-eslint/parser": "^5.8.1",
|
|
68
|
+
"eslint": "^8.6.0",
|
|
69
69
|
"eslint-config-prettier": "^8.3.0",
|
|
70
70
|
"eslint-plugin-import": "^2.25.3",
|
|
71
71
|
"eslint-plugin-prettier": "^4.0.0",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MutableObject, Result, Observer, Unsubscriber, Observable,
|
|
1
|
+
import { MutableObject, Result, Observer, Unsubscriber, Observable, Entries, Results, Data } from "../util/index.js";
|
|
2
2
|
import type { DataDocument, DataQuery } from "../db/index.js";
|
|
3
3
|
import { ThroughProvider } from "./ThroughProvider.js";
|
|
4
4
|
/**
|
|
@@ -19,8 +19,8 @@ export declare class BatchProvider extends ThroughProvider {
|
|
|
19
19
|
/** Await a result and delete it from get requests when done. */
|
|
20
20
|
private _awaitDocument;
|
|
21
21
|
subscribe<T extends Data>(ref: DataDocument<T>, observer: Observer<Result<T>>): Unsubscriber;
|
|
22
|
-
getQuery<T extends Data>(ref: DataQuery<T>):
|
|
22
|
+
getQuery<T extends Data>(ref: DataQuery<T>): Entries<T> | Promise<Entries<T>>;
|
|
23
23
|
/** Await a set of results and delete from get requests when done. */
|
|
24
24
|
private _awaitDocuments;
|
|
25
|
-
subscribeQuery<T extends Data>(ref: DataQuery<T>, observer: Observer<
|
|
25
|
+
subscribeQuery<T extends Data>(ref: DataQuery<T>, observer: Observer<Results<T>>): Unsubscriber;
|
|
26
26
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isAsync,
|
|
1
|
+
import { isAsync, getMap, awaitNext, ResultsObserver } from "../util/index.js";
|
|
2
2
|
import { LazyState } from "../stream/index.js";
|
|
3
3
|
import { ThroughProvider } from "./ThroughProvider.js";
|
|
4
4
|
/** How long to wait after all subscriptions have ended to close the source subscription. */
|
|
@@ -66,7 +66,7 @@ export class BatchProvider extends ThroughProvider {
|
|
|
66
66
|
/** Await a set of results and delete from get requests when done. */
|
|
67
67
|
async _awaitDocuments(ref, asyncResults) {
|
|
68
68
|
// Convert the iterable to a map because it might be read multiple times.
|
|
69
|
-
const results =
|
|
69
|
+
const results = getMap(await asyncResults);
|
|
70
70
|
const key = ref.toString();
|
|
71
71
|
delete this._gets[key];
|
|
72
72
|
return results;
|
|
@@ -80,7 +80,7 @@ export class BatchProvider extends ThroughProvider {
|
|
|
80
80
|
const sub = ((_a = this._subs)[key] || (_a[key] = new LazyState(STOP_DELAY).from(o => {
|
|
81
81
|
var _a;
|
|
82
82
|
// Convert the iterable to a map because it might be read multiple times.
|
|
83
|
-
const stop = super.subscribeQuery(ref, new
|
|
83
|
+
const stop = super.subscribeQuery(ref, new ResultsObserver(o));
|
|
84
84
|
// The first value from the subscription can be reused for any concurrent get requests.
|
|
85
85
|
(_a = this._gets)[key] || (_a[key] = this._awaitDocuments(ref, awaitNext(sub)));
|
|
86
86
|
return () => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { DataDocument, DataQuery } from "../db/index.js";
|
|
2
2
|
import { Update } from "../update/index.js";
|
|
3
|
-
import { Result, Unsubscriber, Observer,
|
|
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";
|
|
6
6
|
import { ThroughProvider } from "./ThroughProvider.js";
|
|
@@ -23,10 +23,10 @@ export declare class CacheProvider extends ThroughProvider implements Asynchrono
|
|
|
23
23
|
set<T extends Data>(ref: DataDocument<T>, data: T): Promise<void>;
|
|
24
24
|
update<T extends Data>(ref: DataDocument<T>, updates: Update<T>): Promise<void>;
|
|
25
25
|
delete<T extends Data>(ref: DataDocument<T>): Promise<void>;
|
|
26
|
-
/** Cache a set of document
|
|
27
|
-
private
|
|
28
|
-
getQuery<T extends Data>(ref: DataQuery<T>): Promise<
|
|
29
|
-
subscribeQuery<T extends Data>(ref: DataQuery<T>, observer: Observer<
|
|
26
|
+
/** Cache a set of document entries. */
|
|
27
|
+
private _cacheEntries;
|
|
28
|
+
getQuery<T extends Data>(ref: DataQuery<T>): Promise<Entries<T>>;
|
|
29
|
+
subscribeQuery<T extends Data>(ref: DataQuery<T>, observer: Observer<Entries<T>>): Unsubscriber;
|
|
30
30
|
setQuery<T extends Data>(ref: DataQuery<T>, data: T): Promise<number>;
|
|
31
31
|
updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): Promise<number>;
|
|
32
32
|
deleteQuery<T extends Data>(ref: DataQuery<T>): Promise<number>;
|
|
@@ -53,17 +53,17 @@ export class CacheProvider extends ThroughProvider {
|
|
|
53
53
|
await super.delete(ref);
|
|
54
54
|
this.cache.delete(ref);
|
|
55
55
|
}
|
|
56
|
-
/** Cache a set of document
|
|
57
|
-
*
|
|
56
|
+
/** Cache a set of document entries. */
|
|
57
|
+
*_cacheEntries(ref, entries) {
|
|
58
58
|
// We know the received set of results is the 'complete' set of results for this query.
|
|
59
59
|
// So for correctness any documents matching this query that aren't in the new set of results should be deleted.
|
|
60
60
|
// None of this applies if there's a query limit, because the document could have been moved to a different page so shouldn't be deleted.
|
|
61
61
|
if (!ref.limit)
|
|
62
62
|
for (const id of Object.keys(this.cache.getQuery(ref)))
|
|
63
|
-
if (!(id in
|
|
63
|
+
if (!(id in entries))
|
|
64
64
|
this.cache.delete(ref.doc(id));
|
|
65
65
|
// Save new results to the cache.
|
|
66
|
-
for (const [id, data] of
|
|
66
|
+
for (const [id, data] of entries) {
|
|
67
67
|
this.cache.set(ref.doc(id), data);
|
|
68
68
|
yield [id, data];
|
|
69
69
|
}
|
|
@@ -72,11 +72,11 @@ export class CacheProvider extends ThroughProvider {
|
|
|
72
72
|
}
|
|
73
73
|
// Override to cache any got results.
|
|
74
74
|
async getQuery(ref) {
|
|
75
|
-
return this.
|
|
75
|
+
return this._cacheEntries(ref, await super.getQuery(ref));
|
|
76
76
|
}
|
|
77
77
|
// Override to cache any got results.
|
|
78
78
|
subscribeQuery(ref, observer) {
|
|
79
|
-
return super.subscribeQuery(ref, new TransformObserver(
|
|
79
|
+
return super.subscribeQuery(ref, new TransformObserver(entries => this._cacheEntries(ref, entries), observer));
|
|
80
80
|
}
|
|
81
81
|
async setQuery(ref, data) {
|
|
82
82
|
const count = await super.setQuery(ref, data);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Data, Result,
|
|
1
|
+
import { Data, Result, Entries, Unsubscriber, Observer } from "../util/index.js";
|
|
2
2
|
import { Update } from "../update/index.js";
|
|
3
3
|
import { DataQuery, DataDocument } from "../db/index.js";
|
|
4
4
|
import { Provider, SynchronousProvider } from "./Provider.js";
|
|
@@ -17,8 +17,8 @@ export declare class MemoryProvider extends Provider implements SynchronousProvi
|
|
|
17
17
|
set<T extends Data>(ref: DataDocument<T>, data: T): void;
|
|
18
18
|
update<T extends Data>(ref: DataDocument<T>, updates: Update<T>): void;
|
|
19
19
|
delete<T extends Data>(ref: DataDocument<T>): void;
|
|
20
|
-
getQuery<T extends Data>(ref: DataQuery<T>):
|
|
21
|
-
subscribeQuery<T extends Data>(ref: DataQuery<T>, observer: Observer<
|
|
20
|
+
getQuery<T extends Data>(ref: DataQuery<T>): Entries<T>;
|
|
21
|
+
subscribeQuery<T extends Data>(ref: DataQuery<T>, observer: Observer<Entries<T>>): Unsubscriber;
|
|
22
22
|
setQuery<T extends Data>(ref: DataQuery<T>, data: T): number;
|
|
23
23
|
updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): number;
|
|
24
24
|
deleteQuery<T extends Data>(ref: DataQuery<T>): number;
|
package/provider/Provider.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Observer, Unsubscriber, Result,
|
|
1
|
+
import type { Observer, Unsubscriber, Result, Entries, Data } from "../util/index.js";
|
|
2
2
|
import type { DataDocument, DataQuery } from "../db/Database.js";
|
|
3
3
|
import type { Update } from "../update/index.js";
|
|
4
4
|
/** Provides access to data (e.g. IndexedDB, Firebase, or in-memory cache providers). */
|
|
@@ -61,7 +61,7 @@ export declare abstract class Provider {
|
|
|
61
61
|
* @param ref Documents reference specifying which collection to get documents from.
|
|
62
62
|
* @return Set of results in `id: data` format.
|
|
63
63
|
*/
|
|
64
|
-
abstract getQuery<T extends Data>(ref: DataQuery<T>):
|
|
64
|
+
abstract getQuery<T extends Data>(ref: DataQuery<T>): Entries<T> | PromiseLike<Entries<T>>;
|
|
65
65
|
/**
|
|
66
66
|
* Subscribe to all matching documents.
|
|
67
67
|
* - `next()` is called once with the initial results, and again any time the results change.
|
|
@@ -71,7 +71,7 @@ export declare abstract class Provider {
|
|
|
71
71
|
*
|
|
72
72
|
* @return Function that ends the subscription.
|
|
73
73
|
*/
|
|
74
|
-
abstract subscribeQuery<T extends Data>(ref: DataQuery<T>, observer: Observer<
|
|
74
|
+
abstract subscribeQuery<T extends Data>(ref: DataQuery<T>, observer: Observer<Entries<T>>): Unsubscriber;
|
|
75
75
|
/**
|
|
76
76
|
* Set the data of all matching documents.
|
|
77
77
|
*
|
|
@@ -102,7 +102,7 @@ export interface SynchronousProvider extends Provider {
|
|
|
102
102
|
set<T extends Data>(ref: DataDocument<T>, value: T): void;
|
|
103
103
|
update<T extends Data>(ref: DataDocument<T>, value: Update<T>): void;
|
|
104
104
|
delete<T extends Data>(ref: DataDocument<T>): void;
|
|
105
|
-
getQuery<T extends Data>(ref: DataQuery<T>):
|
|
105
|
+
getQuery<T extends Data>(ref: DataQuery<T>): Entries<T>;
|
|
106
106
|
setQuery<T extends Data>(ref: DataQuery<T>, value: T): number;
|
|
107
107
|
updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): number;
|
|
108
108
|
deleteQuery<T extends Data>(ref: DataQuery<T>): number;
|
|
@@ -114,7 +114,7 @@ export interface AsynchronousProvider extends Provider {
|
|
|
114
114
|
set<T extends Data>(ref: DataDocument<T>, value: T): PromiseLike<void>;
|
|
115
115
|
update<T extends Data>(ref: DataDocument<T>, updates: Update<T>): PromiseLike<void>;
|
|
116
116
|
delete<T extends Data>(ref: DataDocument<T>): PromiseLike<void>;
|
|
117
|
-
getQuery<T extends Data>(ref: DataQuery<T>): PromiseLike<
|
|
117
|
+
getQuery<T extends Data>(ref: DataQuery<T>): PromiseLike<Entries<T>>;
|
|
118
118
|
setQuery<T extends Data>(ref: DataQuery<T>, value: T): PromiseLike<number>;
|
|
119
119
|
updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): PromiseLike<number>;
|
|
120
120
|
deleteQuery<T extends Data>(ref: DataQuery<T>): PromiseLike<number>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Result,
|
|
1
|
+
import type { Result, Entries, Unsubscriber, Observer, Class, Data } from "../util/index.js";
|
|
2
2
|
import type { DataDocument, DataQuery } from "../db/index.js";
|
|
3
3
|
import type { Update } from "../update/index.js";
|
|
4
4
|
import { Provider } from "./Provider.js";
|
|
@@ -14,8 +14,8 @@ export declare class ThroughProvider extends Provider {
|
|
|
14
14
|
set<T extends Data>(ref: DataDocument<T>, data: T): void | PromiseLike<void>;
|
|
15
15
|
update<T extends Data>(ref: DataDocument<T>, updates: Update<T>): void | PromiseLike<void>;
|
|
16
16
|
delete<T extends Data>(ref: DataDocument<T>): void | PromiseLike<void>;
|
|
17
|
-
getQuery<T extends Data>(ref: DataQuery<T>):
|
|
18
|
-
subscribeQuery<T extends Data>(ref: DataQuery<T>, observer: Observer<
|
|
17
|
+
getQuery<T extends Data>(ref: DataQuery<T>): Entries<T> | PromiseLike<Entries<T>>;
|
|
18
|
+
subscribeQuery<T extends Data>(ref: DataQuery<T>, observer: Observer<Entries<T>>): Unsubscriber;
|
|
19
19
|
setQuery<T extends Data>(ref: DataQuery<T>, data: T): number | PromiseLike<number>;
|
|
20
20
|
updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): number | PromiseLike<number>;
|
|
21
21
|
deleteQuery<T extends Data>(ref: DataQuery<T>): number | PromiseLike<number>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { DataDocument, DataQuery } from "../db/index.js";
|
|
2
|
-
import { Data, Result, Unsubscriber, Observer,
|
|
2
|
+
import { Data, Result, Unsubscriber, Observer, Entries } from "../util/index.js";
|
|
3
3
|
import { Update } from "../update/index.js";
|
|
4
4
|
import { ThroughProvider } from "./ThroughProvider.js";
|
|
5
5
|
/** Validates any values that are read from or written to a source provider. */
|
|
@@ -9,8 +9,8 @@ export declare class ValidationProvider extends ThroughProvider {
|
|
|
9
9
|
add<T extends Data>(ref: DataQuery<T>, data: T): string | PromiseLike<string>;
|
|
10
10
|
set<T extends Data>(ref: DataDocument<T>, value: T): void | PromiseLike<void>;
|
|
11
11
|
update<T extends Data>(ref: DataDocument<T>, updates: Update<T>): void | PromiseLike<void>;
|
|
12
|
-
getQuery<T extends Data>(ref: DataQuery<T>):
|
|
13
|
-
subscribeQuery<T extends Data>(ref: DataQuery<T>, observer: Observer<
|
|
12
|
+
getQuery<T extends Data>(ref: DataQuery<T>): Entries<T> | PromiseLike<Entries<T>>;
|
|
13
|
+
subscribeQuery<T extends Data>(ref: DataQuery<T>, observer: Observer<Entries<T>>): Unsubscriber;
|
|
14
14
|
setQuery<T extends Data>(ref: DataQuery<T>, value: T): number | PromiseLike<number>;
|
|
15
15
|
updateQuery<T extends Data>(ref: DataQuery<T>, updates: Update<T>): number | PromiseLike<number>;
|
|
16
16
|
}
|
package/query/Filter.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Data, Entry, Matchable,
|
|
1
|
+
import { Data, Entry, Matchable, Entries, ImmutableArray } from "../util/index.js";
|
|
2
2
|
import { Rule } from "./Rule.js";
|
|
3
3
|
import { FilterOperator, QueryKey } from "./types.js";
|
|
4
4
|
/**
|
|
@@ -14,13 +14,12 @@ export declare abstract class Filter<T extends Data, V extends unknown = unknown
|
|
|
14
14
|
readonly value: V;
|
|
15
15
|
constructor(key: QueryKey<T>, value: V);
|
|
16
16
|
abstract match([id, data]: Entry<T>, target: void): boolean;
|
|
17
|
-
transform(
|
|
17
|
+
transform(entries: Entries<T>): Entries<T>;
|
|
18
18
|
toString(): string;
|
|
19
19
|
}
|
|
20
20
|
/** Filter a set of values with an `IS` clause. */
|
|
21
21
|
export declare class EqualFilter<T extends Data> extends Filter<T> {
|
|
22
22
|
readonly operator = "IS";
|
|
23
|
-
readonly matcher: (item: unknown, target: unknown) => boolean;
|
|
24
23
|
match([id, data]: Entry<T>): boolean;
|
|
25
24
|
}
|
|
26
25
|
/** Filter a set of values with an `NOT` clause. */
|
|
@@ -33,28 +32,28 @@ export declare class InArrayFilter<T extends Data> extends Filter<T, ImmutableAr
|
|
|
33
32
|
readonly operator = "IN";
|
|
34
33
|
match([id, data]: Entry<T>): boolean;
|
|
35
34
|
}
|
|
36
|
-
/** Filter a set of values with
|
|
37
|
-
export declare class
|
|
35
|
+
/** Filter a set of values with a `CONTAINS` clause. */
|
|
36
|
+
export declare class ArrayWithFilter<T extends Data> extends Filter<T> {
|
|
38
37
|
readonly operator = "CONTAINS";
|
|
39
38
|
match([id, data]: Entry<T>): boolean;
|
|
40
39
|
}
|
|
41
40
|
/** Filter a set of values with an `LT` clause. */
|
|
42
|
-
export declare class
|
|
41
|
+
export declare class LessFilter<T extends Data> extends Filter<T> {
|
|
43
42
|
readonly operator = "LT";
|
|
44
43
|
match([id, data]: Entry<T>): boolean;
|
|
45
44
|
}
|
|
46
45
|
/** Filter a set of values with an `LTE` clause. */
|
|
47
|
-
export declare class
|
|
46
|
+
export declare class EqualLessFilter<T extends Data> extends Filter<T> {
|
|
48
47
|
readonly operator = "LTE";
|
|
49
48
|
match([id, data]: Entry<T>): boolean;
|
|
50
49
|
}
|
|
51
50
|
/** Filter a set of values with an `GT` clause. */
|
|
52
|
-
export declare class
|
|
51
|
+
export declare class GreaterFilter<T extends Data> extends Filter<T> {
|
|
53
52
|
readonly operator = "GT";
|
|
54
53
|
match([id, data]: Entry<T>): boolean;
|
|
55
54
|
}
|
|
56
55
|
/** Filter a set of values with an `GTE` clause. */
|
|
57
|
-
export declare class
|
|
56
|
+
export declare class EqualGreaterFilter<T extends Data> extends Filter<T> {
|
|
58
57
|
readonly operator = "GTE";
|
|
59
58
|
match([id, data]: Entry<T>): boolean;
|
|
60
59
|
}
|