@nexigen/entity-normalizer 0.1.1 → 0.1.3
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 +11 -2
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { makeAutoObservable, observable } from 'mobx';
|
|
2
|
+
import { META } from '../constants/values';
|
|
3
|
+
export class EntitiesStore {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.buckets = new Map();
|
|
6
|
+
this.onMergeCallbacks = new Set();
|
|
7
|
+
Object.defineProperty(this, 'buckets', {
|
|
8
|
+
enumerable: false,
|
|
9
|
+
writable: true,
|
|
10
|
+
configurable: false,
|
|
11
|
+
});
|
|
12
|
+
makeAutoObservable(this, {
|
|
13
|
+
buckets: false,
|
|
14
|
+
onMergeCallbacks: false,
|
|
15
|
+
getSnapshot: false,
|
|
16
|
+
getSnapshotKeys: false,
|
|
17
|
+
getSnapshotByKey: false,
|
|
18
|
+
reset: true,
|
|
19
|
+
}, { autoBind: true });
|
|
20
|
+
}
|
|
21
|
+
// ===== callbacks =====
|
|
22
|
+
addOnMergeCallback(fn) {
|
|
23
|
+
this.onMergeCallbacks.add(fn);
|
|
24
|
+
}
|
|
25
|
+
removeOnMergeCallback(fn) {
|
|
26
|
+
this.onMergeCallbacks.delete(fn);
|
|
27
|
+
}
|
|
28
|
+
triggerMergeCallbacks() {
|
|
29
|
+
for (const fn of this.onMergeCallbacks) {
|
|
30
|
+
fn();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// ===== buckets =====
|
|
34
|
+
getBucket(key) {
|
|
35
|
+
return this.buckets.get(key);
|
|
36
|
+
}
|
|
37
|
+
ensureBucket(key) {
|
|
38
|
+
let bucket = this.getBucket(key);
|
|
39
|
+
if (!bucket) {
|
|
40
|
+
bucket = observable.object({}, {}, { deep: false });
|
|
41
|
+
this.buckets.set(key, bucket);
|
|
42
|
+
}
|
|
43
|
+
return bucket;
|
|
44
|
+
}
|
|
45
|
+
// ===== merge =====
|
|
46
|
+
merge(newEntities) {
|
|
47
|
+
for (const key in newEntities) {
|
|
48
|
+
const bucket = this.ensureBucket(key);
|
|
49
|
+
const incomingBucket = newEntities[key];
|
|
50
|
+
if (!incomingBucket) {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
for (const id in incomingBucket) {
|
|
54
|
+
const incoming = incomingBucket[id];
|
|
55
|
+
const existing = bucket[id];
|
|
56
|
+
if (existing) {
|
|
57
|
+
Object.assign(existing, incoming);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
bucket[id] = incoming;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
this.triggerMergeCallbacks();
|
|
65
|
+
}
|
|
66
|
+
// ===== read =====
|
|
67
|
+
hasEntity(entityKey, id) {
|
|
68
|
+
return !!this.getBucket(entityKey)?.[id];
|
|
69
|
+
}
|
|
70
|
+
getEntity(entityKey, id) {
|
|
71
|
+
const entity = this.getBucket(entityKey)?.[id];
|
|
72
|
+
if (entity?.[META]) {
|
|
73
|
+
entity[META].accessedAt = Date.now();
|
|
74
|
+
}
|
|
75
|
+
return entity;
|
|
76
|
+
}
|
|
77
|
+
getAll(entityKey) {
|
|
78
|
+
const bucket = this.getBucket(entityKey);
|
|
79
|
+
return bucket ? Object.values(bucket) : [];
|
|
80
|
+
}
|
|
81
|
+
getCount(entityKey) {
|
|
82
|
+
return Object.keys(this.getBucket(entityKey) ?? {}).length;
|
|
83
|
+
}
|
|
84
|
+
// ===== remove =====
|
|
85
|
+
remove(entityKey, id) {
|
|
86
|
+
const bucket = this.getBucket(entityKey);
|
|
87
|
+
if (!bucket) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
delete bucket[id];
|
|
91
|
+
this.triggerMergeCallbacks();
|
|
92
|
+
}
|
|
93
|
+
removeMany(toRemove) {
|
|
94
|
+
for (const key in toRemove) {
|
|
95
|
+
const bucket = this.getBucket(key);
|
|
96
|
+
if (!bucket) {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const ids = toRemove[key];
|
|
100
|
+
if (!ids || ids.size === 0) {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
ids.forEach(id => {
|
|
104
|
+
delete bucket[id];
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
this.triggerMergeCallbacks();
|
|
108
|
+
}
|
|
109
|
+
// ===== reset =====
|
|
110
|
+
reset(entityKey) {
|
|
111
|
+
if (entityKey) {
|
|
112
|
+
this.buckets.set(entityKey, observable.object({}, {}, { deep: false }));
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
for (const key of this.buckets.keys()) {
|
|
116
|
+
this.buckets.set(key, observable.object({}, {}, { deep: false }));
|
|
117
|
+
}
|
|
118
|
+
this.triggerMergeCallbacks();
|
|
119
|
+
}
|
|
120
|
+
// ===== snapshot =====
|
|
121
|
+
get getSnapshot() {
|
|
122
|
+
const out = {};
|
|
123
|
+
for (const [key, bucket] of this.buckets.entries()) {
|
|
124
|
+
out[key] = { ...bucket };
|
|
125
|
+
}
|
|
126
|
+
return out;
|
|
127
|
+
}
|
|
128
|
+
get getSnapshotKeys() {
|
|
129
|
+
return Array.from(this.buckets.keys());
|
|
130
|
+
}
|
|
131
|
+
getSnapshotByKey(entityKey) {
|
|
132
|
+
const bucket = this.getBucket(entityKey);
|
|
133
|
+
if (!bucket) {
|
|
134
|
+
return {};
|
|
135
|
+
}
|
|
136
|
+
const out = {};
|
|
137
|
+
for (const [id, entity] of Object.entries(bucket)) {
|
|
138
|
+
const { [META]: meta, ...rest } = entity;
|
|
139
|
+
out[id] = {
|
|
140
|
+
...rest,
|
|
141
|
+
[META]: meta
|
|
142
|
+
? {
|
|
143
|
+
createdAt: meta.createdAt,
|
|
144
|
+
updatedAt: meta.updatedAt,
|
|
145
|
+
accessedAt: meta.accessedAt,
|
|
146
|
+
refSources: Array.from(meta.refSources ?? []),
|
|
147
|
+
}
|
|
148
|
+
: undefined,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
return out;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/entities/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { EntitySchema } from './schema';
|
|
2
|
+
import type { EntitiesStore } from './store';
|
|
3
|
+
import type { META } from '../constants/values';
|
|
4
|
+
/**
|
|
5
|
+
* Runtime schema type for infra layers
|
|
6
|
+
*/
|
|
7
|
+
export type AnySchema = EntitySchema<any, any>;
|
|
8
|
+
/**
|
|
9
|
+
* Generic entity buckets shape
|
|
10
|
+
* key -> entityKey (string)
|
|
11
|
+
* value -> map of id -> stored entity
|
|
12
|
+
*/
|
|
13
|
+
export type EntityBuckets = Record<string, Record<string, StoredEntity<any>>>;
|
|
14
|
+
/**
|
|
15
|
+
* Resolver injected into models
|
|
16
|
+
*/
|
|
17
|
+
export type GetEntity = <T = any>(entityKey: string, id: string | number) => PublicEntity<StoredEntity<T>> | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* Entity model constructor contract
|
|
20
|
+
*/
|
|
21
|
+
export interface EntityModelCtor<TDto, TModel> {
|
|
22
|
+
new (dto: TDto, getEntity: GetEntity): TModel;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Schema options (runtime-oriented)
|
|
26
|
+
*/
|
|
27
|
+
export interface EntitySchemaOptions<TDto, TModel> {
|
|
28
|
+
idAttribute?: ((input: any) => string | number) | string;
|
|
29
|
+
processStrategy?: (input: any) => any;
|
|
30
|
+
mergeStrategy?: (a: any, b: any) => any;
|
|
31
|
+
model?: EntityModelCtor<TDto, TModel>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Core store type (no domain knowledge)
|
|
35
|
+
*/
|
|
36
|
+
export type TEntitiesStore = EntitiesStore;
|
|
37
|
+
/**
|
|
38
|
+
* Entity metadata (infra concern)
|
|
39
|
+
*/
|
|
40
|
+
export type EntityMeta = {
|
|
41
|
+
createdAt: number;
|
|
42
|
+
updatedAt: number;
|
|
43
|
+
accessedAt: number;
|
|
44
|
+
refSources?: Set<string>;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Stored entity = model + meta
|
|
48
|
+
*/
|
|
49
|
+
export type StoredEntity<T> = T & {
|
|
50
|
+
_meta_nexigen: EntityMeta;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Garbage collector item
|
|
54
|
+
*/
|
|
55
|
+
export type EntityGarbageCollectorItem = {
|
|
56
|
+
id: string;
|
|
57
|
+
meta: EntityMeta;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Normalization output
|
|
61
|
+
*/
|
|
62
|
+
export interface NormalizedOutput {
|
|
63
|
+
map: Partial<EntityBuckets>;
|
|
64
|
+
ids: (string | number)[];
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Entity processing options
|
|
68
|
+
*/
|
|
69
|
+
export interface EntityProcessOptions<T> {
|
|
70
|
+
data: T | T[];
|
|
71
|
+
entityKey: string;
|
|
72
|
+
sourceRefId: string;
|
|
73
|
+
isCollection?: boolean;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Persist snapshot shape
|
|
77
|
+
*/
|
|
78
|
+
export type EntitiesSnapshot = Record<string, Record<string, any>>;
|
|
79
|
+
/**
|
|
80
|
+
* Public projection (hide meta from DX)
|
|
81
|
+
*/
|
|
82
|
+
export type PublicEntity<T> = Omit<T, typeof META>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/entities/types.ts"],"names":[],"mappings":""}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { createDuck } from './async';
|
|
2
|
+
import { createStoreHooks } from './create-store-hooks';
|
|
3
|
+
import { registerRootStore } from './di';
|
|
4
|
+
import { createEntitySchema } from './entities/create-entity-schema';
|
|
5
|
+
import { createRootStore } from './root';
|
|
6
|
+
export * from './root/coreApi/public';
|
|
7
|
+
export * from './root/public';
|
|
8
|
+
export * from './entities/record/public';
|
|
9
|
+
export * from './entities/collection/public';
|
|
10
|
+
export * from './entities/public';
|
|
11
|
+
export * from './async/public';
|
|
12
|
+
export { registerRootStore, createRootStore, createStoreHooks, createDuck, createEntitySchema, };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createDuck } from './async';
|
|
2
|
+
import { createStoreHooks } from './create-store-hooks';
|
|
3
|
+
import { registerRootStore } from './di';
|
|
4
|
+
import { createEntitySchema } from './entities/create-entity-schema';
|
|
5
|
+
import { createRootStore } from './root';
|
|
6
|
+
export * from './root/coreApi/public';
|
|
7
|
+
export * from './root/public';
|
|
8
|
+
export * from './entities/record/public';
|
|
9
|
+
export * from './entities/collection/public';
|
|
10
|
+
export * from './entities/public';
|
|
11
|
+
export * from './async/public';
|
|
12
|
+
export { registerRootStore, createRootStore, createStoreHooks, createDuck, createEntitySchema, };
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAEzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAE/B,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,kBAAkB,GACnB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { SET_PERSISTENCE } from './marker';
|
|
2
|
+
import type { CoreAPI } from './coreApi/types';
|
|
3
|
+
import type { RootStoreDeps, StoreClassMap, ServiceClassMap, PersistenceNotifier } from './types';
|
|
4
|
+
import type { AnySchema } from '../entities/types';
|
|
5
|
+
export declare class RootStore<TApi, TSchemaMap extends Record<string, AnySchema>, TStores extends StoreClassMap<any, any>, TServices extends ServiceClassMap<any, any>> {
|
|
6
|
+
private deps;
|
|
7
|
+
core: CoreAPI<{
|
|
8
|
+
[K in keyof TStores]: InstanceType<TStores[K]>;
|
|
9
|
+
}>;
|
|
10
|
+
private entities;
|
|
11
|
+
private entitiesCleaner;
|
|
12
|
+
private persistence?;
|
|
13
|
+
[SET_PERSISTENCE](notifier: PersistenceNotifier): void;
|
|
14
|
+
stores: {
|
|
15
|
+
[K in keyof TStores]: InstanceType<TStores[K]>;
|
|
16
|
+
};
|
|
17
|
+
services: {
|
|
18
|
+
[K in keyof TServices]: InstanceType<TServices[K]>;
|
|
19
|
+
};
|
|
20
|
+
private _isInitialized;
|
|
21
|
+
constructor(deps: RootStoreDeps<TApi, TSchemaMap, TStores, TServices>);
|
|
22
|
+
private get isInitialized();
|
|
23
|
+
private setInitialized;
|
|
24
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { makeAutoObservable } from 'mobx';
|
|
2
|
+
import { createStore } from '../create';
|
|
3
|
+
import { EntityCleanerStore } from '../entities/cleaner';
|
|
4
|
+
import { COLLECTION_TAG, MULTI_COLLECTION_TAG, } from '../entities/collection/marker';
|
|
5
|
+
import { RECORD_TAG } from '../entities/record/marker';
|
|
6
|
+
import { EntitiesStore } from '../entities/store';
|
|
7
|
+
import { createCoreAPI } from './coreApi/create-core-api';
|
|
8
|
+
import { noopPersistence } from './fallback';
|
|
9
|
+
import { SET_PERSISTENCE } from './marker';
|
|
10
|
+
export class RootStore {
|
|
11
|
+
[SET_PERSISTENCE](notifier) {
|
|
12
|
+
this.persistence = notifier;
|
|
13
|
+
}
|
|
14
|
+
constructor(deps) {
|
|
15
|
+
this.deps = deps;
|
|
16
|
+
this._isInitialized = false;
|
|
17
|
+
const self = this;
|
|
18
|
+
// ---------------------------------------------
|
|
19
|
+
// Core systems
|
|
20
|
+
// ---------------------------------------------
|
|
21
|
+
this.entities = new EntitiesStore();
|
|
22
|
+
this.entitiesCleaner = new EntityCleanerStore(this.entities, this.deps.schemaMap);
|
|
23
|
+
const storesRef = {};
|
|
24
|
+
this.core = createCoreAPI({
|
|
25
|
+
lifecycle: {
|
|
26
|
+
getIsInitialized: () => self.isInitialized,
|
|
27
|
+
setInitialized: (v) => self.setInitialized(v),
|
|
28
|
+
},
|
|
29
|
+
entities: {
|
|
30
|
+
entities: this.entities,
|
|
31
|
+
entitiesCleaner: this.entitiesCleaner,
|
|
32
|
+
schemaMap: this.deps.schemaMap,
|
|
33
|
+
getPersistence: () => this.persistence ?? noopPersistence,
|
|
34
|
+
},
|
|
35
|
+
stores: storesRef,
|
|
36
|
+
__internal: {
|
|
37
|
+
setPersistence: notifier => {
|
|
38
|
+
this[SET_PERSISTENCE](notifier);
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
// ---------------------------------------------
|
|
43
|
+
// Deps
|
|
44
|
+
// ---------------------------------------------
|
|
45
|
+
const domainDeps = {
|
|
46
|
+
api: deps.api,
|
|
47
|
+
get stores() {
|
|
48
|
+
return self.stores;
|
|
49
|
+
},
|
|
50
|
+
get services() {
|
|
51
|
+
return self.services;
|
|
52
|
+
},
|
|
53
|
+
core: this.core,
|
|
54
|
+
};
|
|
55
|
+
const systemDeps = {
|
|
56
|
+
getPersistence: () => this.persistence ?? noopPersistence,
|
|
57
|
+
entities: this.entities,
|
|
58
|
+
};
|
|
59
|
+
const combinedDeps = {
|
|
60
|
+
domain: domainDeps,
|
|
61
|
+
system: systemDeps,
|
|
62
|
+
};
|
|
63
|
+
// ---------------------------------------------
|
|
64
|
+
// Plugins
|
|
65
|
+
// ---------------------------------------------
|
|
66
|
+
const decorators = {
|
|
67
|
+
isRecord: (v) => v?.[RECORD_TAG] === true,
|
|
68
|
+
isCollection: (v) => v?.[COLLECTION_TAG] === true,
|
|
69
|
+
isMultiCollection: (v) => v?.[MULTI_COLLECTION_TAG] === true,
|
|
70
|
+
};
|
|
71
|
+
for (const plugin of this.deps.plugins ?? []) {
|
|
72
|
+
plugin.setup({
|
|
73
|
+
entities: this.entities,
|
|
74
|
+
core: this.core,
|
|
75
|
+
config: plugin.config,
|
|
76
|
+
domain: domainDeps,
|
|
77
|
+
decorators,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
// ---------------------------------------------
|
|
81
|
+
// Build stores
|
|
82
|
+
// ---------------------------------------------
|
|
83
|
+
this.stores = Object.fromEntries(Object.entries(this.deps.stores).map(([key, StoreClass]) => {
|
|
84
|
+
const instance = createStore(StoreClass, combinedDeps);
|
|
85
|
+
return [key, instance];
|
|
86
|
+
}));
|
|
87
|
+
Object.assign(storesRef, this.stores);
|
|
88
|
+
// ---------------------------------------------
|
|
89
|
+
// Build services
|
|
90
|
+
// ---------------------------------------------
|
|
91
|
+
this.services = Object.fromEntries(Object.entries(this.deps.services).map(([key, ServiceClass]) => {
|
|
92
|
+
const instance = new ServiceClass(domainDeps);
|
|
93
|
+
Object.defineProperty(instance, 'deps', {
|
|
94
|
+
enumerable: false,
|
|
95
|
+
configurable: true,
|
|
96
|
+
writable: true,
|
|
97
|
+
});
|
|
98
|
+
return [key, instance];
|
|
99
|
+
}));
|
|
100
|
+
// Hide cyclical getters inside domainDeps
|
|
101
|
+
Object.defineProperty(this, 'deps', {
|
|
102
|
+
enumerable: false,
|
|
103
|
+
configurable: true,
|
|
104
|
+
writable: true,
|
|
105
|
+
});
|
|
106
|
+
Object.defineProperty(domainDeps, 'stores', {
|
|
107
|
+
enumerable: false,
|
|
108
|
+
configurable: true,
|
|
109
|
+
});
|
|
110
|
+
Object.defineProperty(domainDeps, 'services', {
|
|
111
|
+
enumerable: false,
|
|
112
|
+
configurable: true,
|
|
113
|
+
});
|
|
114
|
+
Object.defineProperty(domainDeps, 'core', {
|
|
115
|
+
enumerable: false,
|
|
116
|
+
configurable: true,
|
|
117
|
+
});
|
|
118
|
+
Object.defineProperty(this.core, '__internal', {
|
|
119
|
+
enumerable: false,
|
|
120
|
+
});
|
|
121
|
+
makeAutoObservable(this, {
|
|
122
|
+
core: false,
|
|
123
|
+
services: false,
|
|
124
|
+
stores: false,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
get isInitialized() {
|
|
128
|
+
return this._isInitialized;
|
|
129
|
+
}
|
|
130
|
+
setInitialized(v) {
|
|
131
|
+
this._isInitialized = v;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=RootStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RootStore.js","sourceRoot":"","sources":["../../src/root/RootStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CoreAPI, CoreEntitiesDeps, CoreLifecycleDeps, CoreStoresDeps, CoreInternalAPI } from './types';
|
|
2
|
+
export declare function createCoreAPI<TStores extends Record<string, any>>(deps: {
|
|
3
|
+
lifecycle: CoreLifecycleDeps;
|
|
4
|
+
entities: CoreEntitiesDeps;
|
|
5
|
+
stores: CoreStoresDeps<TStores>;
|
|
6
|
+
__internal: CoreInternalAPI;
|
|
7
|
+
}): CoreAPI<TStores>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { createEntitiesAPI } from './entities';
|
|
2
|
+
import { createLifecycleAPI } from './lifecycle';
|
|
3
|
+
import { createStoresAPI } from './stores';
|
|
4
|
+
export function createCoreAPI(deps) {
|
|
5
|
+
return {
|
|
6
|
+
lifecycle: createLifecycleAPI(deps.lifecycle),
|
|
7
|
+
entities: createEntitiesAPI(deps.entities),
|
|
8
|
+
stores: createStoresAPI(deps.stores),
|
|
9
|
+
__internal: deps.__internal,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=create-core-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-core-api.js","sourceRoot":"","sources":["../../../src/root/coreApi/create-core-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAU3C,MAAM,UAAU,aAAa,CAAsC,IAKlE;IACC,OAAO;QACL,SAAS,EAAE,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC;QAC7C,QAAQ,EAAE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC1C,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;QACpC,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { EntityCleanerStore } from '../../entities/cleaner';
|
|
2
|
+
import type { TEntitiesStore } from '../../entities/types';
|
|
3
|
+
import type { TSchemaMap, PersistenceNotifier } from '../types';
|
|
4
|
+
import type { CoreEntitiesAPI } from './types';
|
|
5
|
+
export declare function createEntitiesAPI(deps: {
|
|
6
|
+
entities: TEntitiesStore;
|
|
7
|
+
schemaMap: TSchemaMap;
|
|
8
|
+
entitiesCleaner: EntityCleanerStore;
|
|
9
|
+
getPersistence: () => PersistenceNotifier | undefined;
|
|
10
|
+
}): CoreEntitiesAPI;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { createEntityCollection, createMultiEntityCollection, } from '../../entities/collection/create-entity-collection';
|
|
2
|
+
import { createEntityProcessor, createEntityRestorer, } from '../../entities/processor';
|
|
3
|
+
import { createEntityRecord } from '../../entities/record/create-entity-record';
|
|
4
|
+
export function createEntitiesAPI(deps) {
|
|
5
|
+
const { entities, entitiesCleaner, schemaMap, getPersistence } = deps;
|
|
6
|
+
const notify = () => {
|
|
7
|
+
getPersistence?.()?.onPointersChanged?.();
|
|
8
|
+
};
|
|
9
|
+
return {
|
|
10
|
+
createRecord(options) {
|
|
11
|
+
return createEntityRecord(options, {
|
|
12
|
+
entities,
|
|
13
|
+
notify,
|
|
14
|
+
entitiesCleaner,
|
|
15
|
+
entitiesApi: this,
|
|
16
|
+
});
|
|
17
|
+
},
|
|
18
|
+
createCollection(options) {
|
|
19
|
+
return createEntityCollection(options, {
|
|
20
|
+
entities,
|
|
21
|
+
entitiesCleaner,
|
|
22
|
+
notify,
|
|
23
|
+
entitiesApi: this,
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
createMultiCollection(options) {
|
|
27
|
+
return createMultiEntityCollection(options, {
|
|
28
|
+
entities,
|
|
29
|
+
entitiesCleaner,
|
|
30
|
+
notify,
|
|
31
|
+
entitiesApi: this,
|
|
32
|
+
});
|
|
33
|
+
},
|
|
34
|
+
process(options) {
|
|
35
|
+
return createEntityProcessor(entities, schemaMap, options);
|
|
36
|
+
},
|
|
37
|
+
hydrate(snapshot) {
|
|
38
|
+
return createEntityRestorer(entities, schemaMap)(snapshot);
|
|
39
|
+
},
|
|
40
|
+
get(key, id) {
|
|
41
|
+
return entities.getEntity(key, id);
|
|
42
|
+
},
|
|
43
|
+
getAll(key) {
|
|
44
|
+
return entities.getAll(key);
|
|
45
|
+
},
|
|
46
|
+
getCount(key) {
|
|
47
|
+
return entities.getCount(key);
|
|
48
|
+
},
|
|
49
|
+
getSnapshot() {
|
|
50
|
+
return entities.getSnapshot;
|
|
51
|
+
},
|
|
52
|
+
getSchema(key) {
|
|
53
|
+
return schemaMap[key];
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=entities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entities.js","sourceRoot":"","sources":["../../../src/root/coreApi/entities.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,2BAA2B,GAC5B,MAAM,oDAAoD,CAAC;AAC5D,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAchF,MAAM,UAAU,iBAAiB,CAAC,IAKjC;IACC,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;IAEtE,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,cAAc,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,CAAC;IAC5C,CAAC,CAAC;IAEF,OAAO;QACL,YAAY,CAAuC,OAGlD;YACC,OAAO,kBAAkB,CAAO,OAAO,EAAE;gBACvC,QAAQ;gBACR,MAAM;gBACN,eAAe;gBACf,WAAW,EAAE,IAAI;aAClB,CAAC,CAAC;QACL,CAAC;QAED,gBAAgB,CACd,OAAmC;YAEnC,OAAO,sBAAsB,CAAO,OAAO,EAAE;gBAC3C,QAAQ;gBACR,eAAe;gBACf,MAAM;gBACN,WAAW,EAAE,IAAI;aAClB,CAAC,CAAC;QACL,CAAC;QAED,qBAAqB,CACnB,OAAmC;YAEnC,OAAO,2BAA2B,CAAO,OAAO,EAAE;gBAChD,QAAQ;gBACR,eAAe;gBACf,MAAM;gBACN,WAAW,EAAE,IAAI;aAClB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CACL,OAAyD;YAEzD,OAAO,qBAAqB,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,CAAC,QAA6C;YACnD,OAAO,oBAAoB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7D,CAAC;QAED,GAAG,CAAmB,GAAM,EAAE,EAAmB;YAC/C,OAAO,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,CAAQ,CAAC;QAC5C,CAAC;QAED,MAAM,CAAmB,GAAM;YAC7B,OAAO,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAQ,CAAC;QACrC,CAAC;QAED,QAAQ,CAAmB,GAAM;YAC/B,OAAO,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QAED,WAAW;YACT,OAAO,QAAQ,CAAC,WAAW,CAAC;QAC9B,CAAC;QAED,SAAS,CAAsB,GAAS;YACtC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/root/coreApi/lifecycle.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,kBAAkB,CAAC,IAGlC;IACC,OAAO;QACL,IAAI,aAAa;YACf,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACjC,CAAC;QACD,cAAc,EAAE,IAAI,CAAC,cAAc;KACpC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { EntityCollection } from '../../entities/collection/public';
|
|
2
|
+
import type { MultiEntityCollection } from '../../entities/collection/public';
|
|
3
|
+
import type { EntityId } from '../../entities/public';
|
|
4
|
+
import type { EntityRecord } from '../../entities/record/public';
|
|
5
|
+
/**
|
|
6
|
+
* Snapshot of a single store
|
|
7
|
+
* Shape is store-defined
|
|
8
|
+
*/
|
|
9
|
+
export type StoreSnapshot = Record<string, any>;
|
|
10
|
+
/**
|
|
11
|
+
* Snapshot of all stores
|
|
12
|
+
*/
|
|
13
|
+
export type StoresSnapshot<TStores> = {
|
|
14
|
+
[K in keyof TStores]?: StoreSnapshot;
|
|
15
|
+
};
|
|
16
|
+
export interface EntityProcessOptions<T> {
|
|
17
|
+
data: T | T[];
|
|
18
|
+
entityKey: string;
|
|
19
|
+
sourceRefId: string;
|
|
20
|
+
isCollection?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export type CoreEntitiesAPI = {
|
|
23
|
+
createRecord<T extends {
|
|
24
|
+
id: EntityId;
|
|
25
|
+
}, M>(options: {
|
|
26
|
+
entityKey: string;
|
|
27
|
+
recordId: string;
|
|
28
|
+
}): EntityRecord<T, M>;
|
|
29
|
+
createCollection<T extends {
|
|
30
|
+
id: EntityId;
|
|
31
|
+
}, M>(options: {
|
|
32
|
+
entityKey: string;
|
|
33
|
+
collectionId?: string;
|
|
34
|
+
limit?: number;
|
|
35
|
+
reversed?: boolean;
|
|
36
|
+
hasNoMore?: boolean;
|
|
37
|
+
}): EntityCollection<T, M>;
|
|
38
|
+
createMultiCollection<T extends {
|
|
39
|
+
id: EntityId;
|
|
40
|
+
}, M>(options: {
|
|
41
|
+
entityKey: string;
|
|
42
|
+
collectionId?: string;
|
|
43
|
+
limit?: number;
|
|
44
|
+
reversed?: boolean;
|
|
45
|
+
hasNoMore?: boolean;
|
|
46
|
+
}): MultiEntityCollection<T, M>;
|
|
47
|
+
process<TDto>(options: EntityProcessOptions<TDto>): EntityId[];
|
|
48
|
+
hydrate(snapshot: Record<string, Record<string, any>> | null | undefined): void;
|
|
49
|
+
get<T = any>(entityKey: string, id: EntityId): T | undefined;
|
|
50
|
+
getAll<T = any>(entityKey: string): T[];
|
|
51
|
+
getCount(entityKey: string): number;
|
|
52
|
+
getSnapshot(): Record<string, any>;
|
|
53
|
+
getSchema(entityKey: string): unknown;
|
|
54
|
+
};
|
|
55
|
+
export type CoreStoresAPI<TStores> = {
|
|
56
|
+
getSnapshot(): StoresSnapshot<TStores>;
|
|
57
|
+
getSnapshotByKey<K extends keyof TStores>(key: K): StoresSnapshot<TStores>[K];
|
|
58
|
+
applySnapshot(snapshot: StoresSnapshot<TStores>): void;
|
|
59
|
+
applySnapshotByKey<K extends keyof TStores>(key: K, snapshot: StoresSnapshot<TStores>[K]): void;
|
|
60
|
+
resetAll(): void;
|
|
61
|
+
resetByKey<K extends keyof TStores>(key: K): void;
|
|
62
|
+
};
|
|
63
|
+
export type CoreLifecycleAPI = {
|
|
64
|
+
readonly isInitialized: boolean;
|
|
65
|
+
setInitialized(v: boolean): void;
|
|
66
|
+
};
|
|
67
|
+
export type CoreAPI<TStores = {}> = {
|
|
68
|
+
lifecycle: CoreLifecycleAPI;
|
|
69
|
+
entities: CoreEntitiesAPI;
|
|
70
|
+
stores: CoreStoresAPI<TStores>;
|
|
71
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public.js","sourceRoot":"","sources":["../../../src/root/coreApi/public.ts"],"names":[],"mappings":"AAAA;;;4DAG4D"}
|