├── .editorconfig ├── .gitignore ├── .travis.yml ├── .vscode ├── launch.json ├── settings.json └── tasks.json ├── README.md ├── doc └── Intellisense.png ├── package.json ├── src ├── index.ts └── tests │ ├── withModules │ ├── actions.spec.ts │ ├── classes.spec.ts │ ├── getters.spec.ts │ ├── mutations.spec.ts │ └── store │ │ ├── basket │ │ ├── basket.ts │ │ ├── basketState.ts │ │ └── index.ts │ │ ├── index.ts │ │ ├── state.ts │ │ ├── store.ts │ │ └── system │ │ ├── index.ts │ │ ├── system.ts │ │ └── systemState.ts │ └── withoutModules │ ├── actions.spec.ts │ ├── getters.spec.ts │ ├── mutations.spec.ts │ └── store │ ├── index.ts │ ├── state.ts │ └── store.ts ├── tsconfig.json ├── tslint.json └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 4 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | coverage/ 3 | node_modules/ 4 | npm-debug.log 5 | .nyc_output -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "7" 4 | before_script: 5 | - yarn run build 6 | after_success: 'npm run coveralls' -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible Node.js debug attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "node", 9 | "request": "launch", 10 | "name": "Launch Program", 11 | "program": "${workspaceRoot}\\dist\\index.js", 12 | "outFiles": ["${workspaceRoot}\\dist\\**\\*.js"], 13 | "sourceMaps": true 14 | }, 15 | { 16 | "type": "node", 17 |             "request": "attach", 18 |             "name": "Attach to Process", 19 |             "address": "localhost", 20 |             "port": 5858, 21 |             "sourceMaps": true, 22 |             "outFiles": ["${workspaceRoot}\\dist\\**\\*.js"], 23 |             "restart": true, 24 |             //"trace": "sm", 25 | } 26 | ] 27 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "typescript.tsdk": "node_modules/typescript/lib/" 3 | } 4 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.1.0", 3 | "command": "npm", 4 | "isShellCommand": true, 5 | "args": ["run"], 6 | "showOutput": "always", 7 | "tasks": [ 8 | { 9 | "taskName": "build", 10 | "isBuildCommand": true 11 | }, 12 | { 13 | "taskName": "clean" 14 | }, 15 | { 16 | "taskName": "lint" 17 | }, 18 | { 19 | "taskName": "coverage" 20 | }, 21 | { 22 | "taskName": "test", 23 | "isTestCommand": true 24 | } 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Vuex-Typescript [![Build Status](https://travis-ci.org/istrib/vuex-typescript.svg?branch=master)](https://travis-ci.org/istrib/vuex-typescript) [![Coverage Status](https://coveralls.io/repos/github/istrib/vuex-typescript/badge.svg?branch=master)](https://coveralls.io/github/istrib/vuex-typescript?branch=master) [![npm version](https://badge.fury.io/js/vuex-typescript.svg)](https://badge.fury.io/js/vuex-typescript) 2 | 3 | [https://github.com/istrib/vuex-typescript/](https://github.com/istrib/vuex-typescript/) 4 | 5 | A simple way to get static typing, static code analysis and intellisense with Vuex library. 6 | 7 | 8 | ![](doc/Intellisense.png) 9 | 10 | We get full end-to-end compile-time safety and code navigability: 11 | * No string literals or constants for action/mutation/getter names 12 | * No action/mutation/getter misuse by providing wrong payload type 13 | * Intellisense giving unambiguous hints on what type of payload or getter arguments is expected 14 | * Refactoring made easy 15 | * Supports vuex with and without modules (though use of modules and namespaces seems to produce better structured code). 16 | 17 | ## The idea 18 | 19 | This library does not change the way how vuex handlers are defined (in particular it does not make you 20 | use classes (though it does not stop you, either). 21 | 22 | The library changes the way how you *call* the store, once you have its instance: you **don’t use store’s 23 | compile-time-unsafe methods** but you use **strongly typed *accessors*** instead. This approach is remotely similar to the pattern of 24 | [Redux Action Creators](http://redux.js.org/docs/basics/Actions.html#action-creators), though much less boilerplate is needed thanks 25 | to higher-order functions provided by this library which do the dull work. 26 | 27 | ## Example 28 | 29 | Full working example available [here](https://github.com/istrib/vuex-typescript/tree/master/src/tests/withModules/store/basket/basket.ts). Excerpt: 30 | 31 | ```js 32 | import { ActionContext, Store } from "vuex"; 33 | import { getStoreAccessors } from "vuex-typescript"; 34 | import { State as RootState } from "../state"; 35 | import { BasketState, Product, ProductInBasket } from "./basketState"; 36 | 37 | // This part is a vanilla Vuex module, nothing fancy: 38 | 39 | type BasketContext = ActionContext; 40 | 41 | export const basket = { 42 | namespaced: true, 43 | 44 | state: { 45 | items: [], 46 | totalAmount: 0, 47 | }, 48 | 49 | getters: { 50 | getProductNames(state: BasketState) { 51 | return state.items.map((item) => item.product.name); 52 | }, 53 | ... 54 | }, 55 | 56 | mutations: { 57 | appendItem(state: BasketState, item: { product: Product; atTheEnd: boolean }) { 58 | state.items.push({ product: item.product, isSelected: false }); 59 | }, 60 | ... 61 | }, 62 | 63 | actions: { 64 | async updateTotalAmount(context: BasketContext, discount: number): Promise { 65 | const totalBeforeDiscount = readTotalAmountWithoutDiscount(context); 66 | const totalAfterDiscount = await callServer(totalBeforeDiscount, discount); 67 | commitSetTotalAmount(context, totalAfterDiscount); 68 | }, 69 | ... 70 | }, 71 | }; 72 | 73 | // This is where the vuex-typescript specific stuff begins: 74 | // 75 | // We want to expose static functions which will call get, dispatch or commit method 76 | // on a store instance taking correct type of payload (or getter signature). 77 | // Instead of writing these "store accessor" functions by hand, we use set of higher-order 78 | // functions provided by vuex-typescript. These functions will produce statically typed 79 | // functions which we want. Note that no type annotation is required at this point. 80 | // Types of arguments are inferred from signature of vanilla vuex handlers defined above: 81 | 82 | const { commit, read, dispatch } = 83 | getStoreAccessors("basket"); // We pass namespace here, if we make the module namespaced: true. 84 | 85 | export const readProductNames = read(basket.getters.getProductNames); 86 | export const dispatchUpdateTotalAmount = dispatch(basket.actions.updateTotalAmount); 87 | export const commitAppendItem = commit(basket.mutations.appendItem); 88 | 89 | ``` 90 | 91 | And then in your Vue component: 92 | 93 | ```js 94 | import * as basket from "./store/basket"; // Or better import specific accessor to be explicit about what you use 95 | ... 96 | 97 | getterResult = basket.readProductNames(this.$store); // This returns Product[] 98 | basket.dispatchUpdateTotalAmount(this.$store, 0.5); // This accepts number (discount) - you'd normally use an object as arguments. Returns promise. 99 | basket.commitAppendItem(this.$store, newItem); // This will give compilation error if you don't pass { product: Product; atTheEnd: boolean } in 100 | ``` 101 | 102 | ## Vuex version compatibility 103 | 104 | For **Vuex 2.x** use newest **vuex-typescript 2.x** 105 | 106 | For **Vuex 3.x** use newest **vuex-typescript 3.x** 107 | 108 | This library has explicit dependency on Vuex. 109 | A new version of vuex-typescript is released following each major release of Vuex. This way breaking API changes introduced into Vuex are guaranteed to be followed up and tested in vuex-typescript. 110 | 111 | ## Functions or objects 112 | 113 | This lib is deliberately designed with functions rather than classes. This does not stop you from grouping accessors into objects. 114 | Note however that this makes little sense as the accessors are loosely or not related to each other. 115 | Importing and using functions rather than objects makes it explicit which accessor you actually use rather than 116 | stating which accessor in an object you may be using. 117 | 118 | If you wish to define your vuex handlers as class members then you must decorate these methods with `@Handler` 119 | decorator exported from this library as shown in [this test](https://github.com/istrib/vuex-typescript/tree/master/src/tests/withModules/store/system/system.ts). 120 | 121 | ## More 122 | 123 | https://github.com/mrcrowl/vuex-typex also uses higher-order functions but takes a few steps more: there the store is implicitly built while defining accessors for each handler (in contrast here we create store with standard Vuex options and then wrap handlers into accessors). It is also not required to pass $store as argument to accessors. Definitely worth checking out. 124 | 125 | ## Contributing 126 | 127 | ``` 128 | npm run build 129 | npm run build-watch 130 | 131 | npm test 132 | npm run test-watch 133 | npm run test-debug 134 | npm run coverage 135 | ``` 136 | -------------------------------------------------------------------------------- /doc/Intellisense.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/istrib/vuex-typescript/105d21977d0f870910d86f7706c06ee8bd3bded9/doc/Intellisense.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vuex-typescript", 3 | "version": "3.0.2", 4 | "description": "A simple way to get static typing, static code analysis and intellisense with Vuex library.", 5 | "files": [ 6 | "dist/index.js", 7 | "dist/index.d.ts" 8 | ], 9 | "main": "dist/index.js", 10 | "typings": "dist/index.d.ts", 11 | "author": "istrib", 12 | "license": "MIT", 13 | "devDependencies": { 14 | "@types/chai": "^3.4.35", 15 | "@types/chai-http": "^0.0.30", 16 | "@types/mocha": "^2.2.44", 17 | "chai": "^3.5.0", 18 | "coveralls": "^2.13.1", 19 | "mocha": "^4.0.1", 20 | "nyc": "^10.1.2", 21 | "rimraf": "^2.6.1", 22 | "tslint": "^4.5.1", 23 | "typescript": "^2.6.1", 24 | "vue": "^2.5.3", 25 | "vuex": "^3.0.1" 26 | }, 27 | "peerDependencies": { 28 | "vuex": "3.x" 29 | }, 30 | "scripts": { 31 | "clean": "rimraf dist && rimraf coverage", 32 | "lint-force": "tslint --force --format verbose \"src/**/*.ts\"", 33 | "lint": "tslint --format verbose \"src/**/*.ts\"", 34 | "compile": "echo Using TypeScript && tsc --version && tsc --pretty", 35 | "compile-watch": "npm run compile -- --watch", 36 | "build": "npm run clean && npm run lint-force && npm run compile", 37 | "build-watch": "npm run clean && npm run lint-force && npm run compile-watch", 38 | "test": "npm run coverage", 39 | "test-only": "mocha --recursive dist/**/*.spec.js", 40 | "test-watch": "npm run test-only -- --watch", 41 | "test-debug": "mocha --debug-brk --debug=0.0.0.0:5858 dist/**/*.spec.js", 42 | "coverage": "rimraf coverage && nyc --reporter=html --reporter=text --reporter=lcov -x **/*.spec.js npm run test-only", 43 | "coveralls": "cat ./coverage/lcov.info | ./node_modules/.bin/coveralls" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { ActionContext, Store } from "vuex"; 2 | 3 | const useRootNamespace = { root: true }; 4 | 5 | export function Handler(target: any, key: string) { 6 | target[key]._vuexKey = key; 7 | } 8 | 9 | /** 10 | * Vuex getter handler specified in Vuex options. 11 | */ 12 | export type GetterHandler = 13 | (state: TModuleState, rootState: TRootState) => TResult; 14 | 15 | /** 16 | * Vuex action handler which takes payload as specified in Vuex options. 17 | */ 18 | export type ActionHandlerWithPayload = 19 | (injectee: ActionContext, payload: TPayload) => void | Promise; 20 | /** 21 | * Vuex action handler which does not take payload as specified in Vuex options. 22 | */ 23 | export type ActionHandlerNoPayload = 24 | (injectee: ActionContext) => void | Promise; 25 | 26 | /** 27 | * Vuex mutation handler which takes payload as specified in Vuex options. 28 | */ 29 | export type MutationHandlerWithPayload = 30 | (state: TModuleState, payload: TPayload) => void; 31 | /** 32 | * Vuex mutation handler which does not take payload as specified in Vuex options. 33 | */ 34 | export type MutationHandlerNoPayload = 35 | (state: TModuleState) => void; 36 | 37 | /** 38 | * Function which gets value of a concrete Vuex getter. 39 | */ 40 | export type GetAccessor = 41 | (store: Store | ActionContext) => TResult; 42 | 43 | /** 44 | * Function which dispatches a concrete Vuex action with payload. 45 | */ 46 | export type DispatchAccessorWithPayload = 47 | (store: Store | ActionContext, 48 | payload: TPayload) => Promise; 49 | /** 50 | * Function which dispatches a concrete Vuex action without payload. 51 | */ 52 | export type DispatchAccessorNoPayload = 53 | (store: Store | ActionContext) => Promise; 54 | 55 | /** 56 | * Function which commits a concrete Vuex mutation with payload. 57 | */ 58 | export type CommitAccessorWithPayload = 59 | (store: Store | ActionContext, 60 | payload: TPayload) => void; 61 | /** 62 | * Function which commits a concrete Vuex mutation without payload. 63 | */ 64 | export type CommitAccessorNoPayload = 65 | (store: Store | ActionContext) => void; 66 | 67 | export interface StoreAccessors { 68 | /** 69 | * Returns a function committing mutations directed to the specified mutation handler. 70 | * This overload is for handlers which do not expect payload. 71 | */ 72 | commit( 73 | handler: MutationHandlerNoPayload): 74 | CommitAccessorNoPayload; 75 | /** 76 | * Returns a function committing mutations directed to the specified mutation handler. 77 | * This overload is for handlers which expect payload. 78 | */ 79 | commit( 80 | handler: MutationHandlerWithPayload): 81 | CommitAccessorWithPayload; 82 | 83 | /** 84 | * Returns a function dispatching actions directed to the specified action handler. 85 | * This overload is for handlers which do not expect payload. 86 | */ 87 | dispatch( 88 | handler: ActionHandlerNoPayload): 89 | DispatchAccessorNoPayload; 90 | /** 91 | * Returns a function dispatching actions directed to the specified action handler. 92 | * This overload is for handlers which expect payload. 93 | */ 94 | dispatch( 95 | handler: ActionHandlerWithPayload): 96 | DispatchAccessorWithPayload; 97 | 98 | /** 99 | * Returns a function returning value of the specified getter. 100 | */ 101 | read( 102 | handler: GetterHandler): 103 | GetAccessor; 104 | } 105 | 106 | export function getStoreAccessors( 107 | namespace: string): StoreAccessors { 108 | return { 109 | commit: (handler: Function) => createAccessor("commit", handler, namespace), 110 | dispatch: (handler: Function) => createAccessor("dispatch", handler, namespace), 111 | read: (handler: Function) => { 112 | const key = qualifyKey(handler, namespace); 113 | return (store: any) => { 114 | return store.rootGetters 115 | ? store.rootGetters[key] // ActionContext 116 | : store.getters[key]; // Store 117 | }; 118 | }, 119 | }; 120 | } 121 | 122 | function createAccessor( 123 | operation: string, 124 | handler: Function, 125 | namespace: string): any { 126 | const key = qualifyKey(handler, namespace); 127 | return (store: any, payload: any) => { 128 | return store[operation](key, payload, useRootNamespace); 129 | }; 130 | } 131 | 132 | function qualifyKey(handler: Function, namespace?: string) { 133 | const key = (handler).name || (handler)._vuexKey; 134 | if (!key) { 135 | throw new Error("Vuex handler functions must not be anonymous. " 136 | + "Vuex needs a key by which it identifies a handler. " 137 | + "If you define handler as class member you must decorate it with @Handler."); 138 | } 139 | return namespace 140 | ? `${namespace}/${key}` 141 | : key; 142 | } 143 | -------------------------------------------------------------------------------- /src/tests/withModules/actions.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect } from "chai"; 2 | import * as Vuex from "vuex"; 3 | import { createStore, State } from "./store"; 4 | import * as basket from "./store/basket"; 5 | 6 | const Vue = require("vue"); 7 | 8 | describe("Given store with modules exposing actions", () => { 9 | let store: Vuex.Store; 10 | 11 | beforeEach(() => { 12 | Vue.use(Vuex); 13 | store = createStore(); 14 | store.replaceState({ 15 | system: { 16 | userLogin: "abc", 17 | }, 18 | basket: { 19 | items: [ 20 | { product: { id: 1, name: "clock", unitPrice: 50 }, isSelected: true }, 21 | { product: { id: 2, name: "newspaper", unitPrice: 20 }, isSelected: false }, 22 | { product: { id: 3, name: "candy", unitPrice: 10 }, isSelected: false }, 23 | ], 24 | totalAmount: 80, 25 | }, 26 | }); 27 | }); 28 | 29 | describe("when parameterless action is dispatched in a module using function " 30 | + "built with dispatch function", () => { 31 | 32 | beforeEach(async () => { 33 | await basket.dispatchSelectAvailableItems(store); 34 | }); 35 | 36 | it("mutates state of the module via mutations invoked within the action", () => { 37 | expect(store.state).to.deep.equal({ 38 | system: { 39 | userLogin: "abc", 40 | }, 41 | basket: { 42 | items: [ 43 | { product: { id: 1, name: "clock", unitPrice: 50 }, isSelected: true }, 44 | { product: { id: 2, name: "newspaper", unitPrice: 20 }, isSelected: true }, 45 | { product: { id: 3, name: "candy", unitPrice: 10 }, isSelected: true }, 46 | ], 47 | totalAmount: 80, 48 | }, 49 | }); 50 | }); 51 | }); 52 | 53 | describe("when action with object as payload is dispatched in a module", () => { 54 | beforeEach(async () => { 55 | await basket.dispatchUpdateTotalAmount(store, 0.5); 56 | }); 57 | 58 | it("mutates state of the module via mutations invoked within the action", () => { 59 | expect(store.state).to.deep.equal({ 60 | system: { 61 | userLogin: "abc", 62 | }, 63 | basket: { 64 | items: [ 65 | { product: { id: 1, name: "clock", unitPrice: 50 }, isSelected: true }, 66 | { product: { id: 2, name: "newspaper", unitPrice: 20 }, isSelected: false }, 67 | { product: { id: 3, name: "candy", unitPrice: 10 }, isSelected: false }, 68 | ], 69 | totalAmount: 40, 70 | }, 71 | }); 72 | }); 73 | }); 74 | 75 | describe("when action returning promise which resolves to non-void value is dispatched in a module", () => { 76 | let actualResult: number; 77 | 78 | beforeEach(async () => { 79 | actualResult = await basket.dispatchUpdateTotalAmount(store, 0.5); 80 | }); 81 | 82 | it("returns promise which resolves to the same value", () => { 83 | expect(actualResult).to.equal(40); 84 | }); 85 | }); 86 | 87 | describe("when action which delegates work to other actions is dispatched in a module ", () => { 88 | beforeEach(async () => { 89 | await basket.dispatchSelectAvailablieItemsAndUpdateTotalAmount(store, 0.5); 90 | }); 91 | 92 | it("mutates state of the module via mutations invoked within the delegated action", () => { 93 | expect(store.state).to.deep.equal({ 94 | system: { 95 | userLogin: "abc", 96 | }, 97 | basket: { 98 | items: [ 99 | { product: { id: 1, name: "clock", unitPrice: 50 }, isSelected: true }, 100 | { product: { id: 2, name: "newspaper", unitPrice: 20 }, isSelected: true }, 101 | { product: { id: 3, name: "candy", unitPrice: 10 }, isSelected: true }, 102 | ], 103 | totalAmount: 40, 104 | }, 105 | }); 106 | }); 107 | }); 108 | }); 109 | -------------------------------------------------------------------------------- /src/tests/withModules/classes.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect } from "chai"; 2 | import * as Vuex from "vuex"; 3 | import { getStoreAccessors, StoreAccessors } from "../../"; 4 | import { createStore, State } from "./store"; 5 | import * as system from "./store/system"; 6 | 7 | const Vue = require("vue"); 8 | 9 | class WrongSystemModuleHandlers { 10 | public setUserLoginUndecorated(state: system.SystemState, login: string) { 11 | state.userLogin = login; 12 | } 13 | } 14 | 15 | describe("Given mutations defined as class members", () => { 16 | let store: Vuex.Store; 17 | 18 | beforeEach(() => { 19 | Vue.use(Vuex); 20 | store = createStore(); 21 | store.replaceState({ 22 | system: { 23 | userLogin: "abc", 24 | }, 25 | basket: { 26 | items: [], 27 | totalAmount: 0, 28 | }, 29 | }); 30 | }); 31 | 32 | describe("when mutation is made using function built with commit " 33 | + "function applied to class method decorated with @Handler decorator", () => { 34 | beforeEach(() => { 35 | system.commitSetUserLogin(store, "xyz"); 36 | }); 37 | 38 | it("mutates state", () => { 39 | expect(store.state).to.deep.equal({ 40 | system: { 41 | userLogin: "xyz", 42 | }, 43 | basket: { 44 | items: [], 45 | totalAmount: 0, 46 | }, 47 | }); 48 | }); 49 | }); 50 | 51 | describe("when commit function is applied to class method which is not decorated with @Handler decorator", () => { 52 | let storeAccessors: StoreAccessors; 53 | 54 | beforeEach(() => { 55 | storeAccessors = getStoreAccessors("system"); 56 | }); 57 | 58 | it("throws 'Vuex handler functions must not be anonymous...' error", () => { 59 | expect(() => storeAccessors.commit(new WrongSystemModuleHandlers().setUserLoginUndecorated)) 60 | .to.throw(Error, "Vuex handler functions must not be anonymous. " 61 | + "Vuex needs a key by which it identifies a handler. " 62 | + "If you define handler as class member you must decorate it with @Handler."); 63 | }); 64 | }); 65 | }); 66 | -------------------------------------------------------------------------------- /src/tests/withModules/getters.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect } from "chai"; 2 | import * as Vuex from "vuex"; 3 | import { createStore, State } from "./store"; 4 | import * as basket from "./store/basket"; 5 | 6 | const Vue = require("vue"); 7 | 8 | describe("Given store with modules exposing getters", () => { 9 | let store: Vuex.Store; 10 | 11 | beforeEach(() => { 12 | Vue.use(Vuex); 13 | store = createStore(); 14 | store.replaceState({ 15 | system: { 16 | userLogin: "abc", 17 | }, 18 | basket: { 19 | items: [ 20 | { product: { id: 1, name: "clock", unitPrice: 50 }, isSelected: true }, 21 | { product: { id: 2, name: "newspaper", unitPrice: 20 }, isSelected: false }, 22 | { product: { id: 3, name: "candy", unitPrice: 10 }, isSelected: false }, 23 | ], 24 | totalAmount: 80, 25 | }, 26 | }); 27 | }); 28 | 29 | describe("when parameterless getter is accessed in a module using function built with read function", () => { 30 | let getterResult: string[]; 31 | 32 | beforeEach(() => { 33 | getterResult = basket.readProductNames(store); 34 | }); 35 | 36 | it("the function returns value of the getter", () => { 37 | expect(getterResult).to.deep.equal(["clock", "newspaper", "candy"]); 38 | }); 39 | }); 40 | 41 | describe("when getter having parameters is accessed in a module using function built with read function", () => { 42 | let getterResult: basket.ProductInBasket[]; 43 | 44 | describe("and a value is passed in as argument", () => { 45 | beforeEach(() => { 46 | getterResult = basket.readItemsByStatus(store)(false); 47 | }); 48 | 49 | it("the function returns value of the getter corresponding to the argument value", () => { 50 | expect(getterResult).to.deep.equal([ 51 | { product: { id: 2, name: "newspaper", unitPrice: 20 }, isSelected: false }, 52 | { product: { id: 3, name: "candy", unitPrice: 10 }, isSelected: false }]); 53 | }); 54 | }); 55 | 56 | describe("and another value is passed in as argument", () => { 57 | beforeEach(() => { 58 | getterResult = basket.readItemsByStatus(store)(true); 59 | }); 60 | 61 | it("the function returns value of the getter corresponding to the other argument value", () => { 62 | expect(getterResult).to.deep.equal([ 63 | { product: { id: 1, name: "clock", unitPrice: 50 }, isSelected: true }]); 64 | }); 65 | }); 66 | }); 67 | }); 68 | -------------------------------------------------------------------------------- /src/tests/withModules/mutations.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect } from "chai"; 2 | import * as Vuex from "vuex"; 3 | import { createStore, State } from "./store"; 4 | import * as basket from "./store/basket"; 5 | 6 | const Vue = require("vue"); 7 | 8 | describe("Given store with modules exposing mutations", () => { 9 | let store: Vuex.Store; 10 | 11 | beforeEach(() => { 12 | Vue.use(Vuex); 13 | store = createStore(); 14 | store.replaceState({ 15 | system: { 16 | userLogin: "abc", 17 | }, 18 | basket: { 19 | items: [ { product: { id: 1, name: "clock", unitPrice: 50 }, isSelected: true } ], 20 | totalAmount: 50, 21 | }, 22 | }); 23 | }); 24 | 25 | describe("when parameterless mutation is made in a module using function built with commit function", () => { 26 | beforeEach(() => { 27 | basket.commitReset(store); 28 | }); 29 | 30 | it("mutates state of the module and not state of other modules", () => { 31 | expect(store.state).to.deep.equal({ 32 | system: { 33 | userLogin: "abc", 34 | }, 35 | basket: { 36 | items: [], 37 | totalAmount: 0, 38 | }, 39 | }); 40 | }); 41 | }); 42 | 43 | describe("when mutation with object as payload is made in a module", () => { 44 | beforeEach(() => { 45 | basket.commitAppendItem(store, { product: { id: 2, name: "chair", unitPrice: 20 }, atTheEnd: true }); 46 | }); 47 | 48 | it("mutates state of the module and not state of other modules", () => { 49 | expect(store.state).to.deep.equal({ 50 | system: { 51 | userLogin: "abc", 52 | }, 53 | basket: { 54 | items: [ 55 | { product: { id: 1, name: "clock", unitPrice: 50 }, isSelected: true }, 56 | { product: { id: 2, name: "chair", unitPrice: 20 }, isSelected: false }, 57 | ], 58 | totalAmount: 50, 59 | }, 60 | }); 61 | }); 62 | }); 63 | 64 | describe("when mutation with value as payload is made in a module", () => { 65 | beforeEach(() => { 66 | basket.commitSetTotalAmount(store, 45); 67 | }); 68 | 69 | it("mutates state of the module and not state of other modules", () => { 70 | expect(store.state).to.deep.equal({ 71 | system: { 72 | userLogin: "abc", 73 | }, 74 | basket: { 75 | items: [ 76 | { product: { id: 1, name: "clock", unitPrice: 50 }, isSelected: true }, 77 | ], 78 | totalAmount: 45, 79 | }, 80 | }); 81 | }); 82 | }); 83 | }); 84 | -------------------------------------------------------------------------------- /src/tests/withModules/store/basket/basket.ts: -------------------------------------------------------------------------------- 1 | import { ActionContext, Store } from "vuex"; 2 | import { getStoreAccessors } from "../../../../"; 3 | import { State as RootState } from "../state"; 4 | import { BasketState, Product, ProductInBasket } from "./basketState"; 5 | 6 | type BasketContext = ActionContext; 7 | 8 | export const basket = { 9 | namespaced: true, 10 | 11 | state: { 12 | items: [], 13 | totalAmount: 0, 14 | }, 15 | 16 | getters: { 17 | getProductNames(state: BasketState) { 18 | return state.items.map((item) => item.product.name); 19 | }, 20 | 21 | getItemsByStatus(state: BasketState) { 22 | return (status: boolean) => state.items.filter((item) => item.isSelected === status); 23 | }, 24 | 25 | getTotalAmountWithoutDiscount(state: BasketState) { 26 | return state.items.reduce((total, item) => total + item.product.unitPrice, 0); 27 | }, 28 | }, 29 | 30 | mutations: { 31 | reset(state: BasketState) { 32 | state.items = []; 33 | state.totalAmount = 0; 34 | }, 35 | 36 | appendItem(state: BasketState, item: { product: Product; atTheEnd: boolean }) { 37 | state.items.push({ product: item.product, isSelected: false }); 38 | }, 39 | 40 | setTotalAmount(state: BasketState, totalAmount: number) { 41 | state.totalAmount = totalAmount; 42 | }, 43 | 44 | selectProducts(state: BasketState, productNames: string[]) { 45 | for (const productName of productNames) { 46 | state.items.find((item) => item.product.name === productName)!.isSelected = true; 47 | } 48 | }, 49 | }, 50 | 51 | actions: { 52 | async updateTotalAmount(context: BasketContext, discount: number): Promise { 53 | const totalBeforeDiscount = readTotalAmountWithoutDiscount(context); 54 | 55 | // Imagine this is a server API call to compute the discounted value: 56 | await new Promise((resolve, _) => setTimeout(() => resolve(), 500)); 57 | const totalAfterDiscount = totalBeforeDiscount * discount; 58 | 59 | commitSetTotalAmount(context, totalAfterDiscount); 60 | 61 | return totalAfterDiscount; 62 | }, 63 | 64 | async selectAvailableItems(context: BasketContext): Promise { 65 | // Imagine this is a server API call to figure out which items are available: 66 | await new Promise((resolve, _) => setTimeout(() => resolve(), 500)); 67 | 68 | const availableProductNames = readProductNames(context); 69 | commitSelectProducts(context, availableProductNames); 70 | }, 71 | 72 | async SelectAvailablieItemsAndUpdateTotalAmount(context: BasketContext, discount: number): Promise { 73 | await dispatchSelectAvailableItems(context); 74 | await dispatchUpdateTotalAmount(context, discount); 75 | }, 76 | }, 77 | }; 78 | 79 | const { commit, read, dispatch } = 80 | getStoreAccessors("basket"); 81 | 82 | const getters = basket.getters; 83 | 84 | export const readProductNames = read(getters.getProductNames); 85 | export const readItemsByStatus = read(getters.getItemsByStatus); 86 | export const readTotalAmountWithoutDiscount = read(getters.getTotalAmountWithoutDiscount); 87 | 88 | const actions = basket.actions; 89 | 90 | export const dispatchUpdateTotalAmount = dispatch(actions.updateTotalAmount); 91 | export const dispatchSelectAvailableItems = dispatch(actions.selectAvailableItems); 92 | export const dispatchSelectAvailablieItemsAndUpdateTotalAmount = 93 | dispatch(actions.SelectAvailablieItemsAndUpdateTotalAmount); 94 | 95 | const mutations = basket.mutations; 96 | 97 | export const commitReset = commit(mutations.reset); 98 | export const commitAppendItem = commit(mutations.appendItem); 99 | export const commitSetTotalAmount = commit(mutations.setTotalAmount); 100 | export const commitSelectProducts = commit(mutations.selectProducts); 101 | -------------------------------------------------------------------------------- /src/tests/withModules/store/basket/basketState.ts: -------------------------------------------------------------------------------- 1 | export interface Product { 2 | id: number; 3 | name: string; 4 | unitPrice: number; 5 | } 6 | 7 | export interface ProductInBasket { 8 | product: Product; 9 | isSelected: boolean; 10 | } 11 | 12 | export interface BasketState { 13 | items: ProductInBasket[]; 14 | totalAmount: number; 15 | } 16 | -------------------------------------------------------------------------------- /src/tests/withModules/store/basket/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./basket"; 2 | export * from "./basketState"; 3 | -------------------------------------------------------------------------------- /src/tests/withModules/store/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./state"; 2 | export * from "./store"; 3 | -------------------------------------------------------------------------------- /src/tests/withModules/store/state.ts: -------------------------------------------------------------------------------- 1 | import { BasketState } from "./basket/basketState"; 2 | import { SystemState } from "./system/systemState"; 3 | 4 | export interface State { 5 | basket: BasketState; 6 | system: SystemState; 7 | } 8 | -------------------------------------------------------------------------------- /src/tests/withModules/store/store.ts: -------------------------------------------------------------------------------- 1 | import * as Vuex from "vuex"; 2 | import { basket } from "./basket"; 3 | import { State } from "./state"; 4 | import { system } from "./system"; 5 | 6 | export const createStore = () => new Vuex.Store({ 7 | modules: { 8 | basket, 9 | system, 10 | }, 11 | }); 12 | -------------------------------------------------------------------------------- /src/tests/withModules/store/system/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./system"; 2 | export * from "./systemState"; 3 | -------------------------------------------------------------------------------- /src/tests/withModules/store/system/system.ts: -------------------------------------------------------------------------------- 1 | import { ActionContext, Store } from "vuex"; 2 | import { getStoreAccessors, Handler } from "../../../../"; 3 | import { State as RootState } from "../state"; 4 | import { SystemState } from "./systemState"; 5 | 6 | // The pattern shown here IS NOT RECOMMENDED. 7 | // This is purely to verify that using class methods as vuex handlers 8 | // (as implemented with e.g. https://www.npmjs.com/package/vuex-class-module) is possible 9 | // provided use of @Handler decorator: 10 | 11 | export class SystemModuleHandlers { 12 | @Handler 13 | public setUserLogin(state: SystemState, login: string) { 14 | state.userLogin = login; 15 | } 16 | } 17 | 18 | export const systemModuleHandlers = new SystemModuleHandlers(); 19 | 20 | export const system = { 21 | namespaced: true, 22 | 23 | state: { 24 | userLogin: null, 25 | }, 26 | 27 | mutations: { 28 | setUserLogin: systemModuleHandlers.setUserLogin, 29 | }, 30 | }; 31 | 32 | const { commit } = 33 | getStoreAccessors("system"); 34 | 35 | export const commitSetUserLogin = commit(systemModuleHandlers.setUserLogin); 36 | -------------------------------------------------------------------------------- /src/tests/withModules/store/system/systemState.ts: -------------------------------------------------------------------------------- 1 | export interface SystemState { 2 | userLogin: string | null; 3 | } 4 | -------------------------------------------------------------------------------- /src/tests/withoutModules/actions.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect } from "chai"; 2 | import * as Vuex from "vuex"; 3 | import { createStore, State } from "./store"; 4 | import * as api from "./store"; 5 | 6 | const Vue = require("vue"); 7 | 8 | describe("Given store without modules exposing actions", () => { 9 | let store: Vuex.Store; 10 | 11 | beforeEach(() => { 12 | Vue.use(Vuex); 13 | store = createStore(); 14 | store.replaceState({ 15 | system: { 16 | userLogin: "abc", 17 | }, 18 | basket: { 19 | items: [ 20 | { product: { id: 1, name: "clock", unitPrice: 50 }, isSelected: true }, 21 | { product: { id: 2, name: "newspaper", unitPrice: 20 }, isSelected: false }, 22 | { product: { id: 3, name: "candy", unitPrice: 10 }, isSelected: false }, 23 | ], 24 | totalAmount: 80, 25 | }, 26 | }); 27 | }); 28 | 29 | describe("when parameterless action is dispatched using function " 30 | + "built with dispatch function", () => { 31 | 32 | beforeEach(async () => { 33 | await api.dispatchSelectAvailableItems(store); 34 | }); 35 | 36 | it("mutates state of the module via mutations invoked within the action", () => { 37 | expect(store.state).to.deep.equal({ 38 | system: { 39 | userLogin: "abc", 40 | }, 41 | basket: { 42 | items: [ 43 | { product: { id: 1, name: "clock", unitPrice: 50 }, isSelected: true }, 44 | { product: { id: 2, name: "newspaper", unitPrice: 20 }, isSelected: true }, 45 | { product: { id: 3, name: "candy", unitPrice: 10 }, isSelected: true }, 46 | ], 47 | totalAmount: 80, 48 | }, 49 | }); 50 | }); 51 | }); 52 | 53 | describe("when action with object as payload is dispatched", () => { 54 | beforeEach(async () => { 55 | await api.dispatchUpdateTotalAmount(store, 0.5); 56 | }); 57 | 58 | it("mutates state of the module via mutations invoked within the action", () => { 59 | expect(store.state).to.deep.equal({ 60 | system: { 61 | userLogin: "abc", 62 | }, 63 | basket: { 64 | items: [ 65 | { product: { id: 1, name: "clock", unitPrice: 50 }, isSelected: true }, 66 | { product: { id: 2, name: "newspaper", unitPrice: 20 }, isSelected: false }, 67 | { product: { id: 3, name: "candy", unitPrice: 10 }, isSelected: false }, 68 | ], 69 | totalAmount: 40, 70 | }, 71 | }); 72 | }); 73 | }); 74 | 75 | describe("when action returning promise which resolves to non-void value is dispatched", () => { 76 | let actualResult: number; 77 | 78 | beforeEach(async () => { 79 | actualResult = await api.dispatchUpdateTotalAmount(store, 0.5); 80 | }); 81 | 82 | it("returns promise which resolves to the same value", () => { 83 | expect(actualResult).to.equal(40); 84 | }); 85 | }); 86 | 87 | describe("when action which delegates work to other actions is dispatched ", () => { 88 | beforeEach(async () => { 89 | await api.dispatchSelectAvailablieItemsAndUpdateTotalAmount(store, 0.5); 90 | }); 91 | 92 | it("mutates state of the module via mutations invoked within the delegated action", () => { 93 | expect(store.state).to.deep.equal({ 94 | system: { 95 | userLogin: "abc", 96 | }, 97 | basket: { 98 | items: [ 99 | { product: { id: 1, name: "clock", unitPrice: 50 }, isSelected: true }, 100 | { product: { id: 2, name: "newspaper", unitPrice: 20 }, isSelected: true }, 101 | { product: { id: 3, name: "candy", unitPrice: 10 }, isSelected: true }, 102 | ], 103 | totalAmount: 40, 104 | }, 105 | }); 106 | }); 107 | }); 108 | }); 109 | -------------------------------------------------------------------------------- /src/tests/withoutModules/getters.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect } from "chai"; 2 | import * as Vuex from "vuex"; 3 | import { createStore, ProductInBasket, State } from "./store"; 4 | import * as api from "./store"; 5 | 6 | const Vue = require("vue"); 7 | 8 | describe("Given store without modules exposing getters", () => { 9 | let store: Vuex.Store; 10 | 11 | beforeEach(() => { 12 | Vue.use(Vuex); 13 | store = createStore(); 14 | store.replaceState({ 15 | system: { 16 | userLogin: "abc", 17 | }, 18 | basket: { 19 | items: [ 20 | { product: { id: 1, name: "clock", unitPrice: 50 }, isSelected: true }, 21 | { product: { id: 2, name: "newspaper", unitPrice: 20 }, isSelected: false }, 22 | { product: { id: 3, name: "candy", unitPrice: 10 }, isSelected: false }, 23 | ], 24 | totalAmount: 80, 25 | }, 26 | }); 27 | }); 28 | 29 | describe("when parameterless getter is accessed using function built with read function", () => { 30 | let getterResult: string[]; 31 | 32 | beforeEach(() => { 33 | getterResult = api.readProductNames(store); 34 | }); 35 | 36 | it("the function returns value of the getter", () => { 37 | expect(getterResult).to.deep.equal(["clock", "newspaper", "candy"]); 38 | }); 39 | }); 40 | 41 | describe("when getter having parameters is accessed using function built with read function", () => { 42 | let getterResult: ProductInBasket[]; 43 | 44 | describe("and a value is passed in as argument", () => { 45 | beforeEach(() => { 46 | getterResult = api.readItemsByStatus(store)(false); 47 | }); 48 | 49 | it("the function returns value of the getter corresponding to the argument value", () => { 50 | expect(getterResult).to.deep.equal([ 51 | { product: { id: 2, name: "newspaper", unitPrice: 20 }, isSelected: false }, 52 | { product: { id: 3, name: "candy", unitPrice: 10 }, isSelected: false }]); 53 | }); 54 | }); 55 | 56 | describe("and another value is passed in as argument", () => { 57 | beforeEach(() => { 58 | getterResult = api.readItemsByStatus(store)(true); 59 | }); 60 | 61 | it("the function returns value of the getter corresponding to the other argument value", () => { 62 | expect(getterResult).to.deep.equal([ 63 | { product: { id: 1, name: "clock", unitPrice: 50 }, isSelected: true }]); 64 | }); 65 | }); 66 | }); 67 | }); 68 | -------------------------------------------------------------------------------- /src/tests/withoutModules/mutations.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect } from "chai"; 2 | import * as Vuex from "vuex"; 3 | import { createStore, State } from "./store"; 4 | import * as api from "./store"; 5 | 6 | const Vue = require("vue"); 7 | 8 | describe("Given store without modules exposing mutations", () => { 9 | let store: Vuex.Store; 10 | 11 | beforeEach(() => { 12 | Vue.use(Vuex); 13 | store = createStore(); 14 | store.replaceState({ 15 | system: { 16 | userLogin: "abc", 17 | }, 18 | basket: { 19 | items: [ { product: { id: 1, name: "clock", unitPrice: 50 }, isSelected: true } ], 20 | totalAmount: 50, 21 | }, 22 | }); 23 | }); 24 | 25 | describe("when parameterless mutation is made using function built with commit function", () => { 26 | beforeEach(() => { 27 | api.commitReset(store); 28 | }); 29 | 30 | it("mutates state of the module and not state of other modules", () => { 31 | expect(store.state).to.deep.equal({ 32 | system: { 33 | userLogin: "abc", 34 | }, 35 | basket: { 36 | items: [], 37 | totalAmount: 0, 38 | }, 39 | }); 40 | }); 41 | }); 42 | 43 | describe("when mutation with object as payload is made", () => { 44 | beforeEach(() => { 45 | api.commitAppendItem(store, { product: { id: 2, name: "chair", unitPrice: 20 }, atTheEnd: true }); 46 | }); 47 | 48 | it("mutates state of the module and not state of other modules", () => { 49 | expect(store.state).to.deep.equal({ 50 | system: { 51 | userLogin: "abc", 52 | }, 53 | basket: { 54 | items: [ 55 | { product: { id: 1, name: "clock", unitPrice: 50 }, isSelected: true }, 56 | { product: { id: 2, name: "chair", unitPrice: 20 }, isSelected: false }, 57 | ], 58 | totalAmount: 50, 59 | }, 60 | }); 61 | }); 62 | }); 63 | 64 | describe("when mutation with value as payload is made", () => { 65 | beforeEach(() => { 66 | api.commitSetTotalAmount(store, 45); 67 | }); 68 | 69 | it("mutates state of the module and not state of other modules", () => { 70 | expect(store.state).to.deep.equal({ 71 | system: { 72 | userLogin: "abc", 73 | }, 74 | basket: { 75 | items: [ 76 | { product: { id: 1, name: "clock", unitPrice: 50 }, isSelected: true }, 77 | ], 78 | totalAmount: 45, 79 | }, 80 | }); 81 | }); 82 | }); 83 | }); 84 | -------------------------------------------------------------------------------- /src/tests/withoutModules/store/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./state"; 2 | export * from "./store"; 3 | -------------------------------------------------------------------------------- /src/tests/withoutModules/store/state.ts: -------------------------------------------------------------------------------- 1 | export interface Product { 2 | id: number; 3 | name: string; 4 | unitPrice: number; 5 | } 6 | 7 | export interface ProductInBasket { 8 | product: Product; 9 | isSelected: boolean; 10 | } 11 | 12 | export interface State { 13 | basket: { 14 | items: ProductInBasket[]; 15 | totalAmount: number; 16 | }; 17 | 18 | system: { userLogin: string | null }; 19 | } 20 | -------------------------------------------------------------------------------- /src/tests/withoutModules/store/store.ts: -------------------------------------------------------------------------------- 1 | import * as Vuex from "vuex"; 2 | import { getStoreAccessors } from "../../../"; 3 | import { Product, ProductInBasket, State } from "./state"; 4 | 5 | type Context = Vuex.ActionContext; 6 | 7 | const storeOptions = { 8 | state: { 9 | basket: { 10 | items: [], 11 | totalAmount: 0, 12 | }, 13 | 14 | system: { userLogin: null }, 15 | }, 16 | 17 | getters: { 18 | getProductNames(state: State) { 19 | return state.basket.items.map((item) => item.product.name); 20 | }, 21 | 22 | getItemsByStatus(state: State) { 23 | return (status: boolean) => state.basket.items.filter((item) => item.isSelected === status); 24 | }, 25 | 26 | getTotalAmountWithoutDiscount(state: State) { 27 | return state.basket.items.reduce((total, item) => total + item.product.unitPrice, 0); 28 | }, 29 | }, 30 | 31 | mutations: { 32 | reset(state: State) { 33 | state.basket.items = []; 34 | state.basket.totalAmount = 0; 35 | }, 36 | 37 | appendItem(state: State, item: { product: Product; atTheEnd: boolean }) { 38 | state.basket.items.push({ product: item.product, isSelected: false }); 39 | }, 40 | 41 | setTotalAmount(state: State, totalAmount: number) { 42 | state.basket.totalAmount = totalAmount; 43 | }, 44 | 45 | selectProducts(state: State, productNames: string[]) { 46 | for (const productName of productNames) { 47 | state.basket.items.find((item) => item.product.name === productName)!.isSelected = true; 48 | } 49 | }, 50 | }, 51 | 52 | actions: { 53 | async updateTotalAmount(context: Context, discount: number): Promise { 54 | const totalBeforeDiscount = readTotalAmountWithoutDiscount(context); 55 | 56 | // Imagine this is a server API call to compute the discounted value: 57 | await new Promise((resolve, _) => setTimeout(() => resolve(), 500)); 58 | const totalAfterDiscount = totalBeforeDiscount * discount; 59 | 60 | commitSetTotalAmount(context, totalAfterDiscount); 61 | 62 | return totalAfterDiscount; 63 | }, 64 | 65 | async selectAvailableItems(context: Context): Promise { 66 | // Imagine this is a server API call to figure out which items are available: 67 | await new Promise((resolve, _) => setTimeout(() => resolve(), 500)); 68 | 69 | const availableProductNames = readProductNames(context); 70 | commitSelectProducts(context, availableProductNames); 71 | }, 72 | 73 | async SelectAvailablieItemsAndUpdateTotalAmount(context: Context, discount: number): Promise { 74 | await dispatchSelectAvailableItems(context); 75 | await dispatchUpdateTotalAmount(context, discount); 76 | }, 77 | }, 78 | }; 79 | 80 | export const createStore = () => new Vuex.Store(storeOptions); 81 | 82 | const { commit, read, dispatch } = 83 | getStoreAccessors(""); 84 | 85 | const getters = storeOptions.getters; 86 | 87 | export const readProductNames = read(getters.getProductNames); 88 | export const readItemsByStatus = read(getters.getItemsByStatus); 89 | export const readTotalAmountWithoutDiscount = read(getters.getTotalAmountWithoutDiscount); 90 | 91 | const actions = storeOptions.actions; 92 | 93 | export const dispatchUpdateTotalAmount = dispatch(actions.updateTotalAmount); 94 | export const dispatchSelectAvailableItems = dispatch(actions.selectAvailableItems); 95 | export const dispatchSelectAvailablieItemsAndUpdateTotalAmount = 96 | dispatch(actions.SelectAvailablieItemsAndUpdateTotalAmount); 97 | 98 | const mutations = storeOptions.mutations; 99 | 100 | export const commitReset = commit(mutations.reset); 101 | export const commitAppendItem = commit(mutations.appendItem); 102 | export const commitSetTotalAmount = commit(mutations.setTotalAmount); 103 | export const commitSelectProducts = commit(mutations.selectProducts); 104 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "moduleResolution": "node", 5 | "target": "es5", 6 | "sourceMap": true, 7 | "outDir": "./dist", 8 | "experimentalDecorators": true, 9 | "declaration": true, 10 | "removeComments": false, 11 | "noImplicitAny": true, 12 | "strictNullChecks": true, 13 | "forceConsistentCasingInFileNames": true, 14 | "noFallthroughCasesInSwitch": true, 15 | "noImplicitReturns": true, 16 | "noImplicitThis": true, 17 | "noUnusedParameters": true, 18 | "typeRoots": [ 19 | "./node_modules/@types", 20 | "./typings" 21 | ], 22 | "skipLibCheck": true, 23 | "lib": [ 24 | "es2015" 25 | ] 26 | }, 27 | "include": [ 28 | "src" 29 | ], 30 | "exclude": [ 31 | "node_modules" 32 | ] 33 | } -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "tslint:latest", 3 | "rules": { 4 | "no-console": false, 5 | "object-literal-sort-keys": false, 6 | "only-arrow-functions": false, 7 | "ban-types": false, 8 | "forin": false, 9 | "no-angle-bracket-type-assertion": false, 10 | "whitespace": false, 11 | "interface-name": false, 12 | "no-var-requires": false 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/chai-http@^0.0.30": 6 | version "0.0.30" 7 | resolved "https://registry.yarnpkg.com/@types/chai-http/-/chai-http-0.0.30.tgz#232bc05c944ccf366067621ecd4a918cad34eba1" 8 | dependencies: 9 | "@types/chai" "*" 10 | "@types/node" "*" 11 | 12 | "@types/chai@*", "@types/chai@^3.4.35": 13 | version "3.4.35" 14 | resolved "https://registry.yarnpkg.com/@types/chai/-/chai-3.4.35.tgz#e8d65f83492d2944f816fc620741821c28a8c900" 15 | 16 | "@types/mocha@^2.2.44": 17 | version "2.2.44" 18 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-2.2.44.tgz#1d4a798e53f35212fd5ad4d04050620171cd5b5e" 19 | 20 | "@types/node@*": 21 | version "7.0.12" 22 | resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.12.tgz#ae5f67a19c15f752148004db07cbbb372e69efc9" 23 | 24 | align-text@^0.1.1, align-text@^0.1.3: 25 | version "0.1.4" 26 | resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" 27 | dependencies: 28 | kind-of "^3.0.2" 29 | longest "^1.0.1" 30 | repeat-string "^1.5.2" 31 | 32 | amdefine@>=0.0.4: 33 | version "1.0.1" 34 | resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" 35 | 36 | ansi-align@^1.1.0: 37 | version "1.1.0" 38 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-1.1.0.tgz#2f0c1658829739add5ebb15e6b0c6e3423f016ba" 39 | dependencies: 40 | string-width "^1.0.1" 41 | 42 | ansi-regex@^2.0.0: 43 | version "2.1.1" 44 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 45 | 46 | ansi-styles@^2.2.1: 47 | version "2.2.1" 48 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 49 | 50 | append-transform@^0.4.0: 51 | version "0.4.0" 52 | resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" 53 | dependencies: 54 | default-require-extensions "^1.0.0" 55 | 56 | archy@^1.0.0: 57 | version "1.0.0" 58 | resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" 59 | 60 | argparse@^1.0.7: 61 | version "1.0.9" 62 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 63 | dependencies: 64 | sprintf-js "~1.0.2" 65 | 66 | arr-diff@^2.0.0: 67 | version "2.0.0" 68 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 69 | dependencies: 70 | arr-flatten "^1.0.1" 71 | 72 | arr-flatten@^1.0.1: 73 | version "1.0.1" 74 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" 75 | 76 | array-unique@^0.2.1: 77 | version "0.2.1" 78 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 79 | 80 | arrify@^1.0.1: 81 | version "1.0.1" 82 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 83 | 84 | asn1@~0.2.3: 85 | version "0.2.3" 86 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 87 | 88 | assert-plus@1.0.0, assert-plus@^1.0.0: 89 | version "1.0.0" 90 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 91 | 92 | assert-plus@^0.2.0: 93 | version "0.2.0" 94 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" 95 | 96 | assertion-error@^1.0.1: 97 | version "1.0.2" 98 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" 99 | 100 | async@^1.4.0: 101 | version "1.5.2" 102 | resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" 103 | 104 | asynckit@^0.4.0: 105 | version "0.4.0" 106 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 107 | 108 | aws-sign2@~0.6.0: 109 | version "0.6.0" 110 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" 111 | 112 | aws4@^1.2.1: 113 | version "1.6.0" 114 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" 115 | 116 | babel-code-frame@^6.20.0, babel-code-frame@^6.22.0: 117 | version "6.22.0" 118 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" 119 | dependencies: 120 | chalk "^1.1.0" 121 | esutils "^2.0.2" 122 | js-tokens "^3.0.0" 123 | 124 | babel-generator@^6.18.0: 125 | version "6.24.1" 126 | resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497" 127 | dependencies: 128 | babel-messages "^6.23.0" 129 | babel-runtime "^6.22.0" 130 | babel-types "^6.24.1" 131 | detect-indent "^4.0.0" 132 | jsesc "^1.3.0" 133 | lodash "^4.2.0" 134 | source-map "^0.5.0" 135 | trim-right "^1.0.1" 136 | 137 | babel-messages@^6.23.0: 138 | version "6.23.0" 139 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" 140 | dependencies: 141 | babel-runtime "^6.22.0" 142 | 143 | babel-runtime@^6.22.0: 144 | version "6.23.0" 145 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" 146 | dependencies: 147 | core-js "^2.4.0" 148 | regenerator-runtime "^0.10.0" 149 | 150 | babel-template@^6.16.0: 151 | version "6.24.1" 152 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333" 153 | dependencies: 154 | babel-runtime "^6.22.0" 155 | babel-traverse "^6.24.1" 156 | babel-types "^6.24.1" 157 | babylon "^6.11.0" 158 | lodash "^4.2.0" 159 | 160 | babel-traverse@^6.18.0, babel-traverse@^6.24.1: 161 | version "6.24.1" 162 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695" 163 | dependencies: 164 | babel-code-frame "^6.22.0" 165 | babel-messages "^6.23.0" 166 | babel-runtime "^6.22.0" 167 | babel-types "^6.24.1" 168 | babylon "^6.15.0" 169 | debug "^2.2.0" 170 | globals "^9.0.0" 171 | invariant "^2.2.0" 172 | lodash "^4.2.0" 173 | 174 | babel-types@^6.18.0, babel-types@^6.24.1: 175 | version "6.24.1" 176 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975" 177 | dependencies: 178 | babel-runtime "^6.22.0" 179 | esutils "^2.0.2" 180 | lodash "^4.2.0" 181 | to-fast-properties "^1.0.1" 182 | 183 | babylon@^6.11.0, babylon@^6.13.0, babylon@^6.15.0: 184 | version "6.16.1" 185 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.16.1.tgz#30c5a22f481978a9e7f8cdfdf496b11d94b404d3" 186 | 187 | balanced-match@^0.4.1: 188 | version "0.4.2" 189 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 190 | 191 | bcrypt-pbkdf@^1.0.0: 192 | version "1.0.1" 193 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" 194 | dependencies: 195 | tweetnacl "^0.14.3" 196 | 197 | boom@2.x.x: 198 | version "2.10.1" 199 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" 200 | dependencies: 201 | hoek "2.x.x" 202 | 203 | boxen@^1.0.0: 204 | version "1.0.0" 205 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.0.0.tgz#b2694baf1f605f708ff0177c12193b22f29aaaab" 206 | dependencies: 207 | ansi-align "^1.1.0" 208 | camelcase "^4.0.0" 209 | chalk "^1.1.1" 210 | cli-boxes "^1.0.0" 211 | string-width "^2.0.0" 212 | term-size "^0.1.0" 213 | widest-line "^1.0.0" 214 | 215 | brace-expansion@^1.1.7: 216 | version "1.1.7" 217 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" 218 | dependencies: 219 | balanced-match "^0.4.1" 220 | concat-map "0.0.1" 221 | 222 | braces@^1.8.2: 223 | version "1.8.5" 224 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 225 | dependencies: 226 | expand-range "^1.8.1" 227 | preserve "^0.2.0" 228 | repeat-element "^1.1.2" 229 | 230 | browser-stdout@1.3.0: 231 | version "1.3.0" 232 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" 233 | 234 | builtin-modules@^1.0.0: 235 | version "1.1.1" 236 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 237 | 238 | caching-transform@^1.0.0: 239 | version "1.0.1" 240 | resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-1.0.1.tgz#6dbdb2f20f8d8fbce79f3e94e9d1742dcdf5c0a1" 241 | dependencies: 242 | md5-hex "^1.2.0" 243 | mkdirp "^0.5.1" 244 | write-file-atomic "^1.1.4" 245 | 246 | camelcase@^1.0.2: 247 | version "1.2.1" 248 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" 249 | 250 | camelcase@^3.0.0: 251 | version "3.0.0" 252 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" 253 | 254 | camelcase@^4.0.0: 255 | version "4.1.0" 256 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" 257 | 258 | capture-stack-trace@^1.0.0: 259 | version "1.0.0" 260 | resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" 261 | 262 | caseless@~0.11.0: 263 | version "0.11.0" 264 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" 265 | 266 | center-align@^0.1.1: 267 | version "0.1.3" 268 | resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" 269 | dependencies: 270 | align-text "^0.1.3" 271 | lazy-cache "^1.0.3" 272 | 273 | chai@^3.5.0: 274 | version "3.5.0" 275 | resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" 276 | dependencies: 277 | assertion-error "^1.0.1" 278 | deep-eql "^0.1.3" 279 | type-detect "^1.0.0" 280 | 281 | chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1: 282 | version "1.1.3" 283 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 284 | dependencies: 285 | ansi-styles "^2.2.1" 286 | escape-string-regexp "^1.0.2" 287 | has-ansi "^2.0.0" 288 | strip-ansi "^3.0.0" 289 | supports-color "^2.0.0" 290 | 291 | cli-boxes@^1.0.0: 292 | version "1.0.0" 293 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" 294 | 295 | cliui@^2.1.0: 296 | version "2.1.0" 297 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" 298 | dependencies: 299 | center-align "^0.1.1" 300 | right-align "^0.1.1" 301 | wordwrap "0.0.2" 302 | 303 | cliui@^3.2.0: 304 | version "3.2.0" 305 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" 306 | dependencies: 307 | string-width "^1.0.1" 308 | strip-ansi "^3.0.1" 309 | wrap-ansi "^2.0.0" 310 | 311 | code-point-at@^1.0.0: 312 | version "1.1.0" 313 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 314 | 315 | colors@^1.1.2: 316 | version "1.1.2" 317 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" 318 | 319 | combined-stream@^1.0.5, combined-stream@~1.0.5: 320 | version "1.0.5" 321 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 322 | dependencies: 323 | delayed-stream "~1.0.0" 324 | 325 | commander@2.11.0, commander@^2.9.0: 326 | version "2.11.0" 327 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" 328 | 329 | commondir@^1.0.1: 330 | version "1.0.1" 331 | resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" 332 | 333 | concat-map@0.0.1: 334 | version "0.0.1" 335 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 336 | 337 | configstore@^3.0.0: 338 | version "3.0.0" 339 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.0.0.tgz#e1b8669c1803ccc50b545e92f8e6e79aa80e0196" 340 | dependencies: 341 | dot-prop "^4.1.0" 342 | graceful-fs "^4.1.2" 343 | mkdirp "^0.5.0" 344 | unique-string "^1.0.0" 345 | write-file-atomic "^1.1.2" 346 | xdg-basedir "^3.0.0" 347 | 348 | convert-source-map@^1.3.0: 349 | version "1.5.0" 350 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" 351 | 352 | core-js@^2.4.0: 353 | version "2.4.1" 354 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" 355 | 356 | coveralls@^2.13.1: 357 | version "2.13.1" 358 | resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-2.13.1.tgz#d70bb9acc1835ec4f063ff9dac5423c17b11f178" 359 | dependencies: 360 | js-yaml "3.6.1" 361 | lcov-parse "0.0.10" 362 | log-driver "1.2.5" 363 | minimist "1.2.0" 364 | request "2.79.0" 365 | 366 | create-error-class@^3.0.0: 367 | version "3.0.2" 368 | resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" 369 | dependencies: 370 | capture-stack-trace "^1.0.0" 371 | 372 | cross-spawn-async@^2.1.1: 373 | version "2.2.5" 374 | resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" 375 | dependencies: 376 | lru-cache "^4.0.0" 377 | which "^1.2.8" 378 | 379 | cross-spawn@^4: 380 | version "4.0.2" 381 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" 382 | dependencies: 383 | lru-cache "^4.0.1" 384 | which "^1.2.9" 385 | 386 | cryptiles@2.x.x: 387 | version "2.0.5" 388 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" 389 | dependencies: 390 | boom "2.x.x" 391 | 392 | crypto-random-string@^1.0.0: 393 | version "1.0.0" 394 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" 395 | 396 | dashdash@^1.12.0: 397 | version "1.14.1" 398 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 399 | dependencies: 400 | assert-plus "^1.0.0" 401 | 402 | debug-log@^1.0.1: 403 | version "1.0.1" 404 | resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" 405 | 406 | debug@3.1.0: 407 | version "3.1.0" 408 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 409 | dependencies: 410 | ms "2.0.0" 411 | 412 | debug@^2.2.0: 413 | version "2.2.0" 414 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" 415 | dependencies: 416 | ms "0.7.1" 417 | 418 | decamelize@^1.0.0, decamelize@^1.1.1: 419 | version "1.2.0" 420 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 421 | 422 | deep-eql@^0.1.3: 423 | version "0.1.3" 424 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" 425 | dependencies: 426 | type-detect "0.1.1" 427 | 428 | deep-extend@~0.4.0: 429 | version "0.4.1" 430 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" 431 | 432 | default-require-extensions@^1.0.0: 433 | version "1.0.0" 434 | resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" 435 | dependencies: 436 | strip-bom "^2.0.0" 437 | 438 | delayed-stream@~1.0.0: 439 | version "1.0.0" 440 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 441 | 442 | detect-indent@^4.0.0: 443 | version "4.0.0" 444 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" 445 | dependencies: 446 | repeating "^2.0.0" 447 | 448 | diff@3.3.1, diff@^3.0.1: 449 | version "3.3.1" 450 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75" 451 | 452 | dot-prop@^4.1.0: 453 | version "4.1.1" 454 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.1.1.tgz#a8493f0b7b5eeec82525b5c7587fa7de7ca859c1" 455 | dependencies: 456 | is-obj "^1.0.0" 457 | 458 | duplexer3@^0.1.4: 459 | version "0.1.4" 460 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 461 | 462 | ecc-jsbn@~0.1.1: 463 | version "0.1.1" 464 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 465 | dependencies: 466 | jsbn "~0.1.0" 467 | 468 | error-ex@^1.2.0: 469 | version "1.3.1" 470 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" 471 | dependencies: 472 | is-arrayish "^0.2.1" 473 | 474 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2: 475 | version "1.0.5" 476 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 477 | 478 | esprima@^2.6.0: 479 | version "2.7.3" 480 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" 481 | 482 | esutils@^2.0.2: 483 | version "2.0.2" 484 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 485 | 486 | execa@^0.4.0: 487 | version "0.4.0" 488 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.4.0.tgz#4eb6467a36a095fabb2970ff9d5e3fb7bce6ebc3" 489 | dependencies: 490 | cross-spawn-async "^2.1.1" 491 | is-stream "^1.1.0" 492 | npm-run-path "^1.0.0" 493 | object-assign "^4.0.1" 494 | path-key "^1.0.0" 495 | strip-eof "^1.0.0" 496 | 497 | expand-brackets@^0.1.4: 498 | version "0.1.5" 499 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 500 | dependencies: 501 | is-posix-bracket "^0.1.0" 502 | 503 | expand-range@^1.8.1: 504 | version "1.8.2" 505 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 506 | dependencies: 507 | fill-range "^2.1.0" 508 | 509 | extend@~3.0.0: 510 | version "3.0.1" 511 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" 512 | 513 | extglob@^0.3.1: 514 | version "0.3.2" 515 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 516 | dependencies: 517 | is-extglob "^1.0.0" 518 | 519 | extsprintf@1.0.2: 520 | version "1.0.2" 521 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" 522 | 523 | filename-regex@^2.0.0: 524 | version "2.0.0" 525 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" 526 | 527 | fill-range@^2.1.0: 528 | version "2.2.3" 529 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 530 | dependencies: 531 | is-number "^2.1.0" 532 | isobject "^2.0.0" 533 | randomatic "^1.1.3" 534 | repeat-element "^1.1.2" 535 | repeat-string "^1.5.2" 536 | 537 | find-cache-dir@^0.1.1: 538 | version "0.1.1" 539 | resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" 540 | dependencies: 541 | commondir "^1.0.1" 542 | mkdirp "^0.5.1" 543 | pkg-dir "^1.0.0" 544 | 545 | find-up@^1.0.0, find-up@^1.1.2: 546 | version "1.1.2" 547 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 548 | dependencies: 549 | path-exists "^2.0.0" 550 | pinkie-promise "^2.0.0" 551 | 552 | findup-sync@~0.3.0: 553 | version "0.3.0" 554 | resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16" 555 | dependencies: 556 | glob "~5.0.0" 557 | 558 | for-in@^1.0.1: 559 | version "1.0.2" 560 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 561 | 562 | for-own@^0.1.4: 563 | version "0.1.5" 564 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" 565 | dependencies: 566 | for-in "^1.0.1" 567 | 568 | foreground-child@^1.3.3, foreground-child@^1.5.3: 569 | version "1.5.6" 570 | resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" 571 | dependencies: 572 | cross-spawn "^4" 573 | signal-exit "^3.0.0" 574 | 575 | forever-agent@~0.6.1: 576 | version "0.6.1" 577 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 578 | 579 | form-data@~2.1.1: 580 | version "2.1.4" 581 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" 582 | dependencies: 583 | asynckit "^0.4.0" 584 | combined-stream "^1.0.5" 585 | mime-types "^2.1.12" 586 | 587 | fs.realpath@^1.0.0: 588 | version "1.0.0" 589 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 590 | 591 | generate-function@^2.0.0: 592 | version "2.0.0" 593 | resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" 594 | 595 | generate-object-property@^1.1.0: 596 | version "1.2.0" 597 | resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" 598 | dependencies: 599 | is-property "^1.0.0" 600 | 601 | get-caller-file@^1.0.1: 602 | version "1.0.2" 603 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" 604 | 605 | get-stream@^3.0.0: 606 | version "3.0.0" 607 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 608 | 609 | getpass@^0.1.1: 610 | version "0.1.7" 611 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 612 | dependencies: 613 | assert-plus "^1.0.0" 614 | 615 | glob-base@^0.3.0: 616 | version "0.3.0" 617 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 618 | dependencies: 619 | glob-parent "^2.0.0" 620 | is-glob "^2.0.0" 621 | 622 | glob-parent@^2.0.0: 623 | version "2.0.0" 624 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 625 | dependencies: 626 | is-glob "^2.0.0" 627 | 628 | glob@7.1.2, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1: 629 | version "7.1.2" 630 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 631 | dependencies: 632 | fs.realpath "^1.0.0" 633 | inflight "^1.0.4" 634 | inherits "2" 635 | minimatch "^3.0.4" 636 | once "^1.3.0" 637 | path-is-absolute "^1.0.0" 638 | 639 | glob@~5.0.0: 640 | version "5.0.15" 641 | resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" 642 | dependencies: 643 | inflight "^1.0.4" 644 | inherits "2" 645 | minimatch "2 || 3" 646 | once "^1.3.0" 647 | path-is-absolute "^1.0.0" 648 | 649 | globals@^9.0.0: 650 | version "9.17.0" 651 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" 652 | 653 | got@^6.7.1: 654 | version "6.7.1" 655 | resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" 656 | dependencies: 657 | create-error-class "^3.0.0" 658 | duplexer3 "^0.1.4" 659 | get-stream "^3.0.0" 660 | is-redirect "^1.0.0" 661 | is-retry-allowed "^1.0.0" 662 | is-stream "^1.0.0" 663 | lowercase-keys "^1.0.0" 664 | safe-buffer "^5.0.1" 665 | timed-out "^4.0.0" 666 | unzip-response "^2.0.1" 667 | url-parse-lax "^1.0.0" 668 | 669 | graceful-fs@^4.1.11, graceful-fs@^4.1.2: 670 | version "4.1.11" 671 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 672 | 673 | growl@1.10.3: 674 | version "1.10.3" 675 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f" 676 | 677 | handlebars@^4.0.3: 678 | version "4.0.6" 679 | resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7" 680 | dependencies: 681 | async "^1.4.0" 682 | optimist "^0.6.1" 683 | source-map "^0.4.4" 684 | optionalDependencies: 685 | uglify-js "^2.6" 686 | 687 | har-validator@~2.0.6: 688 | version "2.0.6" 689 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" 690 | dependencies: 691 | chalk "^1.1.1" 692 | commander "^2.9.0" 693 | is-my-json-valid "^2.12.4" 694 | pinkie-promise "^2.0.0" 695 | 696 | has-ansi@^2.0.0: 697 | version "2.0.0" 698 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 699 | dependencies: 700 | ansi-regex "^2.0.0" 701 | 702 | has-flag@^1.0.0: 703 | version "1.0.0" 704 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 705 | 706 | has-flag@^2.0.0: 707 | version "2.0.0" 708 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" 709 | 710 | hawk@~3.1.3: 711 | version "3.1.3" 712 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" 713 | dependencies: 714 | boom "2.x.x" 715 | cryptiles "2.x.x" 716 | hoek "2.x.x" 717 | sntp "1.x.x" 718 | 719 | he@1.1.1: 720 | version "1.1.1" 721 | resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" 722 | 723 | hoek@2.x.x: 724 | version "2.16.3" 725 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 726 | 727 | hosted-git-info@^2.1.4: 728 | version "2.4.1" 729 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.1.tgz#4b0445e41c004a8bd1337773a4ff790ca40318c8" 730 | 731 | http-signature@~1.1.0: 732 | version "1.1.1" 733 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" 734 | dependencies: 735 | assert-plus "^0.2.0" 736 | jsprim "^1.2.2" 737 | sshpk "^1.7.0" 738 | 739 | imurmurhash@^0.1.4: 740 | version "0.1.4" 741 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 742 | 743 | inflight@^1.0.4: 744 | version "1.0.6" 745 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 746 | dependencies: 747 | once "^1.3.0" 748 | wrappy "1" 749 | 750 | inherits@2: 751 | version "2.0.3" 752 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 753 | 754 | ini@~1.3.0: 755 | version "1.3.4" 756 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 757 | 758 | invariant@^2.2.0: 759 | version "2.2.2" 760 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" 761 | dependencies: 762 | loose-envify "^1.0.0" 763 | 764 | invert-kv@^1.0.0: 765 | version "1.0.0" 766 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" 767 | 768 | is-arrayish@^0.2.1: 769 | version "0.2.1" 770 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 771 | 772 | is-buffer@^1.0.2: 773 | version "1.1.5" 774 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" 775 | 776 | is-builtin-module@^1.0.0: 777 | version "1.0.0" 778 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 779 | dependencies: 780 | builtin-modules "^1.0.0" 781 | 782 | is-dotfile@^1.0.0: 783 | version "1.0.2" 784 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" 785 | 786 | is-equal-shallow@^0.1.3: 787 | version "0.1.3" 788 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 789 | dependencies: 790 | is-primitive "^2.0.0" 791 | 792 | is-extendable@^0.1.1: 793 | version "0.1.1" 794 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 795 | 796 | is-extglob@^1.0.0: 797 | version "1.0.0" 798 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 799 | 800 | is-finite@^1.0.0: 801 | version "1.0.2" 802 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 803 | dependencies: 804 | number-is-nan "^1.0.0" 805 | 806 | is-fullwidth-code-point@^1.0.0: 807 | version "1.0.0" 808 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 809 | dependencies: 810 | number-is-nan "^1.0.0" 811 | 812 | is-fullwidth-code-point@^2.0.0: 813 | version "2.0.0" 814 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 815 | 816 | is-glob@^2.0.0, is-glob@^2.0.1: 817 | version "2.0.1" 818 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 819 | dependencies: 820 | is-extglob "^1.0.0" 821 | 822 | is-my-json-valid@^2.12.4: 823 | version "2.16.0" 824 | resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" 825 | dependencies: 826 | generate-function "^2.0.0" 827 | generate-object-property "^1.1.0" 828 | jsonpointer "^4.0.0" 829 | xtend "^4.0.0" 830 | 831 | is-npm@^1.0.0: 832 | version "1.0.0" 833 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" 834 | 835 | is-number@^2.0.2, is-number@^2.1.0: 836 | version "2.1.0" 837 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 838 | dependencies: 839 | kind-of "^3.0.2" 840 | 841 | is-obj@^1.0.0: 842 | version "1.0.1" 843 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" 844 | 845 | is-posix-bracket@^0.1.0: 846 | version "0.1.1" 847 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 848 | 849 | is-primitive@^2.0.0: 850 | version "2.0.0" 851 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 852 | 853 | is-property@^1.0.0: 854 | version "1.0.2" 855 | resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" 856 | 857 | is-redirect@^1.0.0: 858 | version "1.0.0" 859 | resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" 860 | 861 | is-retry-allowed@^1.0.0: 862 | version "1.1.0" 863 | resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" 864 | 865 | is-stream@^1.0.0, is-stream@^1.1.0: 866 | version "1.1.0" 867 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 868 | 869 | is-typedarray@~1.0.0: 870 | version "1.0.0" 871 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 872 | 873 | is-utf8@^0.2.0: 874 | version "0.2.1" 875 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 876 | 877 | isarray@1.0.0: 878 | version "1.0.0" 879 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 880 | 881 | isexe@^2.0.0: 882 | version "2.0.0" 883 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 884 | 885 | isobject@^2.0.0: 886 | version "2.1.0" 887 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 888 | dependencies: 889 | isarray "1.0.0" 890 | 891 | isstream@~0.1.2: 892 | version "0.1.2" 893 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 894 | 895 | istanbul-lib-coverage@^1.0.2: 896 | version "1.0.2" 897 | resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.2.tgz#87a0c015b6910651cb3b184814dfb339337e25e1" 898 | 899 | istanbul-lib-hook@^1.0.5: 900 | version "1.0.5" 901 | resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.5.tgz#6ca3d16d60c5f4082da39f7c5cd38ea8a772b88e" 902 | dependencies: 903 | append-transform "^0.4.0" 904 | 905 | istanbul-lib-instrument@^1.7.0: 906 | version "1.7.0" 907 | resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.0.tgz#b8e0dc25709bb44e17336ab47b7bb5c97c23f659" 908 | dependencies: 909 | babel-generator "^6.18.0" 910 | babel-template "^6.16.0" 911 | babel-traverse "^6.18.0" 912 | babel-types "^6.18.0" 913 | babylon "^6.13.0" 914 | istanbul-lib-coverage "^1.0.2" 915 | semver "^5.3.0" 916 | 917 | istanbul-lib-report@^1.0.0: 918 | version "1.0.0" 919 | resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.0.0.tgz#d83dac7f26566b521585569367fe84ccfc7aaecb" 920 | dependencies: 921 | istanbul-lib-coverage "^1.0.2" 922 | mkdirp "^0.5.1" 923 | path-parse "^1.0.5" 924 | supports-color "^3.1.2" 925 | 926 | istanbul-lib-source-maps@^1.1.1: 927 | version "1.1.1" 928 | resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.1.1.tgz#f8c8c2e8f2160d1d91526d97e5bd63b2079af71c" 929 | dependencies: 930 | istanbul-lib-coverage "^1.0.2" 931 | mkdirp "^0.5.1" 932 | rimraf "^2.4.4" 933 | source-map "^0.5.3" 934 | 935 | istanbul-reports@^1.0.2: 936 | version "1.0.2" 937 | resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.0.2.tgz#4e8366abe6fa746cc1cd6633f108de12cc6ac6fa" 938 | dependencies: 939 | handlebars "^4.0.3" 940 | 941 | jodid25519@^1.0.0: 942 | version "1.0.2" 943 | resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" 944 | dependencies: 945 | jsbn "~0.1.0" 946 | 947 | js-tokens@^3.0.0: 948 | version "3.0.1" 949 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" 950 | 951 | js-yaml@3.6.1: 952 | version "3.6.1" 953 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" 954 | dependencies: 955 | argparse "^1.0.7" 956 | esprima "^2.6.0" 957 | 958 | jsbn@~0.1.0: 959 | version "0.1.1" 960 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 961 | 962 | jsesc@^1.3.0: 963 | version "1.3.0" 964 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" 965 | 966 | json-schema@0.2.3: 967 | version "0.2.3" 968 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 969 | 970 | json-stringify-safe@~5.0.1: 971 | version "5.0.1" 972 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 973 | 974 | jsonpointer@^4.0.0: 975 | version "4.0.1" 976 | resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" 977 | 978 | jsprim@^1.2.2: 979 | version "1.4.0" 980 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" 981 | dependencies: 982 | assert-plus "1.0.0" 983 | extsprintf "1.0.2" 984 | json-schema "0.2.3" 985 | verror "1.3.6" 986 | 987 | kind-of@^3.0.2: 988 | version "3.1.0" 989 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47" 990 | dependencies: 991 | is-buffer "^1.0.2" 992 | 993 | latest-version@^3.0.0: 994 | version "3.1.0" 995 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" 996 | dependencies: 997 | package-json "^4.0.0" 998 | 999 | lazy-cache@^1.0.3: 1000 | version "1.0.4" 1001 | resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" 1002 | 1003 | lazy-req@^2.0.0: 1004 | version "2.0.0" 1005 | resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-2.0.0.tgz#c9450a363ecdda2e6f0c70132ad4f37f8f06f2b4" 1006 | 1007 | lcid@^1.0.0: 1008 | version "1.0.0" 1009 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 1010 | dependencies: 1011 | invert-kv "^1.0.0" 1012 | 1013 | lcov-parse@0.0.10: 1014 | version "0.0.10" 1015 | resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" 1016 | 1017 | load-json-file@^1.0.0: 1018 | version "1.1.0" 1019 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 1020 | dependencies: 1021 | graceful-fs "^4.1.2" 1022 | parse-json "^2.2.0" 1023 | pify "^2.0.0" 1024 | pinkie-promise "^2.0.0" 1025 | strip-bom "^2.0.0" 1026 | 1027 | lodash@^4.2.0: 1028 | version "4.17.4" 1029 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 1030 | 1031 | log-driver@1.2.5: 1032 | version "1.2.5" 1033 | resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.5.tgz#7ae4ec257302fd790d557cb10c97100d857b0056" 1034 | 1035 | longest@^1.0.1: 1036 | version "1.0.1" 1037 | resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" 1038 | 1039 | loose-envify@^1.0.0: 1040 | version "1.3.1" 1041 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" 1042 | dependencies: 1043 | js-tokens "^3.0.0" 1044 | 1045 | lowercase-keys@^1.0.0: 1046 | version "1.0.0" 1047 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" 1048 | 1049 | lru-cache@^4.0.0, lru-cache@^4.0.1: 1050 | version "4.0.2" 1051 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" 1052 | dependencies: 1053 | pseudomap "^1.0.1" 1054 | yallist "^2.0.0" 1055 | 1056 | md5-hex@^1.2.0: 1057 | version "1.3.0" 1058 | resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-1.3.0.tgz#d2c4afe983c4370662179b8cad145219135046c4" 1059 | dependencies: 1060 | md5-o-matic "^0.1.1" 1061 | 1062 | md5-o-matic@^0.1.1: 1063 | version "0.1.1" 1064 | resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" 1065 | 1066 | merge-source-map@^1.0.2: 1067 | version "1.0.3" 1068 | resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.3.tgz#da1415f2722a5119db07b14c4f973410863a2abf" 1069 | dependencies: 1070 | source-map "^0.5.3" 1071 | 1072 | micromatch@^2.3.11: 1073 | version "2.3.11" 1074 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 1075 | dependencies: 1076 | arr-diff "^2.0.0" 1077 | array-unique "^0.2.1" 1078 | braces "^1.8.2" 1079 | expand-brackets "^0.1.4" 1080 | extglob "^0.3.1" 1081 | filename-regex "^2.0.0" 1082 | is-extglob "^1.0.0" 1083 | is-glob "^2.0.1" 1084 | kind-of "^3.0.2" 1085 | normalize-path "^2.0.1" 1086 | object.omit "^2.0.0" 1087 | parse-glob "^3.0.4" 1088 | regex-cache "^0.4.2" 1089 | 1090 | mime-db@~1.27.0: 1091 | version "1.27.0" 1092 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" 1093 | 1094 | mime-types@^2.1.12, mime-types@~2.1.7: 1095 | version "2.1.15" 1096 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" 1097 | dependencies: 1098 | mime-db "~1.27.0" 1099 | 1100 | "minimatch@2 || 3", minimatch@^3.0.4: 1101 | version "3.0.4" 1102 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1103 | dependencies: 1104 | brace-expansion "^1.1.7" 1105 | 1106 | minimist@0.0.8, minimist@~0.0.1: 1107 | version "0.0.8" 1108 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1109 | 1110 | minimist@1.2.0, minimist@^1.2.0: 1111 | version "1.2.0" 1112 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1113 | 1114 | mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1: 1115 | version "0.5.1" 1116 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1117 | dependencies: 1118 | minimist "0.0.8" 1119 | 1120 | mocha@^4.0.1: 1121 | version "4.0.1" 1122 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-4.0.1.tgz#0aee5a95cf69a4618820f5e51fa31717117daf1b" 1123 | dependencies: 1124 | browser-stdout "1.3.0" 1125 | commander "2.11.0" 1126 | debug "3.1.0" 1127 | diff "3.3.1" 1128 | escape-string-regexp "1.0.5" 1129 | glob "7.1.2" 1130 | growl "1.10.3" 1131 | he "1.1.1" 1132 | mkdirp "0.5.1" 1133 | supports-color "4.4.0" 1134 | 1135 | ms@0.7.1: 1136 | version "0.7.1" 1137 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" 1138 | 1139 | ms@2.0.0: 1140 | version "2.0.0" 1141 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1142 | 1143 | normalize-package-data@^2.3.2: 1144 | version "2.3.6" 1145 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.6.tgz#498fa420c96401f787402ba21e600def9f981fff" 1146 | dependencies: 1147 | hosted-git-info "^2.1.4" 1148 | is-builtin-module "^1.0.0" 1149 | semver "2 || 3 || 4 || 5" 1150 | validate-npm-package-license "^3.0.1" 1151 | 1152 | normalize-path@^2.0.1: 1153 | version "2.1.1" 1154 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 1155 | dependencies: 1156 | remove-trailing-separator "^1.0.1" 1157 | 1158 | npm-run-path@^1.0.0: 1159 | version "1.0.0" 1160 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-1.0.0.tgz#f5c32bf595fe81ae927daec52e82f8b000ac3c8f" 1161 | dependencies: 1162 | path-key "^1.0.0" 1163 | 1164 | number-is-nan@^1.0.0: 1165 | version "1.0.1" 1166 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1167 | 1168 | nyc@^10.1.2: 1169 | version "10.2.0" 1170 | resolved "https://registry.yarnpkg.com/nyc/-/nyc-10.2.0.tgz#facd90240600c9aa4dd81ea99c2fb6a85c53de0c" 1171 | dependencies: 1172 | archy "^1.0.0" 1173 | arrify "^1.0.1" 1174 | caching-transform "^1.0.0" 1175 | convert-source-map "^1.3.0" 1176 | debug-log "^1.0.1" 1177 | default-require-extensions "^1.0.0" 1178 | find-cache-dir "^0.1.1" 1179 | find-up "^1.1.2" 1180 | foreground-child "^1.5.3" 1181 | glob "^7.0.6" 1182 | istanbul-lib-coverage "^1.0.2" 1183 | istanbul-lib-hook "^1.0.5" 1184 | istanbul-lib-instrument "^1.7.0" 1185 | istanbul-lib-report "^1.0.0" 1186 | istanbul-lib-source-maps "^1.1.1" 1187 | istanbul-reports "^1.0.2" 1188 | md5-hex "^1.2.0" 1189 | merge-source-map "^1.0.2" 1190 | micromatch "^2.3.11" 1191 | mkdirp "^0.5.0" 1192 | resolve-from "^2.0.0" 1193 | rimraf "^2.5.4" 1194 | signal-exit "^3.0.1" 1195 | spawn-wrap "1.2.4" 1196 | test-exclude "^4.0.0" 1197 | yargs "^7.0.2" 1198 | yargs-parser "^4.0.2" 1199 | 1200 | oauth-sign@~0.8.1: 1201 | version "0.8.2" 1202 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 1203 | 1204 | object-assign@^4.0.1, object-assign@^4.1.0: 1205 | version "4.1.1" 1206 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1207 | 1208 | object.omit@^2.0.0: 1209 | version "2.0.1" 1210 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 1211 | dependencies: 1212 | for-own "^0.1.4" 1213 | is-extendable "^0.1.1" 1214 | 1215 | once@^1.3.0: 1216 | version "1.4.0" 1217 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1218 | dependencies: 1219 | wrappy "1" 1220 | 1221 | optimist@^0.6.1, optimist@~0.6.0: 1222 | version "0.6.1" 1223 | resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" 1224 | dependencies: 1225 | minimist "~0.0.1" 1226 | wordwrap "~0.0.2" 1227 | 1228 | os-homedir@^1.0.1: 1229 | version "1.0.2" 1230 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1231 | 1232 | os-locale@^1.4.0: 1233 | version "1.4.0" 1234 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" 1235 | dependencies: 1236 | lcid "^1.0.0" 1237 | 1238 | package-json@^4.0.0: 1239 | version "4.0.0" 1240 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.0.tgz#f3c9dc8738f5b59304d54d2cfb3f91d08fdd7998" 1241 | dependencies: 1242 | got "^6.7.1" 1243 | registry-auth-token "^3.0.1" 1244 | registry-url "^3.0.3" 1245 | semver "^5.1.0" 1246 | 1247 | parse-glob@^3.0.4: 1248 | version "3.0.4" 1249 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 1250 | dependencies: 1251 | glob-base "^0.3.0" 1252 | is-dotfile "^1.0.0" 1253 | is-extglob "^1.0.0" 1254 | is-glob "^2.0.0" 1255 | 1256 | parse-json@^2.2.0: 1257 | version "2.2.0" 1258 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1259 | dependencies: 1260 | error-ex "^1.2.0" 1261 | 1262 | path-exists@^2.0.0: 1263 | version "2.1.0" 1264 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 1265 | dependencies: 1266 | pinkie-promise "^2.0.0" 1267 | 1268 | path-is-absolute@^1.0.0: 1269 | version "1.0.1" 1270 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1271 | 1272 | path-key@^1.0.0: 1273 | version "1.0.0" 1274 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-1.0.0.tgz#5d53d578019646c0d68800db4e146e6bdc2ac7af" 1275 | 1276 | path-parse@^1.0.5: 1277 | version "1.0.5" 1278 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" 1279 | 1280 | path-type@^1.0.0: 1281 | version "1.1.0" 1282 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 1283 | dependencies: 1284 | graceful-fs "^4.1.2" 1285 | pify "^2.0.0" 1286 | pinkie-promise "^2.0.0" 1287 | 1288 | pify@^2.0.0: 1289 | version "2.3.0" 1290 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1291 | 1292 | pinkie-promise@^2.0.0: 1293 | version "2.0.1" 1294 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1295 | dependencies: 1296 | pinkie "^2.0.0" 1297 | 1298 | pinkie@^2.0.0: 1299 | version "2.0.4" 1300 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1301 | 1302 | pkg-dir@^1.0.0: 1303 | version "1.0.0" 1304 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" 1305 | dependencies: 1306 | find-up "^1.0.0" 1307 | 1308 | prepend-http@^1.0.1: 1309 | version "1.0.4" 1310 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" 1311 | 1312 | preserve@^0.2.0: 1313 | version "0.2.0" 1314 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 1315 | 1316 | pseudomap@^1.0.1: 1317 | version "1.0.2" 1318 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1319 | 1320 | punycode@^1.4.1: 1321 | version "1.4.1" 1322 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1323 | 1324 | qs@~6.3.0: 1325 | version "6.3.2" 1326 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" 1327 | 1328 | randomatic@^1.1.3: 1329 | version "1.1.6" 1330 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" 1331 | dependencies: 1332 | is-number "^2.0.2" 1333 | kind-of "^3.0.2" 1334 | 1335 | rc@^1.0.1, rc@^1.1.6: 1336 | version "1.2.1" 1337 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" 1338 | dependencies: 1339 | deep-extend "~0.4.0" 1340 | ini "~1.3.0" 1341 | minimist "^1.2.0" 1342 | strip-json-comments "~2.0.1" 1343 | 1344 | read-pkg-up@^1.0.1: 1345 | version "1.0.1" 1346 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 1347 | dependencies: 1348 | find-up "^1.0.0" 1349 | read-pkg "^1.0.0" 1350 | 1351 | read-pkg@^1.0.0: 1352 | version "1.1.0" 1353 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 1354 | dependencies: 1355 | load-json-file "^1.0.0" 1356 | normalize-package-data "^2.3.2" 1357 | path-type "^1.0.0" 1358 | 1359 | regenerator-runtime@^0.10.0: 1360 | version "0.10.3" 1361 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz#8c4367a904b51ea62a908ac310bf99ff90a82a3e" 1362 | 1363 | regex-cache@^0.4.2: 1364 | version "0.4.3" 1365 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" 1366 | dependencies: 1367 | is-equal-shallow "^0.1.3" 1368 | is-primitive "^2.0.0" 1369 | 1370 | registry-auth-token@^3.0.1: 1371 | version "3.1.2" 1372 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.1.2.tgz#1b9e51a185c930da34a9894b12a52ea998f1adaf" 1373 | dependencies: 1374 | rc "^1.1.6" 1375 | 1376 | registry-url@^3.0.3: 1377 | version "3.1.0" 1378 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" 1379 | dependencies: 1380 | rc "^1.0.1" 1381 | 1382 | remove-trailing-separator@^1.0.1: 1383 | version "1.0.1" 1384 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4" 1385 | 1386 | repeat-element@^1.1.2: 1387 | version "1.1.2" 1388 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 1389 | 1390 | repeat-string@^1.5.2: 1391 | version "1.6.1" 1392 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1393 | 1394 | repeating@^2.0.0: 1395 | version "2.0.1" 1396 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 1397 | dependencies: 1398 | is-finite "^1.0.0" 1399 | 1400 | request@2.79.0: 1401 | version "2.79.0" 1402 | resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" 1403 | dependencies: 1404 | aws-sign2 "~0.6.0" 1405 | aws4 "^1.2.1" 1406 | caseless "~0.11.0" 1407 | combined-stream "~1.0.5" 1408 | extend "~3.0.0" 1409 | forever-agent "~0.6.1" 1410 | form-data "~2.1.1" 1411 | har-validator "~2.0.6" 1412 | hawk "~3.1.3" 1413 | http-signature "~1.1.0" 1414 | is-typedarray "~1.0.0" 1415 | isstream "~0.1.2" 1416 | json-stringify-safe "~5.0.1" 1417 | mime-types "~2.1.7" 1418 | oauth-sign "~0.8.1" 1419 | qs "~6.3.0" 1420 | stringstream "~0.0.4" 1421 | tough-cookie "~2.3.0" 1422 | tunnel-agent "~0.4.1" 1423 | uuid "^3.0.0" 1424 | 1425 | require-directory@^2.1.1: 1426 | version "2.1.1" 1427 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1428 | 1429 | require-main-filename@^1.0.1: 1430 | version "1.0.1" 1431 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 1432 | 1433 | resolve-from@^2.0.0: 1434 | version "2.0.0" 1435 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" 1436 | 1437 | resolve@^1.1.7: 1438 | version "1.3.2" 1439 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.2.tgz#1f0442c9e0cbb8136e87b9305f932f46c7f28235" 1440 | dependencies: 1441 | path-parse "^1.0.5" 1442 | 1443 | right-align@^0.1.1: 1444 | version "0.1.3" 1445 | resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" 1446 | dependencies: 1447 | align-text "^0.1.1" 1448 | 1449 | rimraf@^2.3.3, rimraf@^2.4.4, rimraf@^2.5.4, rimraf@^2.6.1: 1450 | version "2.6.1" 1451 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" 1452 | dependencies: 1453 | glob "^7.0.5" 1454 | 1455 | safe-buffer@^5.0.1: 1456 | version "5.0.1" 1457 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" 1458 | 1459 | semver-diff@^2.0.0: 1460 | version "2.1.0" 1461 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" 1462 | dependencies: 1463 | semver "^5.0.3" 1464 | 1465 | "semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0: 1466 | version "5.3.0" 1467 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 1468 | 1469 | set-blocking@^2.0.0: 1470 | version "2.0.0" 1471 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1472 | 1473 | signal-exit@^2.0.0: 1474 | version "2.1.2" 1475 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-2.1.2.tgz#375879b1f92ebc3b334480d038dc546a6d558564" 1476 | 1477 | signal-exit@^3.0.0, signal-exit@^3.0.1: 1478 | version "3.0.2" 1479 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1480 | 1481 | slide@^1.1.5: 1482 | version "1.1.6" 1483 | resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" 1484 | 1485 | sntp@1.x.x: 1486 | version "1.0.9" 1487 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" 1488 | dependencies: 1489 | hoek "2.x.x" 1490 | 1491 | source-map@^0.4.4: 1492 | version "0.4.4" 1493 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" 1494 | dependencies: 1495 | amdefine ">=0.0.4" 1496 | 1497 | source-map@^0.5.0, source-map@^0.5.3, source-map@~0.5.1: 1498 | version "0.5.6" 1499 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" 1500 | 1501 | spawn-wrap@1.2.4: 1502 | version "1.2.4" 1503 | resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.2.4.tgz#920eb211a769c093eebfbd5b0e7a5d2e68ab2e40" 1504 | dependencies: 1505 | foreground-child "^1.3.3" 1506 | mkdirp "^0.5.0" 1507 | os-homedir "^1.0.1" 1508 | rimraf "^2.3.3" 1509 | signal-exit "^2.0.0" 1510 | which "^1.2.4" 1511 | 1512 | spdx-correct@~1.0.0: 1513 | version "1.0.2" 1514 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" 1515 | dependencies: 1516 | spdx-license-ids "^1.0.2" 1517 | 1518 | spdx-expression-parse@~1.0.0: 1519 | version "1.0.4" 1520 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" 1521 | 1522 | spdx-license-ids@^1.0.2: 1523 | version "1.2.2" 1524 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" 1525 | 1526 | sprintf-js@~1.0.2: 1527 | version "1.0.3" 1528 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1529 | 1530 | sshpk@^1.7.0: 1531 | version "1.13.0" 1532 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c" 1533 | dependencies: 1534 | asn1 "~0.2.3" 1535 | assert-plus "^1.0.0" 1536 | dashdash "^1.12.0" 1537 | getpass "^0.1.1" 1538 | optionalDependencies: 1539 | bcrypt-pbkdf "^1.0.0" 1540 | ecc-jsbn "~0.1.1" 1541 | jodid25519 "^1.0.0" 1542 | jsbn "~0.1.0" 1543 | tweetnacl "~0.14.0" 1544 | 1545 | string-width@^1.0.1, string-width@^1.0.2: 1546 | version "1.0.2" 1547 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1548 | dependencies: 1549 | code-point-at "^1.0.0" 1550 | is-fullwidth-code-point "^1.0.0" 1551 | strip-ansi "^3.0.0" 1552 | 1553 | string-width@^2.0.0: 1554 | version "2.0.0" 1555 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" 1556 | dependencies: 1557 | is-fullwidth-code-point "^2.0.0" 1558 | strip-ansi "^3.0.0" 1559 | 1560 | stringstream@~0.0.4: 1561 | version "0.0.5" 1562 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 1563 | 1564 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1565 | version "3.0.1" 1566 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1567 | dependencies: 1568 | ansi-regex "^2.0.0" 1569 | 1570 | strip-bom@^2.0.0: 1571 | version "2.0.0" 1572 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 1573 | dependencies: 1574 | is-utf8 "^0.2.0" 1575 | 1576 | strip-eof@^1.0.0: 1577 | version "1.0.0" 1578 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 1579 | 1580 | strip-json-comments@~2.0.1: 1581 | version "2.0.1" 1582 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1583 | 1584 | supports-color@4.4.0: 1585 | version "4.4.0" 1586 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" 1587 | dependencies: 1588 | has-flag "^2.0.0" 1589 | 1590 | supports-color@^2.0.0: 1591 | version "2.0.0" 1592 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1593 | 1594 | supports-color@^3.1.2: 1595 | version "3.1.2" 1596 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" 1597 | dependencies: 1598 | has-flag "^1.0.0" 1599 | 1600 | term-size@^0.1.0: 1601 | version "0.1.1" 1602 | resolved "https://registry.yarnpkg.com/term-size/-/term-size-0.1.1.tgz#87360b96396cab5760963714cda0d0cbeecad9ca" 1603 | dependencies: 1604 | execa "^0.4.0" 1605 | 1606 | test-exclude@^4.0.0: 1607 | version "4.0.3" 1608 | resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.0.3.tgz#86a13ce3effcc60e6c90403cf31a27a60ac6c4e7" 1609 | dependencies: 1610 | arrify "^1.0.1" 1611 | micromatch "^2.3.11" 1612 | object-assign "^4.1.0" 1613 | read-pkg-up "^1.0.1" 1614 | require-main-filename "^1.0.1" 1615 | 1616 | timed-out@^4.0.0: 1617 | version "4.0.1" 1618 | resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" 1619 | 1620 | to-fast-properties@^1.0.1: 1621 | version "1.0.2" 1622 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" 1623 | 1624 | tough-cookie@~2.3.0: 1625 | version "2.3.2" 1626 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" 1627 | dependencies: 1628 | punycode "^1.4.1" 1629 | 1630 | trim-right@^1.0.1: 1631 | version "1.0.1" 1632 | resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" 1633 | 1634 | tslint@^4.5.1: 1635 | version "4.5.1" 1636 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-4.5.1.tgz#05356871bef23a434906734006fc188336ba824b" 1637 | dependencies: 1638 | babel-code-frame "^6.20.0" 1639 | colors "^1.1.2" 1640 | diff "^3.0.1" 1641 | findup-sync "~0.3.0" 1642 | glob "^7.1.1" 1643 | optimist "~0.6.0" 1644 | resolve "^1.1.7" 1645 | tsutils "^1.1.0" 1646 | update-notifier "^2.0.0" 1647 | 1648 | tsutils@^1.1.0: 1649 | version "1.6.0" 1650 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-1.6.0.tgz#1fd7fac2a61369ed99cd3997f0fbb437128850f2" 1651 | 1652 | tunnel-agent@~0.4.1: 1653 | version "0.4.3" 1654 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" 1655 | 1656 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 1657 | version "0.14.5" 1658 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 1659 | 1660 | type-detect@0.1.1: 1661 | version "0.1.1" 1662 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" 1663 | 1664 | type-detect@^1.0.0: 1665 | version "1.0.0" 1666 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" 1667 | 1668 | typescript@^2.6.1: 1669 | version "2.6.1" 1670 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.6.1.tgz#ef39cdea27abac0b500242d6726ab90e0c846631" 1671 | 1672 | uglify-js@^2.6: 1673 | version "2.8.22" 1674 | resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.22.tgz#d54934778a8da14903fa29a326fb24c0ab51a1a0" 1675 | dependencies: 1676 | source-map "~0.5.1" 1677 | yargs "~3.10.0" 1678 | optionalDependencies: 1679 | uglify-to-browserify "~1.0.0" 1680 | 1681 | uglify-to-browserify@~1.0.0: 1682 | version "1.0.2" 1683 | resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" 1684 | 1685 | unique-string@^1.0.0: 1686 | version "1.0.0" 1687 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" 1688 | dependencies: 1689 | crypto-random-string "^1.0.0" 1690 | 1691 | unzip-response@^2.0.1: 1692 | version "2.0.1" 1693 | resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" 1694 | 1695 | update-notifier@^2.0.0: 1696 | version "2.1.0" 1697 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.1.0.tgz#ec0c1e53536b76647a24b77cb83966d9315123d9" 1698 | dependencies: 1699 | boxen "^1.0.0" 1700 | chalk "^1.0.0" 1701 | configstore "^3.0.0" 1702 | is-npm "^1.0.0" 1703 | latest-version "^3.0.0" 1704 | lazy-req "^2.0.0" 1705 | semver-diff "^2.0.0" 1706 | xdg-basedir "^3.0.0" 1707 | 1708 | url-parse-lax@^1.0.0: 1709 | version "1.0.0" 1710 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" 1711 | dependencies: 1712 | prepend-http "^1.0.1" 1713 | 1714 | uuid@^3.0.0: 1715 | version "3.0.1" 1716 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" 1717 | 1718 | validate-npm-package-license@^3.0.1: 1719 | version "3.0.1" 1720 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" 1721 | dependencies: 1722 | spdx-correct "~1.0.0" 1723 | spdx-expression-parse "~1.0.0" 1724 | 1725 | verror@1.3.6: 1726 | version "1.3.6" 1727 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" 1728 | dependencies: 1729 | extsprintf "1.0.2" 1730 | 1731 | vue@^2.5.3: 1732 | version "2.5.3" 1733 | resolved "https://registry.yarnpkg.com/vue/-/vue-2.5.3.tgz#e1a3b1f49b6e93e574ce040b95cbc873912fecc1" 1734 | 1735 | vuex@^3.0.1: 1736 | version "3.0.1" 1737 | resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.0.1.tgz#e761352ebe0af537d4bb755a9b9dc4be3df7efd2" 1738 | 1739 | which-module@^1.0.0: 1740 | version "1.0.0" 1741 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" 1742 | 1743 | which@^1.2.4, which@^1.2.8, which@^1.2.9: 1744 | version "1.2.14" 1745 | resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" 1746 | dependencies: 1747 | isexe "^2.0.0" 1748 | 1749 | widest-line@^1.0.0: 1750 | version "1.0.0" 1751 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" 1752 | dependencies: 1753 | string-width "^1.0.1" 1754 | 1755 | window-size@0.1.0: 1756 | version "0.1.0" 1757 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" 1758 | 1759 | wordwrap@0.0.2: 1760 | version "0.0.2" 1761 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" 1762 | 1763 | wordwrap@~0.0.2: 1764 | version "0.0.3" 1765 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" 1766 | 1767 | wrap-ansi@^2.0.0: 1768 | version "2.1.0" 1769 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 1770 | dependencies: 1771 | string-width "^1.0.1" 1772 | strip-ansi "^3.0.1" 1773 | 1774 | wrappy@1: 1775 | version "1.0.2" 1776 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1777 | 1778 | write-file-atomic@^1.1.2, write-file-atomic@^1.1.4: 1779 | version "1.3.1" 1780 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.1.tgz#7d45ba32316328dd1ec7d90f60ebc0d845bb759a" 1781 | dependencies: 1782 | graceful-fs "^4.1.11" 1783 | imurmurhash "^0.1.4" 1784 | slide "^1.1.5" 1785 | 1786 | xdg-basedir@^3.0.0: 1787 | version "3.0.0" 1788 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" 1789 | 1790 | xtend@^4.0.0: 1791 | version "4.0.1" 1792 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 1793 | 1794 | y18n@^3.2.1: 1795 | version "3.2.1" 1796 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" 1797 | 1798 | yallist@^2.0.0: 1799 | version "2.1.2" 1800 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 1801 | 1802 | yargs-parser@^4.0.2: 1803 | version "4.2.1" 1804 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" 1805 | dependencies: 1806 | camelcase "^3.0.0" 1807 | 1808 | yargs-parser@^5.0.0: 1809 | version "5.0.0" 1810 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" 1811 | dependencies: 1812 | camelcase "^3.0.0" 1813 | 1814 | yargs@^7.0.2: 1815 | version "7.0.2" 1816 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.0.2.tgz#115b97df1321823e8b8648e8968c782521221f67" 1817 | dependencies: 1818 | camelcase "^3.0.0" 1819 | cliui "^3.2.0" 1820 | decamelize "^1.1.1" 1821 | get-caller-file "^1.0.1" 1822 | os-locale "^1.4.0" 1823 | read-pkg-up "^1.0.1" 1824 | require-directory "^2.1.1" 1825 | require-main-filename "^1.0.1" 1826 | set-blocking "^2.0.0" 1827 | string-width "^1.0.2" 1828 | which-module "^1.0.0" 1829 | y18n "^3.2.1" 1830 | yargs-parser "^5.0.0" 1831 | 1832 | yargs@~3.10.0: 1833 | version "3.10.0" 1834 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" 1835 | dependencies: 1836 | camelcase "^1.0.2" 1837 | cliui "^2.1.0" 1838 | decamelize "^1.0.0" 1839 | window-size "0.1.0" 1840 | --------------------------------------------------------------------------------