diff --git a/package.json b/package.json index ca38c14..a8df514 100644 --- a/package.json +++ b/package.json @@ -42,22 +42,22 @@ "peerDependencies": { "@angular/common": "^4.0.0", "@angular/core": "^4.0.0", - "@ngrx/effects": "4.0.2", - "@ngrx/store": "4.0.2", + "@ngrx/effects": "4.0.3", + "@ngrx/store": "4.0.3", "rxjs": "^5.0.0" }, "devDependencies": { - "@angular/animations": "^4.3.3", - "@angular/common": "^4.3.3", - "@angular/compiler": "^4.3.3", - "@angular/compiler-cli": "^4.3.3", - "@angular/core": "^4.3.3", - "@angular/http": "^4.3.3", - "@angular/platform-browser": "^4.3.3", - "@angular/platform-browser-dynamic": "^4.3.3", - "@angular/platform-server": "^4.3.3", - "@ngrx/effects": "4.0.2", - "@ngrx/store": "4.0.2", + "@angular/animations": "^4.3.5", + "@angular/common": "^4.3.5", + "@angular/compiler": "^4.3.5", + "@angular/compiler-cli": "^4.3.5", + "@angular/core": "^4.3.5", + "@angular/http": "^4.3.5", + "@angular/platform-browser": "^4.3.5", + "@angular/platform-browser-dynamic": "^4.3.5", + "@angular/platform-server": "^4.3.5", + "@ngrx/effects": "4.0.3", + "@ngrx/store": "4.0.3", "@types/deep-freeze": "^0.0.29", "@types/fs-extra": "^4.0.0", "@types/glob": "^5.0.30", diff --git a/spec/effects.spec.ts b/spec/effects.spec.ts index 7ce71ef..de418a0 100644 --- a/spec/effects.spec.ts +++ b/spec/effects.spec.ts @@ -1,20 +1,18 @@ -// import { -// async, -// inject, -// fakeAsync, -// tick, -// TestBed -// } from '@angular/core/testing'; -// -// import { hot, cold } from 'jasmine-marbles'; -// +import { async, inject, fakeAsync, tick, TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; + +import { Observable } from 'rxjs/Observable'; + +import { hot, cold } from 'jasmine-marbles'; + // import { Store, StoreModule } from '@ngrx/store'; -// import { provideMockActions } from '@ngrx/effects/testing'; -// -// import { NgrxJsonApi } from '../src/api'; +import { Actions } from '@ngrx/effects'; +import { provideMockActions } from '@ngrx/effects/testing'; + +import { NgrxJsonApi } from '../src/api'; // import { NgrxJsonApiService } from '../src/services'; // import { NgrxJsonApiSelectors } from '../src/selectors'; -// import { NgrxJsonApiEffects } from '../src/effects'; +import { NgrxJsonApiEffects } from '../src/effects'; // // import { // NGRX_JSON_API_CONFIG, @@ -27,210 +25,243 @@ // NgrxJsonApiStoreReducer, // } from '../src/reducers'; // -// import { -// ApiPostInitAction, -// ApiPostSuccessAction, -// ApiPostFailAction, -// ApiPatchInitAction, -// ApiPatchSuccessAction, -// ApiPatchFailAction, -// ApiGetInitAction, -// ApiGetSuccessAction, -// ApiGetFailAction, -// ApiDeleteInitAction, -// ApiDeleteSuccessAction, -// ApiDeleteFailAction, -// LocalQueryInitAction, -// LocalQuerySuccessAction, -// LocalQueryFailAction -// } from '../src/actions'; -// +import { + ApiPostInitAction, + ApiPostSuccessAction, + ApiPostFailAction, + ApiPatchInitAction, + ApiPatchSuccessAction, + ApiPatchFailAction, + ApiGetInitAction, + ApiGetSuccessAction, + ApiGetFailAction, + ApiDeleteInitAction, + ApiDeleteSuccessAction, + ApiDeleteFailAction, + LocalQueryInitAction, + LocalQuerySuccessAction, + LocalQueryFailAction, +} from '../src/actions'; +import { generatePayload } from '../src/utils'; + // import { // testPayload, // resourceDefinitions // } from './test_utils'; -// + // import { updateStoreDataFromPayload } from '../src/utils'; -// -// -// import { -// MOCK_JSON_API_PROVIDERS, -// MOCK_NGRX_EFFECTS_PROVIDERS, -// TestingModule -// } from './testing.module'; -// -// xdescribe('NgrxJsonApiEffects', () => { -// let effects; -// let actions; -// -// beforeEach(() => { -// TestBed.configureTestingModule({ -// imports: [ -// TestingModule, -// ], -// providers: [ -// ...MOCK_JSON_API_PROVIDERS, -// ...MOCK_NGRX_EFFECTS_PROVIDERS, -// provideMockActions(() => actions), -// ] -// }) -// }); -// -// beforeEach(inject([NgrxJsonApiEffects], -// (_effects) => { -// effects = _effects; -// } -// )); -// -// let successPayload = { -// jsonApiData: { -// data: { -// type: 'SUCCESS' -// } -// }, -// query: { -// type: 'SUCCESS' -// } -// }; -// let failPayload = { -// jsonApiData: { -// data: { -// type: 'FAIL' -// } -// }, -// query: { -// type: 'FAIL' -// } -// }; -// let successQuery = { -// query: { -// type: 'SUCCESS' -// } -// }; -// let failQuery = { -// query: { -// type: 'FAIL' -// } -// }; -// -// it('should respond to successfull CREATE_INIT action', () => { -// let res; -// runner.queue(new ApiPostInitAction(successPayload)); -// effects.createResource$.subscribe(result => { -// res = result; -// expect(result).toEqual( -// new ApiPostSuccessAction(successPayload)); -// }); -// expect(res).toBeDefined(); -// }); -// -// it('should respond to failed CREATE_INIT action', () => { -// let res; -// runner.queue(new ApiPostInitAction(failPayload)); -// effects.createResource$.subscribe(result => { -// res = result; -// expect(result).toEqual( -// new ApiPostFailAction(failPayload)); -// }); -// expect(res).toBeDefined(); -// }); -// -// it('should respond to successfull UPDATE_INIT action', () => { -// let res; -// runner.queue(new ApiPatchInitAction(successPayload)); -// effects.updateResource$.subscribe(result => { -// res = result; -// expect(result).toEqual( -// new ApiPatchSuccessAction(successPayload)); -// }); -// expect(res).toBeDefined(); -// }); -// -// it('should respond to failed UPDATE_INIT action', () => { -// let res; -// runner.queue(new ApiPatchInitAction(failPayload)); -// effects.updateResource$.subscribe(result => { -// res = result; -// expect(result).toEqual( -// new ApiPatchFailAction(failPayload)); -// }); -// expect(res).toBeDefined(); -// }); -// -// it('should respond to successfull READ_INIT action', () => { -// let res; -// runner.queue(new ApiGetInitAction(successQuery.query)); -// effects.readResource$.subscribe(result => { -// res = result; -// expect(result).toEqual( -// new ApiGetSuccessAction({ -// jsonApiData: result.payload.jsonApiData, -// query: successQuery.query -// })); -// }); -// expect(res).toBeDefined(); -// }); -// -// it('should respond to failed READ_INIT action', () => { -// let res; -// runner.queue(new ApiGetInitAction(failQuery.query)); -// effects.readResource$.subscribe(result => { -// res = result; -// expect(result).toEqual( -// new ApiGetFailAction(failQuery)); -// }); -// expect(res).toBeDefined(); -// }); -// -// it('should respond to successfull DELETE_INIT action', () => { -// let res; -// runner.queue(new ApiDeleteInitAction(successQuery)); -// effects.deleteResource$.subscribe(result => { -// res = result; -// expect(result).toEqual( -// new ApiDeleteSuccessAction(Object.assign({}, successQuery, { jsonApiData: null })); -// }); -// expect(res).toBeDefined(); -// }); -// -// it('should respond to failed DELETE_INIT action', () => { -// let res; -// runner.queue(new ApiDeleteInitAction(failQuery)); -// effects.deleteResource$.subscribe(result => { -// res = result; -// expect(result).toEqual( -// new ApiDeleteFailAction(failQuery)); -// }); -// expect(res).toBeDefined(); -// }); -// -// it('should respond to successfull LOCAL_QUERY_INIT action', () => { -// let res; -// let query = { -// type: 'Article', -// id: '1', -// queryId: '11' -// } -// runner.queue(new LocalQueryInitAction(query)); -// effects.queryStore$.subscribe(result => { -// res = result; -// expect(result).toEqual( -// new LocalQuerySuccessAction({ -// jsonApiData: { data: result.payload.jsonApiData.data }, -// query: query, -// })); -// }); -// expect(res).toBeDefined(); -// }); -// -// // it('should respond to failed LOCAL_QUERY_INIT action', () => { -// // let res; -// // runner.queue(new LocalQueryInitAction(failQuery)); -// // effects.queryStore$.subscribe(result => { -// // res = result; -// // expect(result).toEqual( -// // new LocalQueryFailAction(failQuery)); -// // }); -// // expect(res).toBeDefined(); -// // }); -// }); + +import { + // MOCK_JSON_API_PROVIDERS, + // MOCK_NGRX_EFFECTS_PROVIDERS, + TestingModule, +} from './testing.module'; + +describe('NgrxJsonApiEffects', () => { + let effects: NgrxJsonApiEffects; + let actions: Observable; + let api; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestingModule], + providers: [ + NgrxJsonApiEffects, + { + provide: NgrxJsonApi, + useValue: jasmine.createSpyObj('database', [ + 'create', + 'update', + 'find', + // 'query', + // 'insert', + // 'executeWrite', + ]), + }, + provideMockActions(() => actions), + ], + }); + api = TestBed.get(NgrxJsonApi); + effects = TestBed.get(NgrxJsonApiEffects); + }); + + let resource = { + type: 'Person', + id: '1', + }; + // let successPayload = { + // jsonApiData: { + // data: { + // type: 'SUCCESS' + // } + // }, + // query: { + // type: 'SUCCESS' + // } + // }; + // let failPayload = { + // jsonApiData: { + // data: { + // type: 'FAIL' + // } + // }, + // query: { + // type: 'FAIL' + // } + // }; + // let successQuery = { + // query: { + // type: 'SUCCESS' + // } + // }; + // let failQuery = { + // query: { + // type: 'FAIL' + // } + // }; + // + it('should respond to successfull CREATE_INIT action', () => { + let postinitAction = new ApiPostInitAction(resource); + let payload = generatePayload(resource, 'POST'); + let completed = new ApiPostSuccessAction(payload); + actions = hot('-a', { a: postinitAction }); + let response = cold('--a|', { + a: new HttpResponse({ + body: payload.jsonApiData, + status: 200, + }), + }); + let expected = cold('---b', { b: completed }); + api.create.and.returnValue(response); + expect(effects.createResource$).toBeObservable(expected); + }); + + it('should respond to failed CREATE_INIT action', () => { + let postinitAction = new ApiPostInitAction(resource); + let payload = generatePayload(resource, 'POST'); + let error = new HttpResponse({ + body: payload.jsonApiData, + status: 400, + }); + let completed = new ApiPostFailAction( + effects.toErrorPayload(payload.query, error) + ); + actions = hot('-a', { a: postinitAction }); + let response = cold('-#', {}, error); + let expected = cold('--b', { b: completed }); + api.create.and.returnValue(response); + expect(effects.createResource$).toBeObservable(expected); + }); + + it('should respond to successfull UPDATE_INIT action', () => { + let patchinitAction = new ApiPatchInitAction(resource); + let payload = generatePayload(resource, 'PATCH'); + let completed = new ApiPatchSuccessAction(payload); + actions = hot('-a', { a: patchinitAction }); + let response = cold('--a|', { + a: new HttpResponse({ + body: payload.jsonApiData, + status: 200, + }), + }); + let expected = cold('---b', { b: completed }); + api.update.and.returnValue(response); + expect(effects.updateResource$).toBeObservable(expected); + }); + + it('should respond to failed UPDATE_INIT action', () => { + let patchinitAction = new ApiPatchInitAction(resource); + let payload = generatePayload(resource, 'PATCH'); + let error = new HttpResponse({ + body: payload.jsonApiData, + status: 400, + }); + let completed = new ApiPatchFailAction( + effects.toErrorPayload(payload.query, error) + ); + actions = hot('-a', { a: patchinitAction }); + let response = cold('--#', {}, error); + let expected = cold('---b', { b: completed }); + api.update.and.returnValue(response); + expect(effects.updateResource$).toBeObservable(expected); + }); + + // fit('should respond to successfull READ_INIT action', () => { + // let query = { type: 'Person', id: '1'} + // let getinitAction = new ApiGetInitAction(query); + // let completed = new ApiGetSuccessAction({ + // jsonApiData: {data: query}, + // query: query + // }); + // actions = hot('-a', {a: getinitAction}); + // let response = cold('--a|', {a: new HttpResponse({body: JSON.stringify({data: query}), + // status: 200})}); + // let expected = cold('---b', { b: completed }); + // api.find.and.returnValue(response); + // expect(effects.readResource$).toBeObservable(expected); + // + // }); + + // it('should respond to failed READ_INIT action', () => { + // let res; + // runner.queue(new ApiGetInitAction(failQuery.query)); + // effects.readResource$.subscribe(result => { + // res = result; + // expect(result).toEqual( + // new ApiGetFailAction(failQuery)); + // }); + // expect(res).toBeDefined(); + // }); + // + // it('should respond to successfull DELETE_INIT action', () => { + // let res; + // runner.queue(new ApiDeleteInitAction(successQuery)); + // effects.deleteResource$.subscribe(result => { + // res = result; + // expect(result).toEqual( + // new ApiDeleteSuccessAction(Object.assign({}, successQuery, { jsonApiData: null })); + // }); + // expect(res).toBeDefined(); + // }); + // + // it('should respond to failed DELETE_INIT action', () => { + // let res; + // runner.queue(new ApiDeleteInitAction(failQuery)); + // effects.deleteResource$.subscribe(result => { + // res = result; + // expect(result).toEqual( + // new ApiDeleteFailAction(failQuery)); + // }); + // expect(res).toBeDefined(); + // }); + // + // it('should respond to successfull LOCAL_QUERY_INIT action', () => { + // let res; + // let query = { + // type: 'Article', + // id: '1', + // queryId: '11' + // } + // runner.queue(new LocalQueryInitAction(query)); + // effects.queryStore$.subscribe(result => { + // res = result; + // expect(result).toEqual( + // new LocalQuerySuccessAction({ + // jsonApiData: { data: result.payload.jsonApiData.data }, + // query: query, + // })); + // }); + // expect(res).toBeDefined(); + // }); + // + // // it('should respond to failed LOCAL_QUERY_INIT action', () => { + // // let res; + // // runner.queue(new LocalQueryInitAction(failQuery)); + // // effects.queryStore$.subscribe(result => { + // // res = result; + // // expect(result).toEqual( + // // new LocalQueryFailAction(failQuery)); + // // }); + // // expect(res).toBeDefined(); + // // }); +}); diff --git a/src/effects.ts b/src/effects.ts index f9f29ef..8f9752b 100644 --- a/src/effects.ts +++ b/src/effects.ts @@ -1,9 +1,11 @@ import { Injectable, OnDestroy } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; + import * as _ from 'lodash'; import { Action, Store } from '@ngrx/store'; -import { Effect, Actions, toPayload } from '@ngrx/effects'; +import { Effect, Actions } from '@ngrx/effects'; import { Observable } from 'rxjs/Observable'; import 'rxjs/add/observable/of'; @@ -22,15 +24,19 @@ import { ApiGetInitAction, ApiApplyFailAction, ApiApplySuccessAction, + ApiPostInitAction, ApiPostFailAction, ApiPostSuccessAction, + ApiDeleteInitAction, ApiDeleteFailAction, ApiDeleteSuccessAction, ApiGetFailAction, ApiGetSuccessAction, + ApiPatchInitAction, ApiPatchFailAction, ApiPatchSuccessAction, NgrxJsonApiActionTypes, + LocalQueryInitAction, LocalQuerySuccessAction, LocalQueryFailAction, ApiQueryRefreshAction, @@ -57,10 +63,9 @@ import { @Injectable() export class NgrxJsonApiEffects implements OnDestroy { @Effect() - createResource$ = this.actions$ - .ofType(NgrxJsonApiActionTypes.API_POST_INIT) - .map(toPayload) - .map(it => this.generatePayload(it, 'POST')) + createResource$: Observable = this.actions$ + .ofType(NgrxJsonApiActionTypes.API_POST_INIT) + .map(it => this.generatePayload(it.payload, 'POST')) .mergeMap((payload: Payload) => { return this.jsonApi .create(payload.query, payload.jsonApiData) @@ -74,9 +79,8 @@ export class NgrxJsonApiEffects implements OnDestroy { @Effect() updateResource$ = this.actions$ - .ofType(NgrxJsonApiActionTypes.API_PATCH_INIT) - .map(toPayload) - .map(it => this.generatePayload(it, 'PATCH')) + .ofType(NgrxJsonApiActionTypes.API_PATCH_INIT) + .map(it => this.generatePayload(it.payload, 'PATCH')) .mergeMap((payload: Payload) => { return this.jsonApi .update(payload.query, payload.jsonApiData) @@ -90,8 +94,8 @@ export class NgrxJsonApiEffects implements OnDestroy { @Effect() readResource$ = this.actions$ - .ofType(NgrxJsonApiActionTypes.API_GET_INIT) - .map(toPayload) + .ofType(NgrxJsonApiActionTypes.API_GET_INIT) + .map(it => it.payload) .mergeMap((query: Query) => { return this.jsonApi .find(query) @@ -109,8 +113,8 @@ export class NgrxJsonApiEffects implements OnDestroy { @Effect() queryStore$ = this.actions$ - .ofType(NgrxJsonApiActionTypes.LOCAL_QUERY_INIT) - .map(toPayload) + .ofType(NgrxJsonApiActionTypes.LOCAL_QUERY_INIT) + .map(it => it.payload) .mergeMap((query: Query) => { return this.store .let(this.selectors.getNgrxJsonApiStore$()) @@ -131,8 +135,8 @@ export class NgrxJsonApiEffects implements OnDestroy { @Effect() deleteResource$ = this.actions$ - .ofType(NgrxJsonApiActionTypes.API_DELETE_INIT) - .map(toPayload) + .ofType(NgrxJsonApiActionTypes.API_DELETE_INIT) + .map(it => it.payload) .map(it => this.generatePayload(it, 'DELETE')) .mergeMap((payload: Payload) => { return this.jsonApi @@ -310,14 +314,17 @@ export class NgrxJsonApiEffects implements OnDestroy { return new ApiApplySuccessAction(actions); } - private toErrorPayload(query: Query, response: any): Payload { + private toErrorPayload( + query: Query, + response: HttpResponse | any + ): Payload { let contentType = null; if (response && response.headers) { contentType = response.headers.get('Content-Type'); } let document = null; if (contentType === 'application/vnd.api+json') { - document = response.json(); + document = response; } if (document && document.errors && document.errors.length > 0) { return { diff --git a/src/interfaces.ts b/src/interfaces.ts index 2f6f2e8..2949b33 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -109,7 +109,7 @@ export interface ModifyStoreResourceErrorsPayload { export interface Payload { jsonApiData?: Document; - query: Query; + query?: Query; } export interface Query { diff --git a/yarn.lock b/yarn.lock index 9874382..0b024f8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,77 +2,77 @@ # yarn lockfile v1 -"@angular/animations@^4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-4.3.3.tgz#b71ddd453673929f550b171cca99952b3aaa831c" +"@angular/animations@^4.3.5": + version "4.3.5" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-4.3.5.tgz#85aa454c887cc7cce11637ea5f6e9afad88490e1" dependencies: tslib "^1.7.1" -"@angular/common@^4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-4.3.3.tgz#1fafbea33af4eba4cddd8677ef57a0f76a50488c" +"@angular/common@^4.3.5": + version "4.3.5" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-4.3.5.tgz#5f6b11347eae1dfc34623ccfd4c06c8f4c488e2d" dependencies: tslib "^1.7.1" -"@angular/compiler-cli@^4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-4.3.3.tgz#b3e39991d1a2ac1445a4a7a122e29dce5492c637" +"@angular/compiler-cli@^4.3.5": + version "4.3.5" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-4.3.5.tgz#24e99b36c0909363ff8247bf331a8b89eaedfe63" dependencies: - "@angular/tsc-wrapped" "4.3.3" + "@angular/tsc-wrapped" "4.3.5" minimist "^1.2.0" reflect-metadata "^0.1.2" -"@angular/compiler@^4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-4.3.3.tgz#8c1582fe28a784401325e51a04a9b36b6712033e" +"@angular/compiler@^4.3.5": + version "4.3.5" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-4.3.5.tgz#50d3c986657beff1fef4f6dd9a3fa58e24abd548" dependencies: tslib "^1.7.1" -"@angular/core@^4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-4.3.3.tgz#8e6a76914661db407fa2d88dd2441c4c016ff625" +"@angular/core@^4.3.5": + version "4.3.5" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-4.3.5.tgz#bd1efdbf1ebcfb9c27a238e2aa4c48159b0895bb" dependencies: tslib "^1.7.1" -"@angular/http@^4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@angular/http/-/http-4.3.3.tgz#cbe3639010362b681076f0b606673a0e62fd940d" +"@angular/http@^4.3.5": + version "4.3.5" + resolved "https://registry.yarnpkg.com/@angular/http/-/http-4.3.5.tgz#81d4b0761c8ef035cb0b736300c237f36286f1f0" dependencies: tslib "^1.7.1" -"@angular/platform-browser-dynamic@^4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-4.3.3.tgz#b16c09dfe97b5b83daa0581b233f5ea3c3eefb3a" +"@angular/platform-browser-dynamic@^4.3.5": + version "4.3.5" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-4.3.5.tgz#4a697b3b0aec805b33884fd4a9b3473065bab1e0" dependencies: tslib "^1.7.1" -"@angular/platform-browser@^4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-4.3.3.tgz#623b659794f079096d4f7685b4bebcb49e3b9a71" +"@angular/platform-browser@^4.3.5": + version "4.3.5" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-4.3.5.tgz#c0d03409499cc29f81677aab623c9086760d84ef" dependencies: tslib "^1.7.1" -"@angular/platform-server@^4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-4.3.3.tgz#404c00208d7258d4f9a54c9a5dda2147b21b6c9b" +"@angular/platform-server@^4.3.5": + version "4.3.5" + resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-4.3.5.tgz#59b99e40c55830b8c51302cd3466d0b82c9b5a91" dependencies: parse5 "^3.0.1" tslib "^1.7.1" xhr2 "^0.1.4" -"@angular/tsc-wrapped@4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@angular/tsc-wrapped/-/tsc-wrapped-4.3.3.tgz#c5890f743664be64b79c200ae6e9da5d2a801f5b" +"@angular/tsc-wrapped@4.3.5": + version "4.3.5" + resolved "https://registry.yarnpkg.com/@angular/tsc-wrapped/-/tsc-wrapped-4.3.5.tgz#95fdaa813cfc57262fc7ef5fea726d628aefabac" dependencies: tsickle "^0.21.0" -"@ngrx/effects@4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@ngrx/effects/-/effects-4.0.2.tgz#31d6d14b1ca2380b5be061e91d9a0edb0f0f27c7" +"@ngrx/effects@4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@ngrx/effects/-/effects-4.0.3.tgz#5c1fbba5665373ce28a5934a122a6d5b1bc15edf" -"@ngrx/store@4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@ngrx/store/-/store-4.0.2.tgz#bd0388f0444a78b87059738274a3d3b5cc43e402" +"@ngrx/store@4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@ngrx/store/-/store-4.0.3.tgz#36abacdfa19bfb8506e40de80bae06050a1e15e9" "@types/deep-freeze@^0.0.29": version "0.0.29"