shelving 1.105.0 → 1.106.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 (77) hide show
  1. package/change/Change.d.ts +83 -0
  2. package/change/Change.js +67 -0
  3. package/change/index.d.ts +1 -0
  4. package/change/index.js +1 -0
  5. package/db/CollectionReference.d.ts +61 -39
  6. package/db/CollectionReference.js +73 -41
  7. package/db/Database.d.ts +65 -39
  8. package/db/Database.js +70 -28
  9. package/db/ItemReference.d.ts +13 -30
  10. package/db/ItemReference.js +9 -12
  11. package/db/ItemState.d.ts +9 -7
  12. package/db/ItemState.js +15 -13
  13. package/db/QueryReference.d.ts +18 -12
  14. package/db/QueryReference.js +27 -22
  15. package/db/QueryState.d.ts +8 -7
  16. package/db/QueryState.js +15 -13
  17. package/db/index.d.ts +0 -1
  18. package/db/index.js +0 -1
  19. package/firestore/client/FirestoreClientProvider.d.ts +1 -1
  20. package/firestore/client/FirestoreClientProvider.js +1 -1
  21. package/firestore/lite/FirestoreLiteProvider.d.ts +1 -1
  22. package/firestore/lite/FirestoreLiteProvider.js +1 -1
  23. package/firestore/server/FirestoreServerProvider.d.ts +1 -1
  24. package/firestore/server/FirestoreServerProvider.js +1 -1
  25. package/index.d.ts +1 -0
  26. package/index.js +1 -0
  27. package/package.json +2 -1
  28. package/provider/CacheProvider.d.ts +1 -1
  29. package/provider/DebugProvider.d.ts +3 -3
  30. package/provider/MemoryProvider.d.ts +17 -17
  31. package/provider/MemoryProvider.js +1 -1
  32. package/provider/Provider.d.ts +31 -3
  33. package/provider/Provider.js +1 -1
  34. package/provider/ThroughProvider.d.ts +1 -1
  35. package/provider/ValidationProvider.d.ts +6 -6
  36. package/provider/ValidationProvider.js +3 -3
  37. package/react/{createCache.d.ts → createCacheContext.d.ts} +4 -6
  38. package/react/{createCache.js → createCacheContext.js} +7 -4
  39. package/react/createDataContext.d.ts +19 -0
  40. package/react/createDataContext.js +29 -0
  41. package/react/index.d.ts +3 -3
  42. package/react/index.js +3 -5
  43. package/schema/AllowSchema.js +3 -4
  44. package/schema/ColorSchema.d.ts +1 -6
  45. package/schema/ColorSchema.js +13 -9
  46. package/schema/EmailSchema.d.ts +1 -6
  47. package/schema/EmailSchema.js +9 -6
  48. package/schema/KeySchema.d.ts +4 -6
  49. package/schema/KeySchema.js +5 -5
  50. package/schema/LinkSchema.d.ts +1 -4
  51. package/schema/LinkSchema.js +8 -4
  52. package/schema/OptionalSchema.js +0 -1
  53. package/schema/PhoneSchema.d.ts +0 -4
  54. package/schema/PhoneSchema.js +10 -6
  55. package/schema/Schema.d.ts +6 -6
  56. package/schema/Schema.js +1 -1
  57. package/schema/SlugSchema.d.ts +2 -4
  58. package/schema/SlugSchema.js +8 -3
  59. package/test/basics.d.ts +1 -1
  60. package/test/people.d.ts +1 -1
  61. package/test/util.d.ts +2 -2
  62. package/test/util.js +3 -3
  63. package/util/duration.js +8 -8
  64. package/util/index.d.ts +1 -0
  65. package/util/index.js +1 -0
  66. package/util/item.d.ts +23 -0
  67. package/util/item.js +21 -0
  68. package/util/optional.d.ts +2 -0
  69. package/util/optional.js +2 -0
  70. package/util/units.d.ts +6 -6
  71. package/util/units.js +11 -13
  72. package/util/validate.d.ts +7 -0
  73. package/util/validate.js +0 -1
  74. package/db/Change.d.ts +0 -43
  75. package/db/Change.js +0 -35
  76. package/react/useData.d.ts +0 -15
  77. package/react/useData.js +0 -16
