shelving 1.22.2 → 1.23.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 (62) hide show
  1. package/db/Database.d.ts +13 -27
  2. package/db/Database.js +23 -29
  3. package/db/Pagination.js +1 -1
  4. package/db/Write.d.ts +28 -0
  5. package/db/Write.js +32 -0
  6. package/db/index.d.ts +1 -1
  7. package/db/index.js +1 -1
  8. package/package.json +1 -1
  9. package/provider/BatchProvider.js +2 -2
  10. package/provider/CacheProvider.js +3 -3
  11. package/provider/MemoryProvider.js +6 -6
  12. package/query/Filter.d.ts +1 -1
  13. package/query/Filter.js +1 -1
  14. package/query/Filters.d.ts +1 -1
  15. package/query/Filters.js +1 -1
  16. package/query/Query.d.ts +1 -1
  17. package/query/Query.js +2 -2
  18. package/query/Rule.d.ts +3 -3
  19. package/query/Sort.d.ts +1 -1
  20. package/query/Sort.js +1 -1
  21. package/query/Sorts.d.ts +1 -1
  22. package/query/Sorts.js +1 -1
  23. package/react/useQuery.js +2 -2
  24. package/stream/DataState.d.ts +2 -2
  25. package/stream/DataState.js +2 -2
  26. package/stream/State.d.ts +4 -4
  27. package/stream/State.js +2 -2
  28. package/stream/Stream.d.ts +7 -7
  29. package/stream/Stream.js +5 -5
  30. package/transform/AddEntriesTransform.d.ts +1 -1
  31. package/transform/AddEntriesTransform.js +1 -1
  32. package/transform/AddItemsTransform.d.ts +1 -1
  33. package/transform/AddItemsTransform.js +1 -1
  34. package/transform/DataTransform.d.ts +1 -1
  35. package/transform/DataTransform.js +3 -3
  36. package/transform/IncrementTransform.d.ts +1 -1
  37. package/transform/IncrementTransform.js +1 -1
  38. package/transform/RemoveEntriesTransform.d.ts +1 -1
  39. package/transform/RemoveEntriesTransform.js +1 -1
  40. package/transform/RemoveItemsTransform.d.ts +1 -1
  41. package/transform/RemoveItemsTransform.js +1 -1
  42. package/transform/Transform.d.ts +3 -3
  43. package/transform/hydrations.d.ts +1 -1
  44. package/transform/hydrations.js +1 -1
  45. package/transform/util.js +2 -2
  46. package/util/clone.js +3 -3
  47. package/util/filter.d.ts +4 -4
  48. package/util/filter.js +5 -5
  49. package/util/hydrate.d.ts +7 -7
  50. package/util/hydrate.js +13 -13
  51. package/util/index.d.ts +2 -2
  52. package/util/index.js +2 -2
  53. package/util/observable.d.ts +5 -5
  54. package/util/observable.js +6 -6
  55. package/util/sort.d.ts +4 -4
  56. package/util/sort.js +5 -6
  57. package/util/transform.d.ts +88 -0
  58. package/util/transform.js +48 -0
  59. package/db/Change.d.ts +0 -37
  60. package/db/Change.js +0 -60
  61. package/util/derive.d.ts +0 -88
  62. package/util/derive.js +0 -48
