@iamjulianacosta/mobx-data 1.0.1
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/LICENSE +21 -0
- package/README.md +366 -0
- package/dist/CacheHandler-BTU_rYkv.js +208 -0
- package/dist/CacheHandler-BTU_rYkv.js.map +1 -0
- package/dist/CacheHandler-CXgY9IJo.cjs +2 -0
- package/dist/CacheHandler-CXgY9IJo.cjs.map +1 -0
- package/dist/EmbeddedRecordsMixin-CBvqNdgC.cjs +2 -0
- package/dist/EmbeddedRecordsMixin-CBvqNdgC.cjs.map +1 -0
- package/dist/EmbeddedRecordsMixin-VoHluHCT.js +261 -0
- package/dist/EmbeddedRecordsMixin-VoHluHCT.js.map +1 -0
- package/dist/JsonApiSerializer-CC5HXp4b.js +194 -0
- package/dist/JsonApiSerializer-CC5HXp4b.js.map +1 -0
- package/dist/JsonApiSerializer-CKB02AgP.cjs +2 -0
- package/dist/JsonApiSerializer-CKB02AgP.cjs.map +1 -0
- package/dist/MemoryAdapter-Bx1e7ndV.js +123 -0
- package/dist/MemoryAdapter-Bx1e7ndV.js.map +1 -0
- package/dist/MemoryAdapter-D1cTyydm.cjs +2 -0
- package/dist/MemoryAdapter-D1cTyydm.cjs.map +1 -0
- package/dist/ODataAdapter-C4IHK4BK.js +157 -0
- package/dist/ODataAdapter-C4IHK4BK.js.map +1 -0
- package/dist/ODataAdapter-DyyF1sdA.cjs +2 -0
- package/dist/ODataAdapter-DyyF1sdA.cjs.map +1 -0
- package/dist/RestAdapter-B4aRvs4m.js +355 -0
- package/dist/RestAdapter-B4aRvs4m.js.map +1 -0
- package/dist/RestAdapter-CJOwTsKK.cjs +2 -0
- package/dist/RestAdapter-CJOwTsKK.cjs.map +1 -0
- package/dist/SchemaService-DZwkFgZu.js +102 -0
- package/dist/SchemaService-DZwkFgZu.js.map +1 -0
- package/dist/SchemaService-Di_yjVzU.cjs +2 -0
- package/dist/SchemaService-Di_yjVzU.cjs.map +1 -0
- package/dist/Serializer-95gi5edy.cjs +2 -0
- package/dist/Serializer-95gi5edy.cjs.map +1 -0
- package/dist/Serializer-FxJbsZ50.js +139 -0
- package/dist/Serializer-FxJbsZ50.js.map +1 -0
- package/dist/Store-BdwMrbDi.cjs +2 -0
- package/dist/Store-BdwMrbDi.cjs.map +1 -0
- package/dist/Store-CZ7Z-Nme.js +912 -0
- package/dist/Store-CZ7Z-Nme.js.map +1 -0
- package/dist/adapter/Adapter.d.ts +146 -0
- package/dist/adapter/Adapter.d.ts.map +1 -0
- package/dist/adapter/MemoryAdapter.d.ts +44 -0
- package/dist/adapter/MemoryAdapter.d.ts.map +1 -0
- package/dist/adapter/RestAdapter.d.ts +57 -0
- package/dist/adapter/RestAdapter.d.ts.map +1 -0
- package/dist/adapter/index.cjs +2 -0
- package/dist/adapter/index.cjs.map +1 -0
- package/dist/adapter/index.d.ts +4 -0
- package/dist/adapter/index.d.ts.map +1 -0
- package/dist/adapter/index.js +8 -0
- package/dist/adapter/index.js.map +1 -0
- package/dist/date-Bj4O2W1F.js +107 -0
- package/dist/date-Bj4O2W1F.js.map +1 -0
- package/dist/date-CRCe-9gf.cjs +2 -0
- package/dist/date-CRCe-9gf.cjs.map +1 -0
- package/dist/decorators-HQ1KnRdh.cjs +2 -0
- package/dist/decorators-HQ1KnRdh.cjs.map +1 -0
- package/dist/decorators-Zr35qr6A.js +50 -0
- package/dist/decorators-Zr35qr6A.js.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/json-api/JsonApiAdapter.d.ts +38 -0
- package/dist/json-api/JsonApiAdapter.d.ts.map +1 -0
- package/dist/json-api/JsonApiSerializer.d.ts +73 -0
- package/dist/json-api/JsonApiSerializer.d.ts.map +1 -0
- package/dist/json-api/index.cjs +2 -0
- package/dist/json-api/index.cjs.map +1 -0
- package/dist/json-api/index.d.ts +3 -0
- package/dist/json-api/index.d.ts.map +1 -0
- package/dist/json-api/index.js +6 -0
- package/dist/json-api/index.js.map +1 -0
- package/dist/model/Errors.d.ts +46 -0
- package/dist/model/Errors.d.ts.map +1 -0
- package/dist/model/Model.d.ts +226 -0
- package/dist/model/Model.d.ts.map +1 -0
- package/dist/model/Snapshot.d.ts +72 -0
- package/dist/model/Snapshot.d.ts.map +1 -0
- package/dist/model/StateMachine.d.ts +45 -0
- package/dist/model/StateMachine.d.ts.map +1 -0
- package/dist/model/index.cjs +2 -0
- package/dist/model/index.cjs.map +1 -0
- package/dist/model/index.d.ts +6 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/index.js +11 -0
- package/dist/model/index.js.map +1 -0
- package/dist/model/relationships.d.ts +182 -0
- package/dist/model/relationships.d.ts.map +1 -0
- package/dist/odata/ODataAdapter.d.ts +67 -0
- package/dist/odata/ODataAdapter.d.ts.map +1 -0
- package/dist/odata/index.cjs +2 -0
- package/dist/odata/index.cjs.map +1 -0
- package/dist/odata/index.d.ts +2 -0
- package/dist/odata/index.d.ts.map +1 -0
- package/dist/odata/index.js +5 -0
- package/dist/odata/index.js.map +1 -0
- package/dist/relationships-B55LBaCW.cjs +2 -0
- package/dist/relationships-B55LBaCW.cjs.map +1 -0
- package/dist/relationships-BEXANmWg.js +821 -0
- package/dist/relationships-BEXANmWg.js.map +1 -0
- package/dist/request/CacheHandler.d.ts +50 -0
- package/dist/request/CacheHandler.d.ts.map +1 -0
- package/dist/request/FetchHandler.d.ts +41 -0
- package/dist/request/FetchHandler.d.ts.map +1 -0
- package/dist/request/RequestManager.d.ts +52 -0
- package/dist/request/RequestManager.d.ts.map +1 -0
- package/dist/request/index.cjs +2 -0
- package/dist/request/index.cjs.map +1 -0
- package/dist/request/index.d.ts +5 -0
- package/dist/request/index.d.ts.map +1 -0
- package/dist/request/index.js +7 -0
- package/dist/request/index.js.map +1 -0
- package/dist/request/types.d.ts +111 -0
- package/dist/request/types.d.ts.map +1 -0
- package/dist/schema/SchemaService.d.ts +58 -0
- package/dist/schema/SchemaService.d.ts.map +1 -0
- package/dist/schema/decorators.d.ts +50 -0
- package/dist/schema/decorators.d.ts.map +1 -0
- package/dist/schema/index.cjs +2 -0
- package/dist/schema/index.cjs.map +1 -0
- package/dist/schema/index.d.ts +4 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +13 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/types.d.ts +61 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/serializer/EmbeddedRecordsMixin.d.ts +80 -0
- package/dist/serializer/EmbeddedRecordsMixin.d.ts.map +1 -0
- package/dist/serializer/JsonSerializer.d.ts +52 -0
- package/dist/serializer/JsonSerializer.d.ts.map +1 -0
- package/dist/serializer/RestSerializer.d.ts +43 -0
- package/dist/serializer/RestSerializer.d.ts.map +1 -0
- package/dist/serializer/Serializer.d.ts +202 -0
- package/dist/serializer/Serializer.d.ts.map +1 -0
- package/dist/serializer/index.cjs +2 -0
- package/dist/serializer/index.cjs.map +1 -0
- package/dist/serializer/index.d.ts +5 -0
- package/dist/serializer/index.d.ts.map +1 -0
- package/dist/serializer/index.js +9 -0
- package/dist/serializer/index.js.map +1 -0
- package/dist/store/IdentityMap.d.ts +53 -0
- package/dist/store/IdentityMap.d.ts.map +1 -0
- package/dist/store/RecordArray.d.ts +114 -0
- package/dist/store/RecordArray.d.ts.map +1 -0
- package/dist/store/Store.d.ts +395 -0
- package/dist/store/Store.d.ts.map +1 -0
- package/dist/store/index.cjs +2 -0
- package/dist/store/index.cjs.map +1 -0
- package/dist/store/index.d.ts +5 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +8 -0
- package/dist/store/index.js.map +1 -0
- package/dist/transforms/Transform.d.ts +49 -0
- package/dist/transforms/Transform.d.ts.map +1 -0
- package/dist/transforms/boolean.d.ts +26 -0
- package/dist/transforms/boolean.d.ts.map +1 -0
- package/dist/transforms/date.d.ts +22 -0
- package/dist/transforms/date.d.ts.map +1 -0
- package/dist/transforms/index.cjs +2 -0
- package/dist/transforms/index.cjs.map +1 -0
- package/dist/transforms/index.d.ts +6 -0
- package/dist/transforms/index.d.ts.map +1 -0
- package/dist/transforms/index.js +9 -0
- package/dist/transforms/index.js.map +1 -0
- package/dist/transforms/number.d.ts +17 -0
- package/dist/transforms/number.d.ts.map +1 -0
- package/dist/transforms/string.d.ts +18 -0
- package/dist/transforms/string.d.ts.map +1 -0
- package/dist/types-C9NB2gRj.js +7 -0
- package/dist/types-C9NB2gRj.js.map +1 -0
- package/dist/types-uWOXMPWW.cjs +2 -0
- package/dist/types-uWOXMPWW.cjs.map +1 -0
- package/package.json +140 -0
- package/src/adapter/Adapter.ts +320 -0
- package/src/adapter/MemoryAdapter.ts +216 -0
- package/src/adapter/RestAdapter.ts +248 -0
- package/src/adapter/index.ts +7 -0
- package/src/index.ts +17 -0
- package/src/json-api/JsonApiAdapter.ts +93 -0
- package/src/json-api/JsonApiSerializer.ts +245 -0
- package/src/json-api/index.ts +2 -0
- package/src/model/Errors.ts +100 -0
- package/src/model/Model.ts +683 -0
- package/src/model/Snapshot.ts +162 -0
- package/src/model/StateMachine.ts +149 -0
- package/src/model/index.ts +20 -0
- package/src/model/relationships.ts +484 -0
- package/src/odata/ODataAdapter.ts +245 -0
- package/src/odata/index.ts +1 -0
- package/src/request/CacheHandler.ts +125 -0
- package/src/request/FetchHandler.ts +119 -0
- package/src/request/RequestManager.ts +112 -0
- package/src/request/index.ts +4 -0
- package/src/request/types.ts +139 -0
- package/src/schema/SchemaService.ts +161 -0
- package/src/schema/decorators.ts +162 -0
- package/src/schema/index.ts +3 -0
- package/src/schema/types.ts +66 -0
- package/src/serializer/EmbeddedRecordsMixin.ts +257 -0
- package/src/serializer/JsonSerializer.ts +173 -0
- package/src/serializer/RestSerializer.ts +138 -0
- package/src/serializer/Serializer.ts +397 -0
- package/src/serializer/index.ts +15 -0
- package/src/store/IdentityMap.ts +110 -0
- package/src/store/RecordArray.ts +210 -0
- package/src/store/Store.ts +1391 -0
- package/src/store/index.ts +11 -0
- package/src/transforms/Transform.ts +52 -0
- package/src/transforms/boolean.ts +57 -0
- package/src/transforms/date.ts +48 -0
- package/src/transforms/index.ts +5 -0
- package/src/transforms/number.ts +42 -0
- package/src/transforms/string.ts +35 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Observable array proxies for store query results.
|
|
3
|
+
*
|
|
4
|
+
* Two classes are provided:
|
|
5
|
+
*
|
|
6
|
+
* ## `RecordArray<T>`
|
|
7
|
+
* A live, read-only view of all records of a given type in the store's
|
|
8
|
+
* identity map. The contents are derived via an injected `source` function
|
|
9
|
+
* so they stay in sync automatically with the identity map.
|
|
10
|
+
*
|
|
11
|
+
* Supports `update()` to trigger a background re-fetch if an `update` callback
|
|
12
|
+
* is provided.
|
|
13
|
+
*
|
|
14
|
+
* ## `AdapterPopulatedRecordArray<T>`
|
|
15
|
+
* A subclass used for the results of `store.query()`. Unlike `RecordArray`,
|
|
16
|
+
* its contents are determined by the last adapter response (order preserved,
|
|
17
|
+
* no auto-sync with new pushes).
|
|
18
|
+
*
|
|
19
|
+
* Adds `meta`, `links`, and `query` properties that are set by the store after
|
|
20
|
+
* each adapter call.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { makeObservable, computed, observable } from 'mobx';
|
|
24
|
+
import type { Model } from '@mobx-data/model';
|
|
25
|
+
|
|
26
|
+
/** Constructor options for `RecordArray`. */
|
|
27
|
+
export interface RecordArrayOptions<T extends Model> {
|
|
28
|
+
/** Registered model name. */
|
|
29
|
+
modelName: string;
|
|
30
|
+
/** Function that returns the current record list (called on each access). */
|
|
31
|
+
source: () => T[];
|
|
32
|
+
/** Optional async callback invoked by `update()`. */
|
|
33
|
+
update?: () => Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* When `true`, the internal MobX computed retains its cached value even when
|
|
36
|
+
* no observers are actively subscribed. Prevents expensive recomputation
|
|
37
|
+
* for long-lived filtered views (e.g. `liveQuery` results).
|
|
38
|
+
*/
|
|
39
|
+
keepAlive?: boolean;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Live, read-only view of all records of a given type.
|
|
44
|
+
*
|
|
45
|
+
* The `source` function is called on each observable access so the array
|
|
46
|
+
* always reflects the current store state. MobX tracks the `source` call
|
|
47
|
+
* as part of `resolved`, so any computed prop that reads from this array
|
|
48
|
+
* will re-run when the underlying identity map changes.
|
|
49
|
+
*/
|
|
50
|
+
export class RecordArray<T extends Model = Model> implements Iterable<T> {
|
|
51
|
+
private readonly opts: RecordArrayOptions<T>;
|
|
52
|
+
|
|
53
|
+
/** `true` while `update()` is in progress. */
|
|
54
|
+
protected updating: boolean = false;
|
|
55
|
+
|
|
56
|
+
constructor(opts: RecordArrayOptions<T>) {
|
|
57
|
+
this.opts = opts;
|
|
58
|
+
makeObservable<this, 'resolved' | 'updating'>(this, {
|
|
59
|
+
resolved: opts.keepAlive ? computed({ keepAlive: true }) : computed,
|
|
60
|
+
updating: observable,
|
|
61
|
+
length: computed,
|
|
62
|
+
modelName: computed,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Current record list, derived from the injected `source` function. */
|
|
67
|
+
protected get resolved(): T[] {
|
|
68
|
+
return this.opts.source();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** `true` while a background `update()` call is in progress. */
|
|
72
|
+
get isLoading(): boolean {
|
|
73
|
+
return this.updating;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** Alias for `isLoading`. */
|
|
77
|
+
get isUpdating(): boolean {
|
|
78
|
+
return this.updating;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** Number of records in the array. */
|
|
82
|
+
get length(): number {
|
|
83
|
+
return this.resolved.length;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** The registered model name for the records in this array. */
|
|
87
|
+
get modelName(): string {
|
|
88
|
+
return this.opts.modelName;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Returns the record at `index`, or `undefined`. */
|
|
92
|
+
at(index: number): T | undefined {
|
|
93
|
+
return this.resolved[index];
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** Returns a plain array snapshot of all records. */
|
|
97
|
+
toArray(): T[] {
|
|
98
|
+
return [...this.resolved];
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** Maps over records. */
|
|
102
|
+
map<R>(callback: (record: T, i: number) => R): R[] {
|
|
103
|
+
return this.resolved.map(callback);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** Filters records. */
|
|
107
|
+
filter(predicate: (record: T, i: number) => boolean): T[] {
|
|
108
|
+
return this.resolved.filter(predicate);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Iterates records. */
|
|
112
|
+
forEach(callback: (record: T, i: number) => void): void {
|
|
113
|
+
this.resolved.forEach(callback);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** Returns `true` when `record` is in the array. */
|
|
117
|
+
includes(record: T): boolean {
|
|
118
|
+
return this.resolved.includes(record);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Triggers the `update` callback (if any) to refresh the array from the
|
|
123
|
+
* adapter. Sets `isLoading` while the request is in flight.
|
|
124
|
+
*/
|
|
125
|
+
async update(): Promise<this> {
|
|
126
|
+
if (!this.opts.update) {
|
|
127
|
+
return this;
|
|
128
|
+
}
|
|
129
|
+
this.updating = true;
|
|
130
|
+
try {
|
|
131
|
+
await this.opts.update();
|
|
132
|
+
} finally {
|
|
133
|
+
this.updating = false;
|
|
134
|
+
}
|
|
135
|
+
return this;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
[Symbol.iterator](): Iterator<T> {
|
|
139
|
+
return this.resolved[Symbol.iterator]();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/** Constructor options for `AdapterPopulatedRecordArray`. */
|
|
144
|
+
export interface AdapterPopulatedRecordArrayOptions<T extends Model>
|
|
145
|
+
extends RecordArrayOptions<T> {
|
|
146
|
+
/** Query parameters that produced this result set. */
|
|
147
|
+
query: Record<string, unknown>;
|
|
148
|
+
/** Server-side metadata (pagination, total counts, etc.). */
|
|
149
|
+
meta?: Record<string, unknown>;
|
|
150
|
+
/** Pagination or related links. */
|
|
151
|
+
links?: Record<string, string>;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Record array populated by an adapter query response.
|
|
156
|
+
*
|
|
157
|
+
* The store creates one of these for each `store.query()` call. Its contents
|
|
158
|
+
* are driven by the id list returned from the last adapter call, not by live
|
|
159
|
+
* identity map iteration.
|
|
160
|
+
*
|
|
161
|
+
* Call `.update()` to re-issue the original query and refresh the contents.
|
|
162
|
+
*/
|
|
163
|
+
export class AdapterPopulatedRecordArray<
|
|
164
|
+
T extends Model = Model,
|
|
165
|
+
> extends RecordArray<T> {
|
|
166
|
+
private queryParams: Record<string, unknown>;
|
|
167
|
+
|
|
168
|
+
private metaData: Record<string, unknown>;
|
|
169
|
+
|
|
170
|
+
private linksData: Record<string, string>;
|
|
171
|
+
|
|
172
|
+
constructor(opts: AdapterPopulatedRecordArrayOptions<T>) {
|
|
173
|
+
super(opts);
|
|
174
|
+
this.queryParams = opts.query;
|
|
175
|
+
this.metaData = opts.meta ?? {};
|
|
176
|
+
this.linksData = opts.links ?? {};
|
|
177
|
+
makeObservable<this, 'metaData' | 'linksData'>(this, {
|
|
178
|
+
metaData: observable.ref,
|
|
179
|
+
linksData: observable.ref,
|
|
180
|
+
meta: computed,
|
|
181
|
+
links: computed,
|
|
182
|
+
query: computed,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/** Server-side metadata attached to the last response (e.g. pagination). */
|
|
187
|
+
get meta(): Record<string, unknown> {
|
|
188
|
+
return this.metaData;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/** Links attached to the last response. */
|
|
192
|
+
get links(): Record<string, string> {
|
|
193
|
+
return this.linksData;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/** The query parameters that produced this array. */
|
|
197
|
+
get query(): Record<string, unknown> {
|
|
198
|
+
return this.queryParams;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/** Called by the store to update `meta` after a successful query. */
|
|
202
|
+
_setMeta(meta: Record<string, unknown>): void {
|
|
203
|
+
this.metaData = meta;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/** Called by the store to update `links` after a successful query. */
|
|
207
|
+
_setLinks(links: Record<string, string>): void {
|
|
208
|
+
this.linksData = links;
|
|
209
|
+
}
|
|
210
|
+
}
|