@@ -0,0 +1,83 @@
1
+ import type { AsyncProvider, Provider } from "../provider/Provider.js";
2
+ import type { ImmutableArray } from "../util/array.js";
3
+ import type { Data } from "../util/data.js";
4
+ import type { ItemQuery } from "../util/item.js";
5
+ import type { Updates } from "../util/update.js";
6
+ import { type Optional } from "../util/optional.js";
7
+ /** A change to a database. */
8
+ export interface Change {
9
+ readonly action: string;
10
+ }
11
+ /** A change to a database collection. */
12
+ export interface CollectionChange<T extends Data> extends Change {
13
+ readonly collection: string;
14
+ readonly id?: string | never;
15
+ readonly query?: ItemQuery<T> | never;
16
+ }
17
+ /** Add an item to a database collection. */
18
+ export interface AddItemChange<T extends Data> extends CollectionChange<T> {
19
+ readonly action: "add";
20
+ readonly id?: never;
21
+ readonly query?: never;
22
+ readonly data: T;
23
+ }
24
+ /** Change an item in a database collection. */
25
+ export interface ItemChange<T extends Data> extends CollectionChange<T> {
26
+ readonly id: string;
27
+ readonly query?: never;
28
+ }
29
+ /** Set an item in a database collection. */
30
+ export interface SetItemChange<T extends Data> extends ItemChange<T> {
31
+ readonly action: "set";
32
+ readonly data: T;
33
+ }
34
+ /** Update an item in a database collection. */
35
+ export interface UpdateItemChange<T extends Data> extends ItemChange<T> {
36
+ readonly action: "update";
37
+ readonly updates: Updates<T>;
38
+ }
39
+ /** Delete an item in a database collection. */
40
+ export interface DeleteItemChange<T extends Data> extends ItemChange<T> {
41
+ readonly action: "delete";
42
+ }
43
+ /** Change multiple items in a database collection. */
44
+ export interface QueryChange<T extends Data> extends CollectionChange<T> {
45
+ readonly query: ItemQuery<T>;
46
+ readonly id?: never;
47
+ }
48
+ /** Set multiple items in a database collection. */
49
+ export interface SetQueryChange<T extends Data> extends QueryChange<T> {
50
+ readonly action: "set";
51
+ readonly data: T;
52
+ }
53
+ /** Update multiple items in a database collection. */
54
+ export interface UpdateQueryChange<T extends Data> extends QueryChange<T> {
55
+ readonly action: "update";
56
+ readonly updates: Updates<T>;
57
+ }
58
+ /** Delete multiple items in a database collection. */
59
+ export interface DeleteQueryChange<T extends Data> extends QueryChange<T> {
60
+ readonly action: "delete";
61
+ }
62
+ /** Write an item in a database collection. */
63
+ export type WriteItemChange<T extends Data> = SetItemChange<T> | UpdateItemChange<T> | DeleteItemChange<T>;
64
+ /** Write multiple item in a database collection. */
65
+ export type WriteQueryChange<T extends Data> = SetQueryChange<T> | UpdateQueryChange<T> | DeleteQueryChange<T>;
66
+ /** Write an item or multiple items in a database collection. */
67
+ export type WriteChange<T extends Data> = AddItemChange<T> | WriteItemChange<T> | WriteQueryChange<T>;
68
+ /** Write a set of changes to a synchronous provider. */
69
+ export declare function writeProviderChanges<T extends Data>(provider: Provider, ...changes: Optional<WriteChange<T>>[]): ImmutableArray<WriteChange<T>>;
70
+ /**
71
+ * Write a single change to a synchronous provider.
72
+ * @param change Change that should be written.
73
+ * @return Change that was written.
74
+ */
75
+ export declare function writeProviderChange<T extends Data>(provider: Provider, change: WriteChange<T>): WriteChange<T>;
76
+ /** Write a set of changes to an asynchronous provider. */
77
+ export declare function writeAsyncProviderChanges<T extends Data>(provider: AsyncProvider, ...changes: Optional<WriteChange<T>>[]): Promise<ImmutableArray<WriteChange<T>>>;
78
+ /**
79
+ * Write a single change to an asynchronous provider.
80
+ * @param change Change that should be written.
81
+ * @return Change that was written.
82
+ */
83
+ export declare function writeAsyncProviderChange<T extends Data>(provider: AsyncProvider, change: WriteChange<T>): Promise<WriteChange<T>>;
@@ -0,0 +1,67 @@
1
+ import { notOptional } from "../util/optional.js";
2
+ /** Write a set of changes to a synchronous provider. */
3
+ export function writeProviderChanges(provider, ...changes) {
4
+ return changes.filter(notOptional).map(change => writeProviderChange(provider, change));
5
+ }
6
+ /**
7
+ * Write a single change to a synchronous provider.
8
+ * @param change Change that should be written.
9
+ * @return Change that was written.
10
+ */
11
+ export function writeProviderChange(provider, change) {
12
+ const { action, collection, id, query } = change;
13
+ if (action === "add") {
14
+ // `add` change returns a `set` change so it includes the ID to reflect the change that was written.
15
+ return { action: "set", collection, id: provider.addItem(collection, change.data), data: change.data };
16
+ }
17
+ else if (id) {
18
+ if (action === "set")
19
+ provider.setItem(collection, id, change.data);
20
+ else if (action === "update")
21
+ provider.updateItem(collection, id, change.updates);
22
+ else if (action === "delete")
23
+ provider.deleteItem(collection, id);
24
+ }
25
+ else if (query) {
26
+ if (action === "set")
27
+ provider.setQuery(collection, query, change.data);
28
+ else if (action === "update")
29
+ provider.updateQuery(collection, query, change.updates);
30
+ else if (action === "delete")
31
+ provider.deleteQuery(collection, query);
32
+ }
33
+ return change;
34
+ }
35
+ /** Write a set of changes to an asynchronous provider. */
36
+ export function writeAsyncProviderChanges(provider, ...changes) {
37
+ return Promise.all(changes.filter(notOptional).map(change => writeAsyncProviderChange(provider, change)));
38
+ }
39
+ /**
40
+ * Write a single change to an asynchronous provider.
41
+ * @param change Change that should be written.
42
+ * @return Change that was written.
43
+ */
44
+ export async function writeAsyncProviderChange(provider, change) {
45
+ const { collection, action, id, query } = change;
46
+ if (action === "add") {
47
+ // `add` change returns a `set` change so it includes the ID to reflect the change that was written.
48
+ return { action: "set", collection, id: await provider.addItem(collection, change.data), data: change.data };
49
+ }
50
+ else if (id) {
51
+ if (action === "set")
52
+ await provider.setItem(collection, id, change.data);
53
+ else if (action === "update")
54
+ await provider.updateItem(collection, id, change.updates);
55
+ else if (action === "delete")
56
+ await provider.deleteItem(collection, id);
57
+ }
58
+ else if (query) {
59
+ if (action === "set")
60
+ await provider.setQuery(collection, query, change.data);
61
+ else if (action === "update")
62
+ await provider.updateQuery(collection, query, change.updates);
63
+ else if (action === "delete")
64
+ await provider.deleteQuery(collection, query);
65
+ }
66
+ return change;
67
+ }
@@ -0,0 +1 @@
1
+ export * from "./Change.js";
@@ -0,0 +1 @@
1
+ export * from "./Change.js";
@@ -1,13 +1,13 @@
1
- import type { AddChange, DeleteChange, SetChange, UpdateChange } from "./Change.js";
2
- import type { ItemArray, ItemData, ItemQuery, ItemValue } from "./ItemReference.js";
3
- import type { AsyncProvider, Provider } from "../provider/Provider.js";
1
+ import type { AddItemChange, DeleteItemChange, DeleteQueryChange, SetItemChange, SetQueryChange, UpdateItemChange, UpdateQueryChange } from "../change/Change.js";
2
+ import type { AbstractProvider, AsyncProvider, Provider } from "../provider/Provider.js";
4
3
  import type { Data } from "../util/data.js";