package/db/Database.d.ts CHANGED
@@ -2,6 +2,7 @@ import { Entry, Observable, Observer, Result, Unsubscriber, ResultsMap, Validata
2
2
  import { Transform, Transforms } from "../transform/index.js";
3
3
  import type { Provider } from "../provider/Provider.js";
4
4
  import { Filters, Sorts, Query } from "../query/index.js";
5
+ import { Write } from "./Write.js";
5
6
  /**
6
7
  * Combines a database model and a provider.
7
8
  *
@@ -141,37 +142,22 @@ export declare class DataDocument<T extends Data = Data> implements Observable<R
141
142
  * @return Function that ends the subscription.
142
143
  */
143
144
  subscribe(next: Observer<Result<T>> | Dispatcher<[Result<T>]>): Unsubscriber;
144
- /**
145
- * Set the complete data of this document.
146
- *
147
- * @param data Complete data to set the document to.
148
- *
149
- * @return Nothing (possibly promised).
150
- */
145
+ /** Set the complete data of this document. */
151
146
  set(data: T): void | PromiseLike<void>;
152
- /**
153
- * Update this document with partial data.
154
- * - If the document exists, merge the partial data into it.
155
- * - If the document doesn't exist, throw an error.
156
- *
157
- * @param transforms `Transform` instance or set of transforms to apply to the existing document.
158
- * - Not all transforms may be supported by all providers.
159
- *
160
- * @return Nothing (possibly promised).
161
- * @throws Error If the document does not exist (ideally a `RequiredError` but may be provider-specific).
162
- */
147
+ /** Update this document. */
163
148
  update(transforms: Transform<T> | Transforms<T>): void | PromiseLike<void>;
164
- /**
165
- * Delete this document.
166
- * - Will not throw an error if the document doesn't exist.
167
- *
168
- * @return Nothing (possibly promised).
169
- */
149
+ /** Delete this document. */
170
150
  delete(): void | PromiseLike<void>;
171
- /**
172
- * Combine `set()`, `update()`, `delete()` into a single method.
173
- */
151
+ /** Set, update, or delete this document. */
174
152
  write(value: Result<T> | Transform<T>): void | PromiseLike<void>;
153
+ /** Represent a write that sets the complete data of this document in a database. */
154
+ setter(data: T): Write<T>;
155
+ /** Represent a write that updates this document in a database. */
156
+ updater(transforms: Transform<T> | Transforms<T>): Write<T>;
157
+ /** Represent a write that deletes this document in a database. */
158
+ deleter(): Write<T>;
159
+ /** Represent a write that sets, updates, or deletes this document in a database. */
160
+ writer(value: Result<T> | Transform<T>): Write<T>;
175
161
  /** Validate data for this query reference. */
176
162
  validate(unsafeData: Data): T;
177
163
  toString(): string;
package/db/Database.js CHANGED
@@ -1,8 +1,9 @@
1
- import { callAsync, getFirstItem, throwAsync, validate, toMap, countItems, DeriveObserver, } from "../util/index.js";
1
+ import { callAsync, getFirstItem, throwAsync, validate, toMap, countItems, TransformObserver, } from "../util/index.js";
2
2
  import { DataTransform, Transform } from "../transform/index.js";
3
3
  import { Feedback, InvalidFeedback } from "../feedback/index.js";
4
4
  import { Filters, Query, EqualFilter } from "../query/index.js";
5
5
  import { DocumentRequiredError, DocumentValidationError, QueryValidationError } from "./errors.js";
6
+ import { Write } from "./Write.js";
6
7
  /**
7
8
  * Combines a database model and a provider.
8
9
  *
@@ -93,7 +94,7 @@ export class DataQuery extends Query {
93
94
  * @return Function that ends the subscription.
94
95
  */
95
96
  subscribeMap(next) {
96
- return this.provider.subscribeQuery(this, new DeriveObserver(toMap, typeof next === "function" ? { next } : next));
97
+ return this.provider.subscribeQuery(this, new TransformObserver(toMap, typeof next === "function" ? { next } : next));
97
98
  }
98
99
  /**
99
100
  * Set all matching documents to the same exact value.
@@ -208,45 +209,38 @@ export class DataDocument {
208
209
  subscribe(next) {
209
210
  return this.provider.subscribe(this, typeof next === "function" ? { next } : next);
210
211
  }
211
- /**
212
- * Set the complete data of this document.
213
- *
214
- * @param data Complete data to set the document to.
215
- *
216
- * @return Nothing (possibly promised).
217
- */
212
+ /** Set the complete data of this document. */
218
213
  set(data) {
219
214
  return this.write(data);
220
215
  }
221
- /**
222
- * Update this document with partial data.
223
- * - If the document exists, merge the partial data into it.
224
- * - If the document doesn't exist, throw an error.
225
- *
226
- * @param transforms `Transform` instance or set of transforms to apply to the existing document.
227
- * - Not all transforms may be supported by all providers.
228
- *
229
- * @return Nothing (possibly promised).
230
- * @throws Error If the document does not exist (ideally a `RequiredError` but may be provider-specific).
231
- */
216
+ /** Update this document. */
232
217
  update(transforms) {
233
218
  return this.write(transforms instanceof Transform ? transforms : new DataTransform(transforms));
234
219
  }
235
- /**
236
- * Delete this document.
237
- * - Will not throw an error if the document doesn't exist.
238
- *
239
- * @return Nothing (possibly promised).
240
- */
220
+ /** Delete this document. */
241
221
  delete() {
242
222
  return this.write(undefined);
243
223
  }
244
- /**
245
- * Combine `set()`, `update()`, `delete()` into a single method.
246
- */
224
+ /** Set, update, or delete this document. */
247
225
  write(value) {
248
226
  return this.provider.write(this, value);
249
227
  }
228
+ /** Represent a write that sets the complete data of this document in a database. */
229
+ setter(data) {
230
+ return this.writer(data);
231
+ }
232
+ /** Represent a write that updates this document in a database. */
233
+ updater(transforms) {
234
+ return this.writer(transforms instanceof Transform ? transforms : new DataTransform(transforms));
235
+ }
236
+ /** Represent a write that deletes this document in a database. */
237
+ deleter() {
238
+ return this.writer(undefined);
239
+ }
240
+ /** Represent a write that sets, updates, or deletes this document in a database. */
241
+ writer(value) {
242
+ return new Write(this, value);
243
+ }
250
244
  /** Validate data for this query reference. */
251
245
  validate(unsafeData) {
252
246
  try {
package/db/Pagination.js CHANGED
@@ -71,7 +71,7 @@ export class Pagination extends State {
71
71
  * @return The change in the number of results.
72
72
  */
73
73
  merge(more) {
74
- this.next(toMap(this.ref.sorts.derive(yieldMerged(more, this.value))));
74
+ this.next(toMap(this.ref.sorts.transform(yieldMerged(more, this.value))));
75
75
  }
76
76
  /** Iterate over the entries of the values currently in the pagination. */
77
77
  [Symbol.iterator]() {
package/db/Write.d.ts ADDED
@@ -0,0 +1,28 @@
1
+ import { Transform } from "../transform/index.js";
2
+ import { ImmutableArray, Data, Transformable } from "../util/index.js";
3
+ import type { Database, DataDocument } from "./Database.js";
4
+ /** Change transformable. */
5
+ export declare type DatabaseTransformable = Transformable<Database, void | PromiseLike<void>>;
6
+ /** Represent a write made to a single document in a database. */
7
+ export declare class Write<T extends Data> implements Transformable<Database, void | PromiseLike<void>> {
8
+ readonly collection: string;
9
+ readonly id: string;
10
+ readonly value: Data | Transform<Data> | undefined;
11
+ constructor({ collection, id }: DataDocument<T>, value: T | Transform<T> | undefined);
12
+ transform(db: Database): Promise<void>;
13
+ }
14
+ /**
15
+ * Represent a list of writes made to a set of documents in a database.
16
+ * - Sets of writes are predictable and repeatable, so unpredictable operations like `create()` and query operations are not supported.
17
+ * - Every write must be applied to a specific database document in a specific collection and are applied in the specified order.
18
+ */
19
+ export declare class Writes implements Transformable<Database, void | PromiseLike<void>> {
20
+ readonly writes: ImmutableArray<Write<Data>>;
21
+ constructor(...writes: Write<Data>[]);
22
+ transform(db: Database): Promise<void>;
23
+ }
24
+ /** Set of hydrations for all change classes. */
25
+ export declare const DATABASE_HYDRATIONS: {
26
+ changes: typeof Writes;
27
+ change: typeof Write;
28
+ };
package/db/Write.js ADDED
@@ -0,0 +1,32 @@
1
+ import { transform } from "../util/index.js";
2
+ /** Represent a write made to a single document in a database. */
3
+ export class Write {
4
+ constructor({ collection, id }, value) {
5
+ this.collection = collection;
6
+ this.id = id;
7
+ this.value = value;
8
+ }
9
+ async transform(db) {
10
+ await db.doc(this.collection, this.id).write(this.value);
11
+ }
12
+ }
13
+ /**
14
+ * Represent a list of writes made to a set of documents in a database.
15
+ * - Sets of writes are predictable and repeatable, so unpredictable operations like `create()` and query operations are not supported.
16
+ * - Every write must be applied to a specific database document in a specific collection and are applied in the specified order.
17
+ */
18
+ export class Writes {
19
+ constructor(...writes) {
20
+ this.writes = writes;
21
+ }
22
+ async transform(db) {
23
+ for (const writes of this.writes)
24
+ await transform(db, writes);
25
+ }
26
+ }
27
+ /** Set of hydrations for all change classes. */
28
+ export const DATABASE_HYDRATIONS = {
29
+ changes: Writes,
30
+ change: Write,
31
+ };
32
+ DATABASE_HYDRATIONS;
package/db/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export * from "./Database.js";
2
- export * from "./Change.js";
3
2
  export * from "./Pagination.js";
3
+ export * from "./Write.js";
4
4
  export * from "./errors.js";
package/db/index.js CHANGED
@@ -1,4 +1,4 @@
1
1
  export * from "./Database.js";
2
- export * from "./Change.js";
3
2
  export * from "./Pagination.js";
3
+ export * from "./Write.js";
4
4
  export * from "./errors.js";
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "state-management",
12
12
  "query-builder"
13
13
  ],
14
- "version": "1.22.2",
14
+ "version": "1.23.0",
15
15
  "repository": "https://github.com/dhoulb/shelving",
16
16
  "author": "Dave Houlbrooke <dave@shax.com>",
17
17
  "license": "0BSD",
@@ -1,4 +1,4 @@
1
- import { isAsync, toMap, DeriveObserver, awaitNext, } from "../util/index.js";
1
+ import { isAsync, toMap, TransformObserver, awaitNext, } 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. */
@@ -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 DeriveObserver(toMap, o));
83
+ const stop = super.subscribeQuery(ref, new TransformObserver(toMap, 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,5 +1,5 @@
1
1
  import { Transform } from "../transform/index.js";
2
- import { DeriveObserver } from "../util/index.js";
2
+ import { TransformObserver } from "../util/index.js";
3
3
  import { MemoryProvider } from "./MemoryProvider.js";
4
4
  import { ThroughProvider } from "./ThroughProvider.js";
5
5
  /** Keep a copy of received data in a local cache. */
@@ -33,7 +33,7 @@ export class CacheProvider extends ThroughProvider {
33
33
  }
34
34
  // Override to cache any got results.
35
35
  subscribe(ref, observer) {
36
- return super.subscribe(ref, new DeriveObserver(result => this._cacheResult(ref, result), observer));
36
+ return super.subscribe(ref, new TransformObserver(result => this._cacheResult(ref, result), observer));
37
37
  }
38
38
  async add(ref, data) {
39
39
  const id = await super.add(ref, data);
@@ -72,7 +72,7 @@ export class CacheProvider extends ThroughProvider {
72
72
  }
73
73
  // Override to cache any got results.
74
74
  subscribeQuery(ref, observer) {
75
- return super.subscribeQuery(ref, new DeriveObserver(results => this._cacheResults(ref, results), observer));
75
+ return super.subscribeQuery(ref, new TransformObserver(results => this._cacheResults(ref, results), observer));
76
76
  }
77
77
  async writeQuery(ref, value) {
78
78
  await super.writeQuery(ref, value);
@@ -46,19 +46,19 @@ export class MemoryProvider extends Provider {
46
46
  const existing = table.data.get(id);
47
47
  if (!existing)
48
48
  throw new DocumentRequiredError(ref);
49
- table.write(id, value.derive(existing));
49
+ table.write(id, value.transform(existing));
50
50
  }
51
51
  else {
52
52
  table.write(id, value);
53
53
  }
54
54
  }
55
55
  getQuery(ref) {
56
- return ref.derive(this._table(ref).data);
56
+ return ref.transform(this._table(ref).data);
57
57
  }
58
58
  subscribeQuery(ref, observer) {
59
59
  const table = this._table(ref);
60
60
  // Call `next()` immediately with the initial results.
61
- let lastResults = new Map(ref.derive(table.data));
61
+ let lastResults = new Map(ref.transform(table.data));
62
62
  dispatchNext(observer, lastResults);
63
63
  // Possibly call `next()` when the collection changes if any changes affect the subscription.
64
64
  return table.on(changes => {
@@ -68,7 +68,7 @@ export class MemoryProvider extends Provider {
68
68
  // 2) the next document matches the query so might be added to the next results.
69
69
  // Re-running the entire query is not the most efficient way to do this, but itis the most simple!
70
70
  if (lastResults.has(id) || (next && ref.match([id, next]))) {
71
- const nextResults = new Map(ref.derive(table.data));
71
+ const nextResults = new Map(ref.transform(table.data));
72
72
  if (!isMapEqual(lastResults, nextResults)) {
73
73
  lastResults = nextResults;
74
74
  dispatchNext(observer, lastResults);
@@ -82,8 +82,8 @@ export class MemoryProvider extends Provider {
82
82
  const table = this._table(ref);
83
83
  // If there's a limit set: run the full query.
84
84
  // If there's no limit set: only need to run the filtering (more efficient because sort order doesn't matter).
85
- for (const [id, existing] of ref.limit ? ref.derive(table.data) : ref.filters.derive(table.data))
86
- table.write(id, value instanceof Transform ? value.derive(existing) : value);
85
+ for (const [id, existing] of ref.limit ? ref.transform(table.data) : ref.filters.transform(table.data))
86
+ table.write(id, value instanceof Transform ? value.transform(existing) : value);
87
87
  }
88
88
  /** Reset this provider and clear all data. */
89
89
  reset() {
package/query/Filter.d.ts CHANGED
@@ -17,7 +17,7 @@ export declare abstract class Filter<T extends Data> extends Rule<T> implements
17
17
  readonly value: unknown;
18
18
  constructor(key: QueryKey<T>, value: unknown);
19
19
  match([id, data]: Entry<T>): boolean;
20
- derive(results: Results<T>): Results<T>;
20
+ transform(results: Results<T>): Results<T>;
21
21
  toString(): string;
22
22
  }
23
23
  /** Filter a set of values with an `IS` clause. */
package/query/Filter.js CHANGED
@@ -10,7 +10,7 @@ export class Filter extends Rule {
10
10
  match([id, data]) {
11
11
  return match(getQueryProp(id, data, this.key), this.matcher, this.value);
12
12
  }
13
- derive(results) {
13
+ transform(results) {
14
14
  return filterItems(results, this);
15
15
  }
16
16
  toString() {
@@ -13,5 +13,5 @@ export declare class Filters<T extends Data> extends Rules<T, Filter<T>> impleme
13
13
  gt<K extends QueryKey<T>>(key: K, value: K extends "id" ? string : T[K]): this;
14
14
  gte<K extends QueryKey<T>>(key: K, value: K extends "id" ? string : T[K]): this;
15
15
  match(entry: Entry<T>): boolean;
16
- derive(iterable: Results<T>): Results<T>;
16
+ transform(iterable: Results<T>): Results<T>;
17
17
  }
package/query/Filters.js CHANGED
@@ -33,7 +33,7 @@ export class Filters extends Rules {
33
33
  return false;
34
34
  return true;
35
35
  }
36
- derive(iterable) {
36
+ transform(iterable) {
37
37
  return this._rules.length ? filterItems(iterable, this) : iterable;
38
38
  }
39
39
  }
package/query/Query.d.ts CHANGED
@@ -25,6 +25,6 @@ export declare class Query<T extends Data> extends Rule<T> implements Queryable<
25
25
  max(limit: number | null): this;
26
26
  after(id: string, data: T): this;
27
27
  before(id: string, data: T): this;
28
- derive(results: Results<T>): Results<T>;
28
+ transform(results: Results<T>): Results<T>;
29
29
  toString(): string;
30
30
  }
package/query/Query.js CHANGED
@@ -79,8 +79,8 @@ export class Query extends Rule {
79
79
  return { __proto__: Object.getPrototypeOf(this), ...this, filters: new Filters(...filters) };
80
80
  }
81
81
  // Implement `Rule`
82
- derive(results) {
83
- const sorted = this.sorts.derive(this.filters.derive(results));
82
+ transform(results) {
83
+ const sorted = this.sorts.transform(this.filters.transform(results));
84
84
  return typeof this.limit === "number" ? limitItems(sorted, this.limit) : sorted;
85
85
  }
86
86
  // Implement toString()
package/query/Rule.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { Data, Derivable, Results } from "../util/index.js";
1
+ import { Data, Transformable, Results } from "../util/index.js";
2
2
  /** Something that can be used to query against a result set or an array of entries. */
3
- export declare abstract class Rule<T extends Data> implements Derivable<Results<T>, Results<T>> {
4
- abstract derive(results: Results<T>): Results<T>;
3
+ export declare abstract class Rule<T extends Data> implements Transformable<Results<T>, Results<T>> {
4
+ abstract transform(results: Results<T>): Results<T>;
5
5
  abstract toString(): string;
6
6
  }
package/query/Sort.d.ts CHANGED
@@ -10,7 +10,7 @@ export declare abstract class Sort<T extends Data> extends Rule<T> implements Ra
10
10
  readonly key: QueryKey<T>;
11
11
  constructor(key: QueryKey<T>);
12
12
  rank([leftId, leftData]: Entry<T>, [rightId, rightData]: Entry<T>): number;
13
- derive(iterable: Results<T>): Results<T>;
13
+ transform(iterable: Results<T>): Results<T>;
14
14
  toString(): string;
15
15
  }
16
16
  /** Sort a list of values in ascending order. */
package/query/Sort.js CHANGED
@@ -9,7 +9,7 @@ export class Sort extends Rule {
9
9
  rank([leftId, leftData], [rightId, rightData]) {
10
10
  return rank(getQueryProp(leftId, leftData, this.key), this.ranker, getQueryProp(rightId, rightData, this.key));
11
11
  }
12
- derive(iterable) {
12
+ transform(iterable) {
13
13
  return sortItems(iterable, this);
14
14
  }
15
15
  toString() {
package/query/Sorts.d.ts CHANGED
@@ -7,5 +7,5 @@ export declare class Sorts<T extends Data> extends Rules<T, Sort<T>> implements
7
7
  asc(key: QueryKey<T>): this;
8
8
  desc(key: QueryKey<T>): this;
9
9
  rank(left: Entry<T>, right: Entry<T>): number;
10
- derive(iterable: Results<T>): Results<T>;
10
+ transform(iterable: Results<T>): Results<T>;
11
11
  }
package/query/Sorts.js CHANGED
@@ -17,7 +17,7 @@ export class Sorts extends Rules {
17
17
  }
18
18
  return 0;
19
19
  }
20
- derive(iterable) {
20
+ transform(iterable) {
21
21
  return this._rules.length ? sortItems(iterable, this) : iterable;
22
22
  }
23
23
  }
package/react/useQuery.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { useState } from "react";
2
- import { CacheProvider, throwAsync, NOERROR, findSourceProvider, NOVALUE, DeriveObserver, toMap, } from "../index.js";
2
+ import { CacheProvider, throwAsync, NOERROR, findSourceProvider, NOVALUE, TransformObserver, toMap, } from "../index.js";
3
3
  import { usePureEffect } from "./usePureEffect.js";
4
4
  import { usePureMemo } from "./usePureMemo.js";
5
5
  import { usePureState } from "./usePureState.js";
@@ -37,7 +37,7 @@ function getCachedResults(ref) {
37
37
  function subscribeEffect(ref, maxAge, next, error) {
38
38
  if (ref) {
39
39
  const provider = findSourceProvider(ref.provider, CacheProvider);
40
- const observer = new DeriveObserver(toMap, { next, error });
40
+ const observer = new TransformObserver(toMap, { next, error });
41
41
  const stopCache = provider.cache.subscribeQuery(ref, observer);
42
42
  if (maxAge === true) {
43
43
  // If `maxAge` is true subscribe to the source for as long as this component is attached.
@@ -1,9 +1,9 @@
1
- import { Key, Data, Derivers } from "../util/index.js";
1
+ import { Key, Data, Transformers } from "../util/index.js";
2
2
  import { State } from "./State.js";
3
3
  /** State that stores an array and has additional methods to help with that. */
4
4
  export declare class DataState<T extends Data> extends State<T> {
5
5
  /** Set a prop in this object to a new value. */
6
6
  set<K extends Key<T>>(key: K, value: T[K]): void;
7
7
  /** Update several props in this object. */
8
- update(updates: Derivers<T>): void;
8
+ update(updates: Transformers<T>): void;
9
9
  }
@@ -1,4 +1,4 @@
1
- import { withProp, deriveData } from "../util/index.js";
1
+ import { withProp, transformData } from "../util/index.js";
2
2
  import { State } from "./State.js";
3
3
  /** State that stores an array and has additional methods to help with that. */
4
4
  export class DataState extends State {
@@ -8,6 +8,6 @@ export class DataState extends State {
8
8
  }
9
9
  /** Update several props in this object. */
10
10
  update(updates) {
11
- this.next(deriveData(this.value, updates));
11
+ this.next(transformData(this.value, updates));
12
12
  }
13
13
  }
package/stream/State.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Deriver, LOADING, ObserverType, NOERROR, Observer } from "../util/index.js";
1
+ import { Transformer, LOADING, ObserverType, NOERROR, Observer } from "../util/index.js";
2
2
  import { Stream } from "./Stream.js";
3
3
  /** Any state (useful for `extends AnySubscribable` clauses). */
4
4
  export declare type AnyState = State<any>;
@@ -14,8 +14,8 @@ export declare type AnyState = State<any>;
14
14
  * */
15
15
  export interface State<T> {
16
16
  to(): State<T>;
17
- derive<TT>(deriver: Deriver<T, TT>): State<TT>;
18
- deriveAsync<TT>(deriver: Deriver<T, Promise<TT>>): State<TT>;
17
+ derive<TT>(deriver: Transformer<T, TT>): State<TT>;
18
+ deriveAsync<TT>(deriver: Transformer<T, Promise<TT>>): State<TT>;
19
19
  }
20
20
  export declare class State<T> extends Stream<T> {
21
21
  static [Symbol.species]: typeof State;
@@ -33,7 +33,7 @@ export declare class State<T> extends Stream<T> {
33
33
  /** Is there a current value, or is it still loading. */
34
34
  get loading(): boolean;
35
35
  /** Apply a deriver to this state. */
36
- apply(deriver: Deriver<T, T>): void;
36
+ apply(deriver: Transformer<T, T>): void;
37
37
  error(reason: Error | unknown): void;
38
38
  _on(observer: Observer<T>): void;
39
39
  protected _dispatch(value: T): void;
package/stream/State.js CHANGED
@@ -1,5 +1,5 @@
1
1
  var _a;
2
- import { LOADING, NOERROR, dispatchNext, dispatchError, dispatchComplete, derive, getRequired, awaitNext, } from "../util/index.js";
2
+ import { LOADING, NOERROR, dispatchNext, dispatchError, dispatchComplete, transform, getRequired, awaitNext, } from "../util/index.js";
3
3
  import { Stream } from "./Stream.js";
4
4
  export class State extends Stream {
5
5
  constructor() {
@@ -36,7 +36,7 @@ export class State extends Stream {
36
36
  }
37
37
  /** Apply a deriver to this state. */
38
38
  apply(deriver) {
39
- this.next(derive(this.value, deriver));
39
+ this.next(transform(this.value, deriver));
40
40
  }
41
41
  // Override to save the reason at `this.reason` and clean up.
42
42
  error(reason) {
@@ -1,4 +1,4 @@
1
- import { Deriver, ObserverType, Subscribable, Unsubscriber, Observer, Observable, Constructor, Dispatcher } from "../util/index.js";
1
+ import { Transformer, ObserverType, Subscribable, Unsubscriber, Observer, Observable, Constructor, Dispatcher } from "../util/index.js";
2
2
  /** Any stream (useful for `extends AnyStream` clauses). */
3
3
  export declare type AnyStream = Stream<any>;
4
4
  /**
@@ -44,12 +44,12 @@ export declare class Stream<T> implements Observer<T>, Observable<T> {
44
44
  /** Create a new stream from this stream. */
45
45
  to<O extends AnyStream>(target: O): O;
46
46
  to(): Stream<T>;
47
- /** Derive a new stream from this stream using a deriver. */
48
- derive<O extends AnyStream>(deriver: Deriver<T, ObserverType<O>>, target: O): O;
49
- derive<TT>(deriver: Deriver<T, TT>): Stream<T>;
50
- /** Derive a new stream from this stream using an async deriver. */
51
- deriveAsync<O extends AnyStream>(deriver: Deriver<T, Promise<ObserverType<O>>>, target: O): O;
52
- deriveAsync<TT>(deriver: Deriver<T, Promise<TT>>): Stream<T>;
47
+ /** Derive a new stream from this stream using a transformer. */
48
+ derive<O extends AnyStream>(transformer: Transformer<T, ObserverType<O>>, target: O): O;
49
+ derive<TT>(transformer: Transformer<T, TT>): Stream<T>;
50
+ /** Derive a new stream from this stream using an async transformer. */
51
+ deriveAsync<O extends AnyStream>(transformer: Transformer<T, Promise<ObserverType<O>>>, target: O): O;
52
+ deriveAsync<TT>(transformer: Transformer<T, Promise<TT>>): Stream<T>;
53
53
  /**
54
54
  * Subscribe to this stream and return an unsubscriber function.
55
55
  * - Allows either an `Observer` object or separate `next()`, `error()` and `complete()` functions.
package/stream/Stream.js CHANGED
@@ -1,5 +1,5 @@
1
1
  var _a;
2
- import { AsyncObserver, DeriveObserver, dispatchNext, dispatchError, dispatchComplete, subscribe, dispatch, } from "../util/index.js";
2
+ import { AsyncObserver, TransformObserver, dispatchNext, dispatchError, dispatchComplete, subscribe, dispatch, } from "../util/index.js";
3
3
  import { ConditionError } from "../error/index.js";
4
4
  /**
5
5
  * Simple stream.
@@ -89,12 +89,12 @@ export class Stream {
89
89
  target.during(this, target);
90
90
  return target;
91
91
  }
92
- derive(deriver, target = new this.constructor[Symbol.species]()) {
93
- target.during(this, new DeriveObserver(deriver, target));
92
+ derive(transformer, target = new this.constructor[Symbol.species]()) {
93
+ target.during(this, new TransformObserver(transformer, target));
94
94
  return target;
95
95
  }
96
- deriveAsync(deriver, target = new this.constructor[Symbol.species]()) {
97
- target.during(this, new DeriveObserver(deriver, new AsyncObserver(target)));
96
+ deriveAsync(transformer, target = new this.constructor[Symbol.species]()) {
97
+ target.during(this, new TransformObserver(transformer, new AsyncObserver(target)));
98
98
  return target;
99
99
  }
100
100
  /**
@@ -4,7 +4,7 @@ import { Transform } from "./Transform.js";
4
4
  export declare class AddEntriesTransform<T> extends Transform<ImmutableObject<T>> implements Iterable<Entry<T>> {
5
5
  readonly props: ImmutableObject<T>;
6
6
  constructor(props: ImmutableObject<T>);
7
- derive(existing?: unknown): ImmutableObject<T>;
7
+ transform(existing?: unknown): ImmutableObject<T>;
8
8
  /** Iterate over the entries. */
9
9
  [Symbol.iterator](): Iterator<Entry<T>, void>;
10
10
  }
@@ -6,7 +6,7 @@ export class AddEntriesTransform extends Transform {
6
6
  super();
7
7
  this.props = props;
8
8
  }
9
- derive(existing) {
9
+ transform(existing) {
10
10
  return isObject(existing) ? withEntries(existing, this.props) : {};
11
11
  }
12
12
  /** Iterate over the entries. */
@@ -4,7 +4,7 @@ import { Transform } from "./Transform.js";
4
4
  export declare class AddItemsTransform<T> extends Transform<ImmutableArray<T>> implements Iterable<T> {
5
5
  readonly items: ImmutableArray<T>;
6
6
  constructor(...items: ImmutableArray<T>);
7
- derive(existing?: unknown): ImmutableArray<T>;
7
+ transform(existing?: unknown): ImmutableArray<T>;
8
8
  /** Iterate over the items. */
9
9
  [Symbol.iterator](): Iterator<T, void>;
10
10
  }
@@ -6,7 +6,7 @@ export class AddItemsTransform extends Transform {
6
6
  super();
7
7
  this.items = items;
8
8
  }
9
- derive(existing) {
9
+ transform(existing) {
10
10
  return isArray(existing) ? withItems(existing, this.items) : this.items;
11
11
  }
12
12
  /** Iterate over the items. */
@@ -14,7 +14,7 @@ export declare type Transforms<T extends Data> = {
14
14
  export declare class DataTransform<T extends Data> extends Transform<T> implements Iterable<Prop<Transforms<T>>> {
15
15
  readonly transforms: Transforms<T>;
16
16
  constructor(transforms: Transforms<T>);
17
- derive(existing: T): T;
17
+ transform(existing: T): T;
18
18
  /** Return a new object with the specified additional transform. */
19
19
  prop<K extends Key<T>>(key: K, transform: T[K] | Transform<T[K]>): this;
20
20
  /** Return a new object with the specified additional transforms. */