@ngrx-traits/core 12.1.2 → 13.0.0-beta.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.
Files changed (81) hide show
  1. package/cache/cache.service.d.ts +2 -1
  2. package/esm2020/cache/cache.actions.mjs +6 -0
  3. package/esm2020/cache/cache.models.mjs +30 -0
  4. package/esm2020/cache/cache.module.mjs +18 -0
  5. package/esm2020/cache/cache.reducer.mjs +138 -0
  6. package/esm2020/cache/cache.selectors.mjs +5 -0
  7. package/esm2020/cache/cache.service.mjs +72 -0
  8. package/esm2020/cache/index.mjs +7 -0
  9. package/esm2020/create-entity-feature.mjs +404 -0
  10. package/esm2020/index.mjs +7 -0
  11. package/esm2020/local-store/disable-local-trait-effects.token.mjs +7 -0
  12. package/esm2020/local-store/index.mjs +3 -0
  13. package/esm2020/local-store/traits-local-store.mjs +147 -0
  14. package/esm2020/model.mjs +2 -0
  15. package/esm2020/ngrx-traits-core.mjs +5 -0
  16. package/esm2020/public_api.mjs +2 -0
  17. package/esm2020/testing/index.mjs +2 -0
  18. package/esm2020/testing/ngrx-traits-core-testing.mjs +5 -0
  19. package/esm2020/testing/provide-mock-local-traits.mjs +36 -0
  20. package/esm2020/testing/public_api.mjs +2 -0
  21. package/esm2020/trait-effect.mjs +32 -0
  22. package/esm2020/util.mjs +70 -0
  23. package/fesm2015/{ngrx-traits-core-testing.js → ngrx-traits-core-testing.mjs} +1 -1
  24. package/fesm2015/ngrx-traits-core-testing.mjs.map +1 -0
  25. package/fesm2015/{ngrx-traits-core.js → ngrx-traits-core.mjs} +13 -13
  26. package/fesm2015/ngrx-traits-core.mjs.map +1 -0
  27. package/{esm2015/testing/provide-mock-local-traits.js → fesm2020/ngrx-traits-core-testing.mjs} +12 -8
  28. package/fesm2020/ngrx-traits-core-testing.mjs.map +1 -0
  29. package/fesm2020/ngrx-traits-core.mjs +915 -0
  30. package/fesm2020/ngrx-traits-core.mjs.map +1 -0
  31. package/package.json +36 -14
  32. package/src/lib/cache/README.md +100 -0
  33. package/src/lib/local-store/README.md +172 -0
  34. package/testing/package.json +5 -5
  35. package/bundles/ngrx-traits-core-testing.umd.js +0 -52
  36. package/bundles/ngrx-traits-core-testing.umd.js.map +0 -1
  37. package/bundles/ngrx-traits-core.umd.js +0 -1442
  38. package/bundles/ngrx-traits-core.umd.js.map +0 -1
  39. package/esm2015/cache/cache.actions.js +0 -6
  40. package/esm2015/cache/cache.actions.js.map +0 -1
  41. package/esm2015/cache/cache.models.js +0 -31
  42. package/esm2015/cache/cache.models.js.map +0 -1
  43. package/esm2015/cache/cache.module.js +0 -18
  44. package/esm2015/cache/cache.module.js.map +0 -1
  45. package/esm2015/cache/cache.reducer.js +0 -141
  46. package/esm2015/cache/cache.reducer.js.map +0 -1
  47. package/esm2015/cache/cache.selectors.js +0 -5
  48. package/esm2015/cache/cache.selectors.js.map +0 -1
  49. package/esm2015/cache/cache.service.js +0 -72
  50. package/esm2015/cache/cache.service.js.map +0 -1
  51. package/esm2015/cache/index.js +0 -7
  52. package/esm2015/cache/index.js.map +0 -1
  53. package/esm2015/create-entity-feature.js +0 -409
  54. package/esm2015/create-entity-feature.js.map +0 -1
  55. package/esm2015/index.js +0 -7
  56. package/esm2015/index.js.map +0 -1
  57. package/esm2015/local-store/disable-local-trait-effects.token.js +0 -7
  58. package/esm2015/local-store/disable-local-trait-effects.token.js.map +0 -1
  59. package/esm2015/local-store/index.js +0 -3
  60. package/esm2015/local-store/index.js.map +0 -1
  61. package/esm2015/local-store/traits-local-store.js +0 -148
  62. package/esm2015/local-store/traits-local-store.js.map +0 -1
  63. package/esm2015/model.js +0 -2
  64. package/esm2015/model.js.map +0 -1
  65. package/esm2015/ngrx-traits-core.js +0 -5
  66. package/esm2015/ngrx-traits-core.js.map +0 -1
  67. package/esm2015/public_api.js +0 -2
  68. package/esm2015/public_api.js.map +0 -1
  69. package/esm2015/testing/index.js +0 -2
  70. package/esm2015/testing/index.js.map +0 -1
  71. package/esm2015/testing/ngrx-traits-core-testing.js +0 -5
  72. package/esm2015/testing/ngrx-traits-core-testing.js.map +0 -1
  73. package/esm2015/testing/provide-mock-local-traits.js.map +0 -1
  74. package/esm2015/testing/public_api.js +0 -2
  75. package/esm2015/testing/public_api.js.map +0 -1
  76. package/esm2015/trait-effect.js +0 -32
  77. package/esm2015/trait-effect.js.map +0 -1
  78. package/esm2015/util.js +0 -67
  79. package/esm2015/util.js.map +0 -1
  80. package/fesm2015/ngrx-traits-core-testing.js.map +0 -1
  81. package/fesm2015/ngrx-traits-core.js.map +0 -1