4
+ import type { ItemArray, ItemData, ItemQuery, ItemValue } from "../util/item.js";
5
5
  import type { Updates } from "../util/update.js";
6
6
  import { AsyncItemReference, ItemReference } from "./ItemReference.js";
7
7
  import { AsyncQueryReference, QueryReference } from "./QueryReference.js";
8
8
  /** Reference to a collection in a synchronous or asynchronous provider. */
9
9
  declare abstract class AbstractCollectionReference<T extends Data = Data> {
10
- abstract readonly provider: Provider | AsyncProvider;
10
+ abstract readonly provider: AbstractProvider;
11
11
  readonly collection: string;
12
12
  constructor(collection: string);
13
13
  /**
@@ -15,16 +15,16 @@ declare abstract class AbstractCollectionReference<T extends Data = Data> {
15
15
  * @return Array of entities.
16
16
  */
17
17
  abstract items: ItemArray<T> | PromiseLike<ItemArray<T>>;
18
- /**
19
- * Count the number of results of this set of items.
20
- * @return Number of items matching the query (possibly promised).
21
- */
22
- abstract count: number | PromiseLike<number>;
23
18
  /**
24
19
  * Does at least one item exist for this query?
25
20
  * @return `true` if a item exists or `false` otherwise (possibly promised).
26
21
  */
27
22
  abstract exists: boolean | PromiseLike<boolean>;
23
+ /**
24
+ * Count the number of results of this set of items.
25
+ * @return Number of items matching the query (possibly promised).
26
+ */
27
+ abstract count: number | PromiseLike<number>;
28
28
  /**
29
29
  * Get the first item matched by this query or `null` if this query has no results.
30
30
  * @throws RequiredError if there were no results for this query.
@@ -44,24 +44,38 @@ declare abstract class AbstractCollectionReference<T extends Data = Data> {
44
44
  abstract query(query?: ItemQuery<T>): QueryReference<T> | AsyncQueryReference<T>;
45
45
  /** Create a query on this item's collection. */
46
46
  abstract item(id: string): ItemReference<T> | AsyncItemReference<T>;
47
- /** Get an item from this collection. */
48
- abstract get(id: string): ItemValue<T> | Promise<ItemValue<T>>;
49
- /** Add an item to this collection. */
50
- abstract add(data: T): string | Promise<string>;
51
- /** Set a document in this collection. */
52
- abstract set(id: string, data: T): void | Promise<void>;
53
- /** Update a document in this collection. */
54
- abstract update(id: string, updates: Updates<T>): void | Promise<void>;
55
- /** Delete a document in this collection. */
56
- abstract delete(id: string): void | Promise<void>;
57
- /** Get an add change for this collection. */
58
- getAdd(data: T): AddChange<T>;
59
- /** Get a set change for this collection. */
60
- getSet(id: string, data: T): SetChange<T>;
61
- /** Get an update change for this collection. */
62
- getUpdate(id: string, updates: Updates<T>): UpdateChange<T>;
63
- /** Get a delete change for this collection. */
64
- getDelete(id: string): DeleteChange;
47
+ /** Get an add change for an item in a database collection. */
48
+ getItemAdd(data: T): AddItemChange<T>;
49
+ /** Get a set change for an item in a database collection. */
50
+ getItemSet(id: string, data: T): SetItemChange<T>;
51
+ /** Get an update change for an item in a database collection. */
52
+ getItemUpdate(id: string, updates: Updates<T>): UpdateItemChange<T>;
53
+ /** Get a delete change for an item in a database collection. */
54
+ getItemDelete(id: string): DeleteItemChange<T>;
55
+ /** Get a set change for multiple items in a database collection. */
56
+ getQuerySet(query: ItemQuery<T>, data: T): SetQueryChange<T>;
57
+ /** Get an update change for multiple items in a database collection. */
58
+ getQueryUpdate(query: ItemQuery<T>, updates: Updates<T>): UpdateQueryChange<T>;
59
+ /** Get a delete change for multiple items in a database collection. */
60
+ getQueryDelete(query: ItemQuery<T>): DeleteQueryChange<T>;
61
+ /** Add an item to a database collection. */
62
+ abstract addItem(data: T): string | Promise<string>;
63
+ /** Get an item from a database collection. */
64
+ abstract getItem(id: string): ItemValue<T> | Promise<ItemValue<T>>;
65
+ /** Set an item to a database collection. */
66
+ abstract setItem(id: string, data: T): void | Promise<void>;
67
+ /** Update an item to a database collection. */
68
+ abstract updateItem(id: string, updates: Updates<T>): void | Promise<void>;
69
+ /** Delete an item to a database collection. */
70
+ abstract deleteItem(id: string): void | Promise<void>;
71
+ /** Get multiple items from a database collection. */
72
+ abstract getQuery(query: ItemQuery<T>): ItemArray<T> | Promise<ItemArray<T>>;
73
+ /** Set multiple items in a database collection. */
74
+ abstract setQuery(query: ItemQuery<T>, data: T): number | Promise<number>;
75
+ /** Update multiple items in a database collection. */
76
+ abstract updateQuery(query: ItemQuery<T>, updates: Updates<T>): number | Promise<number>;
77
+ /** Delete multiple items in a database collection. */
78
+ abstract deleteQuery(query: ItemQuery<T>): number | Promise<number>;
65
79
  toString(): string;
66
80
  }
