├── .babelrc ├── .gitignore ├── .npmignore ├── CHANGELOG.md ├── README.md ├── circle.yml ├── package.json ├── src ├── action-reducer.js ├── index.js ├── ui.js └── utils.js ├── test ├── action-reducer │ └── reducer.js ├── setup.js ├── ui │ ├── context.js │ ├── defaults.js │ ├── key.js │ ├── opts.js │ ├── reducer.js │ ├── reset.js │ └── validation.js └── utils │ └── render.js └── yarn.lock /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["es2015", "react", "stage-0"], 3 | "plugins": ["transform-decorators-legacy"] 4 | } 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | transpiled 2 | node_modules 3 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # v0.1.0 2 | - Update dependencies to work with React 15 (thanks @kurtfunai) 3 | - Allow functions inside updateUI (`this.props.updateUI('username', v => v.toUpperCase());`) 4 | 5 | # v0.0.15 6 | - Add: Allow `options` and `mergeProps` to be passed to `@connect()` 7 | - Add: Expose `uiPath` in `this.props.uiPath` 8 | - Fix state evaluation when parents call resetUI 9 | - Fix state evaluation when child call resetUI 10 | 11 | # v0.0.14 12 | - Fix: update package.json for react 15 13 | 14 | # v0.0.13 15 | - republish of 0.0.12 due to npm error 16 | 17 | # v0.0.12 18 | - Add support for redux-immutable 19 | 20 | # v0.0.11 21 | - Change: Upgrade to babel 6 22 | - Improve: Throw an error when custom reducers return no state 23 | 24 | # v0.0.9 25 | - Fix: issue where componentWillReceiveProps could break derived state from 26 | functions within opts.state 27 | 28 | # v0.0.8 29 | - Add: allow default state to be set from an evaulated function with the 30 | signature (props, state). 31 | 32 | # v0.0.7 33 | - Add: Custom per-component reducers for local UI state modification 34 | - Fix: Fix react warnings from setting props in constructor 35 | 36 | # v0.0.6 37 | - Fix: no longer deeply convert UI defalts to immutableJS 38 | - Change: Set default UI state in constructor 39 | - Change: Delay wiping UI state on unmount in `requestAnimationFrame` 40 | 41 | # v0.0.5 42 | - Work around issue in `componentWillMount` in React. See commit 43 | `5f9ab5c44fc7941e6f78fa9470ab8a04b7487997` for more info. 44 | 45 | # v0.0.4 46 | - Fix invariant import in reducer 47 | 48 | # v0.0.3 49 | - Add transpiled source to package 50 | 51 | # v0.0.2 52 | - Fix dependencies 53 | 54 | # v0.0.1 55 | - Initial version with scoping of contexts from parent to child 56 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Circle CI](https://circleci.com/gh/tonyhb/redux-ui.svg?style=svg)](https://circleci.com/gh/tonyhb/redux-ui) 2 | 3 | # redux-ui: ui state without profanity 4 | 5 | Think of redux-ui as **block-level scoping** for UI state. In this example each block-scope represents a component, and each variable represents a UI state key: 6 | 7 | ```js 8 | { 9 | // Everything inside this scope has access to filter and tags. This is our root UI component. 10 | let filter = ''; 11 | let tags = []; 12 | 13 | // Imagine the following scopes are a list of to-do tasks: 14 | { 15 | // Everything inside this scope has access to isSelected - plus all parent variables. 16 | let isSelected = true 17 | } 18 | { 19 | // This also has isSelected inside its scope and access to parent variables, but 20 | // isSelected is in a separate scope and can be manipulated independently from other 21 | // siblings. 22 | let isSelected = false 23 | } 24 | } 25 | ``` 26 | 27 | Wrap your root component with the redux-ui `@ui()` decorator. It's given a new scope for temporary UI variables which: 28 | 29 | - are automatically bound to `this.props.ui` 30 | - are automatically passed any child component wrapped with the `@ui()` decorator 31 | - will be automatically reset on componentWillUnmount (preventable via options) 32 | - can be reset manually via a prop 33 | - are updatable by any child component within the `@ui()` decorator 34 | 35 | This is **powerful**. **Each component is reusable** and can still affect UI state for parent components. 36 | 37 | ### Setup 38 | 39 | **Step 1**: Add the redux-ui reducer to your reducers **under the `ui` key**: 40 | ```js 41 | import { reducer as uiReducer } from 'redux-ui' 42 | // ... 43 | combineReducers({ ...yourReducers, ui: uiReducer }) 44 | ``` 45 | 46 | **Step 2**: In each 'scene' or parent component add the UI decorator with the key in 47 | which to save all state: 48 | ``` 49 | import ui from 'redux-ui'; 50 | 51 | @ui({ 52 | state: { 53 | yourVars: 'withDefaults', 54 | filters: [] 55 | } 56 | }) 57 | class YourComponent extends React.Component { 58 | } 59 | ``` 60 | 61 | **Step 3**: In each child component use the basic `@ui()` decorator; it will 62 | automatically read and write UI state to the parent component's UI key. 63 | 64 | You can also define variables in child components. If your child component has 65 | variables named the same as a parent component think of block scoping: 66 | everything within your child component down will read from the child's scope, 67 | but the parent will use the parent's UI variable. 68 | 69 | ### Usage 70 | 71 | The `@ui` decorator injects four props into your components: 72 | 73 | 1. `uiKey`: The key passed to the decorator from the decorator (eg. 74 | 'some-decorator' with `@ui('some-decorator')` 75 | 2. `ui`: The UI state for the component's `uiKey` 76 | 3. `updateUI`: A function accepting either a name/value pair or object which 77 | updates state within `uiKey` 78 | 4. `resetUI`: A function which resets the state within `uiKey` to its default 79 | 80 | The decorator will set any default state specified (see below). 81 | On `componentWillUnmount` the entire state in `uiKey` will be set to undefined. 82 | You can also blow away state by calling `resetUI` (for example, on router 83 | changes). 84 | 85 | ### Decorator API 86 | 87 | The decorator takes an object of options: 88 | 89 | ```js 90 | @ui({ 91 | // optional key which is used to determine the UI path in which state will 92 | // be stored. if omitted this is randomly generated. 93 | key: 'some-name', 94 | // optional persist, defaults to false. if set to true persist will keep UI 95 | // state for this component after it unmounts. if set to false the UI state will 96 | // be deleted and recreated when the component remounts 97 | persist: true, 98 | // **required**: UI state for the component 99 | state: { 100 | uiVar1: '', 101 | // You can set default UI state based on the component's props and the 102 | // global store's state. 103 | uiVar2: (props, state) => state.router.location.query.searchTerm 104 | }, 105 | // customReducer: you can handle the UI state for this component's scope by dispatching actions 106 | reducer: (state, action) => { 107 | // state represents *only* the UI state for this component's scope - not any children 108 | switch(action.type) { 109 | case '@@reduxReactRouter/routerDidChange': 110 | if (action.payload.location.query.extra_filters) { 111 | return state.set('extraFilters', true); 112 | } 113 | } 114 | return state; 115 | } 116 | }, 117 | // optional mergeProps passed to react-redux' @connect 118 | mergeProps: () => ({}), 119 | // optional `options` passed to react-redux @connect 120 | options: {} 121 | }) 122 | ``` 123 | 124 | ### Non-decorator API 125 | 126 | You can use redux-ui without using an ES7 decorator like so: 127 | 128 | ``` 129 | import ui from 'redux-ui'; 130 | // or ui = require('redux-ui').default; 131 | 132 | class SomeComponent extends Component { 133 | } 134 | 135 | SomeComponentWithUI = ui({ key: 'some-name', state: { ... }})(SomeComponent); 136 | ``` 137 | 138 | ##### `key`: string, defaults to random characters 139 | 140 | The name of the key used in the UI reducer under which we store all state. Allows you to create selectors in reselect with known paths, and allows setting `persist` below. 141 | 142 | If this is not specified it will be autogenerated based on the component name suffixed with a random hex code. Components using the same key will share the same UI context, so don't supply a name to a list of components (generated in a loop) if they need their own UI state. 143 | 144 | 145 | ##### `persist`: bool, defaults to `false` 146 | 147 | Set to true if the UI state for this component should persist after `componentWillUnmount`. You must also explicitly define a `key` for this component, otherwise the component will randomize the key and load new UI state on instantiation. 148 | 149 | **Note**: All parent UI components also need to set this to true for this to take effect. Think of block-level scoping again — if a parent scope quits all child scopes are also out of context. 150 | 151 | ##### `state`: object 152 | 153 | All UI variables need to be explicitly defined in the state object. This allows us to determine which scope a variable belongs to, as scope is inherited in the component tree. Think of this as using `let` inside your block scopes. 154 | 155 | ### Examples 156 | 157 | ```js 158 | import ui from 'redux-ui'; 159 | 160 | // Component A gets its own context with the default UI state below. 161 | // `this.props.ui` will contain this state map. 162 | @ui({ 163 | state: { 164 | // use the filter query parma via redux-router as the default 165 | filter: (props, state) => state.router.location.query.filter, 166 | isFormVisible: true, 167 | isBackgroundRed: false 168 | } 169 | }) 170 | class A extends Component { 171 | render() { 172 | return ( 173 |
174 | // This will render '{ "filter": '', isFormVisible: true, isBackgroundRed: false }' 175 |
{ this.props.ui }
176 | 177 | // Render child B 178 | 179 |
180 | ); 181 | } 182 | } 183 | 184 | // B inherits context from A and adds its own context. 185 | // This means that this.props.ui still contains A's state map. 186 | @ui() 187 | class B extends Component { 188 | render() { 189 | return ; 190 | } 191 | } 192 | 193 | // C inherits context from its parent B. This works recursively, 194 | // therefore C's `this.props.ui` has the state map from `A` **plus** 195 | // `someChildProp`. 196 | // 197 | // Setting variables within C updates within the context of A; all UI 198 | // components connected to this UI key will receive the new props. 199 | @ui({ 200 | state: { 201 | someChildProp: 'foo' 202 | } 203 | }) 204 | class C extends Component { 205 | render() { 206 | return ( 207 |
208 |

I have my own UI state C and inherit UI state from B and A

209 |

If I define variables which collide with B or A mine will 210 | be used, as it is the most specific context.