@@ -1,409 +0,0 @@
1
- import { combineReducers, createFeatureSelector, createReducer, createSelector, } from '@ngrx/store';
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
- */
30
- export function createEntityFeatureFactory(namesOrFactory, ...traits) {
31
- return ((config) => {
32
- const { entityName, entitiesName } = 'entityName' in namesOrFactory
33
- ? namesOrFactory
34
- : { entityName: 'Entity', entitiesName: 'Entities' };
35
- const singular = capitalize(entityName);
36
- const plural = entitiesName
37
- ? capitalize(entitiesName)
38
- : capitalize(entityName + 's');
39
- const sortedTraits = sortTraits('entityName' in namesOrFactory ? [...traits] : [namesOrFactory, ...traits]);
40
- const allConfigs = buildAllConfigs(sortedTraits);
41
- const allActions = buildAllActions(sortedTraits, config.actionsGroupKey, singular, plural, allConfigs);
42
- const allSelectors = buildAllSelectors(sortedTraits, allConfigs);
43
- const allMutators = buildAllMutators(sortedTraits, allSelectors, allConfigs);
44
- const initialState = buildInitialState(sortedTraits, allConfigs);
45
- const reducer = buildReducer(sortedTraits, initialState, allActions, allSelectors, allMutators, allConfigs);
46
- const featureSelector = typeof config.featureSelector === 'string'
47
- ? createFeatureSelector(config.featureSelector)
48
- : config.featureSelector;
49
- const allFeatureSelectors = allSelectors && getSelectorsForFeature(featureSelector, allSelectors);
50
- const allEffects = buildAllEffects(sortedTraits, allActions, allFeatureSelectors, allConfigs);
51
- return {
52
- actions: entityName
53
- ? renameProps(allActions, singular, plural)
54
- : allActions,
55
- selectors: entityName
56
- ? renameProps(allFeatureSelectors, singular, plural)
57
- : allSelectors,
58
- initialState,
59
- reducer: reducer !== null && reducer !== void 0 ? reducer : createReducer(initialState),
60
- effects: allEffects,
61
- };
62
- });
63
- }
64
- function renameProps(target, entityName, entitiesName) {
65
- const result = {};
66
- for (const [key, value] of Object.entries(target)) {
67
- const newKey = key
68
- .replace('Entities', entitiesName)
69
- .replace('Entity', entityName);
70
- result[newKey] = value;
71
- }
72
- return result;
73
- }
74
- function sortTraits(traits) {
75
- var _a;
76
- const sortedTraits = [];
77
- for (let i = 0; i < traits.length; i++) {
78
- const trait = traits[i];
79
- if (!((_a = trait.depends) === null || _a === void 0 ? void 0 : _a.length)) {
80
- sortedTraits.push(trait);
81
- continue;
82
- }
83
- if (trait.depends.length > 1)
84
- for (const d of trait.depends) {
85
- const isTraitPresent = traits.some((tr) => tr.key === d);
86
- if (isTraitPresent) {
87
- trait.depends = [d];
88
- break;
89
- }
90
- }
91
- if (trait.depends.length > 1)
92
- throw Error('could not find dependencies ' + trait.depends.join(' '));
93
- 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]); });
94
- if (isDependencyAlreadyAdded)
95
- sortedTraits.push(trait);
96
- else {
97
- // move trait to the end
98
- delete traits[i];
99
- traits.push(trait);
100
- }
101
- }
102
- return sortedTraits;
103
- }
104
- function buildAllConfigs(sortedTraits) {
105
- return sortedTraits.reduce((acc, factory) => {
106
- acc[factory.key] = factory.config;
107
- return acc;
108
- }, {});
109
- }
110
- function buildAllActions(sortedTraits, actionsGroupKey, entityName, entitiesName, allConfigs) {
111
- return sortedTraits.reduce((previousResult, factory) => {
112
- var _a, _b;
113
- let result = (_b = (_a = factory === null || factory === void 0 ? void 0 : factory.actions) === null || _a === void 0 ? void 0 : _a.call(factory, {
114
- actionsGroupKey: actionsGroupKey,
115
- entityName,
116
- entitiesName,
117
- allConfigs,
118
- })) !== null && _b !== void 0 ? _b : {};
119
- result = previousResult ? Object.assign(Object.assign({}, previousResult), result) : result;
120
- return result;
121
- }, {});
122
- }
123
- function buildAllSelectors(sortedTraits, allConfigs) {
124
- return sortedTraits.reduce((previousResult, factory) => {
125
- var _a, _b;
126
- let result = (_b = (_a = factory === null || factory === void 0 ? void 0 : factory.selectors) === null || _a === void 0 ? void 0 : _a.call(factory, {
127
- previousSelectors: previousResult,
128
- allConfigs,
129
- })) !== null && _b !== void 0 ? _b : {};
130
- result = previousResult ? Object.assign(Object.assign({}, previousResult), result) : result;
131
- return result;
132
- }, {});
133
- }
134
- function buildAllMutators(sortedTraits, allSelectors, allConfigs) {
135
- return (sortedTraits.reduce((previousResult, factory) => {
136
- var _a, _b;
137
- let result = (_b = (_a = factory === null || factory === void 0 ? void 0 : factory.mutators) === null || _a === void 0 ? void 0 : _a.call(factory, {
138
- allSelectors: allSelectors,
139
- previousMutators: previousResult,
140
- allConfigs,
141
- })) !== null && _b !== void 0 ? _b : {};
142
- result = previousResult ? Object.assign(Object.assign({}, previousResult), result) : result;
143
- return result;
144
- }, {}) || {});
145
- }
146
- function buildInitialState(sortedTraits, allConfigs) {
147
- return sortedTraits.reduce((previousResult, factory) => {
148
- var _a, _b, _c;
149
- const result = (_c = (_b = (_a = factory === null || factory === void 0 ? void 0 : factory.initialState) === null || _a === void 0 ? void 0 : _a.call(factory, {
150
- previousInitialState: previousResult,
151
- allConfigs,
152
- })) !== null && _b !== void 0 ? _b : previousResult) !== null && _c !== void 0 ? _c : {};
153
- return result;
154
- }, {});
155
- }
156
- function buildReducer(sortedTraits, initialState, allActions, allSelectors, allMutators, allConfigs) {
157
- return sortedTraits.reduce((previousResult, factory) => {
158
- var _a;
159
- const result = (_a = factory === null || factory === void 0 ? void 0 : factory.reducer) === null || _a === void 0 ? void 0 : _a.call(factory, {
160
- initialState,
161
- allActions,
162
- allSelectors,
163
- allMutators,
164
- allConfigs,
165
- });
166
- return result && previousResult
167
- ? (state = initialState, action) => {
168
- const aState = previousResult(state, action);
169
- return result(aState, action);
170
- }
171
- : result !== null && result !== void 0 ? result : previousResult;
172
- }, undefined);
173
- }
174
- function buildAllEffects(sortedTraits, allActions, allFeatureSelectors, allConfigs) {
175
- return sortedTraits.reduce((previousResult, factory) => {
176
- var _a, _b;
177
- let result = (_b = (_a = factory === null || factory === void 0 ? void 0 : factory.effects) === null || _a === void 0 ? void 0 : _a.call(factory, {
178
- allActions,
179
- allSelectors: allFeatureSelectors,
180
- allConfigs,
181
- })) !== null && _b !== void 0 ? _b : [];
182
- result = previousResult ? [...previousResult, ...result] : result;
183
- return result;
184
- }, []);
185
- }
186
- function getSelectorsForFeature(featureSelect, selectors) {
187
- const ss = {};
188
- for (const prop in selectors) {
189
- ss[prop] = createSelector(featureSelect, selectors[prop]);
190
- }
191
- return ss;
192
- }
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
- */
232
- export function combineEntityFeatures(traitFactoriesMap) {
233
- return ((config) => {
234
- const featureSelector = typeof config.featureSelector === 'string'
235
- ? createFeatureSelector(config.featureSelector)
236
- : config.featureSelector;
237
- const actions = {};
238
- const selectors = {};
239
- const reducers = {};
240
- let effects = [];
241
- for (const [key, entityFeatureFactory] of Object.entries(traitFactoriesMap)) {
242
- const selector = createSelector(featureSelector, (state) => state[key]);
243
- const featureTraits = entityFeatureFactory({
244
- actionsGroupKey: config.actionsGroupKey,
245
- featureSelector: selector,
246
- });
247
- actions[key] = featureTraits.actions;
248
- selectors[key] = featureTraits.selectors;
249
- reducers[key] = featureTraits.reducer;
250
- effects = [...effects, ...featureTraits.effects];
251
- }
252
- return {
253
- actions,
254
- selectors,
255
- reducer: combineReducers(reducers),
256
- effects,
257
- };
258
- });
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
- */
299
- export function mixEntityFeatures(traitFactoriesMap) {
300
- return ((config) => {
301
- const featureSelector = typeof config.featureSelector === 'string'
302
- ? createFeatureSelector(config.featureSelector)
303
- : config.featureSelector;
304
- let actions = {};
305
- let selectors = {};
306
- const reducers = {};
307
- let effects = [];
308
- for (const [key, entityFeatureFactory] of Object.entries(traitFactoriesMap)) {
309
- const selector = createSelector(featureSelector, (state) => state[key]);
310
- const featureTraits = entityFeatureFactory({
311
- actionsGroupKey: config.actionsGroupKey,
312
- featureSelector: selector,
313
- });
314
- actions = Object.assign(Object.assign({}, actions), featureTraits.actions);
315
- selectors = Object.assign(Object.assign({}, selectors), featureTraits.selectors);
316
- reducers[key] = featureTraits.reducer;
317
- effects = [...effects, ...featureTraits.effects];
318
- }
319
- return {
320
- actions,
321
- selectors,
322
- reducer: combineReducers(reducers),
323
- effects,
324
- };
325
- });
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
- */
370
- export function addEntityFeaturesProperties(targetTraitFactory, traitFactoriesMap) {
371
- return ((config) => {
372
- const featureSelector = typeof config.featureSelector === 'string'
373
- ? createFeatureSelector(config.featureSelector)
374
- : config.featureSelector;
375
- const targetFeatureTraits = targetTraitFactory({
376
- actionsGroupKey: config.actionsGroupKey,
377
- featureSelector: featureSelector,
378
- });
379
- const actions = Object.assign({}, targetFeatureTraits.actions);
380
- const selectors = Object.assign({}, targetFeatureTraits.selectors);
381
- const reducers = {};
382
- let effects = [...targetFeatureTraits.effects];
383
- for (const [key, entityFeatureFactory] of Object.entries(traitFactoriesMap)) {
384
- const selector = createSelector(featureSelector, (state) => state[key]);
385
- const featureTraits = entityFeatureFactory({
386
- actionsGroupKey: config.actionsGroupKey,
387
- featureSelector: selector,
388
- });
389
- actions[key] = featureTraits.actions;
390
- selectors[key] = featureTraits.selectors;
391
- reducers[key] = featureTraits.reducer;
392
- effects = [...effects, ...featureTraits.effects];
393
- }
394
- return {
395
- actions,
396
- selectors,
397
- reducer: setPropertiesReducer(targetFeatureTraits.reducer, reducers),
398
- effects,
399
- };
400
- });
401
- }
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
- }
409
- //# sourceMappingURL=create-entity-feature.js.map
@@ -1 +0,0 @@
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"]}
package/esm2015/index.js DELETED
@@ -1,7 +0,0 @@
1
- export * from './create-entity-feature';
2
- export * from './model';
3
- export * from './local-store';
4
- export * from './trait-effect';
5
- export * from './util';
6
- export * from './cache';
7
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
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"]}
@@ -1,7 +0,0 @@
1
- import { InjectionToken } from '@angular/core';
2
- /**
3
- * @ignore
4
- * @internal
5
- */
6
- export const DISABLE_LOCAL_TRAIT_EFFECTS = new InjectionToken('disableLocalTraitEffects');
7
- //# sourceMappingURL=disable-local-trait-effects.token.js.map
@@ -1 +0,0 @@
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"]}
@@ -1,3 +0,0 @@
1
- export * from './traits-local-store';
2
- export * from './disable-local-trait-effects.token';
3
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/core/src/lib/local-store/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,qCAAqC,CAAC","sourcesContent":["export * from './traits-local-store';\nexport * from './disable-local-trait-effects.token';\n"]}
@@ -1,148 +0,0 @@
1
- import { Injectable, Injector } from '@angular/core';
2
- import { createFeatureSelector, ReducerManager, Store } from '@ngrx/store';
3
- import { Actions, EffectSources } from '@ngrx/effects';
4
- import { getDestroyActionName, TraitEffect } from '../trait-effect';
5
- import { DISABLE_LOCAL_TRAIT_EFFECTS } from './disable-local-trait-effects.token';
6
- import * as i0 from "@angular/core";
7
- let id = 0;
8
- function uniqueComponentId() {
9
- return id++;
10
- }
11
- /**
12
- * Builds traitFactory and registers effects and reducers with
13
- * a generated component id, returns build actions and selectors
14
- * and a destroy method that will unergister the effects and reducers
15
- * when called, and a addEffect which can be use to register extra effects
16
- *
17
- * Used inside TraitsLocalStore, can be used to create your
18
- * own Component Service without extending TraitsLocalStore
19
- * @param injector
20
- * @param componentName
21
- * @param traitFactory
22
- */
23
- export function buildLocalTraits(injector, componentName, traitFactory) {
24
- var _a;
25
- const reducers = injector.get(ReducerManager);
26
- const effects = injector.get(EffectSources);
27
- const store = injector.get(Store);
28
- const componentId = `${componentName}_${uniqueComponentId()}`;
29
- const traits = traitFactory({
30
- featureSelector: createFeatureSelector(componentId),
31
- actionsGroupKey: `[${componentId}]`,
32
- });
33
- traits.reducer && reducers.addReducer(componentId, traits.reducer);
34
- const providers = (traits.effects && [...traits.effects.map((e) => ({ provide: e }))]) || [];
35
- const disableLocalTraitsEffects = injector.get(DISABLE_LOCAL_TRAIT_EFFECTS, false);
36
- if (!disableLocalTraitsEffects) {
37
- const i = Injector.create({
38
- providers: providers,
39
- parent: injector,
40
- });
41
- (_a = traits.effects) === null || _a === void 0 ? void 0 : _a.forEach((e) => {
42
- const effect = i.get(e);
43
- effect.componentId = componentId;
44
- effects.addEffects(effect);
45
- });
46
- }
47
- function destroy() {
48
- store.dispatch({ type: getDestroyActionName(componentId) });
49
- /**
50
- * A service that extends TraitsLocalStore and other component service are destroyed
51
- * before the component that depends on them, this causes that any subscriptions
52
- * to selectors of the TraitsLocalStore could fail because the store state is removed before
53
- * they are unsubscribe by the onDestroy of the component. Executing reducers.removeReducer
54
- * inside setTimeout ensures the state is remove after the component onDestroy was called,
55
- * avoiding the before mentioned possible issues.
56
- */
57
- setTimeout(() => reducers.removeReducer(componentId));
58
- }
59
- return {
60
- destroy,
61
- actions: traits.actions,
62
- selectors: traits.selectors,
63
- addEffects(localEffect) {
64
- localEffect.componentId = componentId;
65
- effects.addEffects(localEffect);
66
- },
67
- };
68
- }
69
- /**
70
- * Class used to create local traits service, receives a trait factory, which will be
71
- * built and its reducers and effect register using a dynamic id when the service is built
72
- * and get destroyed when the onDestroy lifecycle method of the service is called, if the service
73
- * has effects this.traits.addEffects(this) should be call in the constructor
74
- *
75
- * @example
76
- * const productFeatureFactory = createEntityFeatureFactory(
77
- * { entityName: 'product' },
78
- * addLoadEntitiesTrait<Product>(),
79
- * addSelectEntityTrait<Product>(),
80
- * );
81
- *
82
- * Injectable()
83
- * export class ProductsLocalTraits extends TraitsLocalStore<
84
- * typeof productFeatureFactory
85
- * > {
86
- * loadProducts$ = createEffect(() =>
87
- * this.actions$.pipe(
88
- * ofType(this.localActions.loadProducts),
89
- * switchMap(() =>
90
- * //call your service to get the products data
91
- * this.productService.getProducts().pipe(
92
- * map((res) =>
93
- * this.localActions.loadProductsSuccess({ entities: res.resultList })
94
- * ),
95
- * catchError(() => of(this.localActions.loadProductsFail()))
96
- * )
97
- * )
98
- * )
99
- * );
100
- *
101
- * constructor(injector: Injector, private productService: ProductService) {
102
- * super(injector);
103
- * this.traits.addEffects(this); // IMPORTANT! add this line if the service has effects
104
- * }
105
- *
106
- * setup(): LocalTraitsConfig<typeof productFeatureFactory> {
107
- * return {
108
- * componentName: 'ProductsPickerComponent',
109
- * traitsFactory: productFeatureFactory,
110
- * };
111
- * }
112
- * }
113
- *
114
- * // use in component later
115
- *
116
- * Component({
117
- * selector: 'some-component',
118
- * template: `<div> some content</div> `,
119
- * providers: [ProductsLocalTraits],
120
- * changeDetection: ChangeDetectionStrategy.OnPush,
121
- * })
122
- * export class ProductSelectDialogComponent implements OnInit {
123
- * constructor(private store: Store, private traits: ProductsLocalTraits) {}
124
- *
125
- * ngOnInit() {
126
- * this.store.dispatch(this.traits.localActions.loadProducts());
127
- * }
128
- * }
129
- */
130
- export class TraitsLocalStore extends TraitEffect {
131
- constructor(injector) {
132
- super(injector.get(Actions), injector.get(Store));
133
- this.injector = injector;
134
- const config = this.setup();
135
- this.traits = buildLocalTraits(this.injector, config.componentName, config.traitsFactory);
136
- this.localActions = this.traits.actions;
137
- this.localSelectors = this.traits.selectors;
138
- }
139
- ngOnDestroy() {
140
- this.traits.destroy();
141
- }
142
- }
143
- TraitsLocalStore.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: TraitsLocalStore, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable });
144
- TraitsLocalStore.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: TraitsLocalStore });
145
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: TraitsLocalStore, decorators: [{
146
- type: Injectable
147
- }], ctorParameters: function () { return [{ type: i0.Injector }]; } });
148
- //# sourceMappingURL=traits-local-store.js.map