From 38e9cc10f509cc6c1ab1bc1505e4bacc10a98fad Mon Sep 17 00:00:00 2001 From: timdeschryver <28659384+timdeschryver@users.noreply.github.com> Date: Sun, 10 Mar 2019 18:07:23 +0100 Subject: [PATCH] fix(Store): invoke meta reducers before user defined meta reducers --- modules/store/spec/runtime_checks.spec.ts | 42 +++++++++++++++++++++++ modules/store/src/store_module.ts | 16 ++++----- 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/modules/store/spec/runtime_checks.spec.ts b/modules/store/spec/runtime_checks.spec.ts index 3dc259a7a7..67200f9b47 100644 --- a/modules/store/spec/runtime_checks.spec.ts +++ b/modules/store/spec/runtime_checks.spec.ts @@ -5,6 +5,7 @@ import { RuntimeChecks, Store, StoreModule, + META_REDUCERS, } from '..'; describe('Runtime checks:', () => { @@ -42,6 +43,47 @@ describe('Runtime checks:', () => { }); }); + describe('Order of meta reducers:', () => { + it('should invoke meta reducers before user defined meta reducers', () => { + let logs: string[] = []; + function metaReducerFactory(logMessage: string) { + return function metaReducer(reducer: any) { + return function(state: any, action: any) { + logs.push(logMessage); + return reducer(state, action); + }; + }; + } + + TestBed.configureTestingModule({ + imports: [ + StoreModule.forRoot( + {}, + { + metaReducers: [metaReducerFactory('user')], + } + ), + ], + providers: [ + { + provide: META_REDUCERS, + useValue: metaReducerFactory('ngrx'), + multi: true, + }, + ], + }); + + const store: Store = TestBed.get(Store); + const expected = ['ngrx', 'user']; + + expect(logs).toEqual(expected); + logs = []; + + store.dispatch({ type: 'foo' }); + expect(logs).toEqual(expected); + }); + }); + describe('State Serialization:', () => { const invalidAction = () => ({ type: ErrorTypes.UnserializableState }); diff --git a/modules/store/src/store_module.ts b/modules/store/src/store_module.ts index fdfd6f5bda..121de3516a 100644 --- a/modules/store/src/store_module.ts +++ b/modules/store/src/store_module.ts @@ -135,7 +135,7 @@ export class StoreModule { }, { provide: _RESOLVED_META_REDUCERS, - deps: [USER_PROVIDED_META_REDUCERS, META_REDUCERS], + deps: [META_REDUCERS, USER_PROVIDED_META_REDUCERS], useFactory: _concatMetaReducers, }, { @@ -234,8 +234,7 @@ export class StoreModule { export function _createStoreReducers( injector: Injector, - reducers: ActionReducerMap, - tokenReducers: ActionReducerMap + reducers: ActionReducerMap ) { return reducers instanceof InjectionToken ? injector.get(reducers) : reducers; } @@ -263,10 +262,9 @@ export function _createFeatureStore( export function _createFeatureReducers( injector: Injector, - reducerCollection: ActionReducerMap[], - tokenReducerCollection: ActionReducerMap[] + reducerCollection: ActionReducerMap[] ) { - const reducers = reducerCollection.map((reducer, index) => { + const reducers = reducerCollection.map(reducer => { return reducer instanceof InjectionToken ? injector.get(reducer) : reducer; }); @@ -282,8 +280,8 @@ export function _initialStateFactory(initialState: any): any { } export function _concatMetaReducers( - userProvidedMetaReducers: MetaReducer[], - metaReducers: MetaReducer[] + metaReducers: MetaReducer[], + userProvidedMetaReducers: MetaReducer[] ): MetaReducer[] { - return userProvidedMetaReducers.concat(metaReducers); + return metaReducers.concat(userProvidedMetaReducers); }