From c31573f1c4d9cc02a90cd2033f68d83b17b74969 Mon Sep 17 00:00:00 2001 From: Brandon Date: Sat, 16 Sep 2017 13:49:11 -0500 Subject: [PATCH] chore(Example): Add Jest as test runner for example tests (#371) --- docs/entity/adapter.md | 2 +- example-app/README.md | 1 + .../login-form.component.spec.ts.snap | 375 ++++++++ .../components/login-form.component.spec.ts | 70 ++ .../login-page.component.spec.ts.snap | 243 +++++ .../containers/login-page.component.spec.ts | 66 ++ .../reducers/__snapshots__/auth.spec.ts.snap | 31 + .../__snapshots__/login-page.spec.ts.snap | 29 + example-app/app/auth/reducers/auth.spec.ts | 19 +- .../app/auth/reducers/login-page.spec.ts | 12 +- .../auth/services/auth-guard.service.spec.ts | 44 + .../app/auth/services/auth-guard.service.ts | 17 +- example-app/app/books/effects/book.spec.ts | 6 +- .../app/books/effects/collection.spec.ts | 24 +- .../reducers/__snapshots__/books.spec.ts.snap | 361 +++++++ example-app/app/books/reducers/books.spec.ts | 15 +- .../app/core/services/google-books.spec.ts | 6 +- example-app/tsconfig.spec.json | 10 +- modules/router-store/spec/integration.spec.ts | 22 +- modules/store/spec/edge.spec.ts | 2 +- modules/store/spec/store.spec.ts | 4 +- package.json | 68 +- setup-jest.ts | 6 + yarn.lock | 896 +++++++++++++++++- 24 files changed, 2214 insertions(+), 115 deletions(-) create mode 100644 example-app/app/auth/components/__snapshots__/login-form.component.spec.ts.snap create mode 100644 example-app/app/auth/components/login-form.component.spec.ts create mode 100644 example-app/app/auth/containers/__snapshots__/login-page.component.spec.ts.snap create mode 100644 example-app/app/auth/containers/login-page.component.spec.ts create mode 100644 example-app/app/auth/reducers/__snapshots__/auth.spec.ts.snap create mode 100644 example-app/app/auth/reducers/__snapshots__/login-page.spec.ts.snap create mode 100644 example-app/app/auth/services/auth-guard.service.spec.ts create mode 100644 example-app/app/books/reducers/__snapshots__/books.spec.ts.snap create mode 100644 setup-jest.ts diff --git a/docs/entity/adapter.md b/docs/entity/adapter.md index 7cb325292a..f2bf430dd3 100644 --- a/docs/entity/adapter.md +++ b/docs/entity/adapter.md @@ -7,7 +7,7 @@ returned adapter provides many [methods](#adapter-methods) for performing operat against the collection type. The method takes an object for configuration with 2 properties. - `selectId`: A `method` for selecting the primary id for the collection - - `sortComparer`: A compare function used to [sort](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) the collection. The comparer function is only needed if the collection needs to be sorted before being displayed. Set to `false` to use leave the collection unsorted, which is more performant during CRUD operations. + - `sortComparer`: A compare function used to [sort](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) the collection. The comparer function is only needed if the collection needs to be sorted before being displayed. Set to `false` to leave the collection unsorted, which is more performant during CRUD operations. Usage: diff --git a/example-app/README.md b/example-app/README.md index 78c940d8df..4ed3f3e448 100644 --- a/example-app/README.md +++ b/example-app/README.md @@ -18,6 +18,7 @@ Built with [@angular/cli](https://github.com/angular/angular-cli) - [@angular/router](https://github.com/angular/angular) - Angular Router - [@ngrx/db](https://github.com/ngrx/db) - RxJS powered IndexedDB for Angular apps - [@ngrx/store-devtools](https://github.com/ngrx/store-devtools) - Instrumentation for @ngrx/store enabling time-travel debugging + - [jest](https://facebook.github.io/jest/) - JavaScript test runner with easy setup, isolated browser testing and snapshot testing ### Quick start diff --git a/example-app/app/auth/components/__snapshots__/login-form.component.spec.ts.snap b/example-app/app/auth/components/__snapshots__/login-form.component.spec.ts.snap new file mode 100644 index 0000000000..6c03296a87 --- /dev/null +++ b/example-app/app/auth/components/__snapshots__/login-form.component.spec.ts.snap @@ -0,0 +1,375 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Login Page should compile 1`] = ` + + + + + + + Login + + + + + + +
+ + +

+ + + + + + + + + + + +

+ + + +

+ + + + + + + + + + + +

+ + + + + + + +

+ + + + + +

+ + + +
+ + +
+ + +
+ +
+`; + +exports[`Login Page should disable the form if pending 1`] = ` + + + + + + + Login + + + + + + +
+ + +

+ + + + + + + + + + + +

+ + + +

+ + + + + + + + + + + +

+ + + + + + + +

+ + + + + +

+ + + +
+ + +
+ + +
+ +
+`; + +exports[`Login Page should display an error message if provided 1`] = ` + + + + + + + Login + + + + + + +
+ + +

+ + + + + + + + + + + +

+ + + +

+ + + + + + + + + + + +

+ + + + +

+ + Invalid credentials + +

+ + + +

+ + + + + +

+ + + +
+ + +
+ + +
+ +
+`; diff --git a/example-app/app/auth/components/login-form.component.spec.ts b/example-app/app/auth/components/login-form.component.spec.ts new file mode 100644 index 0000000000..99e943cb84 --- /dev/null +++ b/example-app/app/auth/components/login-form.component.spec.ts @@ -0,0 +1,70 @@ +import { TestBed, ComponentFixture } from '@angular/core/testing'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { StoreModule, Store, combineReducers } from '@ngrx/store'; +import { LoginFormComponent } from './login-form.component'; +import * as Auth from '../actions/auth'; +import * as fromAuth from '../reducers'; +import { ReactiveFormsModule } from '@angular/forms'; + +describe('Login Page', () => { + let fixture: ComponentFixture; + let instance: LoginFormComponent; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ReactiveFormsModule], + declarations: [LoginFormComponent], + schemas: [NO_ERRORS_SCHEMA], + }); + + fixture = TestBed.createComponent(LoginFormComponent); + instance = fixture.componentInstance; + }); + + it('should compile', () => { + fixture.detectChanges(); + + /** + * The login form is a presentational component, as it + * only derives its state from inputs and communicates + * externally through outputs. We can use snapshot + * tests to validate the presentation state of this component + * by changing its inputs and snapshotting the generated + * HTML. + * + * We can also use this as a validation tool against changes + * to the component's template against the currently stored + * snapshot. + */ + expect(fixture).toMatchSnapshot(); + }); + + it('should disable the form if pending', () => { + instance.pending = true; + + fixture.detectChanges(); + + expect(fixture).toMatchSnapshot(); + }); + + it('should display an error message if provided', () => { + instance.errorMessage = 'Invalid credentials'; + + fixture.detectChanges(); + + expect(fixture).toMatchSnapshot(); + }); + + it('should emit an event if the form is valid when submitted', () => { + const credentials = { + username: 'user', + password: 'pass', + }; + instance.form.setValue(credentials); + + spyOn(instance.submitted, 'emit'); + instance.submit(); + + expect(instance.submitted.emit).toHaveBeenCalledWith(credentials); + }); +}); diff --git a/example-app/app/auth/containers/__snapshots__/login-page.component.spec.ts.snap b/example-app/app/auth/containers/__snapshots__/login-page.component.spec.ts.snap new file mode 100644 index 0000000000..1b1c954d7e --- /dev/null +++ b/example-app/app/auth/containers/__snapshots__/login-page.component.spec.ts.snap @@ -0,0 +1,243 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Login Page should compile 1`] = ` + + + + + + + + + + Login + + + + + + +
+ + +

+ + + +

+
+ +
+ + + + + + + + + +
+ +
+
+ +
+
+ + +
+ +
+
+
+
+ + + +

+ + + +

+ + + +

+
+ +
+ + + + + + + + + +
+ +
+
+ +
+
+ + +
+ +
+
+
+
+ + + +

+ + + + + + + +

+ + + + + +

+ + + + + + + + + + + + + + + +`; diff --git a/example-app/app/auth/containers/login-page.component.spec.ts b/example-app/app/auth/containers/login-page.component.spec.ts new file mode 100644 index 0000000000..7b52bb2ea3 --- /dev/null +++ b/example-app/app/auth/containers/login-page.component.spec.ts @@ -0,0 +1,66 @@ +import { TestBed, ComponentFixture } from '@angular/core/testing'; +import { MdInputModule, MdCardModule } from '@angular/material'; +import { ReactiveFormsModule } from '@angular/forms'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { StoreModule, Store, combineReducers } from '@ngrx/store'; +import { LoginPageComponent } from './login-page.component'; +import { LoginFormComponent } from '../components/login-form.component'; +import * as Auth from '../actions/auth'; +import * as fromAuth from '../reducers'; + +describe('Login Page', () => { + let fixture: ComponentFixture; + let store: Store; + let instance: LoginPageComponent; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ + NoopAnimationsModule, + StoreModule.forRoot({ + auth: combineReducers(fromAuth.reducers), + }), + MdInputModule, + MdCardModule, + ReactiveFormsModule, + ], + declarations: [LoginPageComponent, LoginFormComponent], + }); + + fixture = TestBed.createComponent(LoginPageComponent); + instance = fixture.componentInstance; + store = TestBed.get(Store); + + spyOn(store, 'dispatch').and.callThrough(); + }); + + /** + * Container components are used as integration points for connecting + * the store to presentational components and dispatching + * actions to the store. + * + * Container methods that dispatch events are like a component's output observables. + * Container properties that select state from store are like a component's input properties. + * If pure components are functions of their inputs, containers are functions of state + * + * Traditionally you would query the components rendered template + * to validate its state. Since the components are analagous to + * pure functions, we take snapshots of these components for a given state + * to validate the rendered output and verify the component's output + * against changes in state. + */ + it('should compile', () => { + fixture.detectChanges(); + + expect(fixture).toMatchSnapshot(); + }); + + it('should dispatch a login event on submit', () => { + const $event: any = {}; + const action = new Auth.Login($event); + + instance.onSubmit($event); + + expect(store.dispatch).toHaveBeenCalledWith(action); + }); +}); diff --git a/example-app/app/auth/reducers/__snapshots__/auth.spec.ts.snap b/example-app/app/auth/reducers/__snapshots__/auth.spec.ts.snap new file mode 100644 index 0000000000..c7011251f4 --- /dev/null +++ b/example-app/app/auth/reducers/__snapshots__/auth.spec.ts.snap @@ -0,0 +1,31 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`AuthReducer LOGIN_SUCCESS should add a user set loggedIn to true in auth state 1`] = ` +Object { + "loggedIn": true, + "user": Object { + "name": "test", + }, +} +`; + +exports[`AuthReducer LOGOUT should logout a user 1`] = ` +Object { + "loggedIn": false, + "user": null, +} +`; + +exports[`AuthReducer undefined action should return the default state 1`] = ` +Object { + "loggedIn": false, + "user": null, +} +`; + +exports[`AuthReducer wrong login payload should NOT authenticate a user 1`] = ` +Object { + "loggedIn": false, + "user": null, +} +`; diff --git a/example-app/app/auth/reducers/__snapshots__/login-page.spec.ts.snap b/example-app/app/auth/reducers/__snapshots__/login-page.spec.ts.snap new file mode 100644 index 0000000000..ad30237875 --- /dev/null +++ b/example-app/app/auth/reducers/__snapshots__/login-page.spec.ts.snap @@ -0,0 +1,29 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`LoginPageReducer LOGIN should make pending to true 1`] = ` +Object { + "error": null, + "pending": true, +} +`; + +exports[`LoginPageReducer LOGIN_FAILURE should have an error and no pending state 1`] = ` +Object { + "error": "login failed", + "pending": false, +} +`; + +exports[`LoginPageReducer LOGIN_SUCCESS should have no error and no pending state 1`] = ` +Object { + "error": null, + "pending": false, +} +`; + +exports[`LoginPageReducer undefined action should return the default state 1`] = ` +Object { + "error": null, + "pending": false, +} +`; diff --git a/example-app/app/auth/reducers/auth.spec.ts b/example-app/app/auth/reducers/auth.spec.ts index f41928665c..15a38c3146 100644 --- a/example-app/app/auth/reducers/auth.spec.ts +++ b/example-app/app/auth/reducers/auth.spec.ts @@ -9,7 +9,15 @@ describe('AuthReducer', () => { const action = {} as any; const result = reducer(undefined, action); - expect(result).toEqual(fromAuth.initialState); + + /** + * Snapshot tests are a quick way to validate + * the state produced by a reducer since + * its plain JavaScript object. These snapshots + * are used to validate against the current state + * if the functionality of the reducer ever changes. + */ + expect(result).toMatchSnapshot(); }); }); @@ -21,7 +29,8 @@ describe('AuthReducer', () => { const expectedResult = fromAuth.initialState; const result = reducer(fromAuth.initialState, createAction); - expect(result).toEqual(expectedResult); + + expect(result).toMatchSnapshot(); }); }); @@ -36,7 +45,8 @@ describe('AuthReducer', () => { }; const result = reducer(fromAuth.initialState, createAction); - expect(result).toEqual(expectedResult); + + expect(result).toMatchSnapshot(); }); }); @@ -51,7 +61,8 @@ describe('AuthReducer', () => { const expectedResult = fromAuth.initialState; const result = reducer(initialState, createAction); - expect(result).toEqual(expectedResult); + + expect(result).toMatchSnapshot(); }); }); }); diff --git a/example-app/app/auth/reducers/login-page.spec.ts b/example-app/app/auth/reducers/login-page.spec.ts index c25f222a5e..115a1b639c 100644 --- a/example-app/app/auth/reducers/login-page.spec.ts +++ b/example-app/app/auth/reducers/login-page.spec.ts @@ -9,7 +9,8 @@ describe('LoginPageReducer', () => { const action = {} as any; const result = reducer(undefined, action); - expect(result).toEqual(fromLoginPage.initialState); + + expect(result).toMatchSnapshot(); }); }); @@ -24,7 +25,8 @@ describe('LoginPageReducer', () => { }; const result = reducer(fromLoginPage.initialState, createAction); - expect(result).toEqual(expectedResult); + + expect(result).toMatchSnapshot(); }); }); @@ -39,7 +41,8 @@ describe('LoginPageReducer', () => { }; const result = reducer(fromLoginPage.initialState, createAction); - expect(result).toEqual(expectedResult); + + expect(result).toMatchSnapshot(); }); }); @@ -54,7 +57,8 @@ describe('LoginPageReducer', () => { }; const result = reducer(fromLoginPage.initialState, createAction); - expect(result).toEqual(expectedResult); + + expect(result).toMatchSnapshot(); }); }); }); diff --git a/example-app/app/auth/services/auth-guard.service.spec.ts b/example-app/app/auth/services/auth-guard.service.spec.ts new file mode 100644 index 0000000000..dcc3a41b8b --- /dev/null +++ b/example-app/app/auth/services/auth-guard.service.spec.ts @@ -0,0 +1,44 @@ +import { TestBed, inject } from '@angular/core/testing'; +import { StoreModule, Store, combineReducers } from '@ngrx/store'; +import { cold } from 'jasmine-marbles'; +import { AuthGuard } from './auth-guard.service'; +import * as Auth from '../actions/auth'; +import * as fromRoot from '../../reducers'; +import * as fromAuth from '../reducers'; + +describe('Auth Guard', () => { + let guard: AuthGuard; + let store: Store; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ + StoreModule.forRoot({ + ...fromRoot.reducers, + auth: combineReducers(fromAuth.reducers), + }), + ], + providers: [AuthGuard], + }); + + store = TestBed.get(Store); + spyOn(store, 'dispatch').and.callThrough(); + guard = TestBed.get(AuthGuard); + }); + + it('should return false if the user state is not logged in', () => { + const expected = cold('(a|)', { a: false }); + + expect(guard.canActivate()).toBeObservable(expected); + }); + + it('should return true if the user state is logged in', () => { + const user: any = {}; + const action = new Auth.LoginSuccess({ user }); + store.dispatch(action); + + const expected = cold('(a|)', { a: true }); + + expect(guard.canActivate()).toBeObservable(expected); + }); +}); diff --git a/example-app/app/auth/services/auth-guard.service.ts b/example-app/app/auth/services/auth-guard.service.ts index 875e8174f3..f2e5b2414c 100644 --- a/example-app/app/auth/services/auth-guard.service.ts +++ b/example-app/app/auth/services/auth-guard.service.ts @@ -12,13 +12,16 @@ export class AuthGuard implements CanActivate { constructor(private store: Store) {} canActivate(): Observable { - return this.store.select(fromAuth.getLoggedIn).take(1).map(authed => { - if (!authed) { - this.store.dispatch(new Auth.LoginRedirect()); - return false; - } + return this.store + .select(fromAuth.getLoggedIn) + .map(authed => { + if (!authed) { + this.store.dispatch(new Auth.LoginRedirect()); + return false; + } - return true; - }); + return true; + }) + .take(1); } } diff --git a/example-app/app/books/effects/book.spec.ts b/example-app/app/books/effects/book.spec.ts index dbe58a4bf5..c2b7e07c40 100644 --- a/example-app/app/books/effects/book.spec.ts +++ b/example-app/app/books/effects/book.spec.ts @@ -33,7 +33,7 @@ describe('BookEffects', () => { BookEffects, { provide: GoogleBooksService, - useValue: jasmine.createSpyObj('GoogleBooksService', ['searchBooks']), + useValue: { searchBooks: jest.fn() }, }, { provide: Actions, useFactory: getActions }, { provide: SEARCH_SCHEDULER, useFactory: getTestScheduler }, @@ -57,7 +57,7 @@ describe('BookEffects', () => { actions$.stream = hot('-a---', { a: action }); const response = cold('-a|', { a: books }); const expected = cold('-----b', { b: completion }); - googleBooksService.searchBooks.and.returnValue(response); + googleBooksService.searchBooks = jest.fn(() => response); expect(effects.search$).toBeObservable(expected); }); @@ -70,7 +70,7 @@ describe('BookEffects', () => { actions$.stream = hot('-a---', { a: action }); const response = cold('-#|', {}, error); const expected = cold('-----b', { b: completion }); - googleBooksService.searchBooks.and.returnValue(response); + googleBooksService.searchBooks = jest.fn(() => response); expect(effects.search$).toBeObservable(expected); }); diff --git a/example-app/app/books/effects/collection.spec.ts b/example-app/app/books/effects/collection.spec.ts index c2a4eb8774..e2032d4a8c 100644 --- a/example-app/app/books/effects/collection.spec.ts +++ b/example-app/app/books/effects/collection.spec.ts @@ -36,12 +36,12 @@ describe('CollectionEffects', () => { CollectionEffects, { provide: Database, - useValue: jasmine.createSpyObj('database', [ - 'open', - 'query', - 'insert', - 'executeWrite', - ]), + useValue: { + open: jest.fn(), + query: jest.fn(), + insert: jest.fn(), + executeWrite: jest.fn(), + }, }, { provide: Actions, useFactory: getActions }, ], @@ -67,7 +67,7 @@ describe('CollectionEffects', () => { actions$.stream = hot('-a', { a: action }); const response = cold('-a-b|', { a: book1, b: book2 }); const expected = cold('-----c', { c: completion }); - db.query.and.returnValue(response); + db.query = jest.fn(() => response); expect(effects.loadCollection$).toBeObservable(expected); }); @@ -80,7 +80,7 @@ describe('CollectionEffects', () => { actions$.stream = hot('-a', { a: action }); const response = cold('-#', {}, error); const expected = cold('--c', { c: completion }); - db.query.and.returnValue(response); + db.query = jest.fn(() => response); expect(effects.loadCollection$).toBeObservable(expected); }); @@ -94,7 +94,7 @@ describe('CollectionEffects', () => { actions$.stream = hot('-a', { a: action }); const response = cold('-b', { b: true }); const expected = cold('--c', { c: completion }); - db.insert.and.returnValue(response); + db.insert = jest.fn(() => response); expect(effects.addBookToCollection$).toBeObservable(expected); expect(db.insert).toHaveBeenCalledWith('books', [book1]); @@ -108,7 +108,7 @@ describe('CollectionEffects', () => { actions$.stream = hot('-a', { a: action }); const response = cold('-#', {}, error); const expected = cold('--c', { c: completion }); - db.insert.and.returnValue(response); + db.insert = jest.fn(() => response); expect(effects.addBookToCollection$).toBeObservable(expected); }); @@ -121,7 +121,7 @@ describe('CollectionEffects', () => { actions$.stream = hot('-a', { a: action }); const response = cold('-b', { b: true }); const expected = cold('--c', { c: completion }); - db.executeWrite.and.returnValue(response); + db.executeWrite = jest.fn(() => response); expect(effects.removeBookFromCollection$).toBeObservable(expected); expect(db.executeWrite).toHaveBeenCalledWith('books', 'delete', [ @@ -137,7 +137,7 @@ describe('CollectionEffects', () => { actions$.stream = hot('-a', { a: action }); const response = cold('-#', {}, error); const expected = cold('--c', { c: completion }); - db.executeWrite.and.returnValue(response); + db.executeWrite = jest.fn(() => response); expect(effects.removeBookFromCollection$).toBeObservable(expected); expect(db.executeWrite).toHaveBeenCalledWith('books', 'delete', [ diff --git a/example-app/app/books/reducers/__snapshots__/books.spec.ts.snap b/example-app/app/books/reducers/__snapshots__/books.spec.ts.snap new file mode 100644 index 0000000000..3ebd4bd978 --- /dev/null +++ b/example-app/app/books/reducers/__snapshots__/books.spec.ts.snap @@ -0,0 +1,361 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`BooksReducer LOAD should add a single book, if the book does not exist 1`] = ` +Object { + "entities": Object { + "1": Object { + "id": "1", + "volumeInfo": Object { + "authors": Array [ + "author", + ], + "averageRating": 3, + "description": "description", + "imageLinks": Object { + "smallThumbnail": "string", + "thumbnail": "string", + }, + "publishDate": "", + "publisher": "publisher", + "ratingsCount": 5, + "subtitle": "subtitle", + "title": "title", + }, + }, + }, + "ids": Array [ + "1", + ], + "selectedBookId": null, +} +`; + +exports[`BooksReducer LOAD should return the existing state if the book exists 1`] = ` +Object { + "entities": Object { + "1": Object { + "id": "1", + "volumeInfo": Object { + "authors": Array [ + "author", + ], + "averageRating": 3, + "description": "description", + "imageLinks": Object { + "smallThumbnail": "string", + "thumbnail": "string", + }, + "publishDate": "", + "publisher": "publisher", + "ratingsCount": 5, + "subtitle": "subtitle", + "title": "title", + }, + }, + }, + "ids": Array [ + "1", + ], + "selectedBookId": null, +} +`; + +exports[`BooksReducer SEARCH_COMPLETE & LOAD_SUCCESS should add all books in the payload when none exist 1`] = ` +Object { + "entities": Object { + "1": Object { + "id": "1", + "volumeInfo": Object { + "authors": Array [ + "author", + ], + "averageRating": 3, + "description": "description", + "imageLinks": Object { + "smallThumbnail": "string", + "thumbnail": "string", + }, + "publishDate": "", + "publisher": "publisher", + "ratingsCount": 5, + "subtitle": "subtitle", + "title": "title", + }, + }, + "222": Object { + "id": "222", + "volumeInfo": Object { + "authors": Array [ + "author", + ], + "averageRating": 3, + "description": "description", + "imageLinks": Object { + "smallThumbnail": "string", + "thumbnail": "string", + }, + "publishDate": "", + "publisher": "publisher", + "ratingsCount": 5, + "subtitle": "subtitle", + "title": "title", + }, + }, + }, + "ids": Array [ + "1", + "222", + ], + "selectedBookId": null, +} +`; + +exports[`BooksReducer SEARCH_COMPLETE & LOAD_SUCCESS should add all books in the payload when none exist 2`] = ` +Object { + "entities": Object { + "1": Object { + "id": "1", + "volumeInfo": Object { + "authors": Array [ + "author", + ], + "averageRating": 3, + "description": "description", + "imageLinks": Object { + "smallThumbnail": "string", + "thumbnail": "string", + }, + "publishDate": "", + "publisher": "publisher", + "ratingsCount": 5, + "subtitle": "subtitle", + "title": "title", + }, + }, + "222": Object { + "id": "222", + "volumeInfo": Object { + "authors": Array [ + "author", + ], + "averageRating": 3, + "description": "description", + "imageLinks": Object { + "smallThumbnail": "string", + "thumbnail": "string", + }, + "publishDate": "", + "publisher": "publisher", + "ratingsCount": 5, + "subtitle": "subtitle", + "title": "title", + }, + }, + }, + "ids": Array [ + "1", + "222", + ], + "selectedBookId": null, +} +`; + +exports[`BooksReducer SEARCH_COMPLETE & LOAD_SUCCESS should add only new books when books already exist 1`] = ` +Object { + "entities": Object { + "1": Object { + "id": "1", + "volumeInfo": Object { + "authors": Array [ + "author", + ], + "averageRating": 3, + "description": "description", + "imageLinks": Object { + "smallThumbnail": "string", + "thumbnail": "string", + }, + "publishDate": "", + "publisher": "publisher", + "ratingsCount": 5, + "subtitle": "subtitle", + "title": "title", + }, + }, + "222": Object { + "id": "222", + "volumeInfo": Object { + "authors": Array [ + "author", + ], + "averageRating": 3, + "description": "description", + "imageLinks": Object { + "smallThumbnail": "string", + "thumbnail": "string", + }, + "publishDate": "", + "publisher": "publisher", + "ratingsCount": 5, + "subtitle": "subtitle", + "title": "title", + }, + }, + "333": Object { + "id": "333", + "volumeInfo": Object { + "authors": Array [ + "author", + ], + "averageRating": 3, + "description": "description", + "imageLinks": Object { + "smallThumbnail": "string", + "thumbnail": "string", + }, + "publishDate": "", + "publisher": "publisher", + "ratingsCount": 5, + "subtitle": "subtitle", + "title": "title", + }, + }, + }, + "ids": Array [ + "1", + "222", + "333", + ], + "selectedBookId": null, +} +`; + +exports[`BooksReducer SEARCH_COMPLETE & LOAD_SUCCESS should add only new books when books already exist 2`] = ` +Object { + "entities": Object { + "1": Object { + "id": "1", + "volumeInfo": Object { + "authors": Array [ + "author", + ], + "averageRating": 3, + "description": "description", + "imageLinks": Object { + "smallThumbnail": "string", + "thumbnail": "string", + }, + "publishDate": "", + "publisher": "publisher", + "ratingsCount": 5, + "subtitle": "subtitle", + "title": "title", + }, + }, + "222": Object { + "id": "222", + "volumeInfo": Object { + "authors": Array [ + "author", + ], + "averageRating": 3, + "description": "description", + "imageLinks": Object { + "smallThumbnail": "string", + "thumbnail": "string", + }, + "publishDate": "", + "publisher": "publisher", + "ratingsCount": 5, + "subtitle": "subtitle", + "title": "title", + }, + }, + "333": Object { + "id": "333", + "volumeInfo": Object { + "authors": Array [ + "author", + ], + "averageRating": 3, + "description": "description", + "imageLinks": Object { + "smallThumbnail": "string", + "thumbnail": "string", + }, + "publishDate": "", + "publisher": "publisher", + "ratingsCount": 5, + "subtitle": "subtitle", + "title": "title", + }, + }, + }, + "ids": Array [ + "1", + "222", + "333", + ], + "selectedBookId": null, +} +`; + +exports[`BooksReducer SELECT should set the selected book id on the state 1`] = ` +Object { + "entities": Object { + "1": Object { + "id": "1", + "volumeInfo": Object { + "authors": Array [ + "author", + ], + "averageRating": 3, + "description": "description", + "imageLinks": Object { + "smallThumbnail": "string", + "thumbnail": "string", + }, + "publishDate": "", + "publisher": "publisher", + "ratingsCount": 5, + "subtitle": "subtitle", + "title": "title", + }, + }, + "222": Object { + "id": "222", + "volumeInfo": Object { + "authors": Array [ + "author", + ], + "averageRating": 3, + "description": "description", + "imageLinks": Object { + "smallThumbnail": "string", + "thumbnail": "string", + }, + "publishDate": "", + "publisher": "publisher", + "ratingsCount": 5, + "subtitle": "subtitle", + "title": "title", + }, + }, + }, + "ids": Array [ + "1", + "222", + ], + "selectedBookId": "1", +} +`; + +exports[`BooksReducer Selectors getSelectedId should return the selected id 1`] = `"1"`; + +exports[`BooksReducer undefined action should return the default state 1`] = ` +Object { + "entities": Object {}, + "ids": Array [], + "selectedBookId": null, +} +`; diff --git a/example-app/app/books/reducers/books.spec.ts b/example-app/app/books/reducers/books.spec.ts index 47560daa80..8b78b2fb39 100644 --- a/example-app/app/books/reducers/books.spec.ts +++ b/example-app/app/books/reducers/books.spec.ts @@ -21,7 +21,7 @@ describe('BooksReducer', () => { it('should return the default state', () => { const result = reducer(undefined, {} as any); - expect(result).toEqual(fromBooks.initialState); + expect(result).toMatchSnapshot(); }); }); @@ -36,7 +36,7 @@ describe('BooksReducer', () => { const result = reducer(booksInitialState, createAction); - expect(result).toEqual(initialState); + expect(result).toMatchSnapshot(); } function existingBooks(action: any, initialState: any, books: Book[]) { @@ -54,7 +54,8 @@ describe('BooksReducer', () => { }; const result = reducer(initialState, createAction); - expect(result).toEqual(expectedResult); + + expect(result).toMatchSnapshot(); } it('should add all books in the payload when none exist', () => { @@ -90,7 +91,7 @@ describe('BooksReducer', () => { const result = reducer(fromBooks.initialState, action); - expect(result).toEqual(expectedResult); + expect(result).toMatchSnapshot(); }); it('should return the existing state if the book exists', () => { @@ -98,7 +99,7 @@ describe('BooksReducer', () => { const result = reducer(expectedResult, action); - expect(result).toEqual(expectedResult); + expect(result).toMatchSnapshot(); }); }); @@ -108,7 +109,7 @@ describe('BooksReducer', () => { const result = reducer(initialState, action); - expect(result.selectedBookId).toBe(book1.id); + expect(result).toMatchSnapshot(); }); }); @@ -120,7 +121,7 @@ describe('BooksReducer', () => { selectedBookId: book1.id, }); - expect(result).toBe(book1.id); + expect(result).toMatchSnapshot(); }); }); }); diff --git a/example-app/app/core/services/google-books.spec.ts b/example-app/app/core/services/google-books.spec.ts index 30dd60160d..d525ef1e0a 100644 --- a/example-app/app/core/services/google-books.spec.ts +++ b/example-app/app/core/services/google-books.spec.ts @@ -10,7 +10,7 @@ describe('Service: GoogleBooks', () => { beforeEach(() => { TestBed.configureTestingModule({ providers: [ - { provide: Http, useValue: jasmine.createSpyObj('Http', ['get']) }, + { provide: Http, useValue: { get: jest.fn() } }, GoogleBooksService, ], }); @@ -41,7 +41,7 @@ describe('Service: GoogleBooks', () => { const response = cold('-a|', { a: httpResponse }); const expected = cold('-b|', { b: books.items }); - http.get.and.returnValue(response); + http.get = jest.fn(() => response); expect(service.searchBooks(queryTitle)).toBeObservable(expected); expect(http.get).toHaveBeenCalledWith( @@ -56,7 +56,7 @@ describe('Service: GoogleBooks', () => { const response = cold('-a|', { a: httpResponse }); const expected = cold('-b|', { b: data }); - http.get.and.returnValue(response); + http.get = jest.fn(() => response); expect(service.retrieveBook(data.volumeId)).toBeObservable(expected); expect(http.get).toHaveBeenCalledWith( diff --git a/example-app/tsconfig.spec.json b/example-app/tsconfig.spec.json index 19a8a96901..adf08a6c74 100644 --- a/example-app/tsconfig.spec.json +++ b/example-app/tsconfig.spec.json @@ -17,15 +17,7 @@ "node" ], "baseUrl": ".", - "rootDir": "../", - "paths": { - "@ngrx/effects": ["../modules/effects"], - "@ngrx/effects/testing": ["../modules/effects/testing"], - "@ngrx/store": ["../modules/store"], - "@ngrx/router-store": ["../modules/router-store"], - "@ngrx/store-devtools": ["../modules/store-devtools"], - "@ngrx/entity": ["../modules/entity"] - } + "rootDir": "../" }, "files": [ "test.ts" diff --git a/modules/router-store/spec/integration.spec.ts b/modules/router-store/spec/integration.spec.ts index 9e0519a881..f164bf87a1 100644 --- a/modules/router-store/spec/integration.spec.ts +++ b/modules/router-store/spec/integration.spec.ts @@ -20,7 +20,7 @@ import 'rxjs/add/operator/toPromise'; import { of } from 'rxjs/observable/of'; describe('integration spec', () => { - it('should work', done => { + it('should work', (done: any) => { const reducer = (state: string = '', action: RouterAction) => { if (action.type === ROUTER_NAVIGATION) { return action.payload.routerState.url.toString(); @@ -62,7 +62,7 @@ describe('integration spec', () => { }); }); - it('should support preventing navigation', done => { + it('should support preventing navigation', (done: any) => { const reducer = (state: string = '', action: RouterAction) => { if ( action.type === ROUTER_NAVIGATION && @@ -98,7 +98,7 @@ describe('integration spec', () => { }); }); - it('should support rolling back if navigation gets canceled', done => { + it('should support rolling back if navigation gets canceled', (done: any) => { const reducer = (state: string = '', action: RouterAction): any => { if (action.type === ROUTER_NAVIGATION) { return { @@ -156,7 +156,7 @@ describe('integration spec', () => { }); }); - it('should support rolling back if navigation errors', done => { + it('should support rolling back if navigation errors', (done: any) => { const reducer = (state: string = '', action: RouterAction): any => { if (action.type === ROUTER_NAVIGATION) { return { @@ -216,7 +216,9 @@ describe('integration spec', () => { }); }); - it('should call navigateByUrl when resetting state of the routerReducer', done => { + it('should call navigateByUrl when resetting state of the routerReducer', ( + done: any + ) => { const reducer = (state: any, action: RouterAction) => { const r = routerReducer(state, action); return r && r.state @@ -291,7 +293,9 @@ describe('integration spec', () => { }); }); - it('should support cancellation of initial navigation using canLoad guard', done => { + it('should support cancellation of initial navigation using canLoad guard', ( + done: any + ) => { const reducer = (state: any, action: RouterAction) => { const r = routerReducer(state, action); return r && r.state @@ -320,7 +324,9 @@ describe('integration spec', () => { done(); }); - it('should support a custom RouterStateSnapshot serializer ', done => { + it('should support a custom RouterStateSnapshot serializer ', ( + done: any + ) => { const reducer = (state: any, action: RouterAction) => { const r = routerReducer(state, action); return r && r.state @@ -374,7 +380,7 @@ describe('integration spec', () => { }); }); - it('should support event during an async canActivate guard', done => { + it('should support event during an async canActivate guard', (done: any) => { createTestModule({ reducers: { routerReducer }, canActivate: () => { diff --git a/modules/store/spec/edge.spec.ts b/modules/store/spec/edge.spec.ts index 0c5016dcda..00d9a795f7 100644 --- a/modules/store/spec/edge.spec.ts +++ b/modules/store/spec/edge.spec.ts @@ -32,7 +32,7 @@ describe('ngRx Store', () => { expect(store).toBeDefined(); }); - it('should handle re-entrancy', done => { + it('should handle re-entrancy', (done: any) => { let todosNextCount = 0; let todosCountNextCount = 0; diff --git a/modules/store/spec/store.spec.ts b/modules/store/spec/store.spec.ts index 3fe0f11dae..de310a6aed 100644 --- a/modules/store/spec/store.spec.ts +++ b/modules/store/spec/store.spec.ts @@ -37,7 +37,7 @@ describe('ngRx Store', () => { } describe('initial state', () => { - it('should handle an initial state object', done => { + it('should handle an initial state object', (done: any) => { setup(); store.take(1).subscribe({ @@ -49,7 +49,7 @@ describe('ngRx Store', () => { }); }); - it('should handle an initial state function', done => { + it('should handle an initial state function', (done: any) => { setup(() => ({ counter1: 0, counter2: 5 })); store.take(1).subscribe({ diff --git a/package.json b/package.json index 04f8be9bc6..0e3040040a 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "coverage:html": "nyc report --reporter=html", "example:start": "yarn run build && yarn run cli -- serve", "example:start:aot": "yarn run build && yarn run cli -- serve --aot", - "example:test": "yarn run cli -- test --code-coverage", + "example:test": "jest --watch", "example:build:prod": "yarn build && yarn cli -- build --aot -prod --base-href \"/platform/example-app/\" --output-path \"./example-dist/example-app\"", "ci": "yarn run build && yarn run test && nyc report --reporter=text-lcov | coveralls", "prettier": "prettier --parser typescript --single-quote --trailing-comma es5 --write \"./**/*.ts\"", @@ -24,16 +24,30 @@ "release": "lerna publish --skip-npm --conventional-commits && npm run build" }, "lint-staged": { - "*.ts": ["yarn prettier", "git add"] + "*.ts": [ + "yarn prettier", + "git add" + ] }, - "keywords": ["ngrx", "angular", "rxjs"], + "keywords": [ + "ngrx", + "angular", + "rxjs" + ], "author": "Rob Wormald ", "license": "MIT", "repository": {}, "nyc": { - "extension": [".ts"], - "exclude": ["**/*.spec", "**/spec/**/*"], - "include": ["**/*.ts"] + "extension": [ + ".ts" + ], + "exclude": [ + "**/*.spec", + "**/spec/**/*" + ], + "include": [ + "**/*.ts" + ] }, "devDependencies": { "@angular/animations": "^4.2.0", @@ -52,7 +66,9 @@ "@ngrx/db": "^2.0.1", "@types/fs-extra": "^2.1.0", "@types/glob": "^5.0.30", - "@types/jasmine": "2.5.38", + "@types/jasmine": "2.5.45", + "@types/jasminewd2": "^2.0.2", + "@types/jest": "^20.0.2", "@types/node": "^7.0.5", "@types/ora": "^0.3.31", "@types/rimraf": "^0.0.28", @@ -72,6 +88,9 @@ "jasmine-core": "~2.5.2", "jasmine-marbles": "^0.0.2", "jasmine-spec-reporter": "~3.2.0", + "jest": "^21.0.2", + "jest-preset-angular": "^3.0.1", + "jest-zone-patch": "^0.0.7", "karma": "~1.4.1", "karma-chrome-launcher": "~2.0.0", "karma-cli": "~1.0.1", @@ -106,5 +125,40 @@ "type": "opencollective", "url": "https://opencollective.com/ngrx", "logo": "https://opencollective.com/opencollective/logo.txt" + }, + "jest": { + "setupTestFrameworkScriptFile": "/setup-jest.ts", + "globals": { + "ts-jest": { + "tsConfigFile": "example-app/tsconfig.spec.json" + }, + "__TRANSFORM_HTML__": true + }, + "transform": { + "^.+\\.(ts|js|html)$": "/node_modules/jest-preset-angular/preprocessor.js" + }, + "testMatch": [ + "/example-app/**/*.spec.ts" + ], + "moduleFileExtensions": [ + "ts", + "js", + "html", + "json" + ], + "mapCoverage": true, + "coveragePathIgnorePatterns": [ + "/node_modules/", + "/modules/*.*/" + ], + "moduleNameMapper": { + "^@ngrx/(?!db)(.*)": "/modules/$1" + }, + "transformIgnorePatterns": [ + "node_modules/(?!@ngrx)" + ], + "modulePathIgnorePatterns": [ + "dist" + ] } } diff --git a/setup-jest.ts b/setup-jest.ts new file mode 100644 index 0000000000..05a89c72cc --- /dev/null +++ b/setup-jest.ts @@ -0,0 +1,6 @@ +import 'jest-preset-angular'; +import { MdCommonModule } from '@angular/material'; + +global['CSS'] = null; +MdCommonModule.prototype['_checkDoctype'] = function() {}; +MdCommonModule.prototype['_checkTheme'] = function() {}; diff --git a/yarn.lock b/yarn.lock index 64eefd0870..cce51a858d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -186,9 +186,19 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/jasmine@2.5.38": - version "2.5.38" - resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.5.38.tgz#a4379124c4921d4e21de54ec74669c9e9b356717" +"@types/jasmine@*", "@types/jasmine@2.5.45": + version "2.5.45" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.5.45.tgz#58928a621d014ce6ab59c5a9c41071f7328b0ca9" + +"@types/jasminewd2@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/jasminewd2/-/jasminewd2-2.0.3.tgz#0d2886b0cbdae4c0eeba55e30792f584bf040a95" + dependencies: + "@types/jasmine" "*" + +"@types/jest@^20.0.2": + version "20.0.8" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-20.0.8.tgz#7f8c97f73d20d3bf5448fbe33661a342002b5954" "@types/minimatch@*": version "2.0.29" @@ -227,6 +237,10 @@ JSONStream@^1.0.4: jsonparse "^1.2.0" through ">=2.2.7 <3" +abab@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d" + abbrev@1: version "1.1.0" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" @@ -244,7 +258,13 @@ acorn-dynamic-import@^2.0.0: dependencies: acorn "^4.0.3" -acorn@^4.0.3: +acorn-globals@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" + dependencies: + acorn "^4.0.4" + +acorn@^4.0.3, acorn@^4.0.4: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" @@ -321,6 +341,10 @@ ansi-escapes@^1.0.0, ansi-escapes@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" +ansi-escapes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" + ansi-html@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" @@ -329,6 +353,10 @@ ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -339,6 +367,12 @@ ansi-styles@^3.1.0: dependencies: color-convert "^1.0.0" +ansi-styles@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" + dependencies: + color-convert "^1.9.0" + anymatch@^1.1.0, anymatch@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" @@ -387,6 +421,10 @@ arr-flatten@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + array-filter@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" @@ -467,6 +505,10 @@ assert@^1.1.1: dependencies: util "0.10.3" +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" @@ -516,7 +558,7 @@ aws4@^1.2.1: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" -babel-code-frame@^6.11.0, babel-code-frame@^6.20.0, babel-code-frame@^6.22.0: +babel-code-frame@^6.11.0, babel-code-frame@^6.20.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" dependencies: @@ -524,6 +566,38 @@ babel-code-frame@^6.11.0, babel-code-frame@^6.20.0, babel-code-frame@^6.22.0: esutils "^2.0.2" js-tokens "^3.0.0" +babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^6.0.0, babel-core@^6.24.1, babel-core@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.0" + debug "^2.6.8" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.7" + slash "^1.0.0" + source-map "^0.5.6" + babel-generator@^6.18.0: version "6.24.0" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.0.tgz#eba270a8cc4ce6e09a61be43465d7c62c1f87c56" @@ -537,12 +611,67 @@ babel-generator@^6.18.0: source-map "^0.5.0" trim-right "^1.0.1" +babel-generator@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.6" + trim-right "^1.0.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-jest@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-21.0.2.tgz#817ea52c23f1c6c4b684d6960968416b6a9e9c6c" + dependencies: + babel-plugin-istanbul "^4.0.0" + babel-preset-jest "^21.0.2" + babel-messages@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" dependencies: babel-runtime "^6.22.0" +babel-plugin-istanbul@^4.0.0, babel-plugin-istanbul@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.4.tgz#18dde84bf3ce329fddf3f4103fae921456d8e587" + dependencies: + find-up "^2.1.0" + istanbul-lib-instrument "^1.7.2" + test-exclude "^4.1.1" + +babel-plugin-jest-hoist@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-21.0.2.tgz#cfdce5bca40d772a056cb8528ad159c7bb4bb03d" + +babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + babel-polyfill@6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" @@ -551,6 +680,24 @@ babel-polyfill@6.23.0: core-js "^2.4.0" regenerator-runtime "^0.10.0" +babel-preset-jest@^21.0.0, babel-preset-jest@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-21.0.2.tgz#9db25def2329f49eace3f5ea0de42a0b898d12cc" + dependencies: + babel-plugin-jest-hoist "^21.0.2" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + babel-runtime@^6.18.0, babel-runtime@^6.22.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" @@ -558,6 +705,13 @@ babel-runtime@^6.18.0, babel-runtime@^6.22.0: core-js "^2.4.0" regenerator-runtime "^0.10.0" +babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + babel-template@^6.16.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.23.0.tgz#04d4f270adbb3aa704a8143ae26faa529238e638" @@ -568,7 +722,17 @@ babel-template@^6.16.0: babylon "^6.11.0" lodash "^4.2.0" -babel-traverse@^6.18.0, babel-traverse@^6.23.0: +babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.18.0: version "6.23.1" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.23.1.tgz#d3cb59010ecd06a97d81310065f966b699e14f48" dependencies: @@ -582,7 +746,21 @@ babel-traverse@^6.18.0, babel-traverse@^6.23.0: invariant "^2.2.0" lodash "^4.2.0" -babel-types@^6.18.0, babel-types@^6.23.0: +babel-traverse@^6.23.0, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.18.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.23.0.tgz#bb17179d7538bad38cd0c9e115d340f77e7e9acf" dependencies: @@ -591,9 +769,18 @@ babel-types@^6.18.0, babel-types@^6.23.0: lodash "^4.2.0" to-fast-properties "^1.0.1" -babylon@^6.11.0, babylon@^6.15.0, babylon@^6.17.4: - version "6.17.4" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.4.tgz#3e8b7402b88d22c3423e137a1577883b15ff869a" +babel-types@^6.23.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.11.0, babylon@^6.15.0, babylon@^6.17.4, babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" babylon@^6.13.0: version "6.16.1" @@ -737,6 +924,12 @@ brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" +browser-resolve@^1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + dependencies: + resolve "1.1.7" + browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.6.tgz#5e7725dbdef1fd5930d4ebab48567ce451c48a0a" @@ -795,6 +988,12 @@ browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: caniuse-db "^1.0.30000639" electron-to-chromium "^1.2.7" +bser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + dependencies: + node-int64 "^0.4.0" + buffer-crc32@^0.2.5: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" @@ -847,6 +1046,10 @@ callsite@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + camel-case@3.0.x: version "3.0.0" resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" @@ -1076,7 +1279,7 @@ codelyzer@^2.1.1: source-map "^0.5.6" sprintf-js "^1.0.3" -color-convert@^1.0.0, color-convert@^1.3.0: +color-convert@^1.0.0, color-convert@^1.3.0, color-convert@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" dependencies: @@ -1246,6 +1449,10 @@ content-disposition@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" +content-type-parser@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.1.tgz#c3e56988c53c65127fb46d4032a3a900246fdc94" + content-type@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" @@ -1396,10 +1603,14 @@ conventional-recommended-bump@^1.0.0: meow "^3.3.0" object-assign "^4.0.1" -convert-source-map@^1.3.0: +convert-source-map@^1.3.0, convert-source-map@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.4.0.tgz#e3dad195bf61bfe13a7a3c73e9876ec14a0268f3" +convert-source-map@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -1412,6 +1623,10 @@ core-js@^2.2.0, core-js@^2.4.0, core-js@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" +core-js@^2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" + core-object@^3.1.0: version "3.1.3" resolved "https://registry.yarnpkg.com/core-object/-/core-object-3.1.3.tgz#df399b3311bdb0c909e8aae8929fc3c1c4b25880" @@ -1669,6 +1884,16 @@ csso@~2.3.1: clap "^1.0.9" source-map "^0.5.3" +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + +"cssstyle@>= 0.2.37 < 0.3.0": + version "0.2.37" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + dependencies: + cssom "0.3.x" + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -1760,6 +1985,10 @@ deep-freeze@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/deep-freeze/-/deep-freeze-0.0.1.tgz#3a0b0005de18672819dfd38cd31f91179c893e84" +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + default-require-extensions@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" @@ -1833,7 +2062,7 @@ di@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" -diff@^3.0.1, diff@^3.1.0: +diff@^3.0.1, diff@^3.1.0, diff@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" @@ -2040,7 +2269,7 @@ entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" -errno@^0.1.1, errno@^0.1.3: +errno@^0.1.1, errno@^0.1.3, errno@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" dependencies: @@ -2064,14 +2293,33 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" +escodegen@^1.6.1: + version "1.9.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852" + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.5.6" + esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + esprima@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" +estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -2100,6 +2348,12 @@ evp_bytestokey@^1.0.0: dependencies: create-hash "^1.1.1" +exec-sh@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" + dependencies: + merge "^1.1.3" + execa@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/execa/-/execa-0.5.1.tgz#de3fb85cb8d6e91c85bcbceb164581785cb57b36" @@ -2183,6 +2437,17 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" +expect@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/expect/-/expect-21.0.2.tgz#b34abf0635ec9d6aea1ce7edb4722afe86c4a38f" + dependencies: + ansi-styles "^3.2.0" + jest-diff "^21.0.2" + jest-get-type "^21.0.2" + jest-matcher-utils "^21.0.2" + jest-message-util "^21.0.2" + jest-regex-util "^21.0.2" + exports-loader@^0.6.3: version "0.6.4" resolved "https://registry.yarnpkg.com/exports-loader/-/exports-loader-0.6.4.tgz#d70fc6121975b35fc12830cf52754be2740fc886" @@ -2256,6 +2521,10 @@ fast-deep-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + fastparse@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" @@ -2272,6 +2541,12 @@ faye-websocket@~0.11.0: dependencies: websocket-driver ">=0.5.1" +fb-watchman@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + dependencies: + bser "^2.0.0" + figures@^1.7.0: version "1.7.0" resolved "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" @@ -2432,11 +2707,19 @@ fs-extra@^3.0.1: jsonfile "^3.0.0" universalify "^0.1.0" +fs-extra@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.1.tgz#7fc0c6c8957f983f57f306a24e5b9ddd8d0dd880" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^3.0.0" + universalify "^0.1.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" -fsevents@^1.0.0: +fsevents@^1.0.0, fsevents@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" dependencies: @@ -2625,6 +2908,10 @@ globals@^9.0.0: version "9.17.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + globby@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-4.1.0.tgz#080f54549ec1b82a6c60e631fc82e1211dbe95f8" @@ -2689,6 +2976,10 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6: version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + hammerjs@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/hammerjs/-/hammerjs-2.0.8.tgz#04ef77862cff2bb79d30f7692095930222bf60f1" @@ -2820,6 +3111,13 @@ hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + hosted-git-info@^2.1.4: version "2.2.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.2.0.tgz#7a0d097863d886c0fabbdcd37bf1758d8becf8a5" @@ -2837,6 +3135,12 @@ html-comment-regex@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" +html-encoding-sniffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz#79bf7a785ea495fe66165e734153f363ff5437da" + dependencies: + whatwg-encoding "^1.0.1" + html-entities@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" @@ -2931,6 +3235,10 @@ husky@^0.14.3: normalize-path "^1.0.0" strip-indent "^2.0.0" +iconv-lite@0.4.13: + version "0.4.13" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" + iconv-lite@0.4.15, iconv-lite@~0.4.13: version "0.4.15" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" @@ -3034,7 +3342,7 @@ interpret@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90" -invariant@^2.2.0: +invariant@^2.2.0, invariant@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" dependencies: @@ -3257,10 +3565,6 @@ isexe@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" @@ -3332,7 +3636,7 @@ istanbul-lib-instrument@^1.1.3, istanbul-lib-instrument@^1.4.2: istanbul-lib-coverage "^1.0.0" semver "^5.3.0" -istanbul-lib-instrument@^1.7.3: +istanbul-lib-instrument@^1.7.2, istanbul-lib-instrument@^1.7.3: version "1.7.3" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.3.tgz#925b239163eabdd68cc4048f52c2fa4f899ecfa7" dependencies: @@ -3427,6 +3731,242 @@ jasminewd2@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/jasminewd2/-/jasminewd2-2.1.0.tgz#da595275d1ae631de736ac0a7c7d85c9f73ef652" +jest-changed-files@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-21.0.2.tgz#0a74f35cf2d3b7c8ef9ab4fac0a75409f81ec1b0" + dependencies: + throat "^4.0.0" + +jest-cli@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-21.0.2.tgz#2e08af63d44fc21284ebf496cf71e381f3cc9786" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + is-ci "^1.0.10" + istanbul-api "^1.1.1" + istanbul-lib-coverage "^1.0.1" + istanbul-lib-instrument "^1.4.2" + istanbul-lib-source-maps "^1.1.0" + jest-changed-files "^21.0.2" + jest-config "^21.0.2" + jest-environment-jsdom "^21.0.2" + jest-haste-map "^21.0.2" + jest-message-util "^21.0.2" + jest-regex-util "^21.0.2" + jest-resolve-dependencies "^21.0.2" + jest-runner "^21.0.2" + jest-runtime "^21.0.2" + jest-snapshot "^21.0.2" + jest-util "^21.0.2" + micromatch "^2.3.11" + node-notifier "^5.0.2" + pify "^3.0.0" + slash "^1.0.0" + string-length "^2.0.0" + strip-ansi "^4.0.0" + which "^1.2.12" + worker-farm "^1.3.1" + yargs "^9.0.0" + +jest-config@^21.0.0, jest-config@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-21.0.2.tgz#ea42b94f3c22ae4e4aa11c69f5b45e34e342199d" + dependencies: + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^21.0.2" + jest-environment-node "^21.0.2" + jest-get-type "^21.0.2" + jest-jasmine2 "^21.0.2" + jest-regex-util "^21.0.2" + jest-resolve "^21.0.2" + jest-util "^21.0.2" + jest-validate "^21.0.2" + pretty-format "^21.0.2" + +jest-diff@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-21.0.2.tgz#751014f36ad5d505f6affce5542fde0e444ee50a" + dependencies: + chalk "^2.0.1" + diff "^3.2.0" + jest-get-type "^21.0.2" + pretty-format "^21.0.2" + +jest-docblock@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.0.2.tgz#66f69ddb440799fc32f91d0ac3d8d35e99e2032f" + +jest-environment-jsdom@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-21.0.2.tgz#6f6ab5bd71970d1900fbd47a46701c0a07fa3be5" + dependencies: + jest-mock "^21.0.2" + jest-util "^21.0.2" + jsdom "^9.12.0" + +jest-environment-node@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-21.0.2.tgz#4267ceb39551f8ecaed182ab882a93ef4d5de240" + dependencies: + jest-mock "^21.0.2" + jest-util "^21.0.2" + +jest-get-type@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-21.0.2.tgz#304e6b816dd33cd1f47aba0597bcad258a509fc6" + +jest-haste-map@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-21.0.2.tgz#bd98bc6cd6f207eb029b2f5918da1a9347eb11b7" + dependencies: + fb-watchman "^2.0.0" + graceful-fs "^4.1.11" + jest-docblock "^21.0.2" + micromatch "^2.3.11" + sane "^2.0.0" + worker-farm "^1.3.1" + +jest-jasmine2@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-21.0.2.tgz#a368abb3a686def4d6e763509a265104943cd469" + dependencies: + chalk "^2.0.1" + expect "^21.0.2" + graceful-fs "^4.1.11" + jest-diff "^21.0.2" + jest-matcher-utils "^21.0.2" + jest-message-util "^21.0.2" + jest-snapshot "^21.0.2" + p-cancelable "^0.3.0" + +jest-matcher-utils@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-21.0.2.tgz#eb6736a45b698546d71f7e1ffbbd36587eeb27bc" + dependencies: + chalk "^2.0.1" + jest-get-type "^21.0.2" + pretty-format "^21.0.2" + +jest-message-util@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-21.0.2.tgz#81242e07d426ad54c15f3d7c55b072e9db7b39a9" + dependencies: + chalk "^2.0.1" + micromatch "^2.3.11" + slash "^1.0.0" + +jest-mock@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-21.0.2.tgz#5e92902450e1ce78be3864cc4d50dbd5d1582fbd" + +jest-preset-angular@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jest-preset-angular/-/jest-preset-angular-3.0.1.tgz#b59234234ced305d777c4b5bd98433a93f38cee8" + dependencies: + jest-zone-patch "^0.0.7" + ts-jest "^21.0.0" + +jest-regex-util@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-21.0.2.tgz#06248c07b53ff444223ebe8e33a25bc051ac976f" + +jest-resolve-dependencies@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-21.0.2.tgz#c42cc371034023ac1a226a7a52f86233c8871938" + dependencies: + jest-regex-util "^21.0.2" + +jest-resolve@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-21.0.2.tgz#57b2c20cbeca2357eb5e638d5c28beca7f38c3f8" + dependencies: + browser-resolve "^1.11.2" + chalk "^2.0.1" + is-builtin-module "^1.0.0" + +jest-runner@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-21.0.2.tgz#1462d431d25f7744e8b5e03837bbf9e268dc8b15" + dependencies: + jest-config "^21.0.2" + jest-docblock "^21.0.2" + jest-haste-map "^21.0.2" + jest-jasmine2 "^21.0.2" + jest-message-util "^21.0.2" + jest-runtime "^21.0.2" + jest-util "^21.0.2" + pify "^3.0.0" + throat "^4.0.0" + worker-farm "^1.3.1" + +jest-runtime@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-21.0.2.tgz#ce26ba06bcd5501991bd994b1eacc0c7c7913895" + dependencies: + babel-core "^6.0.0" + babel-jest "^21.0.2" + babel-plugin-istanbul "^4.0.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + graceful-fs "^4.1.11" + jest-config "^21.0.2" + jest-haste-map "^21.0.2" + jest-regex-util "^21.0.2" + jest-resolve "^21.0.2" + jest-util "^21.0.2" + json-stable-stringify "^1.0.1" + micromatch "^2.3.11" + slash "^1.0.0" + strip-bom "3.0.0" + write-file-atomic "^2.1.0" + yargs "^9.0.0" + +jest-snapshot@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-21.0.2.tgz#5b8f4dd05c1759381db835451fba4bcd85a55611" + dependencies: + chalk "^2.0.1" + jest-diff "^21.0.2" + jest-matcher-utils "^21.0.2" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^21.0.2" + +jest-util@^21.0.0, jest-util@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-21.0.2.tgz#3ee2380af25c414a39f07b23c84da6f2d5f1f76a" + dependencies: + callsites "^2.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.11" + jest-message-util "^21.0.2" + jest-mock "^21.0.2" + jest-validate "^21.0.2" + mkdirp "^0.5.1" + +jest-validate@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-21.0.2.tgz#dd066b257bd102759c214747d73bed6bcfa4349d" + dependencies: + chalk "^2.0.1" + jest-get-type "^21.0.2" + leven "^2.1.0" + pretty-format "^21.0.2" + +jest-zone-patch@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/jest-zone-patch/-/jest-zone-patch-0.0.7.tgz#d963cd3eb005d500db1b41242a7a63a371a500f3" + +jest@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/jest/-/jest-21.0.2.tgz#a5c9bdc9d4322ae672fe8cb3eaf25c268c5f04b2" + dependencies: + jest-cli "^21.0.2" + jodid25519@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" @@ -3441,6 +3981,10 @@ js-tokens@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + js-yaml@3.6.1: version "3.6.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" @@ -3466,6 +4010,30 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" +jsdom@^9.12.0: + version "9.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" + dependencies: + abab "^1.0.3" + acorn "^4.0.4" + acorn-globals "^3.1.0" + array-equal "^1.0.0" + content-type-parser "^1.0.1" + cssom ">= 0.3.2 < 0.4.0" + cssstyle ">= 0.2.37 < 0.3.0" + escodegen "^1.6.1" + html-encoding-sniffer "^1.0.1" + nwmatcher ">= 1.3.9 < 2.0.0" + parse5 "^1.5.1" + request "^2.79.0" + sax "^1.2.1" + symbol-tree "^3.2.1" + tough-cookie "^2.3.2" + webidl-conversions "^4.0.0" + whatwg-encoding "^1.0.1" + whatwg-url "^4.3.0" + xml-name-validator "^2.0.1" + jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" @@ -3701,6 +4269,17 @@ less@^2.7.2: request "^2.72.0" source-map "^0.5.3" +leven@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + license-webpack-plugin@^0.4.2: version "0.4.3" resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-0.4.3.tgz#f9d88d4ebc04407a0061e8ccac26571f88e51a16" @@ -3956,6 +4535,12 @@ make-error@^1.1.1: version "1.2.3" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.2.3.tgz#6c4402df732e0977ac6faf754a5074b3d2b1d19d" +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + dependencies: + tmpl "1.0.x" + map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" @@ -4022,6 +4607,10 @@ merge-source-map@^1.0.2: dependencies: source-map "^0.5.3" +merge@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -4091,7 +4680,7 @@ minimist@0.0.8, minimist@~0.0.1: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -minimist@1.2.0, minimist@^1.1.3, minimist@^1.2.0: +minimist@1.2.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -4144,6 +4733,10 @@ nan@^2.3.0, nan@^2.3.2: version "2.6.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + ncname@1.0.x: version "1.0.0" resolved "https://registry.yarnpkg.com/ncname/-/ncname-1.0.0.tgz#5b57ad18b1ca092864ef62b0b1ed8194f383b71c" @@ -4197,6 +4790,10 @@ node-gyp@^3.3.1: tar "^2.0.0" which "1" +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + node-libs-browser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646" @@ -4229,6 +4826,15 @@ node-modules-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/node-modules-path/-/node-modules-path-1.0.1.tgz#40096b08ce7ad0ea14680863af449c7c75a5d1c8" +node-notifier@^5.0.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.1.2.tgz#2fa9e12605fa10009d44549d6fcd8a63dde0e4ff" + dependencies: + growly "^1.3.0" + semver "^5.3.0" + shellwords "^0.1.0" + which "^1.2.12" + node-pre-gyp@^0.6.36: version "0.6.36" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" @@ -4356,6 +4962,10 @@ number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" +"nwmatcher@>= 1.3.9 < 2.0.0": + version "1.4.1" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.1.tgz#7ae9b07b0ea804db7e25f05cb5fe4097d4e4949f" + nyc@^10.1.2: version "10.1.2" resolved "https://registry.yarnpkg.com/nyc/-/nyc-10.1.2.tgz#ea7acaa20a235210101604f4e7d56d28453b0274" @@ -4472,6 +5082,17 @@ optimist@~0.3, optimist@~0.3.5: dependencies: wordwrap "~0.0.2" +optionator@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + options@>=0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" @@ -4522,7 +5143,7 @@ os-locale@^2.0.0: lcid "^1.0.0" mem "^1.1.0" -os-tmpdir@^1.0.0, os-tmpdir@~1.0.1: +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -4533,6 +5154,10 @@ osenv@0, osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +p-cancelable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -4599,6 +5224,10 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" +parse5@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" + parse5@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.2.tgz#05eff57f0ef4577fb144a79f8b9a967a6cc44510" @@ -4641,7 +5270,7 @@ path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" -path-is-absolute@^1.0.0: +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -4713,6 +5342,12 @@ pkg-dir@^1.0.0: dependencies: find-up "^1.0.0" +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + dependencies: + find-up "^2.1.0" + portfinder@^1.0.9, portfinder@~1.0.12: version "1.0.13" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" @@ -5011,6 +5646,10 @@ postcss@^6.0.1: source-map "^0.5.6" supports-color "^4.1.0" +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + prepend-http@^1.0.0, prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" @@ -5030,6 +5669,17 @@ pretty-error@^2.0.2: renderkid "^2.0.1" utila "~0.4" +pretty-format@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-21.0.2.tgz#76adcebd836c41ccd2e6b626e70f63050d2a3534" + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" + +private@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" + process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" @@ -5285,6 +5935,10 @@ regenerator-runtime@^0.10.0: version "0.10.3" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz#8c4367a904b51ea62a908ac310bf99ff90a82a3e" +regenerator-runtime@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" + regex-cache@^0.4.2: version "0.4.3" resolved "http://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" @@ -5427,6 +6081,10 @@ resolve-from@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + resolve@^1.1.6, resolve@^1.1.7: version "1.3.3" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" @@ -5494,13 +6152,7 @@ rx@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" -rxjs@^5.0.0-beta.11: - version "5.4.3" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-5.4.3.tgz#0758cddee6033d68e0fd53676f0f3596ce3d483f" - dependencies: - symbol-observable "^1.0.1" - -rxjs@^5.0.1, rxjs@^5.4.0: +rxjs@^5.0.0-beta.11, rxjs@^5.0.1, rxjs@^5.4.0: version "5.4.2" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.4.2.tgz#2a3236fcbf03df57bae06fd6972fd99e5c08fcf7" dependencies: @@ -5519,6 +6171,20 @@ sander@^0.5.0: mkdirp "^0.5.1" rimraf "^2.5.2" +sane@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-2.0.0.tgz#99cb79f21f4a53a69d4d0cd957c2db04024b8eb2" + dependencies: + anymatch "^1.3.0" + exec-sh "^0.2.0" + fb-watchman "^2.0.0" + minimatch "^3.0.2" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.10.0" + optionalDependencies: + fsevents "^1.1.1" + sass-graph@^2.1.1: version "2.2.4" resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" @@ -5552,7 +6218,7 @@ sax@0.6.x: version "0.6.1" resolved "https://registry.yarnpkg.com/sax/-/sax-0.6.1.tgz#563b19c7c1de892e09bfc4f2fc30e3c27f0952b9" -sax@>=0.6.0, sax@~1.2.1: +sax@>=0.6.0, sax@^1.2.1, sax@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -5711,6 +6377,10 @@ shell-quote@^1.4.3: array-reduce "~0.0.0" jsonify "~0.0.0" +shellwords@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + signal-exit@^2.0.0: version "2.1.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-2.1.2.tgz#375879b1f92ebc3b334480d038dc546a6d558564" @@ -5725,6 +6395,10 @@ silent-error@^1.0.0: dependencies: debug "^2.2.0" +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + slice-ansi@0.0.4: version "0.0.4" resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" @@ -5842,19 +6516,25 @@ source-map-loader@^0.2.0: loader-utils "~0.2.2" source-map "~0.1.33" -source-map-support@^0.4.0, source-map-support@^0.4.2, source-map-support@~0.4.0: +source-map-support@^0.4.0, source-map-support@^0.4.2, source-map-support@^0.4.4, source-map-support@~0.4.0: version "0.4.14" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.14.tgz#9d4463772598b86271b4f523f6c1f4e02a7d6aef" dependencies: source-map "^0.5.6" +source-map-support@^0.4.15: + version "0.4.17" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.17.tgz#6f2150553e6375375d0ccb3180502b78c18ba430" + dependencies: + source-map "^0.5.6" + source-map@0.1.x, source-map@~0.1.33, source-map@~0.1.7: version "0.1.43" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" dependencies: amdefine ">=0.0.4" -source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3: +source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3, source-map@~0.5.6: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" @@ -5988,6 +6668,13 @@ strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -6023,16 +6710,22 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-bom@3.0.0, strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" dependencies: is-utf8 "^0.2.0" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -6118,6 +6811,10 @@ symbol-observable@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" +symbol-tree@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + tapable@^0.2.5, tapable@~0.2.5: version "0.2.6" resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.6.tgz#206be8e188860b514425375e6f1ae89bfb01fd8d" @@ -6188,10 +6885,24 @@ test-exclude@^3.3.0: read-pkg-up "^1.0.1" require-main-filename "^1.0.1" +test-exclude@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.1.tgz#4d84964b0966b0087ecc334a2ce002d3d9341e26" + dependencies: + arrify "^1.0.1" + micromatch "^2.3.11" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + text-extensions@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.4.0.tgz#c385d2e80879fe6ef97893e1709d88d9453726e9" +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + through2@^2.0.0, through2@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" @@ -6235,6 +6946,10 @@ tmp@^0.0.31: dependencies: os-tmpdir "~1.0.1" +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + to-array@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" @@ -6247,16 +6962,24 @@ to-fast-properties@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + toposort@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.3.tgz#f02cd8a74bd8be2fc0e98611c3bacb95a171869c" -tough-cookie@~2.3.0: +tough-cookie@^2.3.2, tough-cookie@~2.3.0: version "2.3.2" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" dependencies: punycode "^1.4.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" @@ -6269,6 +6992,21 @@ trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" +ts-jest@^21.0.0: + version "21.0.0" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-21.0.0.tgz#261c0b90270bfaa57c8d9ef2a0b5f3a41efc38e9" + dependencies: + babel-core "^6.24.1" + babel-plugin-istanbul "^4.1.4" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-preset-jest "^21.0.0" + fs-extra "^4.0.0" + jest-config "^21.0.0" + jest-util "^21.0.0" + pkg-dir "^2.0.0" + source-map-support "^0.4.4" + yargs "^8.0.1" + ts-node@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-3.2.0.tgz#9814f0c0141784900cf12fef1197ad4b7f4d23d1" @@ -6344,6 +7082,12 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + type-is@~1.6.15: version "1.6.15" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" @@ -6571,6 +7315,16 @@ walk-sync@^0.3.1: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + dependencies: + makeerror "1.0.x" + +watch@~0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" + watchpack@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.3.1.tgz#7d8693907b28ce6013e7f3610aa2a1acf07dad87" @@ -6614,6 +7368,14 @@ webdriver-manager@^12.0.6: semver "^5.3.0" xml2js "^0.4.17" +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + +webidl-conversions@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + webpack-dev-middleware@^1.10.2: version "1.11.0" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.11.0.tgz#09691d0973a30ad1f82ac73a12e2087f0a4754f9" @@ -6701,6 +7463,19 @@ websocket-extensions@>=0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" +whatwg-encoding@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz#3c6c451a198ee7aec55b1ec61d0920c67801a5f4" + dependencies: + iconv-lite "0.4.13" + +whatwg-url@^4.3.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + when@~3.6.x: version "3.6.4" resolved "https://registry.yarnpkg.com/when/-/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e" @@ -6717,18 +7492,12 @@ which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" -which@1, which@^1.2.1, which@^1.2.4, which@^1.2.9: +which@1, which@^1.2.1, which@^1.2.10, which@^1.2.12, which@^1.2.4, which@^1.2.9: version "1.2.12" resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" dependencies: isexe "^1.1.1" -which@^1.2.10: - version "1.3.0" - resolved "https://registry.npmjs.org/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" - dependencies: - isexe "^2.0.0" - wide-align@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" @@ -6753,6 +7522,17 @@ wordwrap@0.0.2, wordwrap@~0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +worker-farm@^1.3.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.5.0.tgz#adfdf0cd40581465ed0a1f648f9735722afd5c8d" + dependencies: + errno "^0.1.4" + xtend "^4.0.1" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -6821,6 +7601,10 @@ xml-char-classes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/xml-char-classes/-/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d" +xml-name-validator@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + xml2js@0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.4.tgz#3111010003008ae19240eba17497b57c729c555d" @@ -6849,7 +7633,7 @@ xmlhttprequest-ssl@1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" -xtend@^4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" @@ -6945,6 +7729,24 @@ yargs@^8.0.1: y18n "^3.2.1" yargs-parser "^7.0.0" +yargs@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.0.tgz#efe5b1ad3f94bdc20423411b90628eeec0b25f3c" + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + read-pkg-up "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^7.0.0" + yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"