67
81
  /** Reference to a collection in a synchronous provider. */
@@ -69,35 +83,43 @@ export declare class CollectionReference<T extends Data = Data> extends Abstract
69
83
  readonly provider: Provider;
70
84
  constructor(provider: Provider, collection: string);
71
85
  get items(): ItemArray<T>;
72
- get count(): number;
73
86
  get exists(): boolean;
87
+ get count(): number;
74
88
  get first(): ItemValue<T>;
75
89
  get last(): ItemValue<T>;
76
90
  get data(): ItemData<T>;
77
91
  query(constraints?: ItemQuery<T>): QueryReference<T>;
78
92
  item(id: string): ItemReference<T>;
79
- get(id: string): ItemValue<T>;
80
- add(data: T): string;
81
- set(id: string, data: T): void;
82
- update(id: string, updates: Updates<T>): void;
83
- delete(id: string): void;
93
+ addItem(data: T): string;
94
+ getItem(id: string): ItemValue<T>;
95
+ setItem(id: string, data: T): void;
96
+ updateItem(id: string, updates: Updates<T>): void;
97
+ deleteItem(id: string): void;
98
+ getQuery(query: ItemQuery<T>): ItemArray<T>;
99
+ setQuery(query: ItemQuery<T>, data: T): number;
100
+ updateQuery(query: ItemQuery<T>, updates: Updates<T>): number;
101
+ deleteQuery(query: ItemQuery<T>): number;
84
102
  }
85
103
  /** Reference to a collection in an asynchronous provider. */
86
104
  export declare class AsyncCollectionReference<T extends Data = Data> extends AbstractCollectionReference<T> {
87
105
  readonly provider: AsyncProvider;
88
106
  constructor(provider: AsyncProvider, collection: string);
89
107
  get items(): Promise<ItemArray<T>>;
90
- get count(): Promise<number>;
91
108
  get exists(): Promise<boolean>;
109
+ get count(): Promise<number>;
92
110
  get first(): Promise<ItemValue<T>>;
93
111
  get last(): Promise<ItemValue<T>>;
94
112
  get data(): Promise<ItemData<T>>;
95
113
  query(query?: ItemQuery<T>): AsyncQueryReference<T>;
96
114
  item(id: string): AsyncItemReference<T>;
97
- get(id: string): Promise<ItemValue<T>>;
98
- add(data: T): Promise<string>;
99
- set(id: string, data: T): Promise<void>;
100
- update(id: string, updates: Updates<T>): Promise<void>;
101
- delete(id: string): Promise<void>;
115
+ addItem(data: T): Promise<string>;
116
+ getItem(id: string): Promise<ItemValue<T>>;
117
+ setItem(id: string, data: T): Promise<void>;
118
+ updateItem(id: string, updates: Updates<T>): Promise<void>;
119
+ deleteItem(id: string): Promise<void>;
120
+ getQuery(query: ItemQuery<T>): Promise<ItemArray<T>>;
121
+ setQuery(query: ItemQuery<T>, data: T): Promise<number>;
122
+ updateQuery(query: ItemQuery<T>, updates: Updates<T>): Promise<number>;
123
+ deleteQuery(query: ItemQuery<T>): Promise<number>;
102
124
  }
