@ngrx-traits/core 12.0.0 → 12.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/bundles/ngrx-traits-core-testing.umd.js +3 -3
- package/bundles/ngrx-traits-core-testing.umd.js.map +1 -1
- package/bundles/ngrx-traits-core.umd.js +307 -77
- package/bundles/ngrx-traits-core.umd.js.map +1 -1
- package/create-entity-feature.d.ts +188 -17
- package/esm2015/cache/cache.module.js +4 -4
- package/esm2015/cache/cache.module.js.map +1 -1
- package/esm2015/create-entity-feature.js +156 -30
- package/esm2015/create-entity-feature.js.map +1 -1
- package/esm2015/local-store/disable-local-trait-effects.token.js +1 -0
- package/esm2015/local-store/disable-local-trait-effects.token.js.map +1 -1
- package/esm2015/local-store/traits-local-store.js +76 -3
- package/esm2015/local-store/traits-local-store.js.map +1 -1
- package/esm2015/model.js +0 -26
- package/esm2015/model.js.map +1 -1
- package/esm2015/trait-effect.js +3 -3
- package/esm2015/trait-effect.js.map +1 -1
- package/esm2015/util.js +50 -0
- package/esm2015/util.js.map +1 -1
- package/fesm2015/ngrx-traits-core-testing.js.map +1 -1
- package/fesm2015/ngrx-traits-core.js +289 -66
- package/fesm2015/ngrx-traits-core.js.map +1 -1
- package/local-store/disable-local-trait-effects.token.d.ts +1 -0
- package/local-store/traits-local-store.d.ts +73 -0
- package/package.json +1 -1
- package/util.d.ts +35 -0
|
@@ -1,27 +1,101 @@
|
|
|
1
1
|
import { Config, ExtractActionsType, ExtractSelectorsType, ExtractStateType, EntityFeatureFactory, FeatureSelectors, KeyedConfig, TraitActions, TraitFactory, TraitSelectors, TraitStateMutators, UnionToIntersection, TraitActionsFactory, TraitSelectorsFactory, TraitInitialStateFactory, TraitStateMutatorsFactory, TraitReducerFactory, TraitEffectsFactory } from './model';
|
|
2
2
|
import { ActionType } from '@ngrx/store';
|
|
3
3
|
import { Type } from './local-store';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Creates a function that when execute will combine all the traits, and return a EntityFeatureFactory
|
|
6
|
+
* which combines all the traits actions, selectors , reducers and effects,
|
|
7
|
+
* the names param will replace any action and selector with the word Entity or Entities,
|
|
8
|
+
* with the corresponding entityName and entitiesName param (entityName+'s' if entitiesName is omitted).
|
|
9
|
+
* @param namesConfig - Optional Names for entities
|
|
10
|
+
* @param namesConfig.entityName - singular name for entity
|
|
11
|
+
* @param [namesConfig.entitiesName] - plural name for entities, defaults to entityName + 's'
|
|
12
|
+
* @param traits set of traits to be combined
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
*
|
|
16
|
+
* const featureFactory = createEntityFeatureFactory(
|
|
17
|
+
* { entityName: 'product' },
|
|
18
|
+
* addLoadEntitiesTrait<Product>(),
|
|
19
|
+
* addSelectEntityTrait<Product>(),
|
|
20
|
+
* addAsyncActionTrait({
|
|
21
|
+
* name: 'checkout',
|
|
22
|
+
* actionSuccessProps: props<{ orderId: string }>(),
|
|
23
|
+
* })
|
|
24
|
+
* );
|
|
25
|
+
*
|
|
26
|
+
* export const productsFeature = featureFactory({
|
|
27
|
+
* actionsGroupKey: '[Products]',
|
|
28
|
+
* featureSelector: 'products',
|
|
29
|
+
* });
|
|
30
|
+
*/
|
|
16
31
|
export declare function createEntityFeatureFactory<F extends readonly TraitFactory[], EntityName extends string, EntitiesName extends string = `${EntityName}s`>({ entityName, entitiesName, }: {
|
|
17
32
|
entityName: EntityName;
|
|
18
33
|
entitiesName?: EntitiesName;
|
|
19
34
|
}, ...traits: F): EntityFeatureFactory<EntityName, EntitiesName, ExtractStateType<F>, ExtractActionsType<F>, ExtractSelectorsType<F>>;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
35
|
+
/**
|
|
36
|
+
* Creates a function that when execute will combine all the traits, and return a EntityFeatureFactory
|
|
37
|
+
* which combines all the traits actions, selectors , reducers and effects.
|
|
38
|
+
* @param traits set of traits to be combined
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
*
|
|
42
|
+
* const featureFactory = createEntityFeatureFactory(
|
|
43
|
+
* { entityName: 'product' },
|
|
44
|
+
* addLoadEntitiesTrait<Product>(),
|
|
45
|
+
* addSelectEntityTrait<Product>(),
|
|
46
|
+
* addAsyncActionTrait({
|
|
47
|
+
* name: 'checkout',
|
|
48
|
+
* actionSuccessProps: props<{ orderId: string }>(),
|
|
49
|
+
* })
|
|
50
|
+
* );
|
|
51
|
+
*
|
|
52
|
+
* export const productsFeature = featureFactory({
|
|
53
|
+
* actionsGroupKey: '[Products]',
|
|
54
|
+
* featureSelector: 'products',
|
|
55
|
+
* });
|
|
56
|
+
*
|
|
57
|
+
* productsFeature.actions.loadProducts();
|
|
58
|
+
*/
|
|
59
|
+
export declare function createEntityFeatureFactory<F extends readonly TraitFactory[]>(...traits: F): EntityFeatureFactory<'Entity', 'Entities', ExtractStateType<F>, ExtractActionsType<F>, ExtractSelectorsType<F>>;
|
|
60
|
+
/**
|
|
61
|
+
* Combine a map entityFeatureFactories into one,
|
|
62
|
+
* grouping the actions and selectors by the key of the respective entityFeatureFactory
|
|
63
|
+
* @param traitFactoriesMap
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
*
|
|
67
|
+
* const clientsFeatureFactory = createEntityFeatureFactory(
|
|
68
|
+
* { entityName: 'client', entitiesName: 'clients' },
|
|
69
|
+
* addLoadEntitiesTrait<Client>(),
|
|
70
|
+
* addCrudEntitiesTrait<Client>()
|
|
71
|
+
* );
|
|
72
|
+
*
|
|
73
|
+
* const productOrderFeatureFactory = createEntityFeatureFactory(
|
|
74
|
+
* { entityName: 'productOrder' },
|
|
75
|
+
* addLoadEntitiesTrait<ProductOrder>(),
|
|
76
|
+
* addSelectEntitiesTrait<ProductOrder>()
|
|
77
|
+
* );
|
|
78
|
+
*
|
|
79
|
+
* const productFeatureFactory = createEntityFeatureFactory(
|
|
80
|
+
* { entityName: 'product' },
|
|
81
|
+
* addLoadEntitiesTrait<Product>(),
|
|
82
|
+
* addSelectEntitiesTrait<Product>()
|
|
83
|
+
* );
|
|
84
|
+
*
|
|
85
|
+
* const productCombinedFactory = combineEntityFeatures({
|
|
86
|
+
* products: productFeatureFactory,
|
|
87
|
+
* productOrders: productOrderFeatureFactory,
|
|
88
|
+
* clients: clientsFeatureFactory,
|
|
89
|
+
* });
|
|
90
|
+
*
|
|
91
|
+
* const combinedFeature = productCombinedFactory({
|
|
92
|
+
* actionsGroupKey: '[Combined]',
|
|
93
|
+
* featureSelector: 'combined',
|
|
94
|
+
* });
|
|
95
|
+
*
|
|
96
|
+
* combinedFeature.actions.client.loadClients();
|
|
97
|
+
* combinedFeature.actions.product.loadProducts();
|
|
98
|
+
*/
|
|
25
99
|
export declare function combineEntityFeatures<T extends {
|
|
26
100
|
[key: string]: EntityFeatureFactory<any, any>;
|
|
27
101
|
}, K extends keyof T, State extends {
|
|
@@ -37,11 +111,93 @@ export declare function combineEntityFeatures<T extends {
|
|
|
37
111
|
effects: Type<any>[];
|
|
38
112
|
initialState: State;
|
|
39
113
|
}>(traitFactoriesMap: T): R;
|
|
114
|
+
/**
|
|
115
|
+
* Mix a map entityFeatureFactories into one, different from combine the actions and selectors a mix, not group by key like in combine, the keys are still use
|
|
116
|
+
* internal in the reducers and selector to separate the state
|
|
117
|
+
* @param traitFactoriesMap
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
*
|
|
121
|
+
* const clientsFeatureFactory = createEntityFeatureFactory(
|
|
122
|
+
* { entityName: 'client', entitiesName: 'clients' },
|
|
123
|
+
* addLoadEntitiesTrait<Client>(),
|
|
124
|
+
* addCrudEntitiesTrait<Client>()
|
|
125
|
+
* );
|
|
126
|
+
*
|
|
127
|
+
* const productOrderFeatureFactory = createEntityFeatureFactory(
|
|
128
|
+
* { entityName: 'productOrder' },
|
|
129
|
+
* addLoadEntitiesTrait<ProductOrder>(),
|
|
130
|
+
* addSelectEntitiesTrait<ProductOrder>()
|
|
131
|
+
* );
|
|
132
|
+
*
|
|
133
|
+
* const productFeatureFactory = createEntityFeatureFactory(
|
|
134
|
+
* { entityName: 'product' },
|
|
135
|
+
* addLoadEntitiesTrait<Product>(),
|
|
136
|
+
* addSelectEntitiesTrait<Product>()
|
|
137
|
+
* );
|
|
138
|
+
*
|
|
139
|
+
* const productMixedFactory = mixEntityFeatures({
|
|
140
|
+
* products: productFeatureFactory,
|
|
141
|
+
* productOrders: productOrderFeatureFactory,
|
|
142
|
+
* clients: clientsFeatureFactory,
|
|
143
|
+
* });
|
|
144
|
+
*
|
|
145
|
+
* const mixedFeature = productMixedFactory({
|
|
146
|
+
* actionsGroupKey: '[Mixed]',
|
|
147
|
+
* featureSelector: 'mixed',
|
|
148
|
+
* });
|
|
149
|
+
* mixedFeature.actions.loadClients();
|
|
150
|
+
* mixedFeature.actions.loadProducts();
|
|
151
|
+
*
|
|
152
|
+
*/
|
|
40
153
|
export declare function mixEntityFeatures<T extends {
|
|
41
154
|
[key: string]: EntityFeatureFactory<any, any>;
|
|
42
155
|
}, K extends keyof T, State extends {
|
|
43
156
|
[P in K]: ExtractStateType<ReturnType<T[P]>>;
|
|
44
157
|
}, A extends TraitActions & UnionToIntersection<ExtractActionsType<ReturnType<T[K]>>>, S extends TraitSelectors<any> & UnionToIntersection<FeatureSelectors<State, ExtractSelectorsType<ReturnType<T[K]>>>>, R extends EntityFeatureFactory<any, any, State, A, S>>(traitFactoriesMap: T): R;
|
|
158
|
+
/**
|
|
159
|
+
* Combines targetTraitFactory with the traitFactoriesMap using the keys as props for the targetTraitFactory state,
|
|
160
|
+
* and grouping the combined actions by key
|
|
161
|
+
* @param targetTraitFactory
|
|
162
|
+
* @param traitFactoriesMap
|
|
163
|
+
*
|
|
164
|
+
* @example
|
|
165
|
+
*
|
|
166
|
+
* const clientsFeatureFactory = createEntityFeatureFactory(
|
|
167
|
+
* { entityName: 'client', entitiesName: 'clients' },
|
|
168
|
+
* addLoadEntitiesTrait<Client>(),
|
|
169
|
+
* addCrudEntitiesTrait<Client>()
|
|
170
|
+
* );
|
|
171
|
+
*
|
|
172
|
+
* const productOrderFeatureFactory = createEntityFeatureFactory(
|
|
173
|
+
* { entityName: 'productOrder' },
|
|
174
|
+
* addLoadEntitiesTrait<ProductOrder>(),
|
|
175
|
+
* addSelectEntitiesTrait<ProductOrder>()
|
|
176
|
+
* );
|
|
177
|
+
*
|
|
178
|
+
* const productFeatureFactory = createEntityFeatureFactory(
|
|
179
|
+
* { entityName: 'product' },
|
|
180
|
+
* addLoadEntitiesTrait<Product>(),
|
|
181
|
+
* addSelectEntitiesTrait<Product>()
|
|
182
|
+
* );
|
|
183
|
+
*
|
|
184
|
+
* const productAddEntityPropertiesFactory = addEntityFeaturesProperties(
|
|
185
|
+
* productFeatureFactory,
|
|
186
|
+
* {
|
|
187
|
+
* productOrders: productOrderFeatureFactory,
|
|
188
|
+
* clients: clientsFeatureFactory,
|
|
189
|
+
* }
|
|
190
|
+
* );
|
|
191
|
+
*
|
|
192
|
+
* const combinedFeature = productAddEntityPropertiesFactory({
|
|
193
|
+
* actionsGroupKey: '[addEntityFeatures]',
|
|
194
|
+
* featureSelector: 'addEntityFeatures',
|
|
195
|
+
* });
|
|
196
|
+
*
|
|
197
|
+
* combinedFeature.actions.loadProducts();
|
|
198
|
+
* combinedFeature.actions.clients.loadClients();
|
|
199
|
+
* combinedFeature.actions.productOrders.loadProductOrders();
|
|
200
|
+
*/
|
|
45
201
|
export declare function addEntityFeaturesProperties<F extends EntityFeatureFactory<any, any>, T extends {
|
|
46
202
|
[key: string]: EntityFeatureFactory<any, any, any, any, any>;
|
|
47
203
|
}, K extends keyof T, State extends ExtractStateType<ReturnType<F>> & {
|
|
@@ -57,3 +213,18 @@ export declare function addEntityFeaturesProperties<F extends EntityFeatureFacto
|
|
|
57
213
|
effects: Type<any>[];
|
|
58
214
|
initialState: State;
|
|
59
215
|
}>(targetTraitFactory: F, traitFactoriesMap: T): R;
|
|
216
|
+
/**
|
|
217
|
+
* Helper function to create an implementation a TraitFactory
|
|
218
|
+
* @param f TraitFactory implementation
|
|
219
|
+
*/
|
|
220
|
+
export declare function createTraitFactory<State = {}, A extends TraitActions = {}, S extends TraitSelectors<State> = {}, M extends TraitStateMutators<State> = {}, KEY extends string = string, C = unknown, KC = KeyedConfig<KEY, C>>(f: {
|
|
221
|
+
key: KEY;
|
|
222
|
+
config?: C;
|
|
223
|
+
depends?: string[];
|
|
224
|
+
actions?: TraitActionsFactory<A, KC>;
|
|
225
|
+
selectors?: TraitSelectorsFactory<State, S, KC>;
|
|
226
|
+
initialState?: TraitInitialStateFactory<State, KC>;
|
|
227
|
+
mutators?: TraitStateMutatorsFactory<State, M, KC>;
|
|
228
|
+
reducer?: TraitReducerFactory<State, A, S, M, KC>;
|
|
229
|
+
effects?: TraitEffectsFactory<State, A, S, KC>;
|
|
230
|
+
}): TraitFactory<State, A, S, M, KEY, C, KC>;
|
|
@@ -5,10 +5,10 @@ import * as i0 from "@angular/core";
|
|
|
5
5
|
import * as i1 from "@ngrx/store";
|
|
6
6
|
export class CacheModule {
|
|
7
7
|
}
|
|
8
|
-
CacheModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.
|
|
9
|
-
CacheModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.
|
|
10
|
-
CacheModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.
|
|
11
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.
|
|
8
|
+
CacheModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: CacheModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
9
|
+
CacheModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: CacheModule, imports: [i1.StoreFeatureModule] });
|
|
10
|
+
CacheModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: CacheModule, providers: [], imports: [[StoreModule.forFeature('cache', cacheReducer)]] });
|
|
11
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: CacheModule, decorators: [{
|
|
12
12
|
type: NgModule,
|
|
13
13
|
args: [{
|
|
14
14
|
imports: [StoreModule.forFeature('cache', cacheReducer)],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.module.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/core/src/lib/cache/cache.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;;;AAM/C,MAAM,OAAO,WAAW;;
|
|
1
|
+
{"version":3,"file":"cache.module.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/core/src/lib/cache/cache.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;;;AAM/C,MAAM,OAAO,WAAW;;yGAAX,WAAW;0GAAX,WAAW;0GAAX,WAAW,aAFX,EAAE,YADJ,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;4FAG7C,WAAW;kBAJvB,QAAQ;mBAAC;oBACR,OAAO,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;oBACxD,SAAS,EAAE,EAAE;iBACd","sourcesContent":["import { NgModule } from '@angular/core';\nimport { StoreModule } from '@ngrx/store';\nimport { cacheReducer } from './cache.reducer';\n\n@NgModule({\n imports: [StoreModule.forFeature('cache', cacheReducer)],\n providers: [],\n})\nexport class CacheModule {}\n"]}
|
|
@@ -1,8 +1,32 @@
|
|
|
1
1
|
import { combineReducers, createFeatureSelector, createReducer, createSelector, } from '@ngrx/store';
|
|
2
|
-
import { capitalize } from './util';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
import { capitalize, setPropertiesReducer } from './util';
|
|
3
|
+
/**
|
|
4
|
+
* Creates a function that when execute will combine all the traits, and return a EntityFeatureFactory
|
|
5
|
+
* which combines all the traits actions, selectors , reducers and effects,
|
|
6
|
+
* the names param will replace any action and selector with the word Entity or Entities,
|
|
7
|
+
* with the corresponding entityName and entitiesName param (entityName+'s' if entitiesName is omitted).
|
|
8
|
+
* @param namesConfig - Optional Names for entities
|
|
9
|
+
* @param namesConfig.entityName - singular name for entity
|
|
10
|
+
* @param [namesConfig.entitiesName] - plural name for entities, defaults to entityName + 's'
|
|
11
|
+
* @param traits set of traits to be combined
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
*
|
|
15
|
+
* const featureFactory = createEntityFeatureFactory(
|
|
16
|
+
* { entityName: 'product' },
|
|
17
|
+
* addLoadEntitiesTrait<Product>(),
|
|
18
|
+
* addSelectEntityTrait<Product>(),
|
|
19
|
+
* addAsyncActionTrait({
|
|
20
|
+
* name: 'checkout',
|
|
21
|
+
* actionSuccessProps: props<{ orderId: string }>(),
|
|
22
|
+
* })
|
|
23
|
+
* );
|
|
24
|
+
*
|
|
25
|
+
* export const productsFeature = featureFactory({
|
|
26
|
+
* actionsGroupKey: '[Products]',
|
|
27
|
+
* featureSelector: 'products',
|
|
28
|
+
* });
|
|
29
|
+
*/
|
|
6
30
|
export function createEntityFeatureFactory(namesOrFactory, ...traits) {
|
|
7
31
|
return ((config) => {
|
|
8
32
|
const { entityName, entitiesName } = 'entityName' in namesOrFactory
|
|
@@ -166,27 +190,45 @@ function getSelectorsForFeature(featureSelect, selectors) {
|
|
|
166
190
|
}
|
|
167
191
|
return ss;
|
|
168
192
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
}
|
|
193
|
+
/**
|
|
194
|
+
* Combine a map entityFeatureFactories into one,
|
|
195
|
+
* grouping the actions and selectors by the key of the respective entityFeatureFactory
|
|
196
|
+
* @param traitFactoriesMap
|
|
197
|
+
*
|
|
198
|
+
* @example
|
|
199
|
+
*
|
|
200
|
+
* const clientsFeatureFactory = createEntityFeatureFactory(
|
|
201
|
+
* { entityName: 'client', entitiesName: 'clients' },
|
|
202
|
+
* addLoadEntitiesTrait<Client>(),
|
|
203
|
+
* addCrudEntitiesTrait<Client>()
|
|
204
|
+
* );
|
|
205
|
+
*
|
|
206
|
+
* const productOrderFeatureFactory = createEntityFeatureFactory(
|
|
207
|
+
* { entityName: 'productOrder' },
|
|
208
|
+
* addLoadEntitiesTrait<ProductOrder>(),
|
|
209
|
+
* addSelectEntitiesTrait<ProductOrder>()
|
|
210
|
+
* );
|
|
211
|
+
*
|
|
212
|
+
* const productFeatureFactory = createEntityFeatureFactory(
|
|
213
|
+
* { entityName: 'product' },
|
|
214
|
+
* addLoadEntitiesTrait<Product>(),
|
|
215
|
+
* addSelectEntitiesTrait<Product>()
|
|
216
|
+
* );
|
|
217
|
+
*
|
|
218
|
+
* const productCombinedFactory = combineEntityFeatures({
|
|
219
|
+
* products: productFeatureFactory,
|
|
220
|
+
* productOrders: productOrderFeatureFactory,
|
|
221
|
+
* clients: clientsFeatureFactory,
|
|
222
|
+
* });
|
|
223
|
+
*
|
|
224
|
+
* const combinedFeature = productCombinedFactory({
|
|
225
|
+
* actionsGroupKey: '[Combined]',
|
|
226
|
+
* featureSelector: 'combined',
|
|
227
|
+
* });
|
|
228
|
+
*
|
|
229
|
+
* combinedFeature.actions.client.loadClients();
|
|
230
|
+
* combinedFeature.actions.product.loadProducts();
|
|
231
|
+
*/
|
|
190
232
|
export function combineEntityFeatures(traitFactoriesMap) {
|
|
191
233
|
return ((config) => {
|
|
192
234
|
const featureSelector = typeof config.featureSelector === 'string'
|
|
@@ -215,6 +257,45 @@ export function combineEntityFeatures(traitFactoriesMap) {
|
|
|
215
257
|
};
|
|
216
258
|
});
|
|
217
259
|
}
|
|
260
|
+
/**
|
|
261
|
+
* Mix a map entityFeatureFactories into one, different from combine the actions and selectors a mix, not group by key like in combine, the keys are still use
|
|
262
|
+
* internal in the reducers and selector to separate the state
|
|
263
|
+
* @param traitFactoriesMap
|
|
264
|
+
*
|
|
265
|
+
* @example
|
|
266
|
+
*
|
|
267
|
+
* const clientsFeatureFactory = createEntityFeatureFactory(
|
|
268
|
+
* { entityName: 'client', entitiesName: 'clients' },
|
|
269
|
+
* addLoadEntitiesTrait<Client>(),
|
|
270
|
+
* addCrudEntitiesTrait<Client>()
|
|
271
|
+
* );
|
|
272
|
+
*
|
|
273
|
+
* const productOrderFeatureFactory = createEntityFeatureFactory(
|
|
274
|
+
* { entityName: 'productOrder' },
|
|
275
|
+
* addLoadEntitiesTrait<ProductOrder>(),
|
|
276
|
+
* addSelectEntitiesTrait<ProductOrder>()
|
|
277
|
+
* );
|
|
278
|
+
*
|
|
279
|
+
* const productFeatureFactory = createEntityFeatureFactory(
|
|
280
|
+
* { entityName: 'product' },
|
|
281
|
+
* addLoadEntitiesTrait<Product>(),
|
|
282
|
+
* addSelectEntitiesTrait<Product>()
|
|
283
|
+
* );
|
|
284
|
+
*
|
|
285
|
+
* const productMixedFactory = mixEntityFeatures({
|
|
286
|
+
* products: productFeatureFactory,
|
|
287
|
+
* productOrders: productOrderFeatureFactory,
|
|
288
|
+
* clients: clientsFeatureFactory,
|
|
289
|
+
* });
|
|
290
|
+
*
|
|
291
|
+
* const mixedFeature = productMixedFactory({
|
|
292
|
+
* actionsGroupKey: '[Mixed]',
|
|
293
|
+
* featureSelector: 'mixed',
|
|
294
|
+
* });
|
|
295
|
+
* mixedFeature.actions.loadClients();
|
|
296
|
+
* mixedFeature.actions.loadProducts();
|
|
297
|
+
*
|
|
298
|
+
*/
|
|
218
299
|
export function mixEntityFeatures(traitFactoriesMap) {
|
|
219
300
|
return ((config) => {
|
|
220
301
|
const featureSelector = typeof config.featureSelector === 'string'
|
|
@@ -243,6 +324,49 @@ export function mixEntityFeatures(traitFactoriesMap) {
|
|
|
243
324
|
};
|
|
244
325
|
});
|
|
245
326
|
}
|
|
327
|
+
/**
|
|
328
|
+
* Combines targetTraitFactory with the traitFactoriesMap using the keys as props for the targetTraitFactory state,
|
|
329
|
+
* and grouping the combined actions by key
|
|
330
|
+
* @param targetTraitFactory
|
|
331
|
+
* @param traitFactoriesMap
|
|
332
|
+
*
|
|
333
|
+
* @example
|
|
334
|
+
*
|
|
335
|
+
* const clientsFeatureFactory = createEntityFeatureFactory(
|
|
336
|
+
* { entityName: 'client', entitiesName: 'clients' },
|
|
337
|
+
* addLoadEntitiesTrait<Client>(),
|
|
338
|
+
* addCrudEntitiesTrait<Client>()
|
|
339
|
+
* );
|
|
340
|
+
*
|
|
341
|
+
* const productOrderFeatureFactory = createEntityFeatureFactory(
|
|
342
|
+
* { entityName: 'productOrder' },
|
|
343
|
+
* addLoadEntitiesTrait<ProductOrder>(),
|
|
344
|
+
* addSelectEntitiesTrait<ProductOrder>()
|
|
345
|
+
* );
|
|
346
|
+
*
|
|
347
|
+
* const productFeatureFactory = createEntityFeatureFactory(
|
|
348
|
+
* { entityName: 'product' },
|
|
349
|
+
* addLoadEntitiesTrait<Product>(),
|
|
350
|
+
* addSelectEntitiesTrait<Product>()
|
|
351
|
+
* );
|
|
352
|
+
*
|
|
353
|
+
* const productAddEntityPropertiesFactory = addEntityFeaturesProperties(
|
|
354
|
+
* productFeatureFactory,
|
|
355
|
+
* {
|
|
356
|
+
* productOrders: productOrderFeatureFactory,
|
|
357
|
+
* clients: clientsFeatureFactory,
|
|
358
|
+
* }
|
|
359
|
+
* );
|
|
360
|
+
*
|
|
361
|
+
* const combinedFeature = productAddEntityPropertiesFactory({
|
|
362
|
+
* actionsGroupKey: '[addEntityFeatures]',
|
|
363
|
+
* featureSelector: 'addEntityFeatures',
|
|
364
|
+
* });
|
|
365
|
+
*
|
|
366
|
+
* combinedFeature.actions.loadProducts();
|
|
367
|
+
* combinedFeature.actions.clients.loadClients();
|
|
368
|
+
* combinedFeature.actions.productOrders.loadProductOrders();
|
|
369
|
+
*/
|
|
246
370
|
export function addEntityFeaturesProperties(targetTraitFactory, traitFactoriesMap) {
|
|
247
371
|
return ((config) => {
|
|
248
372
|
const featureSelector = typeof config.featureSelector === 'string'
|
|
@@ -275,9 +399,11 @@ export function addEntityFeaturesProperties(targetTraitFactory, traitFactoriesMa
|
|
|
275
399
|
};
|
|
276
400
|
});
|
|
277
401
|
}
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
402
|
+
/**
|
|
403
|
+
* Helper function to create an implementation a TraitFactory
|
|
404
|
+
* @param f TraitFactory implementation
|
|
405
|
+
*/
|
|
406
|
+
export function createTraitFactory(f) {
|
|
407
|
+
return f;
|
|
408
|
+
}
|
|
283
409
|
//# sourceMappingURL=create-entity-feature.js.map
|
|
@@ -1 +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"]}
|
|
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 ExtractSelectorsType,\n ExtractStateType,\n EntityFeatureFactory,\n FeatureSelectors,\n KeyedConfig,\n TraitActions,\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, setPropertiesReducer } from './util';\n\n/**\n * Creates a function that when execute will combine all the traits, and return a EntityFeatureFactory\n * which combines all the traits actions, selectors , reducers and effects,\n * the names param will replace any action and selector with the word Entity or Entities,\n * with the corresponding entityName and entitiesName param (entityName+'s' if entitiesName is omitted).\n * @param namesConfig - Optional Names for entities\n * @param namesConfig.entityName - singular name for entity\n * @param [namesConfig.entitiesName] - plural name for entities, defaults to entityName + 's'\n * @param traits set of traits to be combined\n *\n * @example\n *\n * const featureFactory = createEntityFeatureFactory(\n * { entityName: 'product' },\n * addLoadEntitiesTrait<Product>(),\n * addSelectEntityTrait<Product>(),\n * addAsyncActionTrait({\n * name: 'checkout',\n * actionSuccessProps: props<{ orderId: string }>(),\n * })\n * );\n *\n * export const productsFeature = featureFactory({\n * actionsGroupKey: '[Products]',\n * featureSelector: 'products',\n * });\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>;\n\n/**\n * Creates a function that when execute will combine all the traits, and return a EntityFeatureFactory\n * which combines all the traits actions, selectors , reducers and effects.\n * @param traits set of traits to be combined\n *\n * @example\n *\n * const featureFactory = createEntityFeatureFactory(\n * { entityName: 'product' },\n * addLoadEntitiesTrait<Product>(),\n * addSelectEntityTrait<Product>(),\n * addAsyncActionTrait({\n * name: 'checkout',\n * actionSuccessProps: props<{ orderId: string }>(),\n * })\n * );\n *\n * export const productsFeature = featureFactory({\n * actionsGroupKey: '[Products]',\n * featureSelector: 'products',\n * });\n *\n * productsFeature.actions.loadProducts();\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>;\n\n/**\n * Creates a function that when execute will combine all the traits, and return a EntityFeatureFactory\n * which combines all the traits actions, selectors , reducers and effects,\n * the names param will replace any action and selector with the word Entity or Entities,\n * with the corresponding entityName and entitiesName param (entityName+'s' if entitiesName is omitted).\n * @param namesConfig - Optional Names for entities\n * @param namesConfig.entityName - singular name for entity\n * @param [namesConfig.entitiesName] - plural name for entities, defaults to entityName + 's'\n * @param traits set of traits to be combined\n *\n * @example\n *\n * const featureFactory = createEntityFeatureFactory(\n * { entityName: 'product' },\n * addLoadEntitiesTrait<Product>(),\n * addSelectEntityTrait<Product>(),\n * addAsyncActionTrait({\n * name: 'checkout',\n * actionSuccessProps: props<{ orderId: string }>(),\n * })\n * );\n *\n * export const productsFeature = featureFactory({\n * actionsGroupKey: '[Products]',\n * featureSelector: 'products',\n * });\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}\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\n/**\n * Combine a map entityFeatureFactories into one,\n * grouping the actions and selectors by the key of the respective entityFeatureFactory\n * @param traitFactoriesMap\n *\n * @example\n *\n * const clientsFeatureFactory = createEntityFeatureFactory(\n * { entityName: 'client', entitiesName: 'clients' },\n * addLoadEntitiesTrait<Client>(),\n * addCrudEntitiesTrait<Client>()\n * );\n *\n * const productOrderFeatureFactory = createEntityFeatureFactory(\n * { entityName: 'productOrder' },\n * addLoadEntitiesTrait<ProductOrder>(),\n * addSelectEntitiesTrait<ProductOrder>()\n * );\n *\n * const productFeatureFactory = createEntityFeatureFactory(\n * { entityName: 'product' },\n * addLoadEntitiesTrait<Product>(),\n * addSelectEntitiesTrait<Product>()\n * );\n *\n * const productCombinedFactory = combineEntityFeatures({\n * products: productFeatureFactory,\n * productOrders: productOrderFeatureFactory,\n * clients: clientsFeatureFactory,\n * });\n *\n * const combinedFeature = productCombinedFactory({\n * actionsGroupKey: '[Combined]',\n * featureSelector: 'combined',\n * });\n *\n * combinedFeature.actions.client.loadClients();\n * combinedFeature.actions.product.loadProducts();\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\n/**\n * Mix a map entityFeatureFactories into one, different from combine the actions and selectors a mix, not group by key like in combine, the keys are still use\n * internal in the reducers and selector to separate the state\n * @param traitFactoriesMap\n *\n * @example\n *\n * const clientsFeatureFactory = createEntityFeatureFactory(\n * { entityName: 'client', entitiesName: 'clients' },\n * addLoadEntitiesTrait<Client>(),\n * addCrudEntitiesTrait<Client>()\n * );\n *\n * const productOrderFeatureFactory = createEntityFeatureFactory(\n * { entityName: 'productOrder' },\n * addLoadEntitiesTrait<ProductOrder>(),\n * addSelectEntitiesTrait<ProductOrder>()\n * );\n *\n * const productFeatureFactory = createEntityFeatureFactory(\n * { entityName: 'product' },\n * addLoadEntitiesTrait<Product>(),\n * addSelectEntitiesTrait<Product>()\n * );\n *\n * const productMixedFactory = mixEntityFeatures({\n * products: productFeatureFactory,\n * productOrders: productOrderFeatureFactory,\n * clients: clientsFeatureFactory,\n * });\n *\n * const mixedFeature = productMixedFactory({\n * actionsGroupKey: '[Mixed]',\n * featureSelector: 'mixed',\n * });\n * mixedFeature.actions.loadClients();\n * mixedFeature.actions.loadProducts();\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\n/**\n * Combines targetTraitFactory with the traitFactoriesMap using the keys as props for the targetTraitFactory state,\n * and grouping the combined actions by key\n * @param targetTraitFactory\n * @param traitFactoriesMap\n *\n * @example\n *\n * const clientsFeatureFactory = createEntityFeatureFactory(\n * { entityName: 'client', entitiesName: 'clients' },\n * addLoadEntitiesTrait<Client>(),\n * addCrudEntitiesTrait<Client>()\n * );\n *\n * const productOrderFeatureFactory = createEntityFeatureFactory(\n * { entityName: 'productOrder' },\n * addLoadEntitiesTrait<ProductOrder>(),\n * addSelectEntitiesTrait<ProductOrder>()\n * );\n *\n * const productFeatureFactory = createEntityFeatureFactory(\n * { entityName: 'product' },\n * addLoadEntitiesTrait<Product>(),\n * addSelectEntitiesTrait<Product>()\n * );\n *\n * const productAddEntityPropertiesFactory = addEntityFeaturesProperties(\n * productFeatureFactory,\n * {\n * productOrders: productOrderFeatureFactory,\n * clients: clientsFeatureFactory,\n * }\n * );\n *\n * const combinedFeature = productAddEntityPropertiesFactory({\n * actionsGroupKey: '[addEntityFeatures]',\n * featureSelector: 'addEntityFeatures',\n * });\n *\n * combinedFeature.actions.loadProducts();\n * combinedFeature.actions.clients.loadClients();\n * combinedFeature.actions.productOrders.loadProductOrders();\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/**\n * Helper function to create an implementation a TraitFactory\n * @param f TraitFactory implementation\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}\n"]}
|
|
@@ -1 +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
|
|
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;;;GAGG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,cAAc,CAC3D,0BAA0B,CAC3B,CAAC","sourcesContent":["import { InjectionToken } from '@angular/core';\n\n/**\n * @ignore\n * @internal\n */\nexport const DISABLE_LOCAL_TRAIT_EFFECTS = new InjectionToken<boolean>(\n 'disableLocalTraitEffects'\n);\n"]}
|