├── packages ├── core │ ├── src │ │ ├── __mocks__ │ │ │ ├── validateApi.js │ │ │ └── actions.js │ │ ├── utils │ │ │ ├── handleActions.js │ │ │ ├── get.js │ │ │ ├── applyFunctions.js │ │ │ └── __tests__ │ │ │ │ ├── get.spec.js │ │ │ │ └── handleActions.spec.js │ │ ├── constants.js │ │ ├── composeAdapters.js │ │ ├── actions.js │ │ ├── index.js │ │ ├── __tests__ │ │ │ ├── createAPIMiddleware.spec.js │ │ │ ├── composeAdapters.spec.js │ │ │ ├── makeFetchAction.spec.js │ │ │ ├── reducer.spec.js │ │ │ └── middleware.spec.js │ │ ├── makeFetchAction.js │ │ ├── middleware.js │ │ └── reducer.js │ ├── .babelrc │ ├── rollup.config.js │ ├── package.json │ ├── README.md │ └── CHANGELOG.md ├── adapter-dedupe │ ├── src │ │ └── index.js │ ├── package.json │ ├── CHANGELOG.md │ └── yarn.lock ├── adapter-json │ ├── src │ │ └── index.js │ ├── package.json │ └── CHANGELOG.md └── adapter-fetch │ ├── src │ └── index.js │ ├── package.json │ ├── CHANGELOG.md │ └── yarn.lock ├── lerna.json ├── package.json ├── .gitignore ├── .imdone └── config.json ├── CHANGELOG.md ├── LICENSE └── README.md /packages/core/src/__mocks__/validateApi.js: -------------------------------------------------------------------------------- 1 | import { stub } from 'sinon'; 2 | export const validateApi = stub(); 3 | -------------------------------------------------------------------------------- /lerna.json: -------------------------------------------------------------------------------- 1 | { 2 | "lerna": "2.0.0-rc.3", 3 | "packages": [ 4 | "packages/*" 5 | ], 6 | "version": "1.2.1" 7 | } 8 | -------------------------------------------------------------------------------- /packages/core/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["stage-1", "es2015", "es2016"], 3 | "plugins": ["transform-function-bind", "transform-runtime"] 4 | } 5 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "lerna": "^2.0.0-rc.3" 4 | }, 5 | "scripts": { 6 | "postinstall": "lerna bootstrap --npm-client=yarn", 7 | "test": "lerna run test" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /packages/core/src/__mocks__/actions.js: -------------------------------------------------------------------------------- 1 | import { stub } from 'sinon'; 2 | 3 | export const makeStartErrorAction = stub(); 4 | export const makeStartAction = stub(); 5 | export const makeSuccessAction = stub(); 6 | export const makeFailureAction = stub(); 7 | -------------------------------------------------------------------------------- /packages/core/src/utils/handleActions.js: -------------------------------------------------------------------------------- 1 | export default (handlers) => (state = {}, action) => { 2 | const handler = handlers[action.type]; 3 | if (typeof handler !== 'function') { 4 | return state; 5 | } 6 | 7 | return handler(state, action); 8 | } 9 | -------------------------------------------------------------------------------- /packages/adapter-dedupe/src/index.js: -------------------------------------------------------------------------------- 1 | export default next => { 2 | const lastReqByName = {}; 3 | 4 | return async req => { 5 | const { name } = req; 6 | 7 | lastReqByName[name] = req; 8 | 9 | const resp = await next(req); 10 | 11 | return new Promise((resolve) => { 12 | if (lastReqByName[name] === req) { 13 | resolve(resp); 14 | } 15 | }); 16 | }; 17 | }; 18 | -------------------------------------------------------------------------------- /packages/core/src/utils/get.js: -------------------------------------------------------------------------------- 1 | export default (array, defaulValue) => state => { 2 | const finalValue = array.reduce((value, nextProp) => { 3 | if (typeof value === 'undefined' || value === null) { 4 | return; 5 | } 6 | return value[nextProp]; 7 | }, state); 8 | 9 | if (typeof finalValue === 'undefined') { 10 | return defaulValue; 11 | } 12 | 13 | return finalValue; 14 | }; 15 | -------------------------------------------------------------------------------- /packages/core/src/constants.js: -------------------------------------------------------------------------------- 1 | export const REDUCER_PATH = 'api_calls'; 2 | export const ACTION_FETCH_START = '@@api/FETCH_START'; 3 | export const ACTION_FETCH_COMPLETE = '@@api/FETCH_COMPLETE'; 4 | export const ACTION_FETCH_FAILURE = '@@api/FETCH_FAILURE'; 5 | export const ACTION_UPDATE_LOCAL = '@@api/UPDATE_LOCAL'; 6 | export const ACTION_RESET_LOCAL = '@@api/RESET_LOCAL'; 7 | export const ACTION_DISPOSE = '@@api/DISPOSE'; 8 | -------------------------------------------------------------------------------- /packages/core/src/utils/applyFunctions.js: -------------------------------------------------------------------------------- 1 | const reduceKeys = (obj) => (reducer, seed) => Object.keys(obj).reduce((acc, key) => ({ 2 | ...acc, 3 | ...reducer(obj, key), 4 | }), seed); 5 | 6 | const bindFunction = (getState) => (obj, key) => ({ 7 | [key]: typeof obj[key] === 'function' ? obj[key](getState()) : obj[key], 8 | }); 9 | 10 | export default (getState) => (api) => reduceKeys(api)(bindFunction(getState), {}); 11 | -------------------------------------------------------------------------------- /packages/core/src/utils/__tests__/get.spec.js: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import get from '../get'; 3 | 4 | describe('utils > get', () => { 5 | it('should return default value if actual value is undefined', () => { 6 | expect(get(['a', 'b', 'c'], 1)({})).to.equal(1); 7 | }); 8 | 9 | it('should return value in nested object', () => { 10 | expect(get(['a', 'b', 'c'], 1)({ a: { b: { c: 'xxx' }}})).to.equal('xxx'); 11 | }); 12 | }); 13 | -------------------------------------------------------------------------------- /packages/core/src/composeAdapters.js: -------------------------------------------------------------------------------- 1 | const compose = (...adapters) => { 2 | if (adapters.length === 0) { 3 | throw new Error('redux-api-call: composeAdatpers must take at least one adapter') 4 | } 5 | const reversed = adapters.reverse(); 6 | const head = reversed[0]; 7 | const tail = reversed.slice(1); 8 | 9 | return getState => tail.reduce( 10 | (acc, current) => current(acc, getState), 11 | head(x => x, getState) 12 | ); 13 | } 14 | 15 | export default compose; 16 | -------------------------------------------------------------------------------- /packages/adapter-json/src/index.js: -------------------------------------------------------------------------------- 1 | const tryJSON = (raw) => { 2 | try { 3 | return JSON.parse(raw); 4 | } catch (ex) { 5 | return raw; 6 | } 7 | }; 8 | 9 | export default (next) => async (req) => { 10 | try { 11 | const { payload, ...others } = await next(req); 12 | return { 13 | payload: tryJSON(payload), 14 | ...others 15 | } 16 | 17 | } catch ({ payload, ...others }) { 18 | throw { 19 | payload: tryJSON(payload), 20 | ...others 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /packages/core/rollup.config.js: -------------------------------------------------------------------------------- 1 | import babel from 'rollup-plugin-babel'; 2 | import cleanup from 'rollup-plugin-cleanup'; 3 | 4 | export default { 5 | entry: 'src/index.js', 6 | targets: [ 7 | { dest: 'dist/redux-api-call.cjs.js', format: 'cjs' }, 8 | { dest: 'dist/redux-api-call.es.js', format: 'es' }, 9 | ], 10 | plugins: [ 11 | babel({ 12 | babelrc: false, 13 | presets: ['stage-3', ['env', { modules: false, targets: { browsers: ['last 2 versions', 'IE >= 10'] } }]], 14 | plugins: ['transform-runtime'], 15 | runtimeHelpers: true, 16 | }), 17 | cleanup({ maxEmptyLines: 1 }), 18 | ], 19 | }; 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # nyc test coverage 18 | .nyc_output 19 | 20 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 21 | .grunt 22 | 23 | # node-waf configuration 24 | .lock-wscript 25 | 26 | # Compiled binary addons (http://nodejs.org/api/addons.html) 27 | build/Release 28 | 29 | # Dependency directories 30 | node_modules 31 | jspm_packages 32 | 33 | # Optional npm cache directory 34 | .npm 35 | 36 | # Optional REPL history 37 | .node_repl_history 38 | 39 | build 40 | dist 41 | -------------------------------------------------------------------------------- /.imdone/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "exclude": [ 3 | "^(node_modules|bower_components|\\.imdone|target|build|dist|logs)[\\/\\\\]?|\\.(git|svn|hg|npmignore)|\\~$|\\.(jpg|png|gif|swp|ttf|otf)$" 4 | ], 5 | "watcher": true, 6 | "keepEmptyPriority": false, 7 | "code": { 8 | "include_lists": [ 9 | "TODO", 10 | "DOING", 11 | "DONE", 12 | "PLANNING", 13 | "FIXME", 14 | "ARCHIVE", 15 | "HACK", 16 | "CHANGED", 17 | "XXX", 18 | "IDEA", 19 | "NOTE", 20 | "REVIEW" 21 | ] 22 | }, 23 | "lists": [ 24 | { 25 | "name": "TODO", 26 | "hidden": false 27 | } 28 | ], 29 | "marked": { 30 | "gfm": true, 31 | "tables": true, 32 | "breaks": false, 33 | "pedantic": false, 34 | "smartLists": true, 35 | "langPrefix": "language-" 36 | } 37 | } -------------------------------------------------------------------------------- /packages/adapter-fetch/src/index.js: -------------------------------------------------------------------------------- 1 | const throwOnNetworkError = async (endpoint, others) => { 2 | try { 3 | return await fetch(endpoint, others); 4 | } catch (error) { 5 | throw { 6 | error: true, 7 | payload: new Error(error.message), 8 | meta: {}, 9 | }; 10 | } 11 | }; 12 | 13 | export default next => async ({ endpoint, ...others }) => { 14 | const resp = await throwOnNetworkError(endpoint, others); 15 | 16 | const meta = {}; 17 | resp.headers.forEach((value, key) => (meta[key] = value)); 18 | 19 | if (!resp.ok) { 20 | const error = new Error('Bad Response'); 21 | error.statusCode = resp.status; 22 | error.payload = await resp.text(); 23 | error.meta = meta; 24 | throw error; 25 | } 26 | 27 | return next({ 28 | payload: await resp.text(), 29 | meta, 30 | }); 31 | }; 32 | -------------------------------------------------------------------------------- /packages/adapter-dedupe/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "redux-api-call-adapter-dedupe", 3 | "version": "1.1.1", 4 | "description": "redux-api-call (npm.im/redux-api-call) adapter to dedupe similar request\"", 5 | "main": "build/index.js", 6 | "repository": "tungv/redux-api-call", 7 | "author": "Tung Vu ", 8 | "license": "MIT", 9 | "babel": { 10 | "presets": [ 11 | "stage-3", 12 | "env" 13 | ], 14 | "plugins": [ 15 | "transform-runtime" 16 | ] 17 | }, 18 | "scripts": { 19 | "build": "babel ./src -d ./build", 20 | "build:clean": "rm -rf ./build", 21 | "prepublish": "npm run build" 22 | }, 23 | "devDependencies": { 24 | "babel-cli": "^6.24.1", 25 | "babel-plugin-transform-runtime": "^6.23.0", 26 | "babel-preset-env": "^1.4.0", 27 | "babel-preset-stage-3": "^6.24.1" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /packages/adapter-fetch/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "redux-api-call-adapter-fetch", 3 | "version": "1.1.1", 4 | "description": "redux-api-call (npm.im/redux-api-call) adapter to fetch data using HTML5 Fetch API", 5 | "main": "build/index.js", 6 | "repository": "tungv/redux-api-call", 7 | "author": "Tung Vu ", 8 | "license": "MIT", 9 | "babel": { 10 | "presets": [ 11 | "stage-3", 12 | "env" 13 | ], 14 | "plugins": [ 15 | "transform-runtime" 16 | ] 17 | }, 18 | "scripts": { 19 | "build": "babel ./src -d ./build", 20 | "build:clean": "rm -rf ./build", 21 | "prepublish": "npm run build" 22 | }, 23 | "devDependencies": { 24 | "babel-cli": "^6.24.1", 25 | "babel-plugin-transform-runtime": "^6.23.0", 26 | "babel-preset-env": "^1.4.0", 27 | "babel-preset-stage-3": "^6.24.1" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /packages/adapter-json/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "redux-api-call-adapter-json", 3 | "version": "1.1.1", 4 | "description": "redux-api-call (npm.im/redux-api-call) adapter to parse JSON response and fallback to raw text\"", 5 | "main": "build/index.js", 6 | "repository": "tungv/redux-api-call", 7 | "author": "Tung Vu ", 8 | "license": "MIT", 9 | "babel": { 10 | "presets": [ 11 | "stage-3", 12 | "env" 13 | ], 14 | "plugins": [ 15 | "transform-runtime" 16 | ] 17 | }, 18 | "scripts": { 19 | "build": "babel ./src -d ./build", 20 | "build:clean": "rm -rf ./build", 21 | "prepublish": "npm run build" 22 | }, 23 | "devDependencies": { 24 | "babel-cli": "^6.24.1", 25 | "babel-plugin-transform-runtime": "^6.23.0", 26 | "babel-preset-env": "^1.4.0", 27 | "babel-preset-stage-3": "^6.24.1" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /packages/core/src/actions.js: -------------------------------------------------------------------------------- 1 | import { 2 | ACTION_FETCH_START, 3 | ACTION_FETCH_COMPLETE, 4 | ACTION_FETCH_FAILURE, 5 | } from './constants'; 6 | 7 | export const makeStartErrorAction = payload => ({ 8 | type: ACTION_FETCH_START, 9 | error: true, 10 | payload, 11 | }); 12 | 13 | export const makeStartAction = api => ({ 14 | type: ACTION_FETCH_START, 15 | payload: { 16 | ...api, 17 | requestedAt: Date.now(), 18 | }, 19 | }); 20 | 21 | export const makeSuccessAction = (api, { payload, meta }) => ({ 22 | type: ACTION_FETCH_COMPLETE, 23 | payload: { 24 | ...api, 25 | json: payload, 26 | respondedAt: Date.now(), 27 | }, 28 | meta, 29 | }); 30 | 31 | export const makeFailureAction = (api, { payload, meta, statusCode }) => ({ 32 | type: ACTION_FETCH_FAILURE, 33 | payload: { 34 | ...api, 35 | json: payload, 36 | statusCode, 37 | respondedAt: Date.now(), 38 | }, 39 | meta, 40 | }); 41 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to this project will be documented in this file. 4 | See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. 5 | 6 | ## [1.1.1](https://github.com/tungv/redux-api-call/compare/v1.1.0...v1.1.1) (2019-07-23) 7 | 8 | **Note:** Version bump only for package redux-api-call 9 | 10 | 11 | 12 | 13 | 14 | 15 | ## [1.0.9](https://github.com/tungv/redux-api-call/compare/v1.0.8...v1.0.9) (2018-08-07) 16 | 17 | 18 | 19 | 20 | **Note:** Version bump only for package undefined 21 | 22 | 23 | ## [1.0.8](https://github.com/tungv/redux-api-call/compare/v1.0.7...v1.0.8) (2018-08-02) 24 | 25 | 26 | 27 | 28 | **Note:** Version bump only for package undefined 29 | 30 | 31 | ## [1.0.7](https://github.com/tungv/redux-api-call/compare/v1.0.6...v1.0.7) (2018-08-02) 32 | 33 | 34 | 35 | 36 | **Note:** Version bump only for package undefined 37 | -------------------------------------------------------------------------------- /packages/adapter-json/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to this project will be documented in this file. 4 | See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. 5 | 6 | ## [1.1.1](https://github.com/tungv/redux-api-call/compare/v1.1.0...v1.1.1) (2019-07-23) 7 | 8 | **Note:** Version bump only for package redux-api-call-adapter-json 9 | 10 | 11 | 12 | 13 | 14 | # Change Log 15 | 16 | All notable changes to this project will be documented in this file. 17 | See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. 18 | 19 | 20 | # 1.0.0 (2017-07-09) 21 | 22 | 23 | 24 | 25 | # 1.0.0-13 (2017-05-28) 26 | 27 | 28 | 29 | 30 | # 1.0.0-11 (2017-05-02) 31 | 32 | 33 | 34 | 35 | # 1.0.0-10 (2017-05-02) 36 | 37 | 38 | 39 | 40 | # 1.0.0-9 (2017-05-02) 41 | 42 | 43 | 44 | 45 | # 1.0.0-0 (2017-04-30) 46 | -------------------------------------------------------------------------------- /packages/adapter-dedupe/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to this project will be documented in this file. 4 | See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. 5 | 6 | ## [1.1.1](https://github.com/tungv/redux-api-call/compare/v1.1.0...v1.1.1) (2019-07-23) 7 | 8 | **Note:** Version bump only for package redux-api-call-adapter-dedupe 9 | 10 | 11 | 12 | 13 | 14 | # Change Log 15 | 16 | All notable changes to this project will be documented in this file. 17 | See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. 18 | 19 | 20 | # 1.0.0 (2017-07-09) 21 | 22 | 23 | 24 | 25 | # 1.0.0-17 (2017-07-08) 26 | 27 | 28 | ### Features 29 | 30 | * dedupe request using adapter ([d8175fc](https://github.com/tungv/redux-api-call/commit/d8175fc)) 31 | 32 | 33 | 34 | 35 | 36 | # 1.0.0-17 (2017-07-08) 37 | 38 | 39 | ### Features 40 | 41 | * dedupe request using adapter ([d8175fc](https://github.com/tungv/redux-api-call/commit/d8175fc)) 42 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Tung Vu 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /packages/core/src/index.js: -------------------------------------------------------------------------------- 1 | import middleware, { createAPIMiddleware } from "./middleware"; 2 | import makeFetchAction from "./makeFetchAction"; 3 | import composeAdapters from "./composeAdapters"; 4 | import fetch from "redux-api-call-adapter-fetch"; 5 | import json from "redux-api-call-adapter-json"; 6 | import dedupe from "redux-api-call-adapter-dedupe"; 7 | 8 | import { 9 | REDUCER_PATH, 10 | ACTION_FETCH_START, 11 | ACTION_FETCH_COMPLETE, 12 | ACTION_FETCH_FAILURE, 13 | ACTION_UPDATE_LOCAL, 14 | ACTION_RESET_LOCAL, 15 | ACTION_DISPOSE, 16 | } from "./constants"; 17 | import reducer from "./reducer"; 18 | 19 | const reducers = { [REDUCER_PATH]: reducer }; 20 | const ACTIONS = { 21 | START: ACTION_FETCH_START, 22 | COMPLETE: ACTION_FETCH_COMPLETE, 23 | FAILURE: ACTION_FETCH_FAILURE, 24 | UPDATE_LOCAL: ACTION_UPDATE_LOCAL, 25 | RESET_LOCAL: ACTION_RESET_LOCAL, 26 | DISPOSE: ACTION_DISPOSE, 27 | }; 28 | 29 | export const defaultTransformers = [dedupe, json, fetch]; 30 | 31 | export { 32 | middleware, 33 | makeFetchAction, 34 | reducers, 35 | ACTIONS, 36 | composeAdapters, 37 | createAPIMiddleware, 38 | }; 39 | -------------------------------------------------------------------------------- /packages/core/src/__tests__/createAPIMiddleware.spec.js: -------------------------------------------------------------------------------- 1 | import { ACTION_FETCH_START } from '../constants'; 2 | import { createAPIMiddleware } from '../middleware'; 3 | 4 | describe('createAPIMiddleware()', () => { 5 | it('should take an adapter and return a middleware', () => { 6 | const result = {}; 7 | const fetcher = jest.fn(async () => result); 8 | const adapter = jest.fn(getState => fetcher); 9 | 10 | const middleware = createAPIMiddleware(adapter); 11 | const store = { 12 | getState: jest.fn(), 13 | dispatch: jest.fn() 14 | }; 15 | 16 | const next = jest.fn(); 17 | const api = { 18 | name: 'TEST', 19 | endpoint: 'test', 20 | requestedAt: 1478329954380 21 | }; 22 | const action = { 23 | type: ACTION_FETCH_START, 24 | payload: api 25 | } 26 | 27 | middleware(store)(next)(action); 28 | 29 | expect(adapter).toBeCalledWith(store.getState); 30 | expect(fetcher).toBeCalledWith(api); 31 | expect(store.dispatch).not.toBeCalled(); 32 | 33 | const firstAction = next.mock.calls[0][0]; 34 | 35 | expect(firstAction.type).toBe('@@api/FETCH_START'); 36 | }); 37 | }); 38 | -------------------------------------------------------------------------------- /packages/core/src/utils/__tests__/handleActions.spec.js: -------------------------------------------------------------------------------- 1 | import handleActions from '../handleActions' 2 | 3 | describe('handleActions()', () => { 4 | it('should call the correct action', () => { 5 | const handlers = { 6 | ACTION1: jest.fn(), 7 | ACTION2: jest.fn(), 8 | }; 9 | 10 | const reducer = handleActions(handlers); 11 | const action = { type: 'ACTION1', payload: 'test' }; 12 | reducer({}, action); 13 | expect(handlers.ACTION1).toHaveBeenCalledWith({}, action); 14 | expect(handlers.ACTION2).not.toHaveBeenCalled(); 15 | }); 16 | 17 | it('should ignore non-function handler', () => { 18 | const handlers = { 19 | ACTION1: {}, 20 | }; 21 | 22 | const reducer = handleActions(handlers); 23 | const action = { type: 'ACTION1', payload: 'test' }; 24 | const state = {}; 25 | expect(reducer(state, action)).toBe(state); 26 | }); 27 | 28 | it('should set default state ', () => { 29 | const handlers = { 30 | ACTION1: jest.fn(), 31 | }; 32 | 33 | const reducer = handleActions(handlers); 34 | const action = { type: 'ACTION1', payload: 'test' }; 35 | reducer(undefined, action) 36 | expect(handlers.ACTION1).toHaveBeenCalledWith({}, action); 37 | }); 38 | }) 39 | -------------------------------------------------------------------------------- /packages/core/src/makeFetchAction.js: -------------------------------------------------------------------------------- 1 | import { 2 | ACTION_FETCH_START, 3 | ACTION_RESET_LOCAL, 4 | ACTION_UPDATE_LOCAL, 5 | ACTION_DISPOSE, 6 | REDUCER_PATH, 7 | } from './constants'; 8 | import get from './utils/get'; 9 | 10 | const normalizeResetData = (data = [ 11 | 'lastRequest', 12 | 'isFetching', 13 | 'isInvalidated', 14 | 'lastResponse', 15 | 'data', 16 | 'error', 17 | ]) => { 18 | if (typeof data === 'string') { 19 | return [data]; 20 | } 21 | if (!Array.isArray(data)) { 22 | throw new Error('You are using resetter wrong, the params should be string, array or undefined'); 23 | } 24 | return data; 25 | } 26 | 27 | export default (apiName, apiConfigFn, selectorDescriptor = {}) => { 28 | const actionCreator = (...params) => ({ 29 | type: ACTION_FETCH_START, 30 | payload: { 31 | ...apiConfigFn(...params), 32 | name: apiName, 33 | requestedAt: Date.now(), 34 | }, 35 | }); 36 | 37 | const updater = data => ({ 38 | type: ACTION_UPDATE_LOCAL, 39 | payload: { 40 | name: apiName, 41 | data, 42 | }, 43 | }); 44 | 45 | const resetter = data => ({ 46 | type: ACTION_RESET_LOCAL, 47 | payload: { 48 | name: apiName, 49 | data: normalizeResetData(data) 50 | }, 51 | }); 52 | 53 | const disposer = () => ({ 54 | type: ACTION_DISPOSE, 55 | payload: { name: apiName } 56 | }) 57 | 58 | const isFetchingSelector = get([REDUCER_PATH, apiName, 'isFetching'], false); 59 | const isInvalidatedSelector = get([REDUCER_PATH, apiName, 'isInvalidated'], false); 60 | const dataSelector = get([REDUCER_PATH, apiName, 'data'], null); 61 | const headersSelector = get([REDUCER_PATH, apiName, 'headers'], null); 62 | const errorSelector = get([REDUCER_PATH, apiName, 'error'], null); 63 | const lastResponseSelector = get([REDUCER_PATH, apiName, 'lastResponse'], null); 64 | 65 | return { 66 | actionCreator, 67 | updater, 68 | isFetchingSelector, 69 | isInvalidatedSelector, 70 | dataSelector, 71 | headersSelector, 72 | errorSelector, 73 | lastResponseSelector, 74 | resetter, 75 | disposer 76 | }; 77 | }; 78 | -------------------------------------------------------------------------------- /packages/core/src/middleware.js: -------------------------------------------------------------------------------- 1 | import dedupe from 'redux-api-call-adapter-dedupe'; 2 | import fetch from 'redux-api-call-adapter-fetch'; 3 | import parseJSON from 'redux-api-call-adapter-json'; 4 | 5 | import { ACTION_FETCH_START } from './constants'; 6 | import { 7 | makeFailureAction, 8 | makeStartErrorAction, 9 | makeSuccessAction, 10 | } from './actions'; 11 | import applyFunctions from './utils/applyFunctions'; 12 | import composeAdapters from './composeAdapters.js'; 13 | 14 | const defaultAdapter = composeAdapters(parseJSON, dedupe, fetch); 15 | 16 | function validate(request) { 17 | if (typeof request.name !== 'string') { 18 | return makeStartErrorAction({ 19 | ...request, 20 | error: 'no api name is specified', 21 | }); 22 | } 23 | if (typeof request.endpoint !== 'string') { 24 | return makeStartErrorAction({ 25 | ...request, 26 | error: 'no api endpoint is specified', 27 | }); 28 | } 29 | return false; 30 | } 31 | 32 | async function tryRequest(request, adapter) { 33 | try { 34 | const response = await adapter(request); 35 | return makeSuccessAction(request, response); 36 | } catch (failure) { 37 | return makeFailureAction(request, failure); 38 | } 39 | } 40 | 41 | export function createAPIMiddleware(adapter) { 42 | return ({ dispatch, getState }) => { 43 | const finalAdapter = adapter(getState); 44 | const resolveState = applyFunctions(getState); 45 | 46 | return next => async action => { 47 | let request; 48 | if (action.type === ACTION_FETCH_START) { 49 | request = resolveState(action.payload); 50 | 51 | const errorAction = validate(request); 52 | if (errorAction) { 53 | next(errorAction); 54 | return; 55 | } 56 | } 57 | 58 | if (request) { 59 | next({ ...action, payload: request }); 60 | } else { 61 | next(action); 62 | } 63 | 64 | if (action.type !== ACTION_FETCH_START) return; 65 | 66 | dispatch(await tryRequest(request, finalAdapter)); 67 | }; 68 | }; 69 | } 70 | 71 | // middleware 72 | export default createAPIMiddleware(defaultAdapter); 73 | -------------------------------------------------------------------------------- /packages/core/src/__tests__/composeAdapters.spec.js: -------------------------------------------------------------------------------- 1 | import composeAdapters from '../composeAdapters' 2 | 3 | describe('composeAdatpers()', () => { 4 | it('should throw error if no adapter is passed', () => { 5 | expect(() => { 6 | composeAdapters() 7 | }).toThrow(/least one adapter/) 8 | }); 9 | 10 | it('should work with one adapter', () => { 11 | const expectedFetcher = jest.fn(); 12 | const adapter = jest.fn(next => expectedFetcher); 13 | 14 | const composed = composeAdapters(adapter); 15 | 16 | const getState = jest.fn(); 17 | const fetcher = composed(getState); 18 | 19 | expect(fetcher).toBe(expectedFetcher); 20 | }); 21 | 22 | it('should throw if called without adapters', () => { 23 | expect( 24 | () => composeAdapters() 25 | ).toThrow() 26 | }); 27 | 28 | it('should work with multiple adapters', async () => { 29 | const expectedFetcher = jest.fn(() => ({ 30 | data: 42, 31 | headers: {} 32 | })); 33 | 34 | const adapter1 = jest.fn(next => async (req) => { 35 | const transformed = { ...req, key: 'value' }; 36 | const resp = await next(transformed); 37 | return { 38 | data: resp.data + 1, 39 | headers: { 'x-header': 42 } 40 | } 41 | }); 42 | 43 | const adapter2 = jest.fn(next => expectedFetcher); 44 | 45 | const composed = composeAdapters(adapter1, adapter2); 46 | 47 | const getState = jest.fn(); 48 | const fetcher = composed(getState); 49 | const originalRequest = { iamauthentic: true }; 50 | 51 | const result = await fetcher(originalRequest); 52 | 53 | expect(expectedFetcher).toBeCalledWith({ iamauthentic: true, key: 'value' }) 54 | expect(result).toEqual({ 55 | data: 43, 56 | headers: { 'x-header': 42 } 57 | }) 58 | }); 59 | 60 | it('should work when next is called in last adapter', async () => { 61 | const adapter = jest.fn(next => (req) => next(req)); 62 | 63 | const composed = composeAdapters(adapter); 64 | 65 | const getState = jest.fn(); 66 | const fetcher = composed(getState); 67 | const resp = await fetcher({ a: 1 }); 68 | expect(resp).toEqual({ a: 1 }); 69 | }); 70 | }); 71 | -------------------------------------------------------------------------------- /packages/adapter-fetch/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to this project will be documented in this file. 4 | See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. 5 | 6 | ## [1.1.1](https://github.com/tungv/redux-api-call/compare/v1.1.0...v1.1.1) (2019-07-23) 7 | 8 | **Note:** Version bump only for package redux-api-call-adapter-fetch 9 | 10 | 11 | 12 | 13 | 14 | # Change Log 15 | 16 | All notable changes to this project will be documented in this file. 17 | See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. 18 | 19 | 20 | # 1.0.0 (2017-07-09) 21 | 22 | 23 | 24 | 25 | # 1.0.0-17 (2017-07-08) 26 | 27 | 28 | 29 | 30 | # 1.0.0-16 (2017-06-21) 31 | 32 | 33 | 34 | 35 | # 1.0.0-14 (2017-06-19) 36 | 37 | 38 | ### Features 39 | 40 | * add fetch headers to actions ([97c3c9e](https://github.com/tungv/redux-api-call/commit/97c3c9e)) 41 | 42 | 43 | 44 | 45 | # 1.0.0-13 (2017-05-28) 46 | 47 | 48 | 49 | 50 | # 1.0.0-11 (2017-05-02) 51 | 52 | 53 | 54 | 55 | # 1.0.0-10 (2017-05-02) 56 | 57 | 58 | 59 | 60 | # 1.0.0-9 (2017-05-02) 61 | 62 | 63 | 64 | 65 | # 1.0.0-0 (2017-04-30) 66 | 67 | 68 | 69 | 70 | 71 | # 1.0.0-17 (2017-07-08) 72 | 73 | 74 | 75 | 76 | # 1.0.0-16 (2017-06-21) 77 | 78 | 79 | 80 | 81 | # 1.0.0-14 (2017-06-19) 82 | 83 | 84 | ### Features 85 | 86 | * add fetch headers to actions ([97c3c9e](https://github.com/tungv/redux-api-call/commit/97c3c9e)) 87 | 88 | 89 | 90 | 91 | # 1.0.0-13 (2017-05-28) 92 | 93 | 94 | 95 | 96 | # 1.0.0-11 (2017-05-02) 97 | 98 | 99 | 100 | 101 | # 1.0.0-10 (2017-05-02) 102 | 103 | 104 | 105 | 106 | # 1.0.0-9 (2017-05-02) 107 | 108 | 109 | 110 | 111 | # 1.0.0-0 (2017-04-30) 112 | -------------------------------------------------------------------------------- /packages/core/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "redux-api-call", 3 | "version": "1.2.1", 4 | "license": "MIT", 5 | "description": "Redux utilities for making API calls", 6 | "repository": "https://github.com/tungv/redux-api-call.git", 7 | "scripts": { 8 | "prepublish": "npm run build", 9 | "postpublish": "npm run build:clean", 10 | "build:clean": "rm -rf dist || true", 11 | "prebuild": "npm run build:clean", 12 | "build": "rollup -c", 13 | "test": "jest --coverage --forceExit", 14 | "test:watch": "jest --watchAll" 15 | }, 16 | "jest": { 17 | "testRegex": "(/__tests__/.*|\\.(test|spec))\\.(js)$", 18 | "setupFiles": [ 19 | "isomorphic-fetch/fetch-npm-node.js" 20 | ], 21 | "testPathIgnorePatterns": [ 22 | "/node_modules/", 23 | "vendor", 24 | ".build" 25 | ], 26 | "moduleFileExtensions": [ 27 | "js", 28 | "json", 29 | "node" 30 | ], 31 | "moduleNameMapper": { 32 | "^.+\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "identity-obj-proxy", 33 | "^.+\\.(scss|css|less)(\\?\\w*)?$": "identity-obj-proxy" 34 | }, 35 | "coveragePathIgnorePatterns": [ 36 | "/node_modules/", 37 | "__mocks__", 38 | "__tests__" 39 | ] 40 | }, 41 | "files": [ 42 | "dist" 43 | ], 44 | "main": "dist/redux-api-call.cjs.js", 45 | "module": "dist/redux-api-call.es.js", 46 | "devDependencies": { 47 | "babel-core": "^6.14.0", 48 | "babel-jest": "^20.0.0", 49 | "babel-plugin-external-helpers": "^6.8.0", 50 | "babel-plugin-transform-function-bind": "^6.8.0", 51 | "babel-plugin-transform-object-assign": "^6.8.0", 52 | "babel-plugin-transform-object-rest-spread": "^6.8.0", 53 | "babel-plugin-transform-runtime": "^6.15.0", 54 | "babel-polyfill": "^6.16.0", 55 | "babel-preset-env": "^1.6.0", 56 | "babel-preset-es2015": "^6.14.0", 57 | "babel-preset-es2015-rollup": "^1.2.0", 58 | "babel-preset-es2016": "^6.11.3", 59 | "babel-preset-stage-1": "^6.13.0", 60 | "babel-runtime": "^6.23.0", 61 | "chai": "^3.5.0", 62 | "fetch-mock": "^5.5.0", 63 | "isomorphic-fetch": "^2.2.1", 64 | "jest-cli": "^20.0.1", 65 | "lodash": "^4.16.1", 66 | "redux": "^3.6.0", 67 | "redux-mock-store": "^1.2.0", 68 | "rollup": "^0.45.2", 69 | "rollup-plugin-alias": "^1.2.0", 70 | "rollup-plugin-babel": "^2.6.1", 71 | "rollup-plugin-buble": "^0.14.0", 72 | "rollup-plugin-cleanup": "^0.1.4", 73 | "rollup-plugin-multi-entry": "^2.0.1", 74 | "rollup-plugin-strip": "^1.1.1", 75 | "rollup-plugin-stub": "^1.1.0", 76 | "rollup-plugin-uglify": "^1.0.1", 77 | "rxjs": "^5.4.2", 78 | "sinon": "^1.17.6", 79 | "source-map-support": "^0.4.2", 80 | "timekeeper": "^0.1.1" 81 | }, 82 | "dependencies": { 83 | "redux-api-call-adapter-dedupe": "^1.1.1", 84 | "redux-api-call-adapter-fetch": "^1.1.1", 85 | "redux-api-call-adapter-json": "^1.1.1" 86 | }, 87 | "peerDependencies": { 88 | "redux": "^3.6.0 || ^4.0.0" 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /packages/core/src/reducer.js: -------------------------------------------------------------------------------- 1 | import { 2 | ACTION_FETCH_START, 3 | ACTION_FETCH_COMPLETE, 4 | ACTION_FETCH_FAILURE, 5 | ACTION_UPDATE_LOCAL, 6 | ACTION_RESET_LOCAL, 7 | ACTION_DISPOSE, 8 | } from './constants'; 9 | import handleActions from './utils/handleActions'; 10 | 11 | const getName = action => action.payload.name; 12 | const getRequestedAt = action => action.payload.requestedAt; 13 | const getRespondedAt = action => action.payload.respondedAt; 14 | const getJSONResponse = action => action.payload.json; 15 | const getError = action => action.payload.error; 16 | const getPreviousError = (state, action) => state[getName(action)] ? state[getName(action)].error : null; 17 | 18 | const includeString = (element, array) => array.indexOf(element) !== -1; 19 | const resetOrKeepValue = (field, action, currentData) => ( 20 | includeString(field, action.payload.data) ? undefined : currentData[field] 21 | ); 22 | 23 | 24 | const updateWith = (state, name, obj) => ({ 25 | ...state, 26 | [name]: { 27 | ...state[name], 28 | ...obj, 29 | }, 30 | }); 31 | 32 | const reducer = handleActions({ 33 | [ACTION_FETCH_START]: (state, action) => updateWith( 34 | state, 35 | getName(action), { 36 | lastRequest: getRequestedAt(action), 37 | isFetching: !action.error, 38 | isInvalidated: true, 39 | error: action.error ? getError(action) : getPreviousError(state, action), 40 | }), 41 | [ACTION_FETCH_COMPLETE]: (state, action) => updateWith( 42 | state, 43 | getName(action), { 44 | isFetching: false, 45 | isInvalidated: false, 46 | lastResponse: getRespondedAt(action), 47 | data: getJSONResponse(action), 48 | error: null, 49 | headers: action.meta, 50 | }), 51 | [ACTION_FETCH_FAILURE]: (state, action) => updateWith( 52 | state, 53 | getName(action), { 54 | isFetching: false, 55 | isInvalidated: true, 56 | error: getJSONResponse(action), 57 | headers: action.meta, 58 | }), 59 | [ACTION_UPDATE_LOCAL]: (state, action) => updateWith( 60 | state, 61 | getName(action), { 62 | data: action.payload.data, 63 | }), 64 | [ACTION_RESET_LOCAL]: (state, action) => { 65 | const name = getName(action); 66 | const currentData = state[name] || {}; 67 | return updateWith( 68 | state, 69 | name, 70 | { 71 | lastRequest: resetOrKeepValue('lastRequest', action, currentData), 72 | isFetching: resetOrKeepValue('isFetching', action, currentData), 73 | isInvalidated: resetOrKeepValue('isInvalidated', action, currentData), 74 | lastResponse: resetOrKeepValue('lastResponse', action, currentData), 75 | data: resetOrKeepValue('data', action, currentData), 76 | error: resetOrKeepValue('error', action, currentData), 77 | headers: resetOrKeepValue('headers', action, currentData), 78 | } 79 | ); 80 | }, 81 | [ACTION_DISPOSE]: (state, action) => { 82 | const apiName = getName(action); 83 | if (state.hasOwnProperty(apiName)) { 84 | const {[apiName]: disposed, ...newState} = state; 85 | return newState; 86 | } 87 | return state; 88 | } 89 | }); 90 | 91 | export default reducer; 92 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![npm](https://img.shields.io/npm/dm/redux-api-call.svg)](https://npm.im/redux-api-call) [![codebeat badge](https://codebeat.co/badges/a3c54dda-3816-4763-9041-32fff411c4a8)](https://codebeat.co/projects/github-com-tungv-redux-api-call-master) 2 | 3 | # redux-api-call 4 | 5 | Redux utilities for API calls using fetch with automatic race-conditions elimination. 6 | 7 | ``` 8 | npm i -S redux-api-call 9 | ``` 10 | 11 | [**Detailed API Reference**](https://github.com/tungv/redux-api-call/wiki/API-Reference) 12 | 13 | [**Migration from v0 to v1**](https://github.com/tungv/redux-api-call/wiki/Migration-to-V1) 14 | 15 | # The goals 16 | 17 | One declarative API to create reducers, action creators and selectors for JSON any API calls 18 | 19 | # Examples 20 | 21 | ```js 22 | // EXAMPLE 1 23 | // this will create data selector and action creator for your components to use 24 | const todoListAPI = makeFetchAction( 25 | 'TODO_LIST', 26 | (params) => ({ endpoint: `/api/v1/todos?page=${params.page}&limit=${params.limit}` }) 27 | ); 28 | 29 | // trigger fetch action 30 | store.dispatch(todoListAPI.actionCreator({ page: 1, limit: 10 })); 31 | 32 | // get the data 33 | const todos = todoListAPI.dataSelector(store.getState()); 34 | 35 | // you can also use destructuring syntax for better readability 36 | const { actionCreator: fetchTodos, dataSelector: todosSelector } = makeFetchAction(/* ... */); 37 | 38 | // EXAMPLE 2 39 | // race-condition elimination: 40 | // if those commands are called in sequence 41 | // no matter how long each request takes, 42 | // page 2 and page 3 data will not have a chance to override page 4 data. 43 | store.dispatch(fetchTodos({ page: 2 }); 44 | store.dispatch(fetchTodos({ page: 3 }); 45 | store.dispatch(fetchTodos({ page: 4 }); 46 | ``` 47 | 48 | # Get Started 49 | 50 | Steps: 51 | 52 | 1. install 53 | 2. add reducer 54 | 3. add middleware 55 | 4. declare api definitions 56 | 57 | First, you need to install the redux-api-call using npm or yarn 58 | 59 | ```bash 60 | npm i -S redux-api-call 61 | 62 | // OR 63 | yarn add redux-api-call 64 | ``` 65 | 66 | Secondly, you need to add a reducer to your root reducer with a pathname is `api_calls` (In next releases, this name should be configurable, but for now, just use it) 67 | 68 | ```js 69 | // rootReducer.js 70 | import { combineReducers } from 'redux'; 71 | import { reducers as apiReducers } from 'redux-api-call'; 72 | 73 | const rootReducer = combineReducers({ 74 | ...apiReducers, 75 | }); 76 | ``` 77 | 78 | Then please import middleware from redux-api-call and put it to your redux middleware stack 79 | 80 | ```js 81 | // configStore.js 82 | import { createStore, applyMiddleware } from 'redux'; 83 | import { middleware as apiMiddleware } from 'redux-api-call'; 84 | 85 | const middlewares = applyMiddleware( 86 | apiMiddleware 87 | // ... other middlewares (thunk, promise, etc.) 88 | ); 89 | const store = createStore(rootReducer, {}, middlewares); 90 | ``` 91 | 92 | Most importantly, define your API. The simplest form only requires an endpoint 93 | 94 | ```js 95 | // state.js 96 | import { makeFetchAction } from 'redux-api-call' 97 | import { createSelector } from 'reselect' 98 | import { flow, get, filter } from 'lodash/fp' 99 | 100 | export const todoAPI = makeFetchAction('FETCH_TODOS', () => ({ endpoint: '/api/v1/todos' }); 101 | 102 | export const todosSelector = flow(todoAPI.dataSelector, get('todos')); 103 | export const completeTodosSelector = createSelector(todosSelector, filter(todo => todo.complete)); 104 | export const incompleteTodosSelector = createSelector(todosSelector, filter(todo => !todo.complete)); 105 | ``` 106 | 107 | And that's it. Now you have a bunch of action creators and selectors. You can use them anywhere you want. 108 | The following code is an example of using redux-api-call and react-redux 109 | 110 | ```js 111 | // example usage with react 112 | // component.jsx 113 | import react from 'react'; 114 | import { connect } from 'react-redux'; 115 | import { todoAPI } from './state'; 116 | 117 | // destructuring for better readability 118 | const { 119 | fetchTodos, 120 | isFetchingSelector, 121 | completeTodosSelector, 122 | incompleteTodosSelector, 123 | errorSelector, 124 | lastResponseSelector, 125 | } = todoAPI; 126 | 127 | const connectToRedux = connect( 128 | state => ({ 129 | loading: isFetchingSelector(state), 130 | error: errorSelector(state), 131 | completeTodos: completeTodosSelector(state), 132 | incompleteTodos: incompleteTodosSelector(state), 133 | lastResponse: lastResponseSelector(state), 134 | }), 135 | { 136 | fetchTodos, 137 | } 138 | ); 139 | 140 | class TodosComponent extends React.Component { 141 | componentDidMount() { 142 | // first fetch 143 | this.props.fetchTodos(); 144 | } 145 | 146 | render() { 147 | const { loading, error, completeTodos, incompleteTodos } = this.props; 148 | 149 | return
{/* ... your markup ...*/}
; 150 | } 151 | } 152 | 153 | export default connectToRedux(TodosComponent); 154 | ``` 155 | 156 | # API 157 | 158 | [**Detailed API Reference**](https://github.com/tungv/redux-api-call/wiki/API-Reference) 159 | 160 | # FAQ 161 | 162 | **1. Can I use this without react?** 163 | 164 | **Yes**, wherever you can use redux, you can use redux-api-call 165 | 166 | **2. Can I use this with jQuery's $.ajax?** 167 | 168 | **Yes**, `redux-api-call` comes with a default adapter that fetch data using HTML5 FetchAPI and try to parse the response as JSON text. If the response is not a valid JSON, it will fall back to raw text. 169 | Advanced topics like [Customer Adapters](https://github.com/tungv/redux-api-call/wiki/Custom-Adapter) will show you how to use virtually any kind of request agent, include raw XHR to `axios`. 170 | 171 | **3. My backend send XML instead of JSON, can I use this package?** 172 | 173 | **Yes**, advanced topics like [Customer Adapters](https://github.com/tungv/redux-api-call/wiki/Custom-Adapter) will show you how to add custom parser to your response. So your backend can send JSON, XML, or any custom content-type of your choice. 174 | 175 | **4. I need to add a header for authentication on every request, can I write it once and use it everywhere?** 176 | 177 | **Yes**, advanced topics like [Customer Adapters](https://github.com/tungv/redux-api-call/wiki/Custom-Adapter) will show you how to add any kind of interceptors to your outgoing request. You can even access to redux store anytime you want to receive data before sending to your backend. 178 | -------------------------------------------------------------------------------- /packages/core/README.md: -------------------------------------------------------------------------------- 1 | [![npm](https://img.shields.io/npm/dm/redux-api-call.svg)](https://npm.im/redux-api-call) [![codebeat badge](https://codebeat.co/badges/a3c54dda-3816-4763-9041-32fff411c4a8)](https://codebeat.co/projects/github-com-tungv-redux-api-call-master) 2 | 3 | # redux-api-call 4 | 5 | Redux utilities for API calls using fetch with automatic race-conditions elimination. 6 | 7 | ``` 8 | npm i -S redux-api-call 9 | ``` 10 | 11 | [**Detailed API Reference**](https://github.com/tungv/redux-api-call/wiki/API-Reference) 12 | 13 | [**Migration from v0 to v1**](https://github.com/tungv/redux-api-call/wiki/Migration-to-V1) 14 | 15 | # The goals 16 | 17 | One declarative API to create reducers, action creators and selectors for JSON any API calls 18 | 19 | # Examples 20 | 21 | ```js 22 | // EXAMPLE 1 23 | // this will create data selector and action creator for your components to use 24 | const todoListAPI = makeFetchAction( 25 | 'TODO_LIST', 26 | (params) => ({ endpoint: `/api/v1/todos?page=${params.page}&limit=${params.limit}` }) 27 | ); 28 | 29 | // trigger fetch action 30 | store.dispatch(todoListAPI.actionCreator({ page: 1, limit: 10 })); 31 | 32 | // get the data 33 | const todos = todoListAPI.dataSelector(store.getState()); 34 | 35 | // you can also use destructuring syntax for better readability 36 | const { actionCreator: fetchTodos, dataSelector: todosSelector } = makeFetchAction(/* ... */); 37 | 38 | // EXAMPLE 2 39 | // race-condition elimination: 40 | // if those commands are called in sequence 41 | // no matter how long each request takes, 42 | // page 2 and page 3 data will not have a chance to override page 4 data. 43 | store.dispatch(fetchTodos({ page: 2 }); 44 | store.dispatch(fetchTodos({ page: 3 }); 45 | store.dispatch(fetchTodos({ page: 4 }); 46 | ``` 47 | 48 | # Get Started 49 | 50 | Steps: 51 | 52 | 1. install 53 | 2. add reducer 54 | 3. add middleware 55 | 4. declare api definitions 56 | 57 | First, you need to install the redux-api-call using npm or yarn 58 | 59 | ```bash 60 | npm i -S redux-api-call 61 | 62 | // OR 63 | yarn add redux-api-call 64 | ``` 65 | 66 | Secondly, you need to add a reducer to your root reducer with a pathname is `api_calls` (In next releases, this name should be configurable, but for now, just use it) 67 | 68 | ```js 69 | // rootReducer.js 70 | import { combineReducers } from 'redux'; 71 | import { reducers as apiReducers } from 'redux-api-call'; 72 | 73 | const rootReducer = combineReducers({ 74 | ...apiReducers, 75 | }); 76 | ``` 77 | 78 | Then please import middleware from redux-api-call and put it to your redux middleware stack 79 | 80 | ```js 81 | // configStore.js 82 | import { createStore, applyMiddleware } from 'redux'; 83 | import { middleware as apiMiddleware } from 'redux-api-call'; 84 | 85 | const middlewares = applyMiddleware( 86 | apiMiddleware 87 | // ... other middlewares (thunk, promise, etc.) 88 | ); 89 | const store = createStore(rootReducer, {}, middlewares); 90 | ``` 91 | 92 | Most importantly, define your API. The simplest form only requires an endpoint 93 | 94 | ```js 95 | // state.js 96 | import { makeFetchAction } from 'redux-api-call' 97 | import { createSelector } from 'reselect' 98 | import { flow, get, filter } from 'lodash/fp' 99 | 100 | export const todoAPI = makeFetchAction('FETCH_TODOS', () => ({ endpoint: '/api/v1/todos' }); 101 | 102 | export const todosSelector = flow(todoAPI.dataSelector, get('todos')); 103 | export const completeTodosSelector = createSelector(todosSelector, filter(todo => todo.complete)); 104 | export const incompleteTodosSelector = createSelector(todosSelector, filter(todo => !todo.complete)); 105 | ``` 106 | 107 | And that's it. Now you have a bunch of action creators and selectors. You can use them anywhere you want. 108 | The following code is an example of using redux-api-call and react-redux 109 | 110 | ```js 111 | // example usage with react 112 | // component.jsx 113 | import react from 'react'; 114 | import { connect } from 'react-redux'; 115 | import { todoAPI } from './state'; 116 | 117 | // destructuring for better readability 118 | const { 119 | fetchTodos, 120 | isFetchingSelector, 121 | completeTodosSelector, 122 | incompleteTodosSelector, 123 | errorSelector, 124 | lastResponseSelector, 125 | } = todoAPI; 126 | 127 | const connectToRedux = connect( 128 | state => ({ 129 | loading: isFetchingSelector(state), 130 | error: errorSelector(state), 131 | completeTodos: completeTodosSelector(state), 132 | incompleteTodos: incompleteTodosSelector(state), 133 | lastResponse: lastResponseSelector(state), 134 | }), 135 | { 136 | fetchTodos, 137 | } 138 | ); 139 | 140 | class TodosComponent extends React.Component { 141 | componentDidMount() { 142 | // first fetch 143 | this.props.fetchTodos(); 144 | } 145 | 146 | render() { 147 | const { loading, error, completeTodos, incompleteTodos } = this.props; 148 | 149 | return
{/* ... your markup ...*/}
; 150 | } 151 | } 152 | 153 | export default connectToRedux(TodosComponent); 154 | ``` 155 | 156 | # API 157 | 158 | [**Detailed API Reference**](https://github.com/tungv/redux-api-call/wiki/API-Reference) 159 | 160 | # FAQ 161 | 162 | **1. Can I use this without react?** 163 | 164 | **Yes**, wherever you can use redux, you can use redux-api-call 165 | 166 | **2. Can I use this with jQuery's $.ajax?** 167 | 168 | **Yes**, `redux-api-call` comes with a default adapter that fetch data using HTML5 FetchAPI and try to parse the response as JSON text. If the response is not a valid JSON, it will fall back to raw text. 169 | Advanced topics like [Customer Adapters](https://github.com/tungv/redux-api-call/wiki/Custom-Adapter) will show you how to use virtually any kind of request agent, include raw XHR to `axios`. 170 | 171 | **3. My backend send XML instead of JSON, can I use this package?** 172 | 173 | **Yes**, advanced topics like [Customer Adapters](https://github.com/tungv/redux-api-call/wiki/Custom-Adapter) will show you how to add custom parser to your response. So your backend can send JSON, XML, or any custom content-type of your choice. 174 | 175 | **4. I need to add a header for authentication on every request, can I write it once and use it everywhere?** 176 | 177 | **Yes**, advanced topics like [Customer Adapters](https://github.com/tungv/redux-api-call/wiki/Custom-Adapter) will show you how to add any kind of interceptors to your outgoing request. You can even access to redux store anytime you want to receive data before sending to your backend. 178 | -------------------------------------------------------------------------------- /packages/core/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to this project will be documented in this file. 4 | See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. 5 | 6 | ## [1.1.1](https://github.com/tungv/redux-api-call/compare/v1.1.0...v1.1.1) (2019-07-23) 7 | 8 | **Note:** Version bump only for package redux-api-call 9 | 10 | 11 | 12 | 13 | 14 | 15 | ## [1.0.9](https://github.com/tungv/redux-api-call/compare/v1.0.8...v1.0.9) (2018-08-07) 16 | 17 | 18 | 19 | 20 | **Note:** Version bump only for package redux-api-call 21 | 22 | 23 | ## [1.0.8](https://github.com/tungv/redux-api-call/compare/v1.0.7...v1.0.8) (2018-08-02) 24 | 25 | 26 | 27 | 28 | **Note:** Version bump only for package redux-api-call 29 | 30 | 31 | ## [1.0.7](https://github.com/tungv/redux-api-call/compare/v1.0.6...v1.0.7) (2018-08-02) 32 | 33 | 34 | 35 | 36 | **Note:** Version bump only for package redux-api-call 37 | 38 | 39 | ## 1.0.1 (2017-07-10) 40 | 41 | 42 | ### Bug Fixes 43 | 44 | * **core:** expose dedupe as one of the defaultTransformers ([698f681](https://github.com/tungv/redux-api-call/commit/698f681)) 45 | 46 | 47 | 48 | 49 | # 1.0.0 (2017-07-09) 50 | 51 | 52 | ### Bug Fixes 53 | 54 | * **core:** improve code coverage, code quality ([4b504ed](https://github.com/tungv/redux-api-call/commit/4b504ed)) 55 | * **core:** throw error when resetter is called with non-array or non-string ([fac2dc2](https://github.com/tungv/redux-api-call/commit/fac2dc2)) 56 | 57 | 58 | 59 | 60 | # 1.0.0-17 (2017-07-08) 61 | 62 | 63 | ### Features 64 | 65 | * dedupe request using adapter ([d8175fc](https://github.com/tungv/redux-api-call/commit/d8175fc)) 66 | 67 | 68 | 69 | 70 | # 1.0.0-16 (2017-06-21) 71 | 72 | 73 | 74 | 75 | # 1.0.0-15 (2017-06-19) 76 | 77 | 78 | ### Features 79 | 80 | * expose headersSelector ([ea56f68](https://github.com/tungv/redux-api-call/commit/ea56f68)) 81 | 82 | 83 | 84 | 85 | # 1.0.0-14 (2017-06-19) 86 | 87 | 88 | ### Features 89 | 90 | * add fetch headers to actions ([97c3c9e](https://github.com/tungv/redux-api-call/commit/97c3c9e)) 91 | * add headers to reducers ([fbb1583](https://github.com/tungv/redux-api-call/commit/fbb1583)) 92 | 93 | 94 | 95 | 96 | # 1.0.0-13 (2017-05-28) 97 | 98 | 99 | 100 | 101 | # 1.0.0-12 (2017-05-05) 102 | 103 | 104 | ### Bug Fixes 105 | 106 | * export createAPIMiddleware from root ([c178042](https://github.com/tungv/redux-api-call/commit/c178042)) 107 | 108 | 109 | 110 | 111 | # 1.0.0-11 (2017-05-02) 112 | 113 | 114 | 115 | 116 | # 1.0.0-10 (2017-05-02) 117 | 118 | 119 | 120 | 121 | # 1.0.0-9 (2017-05-02) 122 | 123 | 124 | ### Features 125 | 126 | * exports defaultTransformers ([7ac742a](https://github.com/tungv/redux-api-call/commit/7ac742a)) 127 | 128 | 129 | 130 | 131 | # 1.0.0-0 (2017-04-30) 132 | 133 | 134 | ### Features 135 | 136 | * BREAKING CHANGE in import { middleware } from 'redux-api-call' ([7eb5676](https://github.com/tungv/redux-api-call/commit/7eb5676)) 137 | 138 | 139 | 140 | 141 | 142 | # 1.0.0 (2017-07-09) 143 | 144 | 145 | ### Bug Fixes 146 | 147 | * **core:** improve code coverage, code quality ([4b504ed](https://github.com/tungv/redux-api-call/commit/4b504ed)) 148 | * **core:** throw error when resetter is called with non-array or non-string ([fac2dc2](https://github.com/tungv/redux-api-call/commit/fac2dc2)) 149 | 150 | 151 | 152 | 153 | # 1.0.0-17 (2017-07-08) 154 | 155 | 156 | ### Features 157 | 158 | * dedupe request using adapter ([d8175fc](https://github.com/tungv/redux-api-call/commit/d8175fc)) 159 | 160 | 161 | 162 | 163 | # 1.0.0-16 (2017-06-21) 164 | 165 | 166 | 167 | 168 | # 1.0.0-15 (2017-06-19) 169 | 170 | 171 | ### Features 172 | 173 | * expose headersSelector ([ea56f68](https://github.com/tungv/redux-api-call/commit/ea56f68)) 174 | 175 | 176 | 177 | 178 | # 1.0.0-14 (2017-06-19) 179 | 180 | 181 | ### Features 182 | 183 | * add fetch headers to actions ([97c3c9e](https://github.com/tungv/redux-api-call/commit/97c3c9e)) 184 | * add headers to reducers ([fbb1583](https://github.com/tungv/redux-api-call/commit/fbb1583)) 185 | 186 | 187 | 188 | 189 | # 1.0.0-13 (2017-05-28) 190 | 191 | 192 | 193 | 194 | # 1.0.0-12 (2017-05-05) 195 | 196 | 197 | ### Bug Fixes 198 | 199 | * export createAPIMiddleware from root ([c178042](https://github.com/tungv/redux-api-call/commit/c178042)) 200 | 201 | 202 | 203 | 204 | # 1.0.0-11 (2017-05-02) 205 | 206 | 207 | 208 | 209 | # 1.0.0-10 (2017-05-02) 210 | 211 | 212 | 213 | 214 | # 1.0.0-9 (2017-05-02) 215 | 216 | 217 | ### Features 218 | 219 | * exports defaultTransformers ([7ac742a](https://github.com/tungv/redux-api-call/commit/7ac742a)) 220 | 221 | 222 | 223 | 224 | # 1.0.0-0 (2017-04-30) 225 | 226 | 227 | ### Features 228 | 229 | * BREAKING CHANGE in import { middleware } from 'redux-api-call' ([7eb5676](https://github.com/tungv/redux-api-call/commit/7eb5676)) 230 | 231 | 232 | 233 | 234 | 235 | # 1.0.0-17 (2017-07-08) 236 | 237 | 238 | ### Features 239 | 240 | * dedupe request using adapter ([d8175fc](https://github.com/tungv/redux-api-call/commit/d8175fc)) 241 | 242 | 243 | 244 | 245 | # 1.0.0-16 (2017-06-21) 246 | 247 | 248 | 249 | 250 | # 1.0.0-15 (2017-06-19) 251 | 252 | 253 | ### Features 254 | 255 | * expose headersSelector ([ea56f68](https://github.com/tungv/redux-api-call/commit/ea56f68)) 256 | 257 | 258 | 259 | 260 | # 1.0.0-14 (2017-06-19) 261 | 262 | 263 | ### Features 264 | 265 | * add fetch headers to actions ([97c3c9e](https://github.com/tungv/redux-api-call/commit/97c3c9e)) 266 | * add headers to reducers ([fbb1583](https://github.com/tungv/redux-api-call/commit/fbb1583)) 267 | 268 | 269 | 270 | 271 | # 1.0.0-13 (2017-05-28) 272 | 273 | 274 | 275 | 276 | # 1.0.0-12 (2017-05-05) 277 | 278 | 279 | ### Bug Fixes 280 | 281 | * export createAPIMiddleware from root ([c178042](https://github.com/tungv/redux-api-call/commit/c178042)) 282 | 283 | 284 | 285 | 286 | # 1.0.0-11 (2017-05-02) 287 | 288 | 289 | 290 | 291 | # 1.0.0-10 (2017-05-02) 292 | 293 | 294 | 295 | 296 | # 1.0.0-9 (2017-05-02) 297 | 298 | 299 | ### Features 300 | 301 | * exports defaultTransformers ([7ac742a](https://github.com/tungv/redux-api-call/commit/7ac742a)) 302 | 303 | 304 | 305 | 306 | # 1.0.0-0 (2017-04-30) 307 | 308 | 309 | ### Features 310 | 311 | * BREAKING CHANGE in import { middleware } from 'redux-api-call' ([7eb5676](https://github.com/tungv/redux-api-call/commit/7eb5676)) 312 | -------------------------------------------------------------------------------- /packages/core/src/__tests__/makeFetchAction.spec.js: -------------------------------------------------------------------------------- 1 | import { constant } from 'lodash'; 2 | import timekeeper from 'timekeeper'; 3 | 4 | import { ACTION_FETCH_START } from '../constants'; 5 | import makeFetchAction from '../makeFetchAction'; 6 | 7 | const NOW = 1478329954380; 8 | 9 | describe('makeFetchAction', () => { 10 | describe('no custom selectors', () => { 11 | let actual; 12 | let configFn; 13 | 14 | beforeAll(() => { 15 | timekeeper.freeze(NOW); 16 | }); 17 | 18 | beforeAll(() => { 19 | configFn = jest.fn(constant({ endpoint: 'http://example.com' })); 20 | actual = makeFetchAction('SAMPLE', configFn); 21 | }); 22 | 23 | it('should return actionCreator function', () => { 24 | expect(actual.actionCreator).toBeInstanceOf(Function); 25 | }); 26 | 27 | it('should return isFetchingSelector function', () => { 28 | expect(actual.isFetchingSelector).toBeInstanceOf(Function); 29 | }); 30 | 31 | it('should return dataSelector function', () => { 32 | expect(actual.dataSelector).toBeInstanceOf(Function); 33 | }); 34 | 35 | it('should return errorSelector function', () => { 36 | expect(actual.errorSelector).toBeInstanceOf(Function); 37 | }); 38 | 39 | it('should return lastResponseSelector function', () => { 40 | expect(actual.lastResponseSelector).toBeInstanceOf(Function); 41 | }); 42 | 43 | it('should return isInvalidatedSelector function', () => { 44 | expect(actual.isInvalidatedSelector).toBeInstanceOf(Function); 45 | }); 46 | 47 | describe('actionCreator', () => { 48 | it('should call configFn with all parameters', () => { 49 | const params = [1, 2, 3]; 50 | const action = actual.actionCreator(...params); 51 | expect(configFn).toBeCalledWith(...params); 52 | expect(action).toEqual({ 53 | type: ACTION_FETCH_START, 54 | payload: { 55 | name: 'SAMPLE', 56 | endpoint: 'http://example.com', 57 | requestedAt: 1478329954380, 58 | }, 59 | }); 60 | }); 61 | }); 62 | 63 | describe('updater', () => { 64 | it('should call configFn with all parameters', () => { 65 | const params = [1, 2, 3]; 66 | const action = actual.updater(...params); 67 | expect(action).toEqual({ 68 | type: '@@api/UPDATE_LOCAL', 69 | payload: { name: 'SAMPLE', data: 1 }, 70 | }); 71 | }); 72 | }); 73 | 74 | describe('resetter', () => { 75 | it('should return array of all field if no param', () => { 76 | const resetter = actual.resetter; 77 | const actualValue = resetter(); 78 | const expectedValue = { 79 | type: '@@api/RESET_LOCAL', 80 | payload: { 81 | name: 'SAMPLE', 82 | data: [ 83 | 'lastRequest', 84 | 'isFetching', 85 | 'isInvalidated', 86 | 'lastResponse', 87 | 'data', 88 | 'error', 89 | ], 90 | }, 91 | }; 92 | expect(actualValue).toEqual(expectedValue); 93 | }); 94 | 95 | it('should return array of 1 string if param is string', () => { 96 | const resetter = actual.resetter; 97 | const actualValue = resetter('lastResponse'); 98 | const expectedValue = { 99 | type: '@@api/RESET_LOCAL', 100 | payload: { 101 | name: 'SAMPLE', 102 | data: ['lastResponse'], 103 | }, 104 | }; 105 | expect(actualValue).toEqual(expectedValue); 106 | }); 107 | 108 | it('should throw if resetter is called with non-string or non-array value', () => { 109 | const resetter = actual.resetter; 110 | expect(() => resetter(1)).toThrow(); 111 | }); 112 | 113 | it('should return array of multiple fields if param is array', () => { 114 | const resetter = actual.resetter; 115 | const actualValue = resetter(['lastResponse', 'error']); 116 | const expectedValue = { 117 | type: '@@api/RESET_LOCAL', 118 | payload: { 119 | name: 'SAMPLE', 120 | data: ['lastResponse', 'error'], 121 | }, 122 | }; 123 | expect(actualValue).toEqual(expectedValue); 124 | }); 125 | }); 126 | 127 | describe('disposer', () => { 128 | it('should return dispose action of correct apiName', () => { 129 | const action = actual.disposer(); 130 | expect(action).toEqual({ 131 | type: '@@api/DISPOSE', 132 | payload: { name: 'SAMPLE' }, 133 | }); 134 | }); 135 | }); 136 | 137 | describe('selectors', () => { 138 | describe('isFetchingSelector', () => { 139 | it('should return isFetching in state if present', () => { 140 | expect( 141 | actual.isFetchingSelector({ 142 | api_calls: { 143 | SAMPLE: { 144 | isFetching: true, 145 | }, 146 | }, 147 | }) 148 | ).toBe(true); 149 | 150 | expect( 151 | actual.isFetchingSelector({ 152 | api_calls: { 153 | SAMPLE: { 154 | isFetching: false, 155 | }, 156 | }, 157 | }) 158 | ).toBe(false); 159 | }); 160 | 161 | it('should return false if api was not called', () => { 162 | expect(actual.isFetchingSelector({})).toBe(false); 163 | }); 164 | }); 165 | 166 | describe('isInvalidatedSelector', () => { 167 | it('should return isInvalidated in state if present', () => { 168 | expect( 169 | actual.isInvalidatedSelector({ 170 | api_calls: { 171 | SAMPLE: { 172 | isInvalidated: true, 173 | }, 174 | }, 175 | }) 176 | ).toBe(true); 177 | 178 | expect( 179 | actual.isInvalidatedSelector({ 180 | api_calls: { 181 | SAMPLE: { 182 | isInvalidated: false, 183 | }, 184 | }, 185 | }) 186 | ).toBe(false); 187 | }); 188 | 189 | it('should return false if api was not called', () => { 190 | expect(actual.isInvalidatedSelector({})).toBe(false); 191 | }); 192 | }); 193 | 194 | describe('dataSelector', () => { 195 | it('should return data in state if present', () => { 196 | const data = { key: 'value' }; 197 | expect( 198 | actual.dataSelector({ 199 | api_calls: { 200 | SAMPLE: { 201 | data, 202 | }, 203 | }, 204 | }) 205 | ).toBe(data); 206 | }); 207 | 208 | it('should return null if api was not called', () => { 209 | expect(actual.dataSelector({})).toBe(null); 210 | }); 211 | }); 212 | 213 | describe('errorSelector', () => { 214 | it('should return error in state if present', () => { 215 | const error = { error: 'value' }; 216 | expect( 217 | actual.errorSelector({ 218 | api_calls: { 219 | SAMPLE: { 220 | error, 221 | }, 222 | }, 223 | }) 224 | ).toBe(error); 225 | }); 226 | 227 | it('should return null if api was not called', () => { 228 | expect(actual.errorSelector({})).toBe(null); 229 | }); 230 | }); 231 | 232 | describe('lastResponseSelector', () => { 233 | it('should return lastResponse in state if present', () => { 234 | const lastResponse = 12345; 235 | expect( 236 | actual.lastResponseSelector({ 237 | api_calls: { 238 | SAMPLE: { 239 | lastResponse: 12345, 240 | }, 241 | }, 242 | }) 243 | ).toBe(lastResponse); 244 | }); 245 | 246 | it('should return null if api was not called', () => { 247 | expect(actual.lastResponseSelector({})).toBe(null); 248 | }); 249 | }); 250 | }); 251 | }); 252 | }); 253 | -------------------------------------------------------------------------------- /packages/core/src/__tests__/reducer.spec.js: -------------------------------------------------------------------------------- 1 | import timekeeper from 'timekeeper'; 2 | import { get } from 'lodash'; 3 | import { expect } from 'chai'; 4 | import { 5 | makeStartAction, 6 | makeStartErrorAction, 7 | makeSuccessAction, 8 | makeFailureAction, 9 | } from '../actions'; 10 | import reducer from '../reducer'; 11 | 12 | describe('reducer', () => { 13 | beforeAll(() => { 14 | timekeeper.freeze(Date.now()); 15 | }); 16 | 17 | afterAll(() => { 18 | timekeeper.reset(); 19 | }); 20 | 21 | describe('FETCH_START handler without `error` property', () => { 22 | const state = { 23 | SAMPLE: { 24 | data: { 25 | key: 'old_value' 26 | }, 27 | error: { 28 | message: 'some error has occurred' 29 | } 30 | } 31 | }; 32 | 33 | const setup = () => { 34 | const api = { 35 | name: 'SAMPLE', 36 | endpoint: 'http://example.com' 37 | }; 38 | return reducer(state, makeStartAction(api)); 39 | }; 40 | 41 | it('should set isFetching to true', () => { 42 | expect(get(setup(), 'SAMPLE.isFetching')).to.equal(true); 43 | }); 44 | 45 | it('should set isInvalidated to true', () => { 46 | expect(get(setup(), 'SAMPLE.isInvalidated')).to.equal(true); 47 | }); 48 | 49 | it('should set lastRequest to the requestedAt time', () => { 50 | expect(get(setup(), 'SAMPLE.lastRequest')).to.equal(Date.now()); 51 | }); 52 | 53 | it('should keep previous data as is (referential transparent)', () => { 54 | expect(get(setup(), 'SAMPLE.data')).to.equal(state.SAMPLE.data); 55 | }); 56 | 57 | it('should keep previous data as is (referential transparent)', () => { 58 | expect(get(setup(), 'SAMPLE.error')).to.equal(state.SAMPLE.error); 59 | }); 60 | }); 61 | 62 | describe('FETCH_START handler with `error` property true', () => { 63 | const time = Date.now(); 64 | const state = { 65 | SAMPLE: { 66 | data: { 67 | key: 'old_value' 68 | }, 69 | error: { 70 | message: 'some error has occurred' 71 | } 72 | } 73 | }; 74 | 75 | const setup = () => { 76 | const api = { 77 | name: 'SAMPLE', 78 | endpoint: 'http://example.com', 79 | requestedAt: time, 80 | }; 81 | const error = { message: 'some new error' } 82 | return reducer(state, makeStartErrorAction({ ...api, error })); 83 | }; 84 | 85 | it('should set isFetching to false', () => { 86 | expect(get(setup(), 'SAMPLE.isFetching')).to.equal(false); 87 | }); 88 | 89 | it('should set isInvalidated to true', () => { 90 | expect(get(setup(), 'SAMPLE.isInvalidated')).to.equal(true); 91 | }); 92 | 93 | it('should set lastRequest to requestedAt time', () => { 94 | expect(get(setup(), 'SAMPLE.lastRequest')).to.equal(time); 95 | }); 96 | 97 | it('should keep previous data as is (referential transparent)', () => { 98 | expect(get(setup(), 'SAMPLE.data')).to.equal(state.SAMPLE.data); 99 | }); 100 | 101 | it('should set error to new error', () => { 102 | expect(get(setup(), 'SAMPLE.error')).to.deep.equal({ message: 'some new error' }); 103 | }); 104 | }); 105 | 106 | describe('FETCH_COMPLETE handler', () => { 107 | const state = { 108 | SAMPLE: { 109 | data: { 110 | key: 'old_value' 111 | }, 112 | error: { 113 | message: 'some error has occurred' 114 | } 115 | } 116 | }; 117 | 118 | const setup = () => { 119 | const api = { 120 | name: 'SAMPLE', 121 | endpoint: 'http://example.com', 122 | }; 123 | const resp = { 124 | payload: { key: 'new_value' }, 125 | meta: { header: 'value' }, 126 | } 127 | return reducer(state, makeSuccessAction(api, resp)); 128 | }; 129 | 130 | it('should set isFetching to false', () => { 131 | expect(get(setup(), 'SAMPLE.isFetching')).to.equal(false); 132 | }); 133 | 134 | it('should set isInvalidated to false', () => { 135 | expect(get(setup(), 'SAMPLE.isInvalidated')).to.equal(false); 136 | }); 137 | 138 | it('should set lastResponse = respondedAt', () => { 139 | expect(get(setup(), 'SAMPLE.lastResponse')).to.equal(Date.now()); 140 | }); 141 | 142 | it('should set data to new data', () => { 143 | expect(get(setup(), 'SAMPLE.data')).to.deep.equal({ key: 'new_value' }); 144 | }); 145 | 146 | it('should set error to null', () => { 147 | expect(get(setup(), 'SAMPLE.error')).to.equal(null); 148 | }); 149 | 150 | it('should set headers to new value', () => { 151 | expect(get(setup(), 'SAMPLE.headers')).to.deep.equal({ header: 'value' }); 152 | }); 153 | }); 154 | 155 | describe('FETCH_FAIL handler', () => { 156 | const state = { 157 | SAMPLE: { 158 | data: { 159 | key: 'old_value' 160 | }, 161 | lastResponse: 1474877514131, 162 | error: { 163 | message: 'some error has occurred' 164 | } 165 | } 166 | }; 167 | 168 | const setup = () => { 169 | const api = { 170 | name: 'SAMPLE', 171 | endpoint: 'http://example.com', 172 | }; 173 | const resp = { 174 | payload: { error: 'new error' }, 175 | meta: { header: 'new header' }, 176 | }; 177 | return reducer(state, makeFailureAction(api, resp)); 178 | }; 179 | 180 | it('should set isFetching to false', () => { 181 | expect(get(setup(), 'SAMPLE.isFetching')).to.equal(false); 182 | }); 183 | 184 | it('should set isInvalidated to false', () => { 185 | expect(get(setup(), 'SAMPLE.isInvalidated')).to.equal(true); 186 | }); 187 | 188 | it('should keep old lastResponse', () => { 189 | expect(get(setup(), 'SAMPLE.lastResponse')).to.equal(1474877514131); 190 | }); 191 | 192 | it('should keep old data', () => { 193 | expect(get(setup(), 'SAMPLE.data')).to.equal(state.SAMPLE.data); 194 | }); 195 | 196 | it('should set error to null', () => { 197 | expect(get(setup(), 'SAMPLE.error')).to.deep.equal({ error: 'new error' }); 198 | }); 199 | 200 | it('should set error to null', () => { 201 | expect(get(setup(), 'SAMPLE.headers')).to.deep.equal({ header: 'new header' }); 202 | }); 203 | }); 204 | 205 | describe('UPDATE_LOCAL handler', () => { 206 | const state = { 207 | SAMPLE: { 208 | data: { 209 | key: 'old_value' 210 | }, 211 | } 212 | }; 213 | 214 | const setup = () => { 215 | const api = { 216 | name: 'SAMPLE', 217 | endpoint: 'http://example.com', 218 | }; 219 | const json = { error: 'new error' }; 220 | return reducer(state, { type: '@@api/UPDATE_LOCAL', payload: { name: 'SAMPLE', data: { key: 'new_value' } } }); 221 | }; 222 | 223 | it('should update local', () => { 224 | expect(get(setup(), 'SAMPLE.data.key')).to.equal('new_value'); 225 | }); 226 | }); 227 | 228 | describe('ACTION_RESET_LOCAL handler', () => { 229 | const state = { 230 | SAMPLE: { 231 | lastResponse: 'lastResponse', 232 | lastRequest: 'lastRequest', 233 | isInvalidated: 'isInvalidated', 234 | isFetching: 'isFetching', 235 | error: 'error', 236 | data: { 237 | key: 'old_value' 238 | }, 239 | } 240 | }; 241 | 242 | const setup = (data) => { 243 | const api = { 244 | name: 'SAMPLE', 245 | endpoint: 'http://example.com', 246 | }; 247 | const json = { error: 'new error' }; 248 | return reducer(state, { type: '@@api/RESET_LOCAL', payload: { name: 'SAMPLE', data: data } }); 249 | }; 250 | 251 | it('should update local with array of fields', () => { 252 | const actual = setup(['lastResponse']); 253 | const expected = { 254 | SAMPLE: { 255 | ...state.SAMPLE, 256 | lastResponse: undefined, 257 | } 258 | }; 259 | 260 | expect(actual).to.deep.equal(expected); 261 | }); 262 | 263 | it('should update local with array of 2 fields', () => { 264 | const actual = setup(['lastResponse', 'error']); 265 | const expected = { 266 | SAMPLE: { 267 | ...state.SAMPLE, 268 | lastResponse: undefined, 269 | error: undefined, 270 | } 271 | }; 272 | expect(actual).to.deep.equal(expected); 273 | }); 274 | 275 | it('should update local with array of 2 fields and 1 invalid field', () => { 276 | const actual = setup(['lastResponse', 'error', 'invalid']); 277 | const expected = { 278 | SAMPLE: { 279 | ...state.SAMPLE, 280 | lastResponse: undefined, 281 | error: undefined, 282 | } 283 | }; 284 | expect(actual).to.deep.equal(expected); 285 | }); 286 | 287 | it('should update local with array of all fields', () => { 288 | const actual = setup( 289 | [ 290 | 'lastRequest', 291 | 'isFetching', 292 | 'isInvalidated', 293 | 'lastResponse', 294 | 'data', 295 | 'error', 296 | ] 297 | ); 298 | const expected = { 299 | SAMPLE: { 300 | lastRequest: undefined, 301 | isFetching: undefined, 302 | isInvalidated: undefined, 303 | lastResponse: undefined, 304 | data: undefined, 305 | error: undefined, 306 | }, 307 | }; 308 | expect(actual).to.deep.equal(expected); 309 | }); 310 | 311 | }); 312 | 313 | describe('ACTION_DISPOSE handler', () => { 314 | const state = { 315 | SAMPLE_1: { 316 | data: { 317 | key: 'value of sample 1' 318 | }, 319 | }, 320 | SAMPLE_2: { 321 | data: { 322 | key: 'value of sample 2' 323 | }, 324 | } 325 | }; 326 | 327 | const setup = (apiName) => reducer(state, { type: '@@api/DISPOSE', payload: { name: apiName } }); 328 | 329 | describe('there is data of the apiName in state', () => { 330 | it('should dispose of the data of the apiName', () => { 331 | expect(setup('SAMPLE_1')).to.deep.equal({ 332 | SAMPLE_2: { 333 | data: { 334 | key: 'value of sample 2' 335 | }, 336 | } 337 | }); 338 | }); 339 | }) 340 | 341 | describe('there is NO data of the apiName in state', () => { 342 | it('should return state', () => { 343 | expect(setup('SAMPLE_3')).to.equal(state); 344 | }); 345 | }) 346 | }); 347 | }); 348 | -------------------------------------------------------------------------------- /packages/core/src/__tests__/middleware.spec.js: -------------------------------------------------------------------------------- 1 | import configureStore from 'redux-mock-store'; 2 | import fetchMock from 'fetch-mock'; 3 | import timekeeper from 'timekeeper'; 4 | 5 | import { 6 | ACTION_FETCH_COMPLETE, 7 | ACTION_FETCH_FAILURE, 8 | ACTION_FETCH_START, 9 | } from '../constants'; 10 | import middleware from '../middleware'; 11 | 12 | const NOW = 1478329954380; 13 | 14 | jasmine.DEFAULT_TIMEOUT_INTERVAL = 300; 15 | 16 | describe('default middleware', () => { 17 | afterEach(() => { 18 | fetchMock.restore(); 19 | }); 20 | 21 | beforeAll(() => { 22 | timekeeper.freeze(NOW); 23 | }); 24 | 25 | afterAll(() => { 26 | timekeeper.reset(); 27 | }); 28 | 29 | const getStore = (initialState = {}) => { 30 | const mockStore = configureStore([middleware]); 31 | return mockStore(initialState); 32 | }; 33 | 34 | const takeActionsUntil = ({ subscribe, getActions }, count) => { 35 | return new Promise(resolve => { 36 | subscribe(() => { 37 | const actions = getActions(); 38 | if (actions.length === count) { 39 | resolve(actions); 40 | } 41 | }); 42 | }); 43 | }; 44 | 45 | describe('rejected fetch requests', () => { 46 | beforeEach(() => { 47 | fetchMock.mock('http://localhost:3000/api/test', { 48 | throws: new Error('timeout'), 49 | }); 50 | }); 51 | 52 | it('should dispatch FETCH_FAILURE', async () => { 53 | const store = getStore(); 54 | store.dispatch({ 55 | type: ACTION_FETCH_START, 56 | payload: { 57 | requestedAt: 1478329954380, 58 | name: 'TEST_API', 59 | endpoint: 'http://localhost:3000/api/test', 60 | }, 61 | }); 62 | 63 | const actions = await takeActionsUntil(store, 2); 64 | expect(actions[1].type).toEqual(ACTION_FETCH_FAILURE); 65 | }); 66 | }); 67 | 68 | describe('dispatching start action', () => { 69 | beforeEach(() => { 70 | fetchMock.mock('http://localhost:3000/api/test', { everything: 'ok' }); 71 | }); 72 | 73 | it('should dispatch FETCH_START action immediately', () => { 74 | const store = getStore(); 75 | store.dispatch({ 76 | type: ACTION_FETCH_START, 77 | payload: { 78 | requestedAt: 1478329954380, 79 | name: 'TEST_API', 80 | endpoint: 'http://localhost:3000/api/test', 81 | }, 82 | }); 83 | 84 | const actions = store.getActions(); 85 | expect(actions.length === 1); 86 | expect(actions[0]).toEqual({ 87 | type: ACTION_FETCH_START, 88 | payload: { 89 | requestedAt: 1478329954380, 90 | name: 'TEST_API', 91 | endpoint: 'http://localhost:3000/api/test', 92 | requestedAt: NOW, 93 | }, 94 | }); 95 | }); 96 | 97 | it('should dispatch FETCH_START with config resolved from selectors', () => { 98 | const store = getStore({ some: 'state' }); 99 | const endpointSelector = jest.fn(x => 'http://localhost:3000/api/test'); 100 | const headersSelector = jest.fn(x => ({ key: 'value' })); 101 | const bodySelector = jest.fn(x => 'somebody'); 102 | 103 | store.dispatch({ 104 | type: ACTION_FETCH_START, 105 | payload: { 106 | requestedAt: 1478329954380, 107 | name: 'TEST_API', 108 | endpoint: endpointSelector, 109 | headers: headersSelector, 110 | body: bodySelector, 111 | }, 112 | }); 113 | 114 | expect(endpointSelector).toBeCalledWith({ some: 'state' }); 115 | expect(headersSelector).toBeCalledWith({ some: 'state' }); 116 | expect(bodySelector).toBeCalledWith({ some: 'state' }); 117 | const [startAction] = store.getActions(); 118 | expect(startAction).toEqual({ 119 | type: ACTION_FETCH_START, 120 | payload: { 121 | requestedAt: 1478329954380, 122 | name: 'TEST_API', 123 | endpoint: 'http://localhost:3000/api/test', 124 | headers: { key: 'value' }, 125 | body: 'somebody', 126 | }, 127 | }); 128 | }); 129 | 130 | it('should dispatch FETCH_START with error=true when name is not a string', () => { 131 | const store = getStore(); 132 | store.dispatch({ 133 | type: ACTION_FETCH_START, 134 | payload: { 135 | requestedAt: 1478329954380, 136 | name: {}, 137 | endpoint: 'http://localhost:3000/api/test', 138 | }, 139 | }); 140 | 141 | expect(store.getActions()[0].error).toBeTruthy(); 142 | }); 143 | 144 | xit('should dispatch FETCH_START with error=true when name is an empty string', () => { 145 | const store = getStore(); 146 | store.dispatch({ 147 | type: ACTION_FETCH_START, 148 | payload: { 149 | requestedAt: 1478329954380, 150 | name: '', 151 | endpoint: 'http://localhost:3000/api/test', 152 | }, 153 | }); 154 | 155 | expect(store.getActions()[0].error).toBeTruthy(); 156 | }); 157 | 158 | it('should dispatch FETCH_START with error=true when endpoint is not a string or a function', () => { 159 | const store = getStore(); 160 | store.dispatch({ 161 | type: ACTION_FETCH_START, 162 | payload: { 163 | requestedAt: 1478329954380, 164 | name: 'TEST_API', 165 | endpoint: {}, 166 | }, 167 | }); 168 | 169 | expect(store.getActions()[0].error).toBeTruthy(); 170 | }); 171 | }); 172 | 173 | const delay = ms => new Promise(resolve => setTimeout(resolve, ms)); 174 | 175 | describe('multiple api calls', () => { 176 | it('should not drop pending request when there is a new one', async () => { 177 | const store = getStore(); 178 | 179 | fetchMock.mock( 180 | 'http://localhost:3000/api/test/1', 181 | delay(30).then(() => ({ body: { timer: '30' } })), 182 | ); 183 | fetchMock.mock( 184 | 'http://localhost:3000/api/test/2', 185 | delay(10).then(() => ({ body: { timer: '10' } })), 186 | ); 187 | 188 | store.dispatch({ 189 | type: ACTION_FETCH_START, 190 | payload: { 191 | requestedAt: 1478329954380, 192 | name: 'TEST_API_30', 193 | endpoint: 'http://localhost:3000/api/test/1', 194 | }, 195 | }); 196 | store.dispatch({ 197 | type: ACTION_FETCH_START, 198 | payload: { 199 | requestedAt: 1478329954380, 200 | name: 'TEST_API_10', 201 | endpoint: 'http://localhost:3000/api/test/2', 202 | }, 203 | }); 204 | 205 | const [start30, start10, complete10, complete30] = await takeActionsUntil( 206 | store, 207 | 4, 208 | ); 209 | 210 | expect(start30.type).toBe(ACTION_FETCH_START); 211 | expect(start10.type).toBe(ACTION_FETCH_START); 212 | 213 | expect(complete10.type).toBe(ACTION_FETCH_COMPLETE); 214 | expect(complete30.type).toBe(ACTION_FETCH_COMPLETE); 215 | 216 | expect(complete10.payload.json).toEqual({ timer: '10' }); 217 | expect(complete30.payload.json).toEqual({ timer: '30' }); 218 | }); 219 | 220 | it('should drop pending request when there is a new one', async () => { 221 | const store = getStore(); 222 | 223 | fetchMock.mock( 224 | 'http://localhost:3000/api/test/1', 225 | delay(30).then(() => ({ body: { timer: '30' } })), 226 | ); 227 | fetchMock.mock( 228 | 'http://localhost:3000/api/test/2', 229 | delay(10).then(() => ({ body: { timer: '10' } })), 230 | ); 231 | 232 | store.dispatch({ 233 | type: ACTION_FETCH_START, 234 | payload: { 235 | requestedAt: 1478329954380, 236 | name: 'TEST_API', 237 | endpoint: 'http://localhost:3000/api/test/1', 238 | }, 239 | }); 240 | store.dispatch({ 241 | type: ACTION_FETCH_START, 242 | payload: { 243 | requestedAt: 1478329954380, 244 | name: 'TEST_API', 245 | endpoint: 'http://localhost:3000/api/test/2', 246 | }, 247 | }); 248 | 249 | await delay(50); 250 | const actions = store.getActions(); 251 | expect(actions.length).toBe(3); 252 | const [start30, start10, complete10] = actions; 253 | 254 | expect(start30.type).toBe(ACTION_FETCH_START); 255 | expect(start10.type).toBe(ACTION_FETCH_START); 256 | expect(complete10.type).toBe(ACTION_FETCH_COMPLETE); 257 | expect(complete10.payload.json).toEqual({ timer: '10' }); 258 | }); 259 | }); 260 | 261 | describe('dispatching complete action', () => { 262 | it('should dispatch FETCH_COMPLETE with a json object', async () => { 263 | const store = getStore(); 264 | const mockSpy = jest.fn(); 265 | fetchMock.mock('http://localhost:3000/api/test', () => { 266 | mockSpy(); 267 | return { everything: 'ok' }; 268 | }); 269 | 270 | store.dispatch({ 271 | type: ACTION_FETCH_START, 272 | payload: { 273 | requestedAt: 1478329954380, 274 | name: 'TEST_API', 275 | endpoint: 'http://localhost:3000/api/test', 276 | }, 277 | }); 278 | 279 | const [_, complete] = await takeActionsUntil(store, 2); 280 | expect(mockSpy).toHaveBeenCalledTimes(1); 281 | 282 | expect(complete).toEqual({ 283 | type: ACTION_FETCH_COMPLETE, 284 | payload: { 285 | name: 'TEST_API', 286 | endpoint: 'http://localhost:3000/api/test', 287 | respondedAt: NOW, 288 | requestedAt: NOW, 289 | json: { 290 | everything: 'ok', 291 | }, 292 | }, 293 | meta: {}, 294 | }); 295 | }); 296 | 297 | it('should dispatch FETCH_COMPLETE with a text object', async () => { 298 | const store = getStore(); 299 | fetchMock.mock('http://localhost:3000/api/test', { body: 'string' }); 300 | 301 | store.dispatch({ 302 | type: ACTION_FETCH_START, 303 | payload: { 304 | requestedAt: 1478329954380, 305 | name: 'TEST_API', 306 | endpoint: 'http://localhost:3000/api/test', 307 | }, 308 | }); 309 | 310 | const [_, complete] = await takeActionsUntil(store, 2); 311 | 312 | expect(complete).toEqual({ 313 | type: ACTION_FETCH_COMPLETE, 314 | payload: { 315 | name: 'TEST_API', 316 | endpoint: 'http://localhost:3000/api/test', 317 | respondedAt: NOW, 318 | requestedAt: NOW, 319 | json: 'string', 320 | }, 321 | meta: {}, 322 | }); 323 | }); 324 | 325 | it('should dispatch FETCH_COMPLETE with a normalized meta object', async () => { 326 | const store = getStore(); 327 | fetchMock.mock('http://localhost:3000/api/test', { 328 | body: 'string', 329 | headers: { 'X-CHECKSUM': 'value' }, 330 | }); 331 | 332 | store.dispatch({ 333 | type: ACTION_FETCH_START, 334 | payload: { 335 | requestedAt: 1478329954380, 336 | name: 'TEST_API', 337 | endpoint: 'http://localhost:3000/api/test', 338 | }, 339 | }); 340 | 341 | const [_, complete] = await takeActionsUntil(store, 2); 342 | 343 | expect(complete).toEqual({ 344 | type: ACTION_FETCH_COMPLETE, 345 | payload: { 346 | name: 'TEST_API', 347 | endpoint: 'http://localhost:3000/api/test', 348 | respondedAt: NOW, 349 | requestedAt: NOW, 350 | json: 'string', 351 | }, 352 | meta: { 353 | 'x-checksum': 'value', 354 | }, 355 | }); 356 | }); 357 | }); 358 | 359 | describe('dispatching failure action', () => { 360 | it('should dispatch FETCH_FAILURE when fetch throw an error', async () => { 361 | const store = getStore(); 362 | fetchMock.mock('http://localhost:3000/api/test', { 363 | throws: new Error('fetch failed'), 364 | }); 365 | store.dispatch({ 366 | type: ACTION_FETCH_START, 367 | payload: { 368 | requestedAt: 1478329954380, 369 | name: 'ITS_NOT_MY_FAULT', 370 | endpoint: 'http://localhost:3000/api/test', 371 | }, 372 | }); 373 | const [_, failure] = await takeActionsUntil(store, 2); 374 | expect(failure).toEqual({ 375 | type: ACTION_FETCH_FAILURE, 376 | meta: {}, 377 | payload: { 378 | name: 'ITS_NOT_MY_FAULT', 379 | endpoint: 'http://localhost:3000/api/test', 380 | respondedAt: NOW, 381 | requestedAt: NOW, 382 | json: new Error('fetch failed'), 383 | }, 384 | }); 385 | }); 386 | 387 | it('should dispatch FETCH_FAILURE with a json object', async () => { 388 | const store = getStore(); 389 | fetchMock.mock('http://localhost:3000/api/test', { 390 | status: 404, 391 | body: { msg: 'ERRRRR!' }, 392 | }); 393 | store.dispatch({ 394 | type: ACTION_FETCH_START, 395 | payload: { 396 | requestedAt: 1478329954380, 397 | name: 'ITS_NOT_MY_FAULT', 398 | endpoint: 'http://localhost:3000/api/test', 399 | }, 400 | }); 401 | 402 | const [_, failure] = await takeActionsUntil(store, 2); 403 | expect(failure).toEqual({ 404 | type: ACTION_FETCH_FAILURE, 405 | payload: { 406 | name: 'ITS_NOT_MY_FAULT', 407 | endpoint: 'http://localhost:3000/api/test', 408 | respondedAt: NOW, 409 | requestedAt: NOW, 410 | json: { 411 | msg: 'ERRRRR!', 412 | }, 413 | statusCode: 404, 414 | }, 415 | meta: {}, 416 | }); 417 | }); 418 | 419 | it('should dispatch FETCH_FAILURE with a error object', async () => { 420 | const store = getStore(); 421 | fetchMock.mock('http://localhost:3000/api/test', { 422 | status: 404, 423 | body: 'just a message', 424 | }); 425 | store.dispatch({ 426 | type: ACTION_FETCH_START, 427 | payload: { 428 | requestedAt: 1478329954380, 429 | name: 'ITS_NOT_MY_FAULT', 430 | statusCode: 404, 431 | endpoint: 'http://localhost:3000/api/test', 432 | }, 433 | }); 434 | 435 | const [_, failure] = await takeActionsUntil(store, 2); 436 | expect(failure).toEqual({ 437 | type: ACTION_FETCH_FAILURE, 438 | meta: {}, 439 | payload: { 440 | name: 'ITS_NOT_MY_FAULT', 441 | endpoint: 'http://localhost:3000/api/test', 442 | respondedAt: NOW, 443 | requestedAt: NOW, 444 | statusCode: 404, 445 | json: 'just a message', 446 | }, 447 | }); 448 | }); 449 | 450 | it('should dispatch FETCH_FAILURE with a normalized meta object', async () => { 451 | const store = getStore(); 452 | fetchMock.mock('http://localhost:3000/api/test', { 453 | status: 404, 454 | body: 'just a message', 455 | headers: { 'X-SERVER': 'Express' }, 456 | }); 457 | store.dispatch({ 458 | type: ACTION_FETCH_START, 459 | payload: { 460 | requestedAt: 1478329954380, 461 | name: 'ITS_NOT_MY_FAULT', 462 | endpoint: 'http://localhost:3000/api/test', 463 | }, 464 | }); 465 | 466 | const [_, failure] = await takeActionsUntil(store, 2); 467 | expect(failure).toEqual({ 468 | type: ACTION_FETCH_FAILURE, 469 | payload: { 470 | name: 'ITS_NOT_MY_FAULT', 471 | endpoint: 'http://localhost:3000/api/test', 472 | respondedAt: NOW, 473 | requestedAt: NOW, 474 | statusCode: 404, 475 | json: 'just a message', 476 | }, 477 | meta: { 478 | 'x-server': 'Express', 479 | }, 480 | }); 481 | }); 482 | }); 483 | }); 484 | -------------------------------------------------------------------------------- /packages/adapter-dedupe/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | abbrev@1: 6 | version "1.1.0" 7 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" 8 | 9 | ajv@^4.9.1: 10 | version "4.11.8" 11 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" 12 | dependencies: 13 | co "^4.6.0" 14 | json-stable-stringify "^1.0.1" 15 | 16 | ansi-regex@^2.0.0: 17 | version "2.1.1" 18 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 19 | 20 | ansi-styles@^2.2.1: 21 | version "2.2.1" 22 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 23 | 24 | anymatch@^1.3.0: 25 | version "1.3.0" 26 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" 27 | dependencies: 28 | arrify "^1.0.0" 29 | micromatch "^2.1.5" 30 | 31 | aproba@^1.0.3: 32 | version "1.1.2" 33 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" 34 | 35 | are-we-there-yet@~1.1.2: 36 | version "1.1.4" 37 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" 38 | dependencies: 39 | delegates "^1.0.0" 40 | readable-stream "^2.0.6" 41 | 42 | arr-diff@^2.0.0: 43 | version "2.0.0" 44 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 45 | dependencies: 46 | arr-flatten "^1.0.1" 47 | 48 | arr-flatten@^1.0.1: 49 | version "1.1.0" 50 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 51 | 52 | array-unique@^0.2.1: 53 | version "0.2.1" 54 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 55 | 56 | arrify@^1.0.0: 57 | version "1.0.1" 58 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 59 | 60 | asn1@~0.2.3: 61 | version "0.2.3" 62 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 63 | 64 | assert-plus@1.0.0, assert-plus@^1.0.0: 65 | version "1.0.0" 66 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 67 | 68 | assert-plus@^0.2.0: 69 | version "0.2.0" 70 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" 71 | 72 | async-each@^1.0.0: 73 | version "1.0.1" 74 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" 75 | 76 | asynckit@^0.4.0: 77 | version "0.4.0" 78 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 79 | 80 | aws-sign2@~0.6.0: 81 | version "0.6.0" 82 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" 83 | 84 | aws4@^1.2.1: 85 | version "1.6.0" 86 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" 87 | 88 | babel-cli@^6.24.1: 89 | version "6.24.1" 90 | resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.24.1.tgz#207cd705bba61489b2ea41b5312341cf6aca2283" 91 | dependencies: 92 | babel-core "^6.24.1" 93 | babel-polyfill "^6.23.0" 94 | babel-register "^6.24.1" 95 | babel-runtime "^6.22.0" 96 | commander "^2.8.1" 97 | convert-source-map "^1.1.0" 98 | fs-readdir-recursive "^1.0.0" 99 | glob "^7.0.0" 100 | lodash "^4.2.0" 101 | output-file-sync "^1.1.0" 102 | path-is-absolute "^1.0.0" 103 | slash "^1.0.0" 104 | source-map "^0.5.0" 105 | v8flags "^2.0.10" 106 | optionalDependencies: 107 | chokidar "^1.6.1" 108 | 109 | babel-code-frame@^6.22.0: 110 | version "6.22.0" 111 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" 112 | dependencies: 113 | chalk "^1.1.0" 114 | esutils "^2.0.2" 115 | js-tokens "^3.0.0" 116 | 117 | babel-core@^6.24.1: 118 | version "6.25.0" 119 | resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.25.0.tgz#7dd42b0463c742e9d5296deb3ec67a9322dad729" 120 | dependencies: 121 | babel-code-frame "^6.22.0" 122 | babel-generator "^6.25.0" 123 | babel-helpers "^6.24.1" 124 | babel-messages "^6.23.0" 125 | babel-register "^6.24.1" 126 | babel-runtime "^6.22.0" 127 | babel-template "^6.25.0" 128 | babel-traverse "^6.25.0" 129 | babel-types "^6.25.0" 130 | babylon "^6.17.2" 131 | convert-source-map "^1.1.0" 132 | debug "^2.1.1" 133 | json5 "^0.5.0" 134 | lodash "^4.2.0" 135 | minimatch "^3.0.2" 136 | path-is-absolute "^1.0.0" 137 | private "^0.1.6" 138 | slash "^1.0.0" 139 | source-map "^0.5.0" 140 | 141 | babel-generator@^6.25.0: 142 | version "6.25.0" 143 | resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc" 144 | dependencies: 145 | babel-messages "^6.23.0" 146 | babel-runtime "^6.22.0" 147 | babel-types "^6.25.0" 148 | detect-indent "^4.0.0" 149 | jsesc "^1.3.0" 150 | lodash "^4.2.0" 151 | source-map "^0.5.0" 152 | trim-right "^1.0.1" 153 | 154 | babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: 155 | version "6.24.1" 156 | resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" 157 | dependencies: 158 | babel-helper-explode-assignable-expression "^6.24.1" 159 | babel-runtime "^6.22.0" 160 | babel-types "^6.24.1" 161 | 162 | babel-helper-call-delegate@^6.24.1: 163 | version "6.24.1" 164 | resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" 165 | dependencies: 166 | babel-helper-hoist-variables "^6.24.1" 167 | babel-runtime "^6.22.0" 168 | babel-traverse "^6.24.1" 169 | babel-types "^6.24.1" 170 | 171 | babel-helper-define-map@^6.24.1: 172 | version "6.24.1" 173 | resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080" 174 | dependencies: 175 | babel-helper-function-name "^6.24.1" 176 | babel-runtime "^6.22.0" 177 | babel-types "^6.24.1" 178 | lodash "^4.2.0" 179 | 180 | babel-helper-explode-assignable-expression@^6.24.1: 181 | version "6.24.1" 182 | resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" 183 | dependencies: 184 | babel-runtime "^6.22.0" 185 | babel-traverse "^6.24.1" 186 | babel-types "^6.24.1" 187 | 188 | babel-helper-function-name@^6.24.1: 189 | version "6.24.1" 190 | resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" 191 | dependencies: 192 | babel-helper-get-function-arity "^6.24.1" 193 | babel-runtime "^6.22.0" 194 | babel-template "^6.24.1" 195 | babel-traverse "^6.24.1" 196 | babel-types "^6.24.1" 197 | 198 | babel-helper-get-function-arity@^6.24.1: 199 | version "6.24.1" 200 | resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" 201 | dependencies: 202 | babel-runtime "^6.22.0" 203 | babel-types "^6.24.1" 204 | 205 | babel-helper-hoist-variables@^6.24.1: 206 | version "6.24.1" 207 | resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" 208 | dependencies: 209 | babel-runtime "^6.22.0" 210 | babel-types "^6.24.1" 211 | 212 | babel-helper-optimise-call-expression@^6.24.1: 213 | version "6.24.1" 214 | resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" 215 | dependencies: 216 | babel-runtime "^6.22.0" 217 | babel-types "^6.24.1" 218 | 219 | babel-helper-regex@^6.24.1: 220 | version "6.24.1" 221 | resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8" 222 | dependencies: 223 | babel-runtime "^6.22.0" 224 | babel-types "^6.24.1" 225 | lodash "^4.2.0" 226 | 227 | babel-helper-remap-async-to-generator@^6.24.1: 228 | version "6.24.1" 229 | resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" 230 | dependencies: 231 | babel-helper-function-name "^6.24.1" 232 | babel-runtime "^6.22.0" 233 | babel-template "^6.24.1" 234 | babel-traverse "^6.24.1" 235 | babel-types "^6.24.1" 236 | 237 | babel-helper-replace-supers@^6.24.1: 238 | version "6.24.1" 239 | resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" 240 | dependencies: 241 | babel-helper-optimise-call-expression "^6.24.1" 242 | babel-messages "^6.23.0" 243 | babel-runtime "^6.22.0" 244 | babel-template "^6.24.1" 245 | babel-traverse "^6.24.1" 246 | babel-types "^6.24.1" 247 | 248 | babel-helpers@^6.24.1: 249 | version "6.24.1" 250 | resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" 251 | dependencies: 252 | babel-runtime "^6.22.0" 253 | babel-template "^6.24.1" 254 | 255 | babel-messages@^6.23.0: 256 | version "6.23.0" 257 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" 258 | dependencies: 259 | babel-runtime "^6.22.0" 260 | 261 | babel-plugin-check-es2015-constants@^6.22.0: 262 | version "6.22.0" 263 | resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" 264 | dependencies: 265 | babel-runtime "^6.22.0" 266 | 267 | babel-plugin-syntax-async-functions@^6.8.0: 268 | version "6.13.0" 269 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" 270 | 271 | babel-plugin-syntax-async-generators@^6.5.0: 272 | version "6.13.0" 273 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" 274 | 275 | babel-plugin-syntax-exponentiation-operator@^6.8.0: 276 | version "6.13.0" 277 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" 278 | 279 | babel-plugin-syntax-object-rest-spread@^6.8.0: 280 | version "6.13.0" 281 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" 282 | 283 | babel-plugin-syntax-trailing-function-commas@^6.22.0: 284 | version "6.22.0" 285 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" 286 | 287 | babel-plugin-transform-async-generator-functions@^6.24.1: 288 | version "6.24.1" 289 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" 290 | dependencies: 291 | babel-helper-remap-async-to-generator "^6.24.1" 292 | babel-plugin-syntax-async-generators "^6.5.0" 293 | babel-runtime "^6.22.0" 294 | 295 | babel-plugin-transform-async-to-generator@^6.22.0, babel-plugin-transform-async-to-generator@^6.24.1: 296 | version "6.24.1" 297 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" 298 | dependencies: 299 | babel-helper-remap-async-to-generator "^6.24.1" 300 | babel-plugin-syntax-async-functions "^6.8.0" 301 | babel-runtime "^6.22.0" 302 | 303 | babel-plugin-transform-es2015-arrow-functions@^6.22.0: 304 | version "6.22.0" 305 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" 306 | dependencies: 307 | babel-runtime "^6.22.0" 308 | 309 | babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: 310 | version "6.22.0" 311 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" 312 | dependencies: 313 | babel-runtime "^6.22.0" 314 | 315 | babel-plugin-transform-es2015-block-scoping@^6.23.0: 316 | version "6.24.1" 317 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" 318 | dependencies: 319 | babel-runtime "^6.22.0" 320 | babel-template "^6.24.1" 321 | babel-traverse "^6.24.1" 322 | babel-types "^6.24.1" 323 | lodash "^4.2.0" 324 | 325 | babel-plugin-transform-es2015-classes@^6.23.0: 326 | version "6.24.1" 327 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" 328 | dependencies: 329 | babel-helper-define-map "^6.24.1" 330 | babel-helper-function-name "^6.24.1" 331 | babel-helper-optimise-call-expression "^6.24.1" 332 | babel-helper-replace-supers "^6.24.1" 333 | babel-messages "^6.23.0" 334 | babel-runtime "^6.22.0" 335 | babel-template "^6.24.1" 336 | babel-traverse "^6.24.1" 337 | babel-types "^6.24.1" 338 | 339 | babel-plugin-transform-es2015-computed-properties@^6.22.0: 340 | version "6.24.1" 341 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" 342 | dependencies: 343 | babel-runtime "^6.22.0" 344 | babel-template "^6.24.1" 345 | 346 | babel-plugin-transform-es2015-destructuring@^6.23.0: 347 | version "6.23.0" 348 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" 349 | dependencies: 350 | babel-runtime "^6.22.0" 351 | 352 | babel-plugin-transform-es2015-duplicate-keys@^6.22.0: 353 | version "6.24.1" 354 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" 355 | dependencies: 356 | babel-runtime "^6.22.0" 357 | babel-types "^6.24.1" 358 | 359 | babel-plugin-transform-es2015-for-of@^6.23.0: 360 | version "6.23.0" 361 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" 362 | dependencies: 363 | babel-runtime "^6.22.0" 364 | 365 | babel-plugin-transform-es2015-function-name@^6.22.0: 366 | version "6.24.1" 367 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" 368 | dependencies: 369 | babel-helper-function-name "^6.24.1" 370 | babel-runtime "^6.22.0" 371 | babel-types "^6.24.1" 372 | 373 | babel-plugin-transform-es2015-literals@^6.22.0: 374 | version "6.22.0" 375 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" 376 | dependencies: 377 | babel-runtime "^6.22.0" 378 | 379 | babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: 380 | version "6.24.1" 381 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" 382 | dependencies: 383 | babel-plugin-transform-es2015-modules-commonjs "^6.24.1" 384 | babel-runtime "^6.22.0" 385 | babel-template "^6.24.1" 386 | 387 | babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: 388 | version "6.24.1" 389 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" 390 | dependencies: 391 | babel-plugin-transform-strict-mode "^6.24.1" 392 | babel-runtime "^6.22.0" 393 | babel-template "^6.24.1" 394 | babel-types "^6.24.1" 395 | 396 | babel-plugin-transform-es2015-modules-systemjs@^6.23.0: 397 | version "6.24.1" 398 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" 399 | dependencies: 400 | babel-helper-hoist-variables "^6.24.1" 401 | babel-runtime "^6.22.0" 402 | babel-template "^6.24.1" 403 | 404 | babel-plugin-transform-es2015-modules-umd@^6.23.0: 405 | version "6.24.1" 406 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" 407 | dependencies: 408 | babel-plugin-transform-es2015-modules-amd "^6.24.1" 409 | babel-runtime "^6.22.0" 410 | babel-template "^6.24.1" 411 | 412 | babel-plugin-transform-es2015-object-super@^6.22.0: 413 | version "6.24.1" 414 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" 415 | dependencies: 416 | babel-helper-replace-supers "^6.24.1" 417 | babel-runtime "^6.22.0" 418 | 419 | babel-plugin-transform-es2015-parameters@^6.23.0: 420 | version "6.24.1" 421 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" 422 | dependencies: 423 | babel-helper-call-delegate "^6.24.1" 424 | babel-helper-get-function-arity "^6.24.1" 425 | babel-runtime "^6.22.0" 426 | babel-template "^6.24.1" 427 | babel-traverse "^6.24.1" 428 | babel-types "^6.24.1" 429 | 430 | babel-plugin-transform-es2015-shorthand-properties@^6.22.0: 431 | version "6.24.1" 432 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" 433 | dependencies: 434 | babel-runtime "^6.22.0" 435 | babel-types "^6.24.1" 436 | 437 | babel-plugin-transform-es2015-spread@^6.22.0: 438 | version "6.22.0" 439 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" 440 | dependencies: 441 | babel-runtime "^6.22.0" 442 | 443 | babel-plugin-transform-es2015-sticky-regex@^6.22.0: 444 | version "6.24.1" 445 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" 446 | dependencies: 447 | babel-helper-regex "^6.24.1" 448 | babel-runtime "^6.22.0" 449 | babel-types "^6.24.1" 450 | 451 | babel-plugin-transform-es2015-template-literals@^6.22.0: 452 | version "6.22.0" 453 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" 454 | dependencies: 455 | babel-runtime "^6.22.0" 456 | 457 | babel-plugin-transform-es2015-typeof-symbol@^6.23.0: 458 | version "6.23.0" 459 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" 460 | dependencies: 461 | babel-runtime "^6.22.0" 462 | 463 | babel-plugin-transform-es2015-unicode-regex@^6.22.0: 464 | version "6.24.1" 465 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" 466 | dependencies: 467 | babel-helper-regex "^6.24.1" 468 | babel-runtime "^6.22.0" 469 | regexpu-core "^2.0.0" 470 | 471 | babel-plugin-transform-exponentiation-operator@^6.22.0, babel-plugin-transform-exponentiation-operator@^6.24.1: 472 | version "6.24.1" 473 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" 474 | dependencies: 475 | babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" 476 | babel-plugin-syntax-exponentiation-operator "^6.8.0" 477 | babel-runtime "^6.22.0" 478 | 479 | babel-plugin-transform-object-rest-spread@^6.22.0: 480 | version "6.23.0" 481 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921" 482 | dependencies: 483 | babel-plugin-syntax-object-rest-spread "^6.8.0" 484 | babel-runtime "^6.22.0" 485 | 486 | babel-plugin-transform-regenerator@^6.22.0: 487 | version "6.24.1" 488 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" 489 | dependencies: 490 | regenerator-transform "0.9.11" 491 | 492 | babel-plugin-transform-runtime@^6.23.0: 493 | version "6.23.0" 494 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" 495 | dependencies: 496 | babel-runtime "^6.22.0" 497 | 498 | babel-plugin-transform-strict-mode@^6.24.1: 499 | version "6.24.1" 500 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" 501 | dependencies: 502 | babel-runtime "^6.22.0" 503 | babel-types "^6.24.1" 504 | 505 | babel-polyfill@^6.23.0: 506 | version "6.23.0" 507 | resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" 508 | dependencies: 509 | babel-runtime "^6.22.0" 510 | core-js "^2.4.0" 511 | regenerator-runtime "^0.10.0" 512 | 513 | babel-preset-env@^1.4.0: 514 | version "1.6.0" 515 | resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.0.tgz#2de1c782a780a0a5d605d199c957596da43c44e4" 516 | dependencies: 517 | babel-plugin-check-es2015-constants "^6.22.0" 518 | babel-plugin-syntax-trailing-function-commas "^6.22.0" 519 | babel-plugin-transform-async-to-generator "^6.22.0" 520 | babel-plugin-transform-es2015-arrow-functions "^6.22.0" 521 | babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" 522 | babel-plugin-transform-es2015-block-scoping "^6.23.0" 523 | babel-plugin-transform-es2015-classes "^6.23.0" 524 | babel-plugin-transform-es2015-computed-properties "^6.22.0" 525 | babel-plugin-transform-es2015-destructuring "^6.23.0" 526 | babel-plugin-transform-es2015-duplicate-keys "^6.22.0" 527 | babel-plugin-transform-es2015-for-of "^6.23.0" 528 | babel-plugin-transform-es2015-function-name "^6.22.0" 529 | babel-plugin-transform-es2015-literals "^6.22.0" 530 | babel-plugin-transform-es2015-modules-amd "^6.22.0" 531 | babel-plugin-transform-es2015-modules-commonjs "^6.23.0" 532 | babel-plugin-transform-es2015-modules-systemjs "^6.23.0" 533 | babel-plugin-transform-es2015-modules-umd "^6.23.0" 534 | babel-plugin-transform-es2015-object-super "^6.22.0" 535 | babel-plugin-transform-es2015-parameters "^6.23.0" 536 | babel-plugin-transform-es2015-shorthand-properties "^6.22.0" 537 | babel-plugin-transform-es2015-spread "^6.22.0" 538 | babel-plugin-transform-es2015-sticky-regex "^6.22.0" 539 | babel-plugin-transform-es2015-template-literals "^6.22.0" 540 | babel-plugin-transform-es2015-typeof-symbol "^6.23.0" 541 | babel-plugin-transform-es2015-unicode-regex "^6.22.0" 542 | babel-plugin-transform-exponentiation-operator "^6.22.0" 543 | babel-plugin-transform-regenerator "^6.22.0" 544 | browserslist "^2.1.2" 545 | invariant "^2.2.2" 546 | semver "^5.3.0" 547 | 548 | babel-preset-stage-3@^6.24.1: 549 | version "6.24.1" 550 | resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" 551 | dependencies: 552 | babel-plugin-syntax-trailing-function-commas "^6.22.0" 553 | babel-plugin-transform-async-generator-functions "^6.24.1" 554 | babel-plugin-transform-async-to-generator "^6.24.1" 555 | babel-plugin-transform-exponentiation-operator "^6.24.1" 556 | babel-plugin-transform-object-rest-spread "^6.22.0" 557 | 558 | babel-register@^6.24.1: 559 | version "6.24.1" 560 | resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" 561 | dependencies: 562 | babel-core "^6.24.1" 563 | babel-runtime "^6.22.0" 564 | core-js "^2.4.0" 565 | home-or-tmp "^2.0.0" 566 | lodash "^4.2.0" 567 | mkdirp "^0.5.1" 568 | source-map-support "^0.4.2" 569 | 570 | babel-runtime@^6.18.0, babel-runtime@^6.22.0: 571 | version "6.23.0" 572 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" 573 | dependencies: 574 | core-js "^2.4.0" 575 | regenerator-runtime "^0.10.0" 576 | 577 | babel-template@^6.24.1, babel-template@^6.25.0: 578 | version "6.25.0" 579 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071" 580 | dependencies: 581 | babel-runtime "^6.22.0" 582 | babel-traverse "^6.25.0" 583 | babel-types "^6.25.0" 584 | babylon "^6.17.2" 585 | lodash "^4.2.0" 586 | 587 | babel-traverse@^6.24.1, babel-traverse@^6.25.0: 588 | version "6.25.0" 589 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1" 590 | dependencies: 591 | babel-code-frame "^6.22.0" 592 | babel-messages "^6.23.0" 593 | babel-runtime "^6.22.0" 594 | babel-types "^6.25.0" 595 | babylon "^6.17.2" 596 | debug "^2.2.0" 597 | globals "^9.0.0" 598 | invariant "^2.2.0" 599 | lodash "^4.2.0" 600 | 601 | babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.25.0: 602 | version "6.25.0" 603 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e" 604 | dependencies: 605 | babel-runtime "^6.22.0" 606 | esutils "^2.0.2" 607 | lodash "^4.2.0" 608 | to-fast-properties "^1.0.1" 609 | 610 | babylon@^6.17.2: 611 | version "6.17.4" 612 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.4.tgz#3e8b7402b88d22c3423e137a1577883b15ff869a" 613 | 614 | balanced-match@^1.0.0: 615 | version "1.0.0" 616 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 617 | 618 | bcrypt-pbkdf@^1.0.0: 619 | version "1.0.1" 620 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" 621 | dependencies: 622 | tweetnacl "^0.14.3" 623 | 624 | binary-extensions@^1.0.0: 625 | version "1.8.0" 626 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" 627 | 628 | block-stream@*: 629 | version "0.0.9" 630 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 631 | dependencies: 632 | inherits "~2.0.0" 633 | 634 | boom@2.x.x: 635 | version "2.10.1" 636 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" 637 | dependencies: 638 | hoek "2.x.x" 639 | 640 | brace-expansion@^1.1.7: 641 | version "1.1.8" 642 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 643 | dependencies: 644 | balanced-match "^1.0.0" 645 | concat-map "0.0.1" 646 | 647 | braces@^1.8.2: 648 | version "1.8.5" 649 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 650 | dependencies: 651 | expand-range "^1.8.1" 652 | preserve "^0.2.0" 653 | repeat-element "^1.1.2" 654 | 655 | browserslist@^2.1.2: 656 | version "2.1.5" 657 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.1.5.tgz#e882550df3d1cd6d481c1a3e0038f2baf13a4711" 658 | dependencies: 659 | caniuse-lite "^1.0.30000684" 660 | electron-to-chromium "^1.3.14" 661 | 662 | caniuse-lite@^1.0.30000684: 663 | version "1.0.30000697" 664 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000697.tgz#125fb00604b63fbb188db96a667ce2922dcd6cdd" 665 | 666 | caseless@~0.12.0: 667 | version "0.12.0" 668 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 669 | 670 | chalk@^1.1.0: 671 | version "1.1.3" 672 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 673 | dependencies: 674 | ansi-styles "^2.2.1" 675 | escape-string-regexp "^1.0.2" 676 | has-ansi "^2.0.0" 677 | strip-ansi "^3.0.0" 678 | supports-color "^2.0.0" 679 | 680 | chokidar@^1.6.1: 681 | version "1.7.0" 682 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" 683 | dependencies: 684 | anymatch "^1.3.0" 685 | async-each "^1.0.0" 686 | glob-parent "^2.0.0" 687 | inherits "^2.0.1" 688 | is-binary-path "^1.0.0" 689 | is-glob "^2.0.0" 690 | path-is-absolute "^1.0.0" 691 | readdirp "^2.0.0" 692 | optionalDependencies: 693 | fsevents "^1.0.0" 694 | 695 | co@^4.6.0: 696 | version "4.6.0" 697 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 698 | 699 | code-point-at@^1.0.0: 700 | version "1.1.0" 701 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 702 | 703 | combined-stream@^1.0.5, combined-stream@~1.0.5: 704 | version "1.0.5" 705 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 706 | dependencies: 707 | delayed-stream "~1.0.0" 708 | 709 | commander@^2.8.1: 710 | version "2.11.0" 711 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" 712 | 713 | concat-map@0.0.1: 714 | version "0.0.1" 715 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 716 | 717 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 718 | version "1.1.0" 719 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 720 | 721 | convert-source-map@^1.1.0: 722 | version "1.5.0" 723 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" 724 | 725 | core-js@^2.4.0: 726 | version "2.4.1" 727 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" 728 | 729 | core-util-is@~1.0.0: 730 | version "1.0.2" 731 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 732 | 733 | cryptiles@2.x.x: 734 | version "2.0.5" 735 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" 736 | dependencies: 737 | boom "2.x.x" 738 | 739 | dashdash@^1.12.0: 740 | version "1.14.1" 741 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 742 | dependencies: 743 | assert-plus "^1.0.0" 744 | 745 | debug@^2.1.1, debug@^2.2.0: 746 | version "2.6.8" 747 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" 748 | dependencies: 749 | ms "2.0.0" 750 | 751 | deep-extend@~0.4.0: 752 | version "0.4.2" 753 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" 754 | 755 | delayed-stream@~1.0.0: 756 | version "1.0.0" 757 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 758 | 759 | delegates@^1.0.0: 760 | version "1.0.0" 761 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 762 | 763 | detect-indent@^4.0.0: 764 | version "4.0.0" 765 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" 766 | dependencies: 767 | repeating "^2.0.0" 768 | 769 | ecc-jsbn@~0.1.1: 770 | version "0.1.1" 771 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 772 | dependencies: 773 | jsbn "~0.1.0" 774 | 775 | electron-to-chromium@^1.3.14: 776 | version "1.3.15" 777 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.15.tgz#08397934891cbcfaebbd18b82a95b5a481138369" 778 | 779 | escape-string-regexp@^1.0.2: 780 | version "1.0.5" 781 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 782 | 783 | esutils@^2.0.2: 784 | version "2.0.2" 785 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 786 | 787 | expand-brackets@^0.1.4: 788 | version "0.1.5" 789 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 790 | dependencies: 791 | is-posix-bracket "^0.1.0" 792 | 793 | expand-range@^1.8.1: 794 | version "1.8.2" 795 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 796 | dependencies: 797 | fill-range "^2.1.0" 798 | 799 | extend@~3.0.0: 800 | version "3.0.1" 801 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" 802 | 803 | extglob@^0.3.1: 804 | version "0.3.2" 805 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 806 | dependencies: 807 | is-extglob "^1.0.0" 808 | 809 | extsprintf@1.0.2: 810 | version "1.0.2" 811 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" 812 | 813 | filename-regex@^2.0.0: 814 | version "2.0.1" 815 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" 816 | 817 | fill-range@^2.1.0: 818 | version "2.2.3" 819 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 820 | dependencies: 821 | is-number "^2.1.0" 822 | isobject "^2.0.0" 823 | randomatic "^1.1.3" 824 | repeat-element "^1.1.2" 825 | repeat-string "^1.5.2" 826 | 827 | for-in@^1.0.1: 828 | version "1.0.2" 829 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 830 | 831 | for-own@^0.1.4: 832 | version "0.1.5" 833 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" 834 | dependencies: 835 | for-in "^1.0.1" 836 | 837 | forever-agent@~0.6.1: 838 | version "0.6.1" 839 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 840 | 841 | form-data@~2.1.1: 842 | version "2.1.4" 843 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" 844 | dependencies: 845 | asynckit "^0.4.0" 846 | combined-stream "^1.0.5" 847 | mime-types "^2.1.12" 848 | 849 | fs-readdir-recursive@^1.0.0: 850 | version "1.0.0" 851 | resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560" 852 | 853 | fs.realpath@^1.0.0: 854 | version "1.0.0" 855 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 856 | 857 | fsevents@^1.0.0: 858 | version "1.1.2" 859 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" 860 | dependencies: 861 | nan "^2.3.0" 862 | node-pre-gyp "^0.6.36" 863 | 864 | fstream-ignore@^1.0.5: 865 | version "1.0.5" 866 | resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" 867 | dependencies: 868 | fstream "^1.0.0" 869 | inherits "2" 870 | minimatch "^3.0.0" 871 | 872 | fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: 873 | version "1.0.11" 874 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" 875 | dependencies: 876 | graceful-fs "^4.1.2" 877 | inherits "~2.0.0" 878 | mkdirp ">=0.5 0" 879 | rimraf "2" 880 | 881 | gauge@~2.7.3: 882 | version "2.7.4" 883 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 884 | dependencies: 885 | aproba "^1.0.3" 886 | console-control-strings "^1.0.0" 887 | has-unicode "^2.0.0" 888 | object-assign "^4.1.0" 889 | signal-exit "^3.0.0" 890 | string-width "^1.0.1" 891 | strip-ansi "^3.0.1" 892 | wide-align "^1.1.0" 893 | 894 | getpass@^0.1.1: 895 | version "0.1.7" 896 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 897 | dependencies: 898 | assert-plus "^1.0.0" 899 | 900 | glob-base@^0.3.0: 901 | version "0.3.0" 902 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 903 | dependencies: 904 | glob-parent "^2.0.0" 905 | is-glob "^2.0.0" 906 | 907 | glob-parent@^2.0.0: 908 | version "2.0.0" 909 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 910 | dependencies: 911 | is-glob "^2.0.0" 912 | 913 | glob@^7.0.0, glob@^7.0.5: 914 | version "7.1.2" 915 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 916 | dependencies: 917 | fs.realpath "^1.0.0" 918 | inflight "^1.0.4" 919 | inherits "2" 920 | minimatch "^3.0.4" 921 | once "^1.3.0" 922 | path-is-absolute "^1.0.0" 923 | 924 | globals@^9.0.0: 925 | version "9.18.0" 926 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" 927 | 928 | graceful-fs@^4.1.2, graceful-fs@^4.1.4: 929 | version "4.1.11" 930 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 931 | 932 | har-schema@^1.0.5: 933 | version "1.0.5" 934 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" 935 | 936 | har-validator@~4.2.1: 937 | version "4.2.1" 938 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" 939 | dependencies: 940 | ajv "^4.9.1" 941 | har-schema "^1.0.5" 942 | 943 | has-ansi@^2.0.0: 944 | version "2.0.0" 945 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 946 | dependencies: 947 | ansi-regex "^2.0.0" 948 | 949 | has-unicode@^2.0.0: 950 | version "2.0.1" 951 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 952 | 953 | hawk@~3.1.3: 954 | version "3.1.3" 955 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" 956 | dependencies: 957 | boom "2.x.x" 958 | cryptiles "2.x.x" 959 | hoek "2.x.x" 960 | sntp "1.x.x" 961 | 962 | hoek@2.x.x: 963 | version "2.16.3" 964 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 965 | 966 | home-or-tmp@^2.0.0: 967 | version "2.0.0" 968 | resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" 969 | dependencies: 970 | os-homedir "^1.0.0" 971 | os-tmpdir "^1.0.1" 972 | 973 | http-signature@~1.1.0: 974 | version "1.1.1" 975 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" 976 | dependencies: 977 | assert-plus "^0.2.0" 978 | jsprim "^1.2.2" 979 | sshpk "^1.7.0" 980 | 981 | inflight@^1.0.4: 982 | version "1.0.6" 983 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 984 | dependencies: 985 | once "^1.3.0" 986 | wrappy "1" 987 | 988 | inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.3: 989 | version "2.0.3" 990 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 991 | 992 | ini@~1.3.0: 993 | version "1.3.4" 994 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 995 | 996 | invariant@^2.2.0, invariant@^2.2.2: 997 | version "2.2.2" 998 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" 999 | dependencies: 1000 | loose-envify "^1.0.0" 1001 | 1002 | is-binary-path@^1.0.0: 1003 | version "1.0.1" 1004 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 1005 | dependencies: 1006 | binary-extensions "^1.0.0" 1007 | 1008 | is-buffer@^1.1.5: 1009 | version "1.1.5" 1010 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" 1011 | 1012 | is-dotfile@^1.0.0: 1013 | version "1.0.3" 1014 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" 1015 | 1016 | is-equal-shallow@^0.1.3: 1017 | version "0.1.3" 1018 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 1019 | dependencies: 1020 | is-primitive "^2.0.0" 1021 | 1022 | is-extendable@^0.1.1: 1023 | version "0.1.1" 1024 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 1025 | 1026 | is-extglob@^1.0.0: 1027 | version "1.0.0" 1028 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 1029 | 1030 | is-finite@^1.0.0: 1031 | version "1.0.2" 1032 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 1033 | dependencies: 1034 | number-is-nan "^1.0.0" 1035 | 1036 | is-fullwidth-code-point@^1.0.0: 1037 | version "1.0.0" 1038 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1039 | dependencies: 1040 | number-is-nan "^1.0.0" 1041 | 1042 | is-glob@^2.0.0, is-glob@^2.0.1: 1043 | version "2.0.1" 1044 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 1045 | dependencies: 1046 | is-extglob "^1.0.0" 1047 | 1048 | is-number@^2.1.0: 1049 | version "2.1.0" 1050 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 1051 | dependencies: 1052 | kind-of "^3.0.2" 1053 | 1054 | is-number@^3.0.0: 1055 | version "3.0.0" 1056 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 1057 | dependencies: 1058 | kind-of "^3.0.2" 1059 | 1060 | is-posix-bracket@^0.1.0: 1061 | version "0.1.1" 1062 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 1063 | 1064 | is-primitive@^2.0.0: 1065 | version "2.0.0" 1066 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 1067 | 1068 | is-typedarray@~1.0.0: 1069 | version "1.0.0" 1070 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1071 | 1072 | isarray@1.0.0, isarray@~1.0.0: 1073 | version "1.0.0" 1074 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1075 | 1076 | isobject@^2.0.0: 1077 | version "2.1.0" 1078 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1079 | dependencies: 1080 | isarray "1.0.0" 1081 | 1082 | isstream@~0.1.2: 1083 | version "0.1.2" 1084 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 1085 | 1086 | js-tokens@^3.0.0: 1087 | version "3.0.2" 1088 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 1089 | 1090 | jsbn@~0.1.0: 1091 | version "0.1.1" 1092 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 1093 | 1094 | jsesc@^1.3.0: 1095 | version "1.3.0" 1096 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" 1097 | 1098 | jsesc@~0.5.0: 1099 | version "0.5.0" 1100 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" 1101 | 1102 | json-schema@0.2.3: 1103 | version "0.2.3" 1104 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1105 | 1106 | json-stable-stringify@^1.0.1: 1107 | version "1.0.1" 1108 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 1109 | dependencies: 1110 | jsonify "~0.0.0" 1111 | 1112 | json-stringify-safe@~5.0.1: 1113 | version "5.0.1" 1114 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1115 | 1116 | json5@^0.5.0: 1117 | version "0.5.1" 1118 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" 1119 | 1120 | jsonify@~0.0.0: 1121 | version "0.0.0" 1122 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 1123 | 1124 | jsprim@^1.2.2: 1125 | version "1.4.0" 1126 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" 1127 | dependencies: 1128 | assert-plus "1.0.0" 1129 | extsprintf "1.0.2" 1130 | json-schema "0.2.3" 1131 | verror "1.3.6" 1132 | 1133 | kind-of@^3.0.2: 1134 | version "3.2.2" 1135 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 1136 | dependencies: 1137 | is-buffer "^1.1.5" 1138 | 1139 | kind-of@^4.0.0: 1140 | version "4.0.0" 1141 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 1142 | dependencies: 1143 | is-buffer "^1.1.5" 1144 | 1145 | lodash@^4.2.0: 1146 | version "4.17.4" 1147 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 1148 | 1149 | loose-envify@^1.0.0: 1150 | version "1.3.1" 1151 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" 1152 | dependencies: 1153 | js-tokens "^3.0.0" 1154 | 1155 | micromatch@^2.1.5: 1156 | version "2.3.11" 1157 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 1158 | dependencies: 1159 | arr-diff "^2.0.0" 1160 | array-unique "^0.2.1" 1161 | braces "^1.8.2" 1162 | expand-brackets "^0.1.4" 1163 | extglob "^0.3.1" 1164 | filename-regex "^2.0.0" 1165 | is-extglob "^1.0.0" 1166 | is-glob "^2.0.1" 1167 | kind-of "^3.0.2" 1168 | normalize-path "^2.0.1" 1169 | object.omit "^2.0.0" 1170 | parse-glob "^3.0.4" 1171 | regex-cache "^0.4.2" 1172 | 1173 | mime-db@~1.27.0: 1174 | version "1.27.0" 1175 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" 1176 | 1177 | mime-types@^2.1.12, mime-types@~2.1.7: 1178 | version "2.1.15" 1179 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" 1180 | dependencies: 1181 | mime-db "~1.27.0" 1182 | 1183 | minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: 1184 | version "3.0.4" 1185 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1186 | dependencies: 1187 | brace-expansion "^1.1.7" 1188 | 1189 | minimist@0.0.8: 1190 | version "0.0.8" 1191 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1192 | 1193 | minimist@^1.2.0: 1194 | version "1.2.0" 1195 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1196 | 1197 | "mkdirp@>=0.5 0", mkdirp@^0.5.1: 1198 | version "0.5.1" 1199 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1200 | dependencies: 1201 | minimist "0.0.8" 1202 | 1203 | ms@2.0.0: 1204 | version "2.0.0" 1205 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1206 | 1207 | nan@^2.3.0: 1208 | version "2.6.2" 1209 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" 1210 | 1211 | node-pre-gyp@^0.6.36: 1212 | version "0.6.36" 1213 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" 1214 | dependencies: 1215 | mkdirp "^0.5.1" 1216 | nopt "^4.0.1" 1217 | npmlog "^4.0.2" 1218 | rc "^1.1.7" 1219 | request "^2.81.0" 1220 | rimraf "^2.6.1" 1221 | semver "^5.3.0" 1222 | tar "^2.2.1" 1223 | tar-pack "^3.4.0" 1224 | 1225 | nopt@^4.0.1: 1226 | version "4.0.1" 1227 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 1228 | dependencies: 1229 | abbrev "1" 1230 | osenv "^0.1.4" 1231 | 1232 | normalize-path@^2.0.1: 1233 | version "2.1.1" 1234 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 1235 | dependencies: 1236 | remove-trailing-separator "^1.0.1" 1237 | 1238 | npmlog@^4.0.2: 1239 | version "4.1.2" 1240 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 1241 | dependencies: 1242 | are-we-there-yet "~1.1.2" 1243 | console-control-strings "~1.1.0" 1244 | gauge "~2.7.3" 1245 | set-blocking "~2.0.0" 1246 | 1247 | number-is-nan@^1.0.0: 1248 | version "1.0.1" 1249 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1250 | 1251 | oauth-sign@~0.8.1: 1252 | version "0.8.2" 1253 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 1254 | 1255 | object-assign@^4.1.0: 1256 | version "4.1.1" 1257 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1258 | 1259 | object.omit@^2.0.0: 1260 | version "2.0.1" 1261 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 1262 | dependencies: 1263 | for-own "^0.1.4" 1264 | is-extendable "^0.1.1" 1265 | 1266 | once@^1.3.0, once@^1.3.3: 1267 | version "1.4.0" 1268 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1269 | dependencies: 1270 | wrappy "1" 1271 | 1272 | os-homedir@^1.0.0: 1273 | version "1.0.2" 1274 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1275 | 1276 | os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: 1277 | version "1.0.2" 1278 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1279 | 1280 | osenv@^0.1.4: 1281 | version "0.1.4" 1282 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" 1283 | dependencies: 1284 | os-homedir "^1.0.0" 1285 | os-tmpdir "^1.0.0" 1286 | 1287 | output-file-sync@^1.1.0: 1288 | version "1.1.2" 1289 | resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" 1290 | dependencies: 1291 | graceful-fs "^4.1.4" 1292 | mkdirp "^0.5.1" 1293 | object-assign "^4.1.0" 1294 | 1295 | parse-glob@^3.0.4: 1296 | version "3.0.4" 1297 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 1298 | dependencies: 1299 | glob-base "^0.3.0" 1300 | is-dotfile "^1.0.0" 1301 | is-extglob "^1.0.0" 1302 | is-glob "^2.0.0" 1303 | 1304 | path-is-absolute@^1.0.0: 1305 | version "1.0.1" 1306 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1307 | 1308 | performance-now@^0.2.0: 1309 | version "0.2.0" 1310 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" 1311 | 1312 | preserve@^0.2.0: 1313 | version "0.2.0" 1314 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 1315 | 1316 | private@^0.1.6: 1317 | version "0.1.7" 1318 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" 1319 | 1320 | process-nextick-args@~1.0.6: 1321 | version "1.0.7" 1322 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1323 | 1324 | punycode@^1.4.1: 1325 | version "1.4.1" 1326 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1327 | 1328 | qs@~6.4.0: 1329 | version "6.4.0" 1330 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" 1331 | 1332 | randomatic@^1.1.3: 1333 | version "1.1.7" 1334 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" 1335 | dependencies: 1336 | is-number "^3.0.0" 1337 | kind-of "^4.0.0" 1338 | 1339 | rc@^1.1.7: 1340 | version "1.2.1" 1341 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" 1342 | dependencies: 1343 | deep-extend "~0.4.0" 1344 | ini "~1.3.0" 1345 | minimist "^1.2.0" 1346 | strip-json-comments "~2.0.1" 1347 | 1348 | readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4: 1349 | version "2.3.3" 1350 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" 1351 | dependencies: 1352 | core-util-is "~1.0.0" 1353 | inherits "~2.0.3" 1354 | isarray "~1.0.0" 1355 | process-nextick-args "~1.0.6" 1356 | safe-buffer "~5.1.1" 1357 | string_decoder "~1.0.3" 1358 | util-deprecate "~1.0.1" 1359 | 1360 | readdirp@^2.0.0: 1361 | version "2.1.0" 1362 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" 1363 | dependencies: 1364 | graceful-fs "^4.1.2" 1365 | minimatch "^3.0.2" 1366 | readable-stream "^2.0.2" 1367 | set-immediate-shim "^1.0.1" 1368 | 1369 | regenerate@^1.2.1: 1370 | version "1.3.2" 1371 | resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" 1372 | 1373 | regenerator-runtime@^0.10.0: 1374 | version "0.10.5" 1375 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" 1376 | 1377 | regenerator-transform@0.9.11: 1378 | version "0.9.11" 1379 | resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" 1380 | dependencies: 1381 | babel-runtime "^6.18.0" 1382 | babel-types "^6.19.0" 1383 | private "^0.1.6" 1384 | 1385 | regex-cache@^0.4.2: 1386 | version "0.4.3" 1387 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" 1388 | dependencies: 1389 | is-equal-shallow "^0.1.3" 1390 | is-primitive "^2.0.0" 1391 | 1392 | regexpu-core@^2.0.0: 1393 | version "2.0.0" 1394 | resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" 1395 | dependencies: 1396 | regenerate "^1.2.1" 1397 | regjsgen "^0.2.0" 1398 | regjsparser "^0.1.4" 1399 | 1400 | regjsgen@^0.2.0: 1401 | version "0.2.0" 1402 | resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" 1403 | 1404 | regjsparser@^0.1.4: 1405 | version "0.1.5" 1406 | resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" 1407 | dependencies: 1408 | jsesc "~0.5.0" 1409 | 1410 | remove-trailing-separator@^1.0.1: 1411 | version "1.0.2" 1412 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz#69b062d978727ad14dc6b56ba4ab772fd8d70511" 1413 | 1414 | repeat-element@^1.1.2: 1415 | version "1.1.2" 1416 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 1417 | 1418 | repeat-string@^1.5.2: 1419 | version "1.6.1" 1420 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1421 | 1422 | repeating@^2.0.0: 1423 | version "2.0.1" 1424 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 1425 | dependencies: 1426 | is-finite "^1.0.0" 1427 | 1428 | request@^2.81.0: 1429 | version "2.81.0" 1430 | resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" 1431 | dependencies: 1432 | aws-sign2 "~0.6.0" 1433 | aws4 "^1.2.1" 1434 | caseless "~0.12.0" 1435 | combined-stream "~1.0.5" 1436 | extend "~3.0.0" 1437 | forever-agent "~0.6.1" 1438 | form-data "~2.1.1" 1439 | har-validator "~4.2.1" 1440 | hawk "~3.1.3" 1441 | http-signature "~1.1.0" 1442 | is-typedarray "~1.0.0" 1443 | isstream "~0.1.2" 1444 | json-stringify-safe "~5.0.1" 1445 | mime-types "~2.1.7" 1446 | oauth-sign "~0.8.1" 1447 | performance-now "^0.2.0" 1448 | qs "~6.4.0" 1449 | safe-buffer "^5.0.1" 1450 | stringstream "~0.0.4" 1451 | tough-cookie "~2.3.0" 1452 | tunnel-agent "^0.6.0" 1453 | uuid "^3.0.0" 1454 | 1455 | rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1: 1456 | version "2.6.1" 1457 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" 1458 | dependencies: 1459 | glob "^7.0.5" 1460 | 1461 | safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1462 | version "5.1.1" 1463 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 1464 | 1465 | semver@^5.3.0: 1466 | version "5.3.0" 1467 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 1468 | 1469 | set-blocking@~2.0.0: 1470 | version "2.0.0" 1471 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1472 | 1473 | set-immediate-shim@^1.0.1: 1474 | version "1.0.1" 1475 | resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" 1476 | 1477 | signal-exit@^3.0.0: 1478 | version "3.0.2" 1479 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1480 | 1481 | slash@^1.0.0: 1482 | version "1.0.0" 1483 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" 1484 | 1485 | sntp@1.x.x: 1486 | version "1.0.9" 1487 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" 1488 | dependencies: 1489 | hoek "2.x.x" 1490 | 1491 | source-map-support@^0.4.2: 1492 | version "0.4.15" 1493 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" 1494 | dependencies: 1495 | source-map "^0.5.6" 1496 | 1497 | source-map@^0.5.0, source-map@^0.5.6: 1498 | version "0.5.6" 1499 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" 1500 | 1501 | sshpk@^1.7.0: 1502 | version "1.13.1" 1503 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" 1504 | dependencies: 1505 | asn1 "~0.2.3" 1506 | assert-plus "^1.0.0" 1507 | dashdash "^1.12.0" 1508 | getpass "^0.1.1" 1509 | optionalDependencies: 1510 | bcrypt-pbkdf "^1.0.0" 1511 | ecc-jsbn "~0.1.1" 1512 | jsbn "~0.1.0" 1513 | tweetnacl "~0.14.0" 1514 | 1515 | string-width@^1.0.1, string-width@^1.0.2: 1516 | version "1.0.2" 1517 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1518 | dependencies: 1519 | code-point-at "^1.0.0" 1520 | is-fullwidth-code-point "^1.0.0" 1521 | strip-ansi "^3.0.0" 1522 | 1523 | string_decoder@~1.0.3: 1524 | version "1.0.3" 1525 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" 1526 | dependencies: 1527 | safe-buffer "~5.1.0" 1528 | 1529 | stringstream@~0.0.4: 1530 | version "0.0.5" 1531 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 1532 | 1533 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1534 | version "3.0.1" 1535 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1536 | dependencies: 1537 | ansi-regex "^2.0.0" 1538 | 1539 | strip-json-comments@~2.0.1: 1540 | version "2.0.1" 1541 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1542 | 1543 | supports-color@^2.0.0: 1544 | version "2.0.0" 1545 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1546 | 1547 | tar-pack@^3.4.0: 1548 | version "3.4.0" 1549 | resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" 1550 | dependencies: 1551 | debug "^2.2.0" 1552 | fstream "^1.0.10" 1553 | fstream-ignore "^1.0.5" 1554 | once "^1.3.3" 1555 | readable-stream "^2.1.4" 1556 | rimraf "^2.5.1" 1557 | tar "^2.2.1" 1558 | uid-number "^0.0.6" 1559 | 1560 | tar@^2.2.1: 1561 | version "2.2.1" 1562 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" 1563 | dependencies: 1564 | block-stream "*" 1565 | fstream "^1.0.2" 1566 | inherits "2" 1567 | 1568 | to-fast-properties@^1.0.1: 1569 | version "1.0.3" 1570 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" 1571 | 1572 | tough-cookie@~2.3.0: 1573 | version "2.3.2" 1574 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" 1575 | dependencies: 1576 | punycode "^1.4.1" 1577 | 1578 | trim-right@^1.0.1: 1579 | version "1.0.1" 1580 | resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" 1581 | 1582 | tunnel-agent@^0.6.0: 1583 | version "0.6.0" 1584 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 1585 | dependencies: 1586 | safe-buffer "^5.0.1" 1587 | 1588 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 1589 | version "0.14.5" 1590 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 1591 | 1592 | uid-number@^0.0.6: 1593 | version "0.0.6" 1594 | resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" 1595 | 1596 | user-home@^1.1.1: 1597 | version "1.1.1" 1598 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" 1599 | 1600 | util-deprecate@~1.0.1: 1601 | version "1.0.2" 1602 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1603 | 1604 | uuid@^3.0.0: 1605 | version "3.1.0" 1606 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" 1607 | 1608 | v8flags@^2.0.10: 1609 | version "2.1.1" 1610 | resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" 1611 | dependencies: 1612 | user-home "^1.1.1" 1613 | 1614 | verror@1.3.6: 1615 | version "1.3.6" 1616 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" 1617 | dependencies: 1618 | extsprintf "1.0.2" 1619 | 1620 | wide-align@^1.1.0: 1621 | version "1.1.2" 1622 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" 1623 | dependencies: 1624 | string-width "^1.0.2" 1625 | 1626 | wrappy@1: 1627 | version "1.0.2" 1628 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1629 | -------------------------------------------------------------------------------- /packages/adapter-fetch/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | abbrev@1: 6 | version "1.1.0" 7 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" 8 | 9 | ajv@^4.9.1: 10 | version "4.11.8" 11 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" 12 | dependencies: 13 | co "^4.6.0" 14 | json-stable-stringify "^1.0.1" 15 | 16 | ansi-regex@^2.0.0: 17 | version "2.1.1" 18 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 19 | 20 | ansi-styles@^2.2.1: 21 | version "2.2.1" 22 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 23 | 24 | anymatch@^1.3.0: 25 | version "1.3.0" 26 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" 27 | dependencies: 28 | arrify "^1.0.0" 29 | micromatch "^2.1.5" 30 | 31 | aproba@^1.0.3: 32 | version "1.1.1" 33 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab" 34 | 35 | are-we-there-yet@~1.1.2: 36 | version "1.1.4" 37 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" 38 | dependencies: 39 | delegates "^1.0.0" 40 | readable-stream "^2.0.6" 41 | 42 | arr-diff@^2.0.0: 43 | version "2.0.0" 44 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 45 | dependencies: 46 | arr-flatten "^1.0.1" 47 | 48 | arr-flatten@^1.0.1: 49 | version "1.0.3" 50 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1" 51 | 52 | array-unique@^0.2.1: 53 | version "0.2.1" 54 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 55 | 56 | arrify@^1.0.0: 57 | version "1.0.1" 58 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 59 | 60 | asn1@~0.2.3: 61 | version "0.2.3" 62 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 63 | 64 | assert-plus@1.0.0, assert-plus@^1.0.0: 65 | version "1.0.0" 66 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 67 | 68 | assert-plus@^0.2.0: 69 | version "0.2.0" 70 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" 71 | 72 | async-each@^1.0.0: 73 | version "1.0.1" 74 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" 75 | 76 | asynckit@^0.4.0: 77 | version "0.4.0" 78 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 79 | 80 | aws-sign2@~0.6.0: 81 | version "0.6.0" 82 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" 83 | 84 | aws4@^1.2.1: 85 | version "1.6.0" 86 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" 87 | 88 | babel-cli@^6.24.1: 89 | version "6.24.1" 90 | resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.24.1.tgz#207cd705bba61489b2ea41b5312341cf6aca2283" 91 | dependencies: 92 | babel-core "^6.24.1" 93 | babel-polyfill "^6.23.0" 94 | babel-register "^6.24.1" 95 | babel-runtime "^6.22.0" 96 | commander "^2.8.1" 97 | convert-source-map "^1.1.0" 98 | fs-readdir-recursive "^1.0.0" 99 | glob "^7.0.0" 100 | lodash "^4.2.0" 101 | output-file-sync "^1.1.0" 102 | path-is-absolute "^1.0.0" 103 | slash "^1.0.0" 104 | source-map "^0.5.0" 105 | v8flags "^2.0.10" 106 | optionalDependencies: 107 | chokidar "^1.6.1" 108 | 109 | babel-code-frame@^6.22.0: 110 | version "6.22.0" 111 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" 112 | dependencies: 113 | chalk "^1.1.0" 114 | esutils "^2.0.2" 115 | js-tokens "^3.0.0" 116 | 117 | babel-core@^6.24.1: 118 | version "6.24.1" 119 | resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.1.tgz#8c428564dce1e1f41fb337ec34f4c3b022b5ad83" 120 | dependencies: 121 | babel-code-frame "^6.22.0" 122 | babel-generator "^6.24.1" 123 | babel-helpers "^6.24.1" 124 | babel-messages "^6.23.0" 125 | babel-register "^6.24.1" 126 | babel-runtime "^6.22.0" 127 | babel-template "^6.24.1" 128 | babel-traverse "^6.24.1" 129 | babel-types "^6.24.1" 130 | babylon "^6.11.0" 131 | convert-source-map "^1.1.0" 132 | debug "^2.1.1" 133 | json5 "^0.5.0" 134 | lodash "^4.2.0" 135 | minimatch "^3.0.2" 136 | path-is-absolute "^1.0.0" 137 | private "^0.1.6" 138 | slash "^1.0.0" 139 | source-map "^0.5.0" 140 | 141 | babel-generator@^6.24.1: 142 | version "6.24.1" 143 | resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497" 144 | dependencies: 145 | babel-messages "^6.23.0" 146 | babel-runtime "^6.22.0" 147 | babel-types "^6.24.1" 148 | detect-indent "^4.0.0" 149 | jsesc "^1.3.0" 150 | lodash "^4.2.0" 151 | source-map "^0.5.0" 152 | trim-right "^1.0.1" 153 | 154 | babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: 155 | version "6.24.1" 156 | resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" 157 | dependencies: 158 | babel-helper-explode-assignable-expression "^6.24.1" 159 | babel-runtime "^6.22.0" 160 | babel-types "^6.24.1" 161 | 162 | babel-helper-call-delegate@^6.24.1: 163 | version "6.24.1" 164 | resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" 165 | dependencies: 166 | babel-helper-hoist-variables "^6.24.1" 167 | babel-runtime "^6.22.0" 168 | babel-traverse "^6.24.1" 169 | babel-types "^6.24.1" 170 | 171 | babel-helper-define-map@^6.24.1: 172 | version "6.24.1" 173 | resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080" 174 | dependencies: 175 | babel-helper-function-name "^6.24.1" 176 | babel-runtime "^6.22.0" 177 | babel-types "^6.24.1" 178 | lodash "^4.2.0" 179 | 180 | babel-helper-explode-assignable-expression@^6.24.1: 181 | version "6.24.1" 182 | resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" 183 | dependencies: 184 | babel-runtime "^6.22.0" 185 | babel-traverse "^6.24.1" 186 | babel-types "^6.24.1" 187 | 188 | babel-helper-function-name@^6.24.1: 189 | version "6.24.1" 190 | resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" 191 | dependencies: 192 | babel-helper-get-function-arity "^6.24.1" 193 | babel-runtime "^6.22.0" 194 | babel-template "^6.24.1" 195 | babel-traverse "^6.24.1" 196 | babel-types "^6.24.1" 197 | 198 | babel-helper-get-function-arity@^6.24.1: 199 | version "6.24.1" 200 | resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" 201 | dependencies: 202 | babel-runtime "^6.22.0" 203 | babel-types "^6.24.1" 204 | 205 | babel-helper-hoist-variables@^6.24.1: 206 | version "6.24.1" 207 | resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" 208 | dependencies: 209 | babel-runtime "^6.22.0" 210 | babel-types "^6.24.1" 211 | 212 | babel-helper-optimise-call-expression@^6.24.1: 213 | version "6.24.1" 214 | resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" 215 | dependencies: 216 | babel-runtime "^6.22.0" 217 | babel-types "^6.24.1" 218 | 219 | babel-helper-regex@^6.24.1: 220 | version "6.24.1" 221 | resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8" 222 | dependencies: 223 | babel-runtime "^6.22.0" 224 | babel-types "^6.24.1" 225 | lodash "^4.2.0" 226 | 227 | babel-helper-remap-async-to-generator@^6.24.1: 228 | version "6.24.1" 229 | resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" 230 | dependencies: 231 | babel-helper-function-name "^6.24.1" 232 | babel-runtime "^6.22.0" 233 | babel-template "^6.24.1" 234 | babel-traverse "^6.24.1" 235 | babel-types "^6.24.1" 236 | 237 | babel-helper-replace-supers@^6.24.1: 238 | version "6.24.1" 239 | resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" 240 | dependencies: 241 | babel-helper-optimise-call-expression "^6.24.1" 242 | babel-messages "^6.23.0" 243 | babel-runtime "^6.22.0" 244 | babel-template "^6.24.1" 245 | babel-traverse "^6.24.1" 246 | babel-types "^6.24.1" 247 | 248 | babel-helpers@^6.24.1: 249 | version "6.24.1" 250 | resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" 251 | dependencies: 252 | babel-runtime "^6.22.0" 253 | babel-template "^6.24.1" 254 | 255 | babel-messages@^6.23.0: 256 | version "6.23.0" 257 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" 258 | dependencies: 259 | babel-runtime "^6.22.0" 260 | 261 | babel-plugin-check-es2015-constants@^6.22.0: 262 | version "6.22.0" 263 | resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" 264 | dependencies: 265 | babel-runtime "^6.22.0" 266 | 267 | babel-plugin-syntax-async-functions@^6.8.0: 268 | version "6.13.0" 269 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" 270 | 271 | babel-plugin-syntax-async-generators@^6.5.0: 272 | version "6.13.0" 273 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" 274 | 275 | babel-plugin-syntax-exponentiation-operator@^6.8.0: 276 | version "6.13.0" 277 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" 278 | 279 | babel-plugin-syntax-object-rest-spread@^6.8.0: 280 | version "6.13.0" 281 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" 282 | 283 | babel-plugin-syntax-trailing-function-commas@^6.22.0: 284 | version "6.22.0" 285 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" 286 | 287 | babel-plugin-transform-async-generator-functions@^6.24.1: 288 | version "6.24.1" 289 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" 290 | dependencies: 291 | babel-helper-remap-async-to-generator "^6.24.1" 292 | babel-plugin-syntax-async-generators "^6.5.0" 293 | babel-runtime "^6.22.0" 294 | 295 | babel-plugin-transform-async-to-generator@^6.22.0, babel-plugin-transform-async-to-generator@^6.24.1: 296 | version "6.24.1" 297 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" 298 | dependencies: 299 | babel-helper-remap-async-to-generator "^6.24.1" 300 | babel-plugin-syntax-async-functions "^6.8.0" 301 | babel-runtime "^6.22.0" 302 | 303 | babel-plugin-transform-es2015-arrow-functions@^6.22.0: 304 | version "6.22.0" 305 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" 306 | dependencies: 307 | babel-runtime "^6.22.0" 308 | 309 | babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: 310 | version "6.22.0" 311 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" 312 | dependencies: 313 | babel-runtime "^6.22.0" 314 | 315 | babel-plugin-transform-es2015-block-scoping@^6.23.0: 316 | version "6.24.1" 317 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" 318 | dependencies: 319 | babel-runtime "^6.22.0" 320 | babel-template "^6.24.1" 321 | babel-traverse "^6.24.1" 322 | babel-types "^6.24.1" 323 | lodash "^4.2.0" 324 | 325 | babel-plugin-transform-es2015-classes@^6.23.0: 326 | version "6.24.1" 327 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" 328 | dependencies: 329 | babel-helper-define-map "^6.24.1" 330 | babel-helper-function-name "^6.24.1" 331 | babel-helper-optimise-call-expression "^6.24.1" 332 | babel-helper-replace-supers "^6.24.1" 333 | babel-messages "^6.23.0" 334 | babel-runtime "^6.22.0" 335 | babel-template "^6.24.1" 336 | babel-traverse "^6.24.1" 337 | babel-types "^6.24.1" 338 | 339 | babel-plugin-transform-es2015-computed-properties@^6.22.0: 340 | version "6.24.1" 341 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" 342 | dependencies: 343 | babel-runtime "^6.22.0" 344 | babel-template "^6.24.1" 345 | 346 | babel-plugin-transform-es2015-destructuring@^6.23.0: 347 | version "6.23.0" 348 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" 349 | dependencies: 350 | babel-runtime "^6.22.0" 351 | 352 | babel-plugin-transform-es2015-duplicate-keys@^6.22.0: 353 | version "6.24.1" 354 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" 355 | dependencies: 356 | babel-runtime "^6.22.0" 357 | babel-types "^6.24.1" 358 | 359 | babel-plugin-transform-es2015-for-of@^6.23.0: 360 | version "6.23.0" 361 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" 362 | dependencies: 363 | babel-runtime "^6.22.0" 364 | 365 | babel-plugin-transform-es2015-function-name@^6.22.0: 366 | version "6.24.1" 367 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" 368 | dependencies: 369 | babel-helper-function-name "^6.24.1" 370 | babel-runtime "^6.22.0" 371 | babel-types "^6.24.1" 372 | 373 | babel-plugin-transform-es2015-literals@^6.22.0: 374 | version "6.22.0" 375 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" 376 | dependencies: 377 | babel-runtime "^6.22.0" 378 | 379 | babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: 380 | version "6.24.1" 381 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" 382 | dependencies: 383 | babel-plugin-transform-es2015-modules-commonjs "^6.24.1" 384 | babel-runtime "^6.22.0" 385 | babel-template "^6.24.1" 386 | 387 | babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: 388 | version "6.24.1" 389 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" 390 | dependencies: 391 | babel-plugin-transform-strict-mode "^6.24.1" 392 | babel-runtime "^6.22.0" 393 | babel-template "^6.24.1" 394 | babel-types "^6.24.1" 395 | 396 | babel-plugin-transform-es2015-modules-systemjs@^6.23.0: 397 | version "6.24.1" 398 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" 399 | dependencies: 400 | babel-helper-hoist-variables "^6.24.1" 401 | babel-runtime "^6.22.0" 402 | babel-template "^6.24.1" 403 | 404 | babel-plugin-transform-es2015-modules-umd@^6.23.0: 405 | version "6.24.1" 406 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" 407 | dependencies: 408 | babel-plugin-transform-es2015-modules-amd "^6.24.1" 409 | babel-runtime "^6.22.0" 410 | babel-template "^6.24.1" 411 | 412 | babel-plugin-transform-es2015-object-super@^6.22.0: 413 | version "6.24.1" 414 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" 415 | dependencies: 416 | babel-helper-replace-supers "^6.24.1" 417 | babel-runtime "^6.22.0" 418 | 419 | babel-plugin-transform-es2015-parameters@^6.23.0: 420 | version "6.24.1" 421 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" 422 | dependencies: 423 | babel-helper-call-delegate "^6.24.1" 424 | babel-helper-get-function-arity "^6.24.1" 425 | babel-runtime "^6.22.0" 426 | babel-template "^6.24.1" 427 | babel-traverse "^6.24.1" 428 | babel-types "^6.24.1" 429 | 430 | babel-plugin-transform-es2015-shorthand-properties@^6.22.0: 431 | version "6.24.1" 432 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" 433 | dependencies: 434 | babel-runtime "^6.22.0" 435 | babel-types "^6.24.1" 436 | 437 | babel-plugin-transform-es2015-spread@^6.22.0: 438 | version "6.22.0" 439 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" 440 | dependencies: 441 | babel-runtime "^6.22.0" 442 | 443 | babel-plugin-transform-es2015-sticky-regex@^6.22.0: 444 | version "6.24.1" 445 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" 446 | dependencies: 447 | babel-helper-regex "^6.24.1" 448 | babel-runtime "^6.22.0" 449 | babel-types "^6.24.1" 450 | 451 | babel-plugin-transform-es2015-template-literals@^6.22.0: 452 | version "6.22.0" 453 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" 454 | dependencies: 455 | babel-runtime "^6.22.0" 456 | 457 | babel-plugin-transform-es2015-typeof-symbol@^6.23.0: 458 | version "6.23.0" 459 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" 460 | dependencies: 461 | babel-runtime "^6.22.0" 462 | 463 | babel-plugin-transform-es2015-unicode-regex@^6.22.0: 464 | version "6.24.1" 465 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" 466 | dependencies: 467 | babel-helper-regex "^6.24.1" 468 | babel-runtime "^6.22.0" 469 | regexpu-core "^2.0.0" 470 | 471 | babel-plugin-transform-exponentiation-operator@^6.22.0, babel-plugin-transform-exponentiation-operator@^6.24.1: 472 | version "6.24.1" 473 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" 474 | dependencies: 475 | babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" 476 | babel-plugin-syntax-exponentiation-operator "^6.8.0" 477 | babel-runtime "^6.22.0" 478 | 479 | babel-plugin-transform-object-rest-spread@^6.22.0: 480 | version "6.23.0" 481 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921" 482 | dependencies: 483 | babel-plugin-syntax-object-rest-spread "^6.8.0" 484 | babel-runtime "^6.22.0" 485 | 486 | babel-plugin-transform-regenerator@^6.22.0: 487 | version "6.24.1" 488 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" 489 | dependencies: 490 | regenerator-transform "0.9.11" 491 | 492 | babel-plugin-transform-runtime@^6.23.0: 493 | version "6.23.0" 494 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" 495 | dependencies: 496 | babel-runtime "^6.22.0" 497 | 498 | babel-plugin-transform-strict-mode@^6.24.1: 499 | version "6.24.1" 500 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" 501 | dependencies: 502 | babel-runtime "^6.22.0" 503 | babel-types "^6.24.1" 504 | 505 | babel-polyfill@^6.23.0: 506 | version "6.23.0" 507 | resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" 508 | dependencies: 509 | babel-runtime "^6.22.0" 510 | core-js "^2.4.0" 511 | regenerator-runtime "^0.10.0" 512 | 513 | babel-preset-env@^1.4.0: 514 | version "1.4.0" 515 | resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.4.0.tgz#c8e02a3bcc7792f23cded68e0355b9d4c28f0f7a" 516 | dependencies: 517 | babel-plugin-check-es2015-constants "^6.22.0" 518 | babel-plugin-syntax-trailing-function-commas "^6.22.0" 519 | babel-plugin-transform-async-to-generator "^6.22.0" 520 | babel-plugin-transform-es2015-arrow-functions "^6.22.0" 521 | babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" 522 | babel-plugin-transform-es2015-block-scoping "^6.23.0" 523 | babel-plugin-transform-es2015-classes "^6.23.0" 524 | babel-plugin-transform-es2015-computed-properties "^6.22.0" 525 | babel-plugin-transform-es2015-destructuring "^6.23.0" 526 | babel-plugin-transform-es2015-duplicate-keys "^6.22.0" 527 | babel-plugin-transform-es2015-for-of "^6.23.0" 528 | babel-plugin-transform-es2015-function-name "^6.22.0" 529 | babel-plugin-transform-es2015-literals "^6.22.0" 530 | babel-plugin-transform-es2015-modules-amd "^6.22.0" 531 | babel-plugin-transform-es2015-modules-commonjs "^6.23.0" 532 | babel-plugin-transform-es2015-modules-systemjs "^6.23.0" 533 | babel-plugin-transform-es2015-modules-umd "^6.23.0" 534 | babel-plugin-transform-es2015-object-super "^6.22.0" 535 | babel-plugin-transform-es2015-parameters "^6.23.0" 536 | babel-plugin-transform-es2015-shorthand-properties "^6.22.0" 537 | babel-plugin-transform-es2015-spread "^6.22.0" 538 | babel-plugin-transform-es2015-sticky-regex "^6.22.0" 539 | babel-plugin-transform-es2015-template-literals "^6.22.0" 540 | babel-plugin-transform-es2015-typeof-symbol "^6.23.0" 541 | babel-plugin-transform-es2015-unicode-regex "^6.22.0" 542 | babel-plugin-transform-exponentiation-operator "^6.22.0" 543 | babel-plugin-transform-regenerator "^6.22.0" 544 | browserslist "^1.4.0" 545 | invariant "^2.2.2" 546 | 547 | babel-preset-stage-3@^6.24.1: 548 | version "6.24.1" 549 | resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" 550 | dependencies: 551 | babel-plugin-syntax-trailing-function-commas "^6.22.0" 552 | babel-plugin-transform-async-generator-functions "^6.24.1" 553 | babel-plugin-transform-async-to-generator "^6.24.1" 554 | babel-plugin-transform-exponentiation-operator "^6.24.1" 555 | babel-plugin-transform-object-rest-spread "^6.22.0" 556 | 557 | babel-register@^6.24.1: 558 | version "6.24.1" 559 | resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" 560 | dependencies: 561 | babel-core "^6.24.1" 562 | babel-runtime "^6.22.0" 563 | core-js "^2.4.0" 564 | home-or-tmp "^2.0.0" 565 | lodash "^4.2.0" 566 | mkdirp "^0.5.1" 567 | source-map-support "^0.4.2" 568 | 569 | babel-runtime@^6.18.0, babel-runtime@^6.22.0: 570 | version "6.23.0" 571 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" 572 | dependencies: 573 | core-js "^2.4.0" 574 | regenerator-runtime "^0.10.0" 575 | 576 | babel-template@^6.24.1: 577 | version "6.24.1" 578 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333" 579 | dependencies: 580 | babel-runtime "^6.22.0" 581 | babel-traverse "^6.24.1" 582 | babel-types "^6.24.1" 583 | babylon "^6.11.0" 584 | lodash "^4.2.0" 585 | 586 | babel-traverse@^6.24.1: 587 | version "6.24.1" 588 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695" 589 | dependencies: 590 | babel-code-frame "^6.22.0" 591 | babel-messages "^6.23.0" 592 | babel-runtime "^6.22.0" 593 | babel-types "^6.24.1" 594 | babylon "^6.15.0" 595 | debug "^2.2.0" 596 | globals "^9.0.0" 597 | invariant "^2.2.0" 598 | lodash "^4.2.0" 599 | 600 | babel-types@^6.19.0, babel-types@^6.24.1: 601 | version "6.24.1" 602 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975" 603 | dependencies: 604 | babel-runtime "^6.22.0" 605 | esutils "^2.0.2" 606 | lodash "^4.2.0" 607 | to-fast-properties "^1.0.1" 608 | 609 | babylon@^6.11.0, babylon@^6.15.0: 610 | version "6.17.0" 611 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.0.tgz#37da948878488b9c4e3c4038893fa3314b3fc932" 612 | 613 | balanced-match@^0.4.1: 614 | version "0.4.2" 615 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 616 | 617 | bcrypt-pbkdf@^1.0.0: 618 | version "1.0.1" 619 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" 620 | dependencies: 621 | tweetnacl "^0.14.3" 622 | 623 | binary-extensions@^1.0.0: 624 | version "1.8.0" 625 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" 626 | 627 | block-stream@*: 628 | version "0.0.9" 629 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 630 | dependencies: 631 | inherits "~2.0.0" 632 | 633 | boom@2.x.x: 634 | version "2.10.1" 635 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" 636 | dependencies: 637 | hoek "2.x.x" 638 | 639 | brace-expansion@^1.0.0: 640 | version "1.1.7" 641 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" 642 | dependencies: 643 | balanced-match "^0.4.1" 644 | concat-map "0.0.1" 645 | 646 | braces@^1.8.2: 647 | version "1.8.5" 648 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 649 | dependencies: 650 | expand-range "^1.8.1" 651 | preserve "^0.2.0" 652 | repeat-element "^1.1.2" 653 | 654 | browserslist@^1.4.0: 655 | version "1.7.7" 656 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" 657 | dependencies: 658 | caniuse-db "^1.0.30000639" 659 | electron-to-chromium "^1.2.7" 660 | 661 | buffer-shims@~1.0.0: 662 | version "1.0.0" 663 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 664 | 665 | caniuse-db@^1.0.30000639: 666 | version "1.0.30000664" 667 | resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000664.tgz#e16316e5fdabb9c7209b2bf0744ffc8a14201f22" 668 | 669 | caseless@~0.12.0: 670 | version "0.12.0" 671 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 672 | 673 | chalk@^1.1.0: 674 | version "1.1.3" 675 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 676 | dependencies: 677 | ansi-styles "^2.2.1" 678 | escape-string-regexp "^1.0.2" 679 | has-ansi "^2.0.0" 680 | strip-ansi "^3.0.0" 681 | supports-color "^2.0.0" 682 | 683 | chokidar@^1.6.1: 684 | version "1.6.1" 685 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" 686 | dependencies: 687 | anymatch "^1.3.0" 688 | async-each "^1.0.0" 689 | glob-parent "^2.0.0" 690 | inherits "^2.0.1" 691 | is-binary-path "^1.0.0" 692 | is-glob "^2.0.0" 693 | path-is-absolute "^1.0.0" 694 | readdirp "^2.0.0" 695 | optionalDependencies: 696 | fsevents "^1.0.0" 697 | 698 | co@^4.6.0: 699 | version "4.6.0" 700 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 701 | 702 | code-point-at@^1.0.0: 703 | version "1.1.0" 704 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 705 | 706 | combined-stream@^1.0.5, combined-stream@~1.0.5: 707 | version "1.0.5" 708 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 709 | dependencies: 710 | delayed-stream "~1.0.0" 711 | 712 | commander@^2.8.1: 713 | version "2.9.0" 714 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 715 | dependencies: 716 | graceful-readlink ">= 1.0.0" 717 | 718 | concat-map@0.0.1: 719 | version "0.0.1" 720 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 721 | 722 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 723 | version "1.1.0" 724 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 725 | 726 | convert-source-map@^1.1.0: 727 | version "1.5.0" 728 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" 729 | 730 | core-js@^2.4.0: 731 | version "2.4.1" 732 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" 733 | 734 | core-util-is@~1.0.0: 735 | version "1.0.2" 736 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 737 | 738 | cryptiles@2.x.x: 739 | version "2.0.5" 740 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" 741 | dependencies: 742 | boom "2.x.x" 743 | 744 | dashdash@^1.12.0: 745 | version "1.14.1" 746 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 747 | dependencies: 748 | assert-plus "^1.0.0" 749 | 750 | debug@^2.1.1, debug@^2.2.0: 751 | version "2.6.6" 752 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.6.tgz#a9fa6fbe9ca43cf1e79f73b75c0189cbb7d6db5a" 753 | dependencies: 754 | ms "0.7.3" 755 | 756 | deep-extend@~0.4.0: 757 | version "0.4.1" 758 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" 759 | 760 | delayed-stream@~1.0.0: 761 | version "1.0.0" 762 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 763 | 764 | delegates@^1.0.0: 765 | version "1.0.0" 766 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 767 | 768 | detect-indent@^4.0.0: 769 | version "4.0.0" 770 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" 771 | dependencies: 772 | repeating "^2.0.0" 773 | 774 | ecc-jsbn@~0.1.1: 775 | version "0.1.1" 776 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 777 | dependencies: 778 | jsbn "~0.1.0" 779 | 780 | electron-to-chromium@^1.2.7: 781 | version "1.3.8" 782 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.8.tgz#b2c8a2c79bb89fbbfd3724d9555e15095b5f5fb6" 783 | 784 | escape-string-regexp@^1.0.2: 785 | version "1.0.5" 786 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 787 | 788 | esutils@^2.0.2: 789 | version "2.0.2" 790 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 791 | 792 | expand-brackets@^0.1.4: 793 | version "0.1.5" 794 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 795 | dependencies: 796 | is-posix-bracket "^0.1.0" 797 | 798 | expand-range@^1.8.1: 799 | version "1.8.2" 800 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 801 | dependencies: 802 | fill-range "^2.1.0" 803 | 804 | extend@~3.0.0: 805 | version "3.0.1" 806 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" 807 | 808 | extglob@^0.3.1: 809 | version "0.3.2" 810 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 811 | dependencies: 812 | is-extglob "^1.0.0" 813 | 814 | extsprintf@1.0.2: 815 | version "1.0.2" 816 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" 817 | 818 | filename-regex@^2.0.0: 819 | version "2.0.1" 820 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" 821 | 822 | fill-range@^2.1.0: 823 | version "2.2.3" 824 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 825 | dependencies: 826 | is-number "^2.1.0" 827 | isobject "^2.0.0" 828 | randomatic "^1.1.3" 829 | repeat-element "^1.1.2" 830 | repeat-string "^1.5.2" 831 | 832 | for-in@^1.0.1: 833 | version "1.0.2" 834 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 835 | 836 | for-own@^0.1.4: 837 | version "0.1.5" 838 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" 839 | dependencies: 840 | for-in "^1.0.1" 841 | 842 | forever-agent@~0.6.1: 843 | version "0.6.1" 844 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 845 | 846 | form-data@~2.1.1: 847 | version "2.1.4" 848 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" 849 | dependencies: 850 | asynckit "^0.4.0" 851 | combined-stream "^1.0.5" 852 | mime-types "^2.1.12" 853 | 854 | fs-readdir-recursive@^1.0.0: 855 | version "1.0.0" 856 | resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560" 857 | 858 | fs.realpath@^1.0.0: 859 | version "1.0.0" 860 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 861 | 862 | fsevents@^1.0.0: 863 | version "1.1.1" 864 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff" 865 | dependencies: 866 | nan "^2.3.0" 867 | node-pre-gyp "^0.6.29" 868 | 869 | fstream-ignore@^1.0.5: 870 | version "1.0.5" 871 | resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" 872 | dependencies: 873 | fstream "^1.0.0" 874 | inherits "2" 875 | minimatch "^3.0.0" 876 | 877 | fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: 878 | version "1.0.11" 879 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" 880 | dependencies: 881 | graceful-fs "^4.1.2" 882 | inherits "~2.0.0" 883 | mkdirp ">=0.5 0" 884 | rimraf "2" 885 | 886 | gauge@~2.7.1: 887 | version "2.7.4" 888 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 889 | dependencies: 890 | aproba "^1.0.3" 891 | console-control-strings "^1.0.0" 892 | has-unicode "^2.0.0" 893 | object-assign "^4.1.0" 894 | signal-exit "^3.0.0" 895 | string-width "^1.0.1" 896 | strip-ansi "^3.0.1" 897 | wide-align "^1.1.0" 898 | 899 | getpass@^0.1.1: 900 | version "0.1.7" 901 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 902 | dependencies: 903 | assert-plus "^1.0.0" 904 | 905 | glob-base@^0.3.0: 906 | version "0.3.0" 907 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 908 | dependencies: 909 | glob-parent "^2.0.0" 910 | is-glob "^2.0.0" 911 | 912 | glob-parent@^2.0.0: 913 | version "2.0.0" 914 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 915 | dependencies: 916 | is-glob "^2.0.0" 917 | 918 | glob@^7.0.0, glob@^7.0.5: 919 | version "7.1.1" 920 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 921 | dependencies: 922 | fs.realpath "^1.0.0" 923 | inflight "^1.0.4" 924 | inherits "2" 925 | minimatch "^3.0.2" 926 | once "^1.3.0" 927 | path-is-absolute "^1.0.0" 928 | 929 | globals@^9.0.0: 930 | version "9.17.0" 931 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" 932 | 933 | graceful-fs@^4.1.2, graceful-fs@^4.1.4: 934 | version "4.1.11" 935 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 936 | 937 | "graceful-readlink@>= 1.0.0": 938 | version "1.0.1" 939 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 940 | 941 | har-schema@^1.0.5: 942 | version "1.0.5" 943 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" 944 | 945 | har-validator@~4.2.1: 946 | version "4.2.1" 947 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" 948 | dependencies: 949 | ajv "^4.9.1" 950 | har-schema "^1.0.5" 951 | 952 | has-ansi@^2.0.0: 953 | version "2.0.0" 954 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 955 | dependencies: 956 | ansi-regex "^2.0.0" 957 | 958 | has-unicode@^2.0.0: 959 | version "2.0.1" 960 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 961 | 962 | hawk@~3.1.3: 963 | version "3.1.3" 964 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" 965 | dependencies: 966 | boom "2.x.x" 967 | cryptiles "2.x.x" 968 | hoek "2.x.x" 969 | sntp "1.x.x" 970 | 971 | hoek@2.x.x: 972 | version "2.16.3" 973 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 974 | 975 | home-or-tmp@^2.0.0: 976 | version "2.0.0" 977 | resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" 978 | dependencies: 979 | os-homedir "^1.0.0" 980 | os-tmpdir "^1.0.1" 981 | 982 | http-signature@~1.1.0: 983 | version "1.1.1" 984 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" 985 | dependencies: 986 | assert-plus "^0.2.0" 987 | jsprim "^1.2.2" 988 | sshpk "^1.7.0" 989 | 990 | inflight@^1.0.4: 991 | version "1.0.6" 992 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 993 | dependencies: 994 | once "^1.3.0" 995 | wrappy "1" 996 | 997 | inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: 998 | version "2.0.3" 999 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1000 | 1001 | ini@~1.3.0: 1002 | version "1.3.4" 1003 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 1004 | 1005 | invariant@^2.2.0, invariant@^2.2.2: 1006 | version "2.2.2" 1007 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" 1008 | dependencies: 1009 | loose-envify "^1.0.0" 1010 | 1011 | is-binary-path@^1.0.0: 1012 | version "1.0.1" 1013 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 1014 | dependencies: 1015 | binary-extensions "^1.0.0" 1016 | 1017 | is-buffer@^1.1.5: 1018 | version "1.1.5" 1019 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" 1020 | 1021 | is-dotfile@^1.0.0: 1022 | version "1.0.2" 1023 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" 1024 | 1025 | is-equal-shallow@^0.1.3: 1026 | version "0.1.3" 1027 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 1028 | dependencies: 1029 | is-primitive "^2.0.0" 1030 | 1031 | is-extendable@^0.1.1: 1032 | version "0.1.1" 1033 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 1034 | 1035 | is-extglob@^1.0.0: 1036 | version "1.0.0" 1037 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 1038 | 1039 | is-finite@^1.0.0: 1040 | version "1.0.2" 1041 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 1042 | dependencies: 1043 | number-is-nan "^1.0.0" 1044 | 1045 | is-fullwidth-code-point@^1.0.0: 1046 | version "1.0.0" 1047 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1048 | dependencies: 1049 | number-is-nan "^1.0.0" 1050 | 1051 | is-glob@^2.0.0, is-glob@^2.0.1: 1052 | version "2.0.1" 1053 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 1054 | dependencies: 1055 | is-extglob "^1.0.0" 1056 | 1057 | is-number@^2.0.2, is-number@^2.1.0: 1058 | version "2.1.0" 1059 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 1060 | dependencies: 1061 | kind-of "^3.0.2" 1062 | 1063 | is-posix-bracket@^0.1.0: 1064 | version "0.1.1" 1065 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 1066 | 1067 | is-primitive@^2.0.0: 1068 | version "2.0.0" 1069 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 1070 | 1071 | is-typedarray@~1.0.0: 1072 | version "1.0.0" 1073 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1074 | 1075 | isarray@1.0.0, isarray@~1.0.0: 1076 | version "1.0.0" 1077 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1078 | 1079 | isobject@^2.0.0: 1080 | version "2.1.0" 1081 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1082 | dependencies: 1083 | isarray "1.0.0" 1084 | 1085 | isstream@~0.1.2: 1086 | version "0.1.2" 1087 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 1088 | 1089 | jodid25519@^1.0.0: 1090 | version "1.0.2" 1091 | resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" 1092 | dependencies: 1093 | jsbn "~0.1.0" 1094 | 1095 | js-tokens@^3.0.0: 1096 | version "3.0.1" 1097 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" 1098 | 1099 | jsbn@~0.1.0: 1100 | version "0.1.1" 1101 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 1102 | 1103 | jsesc@^1.3.0: 1104 | version "1.3.0" 1105 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" 1106 | 1107 | jsesc@~0.5.0: 1108 | version "0.5.0" 1109 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" 1110 | 1111 | json-schema@0.2.3: 1112 | version "0.2.3" 1113 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1114 | 1115 | json-stable-stringify@^1.0.1: 1116 | version "1.0.1" 1117 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 1118 | dependencies: 1119 | jsonify "~0.0.0" 1120 | 1121 | json-stringify-safe@~5.0.1: 1122 | version "5.0.1" 1123 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1124 | 1125 | json5@^0.5.0: 1126 | version "0.5.1" 1127 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" 1128 | 1129 | jsonify@~0.0.0: 1130 | version "0.0.0" 1131 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 1132 | 1133 | jsprim@^1.2.2: 1134 | version "1.4.0" 1135 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" 1136 | dependencies: 1137 | assert-plus "1.0.0" 1138 | extsprintf "1.0.2" 1139 | json-schema "0.2.3" 1140 | verror "1.3.6" 1141 | 1142 | kind-of@^3.0.2: 1143 | version "3.2.0" 1144 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.0.tgz#b58abe4d5c044ad33726a8c1525b48cf891bff07" 1145 | dependencies: 1146 | is-buffer "^1.1.5" 1147 | 1148 | lodash@^4.2.0: 1149 | version "4.17.4" 1150 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 1151 | 1152 | loose-envify@^1.0.0: 1153 | version "1.3.1" 1154 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" 1155 | dependencies: 1156 | js-tokens "^3.0.0" 1157 | 1158 | micromatch@^2.1.5: 1159 | version "2.3.11" 1160 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 1161 | dependencies: 1162 | arr-diff "^2.0.0" 1163 | array-unique "^0.2.1" 1164 | braces "^1.8.2" 1165 | expand-brackets "^0.1.4" 1166 | extglob "^0.3.1" 1167 | filename-regex "^2.0.0" 1168 | is-extglob "^1.0.0" 1169 | is-glob "^2.0.1" 1170 | kind-of "^3.0.2" 1171 | normalize-path "^2.0.1" 1172 | object.omit "^2.0.0" 1173 | parse-glob "^3.0.4" 1174 | regex-cache "^0.4.2" 1175 | 1176 | mime-db@~1.27.0: 1177 | version "1.27.0" 1178 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" 1179 | 1180 | mime-types@^2.1.12, mime-types@~2.1.7: 1181 | version "2.1.15" 1182 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" 1183 | dependencies: 1184 | mime-db "~1.27.0" 1185 | 1186 | minimatch@^3.0.0, minimatch@^3.0.2: 1187 | version "3.0.3" 1188 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" 1189 | dependencies: 1190 | brace-expansion "^1.0.0" 1191 | 1192 | minimist@0.0.8: 1193 | version "0.0.8" 1194 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1195 | 1196 | minimist@^1.2.0: 1197 | version "1.2.0" 1198 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1199 | 1200 | "mkdirp@>=0.5 0", mkdirp@^0.5.1: 1201 | version "0.5.1" 1202 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1203 | dependencies: 1204 | minimist "0.0.8" 1205 | 1206 | ms@0.7.3: 1207 | version "0.7.3" 1208 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff" 1209 | 1210 | nan@^2.3.0: 1211 | version "2.6.2" 1212 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" 1213 | 1214 | node-pre-gyp@^0.6.29: 1215 | version "0.6.34" 1216 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc18d9799f7" 1217 | dependencies: 1218 | mkdirp "^0.5.1" 1219 | nopt "^4.0.1" 1220 | npmlog "^4.0.2" 1221 | rc "^1.1.7" 1222 | request "^2.81.0" 1223 | rimraf "^2.6.1" 1224 | semver "^5.3.0" 1225 | tar "^2.2.1" 1226 | tar-pack "^3.4.0" 1227 | 1228 | nopt@^4.0.1: 1229 | version "4.0.1" 1230 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 1231 | dependencies: 1232 | abbrev "1" 1233 | osenv "^0.1.4" 1234 | 1235 | normalize-path@^2.0.1: 1236 | version "2.1.1" 1237 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 1238 | dependencies: 1239 | remove-trailing-separator "^1.0.1" 1240 | 1241 | npmlog@^4.0.2: 1242 | version "4.0.2" 1243 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f" 1244 | dependencies: 1245 | are-we-there-yet "~1.1.2" 1246 | console-control-strings "~1.1.0" 1247 | gauge "~2.7.1" 1248 | set-blocking "~2.0.0" 1249 | 1250 | number-is-nan@^1.0.0: 1251 | version "1.0.1" 1252 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1253 | 1254 | oauth-sign@~0.8.1: 1255 | version "0.8.2" 1256 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 1257 | 1258 | object-assign@^4.1.0: 1259 | version "4.1.1" 1260 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1261 | 1262 | object.omit@^2.0.0: 1263 | version "2.0.1" 1264 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 1265 | dependencies: 1266 | for-own "^0.1.4" 1267 | is-extendable "^0.1.1" 1268 | 1269 | once@^1.3.0, once@^1.3.3: 1270 | version "1.4.0" 1271 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1272 | dependencies: 1273 | wrappy "1" 1274 | 1275 | os-homedir@^1.0.0: 1276 | version "1.0.2" 1277 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1278 | 1279 | os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: 1280 | version "1.0.2" 1281 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1282 | 1283 | osenv@^0.1.4: 1284 | version "0.1.4" 1285 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" 1286 | dependencies: 1287 | os-homedir "^1.0.0" 1288 | os-tmpdir "^1.0.0" 1289 | 1290 | output-file-sync@^1.1.0: 1291 | version "1.1.2" 1292 | resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" 1293 | dependencies: 1294 | graceful-fs "^4.1.4" 1295 | mkdirp "^0.5.1" 1296 | object-assign "^4.1.0" 1297 | 1298 | parse-glob@^3.0.4: 1299 | version "3.0.4" 1300 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 1301 | dependencies: 1302 | glob-base "^0.3.0" 1303 | is-dotfile "^1.0.0" 1304 | is-extglob "^1.0.0" 1305 | is-glob "^2.0.0" 1306 | 1307 | path-is-absolute@^1.0.0: 1308 | version "1.0.1" 1309 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1310 | 1311 | performance-now@^0.2.0: 1312 | version "0.2.0" 1313 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" 1314 | 1315 | preserve@^0.2.0: 1316 | version "0.2.0" 1317 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 1318 | 1319 | private@^0.1.6: 1320 | version "0.1.7" 1321 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" 1322 | 1323 | process-nextick-args@~1.0.6: 1324 | version "1.0.7" 1325 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1326 | 1327 | punycode@^1.4.1: 1328 | version "1.4.1" 1329 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1330 | 1331 | qs@~6.4.0: 1332 | version "6.4.0" 1333 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" 1334 | 1335 | randomatic@^1.1.3: 1336 | version "1.1.6" 1337 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" 1338 | dependencies: 1339 | is-number "^2.0.2" 1340 | kind-of "^3.0.2" 1341 | 1342 | rc@^1.1.7: 1343 | version "1.2.1" 1344 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" 1345 | dependencies: 1346 | deep-extend "~0.4.0" 1347 | ini "~1.3.0" 1348 | minimist "^1.2.0" 1349 | strip-json-comments "~2.0.1" 1350 | 1351 | readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4: 1352 | version "2.2.9" 1353 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" 1354 | dependencies: 1355 | buffer-shims "~1.0.0" 1356 | core-util-is "~1.0.0" 1357 | inherits "~2.0.1" 1358 | isarray "~1.0.0" 1359 | process-nextick-args "~1.0.6" 1360 | string_decoder "~1.0.0" 1361 | util-deprecate "~1.0.1" 1362 | 1363 | readdirp@^2.0.0: 1364 | version "2.1.0" 1365 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" 1366 | dependencies: 1367 | graceful-fs "^4.1.2" 1368 | minimatch "^3.0.2" 1369 | readable-stream "^2.0.2" 1370 | set-immediate-shim "^1.0.1" 1371 | 1372 | regenerate@^1.2.1: 1373 | version "1.3.2" 1374 | resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" 1375 | 1376 | regenerator-runtime@^0.10.0: 1377 | version "0.10.5" 1378 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" 1379 | 1380 | regenerator-transform@0.9.11: 1381 | version "0.9.11" 1382 | resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" 1383 | dependencies: 1384 | babel-runtime "^6.18.0" 1385 | babel-types "^6.19.0" 1386 | private "^0.1.6" 1387 | 1388 | regex-cache@^0.4.2: 1389 | version "0.4.3" 1390 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" 1391 | dependencies: 1392 | is-equal-shallow "^0.1.3" 1393 | is-primitive "^2.0.0" 1394 | 1395 | regexpu-core@^2.0.0: 1396 | version "2.0.0" 1397 | resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" 1398 | dependencies: 1399 | regenerate "^1.2.1" 1400 | regjsgen "^0.2.0" 1401 | regjsparser "^0.1.4" 1402 | 1403 | regjsgen@^0.2.0: 1404 | version "0.2.0" 1405 | resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" 1406 | 1407 | regjsparser@^0.1.4: 1408 | version "0.1.5" 1409 | resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" 1410 | dependencies: 1411 | jsesc "~0.5.0" 1412 | 1413 | remove-trailing-separator@^1.0.1: 1414 | version "1.0.1" 1415 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4" 1416 | 1417 | repeat-element@^1.1.2: 1418 | version "1.1.2" 1419 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 1420 | 1421 | repeat-string@^1.5.2: 1422 | version "1.6.1" 1423 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1424 | 1425 | repeating@^2.0.0: 1426 | version "2.0.1" 1427 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 1428 | dependencies: 1429 | is-finite "^1.0.0" 1430 | 1431 | request@^2.81.0: 1432 | version "2.81.0" 1433 | resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" 1434 | dependencies: 1435 | aws-sign2 "~0.6.0" 1436 | aws4 "^1.2.1" 1437 | caseless "~0.12.0" 1438 | combined-stream "~1.0.5" 1439 | extend "~3.0.0" 1440 | forever-agent "~0.6.1" 1441 | form-data "~2.1.1" 1442 | har-validator "~4.2.1" 1443 | hawk "~3.1.3" 1444 | http-signature "~1.1.0" 1445 | is-typedarray "~1.0.0" 1446 | isstream "~0.1.2" 1447 | json-stringify-safe "~5.0.1" 1448 | mime-types "~2.1.7" 1449 | oauth-sign "~0.8.1" 1450 | performance-now "^0.2.0" 1451 | qs "~6.4.0" 1452 | safe-buffer "^5.0.1" 1453 | stringstream "~0.0.4" 1454 | tough-cookie "~2.3.0" 1455 | tunnel-agent "^0.6.0" 1456 | uuid "^3.0.0" 1457 | 1458 | rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1: 1459 | version "2.6.1" 1460 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" 1461 | dependencies: 1462 | glob "^7.0.5" 1463 | 1464 | safe-buffer@^5.0.1: 1465 | version "5.0.1" 1466 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" 1467 | 1468 | semver@^5.3.0: 1469 | version "5.3.0" 1470 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 1471 | 1472 | set-blocking@~2.0.0: 1473 | version "2.0.0" 1474 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1475 | 1476 | set-immediate-shim@^1.0.1: 1477 | version "1.0.1" 1478 | resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" 1479 | 1480 | signal-exit@^3.0.0: 1481 | version "3.0.2" 1482 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1483 | 1484 | slash@^1.0.0: 1485 | version "1.0.0" 1486 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" 1487 | 1488 | sntp@1.x.x: 1489 | version "1.0.9" 1490 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" 1491 | dependencies: 1492 | hoek "2.x.x" 1493 | 1494 | source-map-support@^0.4.2: 1495 | version "0.4.15" 1496 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" 1497 | dependencies: 1498 | source-map "^0.5.6" 1499 | 1500 | source-map@^0.5.0, source-map@^0.5.6: 1501 | version "0.5.6" 1502 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" 1503 | 1504 | sshpk@^1.7.0: 1505 | version "1.13.0" 1506 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c" 1507 | dependencies: 1508 | asn1 "~0.2.3" 1509 | assert-plus "^1.0.0" 1510 | dashdash "^1.12.0" 1511 | getpass "^0.1.1" 1512 | optionalDependencies: 1513 | bcrypt-pbkdf "^1.0.0" 1514 | ecc-jsbn "~0.1.1" 1515 | jodid25519 "^1.0.0" 1516 | jsbn "~0.1.0" 1517 | tweetnacl "~0.14.0" 1518 | 1519 | string-width@^1.0.1: 1520 | version "1.0.2" 1521 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1522 | dependencies: 1523 | code-point-at "^1.0.0" 1524 | is-fullwidth-code-point "^1.0.0" 1525 | strip-ansi "^3.0.0" 1526 | 1527 | string_decoder@~1.0.0: 1528 | version "1.0.0" 1529 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.0.tgz#f06f41157b664d86069f84bdbdc9b0d8ab281667" 1530 | dependencies: 1531 | buffer-shims "~1.0.0" 1532 | 1533 | stringstream@~0.0.4: 1534 | version "0.0.5" 1535 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 1536 | 1537 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1538 | version "3.0.1" 1539 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1540 | dependencies: 1541 | ansi-regex "^2.0.0" 1542 | 1543 | strip-json-comments@~2.0.1: 1544 | version "2.0.1" 1545 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1546 | 1547 | supports-color@^2.0.0: 1548 | version "2.0.0" 1549 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1550 | 1551 | tar-pack@^3.4.0: 1552 | version "3.4.0" 1553 | resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" 1554 | dependencies: 1555 | debug "^2.2.0" 1556 | fstream "^1.0.10" 1557 | fstream-ignore "^1.0.5" 1558 | once "^1.3.3" 1559 | readable-stream "^2.1.4" 1560 | rimraf "^2.5.1" 1561 | tar "^2.2.1" 1562 | uid-number "^0.0.6" 1563 | 1564 | tar@^2.2.1: 1565 | version "2.2.1" 1566 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" 1567 | dependencies: 1568 | block-stream "*" 1569 | fstream "^1.0.2" 1570 | inherits "2" 1571 | 1572 | to-fast-properties@^1.0.1: 1573 | version "1.0.2" 1574 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" 1575 | 1576 | tough-cookie@~2.3.0: 1577 | version "2.3.2" 1578 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" 1579 | dependencies: 1580 | punycode "^1.4.1" 1581 | 1582 | trim-right@^1.0.1: 1583 | version "1.0.1" 1584 | resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" 1585 | 1586 | tunnel-agent@^0.6.0: 1587 | version "0.6.0" 1588 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 1589 | dependencies: 1590 | safe-buffer "^5.0.1" 1591 | 1592 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 1593 | version "0.14.5" 1594 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 1595 | 1596 | uid-number@^0.0.6: 1597 | version "0.0.6" 1598 | resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" 1599 | 1600 | user-home@^1.1.1: 1601 | version "1.1.1" 1602 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" 1603 | 1604 | util-deprecate@~1.0.1: 1605 | version "1.0.2" 1606 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1607 | 1608 | uuid@^3.0.0: 1609 | version "3.0.1" 1610 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" 1611 | 1612 | v8flags@^2.0.10: 1613 | version "2.1.1" 1614 | resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" 1615 | dependencies: 1616 | user-home "^1.1.1" 1617 | 1618 | verror@1.3.6: 1619 | version "1.3.6" 1620 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" 1621 | dependencies: 1622 | extsprintf "1.0.2" 1623 | 1624 | wide-align@^1.1.0: 1625 | version "1.1.0" 1626 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" 1627 | dependencies: 1628 | string-width "^1.0.1" 1629 | 1630 | wrappy@1: 1631 | version "1.0.2" 1632 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1633 | --------------------------------------------------------------------------------