From dbb3cff181f92f6610485f1c2f186c0582dec436 Mon Sep 17 00:00:00 2001 From: Brian Frichette Date: Sat, 15 Jul 2017 23:14:11 -0700 Subject: [PATCH] feat(store): Add initialState fn to features - (BREAKING) OpaqueToken -> InjectionToken - Stronger types for core actions (INIT, UPDATE) - Add more tests --- modules/store/spec/integration.spec.ts | 2 +- modules/store/spec/modules.spec.ts | 180 ++++++++++++---- modules/store/spec/state.spec.ts | 4 +- modules/store/spec/store.spec.ts | 69 ++++-- modules/store/spec/utils.spec.ts | 25 +-- modules/store/src/actions_subject.ts | 6 +- modules/store/src/reducer_manager.ts | 2 +- modules/store/src/state.ts | 4 +- modules/store/src/store_module.ts | 8 +- modules/store/src/tokens.ts | 20 +- modules/store/src/utils.ts | 12 +- yarn.lock | 286 +++++++++++++++++++------ 12 files changed, 443 insertions(+), 175 deletions(-) diff --git a/modules/store/spec/integration.spec.ts b/modules/store/spec/integration.spec.ts index c1ff475465..16694a80dd 100644 --- a/modules/store/spec/integration.spec.ts +++ b/modules/store/spec/integration.spec.ts @@ -139,7 +139,7 @@ describe('ngRx Integration spec', () => { return todos.filter(predicate); }; - let currentlyVisibleTodos: any; + let currentlyVisibleTodos: Todo[] = []; Observable.combineLatest( store.select('visibilityFilter'), diff --git a/modules/store/spec/modules.spec.ts b/modules/store/spec/modules.spec.ts index 4a01a25404..798b63ee92 100644 --- a/modules/store/spec/modules.spec.ts +++ b/modules/store/spec/modules.spec.ts @@ -1,9 +1,16 @@ import 'rxjs/add/operator/take'; import { TestBed } from '@angular/core/testing'; import { NgModule, InjectionToken } from '@angular/core'; -import { StoreModule, Store, ActionReducer, ActionReducerMap } from '../'; +import { + StoreModule, + Store, + ActionReducer, + ActionReducerMap, + combineReducers, +} from '../'; +import createSpy = jasmine.createSpy; -describe('Nested Store Modules', () => { +describe(`Store Modules`, () => { type RootState = { fruit: string }; type FeatureAState = number; type FeatureBState = { list: number[]; index: number }; @@ -14,57 +21,144 @@ describe('Nested Store Modules', () => { const reducersToken = new InjectionToken>( 'Root Reducers' ); - const rootFruitReducer: ActionReducer = () => 'apple'; - const featureAReducer: ActionReducer = () => 5; - const featureBListReducer: ActionReducer = () => [1, 2, 3]; - const featureBIndexReducer: ActionReducer = () => 2; + + // Trigger here is basically an action type used to trigger state update + const createDummyReducer = (def: T, trigger: string): ActionReducer => ( + s = def, + { type, payload }: any + ) => (type === trigger ? payload : s); + const rootFruitReducer = createDummyReducer('apple', 'fruit'); + const featureAReducer = createDummyReducer(5, 'a'); + const featureBListReducer = createDummyReducer([1, 2, 3], 'bList'); + const featureBIndexReducer = createDummyReducer(2, 'bIndex'); const featureBReducerMap: ActionReducerMap = { list: featureBListReducer, index: featureBIndexReducer, }; - @NgModule({ - imports: [StoreModule.forFeature('a', featureAReducer)], - }) - class FeatureAModule {} - - @NgModule({ - imports: [StoreModule.forFeature('b', featureBReducerMap)], - }) - class FeatureBModule {} - - @NgModule({ - imports: [ - StoreModule.forRoot(reducersToken), - FeatureAModule, - FeatureBModule, - ], - providers: [ - { - provide: reducersToken, - useValue: { fruit: rootFruitReducer }, - }, - ], - }) - class RootModule {} - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [RootModule], + describe(`: Config`, () => { + let featureAReducerFactory: any; + let rootReducerFactory: any; + + const featureAInitial = () => ({ a: 42 }); + const rootInitial = { fruit: 'orange' }; + + beforeEach(() => { + featureAReducerFactory = createSpy( + 'featureAReducerFactory' + ).and.callFake((rm: any, initialState?: any) => { + return (state: any, action: any) => 4; + }); + rootReducerFactory = createSpy('rootReducerFactory').and.callFake( + combineReducers + ); + + @NgModule({ + imports: [ + StoreModule.forFeature( + 'a', + { a: featureAReducer }, + { + initialState: featureAInitial, + reducerFactory: featureAReducerFactory, + } + ), + ], + }) + class FeatureAModule {} + + @NgModule({ + imports: [ + StoreModule.forRoot(reducersToken, { + initialState: rootInitial, + reducerFactory: rootReducerFactory, + }), + FeatureAModule, + ], + providers: [ + { + provide: reducersToken, + useValue: { fruit: rootFruitReducer }, + }, + ], + }) + class RootModule {} + + TestBed.configureTestingModule({ + imports: [RootModule], + }); + + store = TestBed.get(Store); + }); + + it(`should accept configurations`, () => { + expect(featureAReducerFactory).toHaveBeenCalledWith( + { a: featureAReducer }, + featureAInitial() + ); + expect(rootReducerFactory).toHaveBeenCalledWith( + { fruit: rootFruitReducer }, + rootInitial + ); }); - store = TestBed.get(Store); + it(`should should use config.reducerFactory`, () => { + store.dispatch({ type: 'fruit', payload: 'banana' }); + store.dispatch({ type: 'a', payload: 42 }); + + store.take(1).subscribe((s: any) => { + expect(s).toEqual({ + fruit: 'banana', + a: 4, + }); + }); + }); }); - it('should nest the child module in the root store object', () => { - store.take(1).subscribe((state: State) => { - expect(state).toEqual({ - fruit: 'apple', - a: 5, - b: { - list: [1, 2, 3], - index: 2, + describe(`: Nested`, () => { + @NgModule({ + imports: [StoreModule.forFeature('a', featureAReducer)], + }) + class FeatureAModule {} + + @NgModule({ + imports: [StoreModule.forFeature('b', featureBReducerMap)], + }) + class FeatureBModule {} + + @NgModule({ + imports: [ + StoreModule.forRoot(reducersToken), + FeatureAModule, + FeatureBModule, + ], + providers: [ + { + provide: reducersToken, + useValue: { fruit: rootFruitReducer }, }, + ], + }) + class RootModule {} + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [RootModule], + }); + + store = TestBed.get(Store); + }); + + it('should nest the child module in the root store object', () => { + store.take(1).subscribe((state: State) => { + expect(state).toEqual({ + fruit: 'apple', + a: 5, + b: { + list: [1, 2, 3], + index: 2, + }, + }); }); }); }); diff --git a/modules/store/spec/state.spec.ts b/modules/store/spec/state.spec.ts index 3daaee21f7..34a5821fe1 100644 --- a/modules/store/spec/state.spec.ts +++ b/modules/store/spec/state.spec.ts @@ -2,7 +2,7 @@ import { Observable } from 'rxjs/Observable'; import { Subject } from 'rxjs/Subject'; import { ReflectiveInjector } from '@angular/core'; import { createInjector } from './helpers/injector'; -import { StoreModule, Store } from '../'; +import { StoreModule, Store, INIT } from '../'; describe('ngRx State', () => { const initialState = 123; @@ -22,7 +22,7 @@ describe('ngRx State', () => { injector.get(Store); expect(reducer).toHaveBeenCalledWith(initialState, { - type: '@ngrx/store/init', + type: INIT, }); }); }); diff --git a/modules/store/spec/store.spec.ts b/modules/store/spec/store.spec.ts index d737b432c6..3fe0f11dae 100644 --- a/modules/store/spec/store.spec.ts +++ b/modules/store/spec/store.spec.ts @@ -1,28 +1,22 @@ import 'rxjs/add/operator/take'; -import { Observable } from 'rxjs/Observable'; import { ReflectiveInjector } from '@angular/core'; import { hot } from 'jasmine-marbles'; import { createInjector } from './helpers/injector'; -import { Store, Action, combineReducers, StoreModule } from '../'; -import { ActionsSubject } from '../src/private_export'; +import { ActionsSubject, ReducerManager, Store, StoreModule } from '../'; import { counterReducer, INCREMENT, DECREMENT, RESET, } from './fixtures/counter'; +import Spy = jasmine.Spy; +import any = jasmine.any; interface TestAppSchema { counter1: number; counter2: number; counter3: number; -} - -interface Todo {} - -interface TodoAppSchema { - visibilityFilter: string; - todos: Todo[]; + counter4?: number; } describe('ngRx Store', () => { @@ -68,7 +62,7 @@ describe('ngRx Store', () => { }); }); - describe('basic store actions', function() { + describe('basic store actions', () => { beforeEach(() => setup()); it('should provide an Observable Store', () => { @@ -84,7 +78,7 @@ describe('ngRx Store', () => { e: { type: INCREMENT }, }; - it('should let you select state with a key name', function() { + it('should let you select state with a key name', () => { const counterSteps = hot(actionSequence, actionValues); counterSteps.subscribe(action => store.dispatch(action)); @@ -99,7 +93,7 @@ describe('ngRx Store', () => { ); }); - it('should let you select state with a selector function', function() { + it('should let you select state with a selector function', () => { const counterSteps = hot(actionSequence, actionValues); counterSteps.subscribe(action => store.dispatch(action)); @@ -114,13 +108,13 @@ describe('ngRx Store', () => { ); }); - it('should correctly lift itself', function() { + it('should correctly lift itself', () => { const result = store.select('counter1'); expect(result instanceof Store).toBe(true); }); - it('should increment and decrement counter1', function() { + it('should increment and decrement counter1', () => { const counterSteps = hot(actionSequence, actionValues); counterSteps.subscribe(action => store.dispatch(action)); @@ -133,7 +127,7 @@ describe('ngRx Store', () => { expect(counterState).toBeObservable(hot(stateSequence, counter1Values)); }); - it('should increment and decrement counter1 using the dispatcher', function() { + it('should increment and decrement counter1 using the dispatcher', () => { const counterSteps = hot(actionSequence, actionValues); counterSteps.subscribe(action => dispatcher.next(action)); @@ -146,7 +140,7 @@ describe('ngRx Store', () => { expect(counterState).toBeObservable(hot(stateSequence, counter1Values)); }); - it('should increment and decrement counter2 separately', function() { + it('should increment and decrement counter2 separately', () => { const counterSteps = hot(actionSequence, actionValues); counterSteps.subscribe(action => store.dispatch(action)); @@ -160,7 +154,7 @@ describe('ngRx Store', () => { expect(counter2State).toBeObservable(hot(stateSequence, counter2Values)); }); - it('should implement the observer interface forwarding actions and errors to the dispatcher', function() { + it('should implement the observer interface forwarding actions and errors to the dispatcher', () => { spyOn(dispatcher, 'next'); spyOn(dispatcher, 'error'); @@ -171,7 +165,7 @@ describe('ngRx Store', () => { expect(dispatcher.error).toHaveBeenCalledWith(2); }); - it('should not be completable', function() { + it('should not be completable', () => { const storeSubscription = store.subscribe(); const dispatcherSubscription = dispatcher.subscribe(); @@ -192,4 +186,41 @@ describe('ngRx Store', () => { expect(dispatcherSubscription.closed).toBe(true); }); }); + + describe(`add/remove reducers`, () => { + let addReducerSpy: Spy; + let removeReducerSpy: Spy; + const key = 'counter4'; + + beforeEach(() => { + setup(); + const reducerManager = injector.get(ReducerManager); + addReducerSpy = spyOn(reducerManager, 'addReducer').and.callThrough(); + removeReducerSpy = spyOn( + reducerManager, + 'removeReducer' + ).and.callThrough(); + }); + + it(`should delegate add/remove to ReducerManager`, () => { + store.addReducer(key, counterReducer); + expect(addReducerSpy).toHaveBeenCalledWith(key, counterReducer); + + store.removeReducer(key); + expect(removeReducerSpy).toHaveBeenCalledWith(key); + }); + + it(`should work with added / removed reducers`, () => { + store.addReducer(key, counterReducer); + store.take(1).subscribe(val => { + expect(val.counter4).toBe(0); + }); + + store.removeReducer(key); + store.dispatch({ type: INCREMENT }); + store.take(1).subscribe(val => { + expect(val.counter4).toBeUndefined(); + }); + }); + }); }); diff --git a/modules/store/spec/utils.spec.ts b/modules/store/spec/utils.spec.ts index 4bc90d41bc..9b2cd7ea28 100644 --- a/modules/store/spec/utils.spec.ts +++ b/modules/store/spec/utils.spec.ts @@ -1,21 +1,16 @@ -/** - * @fileOverview - * @author Brian Frichette (brian@eturi.com) - */ - import { omit } from '../src/utils'; import { combineReducers, compose } from '@ngrx/store'; describe(`Store utils`, () => { describe(`combineReducers()`, () => { - const s1 = { x: '' }; - const s2 = { y: '' }; - const r1 = (s = s1, a: any): typeof s1 => - a.type === 's1' ? { ...s, x: a.payload } : s; - const r2 = (s = s2, a: any): typeof s2 => - a.type === 's2' ? { ...s, y: a.payload } : s; - const reducers = { r1, r2, extraneous: true }; - const initialState = { r1: { x: 'foo' }, r2: { y: 'bar' } }; + const state1 = { x: '' }; + const state2 = { y: '' }; + const reducer1 = (state = state1, action: any): typeof state1 => + action.type === 'state1' ? { ...state, x: action.payload } : state; + const reducer2 = (state = state2, action: any): typeof state2 => + action.type === 'state2' ? { ...state, y: action.payload } : state; + const reducers = { reducer1, reducer2, extraneous: true }; + const initialState = { reducer1: { x: 'foo' }, reducer2: { y: 'bar' } }; let combination: any; @@ -28,10 +23,10 @@ describe(`Store utils`, () => { }); it(`should create a function that accepts state and action and returns combined state object`, () => { - const updateAction1 = { type: 's1', payload: 'baz' }; + const updateAction1 = { type: 'state1', payload: 'baz' }; expect(combination(initialState, updateAction1)).toEqual({ ...initialState, - r1: { x: updateAction1.payload }, + reducer1: { x: updateAction1.payload }, }); }); diff --git a/modules/store/src/actions_subject.ts b/modules/store/src/actions_subject.ts index 418af4779c..7885efcad0 100644 --- a/modules/store/src/actions_subject.ts +++ b/modules/store/src/actions_subject.ts @@ -4,7 +4,7 @@ import { Observable } from 'rxjs/Observable'; import { Observer } from 'rxjs/Observer'; import { Action } from './models'; -export const INIT = '@ngrx/store/init'; +export const INIT = '@ngrx/store/init' as '@ngrx/store/init'; @Injectable() export class ActionsSubject extends BehaviorSubject @@ -15,9 +15,9 @@ export class ActionsSubject extends BehaviorSubject next(action: Action): void { if (typeof action === 'undefined') { - throw new Error(`Actions must be objects`); + throw new TypeError(`Actions must be objects`); } else if (typeof action.type === 'undefined') { - throw new Error(`Actions must have a type property`); + throw new TypeError(`Actions must have a type property`); } super.next(action); diff --git a/modules/store/src/reducer_manager.ts b/modules/store/src/reducer_manager.ts index 66a3dbf301..a3f0ee58f8 100644 --- a/modules/store/src/reducer_manager.ts +++ b/modules/store/src/reducer_manager.ts @@ -16,7 +16,7 @@ export abstract class ReducerObservable extends Observable< ActionReducer > {} export abstract class ReducerManagerDispatcher extends ActionsSubject {} -export const UPDATE = '@ngrx/store/update-reducers'; +export const UPDATE = '@ngrx/store/update-reducers' as '@ngrx/store/update-reducers'; @Injectable() export class ReducerManager extends BehaviorSubject> diff --git a/modules/store/src/state.ts b/modules/store/src/state.ts index db37b7a839..87d50a36cb 100644 --- a/modules/store/src/state.ts +++ b/modules/store/src/state.ts @@ -4,7 +4,6 @@ import { Observable } from 'rxjs/Observable'; import { Subscription } from 'rxjs/Subscription'; import { queue } from 'rxjs/scheduler/queue'; import { observeOn } from 'rxjs/operator/observeOn'; -import { startWith } from 'rxjs/operator/startWith'; import { withLatestFrom } from 'rxjs/operator/withLatestFrom'; import { scan } from 'rxjs/operator/scan'; import { ActionsSubject } from './actions_subject'; @@ -12,12 +11,13 @@ import { Action, ActionReducer } from './models'; import { INITIAL_STATE } from './tokens'; import { ReducerObservable } from './reducer_manager'; import { ScannedActionsSubject } from './scanned_actions_subject'; +import { INIT } from './'; export abstract class StateObservable extends Observable {} @Injectable() export class State extends BehaviorSubject implements OnDestroy { - static readonly INIT = '@ngrx/store/init'; + static readonly INIT = INIT; private stateSubscription: Subscription; diff --git a/modules/store/src/store_module.ts b/modules/store/src/store_module.ts index 995aaf960f..d28333ffca 100644 --- a/modules/store/src/store_module.ts +++ b/modules/store/src/store_module.ts @@ -51,7 +51,13 @@ export class StoreFeatureModule implements OnDestroy { @Inject(STORE_FEATURES) private features: StoreFeature[], private reducerManager: ReducerManager ) { - features.forEach(feature => reducerManager.addFeature(feature)); + for (let feature of features) { + if (typeof feature.initialState === 'function') { + feature = { ...feature, initialState: feature.initialState() }; + } + + reducerManager.addFeature(feature); + } } ngOnDestroy() { diff --git a/modules/store/src/tokens.ts b/modules/store/src/tokens.ts index 3601686859..0e7b045887 100644 --- a/modules/store/src/tokens.ts +++ b/modules/store/src/tokens.ts @@ -1,11 +1,15 @@ -import { OpaqueToken } from '@angular/core'; +import { InjectionToken } from '@angular/core'; -export const _INITIAL_STATE = new OpaqueToken('_ngrx/store Initial State'); -export const INITIAL_STATE = new OpaqueToken('@ngrx/store Initial State'); -export const REDUCER_FACTORY = new OpaqueToken('@ngrx/store Reducer Factory'); -export const _REDUCER_FACTORY = new OpaqueToken( +export const _INITIAL_STATE = new InjectionToken('_ngrx/store Initial State'); +export const INITIAL_STATE = new InjectionToken('@ngrx/store Initial State'); +export const REDUCER_FACTORY = new InjectionToken( + '@ngrx/store Reducer Factory' +); +export const _REDUCER_FACTORY = new InjectionToken( '@ngrx/store Reducer Factory Provider' ); -export const INITIAL_REDUCERS = new OpaqueToken('@ngrx/store Initial Reducers'); -export const META_REDUCERS = new OpaqueToken('@ngrx/store Meta Reducers'); -export const STORE_FEATURES = new OpaqueToken('@ngrx/store Store Features'); +export const INITIAL_REDUCERS = new InjectionToken( + '@ngrx/store Initial Reducers' +); +export const META_REDUCERS = new InjectionToken('@ngrx/store Meta Reducers'); +export const STORE_FEATURES = new InjectionToken('@ngrx/store Store Features'); diff --git a/modules/store/src/utils.ts b/modules/store/src/utils.ts index 0b9b1eaebc..a8a30c7642 100644 --- a/modules/store/src/utils.ts +++ b/modules/store/src/utils.ts @@ -45,15 +45,9 @@ export function omit( object: T, keyToRemove: keyof T ): Partial { - const ret: Partial = {}; - - for (const key of Object.keys(object)) { - if (key !== keyToRemove) { - ret[key] = object[key]; - } - } - - return ret; + return Object.keys(object) + .filter(key => key !== keyToRemove) + .reduce((result, key) => Object.assign(result, { [key]: object[key] }), {}); } export function compose(): (i: A) => A; diff --git a/yarn.lock b/yarn.lock index 6a4a8973e5..cd709d62b3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -343,10 +343,6 @@ ansi-styles@^3.1.0: dependencies: color-convert "^1.0.0" -any-promise@^1.0.0, any-promise@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - anymatch@^1.1.0, anymatch@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" @@ -551,6 +547,14 @@ babel-messages@^6.23.0: dependencies: babel-runtime "^6.22.0" +babel-polyfill@6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" + dependencies: + babel-runtime "^6.22.0" + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + 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" @@ -823,6 +827,10 @@ builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" +byline@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" + bytes@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" @@ -869,7 +877,7 @@ camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" -camelcase@^4.0.0: +camelcase@^4.0.0, camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" @@ -905,7 +913,7 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" -chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: +chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: @@ -1779,6 +1787,10 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" +detect-indent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + detect-node@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" @@ -1876,6 +1888,10 @@ duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" +duplexer@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" @@ -1920,6 +1936,12 @@ encodeurl@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + engine.io-client@1.8.2: version "1.8.2" resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.2.tgz#c38767547f2a7d184f5752f6f0ad501006703766" @@ -2040,6 +2062,18 @@ evp_bytestokey@^1.0.0: dependencies: create-hash "^1.1.1" +execa@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.5.1.tgz#de3fb85cb8d6e91c85bcbceb164581785cb57b36" + dependencies: + cross-spawn "^4.0.0" + get-stream "^2.2.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + execa@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/execa/-/execa-0.6.3.tgz#57b69a594f081759c69e5370f0d17b9cb11658fe" @@ -2244,7 +2278,7 @@ find-up@^1.0.0, find-up@^1.1.2: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.1.0: +find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" dependencies: @@ -2322,7 +2356,7 @@ fs-extra@^0.23.1: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@^2.0.0, fs-extra@^2.1.2: +fs-extra@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz#046c70163cef9aad46b0e4a7fa467fb22d71de35" dependencies: @@ -2337,15 +2371,6 @@ fs-extra@^3.0.1: jsonfile "^3.0.0" universalify "^0.1.0" -fs-promise@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fs-promise/-/fs-promise-2.0.2.tgz#cfea45c80f46480a3fd176213fa22abc8c159521" - dependencies: - any-promise "^1.3.0" - fs-extra "^2.0.0" - mz "^2.6.0" - thenify-all "^1.6.0" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -2421,10 +2446,21 @@ get-pkg-repo@^1.0.0: parse-github-repo-url "^1.3.0" through2 "^2.0.0" +get-port@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.1.0.tgz#ef01b18a84ca6486970ff99e54446141a73ffd3e" + get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" +get-stream@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -2503,7 +2539,7 @@ glob@^6.0.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@~7.1.1: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: @@ -2550,6 +2586,16 @@ globby@^5.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + globule@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.0.tgz#1dc49c6822dd9e8a2fa00ba2a295006e8664bd09" @@ -2828,6 +2874,10 @@ iconv-lite@0.4.15: version "0.4.15" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" +iconv-lite@~0.4.13: + version "0.4.18" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" + icss-replace-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" @@ -2901,7 +2951,7 @@ ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: version "1.3.4" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" -inquirer@^3.0.0, inquirer@^3.0.6: +inquirer@3.0.6, inquirer@^3.0.0, inquirer@^3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347" dependencies: @@ -3102,7 +3152,7 @@ is-retry-allowed@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" -is-stream@^1.0.0, is-stream@^1.1.0: +is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -3525,9 +3575,9 @@ lcov-parse@0.0.10: version "0.0.10" resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" -lerna@^2.0.0-rc.1: - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/lerna/-/lerna-2.0.0-rc.1.tgz#b92b230ea812d43fd23c3d6dae49583fe638d12f" +lerna@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-2.0.0.tgz#49a72fe70e06aebfd7ea23efb2ab41abe60ebeea" dependencies: async "^1.5.0" chalk "^1.1.1" @@ -3536,27 +3586,34 @@ lerna@^2.0.0-rc.1: command-join "^2.0.0" conventional-changelog-cli "^1.3.1" conventional-recommended-bump "^1.0.0" - cross-spawn "^4.0.0" dedent "^0.7.0" execa "^0.6.3" find-up "^2.1.0" - fs-promise "^2.0.2" - glob "^7.0.6" + fs-extra "^3.0.1" + get-port "^3.1.0" + glob "^7.1.2" + globby "^6.1.0" graceful-fs "^4.1.11" inquirer "^3.0.6" + is-ci "^1.0.10" load-json-file "^2.0.0" lodash "^4.17.4" - meow "^3.7.0" - minimatch "^3.0.0" + minimatch "^3.0.4" + npmlog "^4.1.0" + p-finally "^1.0.0" path-exists "^3.0.0" - progress "^2.0.0" read-cmd-shim "^1.0.1" read-pkg "^2.0.0" rimraf "^2.6.1" + safe-buffer "^5.0.1" semver "^5.1.0" signal-exit "^3.0.2" - write-json-file "^2.0.0" - write-pkg "^2.1.0" + strong-log-transformer "^1.0.6" + temp-write "^3.3.0" + write-file-atomic "^2.1.0" + write-json-file "^2.1.0" + write-pkg "^3.0.1" + yargs "^8.0.1" less-loader@^4.0.2: version "4.0.5" @@ -3790,6 +3847,12 @@ media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + dependencies: + mimic-fn "^1.0.0" + memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -3895,6 +3958,10 @@ minimist@1.2.0, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" +minimist@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de" + mixin-object@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" @@ -3916,6 +3983,10 @@ module-alias@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/module-alias/-/module-alias-2.0.0.tgz#9bff2cba6eb181dac8e379d69fe34b066a970988" +moment@^2.6.0: + version "2.18.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" + ms@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" @@ -3932,14 +4003,6 @@ mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" -mz@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.6.0.tgz#c8b8521d958df0a4f2768025db69c719ee4ef1ce" - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - nan@^2.3.0, nan@^2.3.2: version "2.6.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" @@ -3972,6 +4035,13 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" +node-fetch@1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + node-gyp@^3.3.1: version "3.6.2" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60" @@ -4108,7 +4178,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2, npmlog@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" dependencies: @@ -4216,6 +4286,17 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" +opencollective@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/opencollective/-/opencollective-1.0.3.tgz#aee6372bc28144583690c3ca8daecfc120dd0ef1" + dependencies: + babel-polyfill "6.23.0" + chalk "1.1.3" + inquirer "3.0.6" + minimist "1.2.0" + node-fetch "1.6.3" + opn "4.0.2" + opn@4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95" @@ -4269,6 +4350,14 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" +os-locale@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.0.0.tgz#15918ded510522b81ee7ae5a309d54f639fc39a4" + dependencies: + execa "^0.5.0" + lcid "^1.0.0" + mem "^1.1.0" + os-tmpdir@^1.0.0, os-tmpdir@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -4432,7 +4521,7 @@ performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" -pify@^2.0.0, pify@^2.3.0: +pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -4781,10 +4870,6 @@ process@^0.11.0: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" -progress@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" - promise@^7.1.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" @@ -4938,6 +5023,13 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + read-pkg@^1.0.0, read-pkg@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -5537,12 +5629,18 @@ sorcery@^0.10.0: sander "^0.5.0" sourcemap-codec "^1.3.0" -sort-keys@^1.0.0, sort-keys@^1.1.1, sort-keys@^1.1.2: +sort-keys@^1.0.0, sort-keys@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" dependencies: is-plain-obj "^1.0.0" +sort-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" + dependencies: + is-plain-obj "^1.0.0" + source-list-map@^0.1.7: version "0.1.8" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" @@ -5764,6 +5862,16 @@ strip-json-comments@^2.0.0, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" +strong-log-transformer@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-1.0.6.tgz#f7fb93758a69a571140181277eea0c2eb1301fa3" + dependencies: + byline "^5.0.0" + duplexer "^0.1.1" + minimist "^0.1.0" + moment "^2.6.0" + through "^2.3.4" + style-loader@^0.13.1: version "0.13.2" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.13.2.tgz#74533384cf698c7104c7951150b49717adc2f3bb" @@ -5846,6 +5954,21 @@ tar@^2.0.0, tar@^2.2.1: fstream "^1.0.2" inherits "2" +temp-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + +temp-write@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-3.3.0.tgz#c1a96de2b36061342eae81f44ff001aec8f615a9" + dependencies: + graceful-fs "^4.1.2" + is-stream "^1.1.0" + make-dir "^1.0.0" + pify "^2.2.0" + temp-dir "^1.0.0" + uuid "^3.0.1" + temp@0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" @@ -5880,18 +6003,6 @@ text-extensions@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.4.0.tgz#c385d2e80879fe6ef97893e1709d88d9453726e9" -thenify-all@^1.0.0, thenify-all@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.2.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.2.1.tgz#251fd1c80aff6e5cf57cb179ab1fcb724269bd11" - dependencies: - any-promise "^1.0.0" - through2@^2.0.0, through2@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" @@ -5899,7 +6010,7 @@ through2@^2.0.0, through2@^2.0.2: readable-stream "^2.1.5" xtend "~4.0.1" -through@2, "through@>=2.2.7 <3", through@X.X.X, through@^2.3.6: +through@2, "through@>=2.2.7 <3", through@X.X.X, through@^2.3.4, through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -6223,6 +6334,10 @@ uuid@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" +uuid@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" + v8flags@^2.0.11: version "2.0.11" resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.0.11.tgz#bca8f30f0d6d60612cc2c00641e6962d42ae6881" @@ -6413,6 +6528,10 @@ which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" +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: version "1.2.12" resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" @@ -6454,7 +6573,7 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" -write-file-atomic@^1.1.2, write-file-atomic@^1.1.4: +write-file-atomic@^1.1.4: version "1.3.1" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.1.tgz#7d45ba32316328dd1ec7d90f60ebc0d845bb759a" dependencies: @@ -6462,7 +6581,7 @@ write-file-atomic@^1.1.2, write-file-atomic@^1.1.4: imurmurhash "^0.1.4" slide "^1.1.5" -write-file-atomic@^2.0.0: +write-file-atomic@^2.0.0, write-file-atomic@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.1.0.tgz#1769f4b551eedce419f0505deae2e26763542d37" dependencies: @@ -6470,22 +6589,23 @@ write-file-atomic@^2.0.0: imurmurhash "^0.1.4" slide "^1.1.5" -write-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.0.0.tgz#0eaec981fcf9288dbc2806cbd26e06ab9bdca4ed" +write-json-file@^2.1.0, write-json-file@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.2.0.tgz#51862506bbb3b619eefab7859f1fd6c6d0530876" dependencies: + detect-indent "^5.0.0" graceful-fs "^4.1.2" - mkdirp "^0.5.1" + make-dir "^1.0.0" pify "^2.0.0" sort-keys "^1.1.1" - write-file-atomic "^1.1.2" + write-file-atomic "^2.0.0" -write-pkg@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-2.1.0.tgz#353aa44c39c48c21440f5c08ce6abd46141c9c08" +write-pkg@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-3.1.0.tgz#030a9994cc9993d25b4e75a9f1a1923607291ce9" dependencies: - sort-keys "^1.1.2" - write-json-file "^2.0.0" + sort-keys "^2.0.0" + write-json-file "^2.2.0" ws@1.1.1: version "1.1.1" @@ -6569,6 +6689,12 @@ yargs-parser@^5.0.0: dependencies: camelcase "^3.0.0" +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + dependencies: + camelcase "^4.1.0" + yargs@^3.7.2: version "3.32.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" @@ -6617,6 +6743,24 @@ yargs@^7.0.0: y18n "^3.2.1" yargs-parser "^5.0.0" +yargs@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" + 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"