211 | ); 212 | } 213 | } 214 | ``` 215 | 216 | ### Aims 217 | 218 | UI state: 219 | 220 | 1. Should be global 221 | 2. Should be easily managed from each component via an action 222 | 3. Should be easy to reset (manually and when unmounting) 223 | 224 | All of these goals should be easy to achieve. 225 | 226 | --- 227 | 228 | MIT license. 229 | 230 | Written by [Franklin Ta](https://github.com/fta2012) and [Tony Holdstock-Brown](https://github.com/tonyhb). 231 | 232 | -------------------------------------------------------------------------------- /circle.yml: -------------------------------------------------------------------------------- 1 | machine: 2 | environment: 3 | PATH: "${PATH}:${HOME}/${CIRCLE_PROJECT_REPONAME}/node_modules/.bin" 4 | 5 | dependencies: 6 | override: 7 | - yarn 8 | 9 | cache_directories: 10 | - ~/.cache/yarn 11 | 12 | test: 13 | override: 14 | - yarn test 15 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "redux-ui", 3 | "version": "0.1.1", 4 | "description": "UI state management for Redux and React", 5 | "main": "transpiled/index.js", 6 | "scripts": { 7 | "prepublish": "$(npm bin)/babel -d transpiled src", 8 | "test": "$(npm bin)/mocha --compilers js:babel-register --recursive --require ./test/setup.js" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/tonyhb/redux-ui.git" 13 | }, 14 | "keywords": [ 15 | "react-component", 16 | "redux", 17 | "redux-ui", 18 | "ui" 19 | ], 20 | "author": "Tony Holdstock-Brown", 21 | "license": "MIT", 22 | "bugs": { 23 | "url": "https://github.com/tonyhb/redux-ui/issues" 24 | }, 25 | "homepage": "https://github.com/tonyhb/redux-ui#readme", 26 | "devDependencies": { 27 | "babel-cli": "6.5.1", 28 | "babel-plugin-transform-decorators-legacy": "^1.3.4", 29 | "babel-preset-es2015": "^6.6.0", 30 | "babel-preset-react": "^6.5.0", 31 | "babel-preset-stage-0": "^6.5.0", 32 | "chai": "^3.4.1", 33 | "jsdom": "^7.2.1", 34 | "mocha": "^2.3.4", 35 | "react-dom": "15.5.0" 36 | }, 37 | "dependencies": { 38 | "babel-register": "^6.6.0", 39 | "immutable": "^3.7.5", 40 | "invariant": "^2.2.0", 41 | "prop-types": "^15.5.7", 42 | "react-redux": "^4.4.8 || ^5.0.4", 43 | "redux": "^3.0.4" 44 | }, 45 | "peerDependencies": { 46 | "react": "^0.14.9 || ^15.3.0 || ^16.0.0" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/action-reducer.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import { Map } from 'immutable'; 4 | import invariant from 'invariant' 5 | 6 | // For updating multiple UI variables at once. Each variable might be part of 7 | // a different context; this means that we need to either call updateUI on each 8 | // key of the object to update or do transformations within one action in the 9 | // reducer. The latter only triggers one store change event and is more 10 | // performant. 11 | export const MASS_UPDATE_UI_STATE = '@@redux-ui/MASS_UPDATE_UI_STATE'; 12 | export const UPDATE_UI_STATE = '@@redux-ui/UPDATE_UI_STATE'; 13 | export const SET_DEFAULT_UI_STATE = '@@redux-ui/SET_DEFAULT_UI_STATE'; 14 | 15 | // These are private consts used in actions only given to the UI decorator. 16 | const MOUNT_UI_STATE = '@@redux-ui/MOUNT_UI_STATE'; 17 | const UNMOUNT_UI_STATE = '@@redux-ui/UNMOUNT_UI_STATE'; 18 | 19 | export const defaultState = new Map({ 20 | __reducers: new Map({ 21 | // This contains a map of component paths (joined by '.') to an object 22 | // containing the fully qualified path and the reducer function: 23 | // 'parent.child': { 24 | // path: ['parent', 'child'], 25 | // func: (state, action) => { ... } 26 | // } 27 | }) 28 | }); 29 | 30 | export default function reducer(state = defaultState, action) { 31 | let key = action.payload && (action.payload.key || []); 32 | 33 | if (!Array.isArray(key)) { 34 | key = [key]; 35 | } 36 | 37 | switch (action.type) { 38 | case UPDATE_UI_STATE: 39 | const { name, value } = action.payload; 40 | if (typeof value === 'function') { 41 | state = state.updateIn(key.concat(name), value); 42 | } else { 43 | state = state.setIn(key.concat(name), value); 44 | } 45 | break; 46 | 47 | case MASS_UPDATE_UI_STATE: 48 | const { uiVars, transforms } = action.payload; 49 | state = state.withMutations( s => { 50 | Object.keys(transforms).forEach(k => { 51 | const path = uiVars[k]; 52 | invariant( 53 | path, 54 | `Couldn't find variable ${k} within your component's UI state ` + 55 | `context. Define ${k} before using it in the @ui decorator` 56 | ); 57 | 58 | s.setIn(path.concat(k), transforms[k]); 59 | }); 60 | }); 61 | break; 62 | 63 | case SET_DEFAULT_UI_STATE: 64 | // Replace all UI under a key with the given values 65 | state = state.setIn(key, new Map(action.payload.value)); 66 | break; 67 | 68 | case MOUNT_UI_STATE: 69 | const { defaults, customReducer } = action.payload; 70 | state = state.withMutations( s => { 71 | // Set the defaults for the component 72 | s.setIn(key, new Map(defaults)); 73 | 74 | // If this component has a custom reducer add it to the list. 75 | // We store the reducer func and UI path for the current component 76 | // inside the __reducers map. 77 | if (customReducer) { 78 | let path = key.join('.'); 79 | s.setIn(['__reducers', path], { 80 | path: key, 81 | func: customReducer 82 | }); 83 | } 84 | 85 | return s; 86 | }); 87 | break; 88 | 89 | case UNMOUNT_UI_STATE: 90 | // We have to use deleteIn as react unmounts root components first; 91 | // this means that using setIn in child contexts will fail as the root 92 | // context will be stored as undefined in our state 93 | state= state.withMutations(s => { 94 | s.deleteIn(key); 95 | // Remove any custom reducers 96 | s.deleteIn(['__reducers', key.join('.')]); 97 | }); 98 | break; 99 | } 100 | 101 | const customReducers = state.get('__reducers'); 102 | if (customReducers.size > 0) { 103 | state = state.withMutations(mut => { 104 | customReducers.forEach(r => { 105 | // This calls each custom reducer with the UI state for each custom 106 | // reducer with the component's UI state tree passed into it. 107 | // 108 | // NOTE: Each component's reducer gets its own UI state: not the entire 109 | // UI reducer's state. Whatever is returned from this reducer is set 110 | // within the **components** UI scope. 111 | // 112 | // This is because it's the only way to update UI state for components 113 | // without keys - you need to know the path in advance to update state 114 | // from a reducer. If you have list of components with no UI keys in 115 | // the component heirarchy, any children will not be able to use custom 116 | // reducers as the path is random. 117 | // 118 | // TODO: Potentially add the possibility for a global UI state reducer? 119 | // Though why wouldn't you just add a custom reducer to the 120 | // top-level component? 121 | const { path, func } = r; 122 | const newState = func(mut.getIn(path), action); 123 | if (newState === undefined) { 124 | throw new Error(`Your custom UI reducer at path ${path.join('.')} must return some state`); 125 | } 126 | mut.setIn(path, newState); 127 | }); 128 | return mut; 129 | }); 130 | } 131 | 132 | return state; 133 | } 134 | 135 | export const reducerEnhancer = (customReducer) => (state, action) => { 136 | state = reducer(state, action); 137 | if (typeof customReducer === 'function') { 138 | state = customReducer(state, action); 139 | } 140 | return state; 141 | } 142 | 143 | export function updateUI(key, name, value) { 144 | return { 145 | type: UPDATE_UI_STATE, 146 | payload: { 147 | key, 148 | name, 149 | value 150 | } 151 | }; 152 | }; 153 | 154 | export function massUpdateUI(uiVars, transforms) { 155 | return { 156 | type: MASS_UPDATE_UI_STATE, 157 | payload: { 158 | uiVars, 159 | transforms 160 | } 161 | }; 162 | } 163 | 164 | // Exposed to components, allowing them to reset their and all child scopes to 165 | // the default variables set up 166 | export function setDefaultUI(key, value) { 167 | return { 168 | type: SET_DEFAULT_UI_STATE, 169 | payload: { 170 | key, 171 | value 172 | } 173 | }; 174 | }; 175 | 176 | /** Private, decorator only actions **/ 177 | 178 | // This is not exposed to your components; it's only used in the decorator. 179 | export function unmountUI(key) { 180 | return { 181 | type: UNMOUNT_UI_STATE, 182 | payload: { 183 | key 184 | } 185 | }; 186 | }; 187 | 188 | /** 189 | * Given the key/path, set of defaults and custom reducer for a UI component 190 | * during construction prepare the state of the UI reducer 191 | * 192 | */ 193 | export function mountUI(key, defaults, customReducer) { 194 | return { 195 | type: MOUNT_UI_STATE, 196 | payload: { 197 | key, 198 | defaults, 199 | customReducer 200 | } 201 | } 202 | } 203 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import ui from './ui'; 4 | import reducer from './action-reducer'; 5 | 6 | export default ui; 7 | export { reducer }; 8 | -------------------------------------------------------------------------------- /src/ui.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import React, { Component } from 'react'; 4 | import { any, array, func, node, object, string } from 'prop-types'; 5 | import { bindActionCreators } from 'redux'; 6 | import { connect } from 'react-redux'; 7 | import invariant from 'invariant'; 8 | import { updateUI, massUpdateUI, setDefaultUI, mountUI, unmountUI } from './action-reducer'; 9 | 10 | import { getUIState } from './utils'; 11 | 12 | export default function ui(key, opts = {}) { 13 | if (typeof key === 'object') { 14 | opts = key; 15 | key = opts.key; 16 | } 17 | 18 | const connector = connect( 19 | (state) => { return { ui: getUIState(state) }; }, 20 | (dispatch) => bindActionCreators({ 21 | updateUI, 22 | massUpdateUI, 23 | setDefaultUI, 24 | mountUI, 25 | unmountUI 26 | }, dispatch), 27 | // These allow you to pass 'mergeProps' and 'options' keys into the 28 | // UI decorator's options which will be passed to @connect(). 29 | // TODO: Document 30 | opts.mergeProps, 31 | opts.options, 32 | ); 33 | 34 | return (WrappedComponent) => { 35 | 36 | // Return a parent UI class which scopes all UI state to the given key 37 | return connector( 38 | /** 39 | * UI is a wrapper component which: 40 | * 1. Inherits any parent scopes from parent components that are wrapped 41 | * by @UI 42 | * 2. Sets up a new UI scope for the current component 43 | * 3. Merges the current UI scope into the parent UI scope (where the 44 | * current scope takes precedence over parents) 45 | * 46 | * This allows normal block-scoping of UI state: 47 | * 48 | * 1. All UI components must define their local state keys 49 | * 2. Upon updating a state key, if it's not in the current scope 50 | * walk up the tree until the variable is set 51 | * 52 | * This means that any child component can affect the current browser 53 | * chrome's UI state whilst maintaining their own local UI state. 54 | * 55 | * All state will be blown away on navigation by default. 56 | */ 57 | class UI extends Component { 58 | 59 | constructor(props, ctx, queue) { 60 | super(props, ctx, queue); 61 | 62 | // If the key is undefined generate a new random hex key for the 63 | // current component's UI scope. 64 | // 65 | // We do this in construct() to guarantee a new key at component 66 | // instantiation time wihch is needed for iterating through a list of 67 | // components with no explicit key 68 | if (key === undefined) { 69 | this.key = (WrappedComponent.displayName || 70 | WrappedComponent.name) + 71 | Math.floor(Math.random() * (1 << 30)).toString(16); 72 | } else { 73 | this.key = key; 74 | } 75 | 76 | // Immediately set this.uiPath and this.uiVars based on the incoming 77 | // context in class instantiation 78 | this.getMergedContextVars(ctx); 79 | } 80 | 81 | static propTypes = { 82 | // The entire global UI state via react-redux connector 83 | ui: object.isRequired, 84 | // These actions are passed via react-redux connector 85 | setDefaultUI: func.isRequired, 86 | updateUI: func.isRequired, 87 | massUpdateUI: func.isRequired 88 | } 89 | 90 | // Pass these down in the new context created for this component 91 | static childContextTypes = { 92 | // uiKey is the name of the parent context's key 93 | uiKey: string, 94 | // uiPath is the current path of the UI context 95 | uiPath: array, 96 | // uiVars is a map of UI variable names stored in state to the parent 97 | // context which controls them. 98 | uiVars: object, 99 | 100 | // Actions to pass to children 101 | updateUI: func, 102 | resetUI: func 103 | } 104 | 105 | // Get the existing context from a UI parent, if possible 106 | static contextTypes = { 107 | // This is used in mergeUIProps and construct() to immediately set 108 | // props. 109 | store: any, 110 | 111 | uiKey: string, 112 | uiPath: array, 113 | uiVars: object, 114 | 115 | updateUI: func, 116 | resetUI: func 117 | } 118 | 119 | componentWillMount() { 120 | // If the component's UI subtree doesn't exist and we have state to 121 | // set ensure we update our global store with the current state. 122 | if (this.props.ui.getIn(this.uiPath) === undefined && opts.state) { 123 | const state = this.getDefaultUIState(opts.state); 124 | this.context.store.dispatch(mountUI(this.uiPath, state, opts.reducer)); 125 | } 126 | } 127 | 128 | // When a parent context calls resetUI it blows away the entire subtree 129 | // that any child contexts may store state in. 130 | // 131 | // We may need to restore default props for this component if a parent 132 | // has blown away our state. 133 | componentWillReceiveProps(nextProps) { 134 | // We can only see if this component's state is blown away by 135 | // accessing the current global UI state; the parent will not 136 | // necessarily always pass down child state. 137 | const ui = getUIState(this.context.store.getState()); 138 | if (ui.getIn(this.uiPath) === undefined && opts.state) { 139 | const state = this.getDefaultUIState(opts.state, nextProps); 140 | this.props.setDefaultUI(this.uiPath, state); 141 | } 142 | } 143 | 144 | // Get default state by evaluating any functions passed in to the state 145 | // opts. 146 | // This is also used within componentWilLReceiveProps and so props 147 | // also needs to be passed in 148 | getDefaultUIState(uiState, props = this.props) { 149 | const globalState = this.context.store.getState(); 150 | let state = { ...uiState }; 151 | Object.keys(state).forEach(k => { 152 | if (typeof(state[k]) === 'function') { 153 | state[k] = state[k](this.props, globalState); 154 | } 155 | }); 156 | return state; 157 | } 158 | 159 | // Blow away all UI state for this component key by setting the 160 | // state for this key to undefined. This will get reset to the 161 | // default state in componentWillMount in the future. 162 | // 163 | // We use requestAnimationFrame because `@ui()` can be combined with 164 | // with `@connect()`; if the connect decorator uses selectors based on 165 | // UI state (such as live filtering) the connect decorator will receive 166 | // `undefined` as `this.props.ui` before unmounting. 167 | // 168 | // requestAnimationFrame avoids this. 169 | componentWillUnmount() { 170 | if (opts.persist !== true) { 171 | if (window && window.requestAnimationFrame) { 172 | window.requestAnimationFrame(() => this.props.unmountUI(this.uiPath)); 173 | } else { 174 | this.props.unmountUI(this.uiPath); 175 | } 176 | } 177 | } 178 | 179 | // Sets this.uiVars && this.uiPath. 180 | // 181 | // Merges this UI context's variables with any parent context's 182 | // variables defined in uiVars. 183 | getMergedContextVars(ctx = this.context) { 184 | if (!this.uiVars || !this.uiPath) { 185 | const uiPath = ctx.uiPath || []; 186 | this.uiPath = uiPath.concat(this.key); 187 | 188 | // Keep trackof each UI variable and which path it should be set in 189 | const state = opts.state || {}; 190 | this.uiVars = { ...ctx.uiVars } || {}; 191 | Object.keys(state).forEach(k => this.uiVars[k] = this.uiPath, this); 192 | } 193 | 194 | return [this.uiVars, this.uiPath]; 195 | } 196 | 197 | // Construct a new context for all child UI components. We need to merge 198 | // in the vars defined in opts.state to uiVars to explicitly state that 199 | // this context is in charge of those variables. 200 | // 201 | // Pass the uiKey and partially applied updateUI function to all 202 | // child components that are wrapped in a plain `@ui()` decorator 203 | getChildContext() { 204 | let [uiVars, uiPath] = this.getMergedContextVars(); 205 | 206 | return { 207 | uiKey: this.key, 208 | uiVars, 209 | uiPath, 210 | 211 | updateUI: ::this.updateUI, 212 | resetUI: ::this.resetUI 213 | }; 214 | } 215 | 216 | // Helper function to reset UI for the current context **and all child 217 | // scopes**. 218 | // 219 | // This is the same as exiting scope in programming; all variables 220 | // defined within the scope are reset. 221 | resetUI() { 222 | this.props.setDefaultUI(this.uiPath, this.getDefaultUIState(opts.state)); 223 | // TODO: Wipe all child contexts 224 | } 225 | 226 | updateUI(name, value) { 227 | // Get a list of all UI variables available to this context (which 228 | // lists parent contexts) to see which key we need to set this in. 229 | const [uiVars] = this.getMergedContextVars(); 230 | const uiVarPath = uiVars[name]; 231 | 232 | if (typeof name === 'object' && value === undefined) { 233 | // We're mass updating many UI variables. These may or may not be 234 | // directly controlled by our context, so we delegate to the 235 | // reducer which will deeply set each variable according to its 236 | // uiPath (from uiVars). 237 | // 238 | // Doing this means we only trigger one store update. 239 | this.props.massUpdateUI(this.uiVars, name); 240 | return 241 | } 242 | 243 | invariant( 244 | uiVarPath, 245 | `The '${name}' UI variable is not defined in the UI context in "` + 246 | (WrappedComponent.displayName || WrappedComponent.name) + '" ' + 247 | 'or any parent UI context. Set this variable using the "state" ' + 248 | 'option in the @ui decorator before using it.' 249 | ); 250 | 251 | this.props.updateUI(uiVarPath, name, value); 252 | } 253 | 254 | // Iterate through the list of contexts merging in UI variables from the 255 | // UI store 256 | mergeUIProps() { 257 | // WARNING: React has a subtle componentWillMount bug which we're 258 | // working around here! 259 | // 260 | // ## React bug 261 | // 262 | // On the first *ever* render of this component we set defaults in 263 | // componentWillMount. This works; when `render()` is called the 264 | // wrapped component has the default props within this.props.ui 265 | // 266 | // BUT. Unmount, navigate away then return to this component. When 267 | // componentWillMount is called a *second* time, we call updateUI to 268 | // set default props. **These aren't passed in to render() until the 269 | // component is mounted a second time**. Even though it worked first 270 | // time. And even though this is a new instance of the component. 271 | // 272 | // ## Workaround. 273 | // 274 | // Instead of relying on this.props.ui from our connector we call 275 | // getState() in the store directly here. We guarantee that this will 276 | // be the latest set of props, including default props set in 277 | // componentWillMount. 278 | // 279 | // We still use @connect() to connect to the store and listen for 280 | // changes in other cases. 281 | const ui = getUIState(this.context.store.getState()); 282 | 283 | return Object.keys(this.uiVars).reduce((props, k) => { 284 | props[k] = ui.getIn(this.uiVars[k].concat(k)); 285 | return props; 286 | }, {}) || {}; 287 | } 288 | 289 | render() { 290 | return ( 291 | 298 | ); 299 | } 300 | } 301 | ); 302 | } 303 | } 304 | -------------------------------------------------------------------------------- /src/utils.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * getUIState inspects redux' global state store and returns the UI state node. 5 | * 6 | * This checks to see whether state is an immutable map or a POJO. 7 | */ 8 | export const getUIState = (state) => { 9 | if (typeof state.get === 'function') { 10 | return state.get('ui'); 11 | } 12 | return state.ui; 13 | } 14 | -------------------------------------------------------------------------------- /test/action-reducer/reducer.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import { 4 | reducer, 5 | reducerEnhancer, 6 | UPDATE_UI_STATE 7 | } from '../../src/action-reducer.js'; 8 | 9 | import { assert } from 'chai'; 10 | import { is, Map } from 'immutable'; 11 | import { Provider } from 'react-redux'; 12 | import { createStore, combineReducers } from 'redux'; 13 | import { defaultState } from '../../src/action-reducer.js'; 14 | 15 | const customReducer = (state, action) => { 16 | if (action.type === 'CUSTOM_ACTION_TYPE') { 17 | return state.set('isHooked', true); 18 | } 19 | return state; 20 | } 21 | const enhancedReducer = reducerEnhancer(customReducer); 22 | 23 | describe('reducerEnhancer', () => { 24 | let enhancedStore; 25 | 26 | beforeEach( () => { 27 | enhancedStore = createStore(combineReducers({ ui: enhancedReducer })); 28 | }); 29 | 30 | it('delegates to the default reducer', () => { 31 | assert.isTrue(is(enhancedStore.getState().ui, defaultState)); 32 | 33 | enhancedStore.dispatch({ 34 | type: UPDATE_UI_STATE, 35 | payload: { 36 | key: 'a', 37 | name: 'foo', 38 | value: 'bar' 39 | } 40 | }); 41 | 42 | assert.isTrue( 43 | is( 44 | enhancedStore.getState().ui, 45 | new Map({ 46 | __reducers: new Map(), 47 | a: new Map({ foo: 'bar' }) 48 | }) 49 | ) 50 | ); 51 | }); 52 | 53 | it('intercepts custom actions', () => { 54 | assert.isTrue(is(enhancedStore.getState().ui, defaultState)); 55 | 56 | enhancedStore.dispatch({ 57 | type: 'CUSTOM_ACTION_TYPE', 58 | payload: { 59 | foo: 'bar' 60 | } 61 | }); 62 | assert.isTrue( 63 | is( 64 | enhancedStore.getState().ui, 65 | new Map({ 66 | __reducers: new Map(), 67 | isHooked: true 68 | }) 69 | ) 70 | ); 71 | }); 72 | 73 | it('update ui state by updater', () => { 74 | assert.isTrue(is(enhancedStore.getState().ui, defaultState)); 75 | 76 | enhancedStore.dispatch({ 77 | type: UPDATE_UI_STATE, 78 | payload: { 79 | key: 'foo', 80 | name: 'bar', 81 | value: 'baz' 82 | } 83 | }); 84 | 85 | enhancedStore.dispatch({ 86 | type: UPDATE_UI_STATE, 87 | payload: { 88 | key: 'foo', 89 | name: 'bar', 90 | value: baz => baz.toUpperCase() 91 | } 92 | }); 93 | 94 | assert.isTrue( 95 | is( 96 | enhancedStore.getState().ui, 97 | new Map({ 98 | __reducers: new Map(), 99 | foo: new Map({ bar: 'BAZ' }) 100 | }) 101 | ) 102 | ); 103 | }); 104 | }); 105 | -------------------------------------------------------------------------------- /test/setup.js: -------------------------------------------------------------------------------- 1 | import { jsdom } from 'jsdom' 2 | 3 | global.document = jsdom('') 4 | global.window = document.defaultView 5 | global.navigator = global.window.navigator 6 | -------------------------------------------------------------------------------- /test/ui/context.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import { assert } from 'chai'; 4 | import React, { Component } from 'react'; 5 | import ReactTestUtils from 'react-dom/test-utils'; 6 | import shallowEqual from 'react-redux/lib/utils/shallowEqual'; 7 | 8 | import ui, { reducer } from '../../src'; 9 | import { render, renderAndFind } from '../utils/render.js'; 10 | 11 | describe('UI state context', () => { 12 | 13 | describe('single component tree', () => { 14 | class Test extends Component { 15 | updateName() { this.props.updateUI('name', 'test'); } 16 | massUpdate() { 17 | this.props.updateUI({ 18 | name: 'test', 19 | isValid: false 20 | }); 21 | } 22 | render() { return

