├── circle.yml ├── .vscode └── settings.json ├── index.ts ├── .editorconfig ├── src ├── config.ts ├── utils.ts ├── actions.ts ├── extension.ts ├── devtools.ts ├── instrument.ts └── reducer.ts ├── tsconfig.dist.json ├── tsconfig.json ├── .npmignore ├── tests.js ├── CONTRIBUTING.md ├── .gitignore ├── LICENSE ├── rollup.config.js ├── tslint.json ├── README.md ├── package.json ├── CHANGELOG.md ├── spec └── store.spec.ts └── yarn.lock /circle.yml: -------------------------------------------------------------------------------- 1 | machine: 2 | node: 3 | version: 6.4.0 4 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "typescript.tsdk": "./node_modules/typescript/lib" 3 | } -------------------------------------------------------------------------------- /index.ts: -------------------------------------------------------------------------------- 1 | export { StoreDevtoolsModule } from './src/instrument'; 2 | export { LiftedState } from './src/reducer'; 3 | export { StoreDevtools } from './src/devtools'; 4 | export { StoreDevtoolsConfig } from './src/config'; 5 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | indent_style = space 8 | indent_size = 2 9 | end_of_line = lf 10 | insert_final_newline = true 11 | trim_trailing_whitespace = true 12 | 13 | [*.md] 14 | insert_final_newline = false 15 | trim_trailing_whitespace = false -------------------------------------------------------------------------------- /src/config.ts: -------------------------------------------------------------------------------- 1 | import { ActionReducer } from '@ngrx/store'; 2 | import { OpaqueToken } from '@angular/core'; 3 | 4 | export interface StoreDevtoolsConfig { 5 | maxAge?: number; 6 | monitor?: ActionReducer; 7 | } 8 | 9 | export const STORE_DEVTOOLS_CONFIG = new OpaqueToken('@ngrx/devtools Options'); 10 | 11 | export const INITIAL_OPTIONS = new OpaqueToken('@ngrx/devtools Initial Config'); 12 | -------------------------------------------------------------------------------- /tsconfig.dist.json: -------------------------------------------------------------------------------- 1 | 2 | { 3 | "compilerOptions": { 4 | "baseUrl": ".", 5 | "declaration": true, 6 | "stripInternal": true, 7 | "emitDecoratorMetadata": true, 8 | "experimentalDecorators": true, 9 | "module": "es2015", 10 | "moduleResolution": "node", 11 | "noEmitOnError": false, 12 | "outDir": "./release", 13 | "rootDir": ".", 14 | "sourceMap": true, 15 | "inlineSources": true, 16 | "lib": ["es2015", "dom"], 17 | "target": "es5", 18 | "skipLibCheck": true 19 | }, 20 | "files": [ 21 | "index.ts" 22 | ], 23 | "angularCompilerOptions": { 24 | "strictMetadataEmit": true 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "declaration": true, 5 | "stripInternal": true, 6 | "emitDecoratorMetadata": true, 7 | "experimentalDecorators": true, 8 | "module": "commonjs", 9 | "moduleResolution": "node", 10 | "noEmitOnError": false, 11 | "outDir": "./release", 12 | "rootDir": ".", 13 | "lib": ["es2015", "dom"], 14 | "target": "es5", 15 | "skipLibCheck": true, 16 | "types": [ 17 | "node", 18 | "jasmine" 19 | ] 20 | }, 21 | "exclude": [ 22 | "node_modules" 23 | ], 24 | "angularCompilerOptions": { 25 | "strictMetadataEmit": true 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # node-waf configuration 20 | .lock-wscript 21 | 22 | # Compiled binary addons (http://nodejs.org/api/addons.html) 23 | build/Release 24 | 25 | # Dependency directory 26 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 27 | node_modules 28 | tmp 29 | typings 30 | *.ngfactory.ts 31 | -------------------------------------------------------------------------------- /tests.js: -------------------------------------------------------------------------------- 1 | require('ts-node/register'); 2 | require('core-js/es7/reflect'); 3 | require('zone.js/dist/zone-node.js'); 4 | require('zone.js/dist/long-stack-trace-zone.js'); 5 | require('zone.js/dist/proxy.js'); 6 | require('zone.js/dist/sync-test.js'); 7 | require('zone.js/dist/async-test.js'); 8 | require('zone.js/dist/fake-async-test.js'); 9 | const Jasmine = require('jasmine'); 10 | 11 | const runner = new Jasmine(); 12 | 13 | global.jasmine = runner.jasmine; 14 | 15 | require('zone.js/dist/jasmine-patch.js'); 16 | 17 | const { getTestBed } = require('@angular/core/testing'); 18 | const { ServerTestingModule, platformServerTesting } = require('@angular/platform-server/testing'); 19 | 20 | 21 | getTestBed().initTestEnvironment(ServerTestingModule, platformServerTesting()); 22 | 23 | runner.loadConfig({ 24 | spec_dir: 'spec', 25 | spec_files: [ '**/*.spec.ts' ] 26 | }); 27 | 28 | runner.execute(); -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## Developing 2 | 3 | ### Setup 4 | 5 | ``` 6 | npm install 7 | typings install 8 | npm run clean-ng2 9 | ``` 10 | 11 | ### Testing 12 | 13 | ``` 14 | npm test 15 | ``` 16 | 17 | ## Submitting Pull Requests 18 | 19 | **Please follow these basic steps to simplify pull request reviews - if you don't you'll probably just be asked to anyway.** 20 | 21 | * Please rebase your branch against the current master 22 | * Run ```npm install``` to make sure your development dependencies are up-to-date 23 | * Please ensure the test suite passes before submitting a PR 24 | * If you've added new functionality, **please** include tests which validate its behaviour 25 | * Make reference to possible [issues](https://github.com/ngrx/store/issues) on PR comment 26 | 27 | ## Submitting bug reports 28 | 29 | * Please detail the affected browser(s) and operating system(s) 30 | * Please be sure to state which version of node **and** npm you're using -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | .nyc 5 | .nyc_output 6 | 7 | # Runtime data 8 | pids 9 | *.pid 10 | *.seed 11 | 12 | # Directory for instrumented libs generated by jscoverage/JSCover 13 | lib-cov 14 | 15 | # Coverage directory used by tools like istanbul 16 | coverage 17 | 18 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 19 | .grunt 20 | 21 | # Compiled binary addons (http://nodejs.org/api/addons.html) 22 | build/Release 23 | 24 | # Users Environment Variables 25 | .lock-wscript 26 | 27 | # OS generated files # 28 | .DS_Store 29 | ehthumbs.db 30 | Icon? 31 | Thumbs.db 32 | 33 | # Node Files # 34 | /node_modules 35 | /bower_components 36 | 37 | # Typing TSD # 38 | /src/typings/tsd/ 39 | /typings/ 40 | /tsd_typings/ 41 | 42 | # Dist # 43 | /dist 44 | /public/__build__/ 45 | /src/*/__build__/ 46 | __build__/** 47 | .webpack.json 48 | 49 | #doc 50 | /doc 51 | 52 | # IDE # 53 | .idea/ 54 | *.swp 55 | !/typings/custom.d.ts 56 | 57 | # Build Artifacts # 58 | release 59 | .ngc 60 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 ngrx 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import { Action } from '@ngrx/store'; 2 | import { Observable } from 'rxjs/Observable'; 3 | import { LiftedState } from './reducer'; 4 | import { StoreDevtoolActions } from './actions'; 5 | 6 | export function difference(first: any[], second: any[]) { 7 | return first.filter(item => second.indexOf(item) < 0); 8 | } 9 | 10 | /** 11 | * Provides an app's view into the state of the lifted store. 12 | */ 13 | export function unliftState(liftedState: LiftedState) { 14 | const { computedStates, currentStateIndex } = liftedState; 15 | const { state } = computedStates[currentStateIndex]; 16 | 17 | return state; 18 | } 19 | 20 | export function unliftAction(liftedState: LiftedState) { 21 | return liftedState.actionsById[liftedState.nextActionId - 1]; 22 | } 23 | 24 | /** 25 | * Lifts an app's action into an action on the lifted store. 26 | */ 27 | export function liftAction(action) { 28 | return StoreDevtoolActions.performAction(action); 29 | } 30 | 31 | 32 | export function applyOperators(input$: Observable, operators: any[][]): Observable { 33 | return operators.reduce((source$, [ operator, ...args ]) => { 34 | return operator.apply(source$, args); 35 | }, input$); 36 | } -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | entry: './release/index.js', 3 | dest: './release/bundles/store-devtools.umd.js', 4 | format: 'umd', 5 | moduleName: 'ngrx.storeDevtools', 6 | globals: { 7 | '@angular/core': 'ng.core', 8 | '@ngrx/core/operator/select': 'ngrx.core', 9 | '@ngrx/store': 'ngrx.store', 10 | 11 | 'rxjs/Observable': 'Rx', 12 | 'rxjs/BehaviorSubject': 'Rx', 13 | 'rxjs/ReplaySubject': 'Rx', 14 | 'rxjs/Subscriber': 'Rx', 15 | 16 | 'rxjs/scheduler/queue': 'Rx.Scheduler', 17 | 18 | 'rxjs/observable/empty': 'Rx.Observable', 19 | 20 | 'rxjs/operator/filter': 'Rx.Observable.prototype', 21 | 'rxjs/operator/map': 'Rx.Observable.prototype', 22 | 'rxjs/operator/merge': 'Rx.Observable.prototype', 23 | 'rxjs/operator/observeOn': 'Rx.Observable.prototype', 24 | 'rxjs/operator/publishReplay': 'Rx.Observable.prototype', 25 | 'rxjs/operator/scan': 'Rx.Observable.prototype', 26 | 'rxjs/operator/share': 'Rx.Observable.prototype', 27 | 'rxjs/operator/skip': 'Rx.Observable.prototype', 28 | 'rxjs/operator/switchMap': 'Rx.Observable.prototype', 29 | 'rxjs/operator/takeUntil': 'Rx.Observable.prototype', 30 | 'rxjs/operator/withLatestFrom': 'Rx.Observable.prototype' 31 | } 32 | } -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "class-name": true, 4 | "comment-format": [ 5 | true, 6 | "check-space" 7 | ], 8 | "indent": [ 9 | true, 10 | "spaces" 11 | ], 12 | "no-duplicate-variable": true, 13 | "no-eval": false, 14 | "no-internal-module": true, 15 | "no-trailing-whitespace": true, 16 | "no-var-keyword": true, 17 | "one-line": [ 18 | true, 19 | "check-open-brace", 20 | "check-whitespace" 21 | ], 22 | "quotemark": [ 23 | true, 24 | "single" 25 | ], 26 | "semicolon": true, 27 | "triple-equals": [ 28 | true, 29 | "allow-null-check" 30 | ], 31 | "typedef-whitespace": [ 32 | true, 33 | { 34 | "call-signature": "nospace", 35 | "index-signature": "nospace", 36 | "parameter": "nospace", 37 | "property-declaration": "nospace", 38 | "variable-declaration": "nospace" 39 | } 40 | ], 41 | "variable-name": [ 42 | true, 43 | "ban-keywords", 44 | "allow-leading-underscore" 45 | ], 46 | "whitespace": [ 47 | true, 48 | "check-branch", 49 | "check-decl", 50 | "check-operator", 51 | "check-separator", 52 | "check-type" 53 | ] 54 | } 55 | } -------------------------------------------------------------------------------- /src/actions.ts: -------------------------------------------------------------------------------- 1 | export const ActionTypes = { 2 | PERFORM_ACTION: 'PERFORM_ACTION', 3 | RESET: 'RESET', 4 | ROLLBACK: 'ROLLBACK', 5 | COMMIT: 'COMMIT', 6 | SWEEP: 'SWEEP', 7 | TOGGLE_ACTION: 'TOGGLE_ACTION', 8 | SET_ACTIONS_ACTIVE: 'SET_ACTIONS_ACTIVE', 9 | JUMP_TO_STATE: 'JUMP_TO_STATE', 10 | IMPORT_STATE: 'IMPORT_STATE' 11 | }; 12 | 13 | /** 14 | * Action creators to change the History state. 15 | */ 16 | export const StoreDevtoolActions = { 17 | performAction(action) { 18 | if (typeof action.type === 'undefined') { 19 | throw new Error( 20 | 'Actions may not have an undefined "type" property. ' + 21 | 'Have you misspelled a constant?' 22 | ); 23 | } 24 | 25 | return { type: ActionTypes.PERFORM_ACTION, action, timestamp: Date.now() }; 26 | }, 27 | 28 | reset() { 29 | return { type: ActionTypes.RESET, timestamp: Date.now() }; 30 | }, 31 | 32 | rollback() { 33 | return { type: ActionTypes.ROLLBACK, timestamp: Date.now() }; 34 | }, 35 | 36 | commit() { 37 | return { type: ActionTypes.COMMIT, timestamp: Date.now() }; 38 | }, 39 | 40 | sweep() { 41 | return { type: ActionTypes.SWEEP }; 42 | }, 43 | 44 | toggleAction(id) { 45 | return { type: ActionTypes.TOGGLE_ACTION, id }; 46 | }, 47 | 48 | setActionsActive(start, end, active = true) { 49 | return { type: ActionTypes.SET_ACTIONS_ACTIVE, start, end, active }; 50 | }, 51 | 52 | jumpToState(index) { 53 | return { type: ActionTypes.JUMP_TO_STATE, index }; 54 | }, 55 | 56 | importState(nextLiftedState) { 57 | return { type: ActionTypes.IMPORT_STATE, nextLiftedState }; 58 | } 59 | }; 60 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | --- 2 | # This repository is for version 3.x of of @ngrx/store-devtools. 3 | # [Click here for the latest version (4.x)](https://github.com/ngrx/platform) 4 | --- 5 | 6 | # @ngrx/store-devtools 7 | Devtools for [@ngrx/store](https://github.com/ngrx/store). 8 | 9 | [![Join the chat at https://gitter.im/ngrx/store](https://badges.gitter.im/ngrx/store.svg)](https://gitter.im/ngrx/store?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) 10 | 11 | ## Installation 12 | `npm install @ngrx/store-devtools@3.2.4 --save` 13 | 14 | 15 | ## Instrumentation 16 | ### Instrumentation with the Chrome / Firefox Extension (Preferred) 17 | 18 | 1. Download the [Redux Devtools Extension](http://zalmoxisus.github.io/redux-devtools-extension/) 19 | 20 | 2. In your root Angular module import `StoreDevtoolsModule.instrumentOnlyWithExtension()`: 21 | 22 | ```ts 23 | import { StoreDevtoolsModule } from '@ngrx/store-devtools'; 24 | 25 | @NgModule({ 26 | imports: [ 27 | StoreModule.provideStore(rootReducer), 28 | // Note that you must instrument after importing StoreModule 29 | StoreDevtoolsModule.instrumentOnlyWithExtension({ 30 | maxAge: 5 31 | }) 32 | ] 33 | }) 34 | export class AppModule { } 35 | ``` 36 | 37 | ### Instrumentation with a Custom Monitor 38 | To instrument @ngrx/store and use the devtools with a custom monitor you will need to setup the 39 | instrumentation providers using `instrumentStore()`: 40 | 41 | ```ts 42 | import {StoreDevtoolsModule} from '@ngrx/store-devtools'; 43 | 44 | @NgModule({ 45 | imports: [ 46 | StoreModule.provideStore(rootReducer), 47 | // Note that you must instrument after importing StoreModule 48 | StoreDevtoolsModule.instrumentStore({ 49 | maxAge: 5, 50 | monitor: monitorReducer 51 | }) 52 | ] 53 | }) 54 | export class AppModule { } 55 | ``` 56 | 57 | See [@ngrx/store-log-monitor](https://github.com/ngrx/store-log-monitor) for an example monitor built for Angular 2 58 | 59 | ## Contributing 60 | 61 | Please read [contributing guidelines here](https://github.com/ngrx/store-devtools/blob/master/CONTRIBUTING.md). 62 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@ngrx/store-devtools", 3 | "version": "3.2.4", 4 | "description": "Developer tools for @ngrx/store", 5 | "main": "./bundles/store-devtools.umd.js", 6 | "module": "./index.js", 7 | "scripts": { 8 | "karma": "karma start --single-run", 9 | "test:raw": "node tests.js", 10 | "test": "nyc node tests.js", 11 | "clean:pre": "rimraf release", 12 | "clean:post": "rimraf src/**/*.ngfactory.ts", 13 | "copy": "cpy LICENSE package.json README.md release", 14 | "build:js": "ngc -p tsconfig.dist.json", 15 | "build:umd": "rollup -c rollup.config.js", 16 | "build:uglify": "uglifyjs -c --screw-ie8 --comments -o ./release/bundles/store-devtools.min.umd.js ./release/bundles/store-devtools.umd.js", 17 | "prebuild": "npm run test && npm run clean:pre", 18 | "postbuild": "npm run clean:post && npm run copy", 19 | "build": "npm run build:js && npm run build:umd && npm run build:uglify", 20 | "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0" 21 | }, 22 | "repository": { 23 | "type": "git", 24 | "url": "git+https://github.com/ngrx/devtools.git" 25 | }, 26 | "keywords": [ 27 | "RxJS", 28 | "Angular2", 29 | "Redux", 30 | "Store", 31 | "@ngrx/store" 32 | ], 33 | "contributors": [ 34 | { 35 | "name": "Rob Wormald", 36 | "email": "robwormald@gmail.com" 37 | }, 38 | { 39 | "name": "Mike Ryan", 40 | "email": "mikeryan52@gmail.com" 41 | } 42 | ], 43 | "license": "MIT", 44 | "bugs": { 45 | "url": "https://github.com/ngrx/devtools/issues" 46 | }, 47 | "homepage": "https://github.com/ngrx/devtools#readme", 48 | "peerDependencies": { 49 | "@ngrx/store": "^2.0.0", 50 | "rxjs": "^5.0.0-beta.12" 51 | }, 52 | "devDependencies": { 53 | "@angular/animations": "^4.0.0", 54 | "@angular/common": "^4.0.0", 55 | "@angular/compiler": "^4.0.0", 56 | "@angular/compiler-cli": "^4.0.0", 57 | "@angular/core": "^4.0.0", 58 | "@angular/http": "^4.0.0", 59 | "@angular/platform-browser": "^4.0.0", 60 | "@angular/platform-browser-dynamic": "^4.0.0", 61 | "@angular/platform-server": "^4.0.0", 62 | "@ngrx/core": "^1.0.0", 63 | "@ngrx/store": "^2.1.2", 64 | "@types/jasmine": "^2.5.46", 65 | "@types/node": "^7.0.10", 66 | "conventional-changelog": "^1.1.3", 67 | "conventional-changelog-cli": "^1.3.1", 68 | "core-js": "^2.4.1", 69 | "cpy-cli": "^1.0.1", 70 | "jasmine": "^2.5.3", 71 | "nyc": "^10.1.2", 72 | "rimraf": "^2.6.1", 73 | "rollup": "^0.41.6", 74 | "rxjs": "^5.2.0", 75 | "ts-loader": "^2.0.3", 76 | "ts-node": "^3.0.2", 77 | "tslint": "^4.5.1", 78 | "tslint-loader": "^3.4.3", 79 | "typescript": "^2.2.1", 80 | "uglifyjs": "^2.4.10", 81 | "zone.js": "^0.8.5" 82 | }, 83 | "nyc": { 84 | "extension": [ 85 | ".ts" 86 | ], 87 | "exclude": [ 88 | "spec/**/*.spec" 89 | ], 90 | "include": [ 91 | "src/**/*.ts" 92 | ] 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | import { OpaqueToken, Inject, Injectable } from '@angular/core'; 2 | import { Observable } from 'rxjs/Observable'; 3 | import { empty } from 'rxjs/observable/empty'; 4 | import { filter } from 'rxjs/operator/filter'; 5 | import { map } from 'rxjs/operator/map'; 6 | import { share } from 'rxjs/operator/share'; 7 | import { switchMap } from 'rxjs/operator/switchMap'; 8 | import { takeUntil } from 'rxjs/operator/takeUntil'; 9 | 10 | import { ActionTypes } from './actions'; 11 | import { LiftedState } from './reducer'; 12 | import { unliftState, unliftAction, applyOperators } from './utils'; 13 | 14 | export const ExtensionActionTypes = { 15 | START: 'START', 16 | DISPATCH: 'DISPATCH', 17 | STOP: 'STOP', 18 | ACTION: 'ACTION' 19 | }; 20 | 21 | export const REDUX_DEVTOOLS_EXTENSION = new OpaqueToken('Redux Devtools Extension'); 22 | 23 | export interface ReduxDevtoolsExtensionConnection { 24 | subscribe(listener: (change: any) => void); 25 | unsubscribe(); 26 | send(action: any, state: any); 27 | } 28 | 29 | export interface ReduxDevtoolsExtension { 30 | connect(options: { shouldStringify?: boolean, instanceId: string }): ReduxDevtoolsExtensionConnection; 31 | send(action: any, state: any, shouldStringify?: boolean, instanceId?: string); 32 | } 33 | 34 | 35 | @Injectable() 36 | export class DevtoolsExtension { 37 | private instanceId = `ngrx-store-${Date.now()}`; 38 | private devtoolsExtension: ReduxDevtoolsExtension; 39 | 40 | liftedActions$: Observable; 41 | actions$: Observable; 42 | 43 | constructor( 44 | @Inject(REDUX_DEVTOOLS_EXTENSION) devtoolsExtension 45 | ) { 46 | this.devtoolsExtension = devtoolsExtension; 47 | this.createActionStreams(); 48 | } 49 | 50 | notify(action, state: LiftedState) { 51 | if (!this.devtoolsExtension) { 52 | return; 53 | } 54 | 55 | this.devtoolsExtension.send(null, state, false, this.instanceId); 56 | } 57 | 58 | private createChangesObservable(): Observable { 59 | if (!this.devtoolsExtension) { 60 | return empty(); 61 | } 62 | 63 | return new Observable(subscriber => { 64 | const connection = this.devtoolsExtension.connect({ instanceId: this.instanceId }); 65 | 66 | connection.subscribe(change => subscriber.next(change)); 67 | 68 | return connection.unsubscribe; 69 | }); 70 | } 71 | 72 | private createActionStreams() { 73 | // Listens to all changes based on our instanceId 74 | const changes$ = share.call(this.createChangesObservable()); 75 | 76 | // Listen for the start action 77 | const start$ = filter.call(changes$, change => change.type === ExtensionActionTypes.START); 78 | 79 | // Listen for the stop action 80 | const stop$ = filter.call(changes$, change => change.type === ExtensionActionTypes.STOP); 81 | 82 | // Listen for lifted actions 83 | const liftedActions$ = applyOperators(changes$, [ 84 | [ filter, change => change.type === ExtensionActionTypes.DISPATCH ], 85 | [ map, change => this.unwrapAction(change.payload) ] 86 | ]); 87 | 88 | // Listen for unlifted actions 89 | const actions$ = applyOperators(changes$, [ 90 | [ filter, change => change.type === ExtensionActionTypes.ACTION ], 91 | [ map, change => this.unwrapAction(change.payload) ] 92 | ]); 93 | 94 | const actionsUntilStop$ = takeUntil.call(actions$, stop$); 95 | const liftedUntilStop$ = takeUntil.call(liftedActions$, stop$); 96 | 97 | // Only take the action sources between the start/stop events 98 | this.actions$ = switchMap.call(start$, () => actionsUntilStop$); 99 | this.liftedActions$ = switchMap.call(start$, () => liftedUntilStop$); 100 | } 101 | 102 | private unwrapAction(action) { 103 | return typeof action === 'string' ? eval(`(${action})`) : action; 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /src/devtools.ts: -------------------------------------------------------------------------------- 1 | import { Injectable, Inject, OnDestroy } from '@angular/core'; 2 | import { State, INITIAL_STATE, INITIAL_REDUCER, Dispatcher, Reducer } from '@ngrx/store'; 3 | import { Observable } from 'rxjs/Observable'; 4 | import { ReplaySubject } from 'rxjs/ReplaySubject'; 5 | import { Observer } from 'rxjs/Observer'; 6 | import { Subscription } from 'rxjs/Subscription'; 7 | import { map } from 'rxjs/operator/map'; 8 | import { merge } from 'rxjs/operator/merge'; 9 | import { observeOn } from 'rxjs/operator/observeOn'; 10 | import { scan } from 'rxjs/operator/scan'; 11 | import { skip } from 'rxjs/operator/skip'; 12 | import { withLatestFrom } from 'rxjs/operator/withLatestFrom'; 13 | import { queue } from 'rxjs/scheduler/queue'; 14 | 15 | import { DevtoolsExtension } from './extension'; 16 | import { liftAction, unliftState, applyOperators } from './utils'; 17 | import { liftReducerWith, liftInitialState, LiftedState } from './reducer'; 18 | import { StoreDevtoolActions as actions } from './actions'; 19 | import { StoreDevtoolsConfig, STORE_DEVTOOLS_CONFIG } from './config'; 20 | 21 | @Injectable() 22 | export class DevtoolsDispatcher extends Dispatcher { } 23 | 24 | @Injectable() 25 | export class StoreDevtools implements Observer { 26 | private stateSubscription: Subscription; 27 | public dispatcher: Dispatcher; 28 | public liftedState: Observable; 29 | public state: Observable; 30 | 31 | constructor( 32 | dispatcher: DevtoolsDispatcher, 33 | actions$: Dispatcher, 34 | reducers$: Reducer, 35 | extension: DevtoolsExtension, 36 | @Inject(INITIAL_STATE) initialState: any, 37 | @Inject(STORE_DEVTOOLS_CONFIG) config: StoreDevtoolsConfig 38 | ) { 39 | const liftedInitialState = liftInitialState(initialState, config.monitor); 40 | const liftReducer = liftReducerWith(initialState, liftedInitialState, config.monitor, { 41 | maxAge: config.maxAge 42 | }); 43 | 44 | const liftedAction$ = applyOperators(actions$, [ 45 | [ skip, 1 ], 46 | [ merge, extension.actions$ ], 47 | [ map, liftAction ], 48 | [ merge, dispatcher, extension.liftedActions$ ], 49 | [ observeOn, queue ] 50 | ]); 51 | 52 | const liftedReducer$ = map.call(reducers$, liftReducer); 53 | 54 | const liftedStateSubject = new ReplaySubject(1); 55 | const liftedStateSubscription = applyOperators(liftedAction$, [ 56 | [ withLatestFrom, liftedReducer$ ], 57 | [ scan, (liftedState, [ action, reducer ]) => { 58 | const nextState = reducer(liftedState, action); 59 | 60 | extension.notify(action, nextState); 61 | 62 | return nextState; 63 | }, liftedInitialState] 64 | ]).subscribe(liftedStateSubject); 65 | 66 | const liftedState$ = liftedStateSubject.asObservable(); 67 | const state$ = map.call(liftedState$, unliftState); 68 | 69 | this.stateSubscription = liftedStateSubscription; 70 | this.dispatcher = dispatcher; 71 | this.liftedState = liftedState$; 72 | this.state = state$; 73 | } 74 | 75 | dispatch(action) { 76 | this.dispatcher.dispatch(action); 77 | } 78 | 79 | next(action: any) { 80 | this.dispatcher.dispatch(action); 81 | } 82 | 83 | error(error: any) { } 84 | 85 | complete() { } 86 | 87 | performAction(action: any) { 88 | this.dispatch(actions.performAction(action)); 89 | } 90 | 91 | reset() { 92 | this.dispatch(actions.reset()); 93 | } 94 | 95 | rollback() { 96 | this.dispatch(actions.rollback()); 97 | } 98 | 99 | commit() { 100 | this.dispatch(actions.commit()); 101 | } 102 | 103 | sweep() { 104 | this.dispatch(actions.sweep()); 105 | } 106 | 107 | toggleAction(id: number) { 108 | this.dispatch(actions.toggleAction(id)); 109 | } 110 | 111 | jumpToState(index: number) { 112 | this.dispatch(actions.jumpToState(index)); 113 | } 114 | 115 | importState(nextLiftedState: any) { 116 | this.dispatch(actions.importState(nextLiftedState)); 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /src/instrument.ts: -------------------------------------------------------------------------------- 1 | import { NgModule, OpaqueToken, Injector, ModuleWithProviders } from '@angular/core'; 2 | import { StoreModule, State, INITIAL_STATE, INITIAL_REDUCER, Dispatcher, Reducer } from '@ngrx/store'; 3 | import { Observable } from 'rxjs/Observable'; 4 | import { StoreDevtools, DevtoolsDispatcher } from './devtools'; 5 | import { StoreDevtoolsConfig, STORE_DEVTOOLS_CONFIG, INITIAL_OPTIONS } from './config'; 6 | import { DevtoolsExtension, REDUX_DEVTOOLS_EXTENSION } from './extension'; 7 | 8 | 9 | export function _createReduxDevtoolsExtension() { 10 | const legacyExtensionKey = 'devToolsExtension'; 11 | const extensionKey = '__REDUX_DEVTOOLS_EXTENSION__'; 12 | 13 | if (typeof window === 'object' && typeof window[legacyExtensionKey] !== 'undefined') { 14 | return window[legacyExtensionKey]; 15 | } 16 | else if (typeof window === 'object' && typeof window[extensionKey] !== 'undefined') { 17 | return window[extensionKey]; 18 | } 19 | else { 20 | return null; 21 | } 22 | } 23 | 24 | export function _createState(devtools: StoreDevtools) { 25 | return devtools.state; 26 | } 27 | 28 | export function _createReducer(dispatcher: DevtoolsDispatcher, reducer) { 29 | return new Reducer(dispatcher, reducer); 30 | } 31 | 32 | export function _createStateIfExtension(extension: any, injector: Injector, initialState: any) { 33 | if (!!extension) { 34 | const devtools: StoreDevtools = injector.get(StoreDevtools); 35 | 36 | return _createState(devtools); 37 | } 38 | else { 39 | const dispatcher: Dispatcher = injector.get(Dispatcher); 40 | const reducer: Reducer = injector.get(Reducer); 41 | 42 | return new State(initialState, dispatcher, reducer); 43 | } 44 | } 45 | 46 | export function _createReducerIfExtension(extension: any, injector: Injector, reducer: any) { 47 | if (!!extension) { 48 | const devtoolsDispatcher: DevtoolsDispatcher = injector.get(DevtoolsDispatcher); 49 | 50 | return _createReducer(devtoolsDispatcher, reducer); 51 | } 52 | else { 53 | const dispatcher: Dispatcher = injector.get(Dispatcher); 54 | 55 | return new Reducer(dispatcher, reducer); 56 | } 57 | } 58 | 59 | export function noMonitor() { 60 | return null; 61 | } 62 | 63 | export function _createOptions(_options): StoreDevtoolsConfig { 64 | const DEFAULT_OPTIONS: StoreDevtoolsConfig = { monitor: noMonitor }; 65 | 66 | let options = typeof _options === 'function' ? _options() : _options; 67 | 68 | options = Object.assign({}, DEFAULT_OPTIONS, options); 69 | 70 | if (options.maxAge && options.maxAge < 2) { 71 | throw new Error(`Devtools 'maxAge' cannot be less than 2, got ${options.maxAge}`); 72 | } 73 | 74 | return options; 75 | } 76 | 77 | @NgModule({ 78 | imports: [ 79 | StoreModule 80 | ], 81 | providers: [ 82 | DevtoolsExtension, 83 | DevtoolsDispatcher, 84 | StoreDevtools, 85 | { 86 | provide: REDUX_DEVTOOLS_EXTENSION, 87 | useFactory: _createReduxDevtoolsExtension 88 | } 89 | ] 90 | }) 91 | export class StoreDevtoolsModule { 92 | static instrumentStore(_options: StoreDevtoolsConfig | (() => StoreDevtoolsConfig) = {}): ModuleWithProviders { 93 | 94 | return { 95 | ngModule: StoreDevtoolsModule, 96 | providers: [ 97 | { 98 | provide: State, 99 | deps: [ StoreDevtools ], 100 | useFactory: _createState 101 | }, 102 | { 103 | provide: INITIAL_OPTIONS, 104 | useValue: _options 105 | }, 106 | { 107 | provide: Reducer, 108 | deps: [ DevtoolsDispatcher, INITIAL_REDUCER ], 109 | useFactory: _createReducer 110 | }, 111 | { 112 | provide: STORE_DEVTOOLS_CONFIG, 113 | deps: [INITIAL_OPTIONS], 114 | useFactory: _createOptions 115 | } 116 | ] 117 | }; 118 | } 119 | 120 | static instrumentOnlyWithExtension(_options: StoreDevtoolsConfig | (() => StoreDevtoolsConfig) = {}): ModuleWithProviders { 121 | return { 122 | ngModule: StoreDevtoolsModule, 123 | providers: [ 124 | { 125 | provide: State, 126 | deps: [ REDUX_DEVTOOLS_EXTENSION, Injector, INITIAL_STATE ], 127 | useFactory: _createStateIfExtension 128 | }, 129 | { 130 | provide: Reducer, 131 | deps: [ REDUX_DEVTOOLS_EXTENSION, Injector, INITIAL_REDUCER ], 132 | useFactory: _createReducerIfExtension 133 | }, 134 | { 135 | provide: INITIAL_OPTIONS, 136 | useValue: _options 137 | }, 138 | { 139 | provide: STORE_DEVTOOLS_CONFIG, 140 | deps: [INITIAL_OPTIONS], 141 | useFactory: _createOptions 142 | } 143 | ] 144 | }; 145 | } 146 | } 147 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 2 | ## [3.2.4](https://github.com/ngrx/devtools/compare/v3.2.3...v3.2.4) (2017-03-24) 3 | 4 | 5 | ### Bug Fixes 6 | 7 | * **StoreDevtools:** Eagerly inject initial state and reducers ([c2abe11](https://github.com/ngrx/devtools/commit/c2abe11)) 8 | 9 | 10 | 11 | 12 | ## [3.2.3](https://github.com/ngrx/devtools/compare/v3.2.2...v3.2.3) (2017-01-19) 13 | 14 | 15 | ### Bug Fixes 16 | 17 | * **devtools:** Fixed AOT bug when providing devtools config options ([#52](https://github.com/ngrx/devtools/issues/52)) ([d21ab15](https://github.com/ngrx/devtools/commit/d21ab15)) 18 | 19 | 20 | 21 | 22 | ## [3.2.2](https://github.com/ngrx/devtools/compare/v3.2.1...v3.2.2) (2016-11-04) 23 | 24 | 25 | ### Bug Fixes 26 | 27 | * **bundles:** Correctly alias ReplaySubject ([1a65e6d](https://github.com/ngrx/devtools/commit/1a65e6d)) 28 | * **extension:** Fix unsubscribing from the extension ([#37](https://github.com/ngrx/devtools/issues/37)) ([f5d068d](https://github.com/ngrx/devtools/commit/f5d068d)), closes [#33](https://github.com/ngrx/devtools/issues/33) 29 | 30 | 31 | 32 | 33 | ## [3.2.1](https://github.com/ngrx/devtools/compare/v3.2.0...v3.2.1) (2016-10-26) 34 | 35 | 36 | ### Bug Fixes 37 | 38 | * **StoreDevtools:** Prevent reducer undefined error ([bb1e25d](https://github.com/ngrx/devtools/commit/bb1e25d)) 39 | 40 | 41 | 42 | 43 | # [3.2.0](https://github.com/ngrx/devtools/compare/v3.0.1...v3.2.0) (2016-10-26) 44 | 45 | 46 | ### Bug Fixes 47 | 48 | * **Extension:** Get Chrome extension working correctly ([d1abedd](https://github.com/ngrx/devtools/commit/d1abedd)) 49 | * **State:** Stop using a refcounted observable to contain state ([d4a6382](https://github.com/ngrx/devtools/commit/d4a6382)), closes [#25](https://github.com/ngrx/devtools/issues/25) 50 | 51 | 52 | ### Features 53 | 54 | * **Devtools:** Enable instrumenting store conditionally if extension is present ([a1b6dfc](https://github.com/ngrx/devtools/commit/a1b6dfc)) 55 | 56 | 57 | 58 | 59 | ## [3.0.1](https://github.com/ngrx/devtools/compare/v3.0.0...v3.0.1) (2016-09-01) 60 | 61 | 62 | ### Bug Fixes 63 | 64 | * **deps:** Upgrade to latest Angular 2 and rxjs ([50869c5](https://github.com/ngrx/devtools/commit/50869c5)) 65 | 66 | 67 | 68 | 69 | # [3.0.0](https://github.com/ngrx/devtools/compare/v2.0.0-beta.1...v3.0.0) (2016-08-26) 70 | 71 | 72 | ### Bug Fixes 73 | 74 | * **extension:** Allow universal rendering ([#23](https://github.com/ngrx/devtools/issues/23)) ([dcd640c](https://github.com/ngrx/devtools/commit/dcd640c)) 75 | 76 | 77 | ### Chores 78 | 79 | * Upgrade to Angular 2 RC.5 ([#26](https://github.com/ngrx/devtools/issues/26)) ([28f53d1](https://github.com/ngrx/devtools/commit/28f53d1)) 80 | 81 | 82 | ### BREAKING CHANGES 83 | 84 | * With the introduction of NgModules, the process for instrumenting your store has changed 85 | 86 | BEFORE: 87 | 88 | ```ts 89 | import { instrumentStore } from '@ngrx/store-devtools'; 90 | 91 | bootstrap(App, [ 92 | instrumentStore(config) 93 | ]); 94 | ``` 95 | 96 | AFTER: 97 | 98 | ```ts 99 | import { StoreDevtoolsModule } from '@ngrx/store-devtools'; 100 | 101 | @NgModule({ 102 | imports: [ 103 | StoreDevtoolsModule.instrumentStore(config) 104 | ] 105 | }) 106 | export class AppModule { } 107 | ``` 108 | 109 | 110 | 111 | 112 | # [2.0.0-beta.1](https://github.com/ngrx/devtools/compare/v1.4.0...v2.0.0-beta.1) (2016-07-01) 113 | 114 | 115 | 116 | 117 | # [1.4.0](https://github.com/ngrx/devtools/compare/v1.3.3...v1.4.0) (2016-05-03) 118 | 119 | 120 | 121 | 122 | ## [1.3.3](https://github.com/ngrx/devtools/compare/v1.3.2...v1.3.3) (2016-03-17) 123 | 124 | 125 | 126 | 127 | ## [1.3.2](https://github.com/ngrx/devtools/compare/v1.3.1...v1.3.2) (2016-03-17) 128 | 129 | 130 | ### Bug Fixes 131 | 132 | * **DevtoolsConfig:** Use the PositionsType from the dock monitor to constrain the available positions ([f1a1563](https://github.com/ngrx/devtools/commit/f1a1563)) 133 | * **LogMonitor:** do not suppress init action ([78f46c0](https://github.com/ngrx/devtools/commit/78f46c0)) 134 | 135 | 136 | ### Features 137 | 138 | * **devtools:** Added config function to set default position, visibility and size ([73cfefc](https://github.com/ngrx/devtools/commit/73cfefc)) 139 | * **monitors:** Added customizable dock monitor commands via inputs ([5610e27](https://github.com/ngrx/devtools/commit/5610e27)) 140 | 141 | 142 | 143 | 144 | ## [1.3.1](https://github.com/ngrx/devtools/compare/v1.3.0...v1.3.1) (2016-03-12) 145 | 146 | 147 | ### Bug Fixes 148 | 149 | * **Commander:** Fixed event handling in the Commander component ([ba355fb](https://github.com/ngrx/devtools/commit/ba355fb)) 150 | * **LogMonitorButton:** Fixed metadata generation bug with event handler ([b5f69a7](https://github.com/ngrx/devtools/commit/b5f69a7)) 151 | * **StoreDevtoolsTest:** Changed all calls to use devtool methods instead of raw action creators ([f99657d](https://github.com/ngrx/devtools/commit/f99657d)) 152 | 153 | 154 | ### Features 155 | 156 | * **Devtools:** Added unified Devtools component that wraps the DockMonitor and LogMonitor ([58497f5](https://github.com/ngrx/devtools/commit/58497f5)) 157 | * **DockMonitor:** Added dock monitor to wrap devtools. ([d10fb7a](https://github.com/ngrx/devtools/commit/d10fb7a)) 158 | * **instrumentStore:** Added shortcut to combineReducers if an object is passed in. Default to dock reducer ([344c7b5](https://github.com/ngrx/devtools/commit/344c7b5)) 159 | 160 | 161 | 162 | 163 | # [1.3.0](https://github.com/ngrx/devtools/compare/0f2c4ff...v1.3.0) (2016-03-09) 164 | 165 | 166 | ### Bug Fixes 167 | 168 | * **Devtools:** Filtered out all undefined states ([0f2c4ff](https://github.com/ngrx/devtools/commit/0f2c4ff)) 169 | * **linter:** Corrected linting errors with store instrumentation ([1d99bbc](https://github.com/ngrx/devtools/commit/1d99bbc)) 170 | * **package.json:** Restore name to [@ngrx](https://github.com/ngrx)/devtools ([859491c](https://github.com/ngrx/devtools/commit/859491c)) 171 | * **StoreDevtools:** Fixed specs to correctly use liftedState instead of state ([769a046](https://github.com/ngrx/devtools/commit/769a046)) 172 | * **tsconfig:** Corrected paths for log monitor ([4d1e5d6](https://github.com/ngrx/devtools/commit/4d1e5d6)) 173 | * **tsconfig:** Include the correct scripts for the store devtools ([0419aba](https://github.com/ngrx/devtools/commit/0419aba)) 174 | 175 | 176 | ### Features 177 | 178 | * **LogMonitor:** Added initial implementation of a LogMonitor component ([ac6f24d](https://github.com/ngrx/devtools/commit/ac6f24d)) 179 | * **StoreDevtools:** Solidifed devtools API to be a complete service ([5f293f2](https://github.com/ngrx/devtools/commit/5f293f2)) 180 | 181 | 182 | 183 | -------------------------------------------------------------------------------- /src/reducer.ts: -------------------------------------------------------------------------------- 1 | import { Action, Dispatcher, Reducer } from '@ngrx/store'; 2 | 3 | import { difference, liftAction } from './utils'; 4 | import { ActionTypes } from './actions'; 5 | 6 | 7 | export const INIT_ACTION = { type: Dispatcher.INIT }; 8 | 9 | export interface LiftedState { 10 | monitorState: any; 11 | nextActionId: number; 12 | actionsById: { [id: number]: { action: Action } }; 13 | stagedActionIds: number[]; 14 | skippedActionIds: number[]; 15 | committedState: any; 16 | currentStateIndex: number; 17 | computedStates: { state: any, error: any }[]; 18 | } 19 | 20 | /** 21 | * Computes the next entry in the log by applying an action. 22 | */ 23 | function computeNextEntry(reducer, action, state, error) { 24 | if (error) { 25 | return { 26 | state, 27 | error: 'Interrupted by an error up the chain' 28 | }; 29 | } 30 | 31 | let nextState = state; 32 | let nextError; 33 | try { 34 | nextState = reducer(state, action); 35 | } catch (err) { 36 | nextError = err.toString(); 37 | console.error(err.stack || err); 38 | } 39 | 40 | return { 41 | state: nextState, 42 | error: nextError 43 | }; 44 | } 45 | 46 | /** 47 | * Runs the reducer on invalidated actions to get a fresh computation log. 48 | */ 49 | function recomputeStates( 50 | computedStates, 51 | minInvalidatedStateIndex, 52 | reducer, 53 | committedState, 54 | actionsById, 55 | stagedActionIds, 56 | skippedActionIds 57 | ) { 58 | // Optimization: exit early and return the same reference 59 | // if we know nothing could have changed. 60 | if ( 61 | minInvalidatedStateIndex >= computedStates.length && 62 | computedStates.length === stagedActionIds.length 63 | ) { 64 | return computedStates; 65 | } 66 | 67 | const nextComputedStates = computedStates.slice(0, minInvalidatedStateIndex); 68 | for (let i = minInvalidatedStateIndex; i < stagedActionIds.length; i++) { 69 | const actionId = stagedActionIds[i]; 70 | const action = actionsById[actionId].action; 71 | 72 | const previousEntry = nextComputedStates[i - 1]; 73 | const previousState = previousEntry ? previousEntry.state : committedState; 74 | const previousError = previousEntry ? previousEntry.error : undefined; 75 | 76 | const shouldSkip = skippedActionIds.indexOf(actionId) > -1; 77 | const entry = shouldSkip ? 78 | previousEntry : 79 | computeNextEntry(reducer, action, previousState, previousError); 80 | 81 | nextComputedStates.push(entry); 82 | } 83 | 84 | return nextComputedStates; 85 | } 86 | 87 | export function liftInitialState(initialCommittedState?: any, monitorReducer?: any): LiftedState { 88 | return { 89 | monitorState: monitorReducer(undefined, {}), 90 | nextActionId: 1, 91 | actionsById: { 0: liftAction(INIT_ACTION) }, 92 | stagedActionIds: [0], 93 | skippedActionIds: [], 94 | committedState: initialCommittedState, 95 | currentStateIndex: 0, 96 | computedStates: [] 97 | }; 98 | } 99 | 100 | /** 101 | * Creates a history state reducer from an app's reducer. 102 | */ 103 | export function liftReducerWith( 104 | initialCommittedState: any, 105 | initialLiftedState: LiftedState, 106 | monitorReducer?: any, 107 | options: { maxAge?: number } = {} 108 | ) { 109 | /** 110 | * Manages how the history actions modify the history state. 111 | */ 112 | return reducer => (liftedState, liftedAction) => { 113 | let { 114 | monitorState, 115 | actionsById, 116 | nextActionId, 117 | stagedActionIds, 118 | skippedActionIds, 119 | committedState, 120 | currentStateIndex, 121 | computedStates 122 | } = liftedState || initialLiftedState; 123 | 124 | if (!liftedState) { 125 | // Prevent mutating initialLiftedState 126 | actionsById = Object.create(actionsById); 127 | } 128 | 129 | function commitExcessActions(n) { 130 | // Auto-commits n-number of excess actions. 131 | let excess = n; 132 | let idsToDelete = stagedActionIds.slice(1, excess + 1); 133 | 134 | for (let i = 0; i < idsToDelete.length; i++) { 135 | if (computedStates[i + 1].error) { 136 | // Stop if error is found. Commit actions up to error. 137 | excess = i; 138 | idsToDelete = stagedActionIds.slice(1, excess + 1); 139 | break; 140 | } else { 141 | delete actionsById[idsToDelete[i]]; 142 | } 143 | } 144 | 145 | skippedActionIds = skippedActionIds.filter(id => idsToDelete.indexOf(id) === -1); 146 | stagedActionIds = [0, ...stagedActionIds.slice(excess + 1)]; 147 | committedState = computedStates[excess].state; 148 | computedStates = computedStates.slice(excess); 149 | currentStateIndex = currentStateIndex > excess 150 | ? currentStateIndex - excess 151 | : 0; 152 | } 153 | 154 | // By default, agressively recompute every state whatever happens. 155 | // This has O(n) performance, so we'll override this to a sensible 156 | // value whenever we feel like we don't have to recompute the states. 157 | let minInvalidatedStateIndex = 0; 158 | 159 | switch (liftedAction.type) { 160 | case ActionTypes.RESET: { 161 | // Get back to the state the store was created with. 162 | actionsById = { 0: liftAction(INIT_ACTION) }; 163 | nextActionId = 1; 164 | stagedActionIds = [0]; 165 | skippedActionIds = []; 166 | committedState = initialCommittedState; 167 | currentStateIndex = 0; 168 | computedStates = []; 169 | break; 170 | } 171 | case ActionTypes.COMMIT: { 172 | // Consider the last committed state the new starting point. 173 | // Squash any staged actions into a single committed state. 174 | actionsById = { 0: liftAction(INIT_ACTION) }; 175 | nextActionId = 1; 176 | stagedActionIds = [0]; 177 | skippedActionIds = []; 178 | committedState = computedStates[currentStateIndex].state; 179 | currentStateIndex = 0; 180 | computedStates = []; 181 | break; 182 | } 183 | case ActionTypes.ROLLBACK: { 184 | // Forget about any staged actions. 185 | // Start again from the last committed state. 186 | actionsById = { 0: liftAction(INIT_ACTION) }; 187 | nextActionId = 1; 188 | stagedActionIds = [0]; 189 | skippedActionIds = []; 190 | currentStateIndex = 0; 191 | computedStates = []; 192 | break; 193 | } 194 | case ActionTypes.TOGGLE_ACTION: { 195 | // Toggle whether an action with given ID is skipped. 196 | // Being skipped means it is a no-op during the computation. 197 | const { id: actionId } = liftedAction; 198 | const index = skippedActionIds.indexOf(actionId); 199 | if (index === -1) { 200 | skippedActionIds = [actionId, ...skippedActionIds]; 201 | } else { 202 | skippedActionIds = skippedActionIds.filter(id => id !== actionId); 203 | } 204 | // Optimization: we know history before this action hasn't changed 205 | minInvalidatedStateIndex = stagedActionIds.indexOf(actionId); 206 | break; 207 | } 208 | case ActionTypes.SET_ACTIONS_ACTIVE: { 209 | // Toggle whether an action with given ID is skipped. 210 | // Being skipped means it is a no-op during the computation. 211 | const { start, end, active } = liftedAction; 212 | const actionIds = []; 213 | for (let i = start; i < end; i++) actionIds.push(i); 214 | if (active) { 215 | skippedActionIds = difference(skippedActionIds, actionIds); 216 | } else { 217 | skippedActionIds = [...skippedActionIds, ...actionIds]; 218 | } 219 | 220 | // Optimization: we know history before this action hasn't changed 221 | minInvalidatedStateIndex = stagedActionIds.indexOf(start); 222 | break; 223 | } 224 | case ActionTypes.JUMP_TO_STATE: { 225 | // Without recomputing anything, move the pointer that tell us 226 | // which state is considered the current one. Useful for sliders. 227 | currentStateIndex = liftedAction.index; 228 | // Optimization: we know the history has not changed. 229 | minInvalidatedStateIndex = Infinity; 230 | break; 231 | } 232 | case ActionTypes.SWEEP: { 233 | // Forget any actions that are currently being skipped. 234 | stagedActionIds = difference(stagedActionIds, skippedActionIds); 235 | skippedActionIds = []; 236 | currentStateIndex = Math.min(currentStateIndex, stagedActionIds.length - 1); 237 | break; 238 | } 239 | case ActionTypes.PERFORM_ACTION: { 240 | // Auto-commit as new actions come in. 241 | if (options.maxAge && stagedActionIds.length === options.maxAge) { 242 | commitExcessActions(1); 243 | } 244 | 245 | if (currentStateIndex === stagedActionIds.length - 1) { 246 | currentStateIndex++; 247 | } 248 | const actionId = nextActionId++; 249 | // Mutation! This is the hottest path, and we optimize on purpose. 250 | // It is safe because we set a new key in a cache dictionary. 251 | actionsById[actionId] = liftedAction; 252 | stagedActionIds = [...stagedActionIds, actionId]; 253 | // Optimization: we know that only the new action needs computing. 254 | minInvalidatedStateIndex = stagedActionIds.length - 1; 255 | break; 256 | } 257 | case ActionTypes.IMPORT_STATE: { 258 | // Completely replace everything. 259 | ({ 260 | monitorState, 261 | actionsById, 262 | nextActionId, 263 | stagedActionIds, 264 | skippedActionIds, 265 | committedState, 266 | currentStateIndex, 267 | computedStates 268 | } = liftedAction.nextLiftedState); 269 | break; 270 | } 271 | case Reducer.REPLACE: 272 | case Dispatcher.INIT: { 273 | // Always recompute states on hot reload and init. 274 | minInvalidatedStateIndex = 0; 275 | 276 | if (options.maxAge && stagedActionIds.length > options.maxAge) { 277 | // States must be recomputed before committing excess. 278 | computedStates = recomputeStates( 279 | computedStates, 280 | minInvalidatedStateIndex, 281 | reducer, 282 | committedState, 283 | actionsById, 284 | stagedActionIds, 285 | skippedActionIds 286 | ); 287 | 288 | commitExcessActions(stagedActionIds.length - options.maxAge); 289 | 290 | // Avoid double computation. 291 | minInvalidatedStateIndex = Infinity; 292 | } 293 | 294 | break; 295 | } 296 | default: { 297 | // If the action is not recognized, it's a monitor action. 298 | // Optimization: a monitor action can't change history. 299 | minInvalidatedStateIndex = Infinity; 300 | break; 301 | } 302 | } 303 | 304 | computedStates = recomputeStates( 305 | computedStates, 306 | minInvalidatedStateIndex, 307 | reducer, 308 | committedState, 309 | actionsById, 310 | stagedActionIds, 311 | skippedActionIds 312 | ); 313 | monitorState = monitorReducer(monitorState, liftedAction); 314 | 315 | return { 316 | monitorState, 317 | actionsById, 318 | nextActionId, 319 | stagedActionIds, 320 | skippedActionIds, 321 | committedState, 322 | currentStateIndex, 323 | computedStates 324 | }; 325 | }; 326 | } 327 | -------------------------------------------------------------------------------- /spec/store.spec.ts: -------------------------------------------------------------------------------- 1 | import 'rxjs/add/operator/take'; 2 | import { Subscription } from 'rxjs/Subscription'; 3 | import { ReflectiveInjector } from '@angular/core'; 4 | import { TestBed, getTestBed } from '@angular/core/testing'; 5 | import { StoreModule, Store, State, ActionReducer } from '@ngrx/store'; 6 | 7 | import { StoreDevtools, StoreDevtoolsModule, LiftedState, StoreDevtoolsConfig } from '../'; 8 | 9 | const counter = jasmine.createSpy('counter').and.callFake(function (state = 0, action) { 10 | switch (action.type) { 11 | case 'INCREMENT': return state + 1; 12 | case 'DECREMENT': return state - 1; 13 | default: return state; 14 | } 15 | }); 16 | 17 | declare var mistake; 18 | function counterWithBug(state = 0, action) { 19 | switch (action.type) { 20 | case 'INCREMENT': return state + 1; 21 | case 'DECREMENT': return mistake - 1; // mistake is undefined 22 | case 'SET_UNDEFINED': return undefined; 23 | default: return state; 24 | } 25 | } 26 | 27 | function counterWithAnotherBug(state = 0, action) { 28 | switch (action.type) { 29 | case 'INCREMENT': return mistake + 1; // eslint-disable-line no-undef 30 | case 'DECREMENT': return state - 1; 31 | case 'SET_UNDEFINED': return undefined; 32 | default: return state; 33 | } 34 | } 35 | 36 | function doubleCounter(state = 0, action) { 37 | switch (action.type) { 38 | case 'INCREMENT': return state + 2; 39 | case 'DECREMENT': return state - 2; 40 | default: return state; 41 | } 42 | } 43 | 44 | type Fixture = { 45 | store: Store; 46 | state: State; 47 | devtools: StoreDevtools; 48 | cleanup: () => void; 49 | getState: () => T; 50 | getLiftedState: () => LiftedState; 51 | replaceReducer: (reducer) => void; 52 | }; 53 | 54 | function createStore(reducer: ActionReducer, options: StoreDevtoolsConfig = {}): Fixture { 55 | TestBed.configureTestingModule({ 56 | imports: [ 57 | StoreModule.provideStore(reducer), 58 | StoreDevtoolsModule.instrumentStore(options) 59 | ] 60 | }); 61 | 62 | const testbed: TestBed = getTestBed(); 63 | const store: Store = testbed.get(Store); 64 | const devtools: StoreDevtools = testbed.get(StoreDevtools); 65 | const state: State = testbed.get(State); 66 | let liftedValue: LiftedState; 67 | let value: T; 68 | 69 | const liftedStateSub = devtools.liftedState.subscribe(s => liftedValue = s); 70 | const stateSub = devtools.state.subscribe(s => value = s); 71 | 72 | const getState = (): T => value; 73 | const getLiftedState = (): LiftedState => liftedValue; 74 | 75 | const cleanup = () => { 76 | liftedStateSub.unsubscribe(); 77 | stateSub.unsubscribe(); 78 | }; 79 | 80 | const replaceReducer = reducer => { 81 | store.replaceReducer(reducer); 82 | }; 83 | 84 | 85 | return { store, state, devtools, cleanup, getState, getLiftedState, replaceReducer }; 86 | } 87 | 88 | describe('Store Devtools', () => { 89 | describe('Instrumentation', () => { 90 | let fixture: Fixture; 91 | let store: Store; 92 | let devtools: StoreDevtools; 93 | let getState: () => number; 94 | let getLiftedState: () => LiftedState; 95 | 96 | beforeEach(() => { 97 | fixture = createStore(counter); 98 | store = fixture.store; 99 | devtools = fixture.devtools; 100 | getState = fixture.getState; 101 | getLiftedState = fixture.getLiftedState; 102 | }); 103 | 104 | afterEach(() => { 105 | fixture.cleanup(); 106 | }); 107 | 108 | it('should alias devtools unlifted state to Store\'s state', () => { 109 | expect(devtools.state).toBe(fixture.state); 110 | }); 111 | 112 | it('should perform actions', () => { 113 | expect(getState()).toBe(0); 114 | store.dispatch({ type: 'INCREMENT' }); 115 | expect(getState()).toBe(1); 116 | store.dispatch({ type: 'INCREMENT' }); 117 | expect(getState()).toBe(2); 118 | }); 119 | 120 | it('should rollback state to the last committed state', () => { 121 | store.dispatch({ type: 'INCREMENT' }); 122 | store.dispatch({ type: 'INCREMENT' }); 123 | expect(getState()).toBe(2); 124 | 125 | devtools.commit(); 126 | expect(getState()).toBe(2); 127 | 128 | store.dispatch({ type: 'INCREMENT' }); 129 | store.dispatch({ type: 'INCREMENT' }); 130 | expect(getState()).toBe(4); 131 | 132 | devtools.rollback(); 133 | expect(getState()).toBe(2); 134 | 135 | store.dispatch({ type: 'DECREMENT' }); 136 | expect(getState()).toBe(1); 137 | 138 | devtools.rollback(); 139 | expect(getState()).toBe(2); 140 | }); 141 | 142 | it('should reset to initial state', () => { 143 | store.dispatch({ type: 'INCREMENT' }); 144 | expect(getState()).toBe(1); 145 | 146 | devtools.commit(); 147 | expect(getState()).toBe(1); 148 | 149 | store.dispatch({ type: 'INCREMENT' }); 150 | expect(getState()).toBe(2); 151 | 152 | devtools.rollback(); 153 | expect(getState()).toBe(1); 154 | 155 | store.dispatch({ type: 'INCREMENT' }); 156 | expect(getState()).toBe(2); 157 | 158 | devtools.reset(); 159 | expect(getState()).toBe(0); 160 | }); 161 | 162 | it('should toggle an action', () => { 163 | // actionId 0 = @@INIT 164 | store.dispatch({ type: 'INCREMENT' }); 165 | store.dispatch({ type: 'DECREMENT' }); 166 | store.dispatch({ type: 'INCREMENT' }); 167 | expect(getState()).toBe(1); 168 | 169 | devtools.toggleAction(2); 170 | expect(getState()).toBe(2); 171 | 172 | devtools.toggleAction(2); 173 | expect(getState()).toBe(1); 174 | }); 175 | 176 | it('should sweep disabled actions', () => { 177 | // actionId 0 = @@INIT 178 | store.dispatch({ type: 'INCREMENT' }); 179 | store.dispatch({ type: 'DECREMENT' }); 180 | store.dispatch({ type: 'INCREMENT' }); 181 | store.dispatch({ type: 'INCREMENT' }); 182 | 183 | expect(getState()).toBe(2); 184 | expect(getLiftedState().stagedActionIds).toEqual([0, 1, 2, 3, 4]); 185 | expect(getLiftedState().skippedActionIds).toEqual([]); 186 | 187 | devtools.toggleAction(2); 188 | 189 | expect(getState()).toBe(3); 190 | expect(getLiftedState().stagedActionIds).toEqual([0, 1, 2, 3, 4]); 191 | expect(getLiftedState().skippedActionIds).toEqual([2]); 192 | 193 | devtools.sweep(); 194 | expect(getState()).toBe(3); 195 | expect(getLiftedState().stagedActionIds).toEqual([0, 1, 3, 4]); 196 | expect(getLiftedState().skippedActionIds).toEqual([]); 197 | }); 198 | 199 | it('should jump to state', () => { 200 | store.dispatch({ type: 'INCREMENT' }); 201 | store.dispatch({ type: 'DECREMENT' }); 202 | store.dispatch({ type: 'INCREMENT' }); 203 | expect(getState()).toBe(1); 204 | 205 | devtools.jumpToState(0); 206 | expect(getState()).toBe(0); 207 | 208 | devtools.jumpToState(1); 209 | expect(getState()).toBe(1); 210 | 211 | devtools.jumpToState(2); 212 | expect(getState()).toBe(0); 213 | 214 | store.dispatch({ type: 'INCREMENT' }); 215 | expect(getState()).toBe(0); 216 | 217 | devtools.jumpToState(4); 218 | expect(getState()).toBe(2); 219 | }); 220 | 221 | it('should replace the reducer', () => { 222 | store.dispatch({ type: 'INCREMENT' }); 223 | store.dispatch({ type: 'DECREMENT' }); 224 | store.dispatch({ type: 'INCREMENT' }); 225 | 226 | expect(getState()).toBe(1); 227 | 228 | fixture.replaceReducer(doubleCounter); 229 | 230 | expect(getState()).toBe(2); 231 | }); 232 | 233 | it('should catch and record errors', () => { 234 | spyOn(console, 'error'); 235 | fixture.replaceReducer(counterWithBug); 236 | 237 | store.dispatch({ type: 'INCREMENT' }); 238 | store.dispatch({ type: 'DECREMENT' }); 239 | store.dispatch({ type: 'INCREMENT' }); 240 | 241 | let { computedStates } = fixture.getLiftedState(); 242 | expect(computedStates[2].error).toMatch( 243 | /ReferenceError/ 244 | ); 245 | expect(computedStates[3].error).toMatch( 246 | /Interrupted by an error up the chain/ 247 | ); 248 | 249 | expect(console.error).toHaveBeenCalled(); 250 | }); 251 | 252 | it('should catch invalid action type', () => { 253 | expect(() => { 254 | store.dispatch({ type: undefined }); 255 | }).toThrowError( 256 | 'Actions may not have an undefined "type" property. ' + 257 | 'Have you misspelled a constant?' 258 | ); 259 | }); 260 | 261 | it('should not recompute old states when toggling an action', () => { 262 | counter.calls.reset(); 263 | 264 | store.dispatch({ type: 'INCREMENT' }); 265 | store.dispatch({ type: 'INCREMENT' }); 266 | store.dispatch({ type: 'INCREMENT' }); 267 | 268 | expect(counter).toHaveBeenCalledTimes(3); 269 | 270 | devtools.toggleAction(3); 271 | expect(counter).toHaveBeenCalledTimes(3); 272 | 273 | devtools.toggleAction(3); 274 | expect(counter).toHaveBeenCalledTimes(4); 275 | 276 | devtools.toggleAction(2); 277 | expect(counter).toHaveBeenCalledTimes(5); 278 | 279 | devtools.toggleAction(2); 280 | expect(counter).toHaveBeenCalledTimes(7); 281 | 282 | devtools.toggleAction(1); 283 | expect(counter).toHaveBeenCalledTimes(9); 284 | 285 | devtools.toggleAction(2); 286 | expect(counter).toHaveBeenCalledTimes(10); 287 | 288 | devtools.toggleAction(3); 289 | expect(counter).toHaveBeenCalledTimes(10); 290 | 291 | devtools.toggleAction(1); 292 | expect(counter).toHaveBeenCalledTimes(11); 293 | 294 | devtools.toggleAction(3); 295 | expect(counter).toHaveBeenCalledTimes(12); 296 | 297 | devtools.toggleAction(2); 298 | expect(counter).toHaveBeenCalledTimes(14); 299 | }); 300 | 301 | it('should not recompute states when jumping to state', () => { 302 | counter.calls.reset(); 303 | 304 | store.dispatch({ type: 'INCREMENT' }); 305 | store.dispatch({ type: 'INCREMENT' }); 306 | store.dispatch({ type: 'INCREMENT' }); 307 | 308 | expect(counter).toHaveBeenCalledTimes(3); 309 | 310 | let savedComputedStates = getLiftedState().computedStates; 311 | 312 | devtools.jumpToState(0); 313 | 314 | expect(counter).toHaveBeenCalledTimes(3); 315 | 316 | devtools.jumpToState(1); 317 | 318 | expect(counter).toHaveBeenCalledTimes(3); 319 | 320 | devtools.jumpToState(3); 321 | 322 | expect(counter).toHaveBeenCalledTimes(3); 323 | 324 | expect(getLiftedState().computedStates).toBe(savedComputedStates); 325 | }); 326 | 327 | it('should not recompute states on monitor actions', () => { 328 | counter.calls.reset(); 329 | 330 | store.dispatch({ type: 'INCREMENT' }); 331 | store.dispatch({ type: 'INCREMENT' }); 332 | store.dispatch({ type: 'INCREMENT' }); 333 | 334 | expect(counter).toHaveBeenCalledTimes(3); 335 | 336 | let savedComputedStates = getLiftedState().computedStates; 337 | 338 | devtools.dispatch({ type: 'lol' }); 339 | 340 | expect(counter).toHaveBeenCalledTimes(3); 341 | 342 | devtools.dispatch({ type: 'wat' }); 343 | 344 | expect(counter).toHaveBeenCalledTimes(3); 345 | 346 | expect(getLiftedState().computedStates).toBe(savedComputedStates); 347 | }); 348 | }); 349 | 350 | 351 | describe('maxAge option', () => { 352 | it('should auto-commit earliest non-@@INIT action when maxAge is reached', () => { 353 | const fixture = createStore(counter, { maxAge: 3 }); 354 | 355 | fixture.store.dispatch({ type: 'INCREMENT' }); 356 | fixture.store.dispatch({ type: 'INCREMENT' }); 357 | 358 | expect(fixture.getState()).toBe(2); 359 | expect(Object.keys(fixture.getLiftedState().actionsById).length).toBe(3); 360 | expect(fixture.getLiftedState().committedState).toBe(0); 361 | expect(fixture.getLiftedState().stagedActionIds.indexOf(1)).not.toBe(-1); 362 | 363 | // Trigger auto-commit. 364 | fixture.store.dispatch({ type: 'INCREMENT' }); 365 | 366 | expect(fixture.getState()).toBe(3); 367 | expect(Object.keys(fixture.getLiftedState().actionsById).length).toBe(3); 368 | expect(fixture.getLiftedState().stagedActionIds.indexOf(1)).toBe(-1); 369 | expect(fixture.getLiftedState().computedStates[0].state).toBe(1); 370 | expect(fixture.getLiftedState().committedState).toBe(1); 371 | expect(fixture.getLiftedState().currentStateIndex).toBe(2); 372 | 373 | fixture.cleanup(); 374 | }); 375 | 376 | it('should remove skipped actions once committed', () => { 377 | const fixture = createStore(counter, { maxAge: 3 }); 378 | 379 | fixture.store.dispatch({ type: 'INCREMENT' }); 380 | fixture.devtools.toggleAction(1); 381 | fixture.store.dispatch({ type: 'INCREMENT' }); 382 | expect(fixture.getLiftedState().skippedActionIds.indexOf(1)).not.toBe(-1); 383 | fixture.store.dispatch({ type: 'INCREMENT' }); 384 | expect(fixture.getLiftedState().skippedActionIds.indexOf(1)).toBe(-1); 385 | 386 | fixture.cleanup(); 387 | }); 388 | 389 | it('should not auto-commit errors', () => { 390 | spyOn(console, 'error'); 391 | const fixture = createStore(counterWithBug, { maxAge: 3 }); 392 | 393 | fixture.store.dispatch({ type: 'DECREMENT' }); 394 | fixture.store.dispatch({ type: 'INCREMENT' }); 395 | expect(fixture.getLiftedState().stagedActionIds.length).toBe(3); 396 | 397 | fixture.store.dispatch({ type: 'INCREMENT' }); 398 | expect(fixture.getLiftedState().stagedActionIds.length).toBe(4); 399 | 400 | fixture.cleanup(); 401 | }); 402 | 403 | it('should auto-commit actions after hot reload fixes error', () => { 404 | spyOn(console, 'error'); 405 | const fixture = createStore(counterWithBug, { maxAge: 3 }); 406 | 407 | fixture.store.dispatch({ type: 'DECREMENT' }); 408 | fixture.store.dispatch({ type: 'DECREMENT' }); 409 | fixture.store.dispatch({ type: 'INCREMENT' }); 410 | fixture.store.dispatch({ type: 'DECREMENT' }); 411 | fixture.store.dispatch({ type: 'DECREMENT' }); 412 | fixture.store.dispatch({ type: 'DECREMENT' }); 413 | expect(fixture.getLiftedState().stagedActionIds.length).toBe(7); 414 | 415 | // Auto-commit 2 actions by "fixing" reducer bug, but introducing another. 416 | fixture.store.replaceReducer(counterWithAnotherBug); 417 | expect(fixture.getLiftedState().stagedActionIds.length).toBe(5); 418 | 419 | // Auto-commit 2 more actions by "fixing" other reducer bug. 420 | fixture.store.replaceReducer(counter); 421 | expect(fixture.getLiftedState().stagedActionIds.length).toBe(3); 422 | 423 | fixture.cleanup(); 424 | }); 425 | 426 | it('should update currentStateIndex when auto-committing', () => { 427 | const fixture = createStore(counter, { maxAge: 3 }); 428 | 429 | fixture.store.dispatch({ type: 'INCREMENT' }); 430 | fixture.store.dispatch({ type: 'INCREMENT' }); 431 | 432 | expect(fixture.getLiftedState().currentStateIndex).toBe(2); 433 | 434 | // currentStateIndex should stay at 2 as actions are committed. 435 | fixture.store.dispatch({ type: 'INCREMENT' }); 436 | const liftedStoreState = fixture.getLiftedState(); 437 | const currentComputedState = liftedStoreState.computedStates[liftedStoreState.currentStateIndex]; 438 | 439 | expect(liftedStoreState.currentStateIndex).toBe(2); 440 | expect(currentComputedState.state).toBe(3); 441 | 442 | fixture.cleanup(); 443 | }); 444 | 445 | it('should continue to increment currentStateIndex while error blocks commit', () => { 446 | spyOn(console, 'error'); 447 | const fixture = createStore(counterWithBug, { maxAge: 3 }); 448 | 449 | fixture.store.dispatch({ type: 'DECREMENT' }); 450 | fixture.store.dispatch({ type: 'DECREMENT' }); 451 | fixture.store.dispatch({ type: 'DECREMENT' }); 452 | fixture.store.dispatch({ type: 'DECREMENT' }); 453 | 454 | let liftedStoreState = fixture.getLiftedState(); 455 | let currentComputedState = liftedStoreState.computedStates[liftedStoreState.currentStateIndex]; 456 | expect(liftedStoreState.currentStateIndex).toBe(4); 457 | expect(currentComputedState.state).toBe(0); 458 | expect(currentComputedState.error).toBeDefined(); 459 | 460 | fixture.cleanup(); 461 | }); 462 | 463 | it('should adjust currentStateIndex correctly when multiple actions are committed', () => { 464 | spyOn(console, 'error'); 465 | const fixture = createStore(counterWithBug, { maxAge: 3 }); 466 | 467 | fixture.store.dispatch({ type: 'DECREMENT' }); 468 | fixture.store.dispatch({ type: 'DECREMENT' }); 469 | fixture.store.dispatch({ type: 'DECREMENT' }); 470 | fixture.store.dispatch({ type: 'DECREMENT' }); 471 | 472 | // Auto-commit 2 actions by "fixing" reducer bug. 473 | fixture.store.replaceReducer(counter); 474 | let liftedStoreState = fixture.getLiftedState(); 475 | let currentComputedState = liftedStoreState.computedStates[liftedStoreState.currentStateIndex]; 476 | expect(liftedStoreState.currentStateIndex).toBe(2); 477 | expect(currentComputedState.state).toBe(-4); 478 | 479 | fixture.cleanup(); 480 | }); 481 | 482 | it('should not allow currentStateIndex to drop below 0', () => { 483 | spyOn(console, 'error'); 484 | const fixture = createStore(counterWithBug, { maxAge: 3 }); 485 | 486 | fixture.store.dispatch({ type: 'DECREMENT' }); 487 | fixture.store.dispatch({ type: 'DECREMENT' }); 488 | fixture.store.dispatch({ type: 'DECREMENT' }); 489 | fixture.store.dispatch({ type: 'DECREMENT' }); 490 | fixture.devtools.jumpToState(1); 491 | 492 | // Auto-commit 2 actions by "fixing" reducer bug. 493 | fixture.store.replaceReducer(counter); 494 | let liftedStoreState = fixture.getLiftedState(); 495 | let currentComputedState = liftedStoreState.computedStates[liftedStoreState.currentStateIndex]; 496 | expect(liftedStoreState.currentStateIndex).toBe(0); 497 | expect(currentComputedState.state).toBe(-2); 498 | 499 | fixture.cleanup(); 500 | }); 501 | 502 | it('should throw error when maxAge < 2', () => { 503 | expect(() => { 504 | createStore(counter, { maxAge: 1 }); 505 | }).toThrowError(/cannot be less than/); 506 | }); 507 | 508 | it('should support a function to return devtools options', () => { 509 | expect(() => { 510 | createStore(counter, function() { 511 | return { maxAge: 1 }; 512 | }); 513 | }).toThrowError(/cannot be less than/); 514 | }); 515 | }); 516 | 517 | describe('Import State', () => { 518 | let fixture: Fixture; 519 | let exportedState: LiftedState; 520 | 521 | beforeEach(() => { 522 | fixture = createStore(counter); 523 | 524 | fixture.store.dispatch({ type: 'INCREMENT' }); 525 | fixture.store.dispatch({ type: 'INCREMENT' }); 526 | fixture.store.dispatch({ type: 'INCREMENT' }); 527 | 528 | exportedState = fixture.getLiftedState(); 529 | }); 530 | 531 | afterEach(() => { 532 | fixture.cleanup(); 533 | }); 534 | 535 | it('should replay all the steps when a state is imported', () => { 536 | fixture.devtools.importState(exportedState); 537 | expect(fixture.getLiftedState()).toEqual(exportedState); 538 | }); 539 | 540 | it('should replace the existing action log with the one imported', () => { 541 | fixture.store.dispatch({ type: 'DECREMENT' }); 542 | fixture.store.dispatch({ type: 'DECREMENT' }); 543 | 544 | fixture.devtools.importState(exportedState); 545 | expect(fixture.getLiftedState()).toEqual(exportedState); 546 | }); 547 | }); 548 | }); 549 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@angular/animations@^4.0.0": 6 | version "4.0.0" 7 | resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-4.0.0.tgz#f6efb67ca3f3816d2dbf19b8f570371f2d205edc" 8 | 9 | "@angular/common@^4.0.0": 10 | version "4.0.0" 11 | resolved "https://registry.yarnpkg.com/@angular/common/-/common-4.0.0.tgz#ca18983222fdab4ecaa7a8b99eda6ff661e6dc92" 12 | 13 | "@angular/compiler-cli@^4.0.0": 14 | version "4.0.0" 15 | resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-4.0.0.tgz#35b2d40cd35135aecec4be659532148f5ac67da6" 16 | dependencies: 17 | "@angular/tsc-wrapped" "4.0.0" 18 | minimist "^1.2.0" 19 | reflect-metadata "^0.1.2" 20 | 21 | "@angular/compiler@^4.0.0": 22 | version "4.0.0" 23 | resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-4.0.0.tgz#e1aa061a6f8ef269f9748af1a7bc290f9d37ed6c" 24 | 25 | "@angular/core@^4.0.0": 26 | version "4.0.0" 27 | resolved "https://registry.yarnpkg.com/@angular/core/-/core-4.0.0.tgz#fd877e074b29dfa9c63b96a21995fc7556d423a3" 28 | 29 | "@angular/http@^4.0.0": 30 | version "4.0.0" 31 | resolved "https://registry.yarnpkg.com/@angular/http/-/http-4.0.0.tgz#45a538eac42a0b13f3744c7e8bafeb17d58da31c" 32 | 33 | "@angular/platform-browser-dynamic@^4.0.0": 34 | version "4.0.0" 35 | resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-4.0.0.tgz#d1d9de80fe1e02735be89f512e0faf5a80d57fa5" 36 | 37 | "@angular/platform-browser@^4.0.0": 38 | version "4.0.0" 39 | resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-4.0.0.tgz#512ae9ab19ccc25fa79027f44e291bcee236cd2b" 40 | 41 | "@angular/platform-server@^4.0.0": 42 | version "4.0.0" 43 | resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-4.0.0.tgz#d76d61787cd3be3ce8ed46043d6a8c82572f567d" 44 | dependencies: 45 | parse5 "^3.0.1" 46 | xhr2 "^0.1.4" 47 | 48 | "@angular/tsc-wrapped@4.0.0": 49 | version "4.0.0" 50 | resolved "https://registry.yarnpkg.com/@angular/tsc-wrapped/-/tsc-wrapped-4.0.0.tgz#ea91eeda98029cdb0a4ac37d5e25d9d12a4333c1" 51 | dependencies: 52 | tsickle "^0.21.0" 53 | 54 | "@ngrx/core@^1.0.0": 55 | version "1.2.0" 56 | resolved "https://registry.yarnpkg.com/@ngrx/core/-/core-1.2.0.tgz#882b46abafa2e0e6d887cb71a1b2c2fa3e6d0dc6" 57 | 58 | "@ngrx/store@^2.1.2": 59 | version "2.2.1" 60 | resolved "https://registry.yarnpkg.com/@ngrx/store/-/store-2.2.1.tgz#316ec1e43aa5a0166e5e6e1aa2c34a4049386510" 61 | 62 | "@types/jasmine@^2.5.46": 63 | version "2.5.46" 64 | resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.5.46.tgz#bb3047a3f40f60dee03f52c3e2d955cd3d5066c8" 65 | 66 | "@types/node@^6.0.46": 67 | version "6.0.66" 68 | resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.66.tgz#5680b74a6135d33d4c00447e7c3dc691a4601625" 69 | 70 | "@types/node@^7.0.10": 71 | version "7.0.10" 72 | resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.10.tgz#d860abb18c1b58b552c7c6cd8b2ba7adf6546fa3" 73 | 74 | JSONStream@^1.0.4: 75 | version "1.3.1" 76 | resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.1.tgz#707f761e01dae9e16f1bcf93703b78c70966579a" 77 | dependencies: 78 | jsonparse "^1.2.0" 79 | through ">=2.2.7 <3" 80 | 81 | add-stream@^1.0.0: 82 | version "1.0.0" 83 | resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" 84 | 85 | align-text@^0.1.1, align-text@^0.1.3: 86 | version "0.1.4" 87 | resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" 88 | dependencies: 89 | kind-of "^3.0.2" 90 | longest "^1.0.1" 91 | repeat-string "^1.5.2" 92 | 93 | amdefine@>=0.0.4: 94 | version "1.0.0" 95 | resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.0.tgz#fd17474700cb5cc9c2b709f0be9d23ce3c198c33" 96 | 97 | ansi-align@^1.1.0: 98 | version "1.1.0" 99 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-1.1.0.tgz#2f0c1658829739add5ebb15e6b0c6e3423f016ba" 100 | dependencies: 101 | string-width "^1.0.1" 102 | 103 | ansi-regex@^2.0.0: 104 | version "2.0.0" 105 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" 106 | 107 | ansi-styles@^2.2.1: 108 | version "2.2.1" 109 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 110 | 111 | append-transform@^0.4.0: 112 | version "0.4.0" 113 | resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" 114 | dependencies: 115 | default-require-extensions "^1.0.0" 116 | 117 | archy@^1.0.0: 118 | version "1.0.0" 119 | resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" 120 | 121 | arr-diff@^2.0.0: 122 | version "2.0.0" 123 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 124 | dependencies: 125 | arr-flatten "^1.0.1" 126 | 127 | arr-flatten@^1.0.1: 128 | version "1.0.1" 129 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" 130 | 131 | array-find-index@^1.0.1: 132 | version "1.0.2" 133 | resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" 134 | 135 | array-ify@^1.0.0: 136 | version "1.0.0" 137 | resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" 138 | 139 | array-union@^1.0.1: 140 | version "1.0.2" 141 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 142 | dependencies: 143 | array-uniq "^1.0.1" 144 | 145 | array-uniq@^1.0.1: 146 | version "1.0.3" 147 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 148 | 149 | array-unique@^0.2.1: 150 | version "0.2.1" 151 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 152 | 153 | arrify@^1.0.0, arrify@^1.0.1: 154 | version "1.0.1" 155 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 156 | 157 | async@^1.4.0, async@^1.4.2: 158 | version "1.5.2" 159 | resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" 160 | 161 | async@~0.2.6: 162 | version "0.2.10" 163 | resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" 164 | 165 | babel-code-frame@^6.16.0, babel-code-frame@^6.20.0: 166 | version "6.22.0" 167 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" 168 | dependencies: 169 | chalk "^1.1.0" 170 | esutils "^2.0.2" 171 | js-tokens "^3.0.0" 172 | 173 | babel-generator@^6.18.0: 174 | version "6.18.0" 175 | resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.18.0.tgz#e4f104cb3063996d9850556a45aae4a022060a07" 176 | dependencies: 177 | babel-messages "^6.8.0" 178 | babel-runtime "^6.9.0" 179 | babel-types "^6.18.0" 180 | detect-indent "^4.0.0" 181 | jsesc "^1.3.0" 182 | lodash "^4.2.0" 183 | source-map "^0.5.0" 184 | 185 | babel-messages@^6.8.0: 186 | version "6.8.0" 187 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.8.0.tgz#bf504736ca967e6d65ef0adb5a2a5f947c8e0eb9" 188 | dependencies: 189 | babel-runtime "^6.0.0" 190 | 191 | babel-runtime@^6.0.0, babel-runtime@^6.9.0, babel-runtime@^6.9.1: 192 | version "6.18.0" 193 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.18.0.tgz#0f4177ffd98492ef13b9f823e9994a02584c9078" 194 | dependencies: 195 | core-js "^2.4.0" 196 | regenerator-runtime "^0.9.5" 197 | 198 | babel-template@^6.16.0: 199 | version "6.16.0" 200 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.16.0.tgz#e149dd1a9f03a35f817ddbc4d0481988e7ebc8ca" 201 | dependencies: 202 | babel-runtime "^6.9.0" 203 | babel-traverse "^6.16.0" 204 | babel-types "^6.16.0" 205 | babylon "^6.11.0" 206 | lodash "^4.2.0" 207 | 208 | babel-traverse@^6.16.0, babel-traverse@^6.18.0: 209 | version "6.18.0" 210 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.18.0.tgz#5aeaa980baed2a07c8c47329cd90c3b90c80f05e" 211 | dependencies: 212 | babel-code-frame "^6.16.0" 213 | babel-messages "^6.8.0" 214 | babel-runtime "^6.9.0" 215 | babel-types "^6.18.0" 216 | babylon "^6.11.0" 217 | debug "^2.2.0" 218 | globals "^9.0.0" 219 | invariant "^2.2.0" 220 | lodash "^4.2.0" 221 | 222 | babel-types@^6.16.0, babel-types@^6.18.0: 223 | version "6.18.0" 224 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.18.0.tgz#1f7d5a73474c59eb9151b2417bbff4e4fce7c3f8" 225 | dependencies: 226 | babel-runtime "^6.9.1" 227 | esutils "^2.0.2" 228 | lodash "^4.2.0" 229 | to-fast-properties "^1.0.1" 230 | 231 | babylon@^6.11.0, babylon@^6.13.0: 232 | version "6.13.0" 233 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.13.0.tgz#58ed40dd2a8120612be5f318c2c0bedbebde4a0b" 234 | 235 | balanced-match@^0.4.1: 236 | version "0.4.2" 237 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 238 | 239 | big.js@^3.1.3: 240 | version "3.1.3" 241 | resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" 242 | 243 | boxen@^1.0.0: 244 | version "1.0.0" 245 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.0.0.tgz#b2694baf1f605f708ff0177c12193b22f29aaaab" 246 | dependencies: 247 | ansi-align "^1.1.0" 248 | camelcase "^4.0.0" 249 | chalk "^1.1.1" 250 | cli-boxes "^1.0.0" 251 | string-width "^2.0.0" 252 | term-size "^0.1.0" 253 | widest-line "^1.0.0" 254 | 255 | brace-expansion@^1.0.0: 256 | version "1.1.6" 257 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" 258 | dependencies: 259 | balanced-match "^0.4.1" 260 | concat-map "0.0.1" 261 | 262 | braces@^1.8.2: 263 | version "1.8.5" 264 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 265 | dependencies: 266 | expand-range "^1.8.1" 267 | preserve "^0.2.0" 268 | repeat-element "^1.1.2" 269 | 270 | buffer-shims@^1.0.0: 271 | version "1.0.0" 272 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 273 | 274 | builtin-modules@^1.0.0: 275 | version "1.1.1" 276 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 277 | 278 | caching-transform@^1.0.0: 279 | version "1.0.1" 280 | resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-1.0.1.tgz#6dbdb2f20f8d8fbce79f3e94e9d1742dcdf5c0a1" 281 | dependencies: 282 | md5-hex "^1.2.0" 283 | mkdirp "^0.5.1" 284 | write-file-atomic "^1.1.4" 285 | 286 | camelcase-keys@^2.0.0: 287 | version "2.1.0" 288 | resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" 289 | dependencies: 290 | camelcase "^2.0.0" 291 | map-obj "^1.0.0" 292 | 293 | camelcase@^1.0.2: 294 | version "1.2.1" 295 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" 296 | 297 | camelcase@^2.0.0: 298 | version "2.1.1" 299 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 300 | 301 | camelcase@^3.0.0: 302 | version "3.0.0" 303 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" 304 | 305 | camelcase@^4.0.0: 306 | version "4.0.0" 307 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.0.0.tgz#8b0f90d44be5e281b903b9887349b92595ef07f2" 308 | 309 | capture-stack-trace@^1.0.0: 310 | version "1.0.0" 311 | resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" 312 | 313 | center-align@^0.1.1: 314 | version "0.1.3" 315 | resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" 316 | dependencies: 317 | align-text "^0.1.3" 318 | lazy-cache "^1.0.3" 319 | 320 | chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1: 321 | version "1.1.3" 322 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 323 | dependencies: 324 | ansi-styles "^2.2.1" 325 | escape-string-regexp "^1.0.2" 326 | has-ansi "^2.0.0" 327 | strip-ansi "^3.0.0" 328 | supports-color "^2.0.0" 329 | 330 | cli-boxes@^1.0.0: 331 | version "1.0.0" 332 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" 333 | 334 | cliui@^2.1.0: 335 | version "2.1.0" 336 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" 337 | dependencies: 338 | center-align "^0.1.1" 339 | right-align "^0.1.1" 340 | wordwrap "0.0.2" 341 | 342 | cliui@^3.2.0: 343 | version "3.2.0" 344 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" 345 | dependencies: 346 | string-width "^1.0.1" 347 | strip-ansi "^3.0.1" 348 | wrap-ansi "^2.0.0" 349 | 350 | code-point-at@^1.0.0: 351 | version "1.0.1" 352 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.0.1.tgz#1104cd34f9b5b45d3eba88f1babc1924e1ce35fb" 353 | dependencies: 354 | number-is-nan "^1.0.0" 355 | 356 | colors@^1.0.3, colors@^1.1.2: 357 | version "1.1.2" 358 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" 359 | 360 | commondir@^1.0.1: 361 | version "1.0.1" 362 | resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" 363 | 364 | compare-func@^1.3.1: 365 | version "1.3.2" 366 | resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648" 367 | dependencies: 368 | array-ify "^1.0.0" 369 | dot-prop "^3.0.0" 370 | 371 | concat-map@0.0.1: 372 | version "0.0.1" 373 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 374 | 375 | configstore@^3.0.0: 376 | version "3.0.0" 377 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.0.0.tgz#e1b8669c1803ccc50b545e92f8e6e79aa80e0196" 378 | dependencies: 379 | dot-prop "^4.1.0" 380 | graceful-fs "^4.1.2" 381 | mkdirp "^0.5.0" 382 | unique-string "^1.0.0" 383 | write-file-atomic "^1.1.2" 384 | xdg-basedir "^3.0.0" 385 | 386 | conventional-changelog-angular@^1.3.3: 387 | version "1.3.4" 388 | resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.3.4.tgz#7d7cdfbd358948312904d02229a61fd6075cf455" 389 | dependencies: 390 | compare-func "^1.3.1" 391 | github-url-from-git "^1.4.0" 392 | q "^1.4.1" 393 | 394 | conventional-changelog-atom@^0.1.0: 395 | version "0.1.0" 396 | resolved "https://registry.yarnpkg.com/conventional-changelog-atom/-/conventional-changelog-atom-0.1.0.tgz#67a47c66a42b2f8909ef1587c9989ae1de730b92" 397 | dependencies: 398 | q "^1.4.1" 399 | 400 | conventional-changelog-cli@^1.3.1: 401 | version "1.3.1" 402 | resolved "https://registry.yarnpkg.com/conventional-changelog-cli/-/conventional-changelog-cli-1.3.1.tgz#1cd5a9dbae25ffb5ffe67afef1e136eaceefd2d5" 403 | dependencies: 404 | add-stream "^1.0.0" 405 | conventional-changelog "^1.1.3" 406 | lodash "^4.1.0" 407 | meow "^3.7.0" 408 | tempfile "^1.1.1" 409 | 410 | conventional-changelog-codemirror@^0.1.0: 411 | version "0.1.0" 412 | resolved "https://registry.yarnpkg.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.1.0.tgz#7577a591dbf9b538e7a150a7ee62f65a2872b334" 413 | dependencies: 414 | q "^1.4.1" 415 | 416 | conventional-changelog-core@^1.8.0: 417 | version "1.9.0" 418 | resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-1.9.0.tgz#de5dfbc091847656508d4a389e35c9a1bc49e7f4" 419 | dependencies: 420 | conventional-changelog-writer "^1.1.0" 421 | conventional-commits-parser "^1.0.0" 422 | dateformat "^1.0.12" 423 | get-pkg-repo "^1.0.0" 424 | git-raw-commits "^1.2.0" 425 | git-remote-origin-url "^2.0.0" 426 | git-semver-tags "^1.2.0" 427 | lodash "^4.0.0" 428 | normalize-package-data "^2.3.5" 429 | q "^1.4.1" 430 | read-pkg "^1.1.0" 431 | read-pkg-up "^1.0.1" 432 | through2 "^2.0.0" 433 | 434 | conventional-changelog-ember@^0.2.5: 435 | version "0.2.6" 436 | resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-0.2.6.tgz#8b7355419f5127493c4c562473ab2fc792f1c2b6" 437 | dependencies: 438 | q "^1.4.1" 439 | 440 | conventional-changelog-eslint@^0.1.0: 441 | version "0.1.0" 442 | resolved "https://registry.yarnpkg.com/conventional-changelog-eslint/-/conventional-changelog-eslint-0.1.0.tgz#a52411e999e0501ce500b856b0a643d0330907e2" 443 | dependencies: 444 | q "^1.4.1" 445 | 446 | conventional-changelog-express@^0.1.0: 447 | version "0.1.0" 448 | resolved "https://registry.yarnpkg.com/conventional-changelog-express/-/conventional-changelog-express-0.1.0.tgz#55c6c841c811962036c037bdbd964a54ae310fce" 449 | dependencies: 450 | q "^1.4.1" 451 | 452 | conventional-changelog-jquery@^0.1.0: 453 | version "0.1.0" 454 | resolved "https://registry.yarnpkg.com/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz#0208397162e3846986e71273b6c79c5b5f80f510" 455 | dependencies: 456 | q "^1.4.1" 457 | 458 | conventional-changelog-jscs@^0.1.0: 459 | version "0.1.0" 460 | resolved "https://registry.yarnpkg.com/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz#0479eb443cc7d72c58bf0bcf0ef1d444a92f0e5c" 461 | dependencies: 462 | q "^1.4.1" 463 | 464 | conventional-changelog-jshint@^0.1.0: 465 | version "0.1.0" 466 | resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-0.1.0.tgz#00cab8e9a3317487abd94c4d84671342918d2a07" 467 | dependencies: 468 | compare-func "^1.3.1" 469 | q "^1.4.1" 470 | 471 | conventional-changelog-writer@^1.1.0: 472 | version "1.4.1" 473 | resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-1.4.1.tgz#3f4cb4d003ebb56989d30d345893b52a43639c8e" 474 | dependencies: 475 | compare-func "^1.3.1" 476 | conventional-commits-filter "^1.0.0" 477 | dateformat "^1.0.11" 478 | handlebars "^4.0.2" 479 | json-stringify-safe "^5.0.1" 480 | lodash "^4.0.0" 481 | meow "^3.3.0" 482 | semver "^5.0.1" 483 | split "^1.0.0" 484 | through2 "^2.0.0" 485 | 486 | conventional-changelog@^1.1.3: 487 | version "1.1.3" 488 | resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-1.1.3.tgz#26283078ac38c094df2af1604b0a46bbc0165c4d" 489 | dependencies: 490 | conventional-changelog-angular "^1.3.3" 491 | conventional-changelog-atom "^0.1.0" 492 | conventional-changelog-codemirror "^0.1.0" 493 | conventional-changelog-core "^1.8.0" 494 | conventional-changelog-ember "^0.2.5" 495 | conventional-changelog-eslint "^0.1.0" 496 | conventional-changelog-express "^0.1.0" 497 | conventional-changelog-jquery "^0.1.0" 498 | conventional-changelog-jscs "^0.1.0" 499 | conventional-changelog-jshint "^0.1.0" 500 | 501 | conventional-commits-filter@^1.0.0: 502 | version "1.0.0" 503 | resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-1.0.0.tgz#6fc2a659372bc3f2339cf9ffff7e1b0344b93039" 504 | dependencies: 505 | is-subset "^0.1.1" 506 | modify-values "^1.0.0" 507 | 508 | conventional-commits-parser@^1.0.0: 509 | version "1.3.0" 510 | resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-1.3.0.tgz#e327b53194e1a7ad5dc63479ee9099a52b024865" 511 | dependencies: 512 | JSONStream "^1.0.4" 513 | is-text-path "^1.0.0" 514 | lodash "^4.2.1" 515 | meow "^3.3.0" 516 | split2 "^2.0.0" 517 | through2 "^2.0.0" 518 | trim-off-newlines "^1.0.0" 519 | 520 | convert-source-map@^1.3.0: 521 | version "1.3.0" 522 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67" 523 | 524 | core-js@^2.4.0, core-js@^2.4.1: 525 | version "2.4.1" 526 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" 527 | 528 | core-util-is@~1.0.0: 529 | version "1.0.2" 530 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 531 | 532 | cp-file@^3.1.0: 533 | version "3.2.0" 534 | resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-3.2.0.tgz#6f83616254624f0ad58aa4aa8d076f026be7e188" 535 | dependencies: 536 | graceful-fs "^4.1.2" 537 | mkdirp "^0.5.0" 538 | nested-error-stacks "^1.0.1" 539 | object-assign "^4.0.1" 540 | pify "^2.3.0" 541 | pinkie-promise "^2.0.0" 542 | readable-stream "^2.1.4" 543 | 544 | cpy-cli@^1.0.1: 545 | version "1.0.1" 546 | resolved "https://registry.yarnpkg.com/cpy-cli/-/cpy-cli-1.0.1.tgz#67fb5a4a2dec28ca8abff375de4b9e71f6a7561c" 547 | dependencies: 548 | cpy "^4.0.0" 549 | meow "^3.6.0" 550 | 551 | cpy@^4.0.0: 552 | version "4.0.1" 553 | resolved "https://registry.yarnpkg.com/cpy/-/cpy-4.0.1.tgz#b67267eba2f3960ba06a5a61ac94033422833424" 554 | dependencies: 555 | cp-file "^3.1.0" 556 | globby "^4.0.0" 557 | meow "^3.6.0" 558 | nested-error-stacks "^1.0.0" 559 | object-assign "^4.0.1" 560 | pinkie-promise "^2.0.0" 561 | 562 | create-error-class@^3.0.0: 563 | version "3.0.2" 564 | resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" 565 | dependencies: 566 | capture-stack-trace "^1.0.0" 567 | 568 | cross-spawn-async@^2.1.1: 569 | version "2.2.5" 570 | resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" 571 | dependencies: 572 | lru-cache "^4.0.0" 573 | which "^1.2.8" 574 | 575 | cross-spawn@^4: 576 | version "4.0.2" 577 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" 578 | dependencies: 579 | lru-cache "^4.0.1" 580 | which "^1.2.9" 581 | 582 | crypto-random-string@^1.0.0: 583 | version "1.0.0" 584 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" 585 | 586 | currently-unhandled@^0.4.1: 587 | version "0.4.1" 588 | resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" 589 | dependencies: 590 | array-find-index "^1.0.1" 591 | 592 | dargs@^4.0.1: 593 | version "4.1.0" 594 | resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" 595 | dependencies: 596 | number-is-nan "^1.0.0" 597 | 598 | dateformat@^1.0.11, dateformat@^1.0.12: 599 | version "1.0.12" 600 | resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" 601 | dependencies: 602 | get-stdin "^4.0.1" 603 | meow "^3.3.0" 604 | 605 | debug-log@^1.0.1: 606 | version "1.0.1" 607 | resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" 608 | 609 | debug@^2.2.0: 610 | version "2.2.0" 611 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" 612 | dependencies: 613 | ms "0.7.1" 614 | 615 | decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: 616 | version "1.2.0" 617 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 618 | 619 | deep-extend@~0.4.0: 620 | version "0.4.1" 621 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" 622 | 623 | default-require-extensions@^1.0.0: 624 | version "1.0.0" 625 | resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" 626 | dependencies: 627 | strip-bom "^2.0.0" 628 | 629 | detect-indent@^4.0.0: 630 | version "4.0.0" 631 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" 632 | dependencies: 633 | repeating "^2.0.0" 634 | 635 | diff@^3.0.1, diff@^3.1.0: 636 | version "3.2.0" 637 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" 638 | 639 | dot-prop@^3.0.0: 640 | version "3.0.0" 641 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" 642 | dependencies: 643 | is-obj "^1.0.0" 644 | 645 | dot-prop@^4.1.0: 646 | version "4.1.1" 647 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.1.1.tgz#a8493f0b7b5eeec82525b5c7587fa7de7ca859c1" 648 | dependencies: 649 | is-obj "^1.0.0" 650 | 651 | duplexer3@^0.1.4: 652 | version "0.1.4" 653 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 654 | 655 | emojis-list@^2.0.0: 656 | version "2.1.0" 657 | resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" 658 | 659 | enhanced-resolve@^3.0.0: 660 | version "3.1.0" 661 | resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.1.0.tgz#9f4b626f577245edcf4b2ad83d86e17f4f421dec" 662 | dependencies: 663 | graceful-fs "^4.1.2" 664 | memory-fs "^0.4.0" 665 | object-assign "^4.0.1" 666 | tapable "^0.2.5" 667 | 668 | errno@^0.1.3: 669 | version "0.1.4" 670 | resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" 671 | dependencies: 672 | prr "~0.0.0" 673 | 674 | error-ex@^1.2.0: 675 | version "1.3.0" 676 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.0.tgz#e67b43f3e82c96ea3a584ffee0b9fc3325d802d9" 677 | dependencies: 678 | is-arrayish "^0.2.1" 679 | 680 | escape-string-regexp@^1.0.2: 681 | version "1.0.5" 682 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 683 | 684 | esutils@^2.0.2: 685 | version "2.0.2" 686 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 687 | 688 | execa@^0.4.0: 689 | version "0.4.0" 690 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.4.0.tgz#4eb6467a36a095fabb2970ff9d5e3fb7bce6ebc3" 691 | dependencies: 692 | cross-spawn-async "^2.1.1" 693 | is-stream "^1.1.0" 694 | npm-run-path "^1.0.0" 695 | object-assign "^4.0.1" 696 | path-key "^1.0.0" 697 | strip-eof "^1.0.0" 698 | 699 | exit@^0.1.2: 700 | version "0.1.2" 701 | resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" 702 | 703 | expand-brackets@^0.1.4: 704 | version "0.1.5" 705 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 706 | dependencies: 707 | is-posix-bracket "^0.1.0" 708 | 709 | expand-range@^1.8.1: 710 | version "1.8.2" 711 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 712 | dependencies: 713 | fill-range "^2.1.0" 714 | 715 | extglob@^0.3.1: 716 | version "0.3.2" 717 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 718 | dependencies: 719 | is-extglob "^1.0.0" 720 | 721 | filename-regex@^2.0.0: 722 | version "2.0.0" 723 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" 724 | 725 | fill-range@^2.1.0: 726 | version "2.2.3" 727 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 728 | dependencies: 729 | is-number "^2.1.0" 730 | isobject "^2.0.0" 731 | randomatic "^1.1.3" 732 | repeat-element "^1.1.2" 733 | repeat-string "^1.5.2" 734 | 735 | find-cache-dir@^0.1.1: 736 | version "0.1.1" 737 | resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" 738 | dependencies: 739 | commondir "^1.0.1" 740 | mkdirp "^0.5.1" 741 | pkg-dir "^1.0.0" 742 | 743 | find-up@^1.0.0, find-up@^1.1.2: 744 | version "1.1.2" 745 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 746 | dependencies: 747 | path-exists "^2.0.0" 748 | pinkie-promise "^2.0.0" 749 | 750 | findup-sync@~0.3.0: 751 | version "0.3.0" 752 | resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16" 753 | dependencies: 754 | glob "~5.0.0" 755 | 756 | for-in@^0.1.5: 757 | version "0.1.6" 758 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" 759 | 760 | for-own@^0.1.3: 761 | version "0.1.4" 762 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" 763 | dependencies: 764 | for-in "^0.1.5" 765 | 766 | foreground-child@^1.3.3, foreground-child@^1.5.3: 767 | version "1.5.3" 768 | resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.3.tgz#94dd6aba671389867de8e57e99f1c2ecfb15c01a" 769 | dependencies: 770 | cross-spawn "^4" 771 | signal-exit "^3.0.0" 772 | 773 | fs.realpath@^1.0.0: 774 | version "1.0.0" 775 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 776 | 777 | get-caller-file@^1.0.1: 778 | version "1.0.2" 779 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" 780 | 781 | get-pkg-repo@^1.0.0: 782 | version "1.3.0" 783 | resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.3.0.tgz#43c6b4c048b75dd604fc5388edecde557f6335df" 784 | dependencies: 785 | hosted-git-info "^2.1.4" 786 | meow "^3.3.0" 787 | normalize-package-data "^2.3.0" 788 | parse-github-repo-url "^1.3.0" 789 | through2 "^2.0.0" 790 | 791 | get-stdin@^4.0.1: 792 | version "4.0.1" 793 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" 794 | 795 | get-stream@^3.0.0: 796 | version "3.0.0" 797 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 798 | 799 | git-raw-commits@^1.2.0: 800 | version "1.2.0" 801 | resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-1.2.0.tgz#0f3a8bfd99ae0f2d8b9224d58892975e9a52d03c" 802 | dependencies: 803 | dargs "^4.0.1" 804 | lodash.template "^4.0.2" 805 | meow "^3.3.0" 806 | split2 "^2.0.0" 807 | through2 "^2.0.0" 808 | 809 | git-remote-origin-url@^2.0.0: 810 | version "2.0.0" 811 | resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" 812 | dependencies: 813 | gitconfiglocal "^1.0.0" 814 | pify "^2.3.0" 815 | 816 | git-semver-tags@^1.2.0: 817 | version "1.2.0" 818 | resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-1.2.0.tgz#b31fd02c8ab578bd6c9b5cacca5e1c64c1177ac1" 819 | dependencies: 820 | meow "^3.3.0" 821 | semver "^5.0.1" 822 | 823 | gitconfiglocal@^1.0.0: 824 | version "1.0.0" 825 | resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" 826 | dependencies: 827 | ini "^1.3.2" 828 | 829 | github-url-from-git@^1.4.0: 830 | version "1.5.0" 831 | resolved "https://registry.yarnpkg.com/github-url-from-git/-/github-url-from-git-1.5.0.tgz#f985fedcc0a9aa579dc88d7aff068d55cc6251a0" 832 | 833 | glob-base@^0.3.0: 834 | version "0.3.0" 835 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 836 | dependencies: 837 | glob-parent "^2.0.0" 838 | is-glob "^2.0.0" 839 | 840 | glob-parent@^2.0.0: 841 | version "2.0.0" 842 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 843 | dependencies: 844 | is-glob "^2.0.0" 845 | 846 | glob@^6.0.1: 847 | version "6.0.4" 848 | resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" 849 | dependencies: 850 | inflight "^1.0.4" 851 | inherits "2" 852 | minimatch "2 || 3" 853 | once "^1.3.0" 854 | path-is-absolute "^1.0.0" 855 | 856 | glob@^7.0.5, glob@^7.0.6, glob@^7.1.1: 857 | version "7.1.1" 858 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 859 | dependencies: 860 | fs.realpath "^1.0.0" 861 | inflight "^1.0.4" 862 | inherits "2" 863 | minimatch "^3.0.2" 864 | once "^1.3.0" 865 | path-is-absolute "^1.0.0" 866 | 867 | glob@~5.0.0: 868 | version "5.0.15" 869 | resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" 870 | dependencies: 871 | inflight "^1.0.4" 872 | inherits "2" 873 | minimatch "2 || 3" 874 | once "^1.3.0" 875 | path-is-absolute "^1.0.0" 876 | 877 | globals@^9.0.0: 878 | version "9.12.0" 879 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.12.0.tgz#992ce90828c3a55fa8f16fada177adb64664cf9d" 880 | 881 | globby@^4.0.0: 882 | version "4.1.0" 883 | resolved "https://registry.yarnpkg.com/globby/-/globby-4.1.0.tgz#080f54549ec1b82a6c60e631fc82e1211dbe95f8" 884 | dependencies: 885 | array-union "^1.0.1" 886 | arrify "^1.0.0" 887 | glob "^6.0.1" 888 | object-assign "^4.0.1" 889 | pify "^2.0.0" 890 | pinkie-promise "^2.0.0" 891 | 892 | got@^6.7.1: 893 | version "6.7.1" 894 | resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" 895 | dependencies: 896 | create-error-class "^3.0.0" 897 | duplexer3 "^0.1.4" 898 | get-stream "^3.0.0" 899 | is-redirect "^1.0.0" 900 | is-retry-allowed "^1.0.0" 901 | is-stream "^1.0.0" 902 | lowercase-keys "^1.0.0" 903 | safe-buffer "^5.0.1" 904 | timed-out "^4.0.0" 905 | unzip-response "^2.0.1" 906 | url-parse-lax "^1.0.0" 907 | 908 | graceful-fs@^4.1.2: 909 | version "4.1.9" 910 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.9.tgz#baacba37d19d11f9d146d3578bc99958c3787e29" 911 | 912 | handlebars@^4.0.2, handlebars@^4.0.3: 913 | version "4.0.5" 914 | resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.5.tgz#92c6ed6bb164110c50d4d8d0fbddc70806c6f8e7" 915 | dependencies: 916 | async "^1.4.0" 917 | optimist "^0.6.1" 918 | source-map "^0.4.4" 919 | optionalDependencies: 920 | uglify-js "^2.6" 921 | 922 | has-ansi@^2.0.0: 923 | version "2.0.0" 924 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 925 | dependencies: 926 | ansi-regex "^2.0.0" 927 | 928 | has-flag@^1.0.0: 929 | version "1.0.0" 930 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 931 | 932 | hosted-git-info@^2.1.4: 933 | version "2.1.5" 934 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" 935 | 936 | imurmurhash@^0.1.4: 937 | version "0.1.4" 938 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 939 | 940 | indent-string@^2.1.0: 941 | version "2.1.0" 942 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" 943 | dependencies: 944 | repeating "^2.0.0" 945 | 946 | inflight@^1.0.4: 947 | version "1.0.6" 948 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 949 | dependencies: 950 | once "^1.3.0" 951 | wrappy "1" 952 | 953 | inherits@2, inherits@~2.0.1: 954 | version "2.0.3" 955 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 956 | 957 | ini@^1.3.2, ini@~1.3.0: 958 | version "1.3.4" 959 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 960 | 961 | invariant@^2.2.0: 962 | version "2.2.1" 963 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.1.tgz#b097010547668c7e337028ebe816ebe36c8a8d54" 964 | dependencies: 965 | loose-envify "^1.0.0" 966 | 967 | invert-kv@^1.0.0: 968 | version "1.0.0" 969 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" 970 | 971 | is-arrayish@^0.2.1: 972 | version "0.2.1" 973 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 974 | 975 | is-buffer@^1.0.2: 976 | version "1.1.4" 977 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" 978 | 979 | is-builtin-module@^1.0.0: 980 | version "1.0.0" 981 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 982 | dependencies: 983 | builtin-modules "^1.0.0" 984 | 985 | is-dotfile@^1.0.0: 986 | version "1.0.2" 987 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" 988 | 989 | is-equal-shallow@^0.1.3: 990 | version "0.1.3" 991 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 992 | dependencies: 993 | is-primitive "^2.0.0" 994 | 995 | is-extendable@^0.1.1: 996 | version "0.1.1" 997 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 998 | 999 | is-extglob@^1.0.0: 1000 | version "1.0.0" 1001 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 1002 | 1003 | is-finite@^1.0.0: 1004 | version "1.0.2" 1005 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 1006 | dependencies: 1007 | number-is-nan "^1.0.0" 1008 | 1009 | is-fullwidth-code-point@^1.0.0: 1010 | version "1.0.0" 1011 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1012 | dependencies: 1013 | number-is-nan "^1.0.0" 1014 | 1015 | is-fullwidth-code-point@^2.0.0: 1016 | version "2.0.0" 1017 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1018 | 1019 | is-glob@^2.0.0, is-glob@^2.0.1: 1020 | version "2.0.1" 1021 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 1022 | dependencies: 1023 | is-extglob "^1.0.0" 1024 | 1025 | is-npm@^1.0.0: 1026 | version "1.0.0" 1027 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" 1028 | 1029 | is-number@^2.0.2, is-number@^2.1.0: 1030 | version "2.1.0" 1031 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 1032 | dependencies: 1033 | kind-of "^3.0.2" 1034 | 1035 | is-obj@^1.0.0: 1036 | version "1.0.1" 1037 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" 1038 | 1039 | is-posix-bracket@^0.1.0: 1040 | version "0.1.1" 1041 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 1042 | 1043 | is-primitive@^2.0.0: 1044 | version "2.0.0" 1045 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 1046 | 1047 | is-redirect@^1.0.0: 1048 | version "1.0.0" 1049 | resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" 1050 | 1051 | is-retry-allowed@^1.0.0: 1052 | version "1.1.0" 1053 | resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" 1054 | 1055 | is-stream@^1.0.0, is-stream@^1.1.0: 1056 | version "1.1.0" 1057 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 1058 | 1059 | is-subset@^0.1.1: 1060 | version "0.1.1" 1061 | resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" 1062 | 1063 | is-text-path@^1.0.0: 1064 | version "1.0.1" 1065 | resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" 1066 | dependencies: 1067 | text-extensions "^1.0.0" 1068 | 1069 | is-utf8@^0.2.0: 1070 | version "0.2.1" 1071 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 1072 | 1073 | isarray@1.0.0, isarray@~1.0.0: 1074 | version "1.0.0" 1075 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1076 | 1077 | isexe@^1.1.1: 1078 | version "1.1.2" 1079 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" 1080 | 1081 | isobject@^2.0.0: 1082 | version "2.1.0" 1083 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1084 | dependencies: 1085 | isarray "1.0.0" 1086 | 1087 | istanbul-lib-coverage@^1.0.0, istanbul-lib-coverage@^1.0.0-alpha, istanbul-lib-coverage@^1.0.0-alpha.0, istanbul-lib-coverage@^1.0.1: 1088 | version "1.0.1" 1089 | resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.1.tgz#f263efb519c051c5f1f3343034fc40e7b43ff212" 1090 | 1091 | istanbul-lib-hook@^1.0.0: 1092 | version "1.0.4" 1093 | resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.4.tgz#1919debbc195807880041971caf9c7e2be2144d6" 1094 | dependencies: 1095 | append-transform "^0.4.0" 1096 | 1097 | istanbul-lib-instrument@^1.4.2: 1098 | version "1.6.2" 1099 | resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.6.2.tgz#dac644f358f51efd6113536d7070959a0111f73b" 1100 | dependencies: 1101 | babel-generator "^6.18.0" 1102 | babel-template "^6.16.0" 1103 | babel-traverse "^6.18.0" 1104 | babel-types "^6.18.0" 1105 | babylon "^6.13.0" 1106 | istanbul-lib-coverage "^1.0.0" 1107 | semver "^5.3.0" 1108 | 1109 | istanbul-lib-report@^1.0.0-alpha.3: 1110 | version "1.0.0-alpha.3" 1111 | resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.0.0-alpha.3.tgz#32d5f6ec7f33ca3a602209e278b2e6ff143498af" 1112 | dependencies: 1113 | async "^1.4.2" 1114 | istanbul-lib-coverage "^1.0.0-alpha" 1115 | mkdirp "^0.5.1" 1116 | path-parse "^1.0.5" 1117 | rimraf "^2.4.3" 1118 | supports-color "^3.1.2" 1119 | 1120 | istanbul-lib-source-maps@^1.1.0: 1121 | version "1.1.0" 1122 | resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.1.0.tgz#9d429218f35b823560ea300a96ff0c3bbdab785f" 1123 | dependencies: 1124 | istanbul-lib-coverage "^1.0.0-alpha.0" 1125 | mkdirp "^0.5.1" 1126 | rimraf "^2.4.4" 1127 | source-map "^0.5.3" 1128 | 1129 | istanbul-reports@^1.0.0: 1130 | version "1.0.1" 1131 | resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.0.1.tgz#9a17176bc4a6cbebdae52b2f15961d52fa623fbc" 1132 | dependencies: 1133 | handlebars "^4.0.3" 1134 | 1135 | jasmine-core@~2.5.2: 1136 | version "2.5.2" 1137 | resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.5.2.tgz#6f61bd79061e27f43e6f9355e44b3c6cab6ff297" 1138 | 1139 | jasmine@^2.5.3: 1140 | version "2.5.3" 1141 | resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-2.5.3.tgz#5441f254e1fc2269deb1dfd93e0e57d565ff4d22" 1142 | dependencies: 1143 | exit "^0.1.2" 1144 | glob "^7.0.6" 1145 | jasmine-core "~2.5.2" 1146 | 1147 | js-tokens@^1.0.1: 1148 | version "1.0.3" 1149 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-1.0.3.tgz#14e56eb68c8f1a92c43d59f5014ec29dc20f2ae1" 1150 | 1151 | js-tokens@^3.0.0: 1152 | version "3.0.1" 1153 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" 1154 | 1155 | jsesc@^1.3.0: 1156 | version "1.3.0" 1157 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" 1158 | 1159 | json-stringify-safe@^5.0.1: 1160 | version "5.0.1" 1161 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1162 | 1163 | json5@^0.5.0: 1164 | version "0.5.0" 1165 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.0.tgz#9b20715b026cbe3778fd769edccd822d8332a5b2" 1166 | 1167 | jsonparse@^1.2.0: 1168 | version "1.3.0" 1169 | resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.0.tgz#85fc245b1d9259acc6941960b905adf64e7de0e8" 1170 | 1171 | kind-of@^3.0.2: 1172 | version "3.0.4" 1173 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.0.4.tgz#7b8ecf18a4e17f8269d73b501c9f232c96887a74" 1174 | dependencies: 1175 | is-buffer "^1.0.2" 1176 | 1177 | latest-version@^3.0.0: 1178 | version "3.0.0" 1179 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.0.0.tgz#3104f008c0c391084107f85a344bc61e38970649" 1180 | dependencies: 1181 | package-json "^3.0.0" 1182 | 1183 | lazy-cache@^1.0.3: 1184 | version "1.0.4" 1185 | resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" 1186 | 1187 | lazy-req@^2.0.0: 1188 | version "2.0.0" 1189 | resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-2.0.0.tgz#c9450a363ecdda2e6f0c70132ad4f37f8f06f2b4" 1190 | 1191 | lcid@^1.0.0: 1192 | version "1.0.0" 1193 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 1194 | dependencies: 1195 | invert-kv "^1.0.0" 1196 | 1197 | load-json-file@^1.0.0: 1198 | version "1.1.0" 1199 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 1200 | dependencies: 1201 | graceful-fs "^4.1.2" 1202 | parse-json "^2.2.0" 1203 | pify "^2.0.0" 1204 | pinkie-promise "^2.0.0" 1205 | strip-bom "^2.0.0" 1206 | 1207 | loader-utils@^1.0.2: 1208 | version "1.1.0" 1209 | resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" 1210 | dependencies: 1211 | big.js "^3.1.3" 1212 | emojis-list "^2.0.0" 1213 | json5 "^0.5.0" 1214 | 1215 | lodash._reinterpolate@~3.0.0: 1216 | version "3.0.0" 1217 | resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" 1218 | 1219 | lodash.template@^4.0.2: 1220 | version "4.4.0" 1221 | resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" 1222 | dependencies: 1223 | lodash._reinterpolate "~3.0.0" 1224 | lodash.templatesettings "^4.0.0" 1225 | 1226 | lodash.templatesettings@^4.0.0: 1227 | version "4.1.0" 1228 | resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" 1229 | dependencies: 1230 | lodash._reinterpolate "~3.0.0" 1231 | 1232 | lodash@^4.0.0, lodash@^4.1.0, lodash@^4.2.0, lodash@^4.2.1: 1233 | version "4.16.4" 1234 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.4.tgz#01ce306b9bad1319f2a5528674f88297aeb70127" 1235 | 1236 | longest@^1.0.1: 1237 | version "1.0.1" 1238 | resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" 1239 | 1240 | loose-envify@^1.0.0: 1241 | version "1.2.0" 1242 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.2.0.tgz#69a65aad3de542cf4ee0f4fe74e8e33c709ccb0f" 1243 | dependencies: 1244 | js-tokens "^1.0.1" 1245 | 1246 | loud-rejection@^1.0.0: 1247 | version "1.6.0" 1248 | resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" 1249 | dependencies: 1250 | currently-unhandled "^0.4.1" 1251 | signal-exit "^3.0.0" 1252 | 1253 | lowercase-keys@^1.0.0: 1254 | version "1.0.0" 1255 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" 1256 | 1257 | lru-cache@^4.0.0, lru-cache@^4.0.1: 1258 | version "4.0.1" 1259 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.1.tgz#1343955edaf2e37d9b9e7ee7241e27c4b9fb72be" 1260 | dependencies: 1261 | pseudomap "^1.0.1" 1262 | yallist "^2.0.0" 1263 | 1264 | make-error@^1.1.1: 1265 | version "1.2.1" 1266 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.2.1.tgz#9a6dfb4844423b9f145806728d05c6e935670e75" 1267 | 1268 | map-obj@^1.0.0, map-obj@^1.0.1: 1269 | version "1.0.1" 1270 | resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" 1271 | 1272 | md5-hex@^1.2.0: 1273 | version "1.3.0" 1274 | resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-1.3.0.tgz#d2c4afe983c4370662179b8cad145219135046c4" 1275 | dependencies: 1276 | md5-o-matic "^0.1.1" 1277 | 1278 | md5-o-matic@^0.1.1: 1279 | version "0.1.1" 1280 | resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" 1281 | 1282 | memory-fs@^0.4.0: 1283 | version "0.4.1" 1284 | resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" 1285 | dependencies: 1286 | errno "^0.1.3" 1287 | readable-stream "^2.0.1" 1288 | 1289 | meow@^3.3.0, meow@^3.6.0, meow@^3.7.0: 1290 | version "3.7.0" 1291 | resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" 1292 | dependencies: 1293 | camelcase-keys "^2.0.0" 1294 | decamelize "^1.1.2" 1295 | loud-rejection "^1.0.0" 1296 | map-obj "^1.0.1" 1297 | minimist "^1.1.3" 1298 | normalize-package-data "^2.3.4" 1299 | object-assign "^4.0.1" 1300 | read-pkg-up "^1.0.1" 1301 | redent "^1.0.0" 1302 | trim-newlines "^1.0.0" 1303 | 1304 | merge-source-map@^1.0.2: 1305 | version "1.0.3" 1306 | resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.3.tgz#da1415f2722a5119db07b14c4f973410863a2abf" 1307 | dependencies: 1308 | source-map "^0.5.3" 1309 | 1310 | micromatch@^2.3.11: 1311 | version "2.3.11" 1312 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 1313 | dependencies: 1314 | arr-diff "^2.0.0" 1315 | array-unique "^0.2.1" 1316 | braces "^1.8.2" 1317 | expand-brackets "^0.1.4" 1318 | extglob "^0.3.1" 1319 | filename-regex "^2.0.0" 1320 | is-extglob "^1.0.0" 1321 | is-glob "^2.0.1" 1322 | kind-of "^3.0.2" 1323 | normalize-path "^2.0.1" 1324 | object.omit "^2.0.0" 1325 | parse-glob "^3.0.4" 1326 | regex-cache "^0.4.2" 1327 | 1328 | "minimatch@2 || 3", minimatch@^3.0.2: 1329 | version "3.0.3" 1330 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" 1331 | dependencies: 1332 | brace-expansion "^1.0.0" 1333 | 1334 | minimist@0.0.8, minimist@~0.0.1: 1335 | version "0.0.8" 1336 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1337 | 1338 | minimist@^1.1.3, minimist@^1.2.0: 1339 | version "1.2.0" 1340 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1341 | 1342 | mkdirp@^0.5.0, mkdirp@^0.5.1: 1343 | version "0.5.1" 1344 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1345 | dependencies: 1346 | minimist "0.0.8" 1347 | 1348 | modify-values@^1.0.0: 1349 | version "1.0.0" 1350 | resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.0.tgz#e2b6cdeb9ce19f99317a53722f3dbf5df5eaaab2" 1351 | 1352 | ms@0.7.1: 1353 | version "0.7.1" 1354 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" 1355 | 1356 | nested-error-stacks@^1.0.0, nested-error-stacks@^1.0.1: 1357 | version "1.0.2" 1358 | resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-1.0.2.tgz#19f619591519f096769a5ba9a86e6eeec823c3cf" 1359 | dependencies: 1360 | inherits "~2.0.1" 1361 | 1362 | normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5: 1363 | version "2.3.5" 1364 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.5.tgz#8d924f142960e1777e7ffe170543631cc7cb02df" 1365 | dependencies: 1366 | hosted-git-info "^2.1.4" 1367 | is-builtin-module "^1.0.0" 1368 | semver "2 || 3 || 4 || 5" 1369 | validate-npm-package-license "^3.0.1" 1370 | 1371 | normalize-path@^2.0.1: 1372 | version "2.0.1" 1373 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" 1374 | 1375 | npm-run-path@^1.0.0: 1376 | version "1.0.0" 1377 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-1.0.0.tgz#f5c32bf595fe81ae927daec52e82f8b000ac3c8f" 1378 | dependencies: 1379 | path-key "^1.0.0" 1380 | 1381 | number-is-nan@^1.0.0: 1382 | version "1.0.1" 1383 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1384 | 1385 | nyc@^10.1.2: 1386 | version "10.1.2" 1387 | resolved "https://registry.yarnpkg.com/nyc/-/nyc-10.1.2.tgz#ea7acaa20a235210101604f4e7d56d28453b0274" 1388 | dependencies: 1389 | archy "^1.0.0" 1390 | arrify "^1.0.1" 1391 | caching-transform "^1.0.0" 1392 | convert-source-map "^1.3.0" 1393 | debug-log "^1.0.1" 1394 | default-require-extensions "^1.0.0" 1395 | find-cache-dir "^0.1.1" 1396 | find-up "^1.1.2" 1397 | foreground-child "^1.5.3" 1398 | glob "^7.0.6" 1399 | istanbul-lib-coverage "^1.0.1" 1400 | istanbul-lib-hook "^1.0.0" 1401 | istanbul-lib-instrument "^1.4.2" 1402 | istanbul-lib-report "^1.0.0-alpha.3" 1403 | istanbul-lib-source-maps "^1.1.0" 1404 | istanbul-reports "^1.0.0" 1405 | md5-hex "^1.2.0" 1406 | merge-source-map "^1.0.2" 1407 | micromatch "^2.3.11" 1408 | mkdirp "^0.5.0" 1409 | resolve-from "^2.0.0" 1410 | rimraf "^2.5.4" 1411 | signal-exit "^3.0.1" 1412 | spawn-wrap "1.2.4" 1413 | test-exclude "^3.3.0" 1414 | yargs "^6.6.0" 1415 | yargs-parser "^4.0.2" 1416 | 1417 | object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: 1418 | version "4.1.1" 1419 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1420 | 1421 | object.omit@^2.0.0: 1422 | version "2.0.0" 1423 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.0.tgz#868597333d54e60662940bb458605dd6ae12fe94" 1424 | dependencies: 1425 | for-own "^0.1.3" 1426 | is-extendable "^0.1.1" 1427 | 1428 | once@^1.3.0: 1429 | version "1.4.0" 1430 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1431 | dependencies: 1432 | wrappy "1" 1433 | 1434 | optimist@^0.6.1, optimist@~0.6.0: 1435 | version "0.6.1" 1436 | resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" 1437 | dependencies: 1438 | minimist "~0.0.1" 1439 | wordwrap "~0.0.2" 1440 | 1441 | os-homedir@^1.0.1: 1442 | version "1.0.2" 1443 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1444 | 1445 | os-locale@^1.4.0: 1446 | version "1.4.0" 1447 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" 1448 | dependencies: 1449 | lcid "^1.0.0" 1450 | 1451 | os-tmpdir@^1.0.0: 1452 | version "1.0.2" 1453 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1454 | 1455 | package-json@^3.0.0: 1456 | version "3.1.0" 1457 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-3.1.0.tgz#ce281900fe8052150cc6709c6c006c18fdb2f379" 1458 | dependencies: 1459 | got "^6.7.1" 1460 | registry-auth-token "^3.0.1" 1461 | registry-url "^3.0.3" 1462 | semver "^5.1.0" 1463 | 1464 | parse-github-repo-url@^1.3.0: 1465 | version "1.4.0" 1466 | resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.0.tgz#286c53e2c9962e0641649ee3ac9508fca4dd959c" 1467 | 1468 | parse-glob@^3.0.4: 1469 | version "3.0.4" 1470 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 1471 | dependencies: 1472 | glob-base "^0.3.0" 1473 | is-dotfile "^1.0.0" 1474 | is-extglob "^1.0.0" 1475 | is-glob "^2.0.0" 1476 | 1477 | parse-json@^2.2.0: 1478 | version "2.2.0" 1479 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1480 | dependencies: 1481 | error-ex "^1.2.0" 1482 | 1483 | parse5@^3.0.1: 1484 | version "3.0.2" 1485 | resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.2.tgz#05eff57f0ef4577fb144a79f8b9a967a6cc44510" 1486 | dependencies: 1487 | "@types/node" "^6.0.46" 1488 | 1489 | path-exists@^2.0.0: 1490 | version "2.1.0" 1491 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 1492 | dependencies: 1493 | pinkie-promise "^2.0.0" 1494 | 1495 | path-is-absolute@^1.0.0: 1496 | version "1.0.1" 1497 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1498 | 1499 | path-key@^1.0.0: 1500 | version "1.0.0" 1501 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-1.0.0.tgz#5d53d578019646c0d68800db4e146e6bdc2ac7af" 1502 | 1503 | path-parse@^1.0.5: 1504 | version "1.0.5" 1505 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" 1506 | 1507 | path-type@^1.0.0: 1508 | version "1.1.0" 1509 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 1510 | dependencies: 1511 | graceful-fs "^4.1.2" 1512 | pify "^2.0.0" 1513 | pinkie-promise "^2.0.0" 1514 | 1515 | pify@^2.0.0, pify@^2.3.0: 1516 | version "2.3.0" 1517 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1518 | 1519 | pinkie-promise@^2.0.0: 1520 | version "2.0.1" 1521 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1522 | dependencies: 1523 | pinkie "^2.0.0" 1524 | 1525 | pinkie@^2.0.0: 1526 | version "2.0.4" 1527 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1528 | 1529 | pkg-dir@^1.0.0: 1530 | version "1.0.0" 1531 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" 1532 | dependencies: 1533 | find-up "^1.0.0" 1534 | 1535 | prepend-http@^1.0.1: 1536 | version "1.0.4" 1537 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" 1538 | 1539 | preserve@^0.2.0: 1540 | version "0.2.0" 1541 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 1542 | 1543 | process-nextick-args@~1.0.6: 1544 | version "1.0.7" 1545 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1546 | 1547 | prr@~0.0.0: 1548 | version "0.0.0" 1549 | resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" 1550 | 1551 | pseudomap@^1.0.1: 1552 | version "1.0.2" 1553 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1554 | 1555 | q@^1.4.1: 1556 | version "1.5.0" 1557 | resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" 1558 | 1559 | randomatic@^1.1.3: 1560 | version "1.1.5" 1561 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.5.tgz#5e9ef5f2d573c67bd2b8124ae90b5156e457840b" 1562 | dependencies: 1563 | is-number "^2.0.2" 1564 | kind-of "^3.0.2" 1565 | 1566 | rc@^1.0.1, rc@^1.1.6: 1567 | version "1.1.7" 1568 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.7.tgz#c5ea564bb07aff9fd3a5b32e906c1d3a65940fea" 1569 | dependencies: 1570 | deep-extend "~0.4.0" 1571 | ini "~1.3.0" 1572 | minimist "^1.2.0" 1573 | strip-json-comments "~2.0.1" 1574 | 1575 | read-pkg-up@^1.0.1: 1576 | version "1.0.1" 1577 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 1578 | dependencies: 1579 | find-up "^1.0.0" 1580 | read-pkg "^1.0.0" 1581 | 1582 | read-pkg@^1.0.0, read-pkg@^1.1.0: 1583 | version "1.1.0" 1584 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 1585 | dependencies: 1586 | load-json-file "^1.0.0" 1587 | normalize-package-data "^2.3.2" 1588 | path-type "^1.0.0" 1589 | 1590 | readable-stream@^2.0.1, readable-stream@^2.1.4, readable-stream@^2.1.5: 1591 | version "2.1.5" 1592 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" 1593 | dependencies: 1594 | buffer-shims "^1.0.0" 1595 | core-util-is "~1.0.0" 1596 | inherits "~2.0.1" 1597 | isarray "~1.0.0" 1598 | process-nextick-args "~1.0.6" 1599 | string_decoder "~0.10.x" 1600 | util-deprecate "~1.0.1" 1601 | 1602 | redent@^1.0.0: 1603 | version "1.0.0" 1604 | resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" 1605 | dependencies: 1606 | indent-string "^2.1.0" 1607 | strip-indent "^1.0.1" 1608 | 1609 | reflect-metadata@^0.1.2: 1610 | version "0.1.8" 1611 | resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.8.tgz#72426d570b60776e3688968bd5ab9537a15cecf6" 1612 | 1613 | regenerator-runtime@^0.9.5: 1614 | version "0.9.5" 1615 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz#403d6d40a4bdff9c330dd9392dcbb2d9a8bba1fc" 1616 | 1617 | regex-cache@^0.4.2: 1618 | version "0.4.3" 1619 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" 1620 | dependencies: 1621 | is-equal-shallow "^0.1.3" 1622 | is-primitive "^2.0.0" 1623 | 1624 | registry-auth-token@^3.0.1: 1625 | version "3.1.0" 1626 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.1.0.tgz#997c08256e0c7999837b90e944db39d8a790276b" 1627 | dependencies: 1628 | rc "^1.1.6" 1629 | 1630 | registry-url@^3.0.3: 1631 | version "3.1.0" 1632 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" 1633 | dependencies: 1634 | rc "^1.0.1" 1635 | 1636 | repeat-element@^1.1.2: 1637 | version "1.1.2" 1638 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 1639 | 1640 | repeat-string@^1.5.2: 1641 | version "1.6.1" 1642 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1643 | 1644 | repeating@^2.0.0: 1645 | version "2.0.1" 1646 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 1647 | dependencies: 1648 | is-finite "^1.0.0" 1649 | 1650 | require-directory@^2.1.1: 1651 | version "2.1.1" 1652 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1653 | 1654 | require-main-filename@^1.0.1: 1655 | version "1.0.1" 1656 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 1657 | 1658 | resolve-from@^2.0.0: 1659 | version "2.0.0" 1660 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" 1661 | 1662 | resolve@^1.1.7: 1663 | version "1.1.7" 1664 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" 1665 | 1666 | right-align@^0.1.1: 1667 | version "0.1.3" 1668 | resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" 1669 | dependencies: 1670 | align-text "^0.1.1" 1671 | 1672 | rimraf@^2.3.3, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.4, rimraf@^2.6.1: 1673 | version "2.6.1" 1674 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" 1675 | dependencies: 1676 | glob "^7.0.5" 1677 | 1678 | rollup@^0.41.6: 1679 | version "0.41.6" 1680 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.41.6.tgz#e0d05497877a398c104d816d2733a718a7a94e2a" 1681 | dependencies: 1682 | source-map-support "^0.4.0" 1683 | 1684 | rxjs@^5.2.0: 1685 | version "5.2.0" 1686 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.2.0.tgz#db537de8767c05fa73721587a29e0085307d318b" 1687 | dependencies: 1688 | symbol-observable "^1.0.1" 1689 | 1690 | safe-buffer@^5.0.1: 1691 | version "5.0.1" 1692 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" 1693 | 1694 | semver-diff@^2.0.0: 1695 | version "2.1.0" 1696 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" 1697 | dependencies: 1698 | semver "^5.0.3" 1699 | 1700 | "semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0: 1701 | version "5.3.0" 1702 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 1703 | 1704 | set-blocking@^2.0.0: 1705 | version "2.0.0" 1706 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1707 | 1708 | signal-exit@^2.0.0: 1709 | version "2.1.2" 1710 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-2.1.2.tgz#375879b1f92ebc3b334480d038dc546a6d558564" 1711 | 1712 | signal-exit@^3.0.0, signal-exit@^3.0.1: 1713 | version "3.0.1" 1714 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.1.tgz#5a4c884992b63a7acd9badb7894c3ee9cfccad81" 1715 | 1716 | slide@^1.1.5: 1717 | version "1.1.6" 1718 | resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" 1719 | 1720 | source-map-support@^0.4.0, source-map-support@^0.4.2: 1721 | version "0.4.5" 1722 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.5.tgz#4438df4219e1b3c7feb674614b4c67f9722db1e4" 1723 | dependencies: 1724 | source-map "^0.5.3" 1725 | 1726 | source-map@0.1.34: 1727 | version "0.1.34" 1728 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.34.tgz#a7cfe89aec7b1682c3b198d0acfb47d7d090566b" 1729 | dependencies: 1730 | amdefine ">=0.0.4" 1731 | 1732 | source-map@^0.4.4: 1733 | version "0.4.4" 1734 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" 1735 | dependencies: 1736 | amdefine ">=0.0.4" 1737 | 1738 | source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: 1739 | version "0.5.6" 1740 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" 1741 | 1742 | spawn-wrap@1.2.4: 1743 | version "1.2.4" 1744 | resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.2.4.tgz#920eb211a769c093eebfbd5b0e7a5d2e68ab2e40" 1745 | dependencies: 1746 | foreground-child "^1.3.3" 1747 | mkdirp "^0.5.0" 1748 | os-homedir "^1.0.1" 1749 | rimraf "^2.3.3" 1750 | signal-exit "^2.0.0" 1751 | which "^1.2.4" 1752 | 1753 | spdx-correct@~1.0.0: 1754 | version "1.0.2" 1755 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" 1756 | dependencies: 1757 | spdx-license-ids "^1.0.2" 1758 | 1759 | spdx-expression-parse@~1.0.0: 1760 | version "1.0.4" 1761 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" 1762 | 1763 | spdx-license-ids@^1.0.2: 1764 | version "1.2.2" 1765 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" 1766 | 1767 | split2@^2.0.0: 1768 | version "2.1.1" 1769 | resolved "https://registry.yarnpkg.com/split2/-/split2-2.1.1.tgz#7a1f551e176a90ecd3345f7246a0cfe175ef4fd0" 1770 | dependencies: 1771 | through2 "^2.0.2" 1772 | 1773 | split@^1.0.0: 1774 | version "1.0.0" 1775 | resolved "https://registry.yarnpkg.com/split/-/split-1.0.0.tgz#c4395ce683abcd254bc28fe1dabb6e5c27dcffae" 1776 | dependencies: 1777 | through "2" 1778 | 1779 | string-width@^1.0.1, string-width@^1.0.2: 1780 | version "1.0.2" 1781 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1782 | dependencies: 1783 | code-point-at "^1.0.0" 1784 | is-fullwidth-code-point "^1.0.0" 1785 | strip-ansi "^3.0.0" 1786 | 1787 | string-width@^2.0.0: 1788 | version "2.0.0" 1789 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" 1790 | dependencies: 1791 | is-fullwidth-code-point "^2.0.0" 1792 | strip-ansi "^3.0.0" 1793 | 1794 | string_decoder@~0.10.x: 1795 | version "0.10.31" 1796 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 1797 | 1798 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1799 | version "3.0.1" 1800 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1801 | dependencies: 1802 | ansi-regex "^2.0.0" 1803 | 1804 | strip-bom@^2.0.0: 1805 | version "2.0.0" 1806 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 1807 | dependencies: 1808 | is-utf8 "^0.2.0" 1809 | 1810 | strip-bom@^3.0.0: 1811 | version "3.0.0" 1812 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1813 | 1814 | strip-eof@^1.0.0: 1815 | version "1.0.0" 1816 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 1817 | 1818 | strip-indent@^1.0.1: 1819 | version "1.0.1" 1820 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" 1821 | dependencies: 1822 | get-stdin "^4.0.1" 1823 | 1824 | strip-json-comments@^2.0.0, strip-json-comments@~2.0.1: 1825 | version "2.0.1" 1826 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1827 | 1828 | supports-color@^2.0.0: 1829 | version "2.0.0" 1830 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1831 | 1832 | supports-color@^3.1.2: 1833 | version "3.1.2" 1834 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" 1835 | dependencies: 1836 | has-flag "^1.0.0" 1837 | 1838 | symbol-observable@^1.0.1: 1839 | version "1.0.4" 1840 | resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" 1841 | 1842 | tapable@^0.2.5: 1843 | version "0.2.6" 1844 | resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.6.tgz#206be8e188860b514425375e6f1ae89bfb01fd8d" 1845 | 1846 | tempfile@^1.1.1: 1847 | version "1.1.1" 1848 | resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-1.1.1.tgz#5bcc4eaecc4ab2c707d8bc11d99ccc9a2cb287f2" 1849 | dependencies: 1850 | os-tmpdir "^1.0.0" 1851 | uuid "^2.0.1" 1852 | 1853 | term-size@^0.1.0: 1854 | version "0.1.1" 1855 | resolved "https://registry.yarnpkg.com/term-size/-/term-size-0.1.1.tgz#87360b96396cab5760963714cda0d0cbeecad9ca" 1856 | dependencies: 1857 | execa "^0.4.0" 1858 | 1859 | test-exclude@^3.3.0: 1860 | version "3.3.0" 1861 | resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-3.3.0.tgz#7a17ca1239988c98367b0621456dbb7d4bc38977" 1862 | dependencies: 1863 | arrify "^1.0.1" 1864 | micromatch "^2.3.11" 1865 | object-assign "^4.1.0" 1866 | read-pkg-up "^1.0.1" 1867 | require-main-filename "^1.0.1" 1868 | 1869 | text-extensions@^1.0.0: 1870 | version "1.4.0" 1871 | resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.4.0.tgz#c385d2e80879fe6ef97893e1709d88d9453726e9" 1872 | 1873 | through2@^2.0.0, through2@^2.0.2: 1874 | version "2.0.3" 1875 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" 1876 | dependencies: 1877 | readable-stream "^2.1.5" 1878 | xtend "~4.0.1" 1879 | 1880 | through@2, "through@>=2.2.7 <3": 1881 | version "2.3.8" 1882 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1883 | 1884 | timed-out@^4.0.0: 1885 | version "4.0.1" 1886 | resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" 1887 | 1888 | to-fast-properties@^1.0.1: 1889 | version "1.0.2" 1890 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" 1891 | 1892 | trim-newlines@^1.0.0: 1893 | version "1.0.0" 1894 | resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" 1895 | 1896 | trim-off-newlines@^1.0.0: 1897 | version "1.0.1" 1898 | resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" 1899 | 1900 | ts-loader@^2.0.3: 1901 | version "2.0.3" 1902 | resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-2.0.3.tgz#89b8c87598f048df065766e07e1538f0eaeb1165" 1903 | dependencies: 1904 | colors "^1.0.3" 1905 | enhanced-resolve "^3.0.0" 1906 | loader-utils "^1.0.2" 1907 | semver "^5.0.1" 1908 | 1909 | ts-node@^3.0.2: 1910 | version "3.0.2" 1911 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-3.0.2.tgz#cfc9516c831b920d7efbe16005915062b1294f8c" 1912 | dependencies: 1913 | arrify "^1.0.0" 1914 | chalk "^1.1.1" 1915 | diff "^3.1.0" 1916 | make-error "^1.1.1" 1917 | minimist "^1.2.0" 1918 | mkdirp "^0.5.1" 1919 | source-map-support "^0.4.0" 1920 | tsconfig "^6.0.0" 1921 | v8flags "^2.0.11" 1922 | yn "^1.2.0" 1923 | 1924 | tsconfig@^6.0.0: 1925 | version "6.0.0" 1926 | resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-6.0.0.tgz#6b0e8376003d7af1864f8df8f89dd0059ffcd032" 1927 | dependencies: 1928 | strip-bom "^3.0.0" 1929 | strip-json-comments "^2.0.0" 1930 | 1931 | tsickle@^0.21.0: 1932 | version "0.21.6" 1933 | resolved "https://registry.yarnpkg.com/tsickle/-/tsickle-0.21.6.tgz#53b01b979c5c13fdb13afb3fb958177e5991588d" 1934 | dependencies: 1935 | minimist "^1.2.0" 1936 | mkdirp "^0.5.1" 1937 | source-map "^0.5.6" 1938 | source-map-support "^0.4.2" 1939 | 1940 | tslint-loader@^3.4.3: 1941 | version "3.4.3" 1942 | resolved "https://registry.yarnpkg.com/tslint-loader/-/tslint-loader-3.4.3.tgz#ac1eaf57d35eff383d0b008fa67b0813e8b51c54" 1943 | dependencies: 1944 | loader-utils "^1.0.2" 1945 | mkdirp "^0.5.1" 1946 | object-assign "^4.1.1" 1947 | rimraf "^2.4.4" 1948 | semver "^5.3.0" 1949 | 1950 | tslint@^4.5.1: 1951 | version "4.5.1" 1952 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-4.5.1.tgz#05356871bef23a434906734006fc188336ba824b" 1953 | dependencies: 1954 | babel-code-frame "^6.20.0" 1955 | colors "^1.1.2" 1956 | diff "^3.0.1" 1957 | findup-sync "~0.3.0" 1958 | glob "^7.1.1" 1959 | optimist "~0.6.0" 1960 | resolve "^1.1.7" 1961 | tsutils "^1.1.0" 1962 | update-notifier "^2.0.0" 1963 | 1964 | tsutils@^1.1.0: 1965 | version "1.4.0" 1966 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-1.4.0.tgz#84f8a83df9967d35bf1ff3aa48c7339593d64e19" 1967 | 1968 | typescript@^2.2.1: 1969 | version "2.2.1" 1970 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.2.1.tgz#4862b662b988a4c8ff691cc7969622d24db76ae9" 1971 | 1972 | uglify-js@^2.6: 1973 | version "2.7.4" 1974 | resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.4.tgz#a295a0de12b6a650c031c40deb0dc40b14568bd2" 1975 | dependencies: 1976 | async "~0.2.6" 1977 | source-map "~0.5.1" 1978 | uglify-to-browserify "~1.0.0" 1979 | yargs "~3.10.0" 1980 | 1981 | uglify-to-browserify@~1.0.0: 1982 | version "1.0.2" 1983 | resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" 1984 | 1985 | uglifyjs@^2.4.10: 1986 | version "2.4.10" 1987 | resolved "https://registry.yarnpkg.com/uglifyjs/-/uglifyjs-2.4.10.tgz#632927319fa6a3da3fc91f9773ac27bfe6c3ee92" 1988 | dependencies: 1989 | async "~0.2.6" 1990 | source-map "0.1.34" 1991 | uglify-to-browserify "~1.0.0" 1992 | yargs "~1.3.3" 1993 | 1994 | unique-string@^1.0.0: 1995 | version "1.0.0" 1996 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" 1997 | dependencies: 1998 | crypto-random-string "^1.0.0" 1999 | 2000 | unzip-response@^2.0.1: 2001 | version "2.0.1" 2002 | resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" 2003 | 2004 | update-notifier@^2.0.0: 2005 | version "2.1.0" 2006 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.1.0.tgz#ec0c1e53536b76647a24b77cb83966d9315123d9" 2007 | dependencies: 2008 | boxen "^1.0.0" 2009 | chalk "^1.0.0" 2010 | configstore "^3.0.0" 2011 | is-npm "^1.0.0" 2012 | latest-version "^3.0.0" 2013 | lazy-req "^2.0.0" 2014 | semver-diff "^2.0.0" 2015 | xdg-basedir "^3.0.0" 2016 | 2017 | url-parse-lax@^1.0.0: 2018 | version "1.0.0" 2019 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" 2020 | dependencies: 2021 | prepend-http "^1.0.1" 2022 | 2023 | user-home@^1.1.1: 2024 | version "1.1.1" 2025 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" 2026 | 2027 | util-deprecate@~1.0.1: 2028 | version "1.0.2" 2029 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2030 | 2031 | uuid@^2.0.1: 2032 | version "2.0.3" 2033 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" 2034 | 2035 | v8flags@^2.0.11: 2036 | version "2.0.11" 2037 | resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.0.11.tgz#bca8f30f0d6d60612cc2c00641e6962d42ae6881" 2038 | dependencies: 2039 | user-home "^1.1.1" 2040 | 2041 | validate-npm-package-license@^3.0.1: 2042 | version "3.0.1" 2043 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" 2044 | dependencies: 2045 | spdx-correct "~1.0.0" 2046 | spdx-expression-parse "~1.0.0" 2047 | 2048 | which-module@^1.0.0: 2049 | version "1.0.0" 2050 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" 2051 | 2052 | which@^1.2.4, which@^1.2.8, which@^1.2.9: 2053 | version "1.2.11" 2054 | resolved "https://registry.yarnpkg.com/which/-/which-1.2.11.tgz#c8b2eeea6b8c1659fa7c1dd4fdaabe9533dc5e8b" 2055 | dependencies: 2056 | isexe "^1.1.1" 2057 | 2058 | widest-line@^1.0.0: 2059 | version "1.0.0" 2060 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" 2061 | dependencies: 2062 | string-width "^1.0.1" 2063 | 2064 | window-size@0.1.0: 2065 | version "0.1.0" 2066 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" 2067 | 2068 | wordwrap@0.0.2: 2069 | version "0.0.2" 2070 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" 2071 | 2072 | wordwrap@~0.0.2: 2073 | version "0.0.3" 2074 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" 2075 | 2076 | wrap-ansi@^2.0.0: 2077 | version "2.0.0" 2078 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.0.0.tgz#7d30f8f873f9a5bbc3a64dabc8d177e071ae426f" 2079 | dependencies: 2080 | string-width "^1.0.1" 2081 | 2082 | wrappy@1: 2083 | version "1.0.2" 2084 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2085 | 2086 | write-file-atomic@^1.1.2, write-file-atomic@^1.1.4: 2087 | version "1.2.0" 2088 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.2.0.tgz#14c66d4e4cb3ca0565c28cf3b7a6f3e4d5938fab" 2089 | dependencies: 2090 | graceful-fs "^4.1.2" 2091 | imurmurhash "^0.1.4" 2092 | slide "^1.1.5" 2093 | 2094 | xdg-basedir@^3.0.0: 2095 | version "3.0.0" 2096 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" 2097 | 2098 | xhr2@^0.1.4: 2099 | version "0.1.4" 2100 | resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.4.tgz#7f87658847716db5026323812f818cadab387a5f" 2101 | 2102 | xtend@~4.0.1: 2103 | version "4.0.1" 2104 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 2105 | 2106 | y18n@^3.2.1: 2107 | version "3.2.1" 2108 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" 2109 | 2110 | yallist@^2.0.0: 2111 | version "2.0.0" 2112 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.0.0.tgz#306c543835f09ee1a4cb23b7bce9ab341c91cdd4" 2113 | 2114 | yargs-parser@^4.0.2: 2115 | version "4.0.2" 2116 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.0.2.tgz#7f7173a8c7cca1d81dc7c18692fc07c2c2e2b1e0" 2117 | dependencies: 2118 | camelcase "^3.0.0" 2119 | 2120 | yargs-parser@^4.2.0: 2121 | version "4.2.1" 2122 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" 2123 | dependencies: 2124 | camelcase "^3.0.0" 2125 | 2126 | yargs@^6.6.0: 2127 | version "6.6.0" 2128 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" 2129 | dependencies: 2130 | camelcase "^3.0.0" 2131 | cliui "^3.2.0" 2132 | decamelize "^1.1.1" 2133 | get-caller-file "^1.0.1" 2134 | os-locale "^1.4.0" 2135 | read-pkg-up "^1.0.1" 2136 | require-directory "^2.1.1" 2137 | require-main-filename "^1.0.1" 2138 | set-blocking "^2.0.0" 2139 | string-width "^1.0.2" 2140 | which-module "^1.0.0" 2141 | y18n "^3.2.1" 2142 | yargs-parser "^4.2.0" 2143 | 2144 | yargs@~1.3.3: 2145 | version "1.3.3" 2146 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-1.3.3.tgz#054de8b61f22eefdb7207059eaef9d6b83fb931a" 2147 | 2148 | yargs@~3.10.0: 2149 | version "3.10.0" 2150 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" 2151 | dependencies: 2152 | camelcase "^1.0.2" 2153 | cliui "^2.1.0" 2154 | decamelize "^1.0.0" 2155 | window-size "0.1.0" 2156 | 2157 | yn@^1.2.0: 2158 | version "1.2.0" 2159 | resolved "https://registry.yarnpkg.com/yn/-/yn-1.2.0.tgz#d237a4c533f279b2b89d3acac2db4b8c795e4a63" 2160 | 2161 | zone.js@^0.8.5: 2162 | version "0.8.5" 2163 | resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.8.5.tgz#7906e017482cbff4c3f079c5c34305ce941f5ba2" 2164 | --------------------------------------------------------------------------------