UNPKG

@datorama/akita-ng-effects

Version:

A Reactive State Management extension dealing with side effects.

66 lines 2.33 kB
import { Injector, NgModule } from '@angular/core'; import { _FEATURE_EFFECTS, _ROOT_EFFECTS, FEATURE_EFFECT_INSTANCES, ROOT_EFFECT_INSTANCES } from './tokens'; import { EffectsRootModule } from './effect-root.module'; import { Actions } from './actions'; import { EffectsFeatureModule } from './effect-feature.module'; import { ModuleManager } from './module-manager.service'; export class AkitaNgEffectsModule { static forRoot(rootEffects = []) { return { ngModule: EffectsRootModule, providers: [ ModuleManager, Actions, rootEffects, { provide: _ROOT_EFFECTS, useValue: [rootEffects], }, { provide: ROOT_EFFECT_INSTANCES, useFactory: createEffectInstances, deps: [Injector, _ROOT_EFFECTS, ModuleManager], }, ], }; } static forFeature(featureEffects = []) { return { ngModule: EffectsFeatureModule, providers: [ featureEffects, { provide: _FEATURE_EFFECTS, useValue: featureEffects, multi: true, }, { provide: FEATURE_EFFECT_INSTANCES, multi: true, useFactory: createEffectInstances, deps: [Injector, _FEATURE_EFFECTS, ModuleManager], }, ], }; } } AkitaNgEffectsModule.decorators = [ { type: NgModule, args: [{},] } ]; export function createEffectInstances(injector, effectGroups, moduleManager) { const mergedEffects = []; for (const effectGroup of effectGroups) { mergedEffects.push(...effectGroup); } // todo we shouldn't use a map to avoid registering the effects twice; // fix the underlying issue for feature is called twice const effectInstances = mergedEffects.reduce((acc, effect) => { if (!moduleManager.has(effect)) { moduleManager.add(effect); acc.push(injector.get(effect)); } return acc; }, []); return effectInstances; } //# sourceMappingURL=akita-ng-effects.module.js.map