103
125
  export {};
@@ -1,28 +1,42 @@
1
- import { countArray, getFirstItem, getOptionalFirstItem, getOptionalLastItem, isArrayLength } from "../util/array.js";
1
+ import { countArray, getFirstItem, getOptionalFirstItem, getOptionalLastItem } from "../util/array.js";
2
2
  import { AsyncItemReference, ItemReference } from "./ItemReference.js";
3
3
  import { AsyncQueryReference, QueryReference } from "./QueryReference.js";
4
+ const NO_QUERY = {}; // eslint-disable-line @typescript-eslint/no-explicit-any
5
+ const SINGLE_QUERY = { $limit: 1 }; // eslint-disable-line @typescript-eslint/no-explicit-any
4
6
  /** Reference to a collection in a synchronous or asynchronous provider. */
5
7
  class AbstractCollectionReference {
6
8
  collection;
7
9
  constructor(collection) {
8
10
  this.collection = collection;
9
11
  }
10
- /** Get an add change for this collection. */
11
- getAdd(data) {
12
+ /** Get an add change for an item in a database collection. */
13
+ getItemAdd(data) {
12
14
  return { action: "add", collection: this.collection, data };
13
15
  }
14
- /** Get a set change for this collection. */
15
- getSet(id, data) {
16
+ /** Get a set change for an item in a database collection. */
17
+ getItemSet(id, data) {
16
18
  return { action: "set", collection: this.collection, id, data };
17
19
  }
18
- /** Get an update change for this collection. */
19
- getUpdate(id, updates) {
20
+ /** Get an update change for an item in a database collection. */
21
+ getItemUpdate(id, updates) {
20
22
  return { action: "update", collection: this.collection, id, updates };
21
23
  }
22
- /** Get a delete change for this collection. */
23
- getDelete(id) {
24
+ /** Get a delete change for an item in a database collection. */
25
+ getItemDelete(id) {
24
26
  return { action: "delete", collection: this.collection, id };
25
27
  }
28
+ /** Get a set change for multiple items in a database collection. */
29
+ getQuerySet(query, data) {
30
+ return { action: "set", collection: this.collection, query, data };
31
+ }
32
+ /** Get an update change for multiple items in a database collection. */
33
+ getQueryUpdate(query, updates) {
34
+ return { action: "update", collection: this.collection, query, updates };
35
+ }
36
+ /** Get a delete change for multiple items in a database collection. */
37
+ getQueryDelete(query) {
38
+ return { action: "delete", collection: this.collection, query };
39
+ }
26
40
  // Implement toString()
27
41
  toString() {
28
42
  return this.collection;
@@ -36,22 +50,22 @@ export class CollectionReference extends AbstractCollectionReference {
36
50
  this.provider = provider;
37
51
  }
38
52
  get items() {
39
- return _getItemArray(this);
53
+ return this.provider.getQuery(this.collection, NO_QUERY);
54
+ }
55
+ get exists() {
56
+ return !!this.first;
40
57
  }
41
58
  get count() {
42
59
  return this.items.length;
43
60
  }
44
- get exists() {
45
- return !!_getSingleItemArray(this).length;
46
- }
47
61
  get first() {
48
- return getOptionalFirstItem(_getSingleItemArray(this));
62
+ return getOptionalFirstItem(this.provider.getQuery(this.collection, SINGLE_QUERY));
49
63
  }
50
64
  get last() {
51
65
  return getOptionalLastItem(this.items);
52
66
  }
53
67
  get data() {
54
- return getFirstItem(_getSingleItemArray(this));
68
+ return getFirstItem(this.provider.getQuery(this.collection, SINGLE_QUERY));
55
69
  }
56
70
  query(constraints) {
57
71
  return new QueryReference(this.provider, this.collection, constraints);
@@ -59,21 +73,33 @@ export class CollectionReference extends AbstractCollectionReference {
59
73
  item(id) {
60
74
  return new ItemReference(this.provider, this.collection, id);
61
75
  }
62
- get(id) {
63
- return this.provider.getItem(this.collection, id);
64
- }
65
- add(data) {
76
+ addItem(data) {
66
77
  return this.provider.addItem(this.collection, data);
67
78
  }
68
- set(id, data) {
79
+ getItem(id) {
80
+ return this.provider.getItem(this.collection, id);
81
+ }
82
+ setItem(id, data) {
69
83
  return this.provider.setItem(this.collection, id, data);
70
84
  }
71
- update(id, updates) {
85
+ updateItem(id, updates) {
72
86
  return this.provider.updateItem(this.collection, id, updates);
73
87
  }
74
- delete(id) {
88
+ deleteItem(id) {
75
89
  return this.provider.deleteItem(this.collection, id);
76
90
  }
91
+ getQuery(query) {
92
+ return this.provider.getQuery(this.collection, query);
93
+ }
94
+ setQuery(query, data) {
95
+ return this.provider.setQuery(this.collection, query, data);
96
+ }
97
+ updateQuery(query, updates) {
98
+ return this.provider.updateQuery(this.collection, query, updates);
99
+ }
100
+ deleteQuery(query) {
101
+ return this.provider.deleteQuery(this.collection, query);
102
+ }
77
103
  }
78
104
  /** Reference to a collection in an asynchronous provider. */
79
105
  export class AsyncCollectionReference extends AbstractCollectionReference {
@@ -83,22 +109,22 @@ export class AsyncCollectionReference extends AbstractCollectionReference {
83
109
  this.provider = provider;
84
110
  }
85
111
  get items() {
86
- return _getItemArray(this);
112
+ return this.provider.getQuery(this.collection, NO_QUERY);
113
+ }
114
+ get exists() {
115
+ return this.first.then(Boolean);
87
116
  }
88
117
  get count() {
89
118
  return this.items.then(countArray);
90
119
  }
91
- get exists() {
92
- return _getSingleItemArray(this).then(isArrayLength);
93
- }
94
120
  get first() {
95
- return _getSingleItemArray(this).then(getOptionalFirstItem);
121
+ return this.provider.getQuery(this.collection, SINGLE_QUERY).then(getOptionalFirstItem);
96
122
  }
97
123
  get last() {
98
124
  return this.items.then(getOptionalLastItem);
99
125
  }
100
126
  get data() {
101
- return _getSingleItemArray(this).then(getFirstItem);
127
+ return this.provider.getQuery(this.collection, SINGLE_QUERY).then(getFirstItem);
102
128
  }
103
129
  query(query) {
104
130
  return new AsyncQueryReference(this.provider, this.collection, query);
@@ -106,25 +132,31 @@ export class AsyncCollectionReference extends AbstractCollectionReference {
106
132
  item(id) {
107
133
  return new AsyncItemReference(this.provider, this.collection, id);
108
134
  }
109
- get(id) {
110
- return this.provider.getItem(this.collection, id);
111
- }
112
- add(data) {
135
+ addItem(data) {
113
136
  return this.provider.addItem(this.collection, data);
114
137
  }
115
- set(id, data) {
138
+ getItem(id) {
139
+ return this.provider.getItem(this.collection, id);
140
+ }
141
+ setItem(id, data) {
116
142
  return this.provider.setItem(this.collection, id, data);
117
143
  }
118
- update(id, updates) {
144
+ updateItem(id, updates) {
119
145
  return this.provider.updateItem(this.collection, id, updates);
120
146
  }
121
- delete(id) {
147
+ deleteItem(id) {
122
148
  return this.provider.deleteItem(this.collection, id);
123
149
  }
124
- }
125
- function _getItemArray({ provider, collection }) {
126
- return provider.getQuery(collection, {});
127
- }
128
- function _getSingleItemArray({ provider, collection }) {
129
- return provider.getQuery(collection, { $limit: 1 });
150
+ getQuery(query) {
151
+ return this.provider.getQuery(this.collection, query);
152
+ }
153
+ setQuery(query, data) {
154
+ return this.provider.setQuery(this.collection, query, data);
155
+ }
156
+ updateQuery(query, updates) {
157
+ return this.provider.updateQuery(this.collection, query, updates);
158
+ }
159
+ deleteQuery(query) {
160
+ return this.provider.deleteQuery(this.collection, query);
161
+ }
130
162
  }
package/db/Database.d.ts CHANGED
@@ -1,41 +1,58 @@
1
- import type { AddChange, DeleteChange, ItemChanges, SetChange, UpdateChange, WriteChange } from "./Change.js";
2
- import type { ItemQuery, ItemValue } from "./ItemReference.js";
3
- import type { AsyncProvider, Provider } from "../provider/Provider.js";
4
- import type { Data, DataKey, Datas } from "../util/data.js";
1
+ import type { AddItemChange, DeleteItemChange, DeleteQueryChange, SetItemChange, SetQueryChange, UpdateItemChange, UpdateQueryChange, WriteChange } from "../change/Change.js";
2
+ import type { AbstractProvider, AsyncProvider, Provider } from "../provider/Provider.js";
3
+ import type { ImmutableArray } from "../util/array.js";
4
+ import type { DataKey, DataValue, Datas } from "../util/data.js";
5
+ import type { ItemArray, ItemQuery, ItemValue } from "../util/item.js";
5
6
  import type { Optional } from "../util/optional.js";
6
7
  import type { Updates } from "../util/update.js";
7
8
  import { AsyncCollectionReference, CollectionReference } from "./CollectionReference.js";
8
9
  import { AsyncItemReference, ItemReference } from "./ItemReference.js";
9
10
  import { AsyncQueryReference, QueryReference } from "./QueryReference.js";
10
11
  /** Database with a synchronous or asynchronous provider. */
11
- declare abstract class AbstractDatabase<T extends Datas> {
12
- abstract readonly provider: Provider | AsyncProvider;
12
+ export declare abstract class AbstractDatabase<T extends Datas> {
13
+ abstract readonly provider: AbstractProvider;
13
14
  /** Create a query on a collection in this database. */
14
15
  abstract collection<K extends DataKey<T>>(collection: K): CollectionReference<T[K]> | AsyncCollectionReference<T[K]>;
15
16
  /** Create a query on a collection in this database. */
16
17
  abstract query<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): QueryReference<T[K]> | AsyncQueryReference<T[K]>;
17
18
  /** Reference an item in a collection in this database. */
18
19
  abstract item<K extends DataKey<T>>(collection: K, id: string): ItemReference<T[K]> | AsyncItemReference<T[K]>;
19
- /** Run a set of changes in this database. */
20
- abstract change(...changes: Optional<WriteChange<Data>>[]): ItemChanges | Promise<ItemChanges>;
21
- /** Get a document from a collection in this database. */
22
- abstract get<K extends DataKey<T>>(collection: K, id: string): ItemValue<T[K]> | Promise<ItemValue<T[K]>>;
23
- /** Add a document to a collection in this database. */
24
- abstract add<K extends DataKey<T>>(collection: K, data: T[K]): string | Promise<string>;
25
- /** Set a document in a collection in this database. */
26
- abstract set<K extends DataKey<T>>(collection: K, id: string, data: T[K]): void | Promise<void>;
27
- /** Update a document in a collection in this database. */
28
- abstract update<K extends DataKey<T>>(collection: K, id: string, updates: Updates<T[K]>): void | Promise<void>;
29
- /** Delete a document from a collection in this database. */
30
- abstract delete<K extends DataKey<T>>(collection: K, id: string): void | Promise<void>;
31
- /** Get an add change for a collection in this database. */
32
- getAdd<K extends DataKey<T>>(collection: K, data: T[K]): AddChange<T[K]>;
33
- /** Get a set change for a collection in this database. */
34
- getSet<K extends DataKey<T>>(collection: K, id: string, data: T[K]): SetChange<T[K]>;
35
- /** Get an update change for a collection in this database. */
36
- getUpdate<K extends DataKey<T>>(collection: K, id: string, updates: Updates<T[K]>): UpdateChange<T[K]>;
37
- /** Get a delete change for a collection in this database. */
38
- getDelete<K extends DataKey<T>>(collection: K, id: string): DeleteChange;
20
+ /** Get an add change for an item in a database collection. */
21
+ getItemAdd<K extends DataKey<T>>(collection: K, data: T[K]): AddItemChange<T[K]>;
22
+ /** Get a set change for an item in a database collection. */
23
+ getItemSet<K extends DataKey<T>>(collection: K, id: string, data: T[K]): SetItemChange<T[K]>;
24
+ /** Get an update change for an item in a database collection. */
25
+ getItemUpdate<K extends DataKey<T>>(collection: K, id: string, updates: Updates<T[K]>): UpdateItemChange<T[K]>;
26
+ /** Get a delete change for an item in a database collection. */
27
+ getItemDelete<K extends DataKey<T>>(collection: K, id: string): DeleteItemChange<T[K]>;
28
+ /** Get a set change for multiple items in a database collection. */
29
+ getQuerySet<K extends DataKey<T>>(collection: K, query: ItemQuery<T>, data: T[K]): SetQueryChange<T[K]>;
30
+ /** Get an update change for multiple items in a database collection. */
31
+ getQueryUpdate<K extends DataKey<T>>(collection: K, query: ItemQuery<T>, updates: Updates<T[K]>): UpdateQueryChange<T[K]>;
32
+ /** Get a delete change for multiple items in a database collection. */
33
+ getQueryDelete<K extends DataKey<T>>(collection: K, query: ItemQuery<T>): DeleteQueryChange<T>;
34
+ /** Add an item to a database collection. */
35
+ abstract addItem<K extends DataKey<T>>(collection: K, data: T[K]): string | Promise<string>;
36
+ /** Get an item from a database collection. */
37
+ abstract getItem<K extends DataKey<T>>(collection: K, id: string): ItemValue<T[K]> | Promise<ItemValue<T[K]>>;
38
+ /** Set an item to a database collection. */
39
+ abstract setItem<K extends DataKey<T>>(collection: K, id: string, data: T[K]): void | Promise<void>;
40
+ /** Update an item to a database collection. */
41
+ abstract updateItem<K extends DataKey<T>>(collection: K, id: string, updates: Updates<T[K]>): void | Promise<void>;
42
+ /** Delete an item to a database collection. */
43
+ abstract deleteItem<K extends DataKey<T>>(collection: K, id: string): void | Promise<void>;
44
+ /** Get multiple items from a database collection. */
45
+ abstract getQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): ItemArray<T[K]> | Promise<ItemArray<T[K]>>;
46
+ /** Set multiple items in a database collection. */
47
+ abstract setQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, data: T[K]): number | Promise<number>;
48
+ /** Update multiple items in a database collection. */
49
+ abstract updateQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, updates: Updates<T[K]>): number | Promise<number>;
50
+ /** Delete multiple items in a database collection. */
51
+ abstract deleteQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): number | Promise<number>;
52
+ /** Write a single change to this database. */
53
+ abstract writeChange<K extends DataKey<T>>(change: WriteChange<T[K]>): WriteChange<T[K]> | PromiseLike<WriteChange<T[K]>>;
54
+ /** Write a set of changes to this database. */
55
+ abstract writeChanges(...changes: Optional<WriteChange<DataValue<T>>>[]): ImmutableArray<WriteChange<DataValue<T>>> | PromiseLike<ImmutableArray<WriteChange<DataValue<T>>>>;
39
56
  }
40
57
  /** Database with a synchronous provider. */
41
58
  export declare class Database<T extends Datas = Datas> extends AbstractDatabase<T> {
@@ -44,12 +61,17 @@ export declare class Database<T extends Datas = Datas> extends AbstractDatabase<
44
61
  collection<K extends DataKey<T>>(collection: K): CollectionReference<T[K]>;
45
62
  query<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): QueryReference<T[K]>;
46
63
  item<K extends DataKey<T>>(collection: K, id: string): ItemReference<T[K]>;
47
- change(...changes: Optional<WriteChange<Data>>[]): ItemChanges;
48
- get<K extends DataKey<T>>(collection: K, id: string): ItemValue<T[K]>;
49
- add<K extends DataKey<T>>(collection: K, data: T[K]): string;
50
- set<K extends DataKey<T>>(collection: K, id: string, data: T[K]): void;
51
- update<K extends DataKey<T>>(collection: K, id: string, updates: Updates<T[K]>): void;
52
- delete<K extends DataKey<T>>(collection: K, id: string): void;
64
+ addItem<K extends DataKey<T>>(collection: K, data: T[K]): string;
65
+ getItem<K extends DataKey<T>>(collection: K, id: string): ItemValue<T[K]>;
66
+ setItem<K extends DataKey<T>>(collection: K, id: string, data: T[K]): void;
67
+ updateItem<K extends DataKey<T>>(collection: K, id: string, updates: Updates<T[K]>): void;
68
+ deleteItem<K extends DataKey<T>>(collection: K, id: string): void;
69
+ getQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): ItemArray<T[K]>;
70
+ setQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, data: T[K]): number;
71
+ updateQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, updates: Updates<T[K]>): number;
72
+ deleteQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): number;
73
+ writeChange<K extends DataKey<T>>(change: WriteChange<T[K]>): WriteChange<T[K]>;
74
+ writeChanges(...changes: Optional<WriteChange<DataValue<T>>>[]): ImmutableArray<WriteChange<DataValue<T>>>;
53
75
  }
54
76
  /** Database with a synchronous provider. */
55
77
  export declare class AsyncDatabase<T extends Datas = Datas> extends AbstractDatabase<T> {
@@ -58,11 +80,15 @@ export declare class AsyncDatabase<T extends Datas = Datas> extends AbstractData
58
80
  collection<K extends DataKey<T>>(collection: K): AsyncCollectionReference<T[K]>;
59
81
  query<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): AsyncQueryReference<T[K]>;
60
82
  item<K extends DataKey<T>>(collection: K, id: string): AsyncItemReference<T[K]>;
61
- change(...changes: Optional<WriteChange<Data>>[]): Promise<ItemChanges>;
62
- get<K extends DataKey<T>>(collection: K, id: string): Promise<ItemValue<T[K]>>;
63
- add<K extends DataKey<T>>(collection: K, data: T[K]): Promise<string>;
64
- set<K extends DataKey<T>>(collection: K, id: string, data: T[K]): Promise<void>;
65
- update<K extends DataKey<T>>(collection: K, id: string, updates: Updates<T[K]>): Promise<void>;
66
- delete<K extends DataKey<T>>(collection: K, id: string): Promise<void>;
83
+ addItem<K extends DataKey<T>>(collection: K, data: T[K]): Promise<string>;
84
+ getItem<K extends DataKey<T>>(collection: K, id: string): Promise<ItemValue<T[K]>>;
85
+ setItem<K extends DataKey<T>>(collection: K, id: string, data: T[K]): Promise<void>;
86
+ updateItem<K extends DataKey<T>>(collection: K, id: string, updates: Updates<T[K]>): Promise<void>;
87
+ deleteItem<K extends DataKey<T>>(collection: K, id: string): Promise<void>;
88
+ getQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): Promise<ItemArray<T[K]>>;
89
+ setQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, data: T[K]): Promise<number>;
90
+ updateQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, updates: Updates<T[K]>): Promise<number>;
91
+ deleteQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): Promise<number>;
92
+ writeChange<K extends DataKey<T>>(change: WriteChange<T[K]>): PromiseLike<WriteChange<T[K]>>;
93
+ writeChanges(...changes: Optional<WriteChange<DataValue<T>>>[]): PromiseLike<ImmutableArray<WriteChange<DataValue<T>>>>;
67
94
  }
68
- export {};