@nexigen/entity-normalizer 0.1.1 → 0.1.2
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/dist/async/async-duck.d.ts +38 -0
- package/dist/async/async-duck.js +189 -0
- package/dist/async/async-duck.js.map +1 -0
- package/dist/async/create-duck.d.ts +2 -0
- package/dist/async/create-duck.js +6 -0
- package/dist/async/create-duck.js.map +1 -0
- package/dist/async/index.d.ts +1 -0
- package/dist/async/index.js +2 -0
- package/dist/async/index.js.map +1 -0
- package/dist/async/marker.d.ts +1 -0
- package/dist/async/marker.js +2 -0
- package/dist/async/marker.js.map +1 -0
- package/dist/async/public.d.ts +34 -0
- package/dist/async/public.js +2 -0
- package/dist/async/public.js.map +1 -0
- package/dist/async/retry.d.ts +3 -0
- package/dist/async/retry.js +36 -0
- package/dist/async/retry.js.map +1 -0
- package/dist/async/types.d.ts +24 -0
- package/dist/async/types.js +2 -0
- package/dist/async/types.js.map +1 -0
- package/dist/constants/time.d.ts +6 -0
- package/dist/constants/time.js +7 -0
- package/dist/constants/time.js.map +1 -0
- package/dist/constants/values.d.ts +1 -0
- package/dist/constants/values.js +2 -0
- package/dist/constants/values.js.map +1 -0
- package/dist/create/cleaner.d.ts +7 -0
- package/dist/create/cleaner.js +69 -0
- package/dist/create/cleaner.js.map +1 -0
- package/dist/create/create-store.d.ts +2 -0
- package/dist/create/create-store.js +5 -0
- package/dist/create/create-store.js.map +1 -0
- package/dist/create/extractor.d.ts +8 -0
- package/dist/create/extractor.js +64 -0
- package/dist/create/extractor.js.map +1 -0
- package/dist/create/index.d.ts +1 -0
- package/dist/create/index.js +2 -0
- package/dist/create/index.js.map +1 -0
- package/dist/create/manager.d.ts +9 -0
- package/dist/create/manager.js +39 -0
- package/dist/create/manager.js.map +1 -0
- package/dist/create/proxy.d.ts +11 -0
- package/dist/create/proxy.js +57 -0
- package/dist/create/proxy.js.map +1 -0
- package/dist/create/scanner.d.ts +19 -0
- package/dist/create/scanner.js +109 -0
- package/dist/create/scanner.js.map +1 -0
- package/dist/create/utils.d.ts +3 -0
- package/dist/create/utils.js +33 -0
- package/dist/create/utils.js.map +1 -0
- package/dist/create-store-hooks.d.ts +19 -0
- package/dist/create-store-hooks.js +23 -0
- package/dist/create-store-hooks.js.map +1 -0
- package/dist/di/index.d.ts +2 -0
- package/dist/di/index.js +3 -0
- package/dist/di/index.js.map +1 -0
- package/dist/di/register-root-store.d.ts +11 -0
- package/dist/di/register-root-store.js +23 -0
- package/dist/di/register-root-store.js.map +1 -0
- package/dist/entities/cleaner/bucket.d.ts +8 -0
- package/dist/entities/cleaner/bucket.js +31 -0
- package/dist/entities/cleaner/bucket.js.map +1 -0
- package/dist/entities/cleaner/index.d.ts +1 -0
- package/dist/entities/cleaner/index.js +2 -0
- package/dist/entities/cleaner/index.js.map +1 -0
- package/dist/entities/cleaner/store.d.ts +12 -0
- package/dist/entities/cleaner/store.js +73 -0
- package/dist/entities/cleaner/store.js.map +1 -0
- package/dist/entities/cleaner/walker.d.ts +6 -0
- package/dist/entities/cleaner/walker.js +34 -0
- package/dist/entities/cleaner/walker.js.map +1 -0
- package/dist/entities/collection/create-entity-collection.d.ts +9 -0
- package/dist/entities/collection/create-entity-collection.js +17 -0
- package/dist/entities/collection/create-entity-collection.js.map +1 -0
- package/dist/entities/collection/entity-collection.d.ts +49 -0
- package/dist/entities/collection/entity-collection.js +186 -0
- package/dist/entities/collection/entity-collection.js.map +1 -0
- package/dist/entities/collection/index.d.ts +3 -0
- package/dist/entities/collection/index.js +2 -0
- package/dist/entities/collection/index.js.map +1 -0
- package/dist/entities/collection/marker.d.ts +2 -0
- package/dist/entities/collection/marker.js +3 -0
- package/dist/entities/collection/marker.js.map +1 -0
- package/dist/entities/collection/multi-entity-collection.d.ts +24 -0
- package/dist/entities/collection/multi-entity-collection.js +95 -0
- package/dist/entities/collection/multi-entity-collection.js.map +1 -0
- package/dist/entities/collection/public.d.ts +50 -0
- package/dist/entities/collection/public.js +2 -0
- package/dist/entities/collection/public.js.map +1 -0
- package/dist/entities/collection/types.d.ts +39 -0
- package/dist/entities/collection/types.js +2 -0
- package/dist/entities/collection/types.js.map +1 -0
- package/dist/entities/constants.d.ts +4 -0
- package/dist/entities/constants.js +5 -0
- package/dist/entities/constants.js.map +1 -0
- package/dist/entities/create-entity-schema.d.ts +2 -0
- package/dist/entities/create-entity-schema.js +5 -0
- package/dist/entities/create-entity-schema.js.map +1 -0
- package/dist/entities/index.d.ts +4 -0
- package/dist/entities/index.js +5 -0
- package/dist/entities/index.js.map +1 -0
- package/dist/entities/normalize.d.ts +11 -0
- package/dist/entities/normalize.js +79 -0
- package/dist/entities/normalize.js.map +1 -0
- package/dist/entities/processor.d.ts +14 -0
- package/dist/entities/processor.js +156 -0
- package/dist/entities/processor.js.map +1 -0
- package/dist/entities/public.d.ts +102 -0
- package/dist/entities/public.js +7 -0
- package/dist/entities/public.js.map +1 -0
- package/dist/entities/record/create-entity-record.d.ts +15 -0
- package/dist/entities/record/create-entity-record.js +13 -0
- package/dist/entities/record/create-entity-record.js.map +1 -0
- package/dist/entities/record/entity-record.d.ts +37 -0
- package/dist/entities/record/entity-record.js +83 -0
- package/dist/entities/record/entity-record.js.map +1 -0
- package/dist/entities/record/index.d.ts +2 -0
- package/dist/entities/record/index.js +2 -0
- package/dist/entities/record/index.js.map +1 -0
- package/dist/entities/record/marker.d.ts +1 -0
- package/dist/entities/record/marker.js +2 -0
- package/dist/entities/record/marker.js.map +1 -0
- package/dist/entities/record/public.d.ts +25 -0
- package/dist/entities/record/public.js +2 -0
- package/dist/entities/record/public.js.map +1 -0
- package/dist/entities/record/types.d.ts +3 -0
- package/dist/entities/record/types.js +2 -0
- package/dist/entities/record/types.js.map +1 -0
- package/dist/entities/schema.d.ts +12 -0
- package/dist/entities/schema.js +31 -0
- package/dist/entities/schema.js.map +1 -0
- package/dist/entities/store.d.ts +22 -0
- package/dist/entities/store.js +154 -0
- package/dist/entities/store.js.map +1 -0
- package/dist/entities/types.d.ts +82 -0
- package/dist/entities/types.js +2 -0
- package/dist/entities/types.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/root/RootStore.d.ts +24 -0
- package/dist/root/RootStore.js +134 -0
- package/dist/root/RootStore.js.map +1 -0
- package/dist/root/coreApi/create-core-api.d.ts +7 -0
- package/dist/root/coreApi/create-core-api.js +12 -0
- package/dist/root/coreApi/create-core-api.js.map +1 -0
- package/dist/root/coreApi/entities.d.ts +10 -0
- package/dist/root/coreApi/entities.js +57 -0
- package/dist/root/coreApi/entities.js.map +1 -0
- package/dist/root/coreApi/lifecycle.d.ts +5 -0
- package/dist/root/coreApi/lifecycle.js +9 -0
- package/dist/root/coreApi/lifecycle.js.map +1 -0
- package/dist/root/coreApi/public.d.ts +71 -0
- package/dist/root/coreApi/public.js +6 -0
- package/dist/root/coreApi/public.js.map +1 -0
- package/dist/root/coreApi/stores.d.ts +2 -0
- package/dist/root/coreApi/stores.js +31 -0
- package/dist/root/coreApi/stores.js.map +1 -0
- package/dist/root/coreApi/types.d.ts +68 -0
- package/dist/root/coreApi/types.js +2 -0
- package/dist/root/coreApi/types.js.map +1 -0
- package/dist/root/create-root-store.d.ts +3 -0
- package/dist/root/create-root-store.js +11 -0
- package/dist/root/create-root-store.js.map +1 -0
- package/dist/root/fallback.d.ts +2 -0
- package/dist/root/fallback.js +6 -0
- package/dist/root/fallback.js.map +1 -0
- package/dist/root/index.d.ts +3 -0
- package/dist/root/index.js +3 -0
- package/dist/root/index.js.map +1 -0
- package/dist/root/marker.d.ts +1 -0
- package/dist/root/marker.js +2 -0
- package/dist/root/marker.js.map +1 -0
- package/dist/root/public.d.ts +28 -0
- package/dist/root/public.js +2 -0
- package/dist/root/public.js.map +1 -0
- package/dist/root/types.d.ts +66 -0
- package/dist/root/types.js +2 -0
- package/dist/root/types.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/throttle-by-time.d.ts +1 -0
- package/dist/utils/throttle-by-time.js +11 -0
- package/dist/utils/throttle-by-time.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { COLLECTION_TAG } from './marker';
|
|
2
|
+
import type { EntityCollectionOptions, EntityCollectionSnapshot, SystemDeps } from './types';
|
|
3
|
+
export declare class EntityCollection<T extends {
|
|
4
|
+
id: string | number;
|
|
5
|
+
}, M> {
|
|
6
|
+
private entitiesApi;
|
|
7
|
+
[COLLECTION_TAG]: boolean;
|
|
8
|
+
private items;
|
|
9
|
+
private entityKey;
|
|
10
|
+
private reversed;
|
|
11
|
+
limit: number;
|
|
12
|
+
hasNoMore: boolean;
|
|
13
|
+
collectionId: string;
|
|
14
|
+
private notify;
|
|
15
|
+
private entities;
|
|
16
|
+
private entitiesCleaner;
|
|
17
|
+
constructor(options: EntityCollectionOptions<T>, system: SystemDeps);
|
|
18
|
+
private sync;
|
|
19
|
+
private processData;
|
|
20
|
+
get idAttribute(): string;
|
|
21
|
+
get asArray(): (string | number)[];
|
|
22
|
+
get first(): string | number;
|
|
23
|
+
get last(): string | number;
|
|
24
|
+
get count(): number;
|
|
25
|
+
get isEmpty(): boolean;
|
|
26
|
+
get pageNumber(): number;
|
|
27
|
+
get offset(): number;
|
|
28
|
+
get getList(): M[];
|
|
29
|
+
set(data: T[]): void;
|
|
30
|
+
append(data: T[]): void;
|
|
31
|
+
prepend(data: T[]): void;
|
|
32
|
+
add(item: T): void;
|
|
33
|
+
updateItem(item: T): void;
|
|
34
|
+
reset({ silent }?: {
|
|
35
|
+
silent?: boolean | undefined;
|
|
36
|
+
}): void;
|
|
37
|
+
removeById(id: string | number): void;
|
|
38
|
+
removeIds(ids: (string | number)[]): void;
|
|
39
|
+
setHasNoMore(value: boolean): void;
|
|
40
|
+
findById(id: string | number | undefined): M | undefined;
|
|
41
|
+
includes(item: T): boolean;
|
|
42
|
+
findIndexById(id: string | number): number;
|
|
43
|
+
checkIfHasMore(data: T[]): void;
|
|
44
|
+
byIndex(index: number): string | number;
|
|
45
|
+
getSnapshot(): EntityCollectionSnapshot;
|
|
46
|
+
applySnapshot(snapshot: EntityCollectionSnapshot, { silent }?: {
|
|
47
|
+
silent?: boolean | undefined;
|
|
48
|
+
}): void;
|
|
49
|
+
}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
var _a;
|
|
2
|
+
import { makeAutoObservable, runInAction } from 'mobx';
|
|
3
|
+
import { PREFIX } from '../constants';
|
|
4
|
+
import { COLLECTION_TAG } from './marker';
|
|
5
|
+
export class EntityCollection {
|
|
6
|
+
constructor(options, system) {
|
|
7
|
+
this[_a] = true;
|
|
8
|
+
this.items = [];
|
|
9
|
+
this.collectionId = options?.collectionId ?? '';
|
|
10
|
+
this.entityKey = options.entityKey;
|
|
11
|
+
this.notify = system.notify;
|
|
12
|
+
this.entities = system.entities;
|
|
13
|
+
this.entitiesCleaner = system.entitiesCleaner;
|
|
14
|
+
this.entitiesApi = system.entitiesApi;
|
|
15
|
+
this.limit = options.limit ?? 10;
|
|
16
|
+
this.reversed = options.reversed ?? false;
|
|
17
|
+
this.hasNoMore = options?.hasNoMore ?? false;
|
|
18
|
+
makeAutoObservable(this, {}, { autoBind: true });
|
|
19
|
+
}
|
|
20
|
+
sync() {
|
|
21
|
+
this.notify();
|
|
22
|
+
}
|
|
23
|
+
// ---------------- NORMALIZATION ----------------
|
|
24
|
+
processData(data) {
|
|
25
|
+
const ids = this.entitiesApi.process({
|
|
26
|
+
data,
|
|
27
|
+
entityKey: this.entityKey,
|
|
28
|
+
sourceRefId: this.collectionId,
|
|
29
|
+
isCollection: true,
|
|
30
|
+
});
|
|
31
|
+
return ids;
|
|
32
|
+
}
|
|
33
|
+
// ---------------- GETTERS ----------------
|
|
34
|
+
get idAttribute() {
|
|
35
|
+
return this.entitiesApi.getSchema(this.entityKey).getIdKey();
|
|
36
|
+
}
|
|
37
|
+
get asArray() {
|
|
38
|
+
return this.items.slice();
|
|
39
|
+
}
|
|
40
|
+
get first() {
|
|
41
|
+
return this.items[0];
|
|
42
|
+
}
|
|
43
|
+
get last() {
|
|
44
|
+
return this.items[this.items.length - 1];
|
|
45
|
+
}
|
|
46
|
+
get count() {
|
|
47
|
+
return this.items.length;
|
|
48
|
+
}
|
|
49
|
+
get isEmpty() {
|
|
50
|
+
return this.items.length === 0;
|
|
51
|
+
}
|
|
52
|
+
get pageNumber() {
|
|
53
|
+
return Math.floor(this.count / this.limit) + 1;
|
|
54
|
+
}
|
|
55
|
+
get offset() {
|
|
56
|
+
return this.count;
|
|
57
|
+
}
|
|
58
|
+
get getList() {
|
|
59
|
+
const results = this.items
|
|
60
|
+
.map(id => this.entities.getEntity(this.entityKey, id))
|
|
61
|
+
.filter((item) => !!item);
|
|
62
|
+
// lazy cleanup if there are missing items
|
|
63
|
+
if (results.length !== this.items.length) {
|
|
64
|
+
const schema = this.entitiesApi.getSchema(this.entityKey);
|
|
65
|
+
const next = results.map(item => schema.getId(item));
|
|
66
|
+
queueMicrotask(() => {
|
|
67
|
+
runInAction(() => {
|
|
68
|
+
this.items = next;
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return results;
|
|
73
|
+
}
|
|
74
|
+
// ---------------- MODIFIERS ----------------
|
|
75
|
+
set(data) {
|
|
76
|
+
this.hasNoMore = false;
|
|
77
|
+
const ids = this.processData(data);
|
|
78
|
+
this.items = this.reversed ? [...ids].reverse() : [...ids];
|
|
79
|
+
this.checkIfHasMore(data);
|
|
80
|
+
this.sync();
|
|
81
|
+
}
|
|
82
|
+
append(data) {
|
|
83
|
+
const ids = this.processData(data);
|
|
84
|
+
this.items.push(...ids);
|
|
85
|
+
this.checkIfHasMore(data);
|
|
86
|
+
this.sync();
|
|
87
|
+
}
|
|
88
|
+
prepend(data) {
|
|
89
|
+
const ids = this.processData(data);
|
|
90
|
+
this.items.unshift(...ids);
|
|
91
|
+
this.sync();
|
|
92
|
+
}
|
|
93
|
+
add(item) {
|
|
94
|
+
const ids = this.processData([item]);
|
|
95
|
+
if (this.reversed) {
|
|
96
|
+
this.items.push(...ids);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
this.items.unshift(...ids);
|
|
100
|
+
}
|
|
101
|
+
this.sync();
|
|
102
|
+
}
|
|
103
|
+
updateItem(item) {
|
|
104
|
+
this.processData([item]);
|
|
105
|
+
this.sync();
|
|
106
|
+
}
|
|
107
|
+
reset({ silent = false } = {}) {
|
|
108
|
+
if (this.items.length > 0) {
|
|
109
|
+
this.entitiesCleaner.deleteCascade(this.entityKey, [...this.items], `${PREFIX.COLLECTION}${this.collectionId}`);
|
|
110
|
+
}
|
|
111
|
+
this.items = [];
|
|
112
|
+
this.hasNoMore = false;
|
|
113
|
+
if (!silent) {
|
|
114
|
+
this.sync();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
removeById(id) {
|
|
118
|
+
const index = this.findIndexById(id);
|
|
119
|
+
if (index >= 0) {
|
|
120
|
+
this.items.splice(index, 1);
|
|
121
|
+
this.entitiesCleaner.deleteCascade(this.entityKey, [id], `${PREFIX.COLLECTION}${this.collectionId}`);
|
|
122
|
+
this.sync();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
removeIds(ids) {
|
|
126
|
+
if (ids.length === 0) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const set = new Set(ids);
|
|
130
|
+
const toDelete = this.items.filter(id => set.has(id));
|
|
131
|
+
if (toDelete.length === 0) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
this.items = this.items.filter(id => !set.has(id));
|
|
135
|
+
this.entitiesCleaner.deleteCascade(this.entityKey, toDelete, `${PREFIX.COLLECTION}${this.collectionId}`);
|
|
136
|
+
this.sync();
|
|
137
|
+
}
|
|
138
|
+
setHasNoMore(value) {
|
|
139
|
+
this.hasNoMore = value;
|
|
140
|
+
this.sync();
|
|
141
|
+
}
|
|
142
|
+
// ---------------- HELPERS ----------------
|
|
143
|
+
findById(id) {
|
|
144
|
+
if (!id) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
return this.entities.getEntity(this.entityKey, id);
|
|
148
|
+
}
|
|
149
|
+
includes(item) {
|
|
150
|
+
const schema = this.entitiesApi.getSchema(this.entityKey);
|
|
151
|
+
const id = schema.getId(item);
|
|
152
|
+
return this.items.includes(id);
|
|
153
|
+
}
|
|
154
|
+
findIndexById(id) {
|
|
155
|
+
return this.items.findIndex(itemId => itemId === id);
|
|
156
|
+
}
|
|
157
|
+
checkIfHasMore(data) {
|
|
158
|
+
const lessThanLimit = this.limit && data.length < this.limit;
|
|
159
|
+
if (lessThanLimit) {
|
|
160
|
+
this.hasNoMore = true;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
byIndex(index) {
|
|
164
|
+
return this.items[index];
|
|
165
|
+
}
|
|
166
|
+
// --- SNAPSHOT API --- //
|
|
167
|
+
getSnapshot() {
|
|
168
|
+
return {
|
|
169
|
+
items: this.items,
|
|
170
|
+
hasNoMore: this.hasNoMore,
|
|
171
|
+
reversed: this.reversed,
|
|
172
|
+
limit: this.limit,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
applySnapshot(snapshot, { silent = false } = {}) {
|
|
176
|
+
this.items = snapshot.items;
|
|
177
|
+
this.hasNoMore = snapshot.hasNoMore;
|
|
178
|
+
this.reversed = snapshot.reversed;
|
|
179
|
+
this.limit = snapshot.limit;
|
|
180
|
+
if (!silent) {
|
|
181
|
+
this.sync();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
_a = COLLECTION_TAG;
|
|
186
|
+
//# sourceMappingURL=entity-collection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-collection.js","sourceRoot":"","sources":["../../../src/entities/collection/entity-collection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/entities/collection/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marker.js","sourceRoot":"","sources":["../../../src/entities/collection/marker.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AACzD,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,uBAAuB,CAAC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { EntityCollection } from './entity-collection';
|
|
2
|
+
import { MULTI_COLLECTION_TAG, COLLECTION_TAG } from './marker';
|
|
3
|
+
import type { MultiEntityCollection as PublicMultiEntityCollection } from './public';
|
|
4
|
+
import type { EntityCollectionOptions, EntityCollectionSnapshot, GroupCollection, MultiCollection, SystemDeps } from './types';
|
|
5
|
+
export declare class MultiEntityCollection<T extends {
|
|
6
|
+
id: string | number;
|
|
7
|
+
}, M> implements MultiCollection<T, M> {
|
|
8
|
+
private options;
|
|
9
|
+
private system;
|
|
10
|
+
[COLLECTION_TAG]: true;
|
|
11
|
+
[MULTI_COLLECTION_TAG]: true;
|
|
12
|
+
private sub;
|
|
13
|
+
private registeredGroups;
|
|
14
|
+
base: EntityCollection<T, M>;
|
|
15
|
+
constructor(options: EntityCollectionOptions<T>, system: SystemDeps);
|
|
16
|
+
private notify;
|
|
17
|
+
ensureGroup(group: string): GroupCollection<T, M>;
|
|
18
|
+
getSubCollections(): Map<string, GroupCollection<T, M>>;
|
|
19
|
+
getMultiSnapshot(): Record<string, EntityCollectionSnapshot>;
|
|
20
|
+
applyMultiSnapshot(snap: Record<string, EntityCollectionSnapshot>): void;
|
|
21
|
+
resetAll(): void;
|
|
22
|
+
reset(): void;
|
|
23
|
+
getProxy(): PublicMultiEntityCollection<T, M>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
var _a, _b;
|
|
2
|
+
import { makeAutoObservable } from 'mobx';
|
|
3
|
+
import { EntityCollection } from './entity-collection';
|
|
4
|
+
import { MULTI_COLLECTION_TAG, COLLECTION_TAG } from './marker';
|
|
5
|
+
export class MultiEntityCollection {
|
|
6
|
+
constructor(options, system) {
|
|
7
|
+
this.options = options;
|
|
8
|
+
this.system = system;
|
|
9
|
+
this[_a] = true;
|
|
10
|
+
this[_b] = true;
|
|
11
|
+
this.sub = new Map();
|
|
12
|
+
this.registeredGroups = new Set();
|
|
13
|
+
const { collectionId, ...rest } = options;
|
|
14
|
+
void collectionId;
|
|
15
|
+
this.base = new EntityCollection({
|
|
16
|
+
...rest,
|
|
17
|
+
collectionId: `multi-base-${collectionId}`,
|
|
18
|
+
}, this.system);
|
|
19
|
+
makeAutoObservable(this, {
|
|
20
|
+
sub: false,
|
|
21
|
+
registeredGroups: false,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
notify() {
|
|
25
|
+
this.system.notify();
|
|
26
|
+
}
|
|
27
|
+
ensureGroup(group) {
|
|
28
|
+
if (!group || group.startsWith('Symbol(') || group.startsWith('__')) {
|
|
29
|
+
return this.base;
|
|
30
|
+
}
|
|
31
|
+
if (!this.sub.has(group)) {
|
|
32
|
+
const { collectionId, ...rest } = this.options;
|
|
33
|
+
this.sub.set(group, new EntityCollection({
|
|
34
|
+
...rest,
|
|
35
|
+
collectionId: `multi-${group}-${collectionId}`,
|
|
36
|
+
}, this.system));
|
|
37
|
+
this.registeredGroups.add(group);
|
|
38
|
+
}
|
|
39
|
+
return this.sub.get(group);
|
|
40
|
+
}
|
|
41
|
+
getSubCollections() {
|
|
42
|
+
return this.sub;
|
|
43
|
+
}
|
|
44
|
+
getMultiSnapshot() {
|
|
45
|
+
const out = {};
|
|
46
|
+
for (const group of this.registeredGroups) {
|
|
47
|
+
if (group.startsWith('Symbol(') || group.startsWith('__')) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const col = this.sub.get(group);
|
|
51
|
+
if (col) {
|
|
52
|
+
out[group] = col.getSnapshot();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
applyMultiSnapshot(snap) {
|
|
58
|
+
for (const [groupKey, groupSnap] of Object.entries(snap)) {
|
|
59
|
+
this.ensureGroup(groupKey).applySnapshot(groupSnap, { silent: true });
|
|
60
|
+
}
|
|
61
|
+
this.notify();
|
|
62
|
+
}
|
|
63
|
+
resetAll() {
|
|
64
|
+
for (const col of this.sub.values()) {
|
|
65
|
+
col.reset({ silent: true });
|
|
66
|
+
}
|
|
67
|
+
this.notify();
|
|
68
|
+
}
|
|
69
|
+
reset() {
|
|
70
|
+
this.resetAll();
|
|
71
|
+
}
|
|
72
|
+
getProxy() {
|
|
73
|
+
const self = this;
|
|
74
|
+
return new Proxy({}, {
|
|
75
|
+
get(_target, prop) {
|
|
76
|
+
if (typeof prop !== 'string') {
|
|
77
|
+
return self[prop];
|
|
78
|
+
}
|
|
79
|
+
if (prop === 'base') {
|
|
80
|
+
return self.base;
|
|
81
|
+
}
|
|
82
|
+
if (prop === 'reset') {
|
|
83
|
+
return self.reset.bind(self);
|
|
84
|
+
}
|
|
85
|
+
// allow reading native props if needed
|
|
86
|
+
if (prop in self) {
|
|
87
|
+
return self[prop];
|
|
88
|
+
}
|
|
89
|
+
return self.ensureGroup(prop);
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
_a = COLLECTION_TAG, _b = MULTI_COLLECTION_TAG;
|
|
95
|
+
//# sourceMappingURL=multi-entity-collection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-entity-collection.js","sourceRoot":"","sources":["../../../src/entities/collection/multi-entity-collection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/** Snapshot shape for persistence */
|
|
2
|
+
export interface EntityCollectionSnapshot<Id = string | number> {
|
|
3
|
+
items: Id[];
|
|
4
|
+
hasNoMore: boolean;
|
|
5
|
+
reversed: boolean;
|
|
6
|
+
limit: number;
|
|
7
|
+
}
|
|
8
|
+
/** Read-only public view */
|
|
9
|
+
export interface EntityCollectionView<Id = string | number, M = any> {
|
|
10
|
+
readonly idAttribute: string;
|
|
11
|
+
readonly asArray: Id[];
|
|
12
|
+
readonly first: Id | undefined;
|
|
13
|
+
readonly last: Id | undefined;
|
|
14
|
+
readonly count: number;
|
|
15
|
+
readonly isEmpty: boolean;
|
|
16
|
+
/** Pagination */
|
|
17
|
+
readonly limit: number;
|
|
18
|
+
readonly hasNoMore: boolean;
|
|
19
|
+
readonly pageNumber: number;
|
|
20
|
+
readonly offset: number;
|
|
21
|
+
/** Resolved entities (may trigger lazy cleanup internally) */
|
|
22
|
+
readonly getList: M[];
|
|
23
|
+
findById(id: Id | undefined): M | undefined;
|
|
24
|
+
findIndexById(id: Id): number;
|
|
25
|
+
byIndex(index: number): Id | undefined;
|
|
26
|
+
includes(item: any): boolean;
|
|
27
|
+
}
|
|
28
|
+
/** Mutable public API */
|
|
29
|
+
export interface EntityCollectionActions<T, Id = string | number> {
|
|
30
|
+
set(data: T[]): void;
|
|
31
|
+
append(data: T[]): void;
|
|
32
|
+
prepend(data: T[]): void;
|
|
33
|
+
add(item: T): void;
|
|
34
|
+
updateItem(item: T): void;
|
|
35
|
+
removeById(id: Id): void;
|
|
36
|
+
removeIds(ids: Id[]): void;
|
|
37
|
+
reset(): void;
|
|
38
|
+
setHasNoMore(value: boolean): void;
|
|
39
|
+
}
|
|
40
|
+
/** Snapshot API (used by persist, but safe to expose) */
|
|
41
|
+
export interface EntityCollectionSnapshotAPI<Id = string | number> {
|
|
42
|
+
getSnapshot(): EntityCollectionSnapshot<Id>;
|
|
43
|
+
applySnapshot(snapshot: EntityCollectionSnapshot<Id>): void;
|
|
44
|
+
}
|
|
45
|
+
/** Final public type */
|
|
46
|
+
export type EntityCollection<T = any, M = any, Id = string | number> = EntityCollectionView<Id, M> & EntityCollectionActions<T, Id> & EntityCollectionSnapshotAPI<Id>;
|
|
47
|
+
export type MultiEntityCollection<T, M> = Record<string, EntityCollection<T, M>> & {
|
|
48
|
+
readonly base: EntityCollection<T, M>;
|
|
49
|
+
reset(): void;
|
|
50
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public.js","sourceRoot":"","sources":["../../../src/entities/collection/public.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { CoreEntitiesAPI } from '../../root/coreApi/types';
|
|
2
|
+
import type { EntityCleanerStore } from '../cleaner';
|
|
3
|
+
import type { TEntitiesStore } from '../types';
|
|
4
|
+
import type { EntityCollection } from './entity-collection';
|
|
5
|
+
import type { MULTI_COLLECTION_TAG } from './marker';
|
|
6
|
+
export interface SystemDeps {
|
|
7
|
+
entities: TEntitiesStore;
|
|
8
|
+
entitiesCleaner: EntityCleanerStore;
|
|
9
|
+
notify: () => void;
|
|
10
|
+
entitiesApi: CoreEntitiesAPI;
|
|
11
|
+
}
|
|
12
|
+
export interface EntityCollectionOptions<T> {
|
|
13
|
+
entityKey: string;
|
|
14
|
+
pageSize?: number;
|
|
15
|
+
limit?: number;
|
|
16
|
+
reversed?: boolean;
|
|
17
|
+
hasNoMore?: boolean;
|
|
18
|
+
idAttribute?: keyof T;
|
|
19
|
+
collectionId: string;
|
|
20
|
+
}
|
|
21
|
+
export interface EntityCollectionSnapshot {
|
|
22
|
+
items: (string | number)[];
|
|
23
|
+
hasNoMore: boolean;
|
|
24
|
+
reversed: boolean;
|
|
25
|
+
limit: number;
|
|
26
|
+
}
|
|
27
|
+
export type GroupCollection<T extends {
|
|
28
|
+
id: string | number;
|
|
29
|
+
}, M> = EntityCollection<T, M>;
|
|
30
|
+
export interface MultiCollection<T extends {
|
|
31
|
+
id: string | number;
|
|
32
|
+
}, M> {
|
|
33
|
+
[key: string]: GroupCollection<T, M> | any;
|
|
34
|
+
ensureGroup(group: string): GroupCollection<T, M>;
|
|
35
|
+
getSubCollections(): Map<string, GroupCollection<T, M>>;
|
|
36
|
+
getMultiSnapshot(): Record<string, EntityCollectionSnapshot>;
|
|
37
|
+
applyMultiSnapshot(snap: Record<string, EntityCollectionSnapshot>): void;
|
|
38
|
+
[MULTI_COLLECTION_TAG]: true;
|
|
39
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/entities/collection/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/entities/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,UAAU,EAAE,aAAa;IACzB,MAAM,EAAE,SAAS;CAClB,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import type { PublicEntitySchema, EntitySchemaConfig, EntitySchemaDefinition } from './public';
|
|
2
|
+
export declare function createEntitySchema<TDto, TModel>(key: string, definition?: EntitySchemaDefinition, config?: EntitySchemaConfig<TDto, TModel>): PublicEntitySchema<TDto, TModel>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-entity-schema.js","sourceRoot":"","sources":["../../src/entities/create-entity-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAQxC,MAAM,UAAU,kBAAkB,CAChC,GAAW,EACX,aAAqC,EAAE,EACvC,SAA2C,EAAE;IAE7C,OAAO,IAAI,YAAY,CAAe,GAAG,EAAE,UAAiB,EAAE,MAAa,CAAC,CAAC;AAC/E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/entities/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { NormalizedOutput, AnySchema } from './types';
|
|
2
|
+
export declare class Normalizer {
|
|
3
|
+
normalize(input: any | any[], schema: AnySchema | [AnySchema]): NormalizedOutput;
|
|
4
|
+
private ensureBucket;
|
|
5
|
+
private normalizeEntity;
|
|
6
|
+
private normalizeArray;
|
|
7
|
+
private runInternal;
|
|
8
|
+
}
|
|
9
|
+
export declare function createNormalizer(): {
|
|
10
|
+
normalize: (input: any, schema: AnySchema | [AnySchema]) => NormalizedOutput;
|
|
11
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export class Normalizer {
|
|
2
|
+
normalize(input, schema) {
|
|
3
|
+
if (!input || (Array.isArray(input) && input.length === 0)) {
|
|
4
|
+
return { map: {}, ids: [] };
|
|
5
|
+
}
|
|
6
|
+
const rootSchema = Array.isArray(schema) ? schema[0] : schema;
|
|
7
|
+
const bucket = {};
|
|
8
|
+
const visited = new WeakMap();
|
|
9
|
+
const ids = this.runInternal(input, rootSchema, bucket, visited);
|
|
10
|
+
return {
|
|
11
|
+
map: bucket,
|
|
12
|
+
ids,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
// ===== helpers =====
|
|
16
|
+
ensureBucket(bucket, entityKey) {
|
|
17
|
+
if (!bucket[entityKey]) {
|
|
18
|
+
bucket[entityKey] = {};
|
|
19
|
+
}
|
|
20
|
+
return bucket[entityKey];
|
|
21
|
+
}
|
|
22
|
+
// ===== normalize entity =====
|
|
23
|
+
normalizeEntity(raw, schema, bucket, visited) {
|
|
24
|
+
const id = schema.getId(raw);
|
|
25
|
+
if (typeof raw === 'object' && raw !== null) {
|
|
26
|
+
if (visited.has(raw)) {
|
|
27
|
+
return id;
|
|
28
|
+
}
|
|
29
|
+
visited.set(raw, true);
|
|
30
|
+
}
|
|
31
|
+
const cleaned = { ...raw };
|
|
32
|
+
for (const field in schema.definition) {
|
|
33
|
+
const subschema = schema.definition[field];
|
|
34
|
+
const isArray = Array.isArray(subschema);
|
|
35
|
+
const childSchema = isArray ? subschema[0] : subschema;
|
|
36
|
+
const idField = `${field}Id`;
|
|
37
|
+
const nestedValue = raw[field];
|
|
38
|
+
if (nestedValue) {
|
|
39
|
+
const ids = this.runInternal(nestedValue, childSchema, bucket, visited);
|
|
40
|
+
cleaned[idField] = isArray ? ids : ids[0];
|
|
41
|
+
delete cleaned[field];
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const fallbackId = raw[idField];
|
|
45
|
+
if (fallbackId) {
|
|
46
|
+
const entityBucket = this.ensureBucket(bucket, childSchema.key);
|
|
47
|
+
if (!entityBucket[fallbackId]) {
|
|
48
|
+
entityBucket[fallbackId] = {
|
|
49
|
+
id: fallbackId,
|
|
50
|
+
__partial: true,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
cleaned[idField] = fallbackId;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const entityBucket = this.ensureBucket(bucket, schema.key);
|
|
57
|
+
entityBucket[id] = cleaned;
|
|
58
|
+
return id;
|
|
59
|
+
}
|
|
60
|
+
// ===== normalize array =====
|
|
61
|
+
normalizeArray(list, schema, bucket, visited) {
|
|
62
|
+
return list.map(item => this.normalizeEntity(item, schema, bucket, visited));
|
|
63
|
+
}
|
|
64
|
+
// ===== recursive runner =====
|
|
65
|
+
runInternal(input, schema, bucket, visited) {
|
|
66
|
+
if (Array.isArray(input)) {
|
|
67
|
+
return this.normalizeArray(input, schema, bucket, visited);
|
|
68
|
+
}
|
|
69
|
+
return [this.normalizeEntity(input, schema, bucket, visited)];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// ===== factory =====
|
|
73
|
+
export function createNormalizer() {
|
|
74
|
+
const instance = new Normalizer();
|
|
75
|
+
return {
|
|
76
|
+
normalize: (input, schema) => instance.normalize(input, schema),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/entities/normalize.ts"],"names":[],"mappings":"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"}
|