Hi

; } 23 | } 24 | const uiState = { 25 | name: 'parent', 26 | isValid: true 27 | }; 28 | const UITest = ui({ state: uiState })(Test); 29 | 30 | it('component gets given expected props', () => { 31 | const c = renderAndFind(, Test); 32 | assert(typeof c.props.updateUI === 'function', 'has updateUI'); 33 | assert(typeof c.props.resetUI === 'function', 'has resetUI'); 34 | assert(typeof c.props.uiKey === 'string', 'has uiKey'); 35 | assert(shallowEqual(c.props.ui, uiState), 'has default state'); 36 | }); 37 | 38 | it('updates props using the single-update syntax', () => { 39 | const c = renderAndFind(, Test); 40 | assert(c.props.ui.name === 'parent'); 41 | c.updateName() 42 | assert(c.props.ui.name === 'test'); 43 | }); 44 | 45 | it('updates props using the mass-update syntax', () => { 46 | const c = renderAndFind(, Test); 47 | assert(c.props.ui.name === 'parent'); 48 | c.massUpdate() 49 | assert(c.props.ui.name === 'test'); 50 | assert(c.props.ui.isValid === false); 51 | }); 52 | }); 53 | 54 | describe('single-level nested ui component tree', () => { 55 | const uiState = { 56 | name: 'parent' 57 | }; 58 | class Parent extends Component { 59 | updateContext(to = 'parent') { this.props.updateUI('name', to); } 60 | render() { return
{ this.props.children }
; } 61 | }; 62 | const UIParent = ui({state: uiState})(Parent); 63 | 64 | class Child extends Component { 65 | updateParentContext(to = 'parent') { this.props.updateUI('name', to); } 66 | updateName() { this.props.updateUI('name', 'bar'); } 67 | updateOwnState() { this.props.updateUI('child', 'foo'); } 68 | render() { return

Nested

; } 69 | }; 70 | const UIChild = ui({})(Child); 71 | const UIChildWithOwnState = ui({ state: { child: true } })(Child); 72 | const UIChildWithOwnStateJSX = ( 73 | 74 | 75 | 76 | ); 77 | 78 | it('child component inherits parent context', () => { 79 | const c = renderAndFind(, Child); 80 | assert(shallowEqual(c.props.ui, uiState), 'child inherits parent UI state context'); 81 | }); 82 | 83 | it('parent component only gets its own context', () => { 84 | const p = renderAndFind(UIChildWithOwnStateJSX, Parent); 85 | assert(shallowEqual(p.props.ui, uiState), 'parent only has its own context and not childrens'); 86 | }); 87 | 88 | it('child component updates parent variables', () => { 89 | const tree = render(); 90 | const parent = ReactTestUtils.findRenderedComponentWithType(tree, Parent); 91 | const child = ReactTestUtils.findRenderedComponentWithType(tree, Child); 92 | 93 | assert(parent.props.ui.name === 'parent'); 94 | assert(child.props.ui.name === 'parent'); 95 | child.updateName(); 96 | assert(parent.props.ui.name === 'bar'); 97 | assert(child.props.ui.name === 'bar'); 98 | }); 99 | 100 | it('child merges parent UI context with its own UI context', () => { 101 | const child = renderAndFind(UIChildWithOwnStateJSX, Child); 102 | const expectedState = { 103 | name: 'parent', 104 | child: true 105 | }; 106 | assert(shallowEqual(child.props.ui, expectedState), 'child merges context'); 107 | }); 108 | 109 | it('child updates own context separately from parent', () => { 110 | const tree = render(UIChildWithOwnStateJSX); 111 | const parent = ReactTestUtils.findRenderedComponentWithType(tree, Parent); 112 | const child = ReactTestUtils.findRenderedComponentWithType(tree, Child); 113 | child.updateOwnState(); 114 | assert(child.props.ui.child === 'foo', 'child updates own context'); 115 | assert(parent.props.ui.child === undefined, 'parent has no child state in its context'); 116 | }); 117 | 118 | it('child updates parent context', () => { 119 | const tree = render(UIChildWithOwnStateJSX); 120 | const parent = ReactTestUtils.findRenderedComponentWithType(tree, Parent); 121 | const child = ReactTestUtils.findRenderedComponentWithType(tree, Child); 122 | 123 | child.updateParentContext('foobar'); 124 | assert(parent.props.ui.name === 'foobar', 'parent updates context'); 125 | assert(child.props.ui.name === 'foobar', 'child updates context'); 126 | }); 127 | 128 | it('parent updating context sends child new context and child receives updates', () => { 129 | const tree = render(UIChildWithOwnStateJSX); 130 | const parent = ReactTestUtils.findRenderedComponentWithType(tree, Parent); 131 | const child = ReactTestUtils.findRenderedComponentWithType(tree, Child); 132 | 133 | parent.updateContext('what'); 134 | assert(parent.props.ui.name === 'what', 'parent updates context'); 135 | assert(child.props.ui.name === 'what', 'child updates context'); 136 | }); 137 | 138 | describe('duplicating UI variable names across parent/child contexts', () => { 139 | class Child extends Component { 140 | updateChildContext(to = 'foo') { this.props.updateUI('name', to); } 141 | render() { return
} 142 | } 143 | const UIChild = ui({ state: { name: 'child' } })(Child); 144 | const UIChildJSX = (); 145 | 146 | it('parent and child store state separately', () => { 147 | const tree = render(UIChildJSX); 148 | const parent = ReactTestUtils.findRenderedComponentWithType(tree, Parent); 149 | const child = ReactTestUtils.findRenderedComponentWithType(tree, Child); 150 | 151 | assert(parent.props.ui.name === 'parent'); 152 | assert(child.props.ui.name === 'child'); 153 | }); 154 | 155 | it('parent updates context separately from parent', () => { 156 | const tree = render(UIChildJSX); 157 | const parent = ReactTestUtils.findRenderedComponentWithType(tree, Parent); 158 | const child = ReactTestUtils.findRenderedComponentWithType(tree, Child); 159 | 160 | parent.updateContext('foobar'); 161 | assert(parent.props.ui.name === 'foobar'); 162 | assert(child.props.ui.name === 'child'); 163 | }); 164 | 165 | 166 | it('child updates context separately from parent', () => { 167 | const tree = render(UIChildJSX); 168 | const parent = ReactTestUtils.findRenderedComponentWithType(tree, Parent); 169 | const child = ReactTestUtils.findRenderedComponentWithType(tree, Child); 170 | 171 | child.updateChildContext('foobar'); 172 | assert(parent.props.ui.name === 'parent'); 173 | assert(child.props.ui.name === 'foobar'); 174 | }); 175 | }); 176 | 177 | }); 178 | 179 | describe('shared contexts', () => { 180 | class Foo extends Component { 181 | updateContext(to = 'misc') { this.props.updateUI('name', to); } 182 | render = () =>
183 | } 184 | class Bar extends Component { 185 | updateContext(to = 'misc') { this.props.updateUI('name', to); } 186 | render = () =>
187 | } 188 | const adapter = ui({ key: 'a', state: { name: 'name' } }); 189 | const UIFoo = adapter(Foo); 190 | const UIBar = adapter(Bar); 191 | 192 | it('components with the same key and nesting share the same context', () => { 193 | const tree = render(
); 194 | const a = ReactTestUtils.findRenderedComponentWithType(tree, Foo); 195 | const b = ReactTestUtils.findRenderedComponentWithType(tree, Bar); 196 | 197 | assert(shallowEqual(a.props.ui, b.props.ui)); 198 | a.updateContext(); 199 | assert(a.props.ui.name === 'misc'); 200 | assert(shallowEqual(a.props.ui, b.props.ui)); 201 | }); 202 | 203 | }); 204 | 205 | }); 206 | -------------------------------------------------------------------------------- /test/ui/defaults.js: -------------------------------------------------------------------------------- 1 | 2 | 'use strict'; 3 | 4 | import { assert } from 'chai'; 5 | import React, { Component } from 'react'; 6 | import ReactTestUtils from 'react-dom/test-utils'; 7 | import shallowEqual from 'react-redux/lib/utils/shallowEqual'; 8 | import { Map } from 'immutable'; 9 | 10 | import ui, { reducer } from '../../src'; 11 | import { render, renderAndFind } from '../utils/render.js'; 12 | 13 | describe('Default UI state variables', () => { 14 | 15 | describe('HOC is passed props and state to calculate defaults', () => { 16 | // Set up closures which we can use to check that the uiState func is passed 17 | // expected props. 18 | let calcProps, calcState; 19 | 20 | class Test extends Component { 21 | render() { return

Hi

; } 22 | } 23 | const uiState = { 24 | calculated: (props, state) => { 25 | calcProps = props; 26 | calcState = state; 27 | return props.passedProp 28 | }, 29 | isValid: true 30 | }; 31 | const UITest = ui({ state: uiState })(Test); 32 | 33 | it('component gets given expected props', () => { 34 | const c = renderAndFind(, Test); 35 | assert.equal(c.props.ui.calculated, 'foo'); 36 | assert.equal(calcProps.passedProp, 'foo'); 37 | assert.equal(typeof calcState.ui, typeof Map()); 38 | }); 39 | 40 | }); 41 | 42 | }); 43 | 44 | -------------------------------------------------------------------------------- /test/ui/key.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import { assert } from 'chai'; 4 | import React, { Component } from 'react'; 5 | import ReactTestUtils from 'react-dom/test-utils'; 6 | 7 | import ui, { reducer } from '../../src'; 8 | import { render, renderAndFind } from '../utils/render.js'; 9 | 10 | describe('key generation', () => { 11 | 12 | class Test extends Component { 13 | render() { return

Hi

; } 14 | } 15 | const testKey = 'testKey' 16 | 17 | const WrappedTestWithoutKey = ui({})(Test); 18 | const WrappedTestWithKey = ui({key: testKey})(Test); 19 | 20 | describe('opts.key === undefined', () => { 21 | it('assigns a random key to the component', () => { 22 | const tree = render( 23 |
24 | 25 | 26 | 27 |
28 | ); 29 | const comps = ReactTestUtils 30 | .scryRenderedComponentsWithType(tree, Test); 31 | const { uiKey } = comps[0].props; 32 | 33 | // Check basic setup of the UI key within the first component 34 | assert(uiKey !== '', 'uiKey is not empty'); 35 | assert(uiKey.substr(0, 'Test'.length) === 'Test', 'Key begins with component name'); 36 | assert(uiKey.length >= ('Test'.length + 5)); 37 | 38 | // Ensure that all three components have unique IDs by creating a set 39 | // of each key and checking the set's length 40 | const uniqs = Array.from(new Set(comps.map(c => c.props.uiKey))); 41 | assert(uniqs.length === 3, 'Two unique keys are specified'); 42 | }); 43 | }); 44 | 45 | describe('opts.key !== undefined', () => { 46 | it('uses the specified key', () => { 47 | const tree = render(); 48 | const c = ReactTestUtils.findRenderedComponentWithType(tree, Test); 49 | const { uiKey } = c.props; 50 | 51 | // Check basic setup of the UI key within the first component 52 | assert(uiKey === testKey, 'uiKey matches opts.key'); 53 | }); 54 | }); 55 | 56 | describe('props.uiPath', () => { 57 | it('exposes uiPath', () => { 58 | const c = renderAndFind(, Test); 59 | const { uiPath } = c.props; 60 | 61 | // Check basic setup of the UI key within the first component 62 | assert.equal(uiPath, testKey); 63 | }); 64 | }); 65 | 66 | }); 67 | -------------------------------------------------------------------------------- /test/ui/opts.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import { assert } from 'chai'; 4 | import React, { Component } from 'react'; 5 | import ReactTestUtils from 'react-dom/test-utils'; 6 | import shallowEqual from 'react-redux/lib/utils/shallowEqual'; 7 | 8 | import ui, { reducer } from '../../src'; 9 | import { render, renderAndFind } from '../utils/render.js'; 10 | 11 | describe('@connect options', () => { 12 | class Child extends Component { 13 | render = () =>

Child

14 | } 15 | 16 | it('allows you to pass mergeProps into connect', () => { 17 | // Poor mans spying 18 | let called = false; 19 | const mergeProps = (stateProps, dispatchProps, ownProps) => { 20 | called = true; 21 | return Object.assign({}, ownProps, stateProps, dispatchProps); 22 | } 23 | 24 | const UIChild = ui({ 25 | state: { name: 'child' }, 26 | mergeProps: mergeProps 27 | })(Child); 28 | 29 | const c = renderAndFind(, Child); 30 | assert.isTrue(called); 31 | }); 32 | 33 | 34 | it('allows you to pass options into connect', () => { 35 | const WithRef = ui({ 36 | state: { name: 'child' }, 37 | options: { withRef: true } 38 | })(Child); 39 | let wrapped = renderAndFind(, WithRef); 40 | assert.isDefined(wrapped.getWrappedInstance()); 41 | 42 | let WithoutRef = ui({ 43 | state: { name: 'child' }, 44 | options: { withRef: false } 45 | })(Child); 46 | wrapped = renderAndFind(, WithoutRef); 47 | assert.throws(() => wrapped.getWrappedInstance(), 'To access the wrapped instance, you need to specify { withRef: true } in the options argument of the connect() call.'); 48 | }); 49 | }); 50 | -------------------------------------------------------------------------------- /test/ui/reducer.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import { assert } from 'chai'; 4 | 5 | import React, { Component } from 'react'; 6 | import ReactDOM from 'react-dom'; 7 | import { is, Map } from 'immutable'; 8 | import ReactTestUtils from 'react-dom/test-utils'; 9 | import shallowEqual from 'react-redux/lib/utils/shallowEqual'; 10 | 11 | import ui, { reducer } from '../../src'; 12 | import { store, render, renderAndFind } from '../utils/render.js'; 13 | 14 | describe('with a custom reducer', () => { 15 | 16 | class Parent extends Component { 17 | render = () =>
{ this.props.children }
18 | } 19 | 20 | // Create a UI component that listens to the 'CUSTOM' type and updates 21 | // UI variables 22 | let parentReducer = (state, action) => { 23 | if (action.type === 'CUSTOM') { 24 | return state.set('name', 'parentOverride'); 25 | } 26 | return state; 27 | }; 28 | const UIParent = ui({ 29 | key: 'parent', 30 | state: { 31 | name: 'parent' 32 | }, 33 | reducer: parentReducer 34 | })(Parent); 35 | 36 | it('adds a custom reducer on mount and removes at unmount', () => { 37 | const c = renderAndFind(, Parent); 38 | 39 | let reducers = store.getState().ui.get('__reducers'); 40 | assert.equal(reducers.size, 1); 41 | assert.equal(reducers.get('parent').func, parentReducer); 42 | 43 | // Unmount and this should be gone 44 | ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(c).parentNode); 45 | reducers = store.getState().ui.get('__reducers'); 46 | assert.equal(reducers.size, 0); 47 | }); 48 | 49 | it('updates props as expected', () => { 50 | const c = renderAndFind(, Parent); 51 | assert.equal(c.props.ui.name, 'parent'); 52 | c.props.updateUI('name', 'foo'); 53 | assert.equal(c.props.ui.name, 'foo'); 54 | 55 | ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(c).parentNode); 56 | }); 57 | 58 | it('responds to actions using a custom reducer', () => { 59 | const c = renderAndFind(, Parent); 60 | store.dispatch({ type: 'CUSTOM' }); 61 | assert.equal(c.props.ui.name, 'parentOverride'); 62 | 63 | ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(c).parentNode); 64 | }); 65 | 66 | describe('with children', () => { 67 | // This will be set when the reducer is called, allowing us to test what 68 | // state the reducer is given. 69 | // 70 | // We should only be given state for our current component. 71 | let reducerState; 72 | 73 | // Create a UI component that listens to the 'CUSTOM' type and updates 74 | // UI variables 75 | let childReducer = (state = {}, action) => { 76 | reducerState = state; 77 | if (action.type === 'CUSTOM') { 78 | return state.set('foo', 'childOverride'); 79 | } 80 | return state; 81 | }; 82 | class Child extends Component { 83 | render = () =>

child

84 | } 85 | const UIChild = ui({ 86 | key: 'child', 87 | state: { foo: 'bar' }, 88 | reducer: childReducer 89 | })(Child); 90 | 91 | it('only gets given the UI state for the current component', () => { 92 | const tree = render(, Parent); 93 | const parent = ReactTestUtils.findRenderedComponentWithType(tree, Parent); 94 | const child = ReactTestUtils.findRenderedComponentWithType(tree, Child); 95 | 96 | store.dispatch({ type: 'CUSTOM' }); 97 | // The reducerState should equal the default reducer state for our child 98 | // component 99 | assert.isTrue(is(reducerState, new Map({ foo: 'bar' }))); 100 | assert.equal(parent.props.ui.name, 'parentOverride'); 101 | assert.equal(child.props.ui.foo, 'childOverride'); 102 | 103 | ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(parent).parentNode); 104 | }); 105 | }); 106 | 107 | }); 108 | -------------------------------------------------------------------------------- /test/ui/reset.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import { assert } from 'chai'; 4 | import React, { Component } from 'react'; 5 | import ReactTestUtils from 'react-dom/test-utils'; 6 | import shallowEqual from 'react-redux/lib/utils/shallowEqual'; 7 | 8 | import ui, { reducer } from '../../src'; 9 | import { render, renderAndFind } from '../utils/render.js'; 10 | 11 | describe('resetting UI state', () => { 12 | class Parent extends Component { 13 | render = () => (
{ this.props.children }
) 14 | } 15 | 16 | class Child extends Component { 17 | render = () =>

Child

18 | } 19 | 20 | const UIParent = ui({ state: { name: 'parent' } })(Parent); 21 | const UIChild = ui({ state: { name: 'child' } })(Child); 22 | 23 | it('resetting a UI component with no children resets its own UI state', () => { 24 | const child = renderAndFind(, Child); 25 | 26 | child.props.updateUI({ name: 'foobar' }); 27 | assert(child.props.ui.name === 'foobar'); 28 | child.props.resetUI(); 29 | assert(child.props.ui.name === 'child'); 30 | }); 31 | 32 | it('resetting a parent UI resets its own AND child contexts', () => { 33 | const tree = render(); 34 | const parent = ReactTestUtils.findRenderedComponentWithType(tree, Parent); 35 | const child = ReactTestUtils.findRenderedComponentWithType(tree, Child); 36 | 37 | child.props.updateUI({ name: 'b' }); 38 | parent.props.updateUI({ name: 'a' }); 39 | // Ensure state is updated 40 | assert(child.props.ui.name === 'b'); 41 | // Resetting a parent should also reset all children 42 | parent.props.resetUI(); 43 | assert(child.props.ui.name === 'child'); 44 | assert(parent.props.ui.name === 'parent'); 45 | }); 46 | 47 | it('resetting a child UI resets only its own context', () => { 48 | const tree = render(); 49 | const parent = ReactTestUtils.findRenderedComponentWithType(tree, Parent); 50 | const child = ReactTestUtils.findRenderedComponentWithType(tree, Child); 51 | 52 | child.props.updateUI({ name: 'b' }); 53 | parent.props.updateUI({ name: 'a' }); 54 | // Ensure state is updated 55 | assert(child.props.ui.name === 'b'); 56 | // Child should only reset itself to child; parent should stay changed 57 | child.props.resetUI(); 58 | assert(child.props.ui.name === 'child'); 59 | assert(parent.props.ui.name === 'a'); 60 | }); 61 | 62 | it('evaluates functions within default state correctly', () => { 63 | const FunctionalUIChild = ui({ 64 | state: { 65 | evaluated: (props) => props.value 66 | } 67 | })(Child); 68 | 69 | const child = renderAndFind(, Child); 70 | assert.equal(child.props.ui.evaluated, 'foo'); 71 | child.props.updateUI({ evaluated: 'next' }); 72 | assert.equal(child.props.ui.evaluated, 'next'); 73 | child.props.resetUI(); 74 | assert.equal(child.props.ui.evaluated, 'foo'); 75 | }); 76 | 77 | it('calling resetUI from a parent component with a child that has evaluated state works', () => { 78 | const FunctionalUIChild = ui({ 79 | state: { 80 | evaluated: (props) => props.value 81 | } 82 | })(Child); 83 | 84 | const tree = render(); 85 | const parent = ReactTestUtils.findRenderedComponentWithType(tree, Parent); 86 | const child = ReactTestUtils.findRenderedComponentWithType(tree, Child); 87 | 88 | assert.equal(child.props.ui.evaluated, 'foo'); 89 | child.props.updateUI({ evaluated: 'next' }); 90 | assert.equal(child.props.ui.evaluated, 'next'); 91 | parent.props.resetUI(); 92 | assert.equal(child.props.ui.evaluated, 'foo'); 93 | }); 94 | 95 | }); 96 | -------------------------------------------------------------------------------- /test/ui/validation.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import { assert } from 'chai'; 4 | import React, { Component } from 'react'; 5 | import ReactTestUtils from 'react-dom/test-utils'; 6 | import shallowEqual from 'react-redux/lib/utils/shallowEqual'; 7 | 8 | import ui, { reducer } from '../../src'; 9 | import { render, renderAndFind } from '../utils/render.js'; 10 | 11 | describe('Prop validation', () => { 12 | class Child extends Component { 13 | render = () =>

Child

14 | } 15 | const UIChild = ui({ state: { name: 'child' } })(Child); 16 | 17 | it('only allows you to set defined variables in a single-level tree', () => { 18 | const child = renderAndFind(, Child); 19 | assert.throws(() => child.props.updateUI({ foo: 1 })); 20 | }); 21 | }); 22 | 23 | -------------------------------------------------------------------------------- /test/utils/render.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import React from 'react'; 4 | import { Provider } from 'react-redux'; 5 | import { createStore, combineReducers } from 'redux'; 6 | import ui, { reducer } from '../../src'; 7 | import ReactTestUtils from 'react-dom/test-utils'; 8 | 9 | const store = createStore(combineReducers({ ui: reducer })); 10 | 11 | /** 12 | * Wrap given JSX with a provider contianing a store with the UI reducer 13 | */ 14 | const wrapWithProvider = (jsx) => ( 15 | 16 | { jsx } 17 | 18 | ); 19 | 20 | const render = (jsx) => { 21 | return ReactTestUtils.renderIntoDocument( 22 | wrapWithProvider(jsx) 23 | ); 24 | } 25 | 26 | const renderAndFind = (jsx, type = null) => { 27 | if (type === undefined) { 28 | type = jsx; 29 | jsx = 30 | } 31 | const tree = render(jsx); 32 | return ReactTestUtils.findRenderedComponentWithType(tree, type); 33 | } 34 | 35 | export { 36 | store, 37 | wrapWithProvider, 38 | render, 39 | renderAndFind 40 | } 41 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | abab@^1.0.0: 6 | version "1.0.3" 7 | resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d" 8 | 9 | abbrev@1: 10 | version "1.1.0" 11 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" 12 | 13 | acorn-globals@^1.0.4: 14 | version "1.0.9" 15 | resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-1.0.9.tgz#55bb5e98691507b74579d0513413217c380c54cf" 16 | dependencies: 17 | acorn "^2.1.0" 18 | 19 | acorn@^2.1.0, acorn@^2.4.0: 20 | version "2.7.0" 21 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7" 22 | 23 | ajv@^4.9.1: 24 | version "4.11.8" 25 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" 26 | dependencies: 27 | co "^4.6.0" 28 | json-stable-stringify "^1.0.1" 29 | 30 | amdefine@>=0.0.4: 31 | version "1.0.1" 32 | resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" 33 | 34 | ansi-regex@^2.0.0: 35 | version "2.1.1" 36 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 37 | 38 | ansi-styles@^2.1.0: 39 | version "2.2.1" 40 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 41 | 42 | anymatch@^1.3.0: 43 | version "1.3.0" 44 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" 45 | dependencies: 46 | arrify "^1.0.0" 47 | micromatch "^2.1.5" 48 | 49 | aproba@^1.0.3: 50 | version "1.1.1" 51 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab" 52 | 53 | are-we-there-yet@~1.1.2: 54 | version "1.1.4" 55 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" 56 | dependencies: 57 | delegates "^1.0.0" 58 | readable-stream "^2.0.6" 59 | 60 | arr-diff@^2.0.0: 61 | version "2.0.0" 62 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 63 | dependencies: 64 | arr-flatten "^1.0.1" 65 | 66 | arr-flatten@^1.0.1: 67 | version "1.0.3" 68 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1" 69 | 70 | array-find-index@^1.0.1: 71 | version "1.0.2" 72 | resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" 73 | 74 | array-uniq@^1.0.0: 75 | version "1.0.3" 76 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 77 | 78 | array-unique@^0.2.1: 79 | version "0.2.1" 80 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 81 | 82 | arrify@^1.0.0: 83 | version "1.0.1" 84 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 85 | 86 | asap@~2.0.3: 87 | version "2.0.5" 88 | resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f" 89 | 90 | asn1@~0.2.3: 91 | version "0.2.3" 92 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 93 | 94 | assert-plus@1.0.0, assert-plus@^1.0.0: 95 | version "1.0.0" 96 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 97 | 98 | assert-plus@^0.2.0: 99 | version "0.2.0" 100 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" 101 | 102 | assertion-error@^1.0.1: 103 | version "1.0.2" 104 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" 105 | 106 | async-each@^1.0.0: 107 | version "1.0.1" 108 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" 109 | 110 | asynckit@^0.4.0: 111 | version "0.4.0" 112 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 113 | 114 | aws-sign2@~0.6.0: 115 | version "0.6.0" 116 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" 117 | 118 | aws4@^1.2.1: 119 | version "1.6.0" 120 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" 121 | 122 | babel-cli@6.5.1: 123 | version "6.5.1" 124 | resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.5.1.tgz#446195f282320bc8b570d5d94757eead42533b4f" 125 | dependencies: 126 | babel-core "^6.5.1" 127 | babel-polyfill "^6.3.13" 128 | babel-register "^6.5.1" 129 | babel-runtime "^5.0.0" 130 | bin-version-check "^2.1.0" 131 | chalk "1.1.1" 132 | commander "^2.8.1" 133 | convert-source-map "^1.1.0" 134 | fs-readdir-recursive "^0.1.0" 135 | glob "^5.0.5" 136 | lodash "^3.2.0" 137 | log-symbols "^1.0.2" 138 | output-file-sync "^1.1.0" 139 | path-exists "^1.0.0" 140 | path-is-absolute "^1.0.0" 141 | request "^2.65.0" 142 | slash "^1.0.0" 143 | source-map "^0.5.0" 144 | v8flags "^2.0.10" 145 | optionalDependencies: 146 | chokidar "^1.0.0" 147 | 148 | babel-code-frame@^6.22.0: 149 | version "6.22.0" 150 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" 151 | dependencies: 152 | chalk "^1.1.0" 153 | esutils "^2.0.2" 154 | js-tokens "^3.0.0" 155 | 156 | babel-core@^6.24.1, babel-core@^6.5.1: 157 | version "6.24.1" 158 | resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.1.tgz#8c428564dce1e1f41fb337ec34f4c3b022b5ad83" 159 | dependencies: 160 | babel-code-frame "^6.22.0" 161 | babel-generator "^6.24.1" 162 | babel-helpers "^6.24.1" 163 | babel-messages "^6.23.0" 164 | babel-register "^6.24.1" 165 | babel-runtime "^6.22.0" 166 | babel-template "^6.24.1" 167 | babel-traverse "^6.24.1" 168 | babel-types "^6.24.1" 169 | babylon "^6.11.0" 170 | convert-source-map "^1.1.0" 171 | debug "^2.1.1" 172 | json5 "^0.5.0" 173 | lodash "^4.2.0" 174 | minimatch "^3.0.2" 175 | path-is-absolute "^1.0.0" 176 | private "^0.1.6" 177 | slash "^1.0.0" 178 | source-map "^0.5.0" 179 | 180 | babel-generator@^6.24.1: 181 | version "6.24.1" 182 | resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497" 183 | dependencies: 184 | babel-messages "^6.23.0" 185 | babel-runtime "^6.22.0" 186 | babel-types "^6.24.1" 187 | detect-indent "^4.0.0" 188 | jsesc "^1.3.0" 189 | lodash "^4.2.0" 190 | source-map "^0.5.0" 191 | trim-right "^1.0.1" 192 | 193 | babel-helper-bindify-decorators@^6.24.1: 194 | version "6.24.1" 195 | resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" 196 | dependencies: 197 | babel-runtime "^6.22.0" 198 | babel-traverse "^6.24.1" 199 | babel-types "^6.24.1" 200 | 201 | babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: 202 | version "6.24.1" 203 | resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" 204 | dependencies: 205 | babel-helper-explode-assignable-expression "^6.24.1" 206 | babel-runtime "^6.22.0" 207 | babel-types "^6.24.1" 208 | 209 | babel-helper-builder-react-jsx@^6.24.1: 210 | version "6.24.1" 211 | resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.24.1.tgz#0ad7917e33c8d751e646daca4e77cc19377d2cbc" 212 | dependencies: 213 | babel-runtime "^6.22.0" 214 | babel-types "^6.24.1" 215 | esutils "^2.0.0" 216 | 217 | babel-helper-call-delegate@^6.24.1: 218 | version "6.24.1" 219 | resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" 220 | dependencies: 221 | babel-helper-hoist-variables "^6.24.1" 222 | babel-runtime "^6.22.0" 223 | babel-traverse "^6.24.1" 224 | babel-types "^6.24.1" 225 | 226 | babel-helper-define-map@^6.24.1: 227 | version "6.24.1" 228 | resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080" 229 | dependencies: 230 | babel-helper-function-name "^6.24.1" 231 | babel-runtime "^6.22.0" 232 | babel-types "^6.24.1" 233 | lodash "^4.2.0" 234 | 235 | babel-helper-explode-assignable-expression@^6.24.1: 236 | version "6.24.1" 237 | resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" 238 | dependencies: 239 | babel-runtime "^6.22.0" 240 | babel-traverse "^6.24.1" 241 | babel-types "^6.24.1" 242 | 243 | babel-helper-explode-class@^6.24.1: 244 | version "6.24.1" 245 | resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" 246 | dependencies: 247 | babel-helper-bindify-decorators "^6.24.1" 248 | babel-runtime "^6.22.0" 249 | babel-traverse "^6.24.1" 250 | babel-types "^6.24.1" 251 | 252 | babel-helper-function-name@^6.24.1: 253 | version "6.24.1" 254 | resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" 255 | dependencies: 256 | babel-helper-get-function-arity "^6.24.1" 257 | babel-runtime "^6.22.0" 258 | babel-template "^6.24.1" 259 | babel-traverse "^6.24.1" 260 | babel-types "^6.24.1" 261 | 262 | babel-helper-get-function-arity@^6.24.1: 263 | version "6.24.1" 264 | resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" 265 | dependencies: 266 | babel-runtime "^6.22.0" 267 | babel-types "^6.24.1" 268 | 269 | babel-helper-hoist-variables@^6.24.1: 270 | version "6.24.1" 271 | resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" 272 | dependencies: 273 | babel-runtime "^6.22.0" 274 | babel-types "^6.24.1" 275 | 276 | babel-helper-optimise-call-expression@^6.24.1: 277 | version "6.24.1" 278 | resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" 279 | dependencies: 280 | babel-runtime "^6.22.0" 281 | babel-types "^6.24.1" 282 | 283 | babel-helper-regex@^6.24.1: 284 | version "6.24.1" 285 | resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8" 286 | dependencies: 287 | babel-runtime "^6.22.0" 288 | babel-types "^6.24.1" 289 | lodash "^4.2.0" 290 | 291 | babel-helper-remap-async-to-generator@^6.24.1: 292 | version "6.24.1" 293 | resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" 294 | dependencies: 295 | babel-helper-function-name "^6.24.1" 296 | babel-runtime "^6.22.0" 297 | babel-template "^6.24.1" 298 | babel-traverse "^6.24.1" 299 | babel-types "^6.24.1" 300 | 301 | babel-helper-replace-supers@^6.24.1: 302 | version "6.24.1" 303 | resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" 304 | dependencies: 305 | babel-helper-optimise-call-expression "^6.24.1" 306 | babel-messages "^6.23.0" 307 | babel-runtime "^6.22.0" 308 | babel-template "^6.24.1" 309 | babel-traverse "^6.24.1" 310 | babel-types "^6.24.1" 311 | 312 | babel-helpers@^6.24.1: 313 | version "6.24.1" 314 | resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" 315 | dependencies: 316 | babel-runtime "^6.22.0" 317 | babel-template "^6.24.1" 318 | 319 | babel-messages@^6.23.0: 320 | version "6.23.0" 321 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" 322 | dependencies: 323 | babel-runtime "^6.22.0" 324 | 325 | babel-plugin-check-es2015-constants@^6.22.0: 326 | version "6.22.0" 327 | resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" 328 | dependencies: 329 | babel-runtime "^6.22.0" 330 | 331 | babel-plugin-syntax-async-functions@^6.8.0: 332 | version "6.13.0" 333 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" 334 | 335 | babel-plugin-syntax-async-generators@^6.5.0: 336 | version "6.13.0" 337 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" 338 | 339 | babel-plugin-syntax-class-constructor-call@^6.18.0: 340 | version "6.18.0" 341 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" 342 | 343 | babel-plugin-syntax-class-properties@^6.8.0: 344 | version "6.13.0" 345 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" 346 | 347 | babel-plugin-syntax-decorators@^6.1.18, babel-plugin-syntax-decorators@^6.13.0: 348 | version "6.13.0" 349 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" 350 | 351 | babel-plugin-syntax-do-expressions@^6.8.0: 352 | version "6.13.0" 353 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz#5747756139aa26d390d09410b03744ba07e4796d" 354 | 355 | babel-plugin-syntax-dynamic-import@^6.18.0: 356 | version "6.18.0" 357 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" 358 | 359 | babel-plugin-syntax-exponentiation-operator@^6.8.0: 360 | version "6.13.0" 361 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" 362 | 363 | babel-plugin-syntax-export-extensions@^6.8.0: 364 | version "6.13.0" 365 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" 366 | 367 | babel-plugin-syntax-flow@^6.18.0: 368 | version "6.18.0" 369 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" 370 | 371 | babel-plugin-syntax-function-bind@^6.8.0: 372 | version "6.13.0" 373 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz#48c495f177bdf31a981e732f55adc0bdd2601f46" 374 | 375 | babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0: 376 | version "6.18.0" 377 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" 378 | 379 | babel-plugin-syntax-object-rest-spread@^6.8.0: 380 | version "6.13.0" 381 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" 382 | 383 | babel-plugin-syntax-trailing-function-commas@^6.22.0: 384 | version "6.22.0" 385 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" 386 | 387 | babel-plugin-transform-async-generator-functions@^6.24.1: 388 | version "6.24.1" 389 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" 390 | dependencies: 391 | babel-helper-remap-async-to-generator "^6.24.1" 392 | babel-plugin-syntax-async-generators "^6.5.0" 393 | babel-runtime "^6.22.0" 394 | 395 | babel-plugin-transform-async-to-generator@^6.24.1: 396 | version "6.24.1" 397 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" 398 | dependencies: 399 | babel-helper-remap-async-to-generator "^6.24.1" 400 | babel-plugin-syntax-async-functions "^6.8.0" 401 | babel-runtime "^6.22.0" 402 | 403 | babel-plugin-transform-class-constructor-call@^6.24.1: 404 | version "6.24.1" 405 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9" 406 | dependencies: 407 | babel-plugin-syntax-class-constructor-call "^6.18.0" 408 | babel-runtime "^6.22.0" 409 | babel-template "^6.24.1" 410 | 411 | babel-plugin-transform-class-properties@^6.24.1: 412 | version "6.24.1" 413 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" 414 | dependencies: 415 | babel-helper-function-name "^6.24.1" 416 | babel-plugin-syntax-class-properties "^6.8.0" 417 | babel-runtime "^6.22.0" 418 | babel-template "^6.24.1" 419 | 420 | babel-plugin-transform-decorators-legacy@^1.3.4: 421 | version "1.3.4" 422 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.4.tgz#741b58f6c5bce9e6027e0882d9c994f04f366925" 423 | dependencies: 424 | babel-plugin-syntax-decorators "^6.1.18" 425 | babel-runtime "^6.2.0" 426 | babel-template "^6.3.0" 427 | 428 | babel-plugin-transform-decorators@^6.24.1: 429 | version "6.24.1" 430 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" 431 | dependencies: 432 | babel-helper-explode-class "^6.24.1" 433 | babel-plugin-syntax-decorators "^6.13.0" 434 | babel-runtime "^6.22.0" 435 | babel-template "^6.24.1" 436 | babel-types "^6.24.1" 437 | 438 | babel-plugin-transform-do-expressions@^6.22.0: 439 | version "6.22.0" 440 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz#28ccaf92812d949c2cd1281f690c8fdc468ae9bb" 441 | dependencies: 442 | babel-plugin-syntax-do-expressions "^6.8.0" 443 | babel-runtime "^6.22.0" 444 | 445 | babel-plugin-transform-es2015-arrow-functions@^6.22.0: 446 | version "6.22.0" 447 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" 448 | dependencies: 449 | babel-runtime "^6.22.0" 450 | 451 | babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: 452 | version "6.22.0" 453 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" 454 | dependencies: 455 | babel-runtime "^6.22.0" 456 | 457 | babel-plugin-transform-es2015-block-scoping@^6.24.1: 458 | version "6.24.1" 459 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" 460 | dependencies: 461 | babel-runtime "^6.22.0" 462 | babel-template "^6.24.1" 463 | babel-traverse "^6.24.1" 464 | babel-types "^6.24.1" 465 | lodash "^4.2.0" 466 | 467 | babel-plugin-transform-es2015-classes@^6.24.1: 468 | version "6.24.1" 469 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" 470 | dependencies: 471 | babel-helper-define-map "^6.24.1" 472 | babel-helper-function-name "^6.24.1" 473 | babel-helper-optimise-call-expression "^6.24.1" 474 | babel-helper-replace-supers "^6.24.1" 475 | babel-messages "^6.23.0" 476 | babel-runtime "^6.22.0" 477 | babel-template "^6.24.1" 478 | babel-traverse "^6.24.1" 479 | babel-types "^6.24.1" 480 | 481 | babel-plugin-transform-es2015-computed-properties@^6.24.1: 482 | version "6.24.1" 483 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" 484 | dependencies: 485 | babel-runtime "^6.22.0" 486 | babel-template "^6.24.1" 487 | 488 | babel-plugin-transform-es2015-destructuring@^6.22.0: 489 | version "6.23.0" 490 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" 491 | dependencies: 492 | babel-runtime "^6.22.0" 493 | 494 | babel-plugin-transform-es2015-duplicate-keys@^6.24.1: 495 | version "6.24.1" 496 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" 497 | dependencies: 498 | babel-runtime "^6.22.0" 499 | babel-types "^6.24.1" 500 | 501 | babel-plugin-transform-es2015-for-of@^6.22.0: 502 | version "6.23.0" 503 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" 504 | dependencies: 505 | babel-runtime "^6.22.0" 506 | 507 | babel-plugin-transform-es2015-function-name@^6.24.1: 508 | version "6.24.1" 509 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" 510 | dependencies: 511 | babel-helper-function-name "^6.24.1" 512 | babel-runtime "^6.22.0" 513 | babel-types "^6.24.1" 514 | 515 | babel-plugin-transform-es2015-literals@^6.22.0: 516 | version "6.22.0" 517 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" 518 | dependencies: 519 | babel-runtime "^6.22.0" 520 | 521 | babel-plugin-transform-es2015-modules-amd@^6.24.1: 522 | version "6.24.1" 523 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" 524 | dependencies: 525 | babel-plugin-transform-es2015-modules-commonjs "^6.24.1" 526 | babel-runtime "^6.22.0" 527 | babel-template "^6.24.1" 528 | 529 | babel-plugin-transform-es2015-modules-commonjs@^6.24.1: 530 | version "6.24.1" 531 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" 532 | dependencies: 533 | babel-plugin-transform-strict-mode "^6.24.1" 534 | babel-runtime "^6.22.0" 535 | babel-template "^6.24.1" 536 | babel-types "^6.24.1" 537 | 538 | babel-plugin-transform-es2015-modules-systemjs@^6.24.1: 539 | version "6.24.1" 540 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" 541 | dependencies: 542 | babel-helper-hoist-variables "^6.24.1" 543 | babel-runtime "^6.22.0" 544 | babel-template "^6.24.1" 545 | 546 | babel-plugin-transform-es2015-modules-umd@^6.24.1: 547 | version "6.24.1" 548 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" 549 | dependencies: 550 | babel-plugin-transform-es2015-modules-amd "^6.24.1" 551 | babel-runtime "^6.22.0" 552 | babel-template "^6.24.1" 553 | 554 | babel-plugin-transform-es2015-object-super@^6.24.1: 555 | version "6.24.1" 556 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" 557 | dependencies: 558 | babel-helper-replace-supers "^6.24.1" 559 | babel-runtime "^6.22.0" 560 | 561 | babel-plugin-transform-es2015-parameters@^6.24.1: 562 | version "6.24.1" 563 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" 564 | dependencies: 565 | babel-helper-call-delegate "^6.24.1" 566 | babel-helper-get-function-arity "^6.24.1" 567 | babel-runtime "^6.22.0" 568 | babel-template "^6.24.1" 569 | babel-traverse "^6.24.1" 570 | babel-types "^6.24.1" 571 | 572 | babel-plugin-transform-es2015-shorthand-properties@^6.24.1: 573 | version "6.24.1" 574 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" 575 | dependencies: 576 | babel-runtime "^6.22.0" 577 | babel-types "^6.24.1" 578 | 579 | babel-plugin-transform-es2015-spread@^6.22.0: 580 | version "6.22.0" 581 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" 582 | dependencies: 583 | babel-runtime "^6.22.0" 584 | 585 | babel-plugin-transform-es2015-sticky-regex@^6.24.1: 586 | version "6.24.1" 587 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" 588 | dependencies: 589 | babel-helper-regex "^6.24.1" 590 | babel-runtime "^6.22.0" 591 | babel-types "^6.24.1" 592 | 593 | babel-plugin-transform-es2015-template-literals@^6.22.0: 594 | version "6.22.0" 595 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" 596 | dependencies: 597 | babel-runtime "^6.22.0" 598 | 599 | babel-plugin-transform-es2015-typeof-symbol@^6.22.0: 600 | version "6.23.0" 601 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" 602 | dependencies: 603 | babel-runtime "^6.22.0" 604 | 605 | babel-plugin-transform-es2015-unicode-regex@^6.24.1: 606 | version "6.24.1" 607 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" 608 | dependencies: 609 | babel-helper-regex "^6.24.1" 610 | babel-runtime "^6.22.0" 611 | regexpu-core "^2.0.0" 612 | 613 | babel-plugin-transform-exponentiation-operator@^6.24.1: 614 | version "6.24.1" 615 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" 616 | dependencies: 617 | babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" 618 | babel-plugin-syntax-exponentiation-operator "^6.8.0" 619 | babel-runtime "^6.22.0" 620 | 621 | babel-plugin-transform-export-extensions@^6.22.0: 622 | version "6.22.0" 623 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653" 624 | dependencies: 625 | babel-plugin-syntax-export-extensions "^6.8.0" 626 | babel-runtime "^6.22.0" 627 | 628 | babel-plugin-transform-flow-strip-types@^6.22.0: 629 | version "6.22.0" 630 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" 631 | dependencies: 632 | babel-plugin-syntax-flow "^6.18.0" 633 | babel-runtime "^6.22.0" 634 | 635 | babel-plugin-transform-function-bind@^6.22.0: 636 | version "6.22.0" 637 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz#c6fb8e96ac296a310b8cf8ea401462407ddf6a97" 638 | dependencies: 639 | babel-plugin-syntax-function-bind "^6.8.0" 640 | babel-runtime "^6.22.0" 641 | 642 | babel-plugin-transform-object-rest-spread@^6.22.0: 643 | version "6.23.0" 644 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921" 645 | dependencies: 646 | babel-plugin-syntax-object-rest-spread "^6.8.0" 647 | babel-runtime "^6.22.0" 648 | 649 | babel-plugin-transform-react-display-name@^6.23.0: 650 | version "6.23.0" 651 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.23.0.tgz#4398910c358441dc4cef18787264d0412ed36b37" 652 | dependencies: 653 | babel-runtime "^6.22.0" 654 | 655 | babel-plugin-transform-react-jsx-self@^6.22.0: 656 | version "6.22.0" 657 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e" 658 | dependencies: 659 | babel-plugin-syntax-jsx "^6.8.0" 660 | babel-runtime "^6.22.0" 661 | 662 | babel-plugin-transform-react-jsx-source@^6.22.0: 663 | version "6.22.0" 664 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6" 665 | dependencies: 666 | babel-plugin-syntax-jsx "^6.8.0" 667 | babel-runtime "^6.22.0" 668 | 669 | babel-plugin-transform-react-jsx@^6.24.1: 670 | version "6.24.1" 671 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" 672 | dependencies: 673 | babel-helper-builder-react-jsx "^6.24.1" 674 | babel-plugin-syntax-jsx "^6.8.0" 675 | babel-runtime "^6.22.0" 676 | 677 | babel-plugin-transform-regenerator@^6.24.1: 678 | version "6.24.1" 679 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" 680 | dependencies: 681 | regenerator-transform "0.9.11" 682 | 683 | babel-plugin-transform-strict-mode@^6.24.1: 684 | version "6.24.1" 685 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" 686 | dependencies: 687 | babel-runtime "^6.22.0" 688 | babel-types "^6.24.1" 689 | 690 | babel-polyfill@^6.3.13: 691 | version "6.23.0" 692 | resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" 693 | dependencies: 694 | babel-runtime "^6.22.0" 695 | core-js "^2.4.0" 696 | regenerator-runtime "^0.10.0" 697 | 698 | babel-preset-es2015@^6.6.0: 699 | version "6.24.1" 700 | resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" 701 | dependencies: 702 | babel-plugin-check-es2015-constants "^6.22.0" 703 | babel-plugin-transform-es2015-arrow-functions "^6.22.0" 704 | babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" 705 | babel-plugin-transform-es2015-block-scoping "^6.24.1" 706 | babel-plugin-transform-es2015-classes "^6.24.1" 707 | babel-plugin-transform-es2015-computed-properties "^6.24.1" 708 | babel-plugin-transform-es2015-destructuring "^6.22.0" 709 | babel-plugin-transform-es2015-duplicate-keys "^6.24.1" 710 | babel-plugin-transform-es2015-for-of "^6.22.0" 711 | babel-plugin-transform-es2015-function-name "^6.24.1" 712 | babel-plugin-transform-es2015-literals "^6.22.0" 713 | babel-plugin-transform-es2015-modules-amd "^6.24.1" 714 | babel-plugin-transform-es2015-modules-commonjs "^6.24.1" 715 | babel-plugin-transform-es2015-modules-systemjs "^6.24.1" 716 | babel-plugin-transform-es2015-modules-umd "^6.24.1" 717 | babel-plugin-transform-es2015-object-super "^6.24.1" 718 | babel-plugin-transform-es2015-parameters "^6.24.1" 719 | babel-plugin-transform-es2015-shorthand-properties "^6.24.1" 720 | babel-plugin-transform-es2015-spread "^6.22.0" 721 | babel-plugin-transform-es2015-sticky-regex "^6.24.1" 722 | babel-plugin-transform-es2015-template-literals "^6.22.0" 723 | babel-plugin-transform-es2015-typeof-symbol "^6.22.0" 724 | babel-plugin-transform-es2015-unicode-regex "^6.24.1" 725 | babel-plugin-transform-regenerator "^6.24.1" 726 | 727 | babel-preset-flow@^6.23.0: 728 | version "6.23.0" 729 | resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d" 730 | dependencies: 731 | babel-plugin-transform-flow-strip-types "^6.22.0" 732 | 733 | babel-preset-react@^6.5.0: 734 | version "6.24.1" 735 | resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" 736 | dependencies: 737 | babel-plugin-syntax-jsx "^6.3.13" 738 | babel-plugin-transform-react-display-name "^6.23.0" 739 | babel-plugin-transform-react-jsx "^6.24.1" 740 | babel-plugin-transform-react-jsx-self "^6.22.0" 741 | babel-plugin-transform-react-jsx-source "^6.22.0" 742 | babel-preset-flow "^6.23.0" 743 | 744 | babel-preset-stage-0@^6.5.0: 745 | version "6.24.1" 746 | resolved "https://registry.yarnpkg.com/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz#5642d15042f91384d7e5af8bc88b1db95b039e6a" 747 | dependencies: 748 | babel-plugin-transform-do-expressions "^6.22.0" 749 | babel-plugin-transform-function-bind "^6.22.0" 750 | babel-preset-stage-1 "^6.24.1" 751 | 752 | babel-preset-stage-1@^6.24.1: 753 | version "6.24.1" 754 | resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0" 755 | dependencies: 756 | babel-plugin-transform-class-constructor-call "^6.24.1" 757 | babel-plugin-transform-export-extensions "^6.22.0" 758 | babel-preset-stage-2 "^6.24.1" 759 | 760 | babel-preset-stage-2@^6.24.1: 761 | version "6.24.1" 762 | resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" 763 | dependencies: 764 | babel-plugin-syntax-dynamic-import "^6.18.0" 765 | babel-plugin-transform-class-properties "^6.24.1" 766 | babel-plugin-transform-decorators "^6.24.1" 767 | babel-preset-stage-3 "^6.24.1" 768 | 769 | babel-preset-stage-3@^6.24.1: 770 | version "6.24.1" 771 | resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" 772 | dependencies: 773 | babel-plugin-syntax-trailing-function-commas "^6.22.0" 774 | babel-plugin-transform-async-generator-functions "^6.24.1" 775 | babel-plugin-transform-async-to-generator "^6.24.1" 776 | babel-plugin-transform-exponentiation-operator "^6.24.1" 777 | babel-plugin-transform-object-rest-spread "^6.22.0" 778 | 779 | babel-register@^6.24.1, babel-register@^6.5.1, babel-register@^6.6.0: 780 | version "6.24.1" 781 | resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" 782 | dependencies: 783 | babel-core "^6.24.1" 784 | babel-runtime "^6.22.0" 785 | core-js "^2.4.0" 786 | home-or-tmp "^2.0.0" 787 | lodash "^4.2.0" 788 | mkdirp "^0.5.1" 789 | source-map-support "^0.4.2" 790 | 791 | babel-runtime@^5.0.0: 792 | version "5.8.38" 793 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-5.8.38.tgz#1c0b02eb63312f5f087ff20450827b425c9d4c19" 794 | dependencies: 795 | core-js "^1.0.0" 796 | 797 | babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime@^6.22.0: 798 | version "6.23.0" 799 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" 800 | dependencies: 801 | core-js "^2.4.0" 802 | regenerator-runtime "^0.10.0" 803 | 804 | babel-template@^6.24.1, babel-template@^6.3.0: 805 | version "6.24.1" 806 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333" 807 | dependencies: 808 | babel-runtime "^6.22.0" 809 | babel-traverse "^6.24.1" 810 | babel-types "^6.24.1" 811 | babylon "^6.11.0" 812 | lodash "^4.2.0" 813 | 814 | babel-traverse@^6.24.1: 815 | version "6.24.1" 816 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695" 817 | dependencies: 818 | babel-code-frame "^6.22.0" 819 | babel-messages "^6.23.0" 820 | babel-runtime "^6.22.0" 821 | babel-types "^6.24.1" 822 | babylon "^6.15.0" 823 | debug "^2.2.0" 824 | globals "^9.0.0" 825 | invariant "^2.2.0" 826 | lodash "^4.2.0" 827 | 828 | babel-types@^6.19.0, babel-types@^6.24.1: 829 | version "6.24.1" 830 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975" 831 | dependencies: 832 | babel-runtime "^6.22.0" 833 | esutils "^2.0.2" 834 | lodash "^4.2.0" 835 | to-fast-properties "^1.0.1" 836 | 837 | babylon@^6.11.0, babylon@^6.15.0: 838 | version "6.17.1" 839 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.1.tgz#17f14fddf361b695981fe679385e4f1c01ebd86f" 840 | 841 | balanced-match@^0.4.1: 842 | version "0.4.2" 843 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 844 | 845 | bcrypt-pbkdf@^1.0.0: 846 | version "1.0.1" 847 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" 848 | dependencies: 849 | tweetnacl "^0.14.3" 850 | 851 | bin-version-check@^2.1.0: 852 | version "2.1.0" 853 | resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-2.1.0.tgz#e4e5df290b9069f7d111324031efc13fdd11a5b0" 854 | dependencies: 855 | bin-version "^1.0.0" 856 | minimist "^1.1.0" 857 | semver "^4.0.3" 858 | semver-truncate "^1.0.0" 859 | 860 | bin-version@^1.0.0: 861 | version "1.0.4" 862 | resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-1.0.4.tgz#9eb498ee6fd76f7ab9a7c160436f89579435d78e" 863 | dependencies: 864 | find-versions "^1.0.0" 865 | 866 | binary-extensions@^1.0.0: 867 | version "1.8.0" 868 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" 869 | 870 | block-stream@*: 871 | version "0.0.9" 872 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 873 | dependencies: 874 | inherits "~2.0.0" 875 | 876 | boom@2.x.x: 877 | version "2.10.1" 878 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" 879 | dependencies: 880 | hoek "2.x.x" 881 | 882 | brace-expansion@^1.1.7: 883 | version "1.1.7" 884 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" 885 | dependencies: 886 | balanced-match "^0.4.1" 887 | concat-map "0.0.1" 888 | 889 | braces@^1.8.2: 890 | version "1.8.5" 891 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 892 | dependencies: 893 | expand-range "^1.8.1" 894 | preserve "^0.2.0" 895 | repeat-element "^1.1.2" 896 | 897 | buffer-shims@~1.0.0: 898 | version "1.0.0" 899 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 900 | 901 | builtin-modules@^1.0.0: 902 | version "1.1.1" 903 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 904 | 905 | camelcase-keys@^2.0.0: 906 | version "2.1.0" 907 | resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" 908 | dependencies: 909 | camelcase "^2.0.0" 910 | map-obj "^1.0.0" 911 | 912 | camelcase@^2.0.0: 913 | version "2.1.1" 914 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 915 | 916 | caseless@~0.12.0: 917 | version "0.12.0" 918 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 919 | 920 | chai@^3.4.1: 921 | version "3.5.0" 922 | resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" 923 | dependencies: 924 | assertion-error "^1.0.1" 925 | deep-eql "^0.1.3" 926 | type-detect "^1.0.0" 927 | 928 | chalk@1.1.1, chalk@^1.0.0, chalk@^1.1.0: 929 | version "1.1.1" 930 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.1.tgz#509afb67066e7499f7eb3535c77445772ae2d019" 931 | dependencies: 932 | ansi-styles "^2.1.0" 933 | escape-string-regexp "^1.0.2" 934 | has-ansi "^2.0.0" 935 | strip-ansi "^3.0.0" 936 | supports-color "^2.0.0" 937 | 938 | chokidar@^1.0.0: 939 | version "1.7.0" 940 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" 941 | dependencies: 942 | anymatch "^1.3.0" 943 | async-each "^1.0.0" 944 | glob-parent "^2.0.0" 945 | inherits "^2.0.1" 946 | is-binary-path "^1.0.0" 947 | is-glob "^2.0.0" 948 | path-is-absolute "^1.0.0" 949 | readdirp "^2.0.0" 950 | optionalDependencies: 951 | fsevents "^1.0.0" 952 | 953 | co@^4.6.0: 954 | version "4.6.0" 955 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 956 | 957 | code-point-at@^1.0.0: 958 | version "1.1.0" 959 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 960 | 961 | combined-stream@^1.0.5, combined-stream@~1.0.5: 962 | version "1.0.5" 963 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 964 | dependencies: 965 | delayed-stream "~1.0.0" 966 | 967 | commander@0.6.1: 968 | version "0.6.1" 969 | resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06" 970 | 971 | commander@2.3.0: 972 | version "2.3.0" 973 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873" 974 | 975 | commander@^2.8.1: 976 | version "2.9.0" 977 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 978 | dependencies: 979 | graceful-readlink ">= 1.0.0" 980 | 981 | concat-map@0.0.1: 982 | version "0.0.1" 983 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 984 | 985 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 986 | version "1.1.0" 987 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 988 | 989 | convert-source-map@^1.1.0: 990 | version "1.5.0" 991 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" 992 | 993 | core-js@^1.0.0: 994 | version "1.2.7" 995 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" 996 | 997 | core-js@^2.4.0: 998 | version "2.4.1" 999 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" 1000 | 1001 | core-util-is@~1.0.0: 1002 | version "1.0.2" 1003 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 1004 | 1005 | create-react-class@^15.5.3: 1006 | version "15.5.3" 1007 | resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.5.3.tgz#fb0f7cae79339e9a179e194ef466efa3923820fe" 1008 | dependencies: 1009 | fbjs "^0.8.9" 1010 | loose-envify "^1.3.1" 1011 | object-assign "^4.1.1" 1012 | 1013 | cryptiles@2.x.x: 1014 | version "2.0.5" 1015 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" 1016 | dependencies: 1017 | boom "2.x.x" 1018 | 1019 | cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0": 1020 | version "0.3.2" 1021 | resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" 1022 | 1023 | "cssstyle@>= 0.2.29 < 0.3.0": 1024 | version "0.2.37" 1025 | resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" 1026 | dependencies: 1027 | cssom "0.3.x" 1028 | 1029 | currently-unhandled@^0.4.1: 1030 | version "0.4.1" 1031 | resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" 1032 | dependencies: 1033 | array-find-index "^1.0.1" 1034 | 1035 | dashdash@^1.12.0: 1036 | version "1.14.1" 1037 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 1038 | dependencies: 1039 | assert-plus "^1.0.0" 1040 | 1041 | debug@2.2.0, debug@^2.1.1, debug@^2.2.0: 1042 | version "2.2.0" 1043 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" 1044 | dependencies: 1045 | ms "0.7.1" 1046 | 1047 | decamelize@^1.1.2: 1048 | version "1.2.0" 1049 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 1050 | 1051 | deep-eql@^0.1.3: 1052 | version "0.1.3" 1053 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" 1054 | dependencies: 1055 | type-detect "0.1.1" 1056 | 1057 | deep-extend@~0.4.0: 1058 | version "0.4.2" 1059 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" 1060 | 1061 | deep-is@~0.1.3: 1062 | version "0.1.3" 1063 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 1064 | 1065 | delayed-stream@~1.0.0: 1066 | version "1.0.0" 1067 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 1068 | 1069 | delegates@^1.0.0: 1070 | version "1.0.0" 1071 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 1072 | 1073 | detect-indent@^4.0.0: 1074 | version "4.0.0" 1075 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" 1076 | dependencies: 1077 | repeating "^2.0.0" 1078 | 1079 | diff@1.4.0: 1080 | version "1.4.0" 1081 | resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" 1082 | 1083 | ecc-jsbn@~0.1.1: 1084 | version "0.1.1" 1085 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 1086 | dependencies: 1087 | jsbn "~0.1.0" 1088 | 1089 | encoding@^0.1.11: 1090 | version "0.1.12" 1091 | resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" 1092 | dependencies: 1093 | iconv-lite "~0.4.13" 1094 | 1095 | error-ex@^1.2.0: 1096 | version "1.3.1" 1097 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" 1098 | dependencies: 1099 | is-arrayish "^0.2.1" 1100 | 1101 | escape-string-regexp@1.0.2, escape-string-regexp@^1.0.2: 1102 | version "1.0.2" 1103 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1" 1104 | 1105 | escodegen@^1.6.1: 1106 | version "1.8.1" 1107 | resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" 1108 | dependencies: 1109 | esprima "^2.7.1" 1110 | estraverse "^1.9.1" 1111 | esutils "^2.0.2" 1112 | optionator "^0.8.1" 1113 | optionalDependencies: 1114 | source-map "~0.2.0" 1115 | 1116 | esprima@^2.7.1: 1117 | version "2.7.3" 1118 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" 1119 | 1120 | estraverse@^1.9.1: 1121 | version "1.9.3" 1122 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" 1123 | 1124 | esutils@^2.0.0, esutils@^2.0.2: 1125 | version "2.0.2" 1126 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 1127 | 1128 | expand-brackets@^0.1.4: 1129 | version "0.1.5" 1130 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 1131 | dependencies: 1132 | is-posix-bracket "^0.1.0" 1133 | 1134 | expand-range@^1.8.1: 1135 | version "1.8.2" 1136 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 1137 | dependencies: 1138 | fill-range "^2.1.0" 1139 | 1140 | extend@~3.0.0: 1141 | version "3.0.1" 1142 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" 1143 | 1144 | extglob@^0.3.1: 1145 | version "0.3.2" 1146 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 1147 | dependencies: 1148 | is-extglob "^1.0.0" 1149 | 1150 | extsprintf@1.0.2: 1151 | version "1.0.2" 1152 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" 1153 | 1154 | fast-levenshtein@~2.0.4: 1155 | version "2.0.6" 1156 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 1157 | 1158 | fbjs@^0.8.9: 1159 | version "0.8.12" 1160 | resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.12.tgz#10b5d92f76d45575fd63a217d4ea02bea2f8ed04" 1161 | dependencies: 1162 | core-js "^1.0.0" 1163 | isomorphic-fetch "^2.1.1" 1164 | loose-envify "^1.0.0" 1165 | object-assign "^4.1.0" 1166 | promise "^7.1.1" 1167 | setimmediate "^1.0.5" 1168 | ua-parser-js "^0.7.9" 1169 | 1170 | filename-regex@^2.0.0: 1171 | version "2.0.1" 1172 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" 1173 | 1174 | fill-range@^2.1.0: 1175 | version "2.2.3" 1176 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 1177 | dependencies: 1178 | is-number "^2.1.0" 1179 | isobject "^2.0.0" 1180 | randomatic "^1.1.3" 1181 | repeat-element "^1.1.2" 1182 | repeat-string "^1.5.2" 1183 | 1184 | find-up@^1.0.0: 1185 | version "1.1.2" 1186 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 1187 | dependencies: 1188 | path-exists "^2.0.0" 1189 | pinkie-promise "^2.0.0" 1190 | 1191 | find-versions@^1.0.0: 1192 | version "1.2.1" 1193 | resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-1.2.1.tgz#cbde9f12e38575a0af1be1b9a2c5d5fd8f186b62" 1194 | dependencies: 1195 | array-uniq "^1.0.0" 1196 | get-stdin "^4.0.1" 1197 | meow "^3.5.0" 1198 | semver-regex "^1.0.0" 1199 | 1200 | for-in@^1.0.1: 1201 | version "1.0.2" 1202 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 1203 | 1204 | for-own@^0.1.4: 1205 | version "0.1.5" 1206 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" 1207 | dependencies: 1208 | for-in "^1.0.1" 1209 | 1210 | forever-agent@~0.6.1: 1211 | version "0.6.1" 1212 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 1213 | 1214 | form-data@~2.1.1: 1215 | version "2.1.4" 1216 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" 1217 | dependencies: 1218 | asynckit "^0.4.0" 1219 | combined-stream "^1.0.5" 1220 | mime-types "^2.1.12" 1221 | 1222 | fs-readdir-recursive@^0.1.0: 1223 | version "0.1.2" 1224 | resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz#315b4fb8c1ca5b8c47defef319d073dad3568059" 1225 | 1226 | fs.realpath@^1.0.0: 1227 | version "1.0.0" 1228 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1229 | 1230 | fsevents@^1.0.0: 1231 | version "1.1.1" 1232 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff" 1233 | dependencies: 1234 | nan "^2.3.0" 1235 | node-pre-gyp "^0.6.29" 1236 | 1237 | fstream-ignore@^1.0.5: 1238 | version "1.0.5" 1239 | resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" 1240 | dependencies: 1241 | fstream "^1.0.0" 1242 | inherits "2" 1243 | minimatch "^3.0.0" 1244 | 1245 | fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: 1246 | version "1.0.11" 1247 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" 1248 | dependencies: 1249 | graceful-fs "^4.1.2" 1250 | inherits "~2.0.0" 1251 | mkdirp ">=0.5 0" 1252 | rimraf "2" 1253 | 1254 | gauge@~2.7.3: 1255 | version "2.7.4" 1256 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 1257 | dependencies: 1258 | aproba "^1.0.3" 1259 | console-control-strings "^1.0.0" 1260 | has-unicode "^2.0.0" 1261 | object-assign "^4.1.0" 1262 | signal-exit "^3.0.0" 1263 | string-width "^1.0.1" 1264 | strip-ansi "^3.0.1" 1265 | wide-align "^1.1.0" 1266 | 1267 | get-stdin@^4.0.1: 1268 | version "4.0.1" 1269 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" 1270 | 1271 | getpass@^0.1.1: 1272 | version "0.1.7" 1273 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 1274 | dependencies: 1275 | assert-plus "^1.0.0" 1276 | 1277 | glob-base@^0.3.0: 1278 | version "0.3.0" 1279 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 1280 | dependencies: 1281 | glob-parent "^2.0.0" 1282 | is-glob "^2.0.0" 1283 | 1284 | glob-parent@^2.0.0: 1285 | version "2.0.0" 1286 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 1287 | dependencies: 1288 | is-glob "^2.0.0" 1289 | 1290 | glob@3.2.11: 1291 | version "3.2.11" 1292 | resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" 1293 | dependencies: 1294 | inherits "2" 1295 | minimatch "0.3" 1296 | 1297 | glob@^5.0.5: 1298 | version "5.0.15" 1299 | resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" 1300 | dependencies: 1301 | inflight "^1.0.4" 1302 | inherits "2" 1303 | minimatch "2 || 3" 1304 | once "^1.3.0" 1305 | path-is-absolute "^1.0.0" 1306 | 1307 | glob@^7.0.5: 1308 | version "7.1.1" 1309 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 1310 | dependencies: 1311 | fs.realpath "^1.0.0" 1312 | inflight "^1.0.4" 1313 | inherits "2" 1314 | minimatch "^3.0.2" 1315 | once "^1.3.0" 1316 | path-is-absolute "^1.0.0" 1317 | 1318 | globals@^9.0.0: 1319 | version "9.17.0" 1320 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" 1321 | 1322 | graceful-fs@^4.1.2, graceful-fs@^4.1.4: 1323 | version "4.1.11" 1324 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 1325 | 1326 | "graceful-readlink@>= 1.0.0": 1327 | version "1.0.1" 1328 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 1329 | 1330 | growl@1.9.2: 1331 | version "1.9.2" 1332 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" 1333 | 1334 | har-schema@^1.0.5: 1335 | version "1.0.5" 1336 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" 1337 | 1338 | har-validator@~4.2.1: 1339 | version "4.2.1" 1340 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" 1341 | dependencies: 1342 | ajv "^4.9.1" 1343 | har-schema "^1.0.5" 1344 | 1345 | has-ansi@^2.0.0: 1346 | version "2.0.0" 1347 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 1348 | dependencies: 1349 | ansi-regex "^2.0.0" 1350 | 1351 | has-unicode@^2.0.0: 1352 | version "2.0.1" 1353 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 1354 | 1355 | hawk@~3.1.3: 1356 | version "3.1.3" 1357 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" 1358 | dependencies: 1359 | boom "2.x.x" 1360 | cryptiles "2.x.x" 1361 | hoek "2.x.x" 1362 | sntp "1.x.x" 1363 | 1364 | hoek@2.x.x: 1365 | version "2.16.3" 1366 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 1367 | 1368 | hoist-non-react-statics@^1.0.3: 1369 | version "1.2.0" 1370 | resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz#aa448cf0986d55cc40773b17174b7dd066cb7cfb" 1371 | 1372 | home-or-tmp@^2.0.0: 1373 | version "2.0.0" 1374 | resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" 1375 | dependencies: 1376 | os-homedir "^1.0.0" 1377 | os-tmpdir "^1.0.1" 1378 | 1379 | hosted-git-info@^2.1.4: 1380 | version "2.4.2" 1381 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67" 1382 | 1383 | http-signature@~1.1.0: 1384 | version "1.1.1" 1385 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" 1386 | dependencies: 1387 | assert-plus "^0.2.0" 1388 | jsprim "^1.2.2" 1389 | sshpk "^1.7.0" 1390 | 1391 | iconv-lite@~0.4.13: 1392 | version "0.4.17" 1393 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.17.tgz#4fdaa3b38acbc2c031b045d0edcdfe1ecab18c8d" 1394 | 1395 | immutable@^3.7.5: 1396 | version "3.8.1" 1397 | resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.1.tgz#200807f11ab0f72710ea485542de088075f68cd2" 1398 | 1399 | indent-string@^2.1.0: 1400 | version "2.1.0" 1401 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" 1402 | dependencies: 1403 | repeating "^2.0.0" 1404 | 1405 | inflight@^1.0.4: 1406 | version "1.0.6" 1407 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1408 | dependencies: 1409 | once "^1.3.0" 1410 | wrappy "1" 1411 | 1412 | inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: 1413 | version "2.0.3" 1414 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1415 | 1416 | ini@~1.3.0: 1417 | version "1.3.4" 1418 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 1419 | 1420 | invariant@^2.0.0, invariant@^2.2.0: 1421 | version "2.2.2" 1422 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" 1423 | dependencies: 1424 | loose-envify "^1.0.0" 1425 | 1426 | is-arrayish@^0.2.1: 1427 | version "0.2.1" 1428 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 1429 | 1430 | is-binary-path@^1.0.0: 1431 | version "1.0.1" 1432 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 1433 | dependencies: 1434 | binary-extensions "^1.0.0" 1435 | 1436 | is-buffer@^1.1.5: 1437 | version "1.1.5" 1438 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" 1439 | 1440 | is-builtin-module@^1.0.0: 1441 | version "1.0.0" 1442 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 1443 | dependencies: 1444 | builtin-modules "^1.0.0" 1445 | 1446 | is-dotfile@^1.0.0: 1447 | version "1.0.2" 1448 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" 1449 | 1450 | is-equal-shallow@^0.1.3: 1451 | version "0.1.3" 1452 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 1453 | dependencies: 1454 | is-primitive "^2.0.0" 1455 | 1456 | is-extendable@^0.1.1: 1457 | version "0.1.1" 1458 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 1459 | 1460 | is-extglob@^1.0.0: 1461 | version "1.0.0" 1462 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 1463 | 1464 | is-finite@^1.0.0: 1465 | version "1.0.2" 1466 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 1467 | dependencies: 1468 | number-is-nan "^1.0.0" 1469 | 1470 | is-fullwidth-code-point@^1.0.0: 1471 | version "1.0.0" 1472 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1473 | dependencies: 1474 | number-is-nan "^1.0.0" 1475 | 1476 | is-glob@^2.0.0, is-glob@^2.0.1: 1477 | version "2.0.1" 1478 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 1479 | dependencies: 1480 | is-extglob "^1.0.0" 1481 | 1482 | is-number@^2.0.2, is-number@^2.1.0: 1483 | version "2.1.0" 1484 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 1485 | dependencies: 1486 | kind-of "^3.0.2" 1487 | 1488 | is-posix-bracket@^0.1.0: 1489 | version "0.1.1" 1490 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 1491 | 1492 | is-primitive@^2.0.0: 1493 | version "2.0.0" 1494 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 1495 | 1496 | is-stream@^1.0.1: 1497 | version "1.1.0" 1498 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 1499 | 1500 | is-typedarray@~1.0.0: 1501 | version "1.0.0" 1502 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1503 | 1504 | is-utf8@^0.2.0: 1505 | version "0.2.1" 1506 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 1507 | 1508 | isarray@1.0.0, isarray@~1.0.0: 1509 | version "1.0.0" 1510 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1511 | 1512 | isobject@^2.0.0: 1513 | version "2.1.0" 1514 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1515 | dependencies: 1516 | isarray "1.0.0" 1517 | 1518 | isomorphic-fetch@^2.1.1: 1519 | version "2.2.1" 1520 | resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" 1521 | dependencies: 1522 | node-fetch "^1.0.1" 1523 | whatwg-fetch ">=0.10.0" 1524 | 1525 | isstream@~0.1.2: 1526 | version "0.1.2" 1527 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 1528 | 1529 | jade@0.26.3: 1530 | version "0.26.3" 1531 | resolved "https://registry.yarnpkg.com/jade/-/jade-0.26.3.tgz#8f10d7977d8d79f2f6ff862a81b0513ccb25686c" 1532 | dependencies: 1533 | commander "0.6.1" 1534 | mkdirp "0.3.0" 1535 | 1536 | jodid25519@^1.0.0: 1537 | version "1.0.2" 1538 | resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" 1539 | dependencies: 1540 | jsbn "~0.1.0" 1541 | 1542 | js-tokens@^3.0.0: 1543 | version "3.0.1" 1544 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" 1545 | 1546 | jsbn@~0.1.0: 1547 | version "0.1.1" 1548 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 1549 | 1550 | jsdom@^7.2.1: 1551 | version "7.2.2" 1552 | resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-7.2.2.tgz#40b402770c2bda23469096bee91ab675e3b1fc6e" 1553 | dependencies: 1554 | abab "^1.0.0" 1555 | acorn "^2.4.0" 1556 | acorn-globals "^1.0.4" 1557 | cssom ">= 0.3.0 < 0.4.0" 1558 | cssstyle ">= 0.2.29 < 0.3.0" 1559 | escodegen "^1.6.1" 1560 | nwmatcher ">= 1.3.7 < 2.0.0" 1561 | parse5 "^1.5.1" 1562 | request "^2.55.0" 1563 | sax "^1.1.4" 1564 | symbol-tree ">= 3.1.0 < 4.0.0" 1565 | tough-cookie "^2.2.0" 1566 | webidl-conversions "^2.0.0" 1567 | whatwg-url-compat "~0.6.5" 1568 | xml-name-validator ">= 2.0.1 < 3.0.0" 1569 | 1570 | jsesc@^1.3.0: 1571 | version "1.3.0" 1572 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" 1573 | 1574 | jsesc@~0.5.0: 1575 | version "0.5.0" 1576 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" 1577 | 1578 | json-schema@0.2.3: 1579 | version "0.2.3" 1580 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1581 | 1582 | json-stable-stringify@^1.0.1: 1583 | version "1.0.1" 1584 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 1585 | dependencies: 1586 | jsonify "~0.0.0" 1587 | 1588 | json-stringify-safe@~5.0.1: 1589 | version "5.0.1" 1590 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1591 | 1592 | json5@^0.5.0: 1593 | version "0.5.1" 1594 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" 1595 | 1596 | jsonify@~0.0.0: 1597 | version "0.0.0" 1598 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 1599 | 1600 | jsprim@^1.2.2: 1601 | version "1.4.0" 1602 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" 1603 | dependencies: 1604 | assert-plus "1.0.0" 1605 | extsprintf "1.0.2" 1606 | json-schema "0.2.3" 1607 | verror "1.3.6" 1608 | 1609 | kind-of@^3.0.2: 1610 | version "3.2.0" 1611 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.0.tgz#b58abe4d5c044ad33726a8c1525b48cf891bff07" 1612 | dependencies: 1613 | is-buffer "^1.1.5" 1614 | 1615 | levn@~0.3.0: 1616 | version "0.3.0" 1617 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 1618 | dependencies: 1619 | prelude-ls "~1.1.2" 1620 | type-check "~0.3.2" 1621 | 1622 | load-json-file@^1.0.0: 1623 | version "1.1.0" 1624 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 1625 | dependencies: 1626 | graceful-fs "^4.1.2" 1627 | parse-json "^2.2.0" 1628 | pify "^2.0.0" 1629 | pinkie-promise "^2.0.0" 1630 | strip-bom "^2.0.0" 1631 | 1632 | lodash-es@^4.2.0, lodash-es@^4.2.1: 1633 | version "4.17.4" 1634 | resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.4.tgz#dcc1d7552e150a0640073ba9cb31d70f032950e7" 1635 | 1636 | lodash@^3.2.0: 1637 | version "3.10.1" 1638 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" 1639 | 1640 | lodash@^4.2.0, lodash@^4.2.1: 1641 | version "4.17.4" 1642 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 1643 | 1644 | log-symbols@^1.0.2: 1645 | version "1.0.2" 1646 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" 1647 | dependencies: 1648 | chalk "^1.0.0" 1649 | 1650 | loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: 1651 | version "1.3.1" 1652 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" 1653 | dependencies: 1654 | js-tokens "^3.0.0" 1655 | 1656 | loud-rejection@^1.0.0: 1657 | version "1.6.0" 1658 | resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" 1659 | dependencies: 1660 | currently-unhandled "^0.4.1" 1661 | signal-exit "^3.0.0" 1662 | 1663 | lru-cache@2: 1664 | version "2.7.3" 1665 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" 1666 | 1667 | map-obj@^1.0.0, map-obj@^1.0.1: 1668 | version "1.0.1" 1669 | resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" 1670 | 1671 | meow@^3.5.0: 1672 | version "3.7.0" 1673 | resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" 1674 | dependencies: 1675 | camelcase-keys "^2.0.0" 1676 | decamelize "^1.1.2" 1677 | loud-rejection "^1.0.0" 1678 | map-obj "^1.0.1" 1679 | minimist "^1.1.3" 1680 | normalize-package-data "^2.3.4" 1681 | object-assign "^4.0.1" 1682 | read-pkg-up "^1.0.1" 1683 | redent "^1.0.0" 1684 | trim-newlines "^1.0.0" 1685 | 1686 | micromatch@^2.1.5: 1687 | version "2.3.11" 1688 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 1689 | dependencies: 1690 | arr-diff "^2.0.0" 1691 | array-unique "^0.2.1" 1692 | braces "^1.8.2" 1693 | expand-brackets "^0.1.4" 1694 | extglob "^0.3.1" 1695 | filename-regex "^2.0.0" 1696 | is-extglob "^1.0.0" 1697 | is-glob "^2.0.1" 1698 | kind-of "^3.0.2" 1699 | normalize-path "^2.0.1" 1700 | object.omit "^2.0.0" 1701 | parse-glob "^3.0.4" 1702 | regex-cache "^0.4.2" 1703 | 1704 | mime-db@~1.27.0: 1705 | version "1.27.0" 1706 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" 1707 | 1708 | mime-types@^2.1.12, mime-types@~2.1.7: 1709 | version "2.1.15" 1710 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" 1711 | dependencies: 1712 | mime-db "~1.27.0" 1713 | 1714 | minimatch@0.3: 1715 | version "0.3.0" 1716 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" 1717 | dependencies: 1718 | lru-cache "2" 1719 | sigmund "~1.0.0" 1720 | 1721 | "minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2: 1722 | version "3.0.4" 1723 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1724 | dependencies: 1725 | brace-expansion "^1.1.7" 1726 | 1727 | minimist@0.0.8: 1728 | version "0.0.8" 1729 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1730 | 1731 | minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: 1732 | version "1.2.0" 1733 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1734 | 1735 | mkdirp@0.3.0: 1736 | version "0.3.0" 1737 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" 1738 | 1739 | mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.1: 1740 | version "0.5.1" 1741 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1742 | dependencies: 1743 | minimist "0.0.8" 1744 | 1745 | mocha@^2.3.4: 1746 | version "2.5.3" 1747 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-2.5.3.tgz#161be5bdeb496771eb9b35745050b622b5aefc58" 1748 | dependencies: 1749 | commander "2.3.0" 1750 | debug "2.2.0" 1751 | diff "1.4.0" 1752 | escape-string-regexp "1.0.2" 1753 | glob "3.2.11" 1754 | growl "1.9.2" 1755 | jade "0.26.3" 1756 | mkdirp "0.5.1" 1757 | supports-color "1.2.0" 1758 | to-iso-string "0.0.2" 1759 | 1760 | ms@0.7.1: 1761 | version "0.7.1" 1762 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" 1763 | 1764 | nan@^2.3.0: 1765 | version "2.6.2" 1766 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" 1767 | 1768 | node-fetch@^1.0.1: 1769 | version "1.6.3" 1770 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" 1771 | dependencies: 1772 | encoding "^0.1.11" 1773 | is-stream "^1.0.1" 1774 | 1775 | node-pre-gyp@^0.6.29: 1776 | version "0.6.34" 1777 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc18d9799f7" 1778 | dependencies: 1779 | mkdirp "^0.5.1" 1780 | nopt "^4.0.1" 1781 | npmlog "^4.0.2" 1782 | rc "^1.1.7" 1783 | request "^2.81.0" 1784 | rimraf "^2.6.1" 1785 | semver "^5.3.0" 1786 | tar "^2.2.1" 1787 | tar-pack "^3.4.0" 1788 | 1789 | nopt@^4.0.1: 1790 | version "4.0.1" 1791 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 1792 | dependencies: 1793 | abbrev "1" 1794 | osenv "^0.1.4" 1795 | 1796 | normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: 1797 | version "2.3.8" 1798 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb" 1799 | dependencies: 1800 | hosted-git-info "^2.1.4" 1801 | is-builtin-module "^1.0.0" 1802 | semver "2 || 3 || 4 || 5" 1803 | validate-npm-package-license "^3.0.1" 1804 | 1805 | normalize-path@^2.0.1: 1806 | version "2.1.1" 1807 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 1808 | dependencies: 1809 | remove-trailing-separator "^1.0.1" 1810 | 1811 | npmlog@^4.0.2: 1812 | version "4.1.0" 1813 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.0.tgz#dc59bee85f64f00ed424efb2af0783df25d1c0b5" 1814 | dependencies: 1815 | are-we-there-yet "~1.1.2" 1816 | console-control-strings "~1.1.0" 1817 | gauge "~2.7.3" 1818 | set-blocking "~2.0.0" 1819 | 1820 | number-is-nan@^1.0.0: 1821 | version "1.0.1" 1822 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1823 | 1824 | "nwmatcher@>= 1.3.7 < 2.0.0": 1825 | version "1.3.9" 1826 | resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.3.9.tgz#8bab486ff7fa3dfd086656bbe8b17116d3692d2a" 1827 | 1828 | oauth-sign@~0.8.1: 1829 | version "0.8.2" 1830 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 1831 | 1832 | object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: 1833 | version "4.1.1" 1834 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1835 | 1836 | object.omit@^2.0.0: 1837 | version "2.0.1" 1838 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 1839 | dependencies: 1840 | for-own "^0.1.4" 1841 | is-extendable "^0.1.1" 1842 | 1843 | once@^1.3.0, once@^1.3.3: 1844 | version "1.4.0" 1845 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1846 | dependencies: 1847 | wrappy "1" 1848 | 1849 | optionator@^0.8.1: 1850 | version "0.8.2" 1851 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 1852 | dependencies: 1853 | deep-is "~0.1.3" 1854 | fast-levenshtein "~2.0.4" 1855 | levn "~0.3.0" 1856 | prelude-ls "~1.1.2" 1857 | type-check "~0.3.2" 1858 | wordwrap "~1.0.0" 1859 | 1860 | os-homedir@^1.0.0: 1861 | version "1.0.2" 1862 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1863 | 1864 | os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: 1865 | version "1.0.2" 1866 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1867 | 1868 | osenv@^0.1.4: 1869 | version "0.1.4" 1870 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" 1871 | dependencies: 1872 | os-homedir "^1.0.0" 1873 | os-tmpdir "^1.0.0" 1874 | 1875 | output-file-sync@^1.1.0: 1876 | version "1.1.2" 1877 | resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" 1878 | dependencies: 1879 | graceful-fs "^4.1.4" 1880 | mkdirp "^0.5.1" 1881 | object-assign "^4.1.0" 1882 | 1883 | parse-glob@^3.0.4: 1884 | version "3.0.4" 1885 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 1886 | dependencies: 1887 | glob-base "^0.3.0" 1888 | is-dotfile "^1.0.0" 1889 | is-extglob "^1.0.0" 1890 | is-glob "^2.0.0" 1891 | 1892 | parse-json@^2.2.0: 1893 | version "2.2.0" 1894 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1895 | dependencies: 1896 | error-ex "^1.2.0" 1897 | 1898 | parse5@^1.5.1: 1899 | version "1.5.1" 1900 | resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" 1901 | 1902 | path-exists@^1.0.0: 1903 | version "1.0.0" 1904 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-1.0.0.tgz#d5a8998eb71ef37a74c34eb0d9eba6e878eea081" 1905 | 1906 | path-exists@^2.0.0: 1907 | version "2.1.0" 1908 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 1909 | dependencies: 1910 | pinkie-promise "^2.0.0" 1911 | 1912 | path-is-absolute@^1.0.0: 1913 | version "1.0.1" 1914 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1915 | 1916 | path-type@^1.0.0: 1917 | version "1.1.0" 1918 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 1919 | dependencies: 1920 | graceful-fs "^4.1.2" 1921 | pify "^2.0.0" 1922 | pinkie-promise "^2.0.0" 1923 | 1924 | performance-now@^0.2.0: 1925 | version "0.2.0" 1926 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" 1927 | 1928 | pify@^2.0.0: 1929 | version "2.3.0" 1930 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1931 | 1932 | pinkie-promise@^2.0.0: 1933 | version "2.0.1" 1934 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1935 | dependencies: 1936 | pinkie "^2.0.0" 1937 | 1938 | pinkie@^2.0.0: 1939 | version "2.0.4" 1940 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1941 | 1942 | prelude-ls@~1.1.2: 1943 | version "1.1.2" 1944 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1945 | 1946 | preserve@^0.2.0: 1947 | version "0.2.0" 1948 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 1949 | 1950 | private@^0.1.6: 1951 | version "0.1.7" 1952 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" 1953 | 1954 | process-nextick-args@~1.0.6: 1955 | version "1.0.7" 1956 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1957 | 1958 | promise@^7.1.1: 1959 | version "7.1.1" 1960 | resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf" 1961 | dependencies: 1962 | asap "~2.0.3" 1963 | 1964 | prop-types@^15.5.10, prop-types@^15.5.7, prop-types@~15.5.0: 1965 | version "15.5.10" 1966 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.10.tgz#2797dfc3126182e3a95e3dfbb2e893ddd7456154" 1967 | dependencies: 1968 | fbjs "^0.8.9" 1969 | loose-envify "^1.3.1" 1970 | 1971 | punycode@^1.4.1: 1972 | version "1.4.1" 1973 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1974 | 1975 | qs@~6.4.0: 1976 | version "6.4.0" 1977 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" 1978 | 1979 | randomatic@^1.1.3: 1980 | version "1.1.6" 1981 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" 1982 | dependencies: 1983 | is-number "^2.0.2" 1984 | kind-of "^3.0.2" 1985 | 1986 | rc@^1.1.7: 1987 | version "1.2.1" 1988 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" 1989 | dependencies: 1990 | deep-extend "~0.4.0" 1991 | ini "~1.3.0" 1992 | minimist "^1.2.0" 1993 | strip-json-comments "~2.0.1" 1994 | 1995 | react-dom@15.5.0: 1996 | version "15.5.0" 1997 | resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.5.0.tgz#86a8d6dcde388473815039de3840706e1f28f697" 1998 | dependencies: 1999 | fbjs "^0.8.9" 2000 | loose-envify "^1.1.0" 2001 | object-assign "^4.1.0" 2002 | prop-types "~15.5.0" 2003 | 2004 | "react-redux@^4.4.8 || ^5.0.4": 2005 | version "5.0.5" 2006 | resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.0.5.tgz#f8e8c7b239422576e52d6b7db06439469be9846a" 2007 | dependencies: 2008 | create-react-class "^15.5.3" 2009 | hoist-non-react-statics "^1.0.3" 2010 | invariant "^2.0.0" 2011 | lodash "^4.2.0" 2012 | lodash-es "^4.2.0" 2013 | loose-envify "^1.1.0" 2014 | prop-types "^15.5.10" 2015 | 2016 | "react@^0.14.9 || ^15.3.0": 2017 | version "15.5.4" 2018 | resolved "https://registry.yarnpkg.com/react/-/react-15.5.4.tgz#fa83eb01506ab237cdc1c8c3b1cea8de012bf047" 2019 | dependencies: 2020 | fbjs "^0.8.9" 2021 | loose-envify "^1.1.0" 2022 | object-assign "^4.1.0" 2023 | prop-types "^15.5.7" 2024 | 2025 | read-pkg-up@^1.0.1: 2026 | version "1.0.1" 2027 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 2028 | dependencies: 2029 | find-up "^1.0.0" 2030 | read-pkg "^1.0.0" 2031 | 2032 | read-pkg@^1.0.0: 2033 | version "1.1.0" 2034 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 2035 | dependencies: 2036 | load-json-file "^1.0.0" 2037 | normalize-package-data "^2.3.2" 2038 | path-type "^1.0.0" 2039 | 2040 | readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4: 2041 | version "2.2.9" 2042 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" 2043 | dependencies: 2044 | buffer-shims "~1.0.0" 2045 | core-util-is "~1.0.0" 2046 | inherits "~2.0.1" 2047 | isarray "~1.0.0" 2048 | process-nextick-args "~1.0.6" 2049 | string_decoder "~1.0.0" 2050 | util-deprecate "~1.0.1" 2051 | 2052 | readdirp@^2.0.0: 2053 | version "2.1.0" 2054 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" 2055 | dependencies: 2056 | graceful-fs "^4.1.2" 2057 | minimatch "^3.0.2" 2058 | readable-stream "^2.0.2" 2059 | set-immediate-shim "^1.0.1" 2060 | 2061 | redent@^1.0.0: 2062 | version "1.0.0" 2063 | resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" 2064 | dependencies: 2065 | indent-string "^2.1.0" 2066 | strip-indent "^1.0.1" 2067 | 2068 | redux@^3.0.4: 2069 | version "3.6.0" 2070 | resolved "https://registry.yarnpkg.com/redux/-/redux-3.6.0.tgz#887c2b3d0b9bd86eca2be70571c27654c19e188d" 2071 | dependencies: 2072 | lodash "^4.2.1" 2073 | lodash-es "^4.2.1" 2074 | loose-envify "^1.1.0" 2075 | symbol-observable "^1.0.2" 2076 | 2077 | regenerate@^1.2.1: 2078 | version "1.3.2" 2079 | resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" 2080 | 2081 | regenerator-runtime@^0.10.0: 2082 | version "0.10.5" 2083 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" 2084 | 2085 | regenerator-transform@0.9.11: 2086 | version "0.9.11" 2087 | resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" 2088 | dependencies: 2089 | babel-runtime "^6.18.0" 2090 | babel-types "^6.19.0" 2091 | private "^0.1.6" 2092 | 2093 | regex-cache@^0.4.2: 2094 | version "0.4.3" 2095 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" 2096 | dependencies: 2097 | is-equal-shallow "^0.1.3" 2098 | is-primitive "^2.0.0" 2099 | 2100 | regexpu-core@^2.0.0: 2101 | version "2.0.0" 2102 | resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" 2103 | dependencies: 2104 | regenerate "^1.2.1" 2105 | regjsgen "^0.2.0" 2106 | regjsparser "^0.1.4" 2107 | 2108 | regjsgen@^0.2.0: 2109 | version "0.2.0" 2110 | resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" 2111 | 2112 | regjsparser@^0.1.4: 2113 | version "0.1.5" 2114 | resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" 2115 | dependencies: 2116 | jsesc "~0.5.0" 2117 | 2118 | remove-trailing-separator@^1.0.1: 2119 | version "1.0.1" 2120 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4" 2121 | 2122 | repeat-element@^1.1.2: 2123 | version "1.1.2" 2124 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 2125 | 2126 | repeat-string@^1.5.2: 2127 | version "1.6.1" 2128 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 2129 | 2130 | repeating@^2.0.0: 2131 | version "2.0.1" 2132 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 2133 | dependencies: 2134 | is-finite "^1.0.0" 2135 | 2136 | request@^2.55.0, request@^2.65.0, request@^2.81.0: 2137 | version "2.81.0" 2138 | resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" 2139 | dependencies: 2140 | aws-sign2 "~0.6.0" 2141 | aws4 "^1.2.1" 2142 | caseless "~0.12.0" 2143 | combined-stream "~1.0.5" 2144 | extend "~3.0.0" 2145 | forever-agent "~0.6.1" 2146 | form-data "~2.1.1" 2147 | har-validator "~4.2.1" 2148 | hawk "~3.1.3" 2149 | http-signature "~1.1.0" 2150 | is-typedarray "~1.0.0" 2151 | isstream "~0.1.2" 2152 | json-stringify-safe "~5.0.1" 2153 | mime-types "~2.1.7" 2154 | oauth-sign "~0.8.1" 2155 | performance-now "^0.2.0" 2156 | qs "~6.4.0" 2157 | safe-buffer "^5.0.1" 2158 | stringstream "~0.0.4" 2159 | tough-cookie "~2.3.0" 2160 | tunnel-agent "^0.6.0" 2161 | uuid "^3.0.0" 2162 | 2163 | rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1: 2164 | version "2.6.1" 2165 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" 2166 | dependencies: 2167 | glob "^7.0.5" 2168 | 2169 | safe-buffer@^5.0.1: 2170 | version "5.0.1" 2171 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" 2172 | 2173 | sax@^1.1.4: 2174 | version "1.2.2" 2175 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828" 2176 | 2177 | semver-regex@^1.0.0: 2178 | version "1.0.0" 2179 | resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-1.0.0.tgz#92a4969065f9c70c694753d55248fc68f8f652c9" 2180 | 2181 | semver-truncate@^1.0.0: 2182 | version "1.1.2" 2183 | resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-1.1.2.tgz#57f41de69707a62709a7e0104ba2117109ea47e8" 2184 | dependencies: 2185 | semver "^5.3.0" 2186 | 2187 | "semver@2 || 3 || 4 || 5", semver@^5.3.0: 2188 | version "5.3.0" 2189 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 2190 | 2191 | semver@^4.0.3: 2192 | version "4.3.6" 2193 | resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" 2194 | 2195 | set-blocking@~2.0.0: 2196 | version "2.0.0" 2197 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 2198 | 2199 | set-immediate-shim@^1.0.1: 2200 | version "1.0.1" 2201 | resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" 2202 | 2203 | setimmediate@^1.0.5: 2204 | version "1.0.5" 2205 | resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 2206 | 2207 | sigmund@~1.0.0: 2208 | version "1.0.1" 2209 | resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" 2210 | 2211 | signal-exit@^3.0.0: 2212 | version "3.0.2" 2213 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 2214 | 2215 | slash@^1.0.0: 2216 | version "1.0.0" 2217 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" 2218 | 2219 | sntp@1.x.x: 2220 | version "1.0.9" 2221 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" 2222 | dependencies: 2223 | hoek "2.x.x" 2224 | 2225 | source-map-support@^0.4.2: 2226 | version "0.4.15" 2227 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" 2228 | dependencies: 2229 | source-map "^0.5.6" 2230 | 2231 | source-map@^0.5.0, source-map@^0.5.6: 2232 | version "0.5.6" 2233 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" 2234 | 2235 | source-map@~0.2.0: 2236 | version "0.2.0" 2237 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" 2238 | dependencies: 2239 | amdefine ">=0.0.4" 2240 | 2241 | spdx-correct@~1.0.0: 2242 | version "1.0.2" 2243 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" 2244 | dependencies: 2245 | spdx-license-ids "^1.0.2" 2246 | 2247 | spdx-expression-parse@~1.0.0: 2248 | version "1.0.4" 2249 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" 2250 | 2251 | spdx-license-ids@^1.0.2: 2252 | version "1.2.2" 2253 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" 2254 | 2255 | sshpk@^1.7.0: 2256 | version "1.13.0" 2257 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c" 2258 | dependencies: 2259 | asn1 "~0.2.3" 2260 | assert-plus "^1.0.0" 2261 | dashdash "^1.12.0" 2262 | getpass "^0.1.1" 2263 | optionalDependencies: 2264 | bcrypt-pbkdf "^1.0.0" 2265 | ecc-jsbn "~0.1.1" 2266 | jodid25519 "^1.0.0" 2267 | jsbn "~0.1.0" 2268 | tweetnacl "~0.14.0" 2269 | 2270 | string-width@^1.0.1, string-width@^1.0.2: 2271 | version "1.0.2" 2272 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 2273 | dependencies: 2274 | code-point-at "^1.0.0" 2275 | is-fullwidth-code-point "^1.0.0" 2276 | strip-ansi "^3.0.0" 2277 | 2278 | string_decoder@~1.0.0: 2279 | version "1.0.0" 2280 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.0.tgz#f06f41157b664d86069f84bdbdc9b0d8ab281667" 2281 | dependencies: 2282 | buffer-shims "~1.0.0" 2283 | 2284 | stringstream@~0.0.4: 2285 | version "0.0.5" 2286 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 2287 | 2288 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 2289 | version "3.0.1" 2290 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 2291 | dependencies: 2292 | ansi-regex "^2.0.0" 2293 | 2294 | strip-bom@^2.0.0: 2295 | version "2.0.0" 2296 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 2297 | dependencies: 2298 | is-utf8 "^0.2.0" 2299 | 2300 | strip-indent@^1.0.1: 2301 | version "1.0.1" 2302 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" 2303 | dependencies: 2304 | get-stdin "^4.0.1" 2305 | 2306 | strip-json-comments@~2.0.1: 2307 | version "2.0.1" 2308 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2309 | 2310 | supports-color@1.2.0: 2311 | version "1.2.0" 2312 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.2.0.tgz#ff1ed1e61169d06b3cf2d588e188b18d8847e17e" 2313 | 2314 | supports-color@^2.0.0: 2315 | version "2.0.0" 2316 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 2317 | 2318 | symbol-observable@^1.0.2: 2319 | version "1.0.4" 2320 | resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" 2321 | 2322 | "symbol-tree@>= 3.1.0 < 4.0.0": 2323 | version "3.2.2" 2324 | resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" 2325 | 2326 | tar-pack@^3.4.0: 2327 | version "3.4.0" 2328 | resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" 2329 | dependencies: 2330 | debug "^2.2.0" 2331 | fstream "^1.0.10" 2332 | fstream-ignore "^1.0.5" 2333 | once "^1.3.3" 2334 | readable-stream "^2.1.4" 2335 | rimraf "^2.5.1" 2336 | tar "^2.2.1" 2337 | uid-number "^0.0.6" 2338 | 2339 | tar@^2.2.1: 2340 | version "2.2.1" 2341 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" 2342 | dependencies: 2343 | block-stream "*" 2344 | fstream "^1.0.2" 2345 | inherits "2" 2346 | 2347 | to-fast-properties@^1.0.1: 2348 | version "1.0.3" 2349 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" 2350 | 2351 | to-iso-string@0.0.2: 2352 | version "0.0.2" 2353 | resolved "https://registry.yarnpkg.com/to-iso-string/-/to-iso-string-0.0.2.tgz#4dc19e664dfccbe25bd8db508b00c6da158255d1" 2354 | 2355 | tough-cookie@^2.2.0, tough-cookie@~2.3.0: 2356 | version "2.3.2" 2357 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" 2358 | dependencies: 2359 | punycode "^1.4.1" 2360 | 2361 | tr46@~0.0.1: 2362 | version "0.0.3" 2363 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" 2364 | 2365 | trim-newlines@^1.0.0: 2366 | version "1.0.0" 2367 | resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" 2368 | 2369 | trim-right@^1.0.1: 2370 | version "1.0.1" 2371 | resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" 2372 | 2373 | tunnel-agent@^0.6.0: 2374 | version "0.6.0" 2375 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 2376 | dependencies: 2377 | safe-buffer "^5.0.1" 2378 | 2379 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 2380 | version "0.14.5" 2381 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 2382 | 2383 | type-check@~0.3.2: 2384 | version "0.3.2" 2385 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 2386 | dependencies: 2387 | prelude-ls "~1.1.2" 2388 | 2389 | type-detect@0.1.1: 2390 | version "0.1.1" 2391 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" 2392 | 2393 | type-detect@^1.0.0: 2394 | version "1.0.0" 2395 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" 2396 | 2397 | ua-parser-js@^0.7.9: 2398 | version "0.7.12" 2399 | resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.12.tgz#04c81a99bdd5dc52263ea29d24c6bf8d4818a4bb" 2400 | 2401 | uid-number@^0.0.6: 2402 | version "0.0.6" 2403 | resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" 2404 | 2405 | user-home@^1.1.1: 2406 | version "1.1.1" 2407 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" 2408 | 2409 | util-deprecate@~1.0.1: 2410 | version "1.0.2" 2411 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2412 | 2413 | uuid@^3.0.0: 2414 | version "3.0.1" 2415 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" 2416 | 2417 | v8flags@^2.0.10: 2418 | version "2.1.1" 2419 | resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" 2420 | dependencies: 2421 | user-home "^1.1.1" 2422 | 2423 | validate-npm-package-license@^3.0.1: 2424 | version "3.0.1" 2425 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" 2426 | dependencies: 2427 | spdx-correct "~1.0.0" 2428 | spdx-expression-parse "~1.0.0" 2429 | 2430 | verror@1.3.6: 2431 | version "1.3.6" 2432 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" 2433 | dependencies: 2434 | extsprintf "1.0.2" 2435 | 2436 | webidl-conversions@^2.0.0: 2437 | version "2.0.1" 2438 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-2.0.1.tgz#3bf8258f7d318c7443c36f2e169402a1a6703506" 2439 | 2440 | whatwg-fetch@>=0.10.0: 2441 | version "2.0.3" 2442 | resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" 2443 | 2444 | whatwg-url-compat@~0.6.5: 2445 | version "0.6.5" 2446 | resolved "https://registry.yarnpkg.com/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz#00898111af689bb097541cd5a45ca6c8798445bf" 2447 | dependencies: 2448 | tr46 "~0.0.1" 2449 | 2450 | wide-align@^1.1.0: 2451 | version "1.1.2" 2452 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" 2453 | dependencies: 2454 | string-width "^1.0.2" 2455 | 2456 | wordwrap@~1.0.0: 2457 | version "1.0.0" 2458 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 2459 | 2460 | wrappy@1: 2461 | version "1.0.2" 2462 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2463 | 2464 | "xml-name-validator@>= 2.0.1 < 3.0.0": 2465 | version "2.0.1" 2466 | resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" 2467 | --------------------------------------------------------------------------------