@ngrx-traits/core 0.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/README.md +24 -0
- package/bundles/ngrx-traits-core-testing.umd.js +52 -0
- package/bundles/ngrx-traits-core-testing.umd.js.map +1 -0
- package/bundles/ngrx-traits-core.umd.js +1212 -0
- package/bundles/ngrx-traits-core.umd.js.map +1 -0
- package/cache/cache.actions.d.ts +29 -0
- package/cache/cache.models.d.ts +20 -0
- package/cache/cache.module.d.ts +7 -0
- package/cache/cache.reducer.d.ts +3 -0
- package/cache/cache.selectors.d.ts +3 -0
- package/cache/cache.service.d.ts +65 -0
- package/cache/index.d.ts +17 -0
- package/create-entity-feature.d.ts +59 -0
- package/esm2015/cache/cache.actions.js +6 -0
- package/esm2015/cache/cache.actions.js.map +1 -0
- package/esm2015/cache/cache.models.js +31 -0
- package/esm2015/cache/cache.models.js.map +1 -0
- package/esm2015/cache/cache.module.js +18 -0
- package/esm2015/cache/cache.module.js.map +1 -0
- package/esm2015/cache/cache.reducer.js +141 -0
- package/esm2015/cache/cache.reducer.js.map +1 -0
- package/esm2015/cache/cache.selectors.js +5 -0
- package/esm2015/cache/cache.selectors.js.map +1 -0
- package/esm2015/cache/cache.service.js +72 -0
- package/esm2015/cache/cache.service.js.map +1 -0
- package/esm2015/cache/index.js +7 -0
- package/esm2015/cache/index.js.map +1 -0
- package/esm2015/create-entity-feature.js +283 -0
- package/esm2015/create-entity-feature.js.map +1 -0
- package/esm2015/index.js +7 -0
- package/esm2015/index.js.map +1 -0
- package/esm2015/local-store/disable-local-trait-effects.token.js +6 -0
- package/esm2015/local-store/disable-local-trait-effects.token.js.map +1 -0
- package/esm2015/local-store/index.js +3 -0
- package/esm2015/local-store/index.js.map +1 -0
- package/esm2015/local-store/traits-local-store.js +75 -0
- package/esm2015/local-store/traits-local-store.js.map +1 -0
- package/esm2015/model.js +28 -0
- package/esm2015/model.js.map +1 -0
- package/esm2015/ngrx-traits-core.js +5 -0
- package/esm2015/ngrx-traits-core.js.map +1 -0
- package/esm2015/public_api.js +2 -0
- package/esm2015/public_api.js.map +1 -0
- package/esm2015/testing/index.js +2 -0
- package/esm2015/testing/index.js.map +1 -0
- package/esm2015/testing/ngrx-traits-core-testing.js +5 -0
- package/esm2015/testing/ngrx-traits-core-testing.js.map +1 -0
- package/esm2015/testing/provide-mock-local-traits.js +39 -0
- package/esm2015/testing/provide-mock-local-traits.js.map +1 -0
- package/esm2015/testing/public_api.js +2 -0
- package/esm2015/testing/public_api.js.map +1 -0
- package/esm2015/trait-effect.js +32 -0
- package/esm2015/trait-effect.js.map +1 -0
- package/esm2015/util.js +17 -0
- package/esm2015/util.js.map +1 -0
- package/fesm2015/ngrx-traits-core-testing.js +46 -0
- package/fesm2015/ngrx-traits-core-testing.js.map +1 -0
- package/fesm2015/ngrx-traits-core.js +699 -0
- package/fesm2015/ngrx-traits-core.js.map +1 -0
- package/index.d.ts +6 -0
- package/local-store/disable-local-trait-effects.token.d.ts +5 -0
- package/local-store/index.d.ts +2 -0
- package/local-store/traits-local-store.d.ts +33 -0
- package/model.d.ts +103 -0
- package/ngrx-traits-core.d.ts +5 -0
- package/package.json +29 -0
- package/public_api.d.ts +1 -0
- package/testing/index.d.ts +1 -0
- package/testing/ngrx-traits-core-testing.d.ts +5 -0
- package/testing/package.json +10 -0
- package/testing/provide-mock-local-traits.d.ts +8 -0
- package/testing/public_api.d.ts +1 -0
- package/trait-effect.d.ts +16 -0
- package/util.d.ts +8 -0
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { createReducer, on } from '@ngrx/store';
|
|
2
|
+
import { hashKey, isCacheValid, } from './cache.models';
|
|
3
|
+
import * as CacheActions from './cache.actions';
|
|
4
|
+
export const initialState = {
|
|
5
|
+
keys: {},
|
|
6
|
+
};
|
|
7
|
+
export const cacheReducer = createReducer(initialState, on(CacheActions.cache, (state, { key, value, date, maxCacheSize }) => setCacheValue(hashKey(key), { value, date, invalid: false }, state, maxCacheSize)), on(CacheActions.invalidateCache, (state, { key }) => {
|
|
8
|
+
const k = hashKey(key);
|
|
9
|
+
return invalidateCache(k, state);
|
|
10
|
+
}), on(CacheActions.deleteCache, (state, { key }) => {
|
|
11
|
+
const k = hashKey(key);
|
|
12
|
+
return deleteCacheValue(k, state);
|
|
13
|
+
}), on(CacheActions.hitCache, (state, { key }) => {
|
|
14
|
+
const k = hashKey(key);
|
|
15
|
+
return increaseCacheHitCount(k, state);
|
|
16
|
+
}));
|
|
17
|
+
function setCacheValue(keys, value, state, maxCacheSize, expires) {
|
|
18
|
+
const newState = Object.assign({}, state);
|
|
19
|
+
let cache = newState;
|
|
20
|
+
let lastCache = undefined;
|
|
21
|
+
for (let i = 0; i < keys.length; i++) {
|
|
22
|
+
const key = keys[i];
|
|
23
|
+
cache.keys = (cache === null || cache === void 0 ? void 0 : cache.keys) ? Object.assign({}, cache === null || cache === void 0 ? void 0 : cache.keys) : {};
|
|
24
|
+
let v = cache.keys[key];
|
|
25
|
+
v = v ? Object.assign({}, v) : {};
|
|
26
|
+
cache.keys[key] = v;
|
|
27
|
+
lastCache = cache;
|
|
28
|
+
cache = v;
|
|
29
|
+
}
|
|
30
|
+
cache.data = cache.data
|
|
31
|
+
? Object.assign(Object.assign({}, value), { hitCount: cache.data.hitCount + 1 }) : Object.assign(Object.assign({}, value), { hitCount: 1 });
|
|
32
|
+
if (maxCacheSize &&
|
|
33
|
+
(lastCache === null || lastCache === void 0 ? void 0 : lastCache.keys) &&
|
|
34
|
+
Object.keys(lastCache.keys).length > maxCacheSize) {
|
|
35
|
+
const entries = findLessHitOrOldestCacheEntries(lastCache, expires !== null && expires !== void 0 ? expires : Infinity, maxCacheSize);
|
|
36
|
+
if (entries && entries.length) {
|
|
37
|
+
for (const [key] of entries) {
|
|
38
|
+
delete lastCache.keys[key];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return newState;
|
|
43
|
+
}
|
|
44
|
+
function findLessHitOrOldestCacheEntries(state, expires, maxCacheSize) {
|
|
45
|
+
if (!state.keys)
|
|
46
|
+
return undefined;
|
|
47
|
+
const entries = Object.entries(state.keys);
|
|
48
|
+
// find the newest key;
|
|
49
|
+
const [newestKey] = entries.reduce((a, b) => {
|
|
50
|
+
var _a, _b, _c, _d;
|
|
51
|
+
const aDate = (_b = (_a = a[1].data) === null || _a === void 0 ? void 0 : _a.date) !== null && _b !== void 0 ? _b : 0;
|
|
52
|
+
const bDate = (_d = (_c = b[1].data) === null || _c === void 0 ? void 0 : _c.date) !== null && _d !== void 0 ? _d : 0;
|
|
53
|
+
return aDate > bDate ? a : b;
|
|
54
|
+
});
|
|
55
|
+
const sorted = entries.sort(([aKey, aValue], [bKey, bValue]) => {
|
|
56
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
57
|
+
// ensures the newest key always wins
|
|
58
|
+
if (aKey === newestKey)
|
|
59
|
+
return -1;
|
|
60
|
+
if (bKey === newestKey)
|
|
61
|
+
return 1;
|
|
62
|
+
const aValid = aValue.data && isCacheValid(aValue.data, expires) ? 1 : 0;
|
|
63
|
+
const bValid = bValue.data && isCacheValid(bValue.data, expires) ? 1 : 0;
|
|
64
|
+
const diffValid = aValid - bValid;
|
|
65
|
+
const diffHit = ((_b = (_a = aValue.data) === null || _a === void 0 ? void 0 : _a.hitCount) !== null && _b !== void 0 ? _b : 0) - ((_d = (_c = bValue.data) === null || _c === void 0 ? void 0 : _c.hitCount) !== null && _d !== void 0 ? _d : 0);
|
|
66
|
+
const diffDate = ((_f = (_e = aValue.data) === null || _e === void 0 ? void 0 : _e.date) !== null && _f !== void 0 ? _f : 0) - ((_h = (_g = bValue.data) === null || _g === void 0 ? void 0 : _g.date) !== null && _h !== void 0 ? _h : 0);
|
|
67
|
+
return (-1 * (diffValid === 0 ? (diffHit === 0 ? diffDate : diffHit) : diffValid));
|
|
68
|
+
});
|
|
69
|
+
return sorted.slice(maxCacheSize);
|
|
70
|
+
}
|
|
71
|
+
function deleteCacheValue(keys, state) {
|
|
72
|
+
const newState = Object.assign({}, state);
|
|
73
|
+
let cache = newState;
|
|
74
|
+
for (const key of keys) {
|
|
75
|
+
if (!cache.keys)
|
|
76
|
+
return state;
|
|
77
|
+
cache.keys = Object.assign({}, cache === null || cache === void 0 ? void 0 : cache.keys);
|
|
78
|
+
let v = cache.keys[key];
|
|
79
|
+
if (!v)
|
|
80
|
+
return state;
|
|
81
|
+
v = Object.assign({}, v);
|
|
82
|
+
cache.keys[key] = v;
|
|
83
|
+
cache = v;
|
|
84
|
+
}
|
|
85
|
+
if (cache.data)
|
|
86
|
+
delete cache.data;
|
|
87
|
+
else if (cache.keys)
|
|
88
|
+
delete cache.keys;
|
|
89
|
+
return newState;
|
|
90
|
+
}
|
|
91
|
+
function invalidateCache(keys, state) {
|
|
92
|
+
var _a;
|
|
93
|
+
const newState = Object.assign({}, state);
|
|
94
|
+
let cache = newState;
|
|
95
|
+
for (const key of keys) {
|
|
96
|
+
if (!(cache === null || cache === void 0 ? void 0 : cache.keys))
|
|
97
|
+
return state;
|
|
98
|
+
cache.keys = Object.assign({}, cache === null || cache === void 0 ? void 0 : cache.keys);
|
|
99
|
+
let v = (_a = cache === null || cache === void 0 ? void 0 : cache.keys) === null || _a === void 0 ? void 0 : _a[key];
|
|
100
|
+
if (!v)
|
|
101
|
+
return state;
|
|
102
|
+
v = Object.assign({}, v);
|
|
103
|
+
cache.keys[key] = v;
|
|
104
|
+
cache = v;
|
|
105
|
+
}
|
|
106
|
+
cache && invalidaSubKeys(cache);
|
|
107
|
+
return newState;
|
|
108
|
+
}
|
|
109
|
+
function increaseCacheHitCount(keys, state) {
|
|
110
|
+
var _a;
|
|
111
|
+
const newState = Object.assign({}, state);
|
|
112
|
+
let cache = newState;
|
|
113
|
+
for (const key of keys) {
|
|
114
|
+
if (!(cache === null || cache === void 0 ? void 0 : cache.keys))
|
|
115
|
+
return state;
|
|
116
|
+
cache.keys = Object.assign({}, cache === null || cache === void 0 ? void 0 : cache.keys);
|
|
117
|
+
let v = (_a = cache === null || cache === void 0 ? void 0 : cache.keys) === null || _a === void 0 ? void 0 : _a[key];
|
|
118
|
+
if (!v)
|
|
119
|
+
return state;
|
|
120
|
+
v = Object.assign({}, v);
|
|
121
|
+
cache.keys[key] = v;
|
|
122
|
+
cache = v;
|
|
123
|
+
}
|
|
124
|
+
if (!cache.data)
|
|
125
|
+
return state;
|
|
126
|
+
cache.data = Object.assign(Object.assign({}, cache.data), { hitCount: cache.data.hitCount + 1 });
|
|
127
|
+
return newState;
|
|
128
|
+
}
|
|
129
|
+
function invalidaSubKeys(state) {
|
|
130
|
+
if (state.data) {
|
|
131
|
+
state.data = Object.assign(Object.assign({}, state.data), { invalid: true });
|
|
132
|
+
}
|
|
133
|
+
if (state.keys) {
|
|
134
|
+
state.keys = Object.assign({}, state.keys);
|
|
135
|
+
for (const key in state.keys) {
|
|
136
|
+
state.keys[key] = invalidaSubKeys(Object.assign({}, state.keys[key]));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return state;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=cache.reducer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.reducer.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/core/src/lib/cache/cache.reducer.ts"],"names":[],"mappings":"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","sourcesContent":["import { createReducer, on } from '@ngrx/store';\nimport {\n CacheData,\n CacheKeys,\n CacheState,\n hashKey,\n isCacheValid,\n} from './cache.models';\nimport * as CacheActions from './cache.actions';\n\nexport const initialState: CacheState = {\n keys: {},\n};\n\nexport const cacheReducer = createReducer(\n initialState,\n on(CacheActions.cache, (state, { key, value, date, maxCacheSize }) =>\n setCacheValue(\n hashKey(key),\n { value, date, invalid: false },\n state,\n maxCacheSize\n )\n ),\n on(CacheActions.invalidateCache, (state, { key }) => {\n const k = hashKey(key);\n return invalidateCache(k, state);\n }),\n on(CacheActions.deleteCache, (state, { key }) => {\n const k = hashKey(key);\n return deleteCacheValue(k, state);\n }),\n on(CacheActions.hitCache, (state, { key }) => {\n const k = hashKey(key);\n return increaseCacheHitCount(k, state);\n })\n);\n\nfunction setCacheValue(\n keys: string[],\n value: Omit<CacheData, 'hitCount'>,\n state: CacheState,\n maxCacheSize?: number,\n expires?: number\n) {\n const newState = { ...state };\n let cache = newState;\n let lastCache: CacheKeys | undefined = undefined;\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n cache.keys = cache?.keys ? { ...cache?.keys } : {};\n let v = cache.keys[key];\n v = v ? { ...v } : {};\n cache.keys[key] = v;\n lastCache = cache;\n cache = v;\n }\n cache.data = cache.data\n ? { ...value, hitCount: cache.data.hitCount + 1 }\n : { ...value, hitCount: 1 };\n\n if (\n maxCacheSize &&\n lastCache?.keys &&\n Object.keys(lastCache.keys).length > maxCacheSize\n ) {\n const entries = findLessHitOrOldestCacheEntries(\n lastCache,\n expires ?? Infinity,\n maxCacheSize\n );\n if (entries && entries.length) {\n for (const [key] of entries) {\n delete lastCache.keys[key];\n }\n }\n }\n return newState;\n}\n\nfunction findLessHitOrOldestCacheEntries(\n state: CacheKeys,\n expires: number,\n maxCacheSize: number\n) {\n if (!state.keys) return undefined;\n const entries = Object.entries(state.keys);\n // find the newest key;\n const [newestKey] = entries.reduce((a, b) => {\n const aDate = a[1].data?.date ?? 0;\n const bDate = b[1].data?.date ?? 0;\n return aDate > bDate ? a : b;\n });\n const sorted = entries.sort(([aKey, aValue], [bKey, bValue]) => {\n // ensures the newest key always wins\n if (aKey === newestKey) return -1;\n if (bKey === newestKey) return 1;\n const aValid = aValue.data && isCacheValid(aValue.data, expires) ? 1 : 0;\n const bValid = bValue.data && isCacheValid(bValue.data, expires) ? 1 : 0;\n const diffValid = aValid - bValid;\n const diffHit = (aValue.data?.hitCount ?? 0) - (bValue.data?.hitCount ?? 0);\n const diffDate = (aValue.data?.date ?? 0) - (bValue.data?.date ?? 0);\n return (\n -1 * (diffValid === 0 ? (diffHit === 0 ? diffDate : diffHit) : diffValid)\n );\n });\n return sorted.slice(maxCacheSize);\n}\n\nfunction deleteCacheValue(keys: string[], state: CacheState) {\n const newState = { ...state };\n let cache = newState;\n for (const key of keys) {\n if (!cache.keys) return state;\n cache.keys = { ...cache?.keys };\n let v = cache.keys[key];\n if (!v) return state;\n v = { ...v };\n cache.keys[key] = v;\n cache = v;\n }\n if (cache.data) delete cache.data;\n else if (cache.keys) delete cache.keys;\n return newState;\n}\n\nfunction invalidateCache(keys: string[], state: CacheState) {\n const newState = { ...state };\n let cache = newState;\n for (const key of keys) {\n if (!cache?.keys) return state;\n cache.keys = { ...cache?.keys };\n let v = cache?.keys?.[key];\n if (!v) return state;\n v = { ...v };\n cache.keys[key] = v;\n cache = v;\n }\n cache && invalidaSubKeys(cache);\n return newState;\n}\n\nfunction increaseCacheHitCount(keys: string[], state: CacheState) {\n const newState = { ...state };\n let cache = newState;\n for (const key of keys) {\n if (!cache?.keys) return state;\n cache.keys = { ...cache?.keys };\n let v = cache?.keys?.[key];\n if (!v) return state;\n v = { ...v };\n cache.keys[key] = v;\n cache = v;\n }\n if (!cache.data) return state;\n cache.data = { ...cache.data, hitCount: cache.data.hitCount + 1 };\n return newState;\n}\n\nfunction invalidaSubKeys(state: CacheKeys) {\n if (state.data) {\n state.data = { ...state.data, invalid: true };\n }\n if (state.keys) {\n state.keys = { ...state.keys };\n for (const key in state.keys) {\n state.keys[key] = invalidaSubKeys({ ...state.keys[key] });\n }\n }\n return state;\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { createFeatureSelector, createSelector } from '@ngrx/store';
|
|
2
|
+
import { getCacheValue, hashKey } from './cache.models';
|
|
3
|
+
export const cacheStateSelector = createFeatureSelector('cache');
|
|
4
|
+
export const selectCache = (key) => createSelector(cacheStateSelector, (state) => getCacheValue(hashKey(key), state));
|
|
5
|
+
//# sourceMappingURL=cache.selectors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.selectors.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/core/src/lib/cache/cache.selectors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAwB,aAAa,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9E,MAAM,CAAC,MAAM,kBAAkB,GAAG,qBAAqB,CAAa,OAAO,CAAC,CAAC;AAE7E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAa,EAAE,EAAE,CAC3C,cAAc,CAAC,kBAAkB,EAAE,CAAC,KAAK,EAAE,EAAE,CAC3C,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CACnC,CAAC","sourcesContent":["import { createFeatureSelector, createSelector } from '@ngrx/store';\nimport { CacheKey, CacheState, getCacheValue, hashKey } from './cache.models';\n\nexport const cacheStateSelector = createFeatureSelector<CacheState>('cache');\n\nexport const selectCache = (key: CacheKey) =>\n createSelector(cacheStateSelector, (state) =>\n getCacheValue(hashKey(key), state)\n );\n"]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { of } from 'rxjs';
|
|
2
|
+
import { isCacheValid } from './cache.models';
|
|
3
|
+
import { selectCache } from './cache.selectors';
|
|
4
|
+
import { concatMap, first, tap } from 'rxjs/operators';
|
|
5
|
+
import * as CacheActions from './cache.actions';
|
|
6
|
+
/**
|
|
7
|
+
* Cache the result of source parameter using the provided key, when call
|
|
8
|
+
* again if the cache is valid (exist and is not expired or invalidated)
|
|
9
|
+
* it will return the cache value without calling again source
|
|
10
|
+
* @example
|
|
11
|
+
* // cache for 3 min
|
|
12
|
+
* loadStores$ = createEffect(() => {
|
|
13
|
+
* return this.actions$.pipe(
|
|
14
|
+
* ofType(ProductStoreActions.loadStores),
|
|
15
|
+
* exhaustMap(() =>
|
|
16
|
+
* cache({
|
|
17
|
+
* key: ['stores'],
|
|
18
|
+
* store: this.store,
|
|
19
|
+
* source: this.storeService.getStores(),
|
|
20
|
+
* expire: 1000 * 60 * 3 // optional param , cache forever if not present
|
|
21
|
+
* }).pipe(
|
|
22
|
+
* map((res) => ProductStoreActions.loadStoresSuccess({ entities: res })),
|
|
23
|
+
* catchError(() => of(ProductStoreActions.loadStoresFail()))
|
|
24
|
+
* )
|
|
25
|
+
* )
|
|
26
|
+
* );
|
|
27
|
+
* });
|
|
28
|
+
* // cache top 10, for 3 mins
|
|
29
|
+
* loadDepartments$ = createEffect(() => {
|
|
30
|
+
* return this.actions$.pipe(
|
|
31
|
+
* ofType(this.localActions.loadDepartments),
|
|
32
|
+
* concatLatestFrom(() =>
|
|
33
|
+
* this.store.select(this.localSelectors.selectDepartmentsFilter)
|
|
34
|
+
* ),
|
|
35
|
+
* exhaustMap(([_, filters]) =>
|
|
36
|
+
* cache({
|
|
37
|
+
* key: ['stores','departments',{ storeId: filters!.storeId },
|
|
38
|
+
* store: this.store,
|
|
39
|
+
* source: this.storeService.getStoreDepartments(filters!.storeId),
|
|
40
|
+
* expires: 1000 * 60 * 3,
|
|
41
|
+
* maxCacheSize: 10,
|
|
42
|
+
* }).pipe(
|
|
43
|
+
* map((res) =>
|
|
44
|
+
* this.localActions.loadDepartmentsSuccess({
|
|
45
|
+
* entities: res,
|
|
46
|
+
* })
|
|
47
|
+
* ),
|
|
48
|
+
* catchError(() => of(this.localActions.loadDepartmentsFail()))
|
|
49
|
+
* )
|
|
50
|
+
* )
|
|
51
|
+
* );
|
|
52
|
+
* });
|
|
53
|
+
*
|
|
54
|
+
* @param options - configuration
|
|
55
|
+
* @param options.store - required ngrx store
|
|
56
|
+
* @param options.key - key can be string, array of string or array of string with plain objects
|
|
57
|
+
* @param options.source - called when cache is invalid
|
|
58
|
+
* @param options.expires - time to expire the cache valued, if not present is infinite
|
|
59
|
+
* @param options.maxCacheSize - max number of keys to store , only works if last key is variable
|
|
60
|
+
*/
|
|
61
|
+
export function cache({ store, key, source, expires, maxCacheSize, }) {
|
|
62
|
+
const exp = expires !== null && expires !== void 0 ? expires : Infinity;
|
|
63
|
+
return store.select(selectCache(key)).pipe(first(), concatMap((cache) => cache && isCacheValid(cache, exp)
|
|
64
|
+
? of(cache.value).pipe(tap(() => store.dispatch(CacheActions.hitCache({ key }))))
|
|
65
|
+
: source.pipe(tap((value) => store.dispatch(CacheActions.cache({
|
|
66
|
+
key,
|
|
67
|
+
date: Date.now(),
|
|
68
|
+
value,
|
|
69
|
+
maxCacheSize,
|
|
70
|
+
}))))));
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=cache.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.service.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/core/src/lib/cache/cache.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,EAAE,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAuB,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,YAAY,MAAM,iBAAiB,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AACH,MAAM,UAAU,KAAK,CAAI,EACvB,KAAK,EACL,GAAG,EACH,MAAM,EACN,OAAO,EACP,YAAY,GAOb;IACC,MAAM,GAAG,GAAG,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,QAAQ,CAAC;IAChC,OAAO,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CACxC,KAAK,EAAE,EACP,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAClB,KAAK,IAAI,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC;QAC/B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAClB,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAC1D;QACH,CAAC,CAAC,MAAM,CAAC,IAAI,CACT,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,KAAK,CAAC,QAAQ,CACZ,YAAY,CAAC,KAAK,CAAC;YACjB,GAAG;YACH,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE;YAChB,KAAK;YACL,YAAY;SACb,CAAC,CACH,CACF,CACF,CACN,CACF,CAAC;AACJ,CAAC","sourcesContent":["import { Injectable } from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { Observable, of } from 'rxjs';\nimport { CacheData, CacheKey, isCacheValid } from './cache.models';\nimport { selectCache } from './cache.selectors';\nimport { concatMap, first, tap } from 'rxjs/operators';\nimport * as CacheActions from './cache.actions';\n\n/**\n * Cache the result of source parameter using the provided key, when call\n * again if the cache is valid (exist and is not expired or invalidated)\n * it will return the cache value without calling again source\n * @example\n * // cache for 3 min\n * loadStores$ = createEffect(() => {\n * return this.actions$.pipe(\n * ofType(ProductStoreActions.loadStores),\n * exhaustMap(() =>\n * cache({\n * key: ['stores'],\n * store: this.store,\n * source: this.storeService.getStores(),\n * expire: 1000 * 60 * 3 // optional param , cache forever if not present\n * }).pipe(\n * map((res) => ProductStoreActions.loadStoresSuccess({ entities: res })),\n * catchError(() => of(ProductStoreActions.loadStoresFail()))\n * )\n * )\n * );\n * });\n * // cache top 10, for 3 mins\n * loadDepartments$ = createEffect(() => {\n * return this.actions$.pipe(\n * ofType(this.localActions.loadDepartments),\n * concatLatestFrom(() =>\n * this.store.select(this.localSelectors.selectDepartmentsFilter)\n * ),\n * exhaustMap(([_, filters]) =>\n * cache({\n * key: ['stores','departments',{ storeId: filters!.storeId },\n * store: this.store,\n * source: this.storeService.getStoreDepartments(filters!.storeId),\n * expires: 1000 * 60 * 3,\n * maxCacheSize: 10,\n * }).pipe(\n * map((res) =>\n * this.localActions.loadDepartmentsSuccess({\n * entities: res,\n * })\n * ),\n * catchError(() => of(this.localActions.loadDepartmentsFail()))\n * )\n * )\n * );\n * });\n *\n * @param options - configuration\n * @param options.store - required ngrx store\n * @param options.key - key can be string, array of string or array of string with plain objects\n * @param options.source - called when cache is invalid\n * @param options.expires - time to expire the cache valued, if not present is infinite\n * @param options.maxCacheSize - max number of keys to store , only works if last key is variable\n */\nexport function cache<T>({\n store,\n key,\n source,\n expires,\n maxCacheSize,\n}: {\n store: Store;\n key: CacheKey;\n source: Observable<T>;\n expires?: number;\n maxCacheSize?: number;\n}) {\n const exp = expires ?? Infinity;\n return store.select(selectCache(key)).pipe(\n first(),\n concatMap((cache) =>\n cache && isCacheValid(cache, exp)\n ? of(cache.value).pipe(\n tap(() => store.dispatch(CacheActions.hitCache({ key })))\n )\n : source.pipe(\n tap((value) =>\n store.dispatch(\n CacheActions.cache({\n key,\n date: Date.now(),\n value,\n maxCacheSize,\n })\n )\n )\n )\n )\n );\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './cache.service';
|
|
2
|
+
export * from './cache.module';
|
|
3
|
+
import { invalidateCache, deleteCache } from './cache.actions';
|
|
4
|
+
import { selectCache } from './cache.selectors';
|
|
5
|
+
export const CacheActions = { invalidateCache, deleteCache };
|
|
6
|
+
export const CacheSelectors = { getCache: selectCache };
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/core/src/lib/cache/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,eAAe,EAAE,WAAW,EAAE,CAAC;AAC7D,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC","sourcesContent":["export * from './cache.service';\nexport * from './cache.module';\nimport { invalidateCache, deleteCache } from './cache.actions';\nimport { selectCache } from './cache.selectors';\nexport const CacheActions = { invalidateCache, deleteCache };\nexport const CacheSelectors = { getCache: selectCache };\n"]}
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import { combineReducers, createFeatureSelector, createReducer, createSelector, } from '@ngrx/store';
|
|
2
|
+
import { capitalize } from './util';
|
|
3
|
+
export function createTraitFactory(f) {
|
|
4
|
+
return f;
|
|
5
|
+
}
|
|
6
|
+
export function createEntityFeatureFactory(namesOrFactory, ...traits) {
|
|
7
|
+
return ((config) => {
|
|
8
|
+
const { entityName, entitiesName } = 'entityName' in namesOrFactory
|
|
9
|
+
? namesOrFactory
|
|
10
|
+
: { entityName: 'Entity', entitiesName: 'Entities' };
|
|
11
|
+
const singular = capitalize(entityName);
|
|
12
|
+
const plural = entitiesName
|
|
13
|
+
? capitalize(entitiesName)
|
|
14
|
+
: capitalize(entityName + 's');
|
|
15
|
+
const sortedTraits = sortTraits('entityName' in namesOrFactory ? [...traits] : [namesOrFactory, ...traits]);
|
|
16
|
+
const allConfigs = buildAllConfigs(sortedTraits);
|
|
17
|
+
const allActions = buildAllActions(sortedTraits, config.actionsGroupKey, singular, plural, allConfigs);
|
|
18
|
+
const allSelectors = buildAllSelectors(sortedTraits, allConfigs);
|
|
19
|
+
const allMutators = buildAllMutators(sortedTraits, allSelectors, allConfigs);
|
|
20
|
+
const initialState = buildInitialState(sortedTraits, allConfigs);
|
|
21
|
+
const reducer = buildReducer(sortedTraits, initialState, allActions, allSelectors, allMutators, allConfigs);
|
|
22
|
+
const featureSelector = typeof config.featureSelector === 'string'
|
|
23
|
+
? createFeatureSelector(config.featureSelector)
|
|
24
|
+
: config.featureSelector;
|
|
25
|
+
const allFeatureSelectors = allSelectors && getSelectorsForFeature(featureSelector, allSelectors);
|
|
26
|
+
const allEffects = buildAllEffects(sortedTraits, allActions, allFeatureSelectors, allConfigs);
|
|
27
|
+
return {
|
|
28
|
+
actions: entityName
|
|
29
|
+
? renameProps(allActions, singular, plural)
|
|
30
|
+
: allActions,
|
|
31
|
+
selectors: entityName
|
|
32
|
+
? renameProps(allFeatureSelectors, singular, plural)
|
|
33
|
+
: allSelectors,
|
|
34
|
+
initialState,
|
|
35
|
+
reducer: reducer !== null && reducer !== void 0 ? reducer : createReducer(initialState),
|
|
36
|
+
effects: allEffects,
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
function renameProps(target, entityName, entitiesName) {
|
|
41
|
+
const result = {};
|
|
42
|
+
for (const [key, value] of Object.entries(target)) {
|
|
43
|
+
const newKey = key
|
|
44
|
+
.replace('Entities', entitiesName)
|
|
45
|
+
.replace('Entity', entityName);
|
|
46
|
+
result[newKey] = value;
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
function sortTraits(traits) {
|
|
51
|
+
var _a;
|
|
52
|
+
const sortedTraits = [];
|
|
53
|
+
for (let i = 0; i < traits.length; i++) {
|
|
54
|
+
const trait = traits[i];
|
|
55
|
+
if (!((_a = trait.depends) === null || _a === void 0 ? void 0 : _a.length)) {
|
|
56
|
+
sortedTraits.push(trait);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (trait.depends.length > 1)
|
|
60
|
+
for (const d of trait.depends) {
|
|
61
|
+
const isTraitPresent = traits.some((tr) => tr.key === d);
|
|
62
|
+
if (isTraitPresent) {
|
|
63
|
+
trait.depends = [d];
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (trait.depends.length > 1)
|
|
68
|
+
throw Error('could not find dependencies ' + trait.depends.join(' '));
|
|
69
|
+
const isDependencyAlreadyAdded = sortedTraits.some((tr) => { var _a; return tr.key === ((_a = trait === null || trait === void 0 ? void 0 : trait.depends) === null || _a === void 0 ? void 0 : _a[0]); });
|
|
70
|
+
if (isDependencyAlreadyAdded)
|
|
71
|
+
sortedTraits.push(trait);
|
|
72
|
+
else {
|
|
73
|
+
// move trait to the end
|
|
74
|
+
delete traits[i];
|
|
75
|
+
traits.push(trait);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return sortedTraits;
|
|
79
|
+
}
|
|
80
|
+
function buildAllConfigs(sortedTraits) {
|
|
81
|
+
return sortedTraits.reduce((acc, factory) => {
|
|
82
|
+
acc[factory.key] = factory.config;
|
|
83
|
+
return acc;
|
|
84
|
+
}, {});
|
|
85
|
+
}
|
|
86
|
+
function buildAllActions(sortedTraits, actionsGroupKey, entityName, entitiesName, allConfigs) {
|
|
87
|
+
return sortedTraits.reduce((previousResult, factory) => {
|
|
88
|
+
var _a, _b;
|
|
89
|
+
let result = (_b = (_a = factory === null || factory === void 0 ? void 0 : factory.actions) === null || _a === void 0 ? void 0 : _a.call(factory, {
|
|
90
|
+
actionsGroupKey: actionsGroupKey,
|
|
91
|
+
entityName,
|
|
92
|
+
entitiesName,
|
|
93
|
+
allConfigs,
|
|
94
|
+
})) !== null && _b !== void 0 ? _b : {};
|
|
95
|
+
result = previousResult ? Object.assign(Object.assign({}, previousResult), result) : result;
|
|
96
|
+
return result;
|
|
97
|
+
}, {});
|
|
98
|
+
}
|
|
99
|
+
function buildAllSelectors(sortedTraits, allConfigs) {
|
|
100
|
+
return sortedTraits.reduce((previousResult, factory) => {
|
|
101
|
+
var _a, _b;
|
|
102
|
+
let result = (_b = (_a = factory === null || factory === void 0 ? void 0 : factory.selectors) === null || _a === void 0 ? void 0 : _a.call(factory, {
|
|
103
|
+
previousSelectors: previousResult,
|
|
104
|
+
allConfigs,
|
|
105
|
+
})) !== null && _b !== void 0 ? _b : {};
|
|
106
|
+
result = previousResult ? Object.assign(Object.assign({}, previousResult), result) : result;
|
|
107
|
+
return result;
|
|
108
|
+
}, {});
|
|
109
|
+
}
|
|
110
|
+
function buildAllMutators(sortedTraits, allSelectors, allConfigs) {
|
|
111
|
+
return (sortedTraits.reduce((previousResult, factory) => {
|
|
112
|
+
var _a, _b;
|
|
113
|
+
let result = (_b = (_a = factory === null || factory === void 0 ? void 0 : factory.mutators) === null || _a === void 0 ? void 0 : _a.call(factory, {
|
|
114
|
+
allSelectors: allSelectors,
|
|
115
|
+
previousMutators: previousResult,
|
|
116
|
+
allConfigs,
|
|
117
|
+
})) !== null && _b !== void 0 ? _b : {};
|
|
118
|
+
result = previousResult ? Object.assign(Object.assign({}, previousResult), result) : result;
|
|
119
|
+
return result;
|
|
120
|
+
}, {}) || {});
|
|
121
|
+
}
|
|
122
|
+
function buildInitialState(sortedTraits, allConfigs) {
|
|
123
|
+
return sortedTraits.reduce((previousResult, factory) => {
|
|
124
|
+
var _a, _b, _c;
|
|
125
|
+
const result = (_c = (_b = (_a = factory === null || factory === void 0 ? void 0 : factory.initialState) === null || _a === void 0 ? void 0 : _a.call(factory, {
|
|
126
|
+
previousInitialState: previousResult,
|
|
127
|
+
allConfigs,
|
|
128
|
+
})) !== null && _b !== void 0 ? _b : previousResult) !== null && _c !== void 0 ? _c : {};
|
|
129
|
+
return result;
|
|
130
|
+
}, {});
|
|
131
|
+
}
|
|
132
|
+
function buildReducer(sortedTraits, initialState, allActions, allSelectors, allMutators, allConfigs) {
|
|
133
|
+
return sortedTraits.reduce((previousResult, factory) => {
|
|
134
|
+
var _a;
|
|
135
|
+
const result = (_a = factory === null || factory === void 0 ? void 0 : factory.reducer) === null || _a === void 0 ? void 0 : _a.call(factory, {
|
|
136
|
+
initialState,
|
|
137
|
+
allActions,
|
|
138
|
+
allSelectors,
|
|
139
|
+
allMutators,
|
|
140
|
+
allConfigs,
|
|
141
|
+
});
|
|
142
|
+
return result && previousResult
|
|
143
|
+
? (state = initialState, action) => {
|
|
144
|
+
const aState = previousResult(state, action);
|
|
145
|
+
return result(aState, action);
|
|
146
|
+
}
|
|
147
|
+
: result !== null && result !== void 0 ? result : previousResult;
|
|
148
|
+
}, undefined);
|
|
149
|
+
}
|
|
150
|
+
function buildAllEffects(sortedTraits, allActions, allFeatureSelectors, allConfigs) {
|
|
151
|
+
return sortedTraits.reduce((previousResult, factory) => {
|
|
152
|
+
var _a, _b;
|
|
153
|
+
let result = (_b = (_a = factory === null || factory === void 0 ? void 0 : factory.effects) === null || _a === void 0 ? void 0 : _a.call(factory, {
|
|
154
|
+
allActions,
|
|
155
|
+
allSelectors: allFeatureSelectors,
|
|
156
|
+
allConfigs,
|
|
157
|
+
})) !== null && _b !== void 0 ? _b : [];
|
|
158
|
+
result = previousResult ? [...previousResult, ...result] : result;
|
|
159
|
+
return result;
|
|
160
|
+
}, []);
|
|
161
|
+
}
|
|
162
|
+
function getSelectorsForFeature(featureSelect, selectors) {
|
|
163
|
+
const ss = {};
|
|
164
|
+
for (const prop in selectors) {
|
|
165
|
+
ss[prop] = createSelector(featureSelect, selectors[prop]);
|
|
166
|
+
}
|
|
167
|
+
return ss;
|
|
168
|
+
}
|
|
169
|
+
export function setPropertyReducer(sourceReducer, property, propertyReducer) {
|
|
170
|
+
return function reducer(state, action) {
|
|
171
|
+
const sourceState = sourceReducer(state, action);
|
|
172
|
+
return Object.assign(Object.assign({}, sourceState), { [property]: propertyReducer(sourceState[property], action) });
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
export function setPropertiesReducer(sourceReducer, propertiesReducers) {
|
|
176
|
+
return function reducer(state, action) {
|
|
177
|
+
const newState = Object.assign({}, sourceReducer(state, action));
|
|
178
|
+
for (const property in propertiesReducers) {
|
|
179
|
+
newState[property] = propertiesReducers[property](newState[property], action);
|
|
180
|
+
}
|
|
181
|
+
return newState;
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
export function joinReducers(firstReducer, secondReducer) {
|
|
185
|
+
return function reducer(state, action) {
|
|
186
|
+
const sourceState = firstReducer(state, action);
|
|
187
|
+
return secondReducer(sourceState, action);
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
export function combineEntityFeatures(traitFactoriesMap) {
|
|
191
|
+
return ((config) => {
|
|
192
|
+
const featureSelector = typeof config.featureSelector === 'string'
|
|
193
|
+
? createFeatureSelector(config.featureSelector)
|
|
194
|
+
: config.featureSelector;
|
|
195
|
+
const actions = {};
|
|
196
|
+
const selectors = {};
|
|
197
|
+
const reducers = {};
|
|
198
|
+
let effects = [];
|
|
199
|
+
for (const [key, entityFeatureFactory] of Object.entries(traitFactoriesMap)) {
|
|
200
|
+
const selector = createSelector(featureSelector, (state) => state[key]);
|
|
201
|
+
const featureTraits = entityFeatureFactory({
|
|
202
|
+
actionsGroupKey: config.actionsGroupKey,
|
|
203
|
+
featureSelector: selector,
|
|
204
|
+
});
|
|
205
|
+
actions[key] = featureTraits.actions;
|
|
206
|
+
selectors[key] = featureTraits.selectors;
|
|
207
|
+
reducers[key] = featureTraits.reducer;
|
|
208
|
+
effects = [...effects, ...featureTraits.effects];
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
actions,
|
|
212
|
+
selectors,
|
|
213
|
+
reducer: combineReducers(reducers),
|
|
214
|
+
effects,
|
|
215
|
+
};
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
export function mixEntityFeatures(traitFactoriesMap) {
|
|
219
|
+
return ((config) => {
|
|
220
|
+
const featureSelector = typeof config.featureSelector === 'string'
|
|
221
|
+
? createFeatureSelector(config.featureSelector)
|
|
222
|
+
: config.featureSelector;
|
|
223
|
+
let actions = {};
|
|
224
|
+
let selectors = {};
|
|
225
|
+
const reducers = {};
|
|
226
|
+
let effects = [];
|
|
227
|
+
for (const [key, entityFeatureFactory] of Object.entries(traitFactoriesMap)) {
|
|
228
|
+
const selector = createSelector(featureSelector, (state) => state[key]);
|
|
229
|
+
const featureTraits = entityFeatureFactory({
|
|
230
|
+
actionsGroupKey: config.actionsGroupKey,
|
|
231
|
+
featureSelector: selector,
|
|
232
|
+
});
|
|
233
|
+
actions = Object.assign(Object.assign({}, actions), featureTraits.actions);
|
|
234
|
+
selectors = Object.assign(Object.assign({}, selectors), featureTraits.selectors);
|
|
235
|
+
reducers[key] = featureTraits.reducer;
|
|
236
|
+
effects = [...effects, ...featureTraits.effects];
|
|
237
|
+
}
|
|
238
|
+
return {
|
|
239
|
+
actions,
|
|
240
|
+
selectors,
|
|
241
|
+
reducer: combineReducers(reducers),
|
|
242
|
+
effects,
|
|
243
|
+
};
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
export function addEntityFeaturesProperties(targetTraitFactory, traitFactoriesMap) {
|
|
247
|
+
return ((config) => {
|
|
248
|
+
const featureSelector = typeof config.featureSelector === 'string'
|
|
249
|
+
? createFeatureSelector(config.featureSelector)
|
|
250
|
+
: config.featureSelector;
|
|
251
|
+
const targetFeatureTraits = targetTraitFactory({
|
|
252
|
+
actionsGroupKey: config.actionsGroupKey,
|
|
253
|
+
featureSelector: featureSelector,
|
|
254
|
+
});
|
|
255
|
+
const actions = Object.assign({}, targetFeatureTraits.actions);
|
|
256
|
+
const selectors = Object.assign({}, targetFeatureTraits.selectors);
|
|
257
|
+
const reducers = {};
|
|
258
|
+
let effects = [...targetFeatureTraits.effects];
|
|
259
|
+
for (const [key, entityFeatureFactory] of Object.entries(traitFactoriesMap)) {
|
|
260
|
+
const selector = createSelector(featureSelector, (state) => state[key]);
|
|
261
|
+
const featureTraits = entityFeatureFactory({
|
|
262
|
+
actionsGroupKey: config.actionsGroupKey,
|
|
263
|
+
featureSelector: selector,
|
|
264
|
+
});
|
|
265
|
+
actions[key] = featureTraits.actions;
|
|
266
|
+
selectors[key] = featureTraits.selectors;
|
|
267
|
+
reducers[key] = featureTraits.reducer;
|
|
268
|
+
effects = [...effects, ...featureTraits.effects];
|
|
269
|
+
}
|
|
270
|
+
return {
|
|
271
|
+
actions,
|
|
272
|
+
selectors,
|
|
273
|
+
reducer: setPropertiesReducer(targetFeatureTraits.reducer, reducers),
|
|
274
|
+
effects,
|
|
275
|
+
};
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
// export
|
|
279
|
+
/// products:{actions, selectors, }, orders: {actions,slectors}
|
|
280
|
+
/// { actions: {ProductActions, OrderActions}, selectors: {ProductSelectors, OrderSelectors}
|
|
281
|
+
// TODO finish implementing combineTrais and addPropertiesTraits
|
|
282
|
+
// TODO finish renaming traits
|
|
283
|
+
//# sourceMappingURL=create-entity-feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-entity-feature.js","sourceRoot":"","sources":["../../../../../libs/ngrx-traits/core/src/lib/create-entity-feature.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Config,\n ExtractActionsType,\n ExtractMutatorsType,\n ExtractSelectorsType,\n ExtractStateType,\n EntityFeatureFactory,\n FeatureSelectors,\n KeyedConfig,\n TraitActions,\n TraitActionsFactoryConfig,\n TraitFactory,\n TraitSelectors,\n TraitStateMutators,\n UnionToIntersection,\n TraitActionsFactory,\n TraitSelectorsFactory,\n TraitInitialStateFactory,\n TraitStateMutatorsFactory,\n TraitReducerFactory,\n TraitEffectsFactory,\n} from './model';\nimport {\n Action,\n ActionType,\n combineReducers,\n createFeatureSelector,\n createReducer,\n createSelector,\n MemoizedSelector,\n} from '@ngrx/store';\nimport { TraitEffect } from './trait-effect';\nimport { Type } from './local-store';\nimport { capitalize } from './util';\n\nexport function createTraitFactory<\n State = {},\n A extends TraitActions = {},\n S extends TraitSelectors<State> = {},\n M extends TraitStateMutators<State> = {},\n KEY extends string = string,\n C = unknown,\n KC = KeyedConfig<KEY, C>\n>(f: {\n key: KEY;\n config?: C;\n depends?: string[];\n actions?: TraitActionsFactory<A, KC>;\n selectors?: TraitSelectorsFactory<State, S, KC>;\n initialState?: TraitInitialStateFactory<State, KC>;\n mutators?: TraitStateMutatorsFactory<State, M, KC>;\n reducer?: TraitReducerFactory<State, A, S, M, KC>;\n effects?: TraitEffectsFactory<State, A, S, KC>;\n}): TraitFactory<State, A, S, M, KEY, C, KC> {\n return f as TraitFactory<State, A, S, M, KEY, C, KC>;\n}\nexport function createEntityFeatureFactory<F extends readonly TraitFactory[]>(\n ...traits: F\n): EntityFeatureFactory<\n 'Entity',\n 'Entities',\n ExtractStateType<F>,\n ExtractActionsType<F>,\n ExtractSelectorsType<F>\n>;\nexport function createEntityFeatureFactory<\n F extends readonly TraitFactory[],\n EntityName extends string,\n EntitiesName extends string = `${EntityName}s`\n>(\n {\n entityName,\n entitiesName,\n }: { entityName: EntityName; entitiesName?: EntitiesName },\n ...traits: F\n): EntityFeatureFactory<\n EntityName,\n EntitiesName,\n ExtractStateType<F>,\n ExtractActionsType<F>,\n ExtractSelectorsType<F>\n>;\nexport function createEntityFeatureFactory<\n F extends readonly TraitFactory[],\n EntityName extends string,\n EntitiesName extends string = `${EntityName}s`\n>(\n namesOrFactory:\n | { entityName: EntityName; entitiesName?: EntitiesName }\n | TraitFactory,\n ...traits: F\n): EntityFeatureFactory<\n EntityName,\n EntitiesName,\n ExtractStateType<F>,\n ExtractActionsType<F>,\n ExtractSelectorsType<F>\n> {\n return ((config: Config<any, any>) => {\n const { entityName, entitiesName } =\n 'entityName' in namesOrFactory\n ? (namesOrFactory as {\n entityName: EntityName;\n entitiesName?: EntitiesName;\n })\n : { entityName: 'Entity', entitiesName: 'Entities' };\n\n const singular = capitalize(entityName);\n const plural = entitiesName\n ? capitalize(entitiesName)\n : capitalize(entityName + 's');\n\n const sortedTraits = sortTraits(\n 'entityName' in namesOrFactory ? [...traits] : [namesOrFactory, ...traits]\n );\n\n const allConfigs = buildAllConfigs(sortedTraits);\n\n const allActions = buildAllActions(\n sortedTraits,\n config.actionsGroupKey,\n singular,\n plural,\n allConfigs\n );\n\n const allSelectors = buildAllSelectors(sortedTraits, allConfigs);\n\n const allMutators = buildAllMutators(\n sortedTraits,\n allSelectors,\n allConfigs\n );\n\n const initialState = buildInitialState(sortedTraits, allConfigs);\n\n const reducer = buildReducer(\n sortedTraits,\n initialState,\n allActions,\n allSelectors,\n allMutators,\n allConfigs\n );\n\n const featureSelector =\n typeof config.featureSelector === 'string'\n ? createFeatureSelector<ExtractStateType<F>>(config.featureSelector)\n : config.featureSelector;\n\n const allFeatureSelectors =\n allSelectors && getSelectorsForFeature(featureSelector, allSelectors);\n\n const allEffects = buildAllEffects(\n sortedTraits,\n allActions,\n allFeatureSelectors,\n allConfigs\n );\n\n return {\n actions: entityName\n ? renameProps(allActions, singular, plural)\n : allActions,\n selectors: entityName\n ? renameProps(allFeatureSelectors, singular, plural)\n : allSelectors,\n initialState,\n reducer: reducer ?? createReducer(initialState),\n effects: allEffects,\n };\n }) as EntityFeatureFactory<\n EntityName,\n EntitiesName,\n ExtractStateType<F>,\n ExtractActionsType<F>,\n ExtractSelectorsType<F>\n >;\n}\n\nfunction renameProps(target: any, entityName: string, entitiesName: string) {\n const result = {} as any;\n for (const [key, value] of Object.entries(target)) {\n const newKey = key\n .replace('Entities', entitiesName)\n .replace('Entity', entityName);\n result[newKey] = value;\n }\n return result;\n}\nfunction sortTraits(\n traits: TraitFactory<any, any, any, any>[]\n): TraitFactory<any, any, any, any>[] {\n const sortedTraits: TraitFactory<any, any, any, any>[] = [];\n for (let i = 0; i < traits.length; i++) {\n const trait = traits[i];\n if (!trait.depends?.length) {\n sortedTraits.push(trait);\n continue;\n }\n if (trait.depends.length > 1)\n for (const d of trait.depends) {\n const isTraitPresent = traits.some((tr) => tr.key === d);\n if (isTraitPresent) {\n trait.depends = [d];\n break;\n }\n }\n if (trait.depends.length > 1)\n throw Error('could not find dependencies ' + trait.depends.join(' '));\n const isDependencyAlreadyAdded = sortedTraits.some(\n (tr) => tr.key === trait?.depends?.[0]\n );\n\n if (isDependencyAlreadyAdded) sortedTraits.push(trait);\n else {\n // move trait to the end\n delete traits[i];\n traits.push(trait);\n }\n }\n return sortedTraits;\n}\n\nfunction buildAllConfigs(sortedTraits: TraitFactory<any, any, any, any>[]) {\n return sortedTraits.reduce((acc: KeyedConfig<string, any>, factory) => {\n acc[factory.key] = factory.config;\n return acc;\n }, {});\n}\n\nfunction buildAllActions(\n sortedTraits: TraitFactory<any, any, any, any>[],\n actionsGroupKey: string,\n entityName: string,\n entitiesName: string,\n allConfigs: Record<string, any> & { [p: string]: any }\n) {\n return sortedTraits.reduce((previousResult: TraitActions, factory) => {\n let result =\n factory?.actions?.({\n actionsGroupKey: actionsGroupKey,\n entityName,\n entitiesName,\n allConfigs,\n }) ?? {};\n result = previousResult ? { ...previousResult, ...result } : result;\n return result;\n }, {});\n}\n\nfunction buildAllSelectors(\n sortedTraits: TraitFactory<any, any, any, any>[],\n allConfigs: Record<string, any> & { [p: string]: any }\n) {\n return sortedTraits.reduce((previousResult: TraitSelectors<any>, factory) => {\n let result =\n factory?.selectors?.({\n previousSelectors: previousResult,\n allConfigs,\n }) ?? {};\n result = previousResult ? { ...previousResult, ...result } : result;\n return result;\n }, {});\n}\n\nfunction buildAllMutators(\n sortedTraits: TraitFactory<any, any, any, any>[],\n allSelectors: TraitSelectors<any>,\n allConfigs: Record<string, any> & { [p: string]: any }\n) {\n return (\n sortedTraits.reduce(\n (previousResult: TraitStateMutators<any> | undefined, factory) => {\n let result =\n factory?.mutators?.({\n allSelectors: allSelectors,\n previousMutators: previousResult,\n allConfigs,\n }) ?? {};\n result = previousResult ? { ...previousResult, ...result } : result;\n return result;\n },\n {}\n ) || {}\n );\n}\n\nfunction buildInitialState(\n sortedTraits: TraitFactory<any, any, any, any>[],\n allConfigs: Record<string, any> & { [p: string]: any }\n) {\n return sortedTraits.reduce((previousResult: any, factory) => {\n const result =\n factory?.initialState?.({\n previousInitialState: previousResult,\n allConfigs,\n }) ??\n previousResult ??\n {};\n return result;\n }, {});\n}\n\nfunction buildReducer(\n sortedTraits: TraitFactory<any, any, any, any>[],\n initialState: any,\n allActions: TraitActions,\n allSelectors: TraitSelectors<any>,\n allMutators: TraitStateMutators<any>,\n allConfigs: Record<string, any> & { [p: string]: any }\n) {\n return sortedTraits.reduce(\n (\n previousResult: ((state: any, action: Action) => any) | undefined,\n factory\n ) => {\n const result = factory?.reducer?.({\n initialState,\n allActions,\n allSelectors,\n allMutators,\n allConfigs,\n });\n return result && previousResult\n ? (state = initialState, action) => {\n const aState = previousResult(state, action);\n return result(aState, action);\n }\n : result ?? previousResult;\n },\n undefined\n );\n}\n\nfunction buildAllEffects(\n sortedTraits: TraitFactory<any, any, any, any>[],\n allActions: TraitActions,\n allFeatureSelectors: TraitSelectors<any>,\n allConfigs: Record<string, any> & { [p: string]: any }\n) {\n return sortedTraits.reduce(\n (previousResult: Type<TraitEffect>[] | undefined, factory) => {\n let result =\n factory?.effects?.({\n allActions,\n allSelectors: allFeatureSelectors,\n allConfigs,\n }) ?? [];\n result = previousResult ? [...previousResult, ...result] : result;\n return result;\n },\n []\n );\n}\n\nfunction getSelectorsForFeature<\n State,\n S extends TraitSelectors<State>,\n // eslint-disable-next-line @typescript-eslint/ban-types\n F extends MemoizedSelector<object, any>\n>(featureSelect: F, selectors: S): FeatureSelectors<State, S> {\n const ss: { [key in keyof S]?: any } = {};\n for (const prop in selectors) {\n ss[prop] = createSelector(featureSelect as any, selectors[prop] as any);\n }\n return ss as FeatureSelectors<State, S>;\n}\n\nexport function setPropertyReducer<State, P extends keyof State>(\n sourceReducer: (state: State, action: ActionType<any>) => State,\n property: P,\n propertyReducer: (state: State[P], action: ActionType<any>) => State[P]\n): (state: State, action: ActionType<any>) => State {\n return function reducer(state: State, action: ActionType<any>): State {\n const sourceState = sourceReducer(state, action);\n return {\n ...sourceState,\n [property]: propertyReducer(sourceState[property], action),\n };\n };\n}\nexport function setPropertiesReducer<State, P extends keyof State>(\n sourceReducer: (state: State, action: ActionType<any>) => State,\n propertiesReducers: {\n [key in P]: (state: State[P], action: ActionType<any>) => State[P];\n }\n): (state: State, action: ActionType<any>) => State {\n return function reducer(state: State, action: ActionType<any>): State {\n const newState = { ...sourceReducer(state, action) };\n for (const property in propertiesReducers) {\n newState[property as P] = propertiesReducers[property](\n newState[property],\n action\n );\n }\n return newState;\n };\n}\n\nexport function joinReducers<State>(\n firstReducer: (state: State, action: ActionType<any>) => State,\n secondReducer: (state: any, action: ActionType<any>) => any\n): (state: State, action: ActionType<any>) => State {\n return function reducer(state: State, action: ActionType<any>): State {\n const sourceState = firstReducer(state, action);\n return secondReducer(sourceState, action);\n };\n}\n\nexport function combineEntityFeatures<\n T extends { [key: string]: EntityFeatureFactory<any, any> },\n K extends keyof T,\n State extends { [P in K]: ExtractStateType<ReturnType<T[P]>> },\n A extends { [P in K]: ExtractActionsType<ReturnType<T[P]>> },\n S extends {\n [P in K]: FeatureSelectors<State, ExtractSelectorsType<ReturnType<T[P]>>>;\n },\n R extends (config: Config<State>) => {\n actions: A;\n selectors: S;\n reducer: (state: State, action: ActionType<any>) => State;\n effects: Type<any>[];\n initialState: State;\n }\n>(traitFactoriesMap: T): R {\n return ((config: Config<any, any>) => {\n const featureSelector =\n typeof config.featureSelector === 'string'\n ? createFeatureSelector<any>(config.featureSelector)\n : config.featureSelector;\n const actions: any = {};\n const selectors: any = {};\n const reducers: any = {};\n let effects: Type<any>[] = [];\n for (const [key, entityFeatureFactory] of Object.entries(\n traitFactoriesMap\n )) {\n const selector = createSelector(\n featureSelector,\n (state: any) => state[key]\n );\n const featureTraits = entityFeatureFactory({\n actionsGroupKey: config.actionsGroupKey,\n featureSelector: selector,\n });\n actions[key] = featureTraits.actions;\n selectors[key] = featureTraits.selectors;\n reducers[key] = featureTraits.reducer;\n effects = [...effects, ...featureTraits.effects];\n }\n return {\n actions,\n selectors,\n reducer: combineReducers(reducers),\n effects,\n };\n }) as R;\n}\n\nexport function mixEntityFeatures<\n T extends { [key: string]: EntityFeatureFactory<any, any> },\n K extends keyof T,\n State extends { [P in K]: ExtractStateType<ReturnType<T[P]>> },\n A extends TraitActions &\n UnionToIntersection<ExtractActionsType<ReturnType<T[K]>>>,\n S extends TraitSelectors<any> &\n UnionToIntersection<\n FeatureSelectors<State, ExtractSelectorsType<ReturnType<T[K]>>>\n >,\n R extends EntityFeatureFactory<any, any, State, A, S>\n>(traitFactoriesMap: T): R {\n return ((config: Config<any, any>) => {\n const featureSelector =\n typeof config.featureSelector === 'string'\n ? createFeatureSelector<any>(config.featureSelector)\n : config.featureSelector;\n let actions: any = {};\n let selectors: any = {};\n const reducers: any = {};\n let effects: Type<any>[] = [];\n for (const [key, entityFeatureFactory] of Object.entries(\n traitFactoriesMap\n )) {\n const selector = createSelector(\n featureSelector,\n (state: any) => state[key]\n );\n const featureTraits = entityFeatureFactory({\n actionsGroupKey: config.actionsGroupKey,\n featureSelector: selector,\n });\n actions = { ...actions, ...featureTraits.actions };\n selectors = { ...selectors, ...featureTraits.selectors };\n reducers[key] = featureTraits.reducer;\n effects = [...effects, ...featureTraits.effects];\n }\n return {\n actions,\n selectors,\n reducer: combineReducers(reducers),\n effects,\n };\n }) as R;\n}\n\nexport function addEntityFeaturesProperties<\n F extends EntityFeatureFactory<any, any>,\n T extends { [key: string]: EntityFeatureFactory<any, any, any, any, any> },\n K extends keyof T,\n State extends ExtractStateType<ReturnType<F>> &\n {\n [P in K]: ExtractStateType<ReturnType<T[P]>>;\n },\n A extends ExtractActionsType<ReturnType<F>> &\n { [P in K]: ExtractActionsType<ReturnType<T[P]>> },\n S extends FeatureSelectors<State, ExtractSelectorsType<ReturnType<F>>> &\n {\n [P in K]: FeatureSelectors<State, ExtractSelectorsType<ReturnType<T[P]>>>;\n },\n R extends (config: Config<State>) => {\n actions: A;\n selectors: S;\n reducer: (state: State, action: ActionType<any>) => State;\n effects: Type<any>[];\n initialState: State;\n }\n>(targetTraitFactory: F, traitFactoriesMap: T): R {\n return ((config: Config<any, any>) => {\n const featureSelector =\n typeof config.featureSelector === 'string'\n ? createFeatureSelector<any>(config.featureSelector)\n : config.featureSelector;\n const targetFeatureTraits = targetTraitFactory({\n actionsGroupKey: config.actionsGroupKey,\n featureSelector: featureSelector,\n });\n const actions: any = { ...targetFeatureTraits.actions };\n const selectors: any = { ...targetFeatureTraits.selectors };\n const reducers: any = {};\n let effects: Type<any>[] = [...targetFeatureTraits.effects];\n for (const [key, entityFeatureFactory] of Object.entries(\n traitFactoriesMap\n )) {\n const selector = createSelector(\n featureSelector,\n (state: any) => state[key]\n );\n const featureTraits = entityFeatureFactory({\n actionsGroupKey: config.actionsGroupKey,\n featureSelector: selector,\n });\n actions[key] = featureTraits.actions;\n selectors[key] = featureTraits.selectors;\n reducers[key] = featureTraits.reducer;\n effects = [...effects, ...featureTraits.effects];\n }\n return {\n actions,\n selectors,\n reducer: setPropertiesReducer(targetFeatureTraits.reducer, reducers),\n effects,\n };\n }) as R;\n}\n\n// export\n\n/// products:{actions, selectors, }, orders: {actions,slectors}\n/// { actions: {ProductActions, OrderActions}, selectors: {ProductSelectors, OrderSelectors}\n// TODO finish implementing combineTrais and addPropertiesTraits\n// TODO finish renaming traits\n"]}
|
package/esm2015/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../libs/ngrx-traits/core/src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC","sourcesContent":["export * from './create-entity-feature';\nexport * from './model';\nexport * from './local-store';\nexport * from './trait-effect';\nexport * from './util';\nexport * from './cache';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disable-local-trait-effects.token.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/core/src/lib/local-store/disable-local-trait-effects.token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,cAAc,CAC3D,0BAA0B,CAC3B,CAAC","sourcesContent":["import { InjectionToken } from '@angular/core';\n\n/**\n * @internal\n */\nexport const DISABLE_LOCAL_TRAIT_EFFECTS = new InjectionToken<boolean>(\n 'disableLocalTraitEffects'\n);\n"]}
|