diff --git a/.babelrc b/.babelrc index facd1809..5ae6451c 100644 --- a/.babelrc +++ b/.babelrc @@ -1,3 +1,3 @@ { - "presets": ["es2015", "react"] -} \ No newline at end of file + "presets": ["react", "latest", "stage-2"] +} diff --git a/.codeclimate.yml b/.codeclimate.yml new file mode 100644 index 00000000..821c1a18 --- /dev/null +++ b/.codeclimate.yml @@ -0,0 +1,17 @@ +engines: + eslint: + enabled: true + channel: "eslint-3" + duplication: + enabled: true + config: + languages: + javascript: +ratings: + paths: + - lib/** + - "**.js" +exclude_paths: + - "specs/" + - "dist/" + - "examples/" diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 00000000..91f52e05 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,25 @@ +module.exports = { + "env": { + "es6": true, + "browser": true + }, + "extends": "airbnb", + "parserOptions": { + "ecmaVersion": 7, + "ecmaFeatures": { + "experimentalObjectRestSpread": true, + "jsx": true + }, + "sourceType": "module" + }, + "parser": "babel-eslint", + rules: { + "comma-dangle": [2, "only-multiline"], + "max-len": [1, {"code": 140}], + "no-continue": [0], + "no-plusplus": [0], + "space-before-function-paren": [2, "always"], + "import/no-extraneous-dependencies": [2, {"devDependencies": true}], + "react/jsx-filename-extension": ["error", {"extensions": [".js"]}] + }, +}; diff --git a/.gitignore b/.gitignore index 3d6fc093..ae8e3dce 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ examples/**/*-bundle.js node_modules/ .idea/ _book +coverage diff --git a/.travis.yml b/.travis.yml index 29a568b7..d87c7500 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,15 @@ language: node_js node_js: - "7" - - "6" - - "5" - - "4" before_script: - export DISPLAY=:99.0 - sh -e /etc/init.d/xvfb start +after_success: + - cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js +script: npm run test:full +cache: yarn +addons: + sauce_connect: + username: "cd-reactmodal" + jwt: + secure: PpSLvFVrzYYh5zn4SXSkhDsQ3lRxCa4yOwjbVCy3C3smQxgJLKDCHTBp4OcwDlDfPjSsq4nKaQcsOJa9DlduAxMIW98t6pQelqLD9aaEGDbdzyJ4qx5G3fTs6AdU8WJuvVY145zaRcgUdejs5Ii9j1rMna3yS9HfGRE5r4aHNhE= diff --git a/LICENSE b/LICENSE index b4846b87..ce689cb8 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2014 Ryan Florence +Copyright (c) 2017 Ryan Florence Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in diff --git a/README.md b/README.md index a99339a0..b751aa2e 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,11 @@ Accessible modal dialog component for React.JS +[![Code Climate](https://codeclimate.com/github/reactjs/react-modal/badges/gpa.svg)](https://codeclimate.com/github/reactjs/react-modal) +[![Coverage Status](https://coveralls.io/repos/github/reactjs/react-modal/badge.svg?branch=master)](https://coveralls.io/github/reactjs/react-modal?branch=master) + +[![Build Status](https://saucelabs.com/browser-matrix/cd-reactmodal.svg)](https://saucelabs.com/beta/builds/ad582339a83145e1a4d3e8b8a1809b6c) + ## Active Development The modal is currently undergoing significant development for a v2 release. The `master` branch contains that development work. If you'd like to see the latest stable version please use the release tags (https://github.com/reactjs/react-modal/releases) @@ -119,9 +124,9 @@ You can use this to remove scrolling on the the body while the modal is open. Inside an app: ```js -var React = require('react'); -var ReactDOM = require('react-dom'); -var Modal = require('react-modal'); +import React from 'react'; +import ReactDOM from 'react-dom'; +import Modal from 'react-modal'; /* @@ -136,7 +141,7 @@ Modal.setAppElement(appElement); Modal.setAppElement('#your-app-element'); */ -var appElement = document.getElementById('your-app-element'); +const appElement = document.getElementById('your-app-element'); @@ -152,26 +157,33 @@ const customStyles = { }; -var App = React.createClass({ +class App extends React.Component { + constructor() { + super(); - getInitialState: function() { - return { modalIsOpen: false }; - }, + this.state = { + modalIsOpen: false + }; - openModal: function() { + this.openModal = this.openModal.bind(this); + this.afterOpenModal = this.afterOpenModal.bind(this); + this.closeModal = this.closeModal.bind(this); + } + + openModal() { this.setState({modalIsOpen: true}); - }, + } - afterOpenModal: function() { + afterOpenModal() { // references are now sync'd and can be accessed. this.refs.subtitle.style.color = '#f00'; - }, + } - closeModal: function() { + closeModal() { this.setState({modalIsOpen: false}); - }, + } - render: function() { + render() { return (
@@ -197,9 +209,9 @@ var App = React.createClass({
); } -}); +} -ReactDOM.render(, appElement); +ReactDOM.render(, appElement); ``` # Testing diff --git a/eslint.json b/eslint.json deleted file mode 100644 index 2035fb08..00000000 --- a/eslint.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "env": { - "browser": true, - "node": true - }, - "rules": { - "quotes": 0, - "no-comma-dangle": 2, - "no-underscore-dangle": 0, - "curly": 0, - "strict": 0, - "no-use-before-define": 0, - "no-cond-assign": 0, - "consistent-return": 0, - "new-cap": 0, - "no-unused-vars": 0 - } -} diff --git a/examples/basic/app.js b/examples/basic/app.js index 648296a9..167ddc30 100644 --- a/examples/basic/app.js +++ b/examples/basic/app.js @@ -1,6 +1,6 @@ -var React = require('react'); -var ReactDOM = require('react-dom'); -var Modal = require('../../lib/index'); +import React from 'react'; +import ReactDOM from 'react-dom'; +import Modal from '../../lib/index'; var appElement = document.getElementById('example'); @@ -9,25 +9,34 @@ Modal.setAppElement('#example'); var App = React.createClass({ getInitialState: function() { - return { modalIsOpen: false }; + return { modalIsOpen: false, modal2: false }; }, openModal: function() { - this.setState({modalIsOpen: true}); + this.setState({ ...this.state, modalIsOpen: true }); }, closeModal: function() { - this.setState({modalIsOpen: false}); + this.setState({ ...this.state, modalIsOpen: false }); + }, + + openSecondModal: function(event) { + event.preventDefault(); + this.setState({ ...this.state, modal2:true }); + }, + + closeSecondModal: function() { + this.setState({ ...this.state, modal2:false }); }, handleModalCloseRequest: function() { // opportunity to validate something and keep the modal open even if it // requested to be closed - this.setState({modalIsOpen: false}); + this.setState({ ...this.state, modalIsOpen: false }); }, handleInputChange: function() { - this.setState({foo: 'bar'}); + this.setState({ foo: 'bar' }); }, handleOnAfterOpenModal: function() { @@ -38,9 +47,11 @@ var App = React.createClass({ render: function() { return (
- + + hi + + {}} + onRequestClose={this.closeSecondModal}> +

test

+
); } diff --git a/karma.conf.js b/karma.conf.js index 3fe4df80..bccda717 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -1,4 +1,69 @@ -module.exports = function(config) { +const webpackTestConfig = require('./webpack.test.config'); + +module.exports = function karmaConfig (config) { + let browsers = []; + const customLaunchers = {}; + + const reporters = []; + + function createCustomLauncher (browser, version, platform) { + return { + base: 'SauceLabs', + browserName: browser, + version, + platform + }; + } + + if (process.env.SAUCE_USERNAME || process.env.SAUCE_ACCESS_KEY) { + const OPTIONS = [ + 'SAUCE_CHROME', + 'SAUCE_FIREFOX', + 'SAUCE_SAFARI', + 'SAUCE_IE', + 'SAUCE_EDGE', + ]; + + let runAll = true; + + OPTIONS.forEach((opt) => { + if (process.env[opt]) { + runAll = false; + } + }); + + // Chrome + if (runAll || process.env.SAUCE_CHROME) { + customLaunchers.SL_Chrome = createCustomLauncher('chrome'); + } + + // Firefox + if (runAll || process.env.SAUCE_FIREFOX) { + customLaunchers.SL_Firefox = createCustomLauncher('firefox'); + } + + // Safari + if (runAll || process.env.SAUCE_SAFARI) { + customLaunchers.SL_Safari10 = createCustomLauncher('safari', 10); + customLaunchers.SL_Safari9 = createCustomLauncher('safari', 9); + } + + // IE + if (runAll || process.env.SAUCE_IE) { + customLaunchers.SL_IE11 = createCustomLauncher('internet explorer', 11, 'Windows 10'); + } + + // Edge + if (runAll || process.env.SAUCE_EDGE) { + customLaunchers.SL_Edge = createCustomLauncher('microsoftedge', null, 'Windows 10'); + } + + browsers = Object.keys(customLaunchers); + reporters.push('saucelabs'); + } else { + browsers = [(process.env.CONTINUOUS_INTEGRATION) ? 'Firefox' : 'Chrome']; + } + config.set({ basePath: '', @@ -10,21 +75,27 @@ module.exports = function(config) { ], preprocessors: { - 'specs/spec_index.js': [ 'webpack', 'sourcemap' ] + 'specs/spec_index.js': ['webpack', 'sourcemap'] }, - webpack: require('./webpack.test.config'), + webpack: webpackTestConfig, webpackMiddleware: { stats: 'errors-only' }, - reporters: ['mocha'], + reporters: ['mocha', 'coverage'].concat(reporters), mochaReporter: { showDiff: true }, + coverageReporter: { + type: 'lcov', + dir: 'coverage/', + subdir: '.' + }, + port: 9876, colors: true, @@ -33,10 +104,25 @@ module.exports = function(config) { autoWatch: true, - browsers: [ (process.env.CONTINUOUS_INTEGRATION) ? 'Firefox' : 'Chrome' ], + browsers, + customLaunchers, + + // Increase timeouts to prevent the issue with disconnected tests (https://goo.gl/nstA69) + captureTimeout: 4 * 60 * 1000, + browserDisconnectTimeout: 10000, + browserDisconnectTolerance: 1, + browserNoActivityTimeout: 4 * 60 * 1000, - captureTimeout: 60000, + singleRun: (process.env.CONTINUOUS_INTEGRATION), - singleRun: (process.env.CONTINUOUS_INTEGRATION) + // SauceLabs config + sauceLabs: { + recordScreenshots: false, + connectOptions: { + port: 5757, + logfile: 'sauce_connect.log' + }, + public: 'public' + } }); }; diff --git a/lib/components/Modal.js b/lib/components/Modal.js index 61e6de59..93f8e922 100644 --- a/lib/components/Modal.js +++ b/lib/components/Modal.js @@ -1,34 +1,23 @@ -var React = require('react'); -var ReactDOM = require('react-dom'); -var ExecutionEnvironment = require('exenv'); -var ModalPortal = React.createFactory(require('./ModalPortal')); -var ariaAppHider = require('../helpers/ariaAppHider'); -var elementClass = require('element-class'); -var renderSubtreeIntoContainer = require("react-dom").unstable_renderSubtreeIntoContainer; -var Assign = require('lodash.assign'); - -var SafeHTMLElement = ExecutionEnvironment.canUseDOM ? window.HTMLElement : {}; -var AppElement = ExecutionEnvironment.canUseDOM ? document.body : {appendChild: function() {}}; - -function getParentElement(parentSelector) { +import React, { Component } from 'react'; +import ReactDOM from 'react-dom'; +import ExecutionEnvironment from 'exenv'; +import elementClass from 'element-class'; +import ModalPortal from './ModalPortal'; +import * as ariaAppHider from '../helpers/ariaAppHider'; +import * as refCount from '../helpers/refCount'; + +const renderSubtreeIntoContainer = ReactDOM.unstable_renderSubtreeIntoContainer; + +const SafeHTMLElement = ExecutionEnvironment.canUseDOM ? window.HTMLElement : {}; + +function getParentElement (parentSelector) { return parentSelector(); } -var Modal = React.createClass({ - - displayName: 'Modal', - statics: { - setAppElement: function(element) { - AppElement = ariaAppHider.setElement(element); - }, - injectCSS: function() { - "production" !== process.env.NODE_ENV - && console.warn('React-Modal: injectCSS has been deprecated ' + - 'and no longer has any effect. It will be removed in a later version'); - } - }, +export default class Modal extends Component { - propTypes: { + /* eslint-disable react/no-unused-prop-types */ + static propTypes = { isOpen: React.PropTypes.bool.isRequired, style: React.PropTypes.shape({ content: React.PropTypes.object, @@ -44,53 +33,96 @@ var Modal = React.createClass({ parentSelector: React.PropTypes.func, role: React.PropTypes.string, contentLabel: React.PropTypes.string.isRequired - }, - - getDefaultProps: function () { - return { - isOpen: false, - portalClassName: 'ReactModalPortal', - ariaHideApp: true, - closeTimeoutMS: 0, - shouldCloseOnOverlayClick: true, - parentSelector: function () { return document.body; } - }; - }, - - componentDidMount: function() { + }; + /* eslint-enable react/no-unused-prop-types */ + + static defaultProps = { + isOpen: false, + portalClassName: 'ReactModalPortal', + ariaHideApp: true, + closeTimeoutMS: 0, + shouldCloseOnOverlayClick: true, + parentSelector () { return document.body; } + }; + + static defaultStyles = { + overlay: { + position: 'fixed', + top: 0, + left: 0, + right: 0, + bottom: 0, + backgroundColor: 'rgba(255, 255, 255, 0.75)' + }, + content: { + position: 'absolute', + top: '40px', + left: '40px', + right: '40px', + bottom: '40px', + border: '1px solid #ccc', + background: '#fff', + overflow: 'auto', + WebkitOverflowScrolling: 'touch', + borderRadius: '4px', + outline: 'none', + padding: '20px' + } + }; + + static setAppElement (element) { + ariaAppHider.setElement(element); + } + + static injectCSS () { + return process.env.NODE_ENV !== 'production' + && console.warn('React-Modal: injectCSS has been deprecated ' + + 'and no longer has any effect. It will be removed in a later version'); + } + + componentDidMount () { this.node = document.createElement('div'); this.node.className = this.props.portalClassName; - var parent = getParentElement(this.props.parentSelector); + if (this.props.isOpen) refCount.add(this); + + const parent = getParentElement(this.props.parentSelector); parent.appendChild(this.node); this.renderPortal(this.props); - }, + } + + componentWillReceiveProps (newProps) { + if (newProps.isOpen) refCount.add(this); + if (!newProps.isOpen) refCount.remove(this); - componentWillReceiveProps: function(newProps) { - var currentParent = getParentElement(this.props.parentSelector); - var newParent = getParentElement(newProps.parentSelector); + const currentParent = getParentElement(this.props.parentSelector); + const newParent = getParentElement(newProps.parentSelector); - if(newParent !== currentParent) { + if (newParent !== currentParent) { currentParent.removeChild(this.node); newParent.appendChild(this.node); } this.renderPortal(newProps); - }, + } + + componentWillUnmount () { + refCount.remove(this); - componentWillUnmount: function() { if (this.props.ariaHideApp) { ariaAppHider.show(this.props.appElement); } ReactDOM.unmountComponentAtNode(this.node); - var parent = getParentElement(this.props.parentSelector); + const parent = getParentElement(this.props.parentSelector); parent.removeChild(this.node); - elementClass(document.body).remove('ReactModal__Body--open'); - }, + if (refCount.count() === 0) { + elementClass(document.body).remove('ReactModal__Body--open'); + } + } - renderPortal: function(props) { - if (props.isOpen) { + renderPortal (props) { + if (props.isOpen || refCount.count() > 0) { elementClass(document.body).add('ReactModal__Body--open'); } else { elementClass(document.body).remove('ReactModal__Body--open'); @@ -100,37 +132,14 @@ var Modal = React.createClass({ ariaAppHider.toggle(props.isOpen, props.appElement); } - this.portal = renderSubtreeIntoContainer(this, ModalPortal(Assign({}, props, {defaultStyles: Modal.defaultStyles})), this.node); - }, - - render: function () { - return React.DOM.noscript(); + this.portal = renderSubtreeIntoContainer(this, + , this.node); } -}); - -Modal.defaultStyles = { - overlay: { - position : 'fixed', - top : 0, - left : 0, - right : 0, - bottom : 0, - backgroundColor : 'rgba(255, 255, 255, 0.75)' - }, - content: { - position : 'absolute', - top : '40px', - left : '40px', - right : '40px', - bottom : '40px', - border : '1px solid #ccc', - background : '#fff', - overflow : 'auto', - WebkitOverflowScrolling : 'touch', - borderRadius : '4px', - outline : 'none', - padding : '20px' + + render () { + return null; } } - -module.exports = Modal diff --git a/lib/components/ModalPortal.js b/lib/components/ModalPortal.js index e7d056a0..246d07db 100644 --- a/lib/components/ModalPortal.js +++ b/lib/components/ModalPortal.js @@ -1,11 +1,16 @@ -var React = require('react'); -var div = React.DOM.div; -var focusManager = require('../helpers/focusManager'); -var scopeTab = require('../helpers/scopeTab'); -var Assign = require('lodash.assign'); +import React, { Component, PropTypes } from 'react'; +import Assign from 'lodash.assign'; +import scopeTab from '../helpers/scopeTab'; +import { + returnFocus, + setupScopedFocus, + teardownScopedFocus, + markForFocusLater +} from '../helpers/focusManager'; + // so that our CSS is statically analyzable -var CLASS_NAMES = { +const CLASS_NAMES = { overlay: { base: 'ReactModal__Overlay', afterOpen: 'ReactModal__Overlay--after-open', @@ -18,40 +23,53 @@ var CLASS_NAMES = { } }; -var ModalPortal = module.exports = React.createClass({ - - displayName: 'ModalPortal', - shouldClose: null, - - getDefaultProps: function() { - return { - style: { - overlay: {}, - content: {} - } - }; - }, +export default class ModalPortal extends Component { + static propTypes = { + isOpen: PropTypes.bool.isRequired, + onAfterOpen: PropTypes.func, + closeTimeoutMS: PropTypes.number, + shouldCloseOnOverlayClick: PropTypes.bool, + onRequestClose: PropTypes.func, + className: PropTypes.string, + overlayClassName: PropTypes.string, + defaultStyles: PropTypes.shape({ + content: PropTypes.object, + overlay: PropTypes.object + }), + style: PropTypes.shape({ + content: PropTypes.object, + overlay: PropTypes.object + }), + role: PropTypes.string, + children: PropTypes.node, + contentLabel: PropTypes.string + }; + + static defaultProps = { + style: { + overlay: {}, + content: {} + } + }; - getInitialState: function() { - return { + constructor () { + super(); + this.state = { afterOpen: false, beforeClose: false }; - }, + this.shouldClose = null; + } - componentDidMount: function() { + componentDidMount () { // Focus needs to be set when mounting and already open if (this.props.isOpen) { this.setFocusAfterRender(true); this.open(); } - }, - - componentWillUnmount: function() { - clearTimeout(this.closeTimer); - }, + } - componentWillReceiveProps: function(newProps) { + componentWillReceiveProps (newProps) { // Focus only needs to be set once when the modal is being opened if (!this.props.isOpen && newProps.isOpen) { this.setFocusAfterRender(true); @@ -59,153 +77,155 @@ var ModalPortal = module.exports = React.createClass({ } else if (this.props.isOpen && !newProps.isOpen) { this.close(); } - }, + } - componentDidUpdate: function () { + componentDidUpdate () { if (this.focusAfterRender) { this.focusContent(); this.setFocusAfterRender(false); } - }, + } + + componentWillUnmount () { + clearTimeout(this.closeTimer); + } - setFocusAfterRender: function (focus) { + setFocusAfterRender (focus) { this.focusAfterRender = focus; - }, + } - open: function() { + afterClose = () => { + returnFocus(); + teardownScopedFocus(); + } + + open () { if (this.state.afterOpen && this.state.beforeClose) { clearTimeout(this.closeTimer); this.setState({ beforeClose: false }); } else { - focusManager.setupScopedFocus(this.node); - focusManager.markForFocusLater(); - this.setState({isOpen: true}, function() { - this.setState({afterOpen: true}); + setupScopedFocus(this.node); + markForFocusLater(); + this.setState({ isOpen: true }, () => { + this.setState({ afterOpen: true }); if (this.props.isOpen && this.props.onAfterOpen) { this.props.onAfterOpen(); } - }.bind(this)); + }); } - }, + } - close: function() { - if (this.props.closeTimeoutMS > 0) + close () { + if (this.props.closeTimeoutMS > 0) { this.closeWithTimeout(); - else + } else { this.closeWithoutTimeout(); - }, + } + } - focusContent: function() { + focusContent () { // Don't steal focus from inner elements if (!this.contentHasFocus()) { - this.refs.content.focus(); + this.content.focus(); } - }, + } - closeWithTimeout: function() { - this.setState({beforeClose: true}, function() { + closeWithTimeout () { + this.setState({ beforeClose: true }, () => { this.closeTimer = setTimeout(this.closeWithoutTimeout, this.props.closeTimeoutMS); - }.bind(this)); - }, + }); + } - closeWithoutTimeout: function() { + closeWithoutTimeout = () => { this.setState({ beforeClose: false, isOpen: false, afterOpen: false, - }, this.afterClose); - }, - - afterClose: function() { - focusManager.returnFocus(); - focusManager.teardownScopedFocus(); - }, + }, () => this.afterClose()); + } - handleKeyDown: function(event) { - if (event.keyCode == 9 /*tab*/) scopeTab(this.refs.content, event); - if (event.keyCode == 27 /*esc*/) { + handleKeyDown = (event) => { + if (event.keyCode === 9 /* tab*/) scopeTab(this.content, event); + if (event.keyCode === 27 /* esc*/) { event.preventDefault(); this.requestClose(event); } - }, + } - handleOverlayMouseDown: function(event) { + handleOverlayOnClick = (event) => { if (this.shouldClose === null) { this.shouldClose = true; } - }, - - handleOverlayMouseUp: function(event) { if (this.shouldClose && this.props.shouldCloseOnOverlayClick) { - if (this.ownerHandlesClose()) + if (this.ownerHandlesClose()) { this.requestClose(event); - else + } else { this.focusContent(); + } } this.shouldClose = null; - }, - - handleContentMouseDown: function(event) { - this.shouldClose = false; - }, + } - handleContentMouseUp: function(event) { + handleContentOnClick = () => { this.shouldClose = false; - }, + } - requestClose: function(event) { - if (this.ownerHandlesClose()) + requestClose (event) { + if (this.ownerHandlesClose()) { this.props.onRequestClose(event); - }, + } + } - ownerHandlesClose: function() { + ownerHandlesClose () { return this.props.onRequestClose; - }, + } - shouldBeClosed: function() { + shouldBeClosed () { return !this.props.isOpen && !this.state.beforeClose; - }, + } - contentHasFocus: function() { - return document.activeElement === this.refs.content || this.refs.content.contains(document.activeElement); - }, + contentHasFocus () { + return document.activeElement === this.content || this.content.contains(document.activeElement); + } - buildClassName: function(which, additional) { - var className = CLASS_NAMES[which].base; - if (this.state.afterOpen) - className += ' '+CLASS_NAMES[which].afterOpen; - if (this.state.beforeClose) - className += ' '+CLASS_NAMES[which].beforeClose; - return additional ? className + ' ' + additional : className; - }, + buildClassName (which, additional) { + let className = CLASS_NAMES[which].base; + if (this.state.afterOpen) { className += ` ${CLASS_NAMES[which].afterOpen}`; } + if (this.state.beforeClose) { + className += ` ${CLASS_NAMES[which].beforeClose}`; + } + return additional ? `${className} ${additional}` : className; + } - render: function() { - var contentStyles = (this.props.className) ? {} : this.props.defaultStyles.content; - var overlayStyles = (this.props.overlayClassName) ? {} : this.props.defaultStyles.overlay; - - return this.shouldBeClosed() ? div() : ( - div({ - ref: "overlay", - className: this.buildClassName('overlay', this.props.overlayClassName), - style: Assign({}, overlayStyles, this.props.style.overlay || {}), - onMouseDown: this.handleOverlayMouseDown, - onMouseUp: this.handleOverlayMouseUp - }, - div({ - ref: "content", - style: Assign({}, contentStyles, this.props.style.content || {}), - className: this.buildClassName('content', this.props.className), - tabIndex: "-1", - onKeyDown: this.handleKeyDown, - onMouseDown: this.handleContentMouseDown, - onMouseUp: this.handleContentMouseUp, - role: this.props.role, - "aria-label": this.props.contentLabel - }, - this.props.children - ) - ) + render () { + const contentStyles = (this.props.className) ? {} : this.props.defaultStyles.content; + const overlayStyles = (this.props.overlayClassName) ? {} : this.props.defaultStyles.overlay; + + // Disabling this rule is okay, since we know what is going on here, that being said + // longterm we should probably do this better. + /* eslint-disable jsx-a11y/no-static-element-interactions */ + return this.shouldBeClosed() ?
: ( +
{ this.overlay = c; }} + className={this.buildClassName('overlay', this.props.overlayClassName)} + style={Assign({}, overlayStyles, this.props.style.overlay || {})} + onClick={this.handleOverlayOnClick} + > +
{ this.content = c; }} + style={Assign({}, contentStyles, this.props.style.content || {})} + className={this.buildClassName('content', this.props.className)} + tabIndex={-1} + onKeyDown={this.handleKeyDown} + onClick={this.handleContentOnClick} + role={this.props.role} + aria-label={this.props.contentLabel} + > + {this.props.children} +
+
); + /* eslint-enable jsx-a11y/no-static-element-interactions */ } -}); +} diff --git a/lib/helpers/ariaAppHider.js b/lib/helpers/ariaAppHider.js index 05b4c128..f5ee72e9 100644 --- a/lib/helpers/ariaAppHider.js +++ b/lib/helpers/ariaAppHider.js @@ -1,42 +1,37 @@ -var _element = typeof document !== 'undefined' ? document.body : null; +let globalElement = typeof document !== 'undefined' ? document.body : null; -function setElement(element) { - if (typeof element === 'string') { - var el = document.querySelectorAll(element); - element = 'length' in el ? el[0] : el; +function validateElement (appElement) { + if (!appElement && !globalElement) { + throw new Error('react-modal: You must set an element with `Modal.setAppElement(el)` to make this accessible'); } - _element = element || _element; - return _element; } -function hide(appElement) { - validateElement(appElement); - (appElement || _element).setAttribute('aria-hidden', 'true'); +export function setElement (element) { + let newElement = element; + if (typeof newElement === 'string') { + const el = document.querySelectorAll(element); + newElement = 'length' in el ? el[0] : el; + } + globalElement = newElement || globalElement; + return globalElement; } -function show(appElement) { +export function hide (appElement) { validateElement(appElement); - (appElement || _element).removeAttribute('aria-hidden'); + (appElement || globalElement).setAttribute('aria-hidden', 'true'); } -function toggle(shouldHide, appElement) { - if (shouldHide) - hide(appElement); - else - show(appElement); +export function show (appElement) { + validateElement(appElement); + (appElement || globalElement).removeAttribute('aria-hidden'); } -function validateElement(appElement) { - if (!appElement && !_element) - throw new Error('react-modal: You must set an element with `Modal.setAppElement(el)` to make this accessible'); +export function toggle (shouldHide, appElement) { + if (shouldHide) { + hide(appElement); + } else { show(appElement); } } -function resetForTesting() { - _element = document.body; +export function resetForTesting () { + globalElement = document.body; } - -exports.toggle = toggle; -exports.setElement = setElement; -exports.show = show; -exports.hide = hide; -exports.resetForTesting = resetForTesting; diff --git a/lib/helpers/focusManager.js b/lib/helpers/focusManager.js index 548f69db..42844ff7 100644 --- a/lib/helpers/focusManager.js +++ b/lib/helpers/focusManager.js @@ -1,13 +1,14 @@ -var findTabbable = require('../helpers/tabbable'); -var modalElement = null; -var focusLaterElement = null; -var needToFocus = false; +import findTabbable from './tabbable'; -function handleBlur(event) { +const focusLaterElements = []; +let modalElement = null; +let needToFocus = false; + +function handleBlur () { needToFocus = true; } -function handleFocus(event) { +function handleFocus () { if (needToFocus) { needToFocus = false; if (!modalElement) { @@ -15,33 +16,35 @@ function handleFocus(event) { } // need to see how jQuery shims document.on('focusin') so we don't need the // setTimeout, firefox doesn't support focusin, if it did, we could focus - // the element outside of a setTimeout. Side-effect of this implementation - // is that the document.body gets focus, and then we focus our element right + // the element outside of a setTimeout. Side-effect of this implementation + // is that the document.body gets focus, and then we focus our element right // after, seems fine. - setTimeout(function() { - if (modalElement.contains(document.activeElement)) + setTimeout(() => { + if (modalElement.contains(document.activeElement)) { return; - var el = (findTabbable(modalElement)[0] || modalElement); + } + const el = (findTabbable(modalElement)[0] || modalElement); el.focus(); }, 0); } } -exports.markForFocusLater = function() { - focusLaterElement = document.activeElement; -}; +export function markForFocusLater () { + focusLaterElements.push(document.activeElement); +} -exports.returnFocus = function() { +export function returnFocus () { + let toFocus = null; try { - focusLaterElement.focus(); + toFocus = focusLaterElements.pop(); + toFocus.focus(); + return; + } catch (e) { + console.warn(`You tried to return focus to ${toFocus} but it is not in the DOM anymore`); } - catch (e) { - console.warn('You tried to return focus to '+focusLaterElement+' but it is not in the DOM anymore'); - } - focusLaterElement = null; -}; +} -exports.setupScopedFocus = function(element) { +export function setupScopedFocus (element) { modalElement = element; if (window.addEventListener) { @@ -51,9 +54,9 @@ exports.setupScopedFocus = function(element) { window.attachEvent('onBlur', handleBlur); document.attachEvent('onFocus', handleFocus); } -}; +} -exports.teardownScopedFocus = function() { +export function teardownScopedFocus () { modalElement = null; if (window.addEventListener) { @@ -63,6 +66,4 @@ exports.teardownScopedFocus = function() { window.detachEvent('onBlur', handleBlur); document.detachEvent('onFocus', handleFocus); } -}; - - +} diff --git a/lib/helpers/refCount.js b/lib/helpers/refCount.js new file mode 100644 index 00000000..8bcfdd49 --- /dev/null +++ b/lib/helpers/refCount.js @@ -0,0 +1,19 @@ +const modals = []; + +export function add (element) { + if (modals.indexOf(element) === -1) { + modals.push(element); + } +} + +export function remove (element) { + const index = modals.indexOf(element); + if (index === -1) { + return; + } + modals.splice(index, 1); +} + +export function count () { + return modals.length; +} diff --git a/lib/helpers/scopeTab.js b/lib/helpers/scopeTab.js index d368bd8f..8df67faf 100644 --- a/lib/helpers/scopeTab.js +++ b/lib/helpers/scopeTab.js @@ -1,19 +1,19 @@ -var findTabbable = require('../helpers/tabbable'); +import findTabbable from './tabbable'; -module.exports = function(node, event) { - var tabbable = findTabbable(node); +export default function scopeTab (node, event) { + const tabbable = findTabbable(node); if (!tabbable.length) { - event.preventDefault(); - return; + event.preventDefault(); + return; } - var finalTabbable = tabbable[event.shiftKey ? 0 : tabbable.length - 1]; - var leavingFinalTabbable = ( + const finalTabbable = tabbable[event.shiftKey ? 0 : tabbable.length - 1]; + const leavingFinalTabbable = ( finalTabbable === document.activeElement || // handle immediate shift+tab after opening with mouse node === document.activeElement ); if (!leavingFinalTabbable) return; event.preventDefault(); - var target = tabbable[event.shiftKey ? tabbable.length - 1 : 0]; + const target = tabbable[event.shiftKey ? tabbable.length - 1 : 0]; target.focus(); -}; +} diff --git a/lib/helpers/tabbable.js b/lib/helpers/tabbable.js index 4b04f88b..26b8ccdf 100644 --- a/lib/helpers/tabbable.js +++ b/lib/helpers/tabbable.js @@ -10,41 +10,40 @@ * http://api.jqueryui.com/category/ui-core/ */ -function focusable(element, isTabIndexNotNaN) { - var nodeName = element.nodeName.toLowerCase(); - return (/input|select|textarea|button|object/.test(nodeName) ? - !element.disabled : - "a" === nodeName ? - element.href || isTabIndexNotNaN : - isTabIndexNotNaN) && visible(element); -} + function hidden (el) { + return (el.offsetWidth <= 0 && el.offsetHeight <= 0) || + el.style.display === 'none'; + } -function hidden(el) { - return (el.offsetWidth <= 0 && el.offsetHeight <= 0) || - el.style.display === 'none'; -} + function visible (element) { + let ourElement = element; + while (ourElement) { + if (ourElement === document.body) break; + if (hidden(ourElement)) return false; + ourElement = ourElement.parentNode; + } + return true; + } -function visible(element) { - while (element) { - if (element === document.body) break; - if (hidden(element)) return false; - element = element.parentNode; - } - return true; -} + function focusable (element, isTabIndexNotNaN) { + const nodeName = element.nodeName.toLowerCase(); + const isFocusableLink = nodeName === 'a' ? + element.href || isTabIndexNotNaN : isTabIndexNotNaN; + return (/input|select|textarea|button|object/.test(nodeName) ? + !element.disabled : isFocusableLink + ) && visible(element); + } -function tabbable(element) { - var tabIndex = element.getAttribute('tabindex'); - if (tabIndex === null) tabIndex = undefined; - var isTabIndexNaN = isNaN(tabIndex); - return (isTabIndexNaN || tabIndex >= 0) && focusable(element, !isTabIndexNaN); -} -function findTabbableDescendants(element) { - return [].slice.call(element.querySelectorAll('*'), 0).filter(function(el) { - return tabbable(el); - }); -} + function tabbable (element) { + let tabIndex = element.getAttribute('tabindex'); + if (tabIndex === null) tabIndex = undefined; + const isTabIndexNaN = isNaN(tabIndex); + return (isTabIndexNaN || tabIndex >= 0) && focusable(element, !isTabIndexNaN); + } -module.exports = findTabbableDescendants; + function findTabbableDescendants (element) { + return [].slice.call(element.querySelectorAll('*'), 0).filter(el => tabbable(el)); + } + export default findTabbableDescendants; diff --git a/lib/index.js b/lib/index.js index adfa4481..8ecf0994 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,2 +1,3 @@ -module.exports = require('./components/Modal'); +import Modal from './components/Modal'; +export default Modal; diff --git a/package.json b/package.json index 25f0b685..c4e9de17 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ }, "scripts": { "test": "NODE_ENV=test karma start", + "test:full": "npm-run-all -p 'test -- --single-run' lint", "start": "scripts/dev-examples", "docs": "npm-run-all docs:*", "docs-dev": "npm-run-all docs:clean docs:prepare docs:build:watch", @@ -21,7 +22,8 @@ "docs:prepare": "gitbook install", "docs:build": "gitbook build -g reactjs/react-modal", "docs:build:watch": "gitbook serve", - "docs:publish": "cd _book && git init && git commit --allow-empty -m 'update book' && git checkout -b gh-pages && touch .nojekyll && git add . && git commit -am 'update book' && git push git@github.com:reactjs/react-modal gh-pages --force" + "docs:publish": "cd _book && git init && git commit --allow-empty -m 'update book' && git checkout -b gh-pages && touch .nojekyll && git add . && git commit -am 'update book' && git push git@github.com:reactjs/react-modal gh-pages --force", + "lint": "eslint lib/ specs/" }, "authors": [ "Ryan Florence" @@ -29,18 +31,31 @@ "license": "MIT", "devDependencies": { "babel-core": "^6.7.4", + "babel-eslint": "^7.1.1", "babel-loader": "^6.2.4", "babel-preset-es2015": "^6.6.0", + "babel-preset-latest": "^6.16.0", "babel-preset-react": "^6.5.0", + "babel-preset-stage-2": "^6.18.0", + "codeclimate-test-reporter": "^0.4.0", + "coveralls": "^2.11.15", "envify": "^3.4.1", - "expect": "^1.20.2", + "eslint": "^3.9.1", + "eslint-config-airbnb": "latest", + "eslint-plugin-import": "^2.1.0", + "eslint-plugin-jsx-a11y": "^2.2.3", + "eslint-plugin-react": "^6.6.0", + "expect": "1.10.0", "gitbook-cli": "^2.3.0", + "istanbul-instrumenter-loader": "0.2.0", "karma": "^1.3.0", "karma-chrome-launcher": "2.0.0", "karma-cli": "1.0.1", + "karma-coverage": "^1.1.1", "karma-firefox-launcher": "1.0.0", "karma-mocha": "^1.3.0", "karma-mocha-reporter": "^2.2.1", + "karma-sauce-launcher": "^1.1.0", "karma-sourcemap-loader": "^0.3.7", "karma-webpack": "^1.8.1", "mocha": "3.2.0", @@ -75,4 +90,4 @@ "modal", "dialog" ] -} \ No newline at end of file +} diff --git a/specs/Modal.spec.js b/specs/Modal.spec.js index c4003609..c893c430 100644 --- a/specs/Modal.spec.js +++ b/specs/Modal.spec.js @@ -1,38 +1,44 @@ /* eslint-env mocha */ -import { renderModal, unmountModal } from './helper'; + +// The following eslint overrides should be removed when refactoring can occur + +/* eslint react/no-find-dom-node: "warn", + react/no-render-return-value: "warn" +*/ import TestUtils from 'react-addons-test-utils'; import React from 'react'; +import sinon from 'sinon'; +import expect from 'expect'; import ReactDOM from 'react-dom'; import Modal from '../lib/components/Modal'; -import ariaAppHider from '../lib/helpers/ariaAppHider'; +import * as ariaAppHider from '../lib/helpers/ariaAppHider'; +import { renderModal, unmountModal } from './helper'; + const Simulate = TestUtils.Simulate; -import sinon from 'sinon'; -import expect from 'expect'; -describe('Modal', function () { +describe('Modal', () => { it('scopes tab navigation to the modal'); it('focuses the last focused element when tabbing in from browser chrome'); - - it('can be open initially', function() { - var component = renderModal({isOpen: true}, 'hello'); - expect(component.portal.refs.content.innerHTML.trim()).toEqual('hello'); + it('can be open initially', () => { + const component = renderModal({ isOpen: true }, 'hello'); + expect(component.portal.content.innerHTML.trim()).toEqual('hello'); unmountModal(); }); - it('can be closed initially', function() { - var component = renderModal({}, 'hello'); + it('can be closed initially', () => { + const component = renderModal({}, 'hello'); expect(ReactDOM.findDOMNode(component.portal).innerHTML.trim()).toEqual(''); unmountModal(); }); - it('accepts appElement as a prop', function() { - var el = document.createElement('div'); - var node = document.createElement('div'); + it('accepts appElement as a prop', () => { + const el = document.createElement('div'); + const node = document.createElement('div'); ReactDOM.render( , node); @@ -40,52 +46,48 @@ describe('Modal', function () { ReactDOM.unmountComponentAtNode(node); }); - it('renders into the body, not in context', function() { - var node = document.createElement('div'); - var App = React.createClass({ - render() { - return ( -
- - hello - -
- ); - } - }); + it('renders into the body, not in context', () => { + const node = document.createElement('div'); + const App = () => ( +
+ + hello + +
+ ); Modal.setAppElement(node); ReactDOM.render(, node); - var modalParent = document.body.querySelector('.ReactModalPortal').parentNode; + const modalParent = document.body.querySelector('.ReactModalPortal').parentNode; expect(modalParent).toEqual(document.body); ReactDOM.unmountComponentAtNode(node); }); - it('renders children', function() { - var child = 'I am a child of Modal, and he has sent me here...'; - var component = renderModal({isOpen: true}, child); - expect(component.portal.refs.content.innerHTML).toEqual(child); + it('renders children', () => { + const child = 'I am a child of Modal, and he has sent me here...'; + const component = renderModal({ isOpen: true }, child); + expect(component.portal.content.innerHTML).toEqual(child); unmountModal(); }); - it('renders the modal content with a dialog aria role when provided ', function () { - var child = 'I am a child of Modal, and he has sent me here...'; - var component = renderModal({isOpen: true, role: 'dialog'}, child); - expect(component.portal.refs.content.getAttribute('role')).toEqual('dialog'); + it('renders the modal content with a dialog aria role when provided ', () => { + const child = 'I am a child of Modal, and he has sent me here...'; + const component = renderModal({ isOpen: true, role: 'dialog' }, child); + expect(component.portal.content.getAttribute('role')).toEqual('dialog'); unmountModal(); }); - it('renders the modal with a aria-label based on the contentLabel prop', function () { - var child = 'I am a child of Modal, and he has sent me here...'; - var component = renderModal({isOpen: true, contentLabel: 'Special Modal'}, child); - expect(component.portal.refs.content.getAttribute('aria-label')).toEqual('Special Modal'); + it('renders the modal with a aria-label based on the contentLabel prop', () => { + const child = 'I am a child of Modal, and he has sent me here...'; + const component = renderModal({ isOpen: true, contentLabel: 'Special Modal' }, child); + expect(component.portal.content.getAttribute('aria-label')).toEqual('Special Modal'); unmountModal(); }); - it('has default props', function() { - var node = document.createElement('div'); + it('has default props', () => { + const node = document.createElement('div'); Modal.setAppElement(document.createElement('div')); - var component = ReactDOM.render(, node); - var props = component.props; + const component = ReactDOM.render(, node); + const props = component.props; expect(props.isOpen).toBe(false); expect(props.ariaHideApp).toBe(true); expect(props.closeTimeoutMS).toBe(0); @@ -95,136 +97,189 @@ describe('Modal', function () { Modal.setAppElement(document.body); // restore default }); - it('removes the portal node', function() { - var component = renderModal({isOpen: true}, 'hello'); - expect(component.portal.refs.content.innerHTML.trim()).toEqual('hello'); + it('removes the portal node', () => { + const component = renderModal({ isOpen: true }, 'hello'); + expect(component.portal.content.innerHTML.trim()).toEqual('hello'); unmountModal(); expect(!document.querySelector('.ReactModalPortal')).toExist(); }); - it('focuses the modal content', function() { - renderModal({isOpen: true}, null, function () { - expect(document.activeElement).toEqual(this.portal.refs.content); + it('focuses the modal content', () => { + renderModal({ isOpen: true }, null, function checkModalContentFocus () { + expect(document.activeElement).toEqual(this.portal.content); unmountModal(); }); }); - it('does not focus the modal content when a descendent is already focused', function() { - var input = ( + it('give back focus to previous element or modal.', (done) => { + function cleanup () { + unmountModal(); + done(); + } + const modal = renderModal({ + isOpen: true, + onRequestClose () { + cleanup(); + } + }, null, () => {}); + + renderModal({ + isOpen: true, + onRequestClose () { + unmountModal(); + Simulate.keyDown(modal.portal.content, { + // The keyCode is all that matters, so this works + key: 'FakeKeyToTestLater', + keyCode: 27, + which: 27 + }); + expect(document.activeElement).toEqual(modal.portal.content); + } + }, null, function checkPortalFocus () { + expect(document.activeElement).toEqual(this.portal.content); + Simulate.keyDown(this.portal.content, { + // The keyCode is all that matters, so this works + key: 'FakeKeyToTestLater', + keyCode: 27, + which: 27 + }); + }); + }); + + it('does not focus the modal content when a descendent is already focused', () => { + const input = ( { el && el.focus(); }} + ref={el => (el && el.focus())} /> ); - renderModal({isOpen: true}, input, function () { + renderModal({ isOpen: true }, input, () => { expect(document.activeElement).toEqual(document.querySelector('.focus_input')); unmountModal(); }); }); - it('handles case when child has no tabbable elements', function() { - var component = renderModal({isOpen: true}, 'hello'); - expect(function() { - Simulate.keyDown(component.portal.refs.content, {key: "Tab", keyCode: 9, which: 9}) - }).toNotThrow; + it('handles case when child has no tabbable elements', () => { + const component = renderModal({ isOpen: true }, 'hello'); + expect(() => { + Simulate.keyDown(component.portal.content, { key: 'Tab', keyCode: 9, which: 9 }); + }).toNotThrow(); unmountModal(); }); - it('keeps focus inside the modal when child has no tabbable elements', function() { - var tabPrevented = false; - var modal = renderModal({isOpen: true}, 'hello'); - expect(document.activeElement).toEqual(modal.portal.refs.content); - Simulate.keyDown(modal.portal.refs.content, { - key: "Tab", - keyCode: 9, - which: 9, - preventDefault: function() { tabPrevented = true; } + it('keeps focus inside the modal when child has no tabbable elements', () => { + let tabPrevented = false; + const modal = renderModal({ isOpen: true }, 'hello'); + expect(document.activeElement).toEqual(modal.portal.content); + Simulate.keyDown(modal.portal.content, { + key: 'Tab', + keyCode: 9, + which: 9, + preventDefault () { tabPrevented = true; } }); expect(tabPrevented).toEqual(true); + unmountModal(); }); - it('supports portalClassName', function () { - var modal = renderModal({isOpen: true, portalClassName: 'myPortalClass'}); + it('supports portalClassName', () => { + const modal = renderModal({ isOpen: true, portalClassName: 'myPortalClass' }); expect(modal.node.className).toEqual('myPortalClass'); unmountModal(); }); - it('supports custom className', function() { - var modal = renderModal({isOpen: true, className: 'myClass'}); - expect(modal.portal.refs.content.className.indexOf('myClass')).toNotEqual(-1); + it('supports custom className', () => { + const modal = renderModal({ isOpen: true, className: 'myClass' }); + expect(modal.portal.content.className.indexOf('myClass')).toNotEqual(-1); unmountModal(); }); - it('supports overlayClassName', function () { - var modal = renderModal({isOpen: true, overlayClassName: 'myOverlayClass'}); - expect(modal.portal.refs.overlay.className.indexOf('myOverlayClass')).toNotEqual(-1); + it('supports overlayClassName', () => { + const modal = renderModal({ isOpen: true, overlayClassName: 'myOverlayClass' }); + expect(modal.portal.overlay.className.indexOf('myOverlayClass')).toNotEqual(-1); unmountModal(); }); - it('overrides the default styles when a custom classname is used', function () { - var modal = renderModal({isOpen: true, className: 'myClass'}); - expect(modal.portal.refs.content.style.top).toEqual(''); + it('overrides the default styles when a custom classname is used', () => { + const modal = renderModal({ isOpen: true, className: 'myClass' }); + expect(modal.portal.content.style.top).toEqual(''); unmountModal(); }); - it('overrides the default styles when a custom overlayClassName is used', function () { - var modal = renderModal({isOpen: true, overlayClassName: 'myOverlayClass'}); - expect(modal.portal.refs.overlay.style.backgroundColor).toEqual(''); + it('overrides the default styles when a custom overlayClassName is used', () => { + const modal = renderModal({ isOpen: true, overlayClassName: 'myOverlayClass' }); + expect(modal.portal.overlay.style.backgroundColor).toEqual(''); + unmountModal(); }); - it('supports adding style to the modal contents', function () { - var modal = renderModal({isOpen: true, style: {content: {width: '20px'}}}); - expect(modal.portal.refs.content.style.width).toEqual('20px'); + it('supports adding style to the modal contents', () => { + const modal = renderModal({ isOpen: true, style: { content: { width: '20px' } } }); + expect(modal.portal.content.style.width).toEqual('20px'); + unmountModal(); }); - it('supports overriding style on the modal contents', function() { - var modal = renderModal({isOpen: true, style: {content: {position: 'static'}}}); - expect(modal.portal.refs.content.style.position).toEqual('static'); + it('supports overriding style on the modal contents', () => { + const modal = renderModal({ isOpen: true, style: { content: { position: 'static' } } }); + expect(modal.portal.content.style.position).toEqual('static'); + unmountModal(); }); - it('supports adding style on the modal overlay', function() { - var modal = renderModal({isOpen: true, style: {overlay: {width: '75px'}}}); - expect(modal.portal.refs.overlay.style.width).toEqual('75px'); + it('supports adding style on the modal overlay', () => { + const modal = renderModal({ isOpen: true, style: { overlay: { width: '75px' } } }); + expect(modal.portal.overlay.style.width).toEqual('75px'); + unmountModal(); }); - it('supports overriding style on the modal overlay', function() { - var modal = renderModal({isOpen: true, style: {overlay: {position: 'static'}}}); - expect(modal.portal.refs.overlay.style.position).toEqual('static'); + it('supports overriding style on the modal overlay', () => { + const modal = renderModal({ isOpen: true, style: { overlay: { position: 'static' } } }); + expect(modal.portal.overlay.style.position).toEqual('static'); + unmountModal(); }); - it('supports overriding the default styles', function() { - var previousStyle = Modal.defaultStyles.content.position - //Just in case the default style is already relative, check that we can change it - var newStyle = previousStyle === 'relative' ? 'static': 'relative' - Modal.defaultStyles.content.position = newStyle - var modal = renderModal({isOpen: true}); - expect(modal.portal.refs.content.style.position).toEqual(newStyle); - Modal.defaultStyles.content.position = previousStyle + it('supports overriding the default styles', () => { + const previousStyle = Modal.defaultStyles.content.position; + // Just in case the default style is already relative, check that we can change it + const newStyle = previousStyle === 'relative' ? 'static' : 'relative'; + Modal.defaultStyles.content.position = newStyle; + const modal = renderModal({ isOpen: true }); + expect(modal.portal.content.style.position).toEqual(newStyle); + Modal.defaultStyles.content.position = previousStyle; + unmountModal(); }); - it('adds class to body when open', function() { - renderModal({isOpen: false}); - expect(document.body.className.indexOf('ReactModal__Body--open') !== -1).toEqual(false); - renderModal({isOpen: true}); - expect(document.body.className.indexOf('ReactModal__Body--open') !== -1).toEqual(true); + it('should remove class from body when no modals opened', () => { + renderModal({ isOpen: true }); + renderModal({ isOpen: true }); + expect(document.body.className.indexOf('ReactModal__Body--open') > -1).toBe(true); + unmountModal(); + expect(document.body.className.indexOf('ReactModal__Body--open') > -1).toBe(true); + unmountModal(); + expect(document.body.className.indexOf('ReactModal__Body--open') === -1).toBe(true); + }); - renderModal({isOpen: false}); - expect(document.body.className.indexOf('ReactModal__Body--open') !== -1).toEqual(false); + it('adds class to body when open', () => { + renderModal({ isOpen: false }); + expect(document.body.className.indexOf('ReactModal__Body--open') !== -1).toEqual(false); + unmountModal(); + renderModal({ isOpen: true }); + expect(document.body.className.indexOf('ReactModal__Body--open') > -1).toEqual(true); + unmountModal(); + renderModal({ isOpen: false }); + expect(document.body.className.indexOf('ReactModal__Body--open') !== -1).toEqual(false); unmountModal(); }); - it('removes class from body when unmounted without closing', function() { - renderModal({isOpen: true}); - expect(document.body.className.indexOf('ReactModal__Body--open') !== -1).toEqual(true); + it('removes class from body when unmounted without closing', () => { + renderModal({ isOpen: true }); + expect(document.body.className.indexOf('ReactModal__Body--open') !== -1).toEqual(true); unmountModal(); - expect(document.body.className.indexOf('ReactModal__Body--open') !== -1).toEqual(false); + expect(document.body.className.indexOf('ReactModal__Body--open') !== -1).toEqual(false); }); - it('removes aria-hidden from appElement when unmounted without closing', function() { - var el = document.createElement('div'); - var node = document.createElement('div'); + it('removes aria-hidden from appElement when unmounted without closing', () => { + const el = document.createElement('div'); + const node = document.createElement('div'); ReactDOM.render(React.createElement(Modal, { isOpen: true, appElement: el @@ -234,20 +289,20 @@ describe('Modal', function () { expect(el.getAttribute('aria-hidden')).toEqual(null); }); - it('adds --after-open for animations', function() { - renderModal({isOpen: true}); - var overlay = document.querySelector('.ReactModal__Overlay'); - var content = document.querySelector('.ReactModal__Content'); + it('adds --after-open for animations', () => { + renderModal({ isOpen: true }); + const overlay = document.querySelector('.ReactModal__Overlay'); + const content = document.querySelector('.ReactModal__Content'); expect(overlay.className.match(/ReactModal__Overlay--after-open/)).toExist(); expect(content.className.match(/ReactModal__Content--after-open/)).toExist(); unmountModal(); }); - it('should trigger the onAfterOpen callback', function() { - var afterOpenCallback = sinon.spy(); + it('should trigger the onAfterOpen callback', () => { + const afterOpenCallback = sinon.spy(); renderModal({ isOpen: true, - onAfterOpen: function() { + onAfterOpen () { afterOpenCallback(); } }); @@ -255,11 +310,11 @@ describe('Modal', function () { unmountModal(); }); - it('check the state of the modal after close with time out and reopen it', function() { - var modal = renderModal({ + it('check the state of the modal after close with time out and reopen it', () => { + const modal = renderModal({ isOpen: true, closeTimeoutMS: 2000, - onRequestClose: function() {} + onRequestClose () {} }); modal.portal.closeWithTimeout(); modal.portal.open(); @@ -268,67 +323,89 @@ describe('Modal', function () { unmountModal(); }); - describe('should close on overlay click', function() { - afterEach('Unmount modal', function() { + it('should close on Esc key event', () => { + const requestCloseCallback = sinon.spy(); + const modal = renderModal({ + isOpen: true, + shouldCloseOnOverlayClick: true, + onRequestClose: requestCloseCallback + }); + expect(modal.props.isOpen).toEqual(true); + expect(() => { + Simulate.keyDown(modal.portal.content, { + // The keyCode is all that matters, so this works + key: 'FakeKeyToTestLater', + keyCode: 27, + which: 27 + }); + }).toNotThrow(); + expect(requestCloseCallback.called).toBeTruthy(); + // Check if event is passed to onRequestClose callback. + const event = requestCloseCallback.getCall(0).args[0]; + expect(event).toBeTruthy(); + expect(event.constructor).toBeTruthy(); + expect(event.key).toEqual('FakeKeyToTestLater'); + }); + + describe('should close on overlay click', () => { + afterEach('Unmount modal', () => { unmountModal(); }); - describe('verify props', function() { - it('verify default prop of shouldCloseOnOverlayClick', function () { - var modal = renderModal({isOpen: true}); + describe('verify props', () => { + it('verify default prop of shouldCloseOnOverlayClick', () => { + const modal = renderModal({ isOpen: true }); expect(modal.props.shouldCloseOnOverlayClick).toEqual(true); }); - it('verify prop of shouldCloseOnOverlayClick', function () { - var modal = renderModal({isOpen: true, shouldCloseOnOverlayClick: false}); + it('verify prop of shouldCloseOnOverlayClick', () => { + const modal = renderModal({ isOpen: true, shouldCloseOnOverlayClick: false }); expect(modal.props.shouldCloseOnOverlayClick).toEqual(false); }); }); - describe('verify clicks', function() { - it('verify overlay click when shouldCloseOnOverlayClick sets to false', function () { - var requestCloseCallback = sinon.spy(); - var modal = renderModal({ + describe('verify clicks', () => { + it('verify overlay click when shouldCloseOnOverlayClick sets to false', () => { + const requestCloseCallback = sinon.spy(); + const modal = renderModal({ isOpen: true, shouldCloseOnOverlayClick: false }); expect(modal.props.isOpen).toEqual(true); - var overlay = TestUtils.scryRenderedDOMComponentsWithClass(modal.portal, 'ReactModal__Overlay'); + const overlay = TestUtils.scryRenderedDOMComponentsWithClass(modal.portal, 'ReactModal__Overlay'); expect(overlay.length).toEqual(1); - Simulate.mouseDown(overlay[0]); // click the overlay - Simulate.mouseUp(overlay[0]); + Simulate.click(overlay[0]); // click the overlay expect(!requestCloseCallback.called).toBeTruthy(); }); - it('verify overlay click when shouldCloseOnOverlayClick sets to true', function() { - var requestCloseCallback = sinon.spy(); - var modal = renderModal({ + it('verify overlay click when shouldCloseOnOverlayClick sets to true', () => { + const requestCloseCallback = sinon.spy(); + const modal = renderModal({ isOpen: true, shouldCloseOnOverlayClick: true, - onRequestClose: function() { + onRequestClose () { requestCloseCallback(); } }); expect(modal.props.isOpen).toEqual(true); - var overlay = TestUtils.scryRenderedDOMComponentsWithClass(modal.portal, 'ReactModal__Overlay'); + const overlay = TestUtils.scryRenderedDOMComponentsWithClass(modal.portal, 'ReactModal__Overlay'); expect(overlay.length).toEqual(1); - Simulate.mouseDown(overlay[0]); // click the overlay - Simulate.mouseUp(overlay[0]); + Simulate.click(overlay[0]); // click the overlay expect(requestCloseCallback.called).toBeTruthy(); }); - it('verify overlay mouse down and content mouse up when shouldCloseOnOverlayClick sets to true', function() { - var requestCloseCallback = sinon.spy(); - var modal = renderModal({ - isOpen: true, - shouldCloseOnOverlayClick: true, - onRequestClose: function() { - requestCloseCallback(); - } - }); + it('verify overlay mouse down and content mouse up when shouldCloseOnOverlayClick sets to true', () => { + const requestCloseCallback = sinon.spy(); + const modal = renderModal({ + isOpen: true, + shouldCloseOnOverlayClick: true, + onRequestClose () { + requestCloseCallback(); + } + }); expect(modal.props.isOpen).toEqual(true); - var overlay = TestUtils.scryRenderedDOMComponentsWithClass(modal.portal, 'ReactModal__Overlay'); - var content = TestUtils.scryRenderedDOMComponentsWithClass(modal.portal, 'ReactModal__Content'); + const overlay = TestUtils.scryRenderedDOMComponentsWithClass(modal.portal, 'ReactModal__Overlay'); + const content = TestUtils.scryRenderedDOMComponentsWithClass(modal.portal, 'ReactModal__Content'); expect(overlay.length).toEqual(1); expect(content.length).toEqual(1); Simulate.mouseDown(overlay[0]); // click the overlay @@ -336,18 +413,18 @@ describe('Modal', function () { expect(!requestCloseCallback.called).toBeTruthy(); }); - it('verify content mouse down and overlay mouse up when shouldCloseOnOverlayClick sets to true', function() { - var requestCloseCallback = sinon.spy(); - var modal = renderModal({ - isOpen: true, - shouldCloseOnOverlayClick: true, - onRequestClose: function() { - requestCloseCallback(); - } - }); + it('verify content mouse down and overlay mouse up when shouldCloseOnOverlayClick sets to true', () => { + const requestCloseCallback = sinon.spy(); + const modal = renderModal({ + isOpen: true, + shouldCloseOnOverlayClick: true, + onRequestClose () { + requestCloseCallback(); + } + }); expect(modal.props.isOpen).toEqual(true); - var overlay = TestUtils.scryRenderedDOMComponentsWithClass(modal.portal, 'ReactModal__Overlay'); - var content = TestUtils.scryRenderedDOMComponentsWithClass(modal.portal, 'ReactModal__Content'); + const overlay = TestUtils.scryRenderedDOMComponentsWithClass(modal.portal, 'ReactModal__Overlay'); + const content = TestUtils.scryRenderedDOMComponentsWithClass(modal.portal, 'ReactModal__Content'); expect(content.length).toEqual(1); expect(overlay.length).toEqual(1); Simulate.mouseDown(content[0]); // click the overlay @@ -355,79 +432,71 @@ describe('Modal', function () { expect(!requestCloseCallback.called).toBeTruthy(); }); - it('should not stop event propagation', function() { - var hasPropagated = false - var modal = renderModal({ + it('should not stop event propagation', () => { + let hasPropagated = false; + const modal = renderModal({ isOpen: true, shouldCloseOnOverlayClick: true }); - var overlay = TestUtils.scryRenderedDOMComponentsWithClass(modal.portal, 'ReactModal__Overlay'); - window.addEventListener('click', function () { hasPropagated = true }) - overlay[0].dispatchEvent(new MouseEvent('click', { bubbles: true })) + const overlay = TestUtils.scryRenderedDOMComponentsWithClass(modal.portal, 'ReactModal__Overlay'); + window.addEventListener('click', () => { hasPropagated = true; }); + // Work around for running the spec in IE 11 + let mouseEvent = null; + try { + mouseEvent = new MouseEvent('click', { bubbles: true }); + } catch (err) { + mouseEvent = document.createEvent('MouseEvent'); + mouseEvent.initEvent('click', true, false); + } + overlay[0].dispatchEvent(mouseEvent); expect(hasPropagated).toBeTruthy(); }); }); - it('verify event passing on overlay click', function() { - var requestCloseCallback = sinon.spy(); - var modal = renderModal({ + it('verify event passing on overlay click', () => { + const requestCloseCallback = sinon.spy(); + const modal = renderModal({ isOpen: true, shouldCloseOnOverlayClick: true, onRequestClose: requestCloseCallback }); expect(modal.props.isOpen).toEqual(true); - var overlay = TestUtils.scryRenderedDOMComponentsWithClass(modal.portal, 'ReactModal__Overlay'); + const overlay = TestUtils.scryRenderedDOMComponentsWithClass(modal.portal, 'ReactModal__Overlay'); expect(overlay.length).toEqual(1); - Simulate.mouseDown(overlay[0]); // click the overlay - Simulate.mouseUp(overlay[0]); + // click the overlay + Simulate.click(overlay[0], { + // Used to test that this was the event received + fakeData: 'ABC' + }); expect(requestCloseCallback.called).toBeTruthy(); // Check if event is passed to onRequestClose callback. - var event = requestCloseCallback.getCall(0).args[0]; + const event = requestCloseCallback.getCall(0).args[0]; expect(event).toBeTruthy(); expect(event.constructor).toBeTruthy(); - expect(event.constructor.name).toEqual('SyntheticEvent'); - }); - }); - - it('should close on Esc key event', function() { - var requestCloseCallback = sinon.spy(); - var modal = renderModal({ - isOpen: true, - shouldCloseOnOverlayClick: true, - onRequestClose: requestCloseCallback + expect(event.fakeData).toEqual('ABC'); }); - expect(modal.props.isOpen).toEqual(true); - expect(function() { - Simulate.keyDown(modal.portal.refs.content, {key: "Esc", keyCode: 27, which: 27}) - }).toNotThrow(); - expect(requestCloseCallback.called).toBeTruthy(); - // Check if event is passed to onRequestClose callback. - var event = requestCloseCallback.getCall(0).args[0]; - expect(event).toBeTruthy(); - expect(event.constructor).toBeTruthy(); - expect(event.constructor.name).toEqual('SyntheticEvent'); }); - //it('adds --before-close for animations', function() { - //var node = document.createElement('div'); + // it('adds --before-close for animations', function() { + // var node = document.createElement('div'); - //var component = ReactDOM.render(React.createElement(Modal, { - //isOpen: true, - //ariaHideApp: false, - //closeTimeoutMS: 50, - //}), node); + // var component = ReactDOM.render(React.createElement(Modal, { + // isOpen: true, + // ariaHideApp: false, + // closeTimeoutMS: 50, + // }), node); - //component = ReactDOM.render(React.createElement(Modal, { - //isOpen: false, - //ariaHideApp: false, - //closeTimeoutMS: 50, - //}), node); + // component = ReactDOM.render(React.createElement(Modal, { + // isOpen: false, + // ariaHideApp: false, + // closeTimeoutMS: 50, + // }), node); // It can't find these nodes, I didn't spend much time on this - //var overlay = document.querySelector('.ReactModal__Overlay'); - //var content = document.querySelector('.ReactModal__Content'); - //ok(overlay.className.match(/ReactModal__Overlay--before-close/)); - //ok(content.className.match(/ReactModal__Content--before-close/)); - //unmountModal(); - //}); + // var overlay = document.querySelector('.ReactModal__Overlay'); + // var content = document.querySelector('.ReactModal__Content'); + // ok(overlay.className.match(/ReactModal__Overlay--before-close/)); + // ok(content.className.match(/ReactModal__Content--before-close/)); + // unmountModal(); + // }); }); diff --git a/specs/helper.js b/specs/helper.js index a53709ae..0e1fee84 100644 --- a/specs/helper.js +++ b/specs/helper.js @@ -1,20 +1,27 @@ +// The following eslint overrides should be removed when refactoring can occur + +/* eslint react/no-render-return-value: "warn" */ import React from 'react'; import ReactDOM from 'react-dom'; import Modal from '../lib/components/Modal'; -let _currentDiv = null; +const divStack = []; -export const renderModal = function(props, children, callback) { - props.ariaHideApp = false; - _currentDiv = document.createElement('div'); - document.body.appendChild(_currentDiv); +export function renderModal (props, children, callback) { + const myProps = { + ariaHideApp: false, + ...props + }; + const currentDiv = document.createElement('div'); + divStack.push(currentDiv); + document.body.appendChild(currentDiv); return ReactDOM.render( - {children} - , _currentDiv, callback); -}; + {children} + , currentDiv, callback); +} -export const unmountModal = function() { - ReactDOM.unmountComponentAtNode(_currentDiv); - document.body.removeChild(_currentDiv); - _currentDiv = null; +export const unmountModal = () => { + const currentDiv = divStack.pop(); + ReactDOM.unmountComponentAtNode(currentDiv); + document.body.removeChild(currentDiv); }; diff --git a/specs/spec_index.js b/specs/spec_index.js index bfd7c264..363463c4 100644 --- a/specs/spec_index.js +++ b/specs/spec_index.js @@ -1,10 +1,19 @@ const testsContext = require.context('.', true, /spec$/); -testsContext.keys().forEach(function(path) { - try { - testsContext(path); - } catch(err) { - debugger - console.error(`[ERROR] WITH SPEC FILE: ${path}`); - console.error(err); - } +testsContext.keys().forEach((path) => { + try { + testsContext(path); + } catch (err) { + console.error(`[ERROR] WITH SPEC FILE: ${path}`); + console.error(err); + } +}); + +const componentsContext = require.context('../lib', true, /\.js$/); +componentsContext.keys().forEach((path) => { + try { + componentsContext(path); + } catch (err) { + console.error(`[ERROR] WITH LIB FILE: ${path}`); + console.error(err); + } }); diff --git a/webpack.test.config.js b/webpack.test.config.js index 6fd71d36..6a416857 100644 --- a/webpack.test.config.js +++ b/webpack.test.config.js @@ -1,7 +1,19 @@ -var commonConfig = require('./webpack.config'); +const path = require('path'); +const commonConfig = require('./webpack.config'); + commonConfig.plugins = []; commonConfig.entry = undefined; commonConfig.debug = true; +commonConfig.devtool = 'inline-source-map'; + +if (process.env.CONTINUOUS_INTEGRATION || process.env.COVERAGE) { + commonConfig.module.postLoaders = commonConfig.module.postLoaders || [] + commonConfig.module.postLoaders.push({ + test: /\.js$/, + include: path.resolve('lib'), + loader: 'istanbul-instrumenter' + }); +} module.exports = commonConfig; diff --git a/yarn.lock b/yarn.lock index 8356e784..e768ca90 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,7 +2,7 @@ # yarn lockfile v1 -abbrev@1, abbrev@~1.0.7, abbrev@~1.0.9: +abbrev@1, abbrev@1.0.x, abbrev@~1.0.7, abbrev@~1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" @@ -20,10 +20,24 @@ accepts@~1.3.3: mime-types "~2.1.11" negotiator "0.6.1" -acorn@^3.0.0, acorn@^3.1.0: +acorn-jsx@^3.0.0, acorn-jsx@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + dependencies: + acorn "^3.0.4" + +acorn@^3.0.0, acorn@^3.0.4, acorn@^3.1.0: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" +acorn@^4.0.1: + version "4.0.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.4.tgz#17a8d6a7a6c4ef538b814ec9abac2779293bf30a" + +adm-zip@~0.4.3: + version "0.4.7" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.7.tgz#8606c2cbf1c426ce8c8ec00174447fd49b6eafc1" + after@0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/after/-/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" @@ -32,6 +46,24 @@ after@0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" +agent-base@2: + version "2.0.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.0.1.tgz#bd8f9e86a8eb221fffa07bd14befd55df142815e" + dependencies: + extend "~3.0.0" + semver "~5.0.1" + +ajv-keywords@^1.0.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.0.tgz#c11e6859eafff83e0dafc416929472eca946aa2c" + +ajv@^4.7.0: + version "4.10.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.10.3.tgz#3e4fea9675b157de7888b80dd0ed735b83f28e11" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" @@ -44,7 +76,11 @@ amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" -ansi-regex@*, ansi-regex@^2.0.0: +ansi-escapes@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + +ansi-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" @@ -75,6 +111,30 @@ aproba@^1.0.3, aproba@~1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" +archiver-utils@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-1.3.0.tgz#e50b4c09c70bf3d680e32ff1b7994e9f9d895174" + dependencies: + glob "^7.0.0" + graceful-fs "^4.1.0" + lazystream "^1.0.0" + lodash "^4.8.0" + normalize-path "^2.0.0" + readable-stream "^2.0.0" + +archiver@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/archiver/-/archiver-1.1.0.tgz#e1e8c4d356cf155308f351d60cc18cb6fb2344ee" + dependencies: + archiver-utils "^1.3.0" + async "^2.0.0" + buffer-crc32 "^0.2.1" + glob "^7.0.0" + lodash "^4.8.0" + readable-stream "^2.0.0" + tar-stream "^1.5.0" + zip-stream "^1.1.0" + archy@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" @@ -86,6 +146,12 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.0 || ^1.1.13" +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" @@ -100,6 +166,10 @@ array-filter@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -123,6 +193,16 @@ array-slice@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" @@ -175,15 +255,25 @@ async@0.1.x: version "0.1.22" resolved "https://registry.yarnpkg.com/async/-/async-0.1.22.tgz#0fc1aaa088a0e3ef0ebe2d8831bab0dcf8845061" -async@^0.9.0, async@~0.9.0: - version "0.9.2" - resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" +async@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/async/-/async-1.4.0.tgz#35f86f83c59e0421d099cd9a91d8278fb578c00d" -async@^1.3.0: +async@1.x, async@^1.3.0, async@^1.4.0, async@~1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" -async@^2.0.1: +async@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.0.1.tgz#b709cc0280a9c36f09f4536be823c838a9049e25" + dependencies: + lodash "^4.8.0" + +async@^0.9.0, async@~0.9.0: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + +async@^2.0.0, async@^2.0.1: version "2.1.4" resolved "https://registry.yarnpkg.com/async/-/async-2.1.4.tgz#2d2160c7788032e4dd6cbe2502f1f9a2c8f6cde4" dependencies: @@ -205,7 +295,7 @@ aws4@^1.2.1: version "1.5.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" -babel-code-frame@^6.20.0: +babel-code-frame@^6.16.0, babel-code-frame@^6.20.0: version "6.20.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.20.0.tgz#b968f839090f9a8bc6d41938fb96cb84f7387b26" dependencies: @@ -237,6 +327,16 @@ babel-core@^6.18.0, babel-core@^6.7.4: slash "^1.0.0" source-map "^0.5.0" +babel-eslint@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.1.1.tgz#8a6a884f085aa7060af69cfc77341c2f99370fb2" + dependencies: + babel-code-frame "^6.16.0" + babel-traverse "^6.15.0" + babel-types "^6.15.0" + babylon "^6.13.0" + lodash.pickby "^4.6.0" + babel-generator@^6.21.0: version "6.21.0" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.21.0.tgz#605f1269c489a1c75deeca7ea16d43d4656c8494" @@ -249,6 +349,22 @@ babel-generator@^6.21.0: lodash "^4.2.0" source-map "^0.5.0" +babel-helper-bindify-decorators@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.18.0.tgz#fc00c573676a6e702fffa00019580892ec8780a5" + dependencies: + babel-runtime "^6.0.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helper-builder-binary-assignment-operator-visitor@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.18.0.tgz#8ae814989f7a53682152e3401a04fabd0bb333a6" + dependencies: + babel-helper-explode-assignable-expression "^6.18.0" + babel-runtime "^6.0.0" + babel-types "^6.18.0" + babel-helper-builder-react-jsx@^6.8.0: version "6.21.1" resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.21.1.tgz#c4a24208655be9dc1cccf14d366da176f20645e4" @@ -276,6 +392,23 @@ babel-helper-define-map@^6.18.0, babel-helper-define-map@^6.8.0: babel-types "^6.18.0" lodash "^4.2.0" +babel-helper-explode-assignable-expression@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.18.0.tgz#14b8e8c2d03ad735d4b20f1840b24cd1f65239fe" + dependencies: + babel-runtime "^6.0.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helper-explode-class@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.18.0.tgz#c44f76f4fa23b9c5d607cbac5d4115e7a76f62cb" + dependencies: + babel-helper-bindify-decorators "^6.18.0" + babel-runtime "^6.0.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babel-helper-function-name@^6.18.0, babel-helper-function-name@^6.8.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.18.0.tgz#68ec71aeba1f3e28b2a6f0730190b754a9bf30e6" @@ -315,6 +448,16 @@ babel-helper-regex@^6.8.0: babel-types "^6.18.0" lodash "^4.2.0" +babel-helper-remap-async-to-generator@^6.16.0, babel-helper-remap-async-to-generator@^6.16.2: + version "6.20.3" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.20.3.tgz#9dd3b396f13e35ef63e538098500adc24c63c4e7" + dependencies: + babel-helper-function-name "^6.18.0" + babel-runtime "^6.20.0" + babel-template "^6.16.0" + babel-traverse "^6.20.0" + babel-types "^6.20.0" + babel-helper-replace-supers@^6.18.0, babel-helper-replace-supers@^6.8.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.18.0.tgz#28ec69877be4144dbd64f4cc3a337e89f29a924e" @@ -354,6 +497,30 @@ babel-plugin-check-es2015-constants@^6.3.13: dependencies: babel-runtime "^6.0.0" +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-async-generators@^6.5.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" + +babel-plugin-syntax-class-properties@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" + +babel-plugin-syntax-decorators@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" + +babel-plugin-syntax-dynamic-import@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + babel-plugin-syntax-flow@^6.18.0, babel-plugin-syntax-flow@^6.3.13: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" @@ -362,6 +529,50 @@ babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + +babel-plugin-syntax-trailing-function-commas@^6.3.13, babel-plugin-syntax-trailing-function-commas@^6.8.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.20.0.tgz#442835e19179f45b87e92d477d70b9f1f18b5c4f" + +babel-plugin-transform-async-generator-functions@^6.17.0: + version "6.17.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.17.0.tgz#d0b5a2b2f0940f2b245fa20a00519ed7bc6cae54" + dependencies: + babel-helper-remap-async-to-generator "^6.16.2" + babel-plugin-syntax-async-generators "^6.5.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-async-to-generator@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.16.0.tgz#19ec36cb1486b59f9f468adfa42ce13908ca2999" + dependencies: + babel-helper-remap-async-to-generator "^6.16.0" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-class-properties@^6.18.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.19.0.tgz#1274b349abaadc835164e2004f4a2444a2788d5f" + dependencies: + babel-helper-function-name "^6.18.0" + babel-plugin-syntax-class-properties "^6.8.0" + babel-runtime "^6.9.1" + babel-template "^6.15.0" + +babel-plugin-transform-decorators@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.13.0.tgz#82d65c1470ae83e2d13eebecb0a1c2476d62da9d" + dependencies: + babel-helper-define-map "^6.8.0" + babel-helper-explode-class "^6.8.0" + babel-plugin-syntax-decorators "^6.13.0" + babel-runtime "^6.0.0" + babel-template "^6.8.0" + babel-types "^6.13.0" + babel-plugin-transform-es2015-arrow-functions@^6.3.13: version "6.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.8.0.tgz#5b63afc3181bdc9a8c4d481b5a4f3f7d7fef3d9d" @@ -531,6 +742,14 @@ babel-plugin-transform-es2015-unicode-regex@^6.3.13: babel-runtime "^6.0.0" regexpu-core "^2.0.0" +babel-plugin-transform-exponentiation-operator@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.8.0.tgz#db25742e9339eade676ca9acec46f955599a68a4" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.8.0" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.0.0" + babel-plugin-transform-flow-strip-types@^6.3.13: version "6.21.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.21.0.tgz#2eea3f8b5bb234339b47283feac155cfb237b948" @@ -538,6 +757,13 @@ babel-plugin-transform-flow-strip-types@^6.3.13: babel-plugin-syntax-flow "^6.18.0" babel-runtime "^6.0.0" +babel-plugin-transform-object-rest-spread@^6.16.0: + version "6.20.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.20.2.tgz#e816c55bba77b14c16365d87e2ae48c8fd18fc2e" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.20.0" + babel-plugin-transform-react-display-name@^6.3.13: version "6.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.8.0.tgz#f7a084977383d728bdbdc2835bba0159577f660e" @@ -579,7 +805,7 @@ babel-plugin-transform-strict-mode@^6.18.0: babel-runtime "^6.0.0" babel-types "^6.18.0" -babel-preset-es2015@^6.6.0: +babel-preset-es2015@^6.16.0, babel-preset-es2015@^6.6.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.18.0.tgz#b8c70df84ec948c43dcf2bf770e988eb7da88312" dependencies: @@ -608,6 +834,27 @@ babel-preset-es2015@^6.6.0: babel-plugin-transform-es2015-unicode-regex "^6.3.13" babel-plugin-transform-regenerator "^6.16.0" +babel-preset-es2016@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-preset-es2016/-/babel-preset-es2016-6.16.0.tgz#c7daf5feedeee99c867813bdf0d573d94ca12812" + dependencies: + babel-plugin-transform-exponentiation-operator "^6.3.13" + +babel-preset-es2017@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-preset-es2017/-/babel-preset-es2017-6.16.0.tgz#536c6287778a758948ddd092b466b6ef50b786fa" + dependencies: + babel-plugin-syntax-trailing-function-commas "^6.8.0" + babel-plugin-transform-async-to-generator "^6.16.0" + +babel-preset-latest@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-preset-latest/-/babel-preset-latest-6.16.0.tgz#5b87e19e250bb1213f13af4ec9dc7a51d53f388d" + dependencies: + babel-preset-es2015 "^6.16.0" + babel-preset-es2016 "^6.16.0" + babel-preset-es2017 "^6.16.0" + babel-preset-react@^6.5.0: version "6.16.0" resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.16.0.tgz#aa117d60de0928607e343c4828906e4661824316" @@ -620,6 +867,25 @@ babel-preset-react@^6.5.0: babel-plugin-transform-react-jsx-self "^6.11.0" babel-plugin-transform-react-jsx-source "^6.3.13" +babel-preset-stage-2@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.18.0.tgz#9eb7bf9a8e91c68260d5ba7500493caaada4b5b5" + dependencies: + babel-plugin-syntax-dynamic-import "^6.18.0" + babel-plugin-transform-class-properties "^6.18.0" + babel-plugin-transform-decorators "^6.13.0" + babel-preset-stage-3 "^6.17.0" + +babel-preset-stage-3@^6.17.0: + version "6.17.0" + resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.17.0.tgz#b6638e46db6e91e3f889013d8ce143917c685e39" + dependencies: + babel-plugin-syntax-trailing-function-commas "^6.3.13" + babel-plugin-transform-async-generator-functions "^6.17.0" + babel-plugin-transform-async-to-generator "^6.16.0" + babel-plugin-transform-exponentiation-operator "^6.3.13" + babel-plugin-transform-object-rest-spread "^6.16.0" + babel-register@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.18.0.tgz#892e2e03865078dd90ad2c715111ec4449b32a68" @@ -632,7 +898,7 @@ babel-register@^6.18.0: mkdirp "^0.5.1" source-map-support "^0.4.2" -babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.20.0, babel-runtime@^6.9.0: +babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.20.0, babel-runtime@^6.9.0, babel-runtime@^6.9.1: version "6.20.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.20.0.tgz#87300bdcf4cd770f09bf0048c64204e17806d16f" dependencies: @@ -649,7 +915,7 @@ babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-te babylon "^6.11.0" lodash "^4.2.0" -babel-traverse@^6.16.0, babel-traverse@^6.18.0, babel-traverse@^6.21.0: +babel-traverse@^6.15.0, babel-traverse@^6.16.0, babel-traverse@^6.18.0, babel-traverse@^6.20.0, babel-traverse@^6.21.0: version "6.21.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.21.0.tgz#69c6365804f1a4f69eb1213f85b00a818b8c21ad" dependencies: @@ -663,7 +929,7 @@ babel-traverse@^6.16.0, babel-traverse@^6.18.0, babel-traverse@^6.21.0: invariant "^2.2.0" lodash "^4.2.0" -babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.21.0, babel-types@^6.8.0, babel-types@^6.9.0: +babel-types@^6.13.0, babel-types@^6.15.0, babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.20.0, babel-types@^6.21.0, babel-types@^6.8.0, babel-types@^6.9.0: version "6.21.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.21.0.tgz#314b92168891ef6d3806b7f7a917fdf87c11a4b2" dependencies: @@ -672,7 +938,7 @@ babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.21 lodash "^4.2.0" to-fast-properties "^1.0.1" -babylon@^6.11.0: +babylon@^6.11.0, babylon@^6.13.0: version "6.14.1" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.14.1.tgz#956275fab72753ad9b3435d7afe58f8bf0a29815" @@ -736,15 +1002,15 @@ binary-extensions@^1.0.0: version "1.8.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" -bl@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.0.3.tgz#fc5421a28fd4226036c3b3891a66a25bc64d226e" +bl@^1.0.0, bl@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" dependencies: readable-stream "~2.0.5" -bl@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" +bl@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.0.3.tgz#fc5421a28fd4226036c3b3891a66a25bc64d226e" dependencies: readable-stream "~2.0.5" @@ -820,6 +1086,10 @@ browserify-zlib@^0.1.4: dependencies: pako "~0.2.0" +buffer-crc32@^0.2.1: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + buffer-shims@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" @@ -832,7 +1102,7 @@ buffer@^4.9.0: ieee754 "^1.1.4" isarray "^1.0.0" -builtin-modules@^1.0.0: +builtin-modules@^1.0.0, builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -848,14 +1118,35 @@ bytes@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + dependencies: + callsites "^0.2.0" + callsite@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + caseless@~0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" @@ -867,7 +1158,7 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" -chalk@1.1.3, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: +chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: @@ -904,6 +1195,10 @@ chownr@^1.0.1, chownr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" +circular-json@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" + cli-color@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-0.2.3.tgz#0a25ceae5a6a1602be7f77d28563c36700274e88" @@ -911,6 +1206,16 @@ cli-color@0.2.3: es5-ext "~0.9.2" memoizee "~0.2.5" +cli-cursor@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + dependencies: + restore-cursor "^1.0.1" + +cli-width@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" + cliui@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" @@ -930,15 +1235,28 @@ cmd-shim@~2.0.2: graceful-fs "^4.1.2" mkdirp "~0.5.0" +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" +codeclimate-test-reporter@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/codeclimate-test-reporter/-/codeclimate-test-reporter-0.4.0.tgz#b5ce10aeed7898016a1b2411acdfaba3c67c2c28" + dependencies: + async "~1.5.2" + commander "2.9.0" + lcov-parse "0.0.10" + request "~2.74.0" + colors@0.x.x: version "0.6.2" resolved "https://registry.yarnpkg.com/colors/-/colors-0.6.2.tgz#2423fe6678ac0c5dae8852e5d0e5be08c997abcc" -colors@^1.1.0: +colors@^1.1.0, colors@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" @@ -1009,6 +1327,15 @@ component-inherit@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" +compress-commons@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.1.0.tgz#9f4460bb1288564c7473916e0298aa3c320dcadb" + dependencies: + buffer-crc32 "^0.2.1" + crc32-stream "^1.0.0" + normalize-path "^2.0.0" + readable-stream "^2.0.0" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -1055,6 +1382,10 @@ constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + content-disposition@0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.1.tgz#87476c6a67c8daa87e32e87616df883ba7fb071b" @@ -1087,6 +1418,23 @@ core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" +coveralls@^2.11.15: + version "2.11.15" + resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-2.11.15.tgz#37d3474369d66c14f33fa73a9d25cee6e099fca0" + dependencies: + js-yaml "3.6.1" + lcov-parse "0.0.10" + log-driver "1.2.5" + minimist "1.2.0" + request "2.75.0" + +crc32-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-1.0.0.tgz#ea155e5e1d738ed3778438ffe92ffe2a141aeb3f" + dependencies: + buffer-crc32 "^0.2.1" + readable-stream "^2.0.0" + cross-spawn@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" @@ -1109,6 +1457,12 @@ crypto-browserify@3.3.0: ripemd160 "0.2.0" sha.js "2.2.6" +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + dependencies: + array-find-index "^1.0.1" + custom-event@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" @@ -1123,6 +1477,10 @@ d@^0.1.1, d@~0.1.1: dependencies: es5-ext "~0.10.2" +damerau-levenshtein@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.3.tgz#ae4f4ce0b62acae10ff63a01bb08f652f5213af2" + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -1133,10 +1491,23 @@ date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" +dateformat@^1.0.6: + version "1.0.12" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" + dependencies: + get-stdin "^4.0.1" + meow "^3.3.0" + debug@0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" +debug@2, debug@^2.1.1, debug@^2.2.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" + dependencies: + ms "0.7.2" + debug@2.2.0, debug@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" @@ -1149,21 +1520,15 @@ debug@2.3.3: dependencies: ms "0.7.2" -debug@^2.1.1, debug@^2.2.0: - version "2.5.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.5.2.tgz#50c295a53dbf1657146e0c1b21307275e90d49cb" - dependencies: - ms "0.7.2" - -debuglog@*, debuglog@^1.0.1: +debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" -decamelize@^1.0.0: +decamelize@^1.0.0, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" -deep-equal@*: +deep-equal@*, deep-equal@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" @@ -1171,13 +1536,17 @@ deep-extend@~0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + defaults@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" dependencies: clone "^1.0.2" -define-properties@^1.1.2, define-properties@~1.1.2: +define-properties@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" dependencies: @@ -1188,6 +1557,18 @@ defined@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" +del@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -1232,6 +1613,17 @@ diff@1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" +diff@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + +doctrine@1.5.0, doctrine@^1.2.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + dom-serialize@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" @@ -1281,6 +1673,12 @@ encoding@^0.1.11: dependencies: iconv-lite "~0.4.13" +end-of-stream@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.1.0.tgz#e9353258baa9108965efc41cb0ef8ade2f3cfb07" + dependencies: + once "~1.3.0" + engine.io-client@1.6.9: version "1.6.9" resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.6.9.tgz#1d6ad48048a5083c95096943b29d36efdb212401" @@ -1378,7 +1776,7 @@ error-ex@^1.2.0: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.4.3, es-abstract@^1.6.1: +es-abstract@^1.4.3: version "1.6.1" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.6.1.tgz#bb8a2064120abcf928a086ea3d9043114285ec99" dependencies: @@ -1395,7 +1793,7 @@ es-to-primitive@^1.1.1: is-date-object "^1.0.1" is-symbol "^1.0.1" -es5-ext@^0.10.7, es5-ext@~0.10.11, es5-ext@~0.10.2: +es5-ext@^0.10.7, es5-ext@^0.10.8, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.7: version "0.10.12" resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047" dependencies: @@ -1414,29 +1812,203 @@ es6-iterator@2: es5-ext "^0.10.7" es6-symbol "3" -es6-symbol@3, es6-symbol@^3.0.2, es6-symbol@~3.1: +es6-map@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.4.tgz#a34b147be224773a4d7da8072794cefa3632b897" + dependencies: + d "~0.1.1" + es5-ext "~0.10.11" + es6-iterator "2" + es6-set "~0.1.3" + es6-symbol "~3.1.0" + event-emitter "~0.3.4" + +es6-set@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.4.tgz#9516b6761c2964b92ff479456233a247dc707ce8" + dependencies: + d "~0.1.1" + es5-ext "~0.10.11" + es6-iterator "2" + es6-symbol "3" + event-emitter "~0.3.4" + +es6-symbol@3, es6-symbol@^3.0.2, es6-symbol@~3.1, es6-symbol@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" dependencies: d "~0.1.1" es5-ext "~0.10.11" +es6-weak-map@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.1.tgz#0d2bbd8827eb5fb4ba8f97fbfea50d43db21ea81" + dependencies: + d "^0.1.1" + es5-ext "^0.10.8" + es6-iterator "2" + es6-symbol "3" + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2: +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" +escodegen@1.8.x: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +escope@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" + dependencies: + es6-map "^0.1.3" + es6-weak-map "^2.0.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-config-airbnb-base@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-10.0.1.tgz#f17d4e52992c1d45d1b7713efbcd5ecd0e7e0506" + +eslint-config-airbnb@latest: + version "13.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-13.0.0.tgz#688d15d3c276c0c753ae538c92a44397d76ae46e" + dependencies: + eslint-config-airbnb-base "^10.0.0" + +eslint-import-resolver-node@^0.2.0: + version "0.2.3" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz#5add8106e8c928db2cba232bcd9efa846e3da16c" + dependencies: + debug "^2.2.0" + object-assign "^4.0.1" + resolve "^1.1.6" + +eslint-module-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.0.0.tgz#a6f8c21d901358759cdc35dbac1982ae1ee58bce" + dependencies: + debug "2.2.0" + pkg-dir "^1.0.0" + +eslint-plugin-import@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz#72ba306fad305d67c4816348a4699a4229ac8b4e" + dependencies: + builtin-modules "^1.1.1" + contains-path "^0.1.0" + debug "^2.2.0" + doctrine "1.5.0" + eslint-import-resolver-node "^0.2.0" + eslint-module-utils "^2.0.0" + has "^1.0.1" + lodash.cond "^4.3.0" + minimatch "^3.0.3" + pkg-up "^1.0.0" + +eslint-plugin-jsx-a11y@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-2.2.3.tgz#4e35cb71b8a7db702ac415c806eb8e8d9ea6c65d" + dependencies: + damerau-levenshtein "^1.0.0" + jsx-ast-utils "^1.0.0" + object-assign "^4.0.1" + +eslint-plugin-react@^6.6.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.8.0.tgz#741ab5438a094532e5ce1bbb935d6832356f492d" + dependencies: + doctrine "^1.2.2" + jsx-ast-utils "^1.3.4" + +eslint@^3.9.1: + version "3.12.2" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.12.2.tgz#6be5a9aa29658252abd7f91e9132bab1f26f3c34" + dependencies: + babel-code-frame "^6.16.0" + chalk "^1.1.3" + concat-stream "^1.4.6" + debug "^2.1.1" + doctrine "^1.2.2" + escope "^3.6.0" + espree "^3.3.1" + estraverse "^4.2.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + glob "^7.0.3" + globals "^9.14.0" + ignore "^3.2.0" + imurmurhash "^0.1.4" + inquirer "^0.12.0" + is-my-json-valid "^2.10.0" + is-resolvable "^1.0.0" + js-yaml "^3.5.1" + json-stable-stringify "^1.0.0" + levn "^0.3.0" + lodash "^4.0.0" + mkdirp "^0.5.0" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.1" + pluralize "^1.2.1" + progress "^1.1.8" + require-uncached "^1.0.2" + shelljs "^0.7.5" + strip-bom "^3.0.0" + strip-json-comments "~1.0.1" + table "^3.7.8" + text-table "~0.2.0" + user-home "^2.0.0" + +espree@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.3.2.tgz#dbf3fadeb4ecb4d4778303e50103b3d36c88b89c" + dependencies: + acorn "^4.0.1" + acorn-jsx "^3.0.0" + esprima-fb@^15001.1.0-dev-harmony-fb: version "15001.1.0-dev-harmony-fb" resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1.0-dev-harmony-fb.tgz#30a947303c6b8d5e955bee2b99b1d233206a6901" +esprima@2.7.x, esprima@^2.6.0, esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + esprima@~3.1.0: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" +esrecurse@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" + dependencies: + estraverse "~4.1.0" + object-assign "^4.0.1" + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + +estraverse@^4.1.1, estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +estraverse@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" + esutils@^2.0.0, esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -1451,6 +2023,13 @@ event-emitter@~0.2.2: dependencies: es5-ext "~0.9.2" +event-emitter@~0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.4.tgz#8d63ddfb4cfe1fae3b32ca265c4c720222080bb5" + dependencies: + d "~0.1.1" + es5-ext "~0.10.7" + event-stream@~3.3.0: version "3.3.4" resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" @@ -1475,6 +2054,10 @@ exenv@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.0.tgz#3835f127abf075bfe082d0aed4484057c78e3c89" +exit-hook@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + expand-braces@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea" @@ -1502,17 +2085,13 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" -expect@^1.20.2: - version "1.20.2" - resolved "https://registry.yarnpkg.com/expect/-/expect-1.20.2.tgz#d458fe4c56004036bae3232416a3f6361f04f965" +expect@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-1.10.0.tgz#d69fe0afe369cb096682a8ca2684eb7363681e07" dependencies: - define-properties "~1.1.2" - has "^1.0.1" - is-equal "^1.5.1" - is-regex "^1.0.3" - object-inspect "^1.1.0" - object-keys "^1.0.9" - tmatch "^2.0.1" + deep-equal "^1.0.1" + is-regexp "^1.0.0" + object-inspect "^1.0.2" express@^4.13.3: version "4.14.0" @@ -1545,7 +2124,7 @@ express@^4.13.3: utils-merge "1.0.0" vary "~1.1.0" -extend@^3.0.0, extend@~3.0.0: +extend@3, extend@^3.0.0, extend@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" @@ -1563,6 +2142,10 @@ eyes@0.1.x: version "0.1.8" resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + fbjs@^0.8.1, fbjs@^0.8.4: version "0.8.8" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.8.tgz#02f1b6e0ea0d46c24e0b51a2d24df069563a5ad6" @@ -1575,6 +2158,20 @@ fbjs@^0.8.1, fbjs@^0.8.4: setimmediate "^1.0.5" ua-parser-js "^0.7.9" +figures@^1.3.5: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + filename-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" @@ -1614,6 +2211,15 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" +flat-cache@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + for-in@^0.1.5: version "0.1.6" resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" @@ -1640,6 +2246,14 @@ form-data@~1.0.0-rc3, form-data@~1.0.0-rc4: combined-stream "^1.0.5" mime-types "^2.1.11" +form-data@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.0.0.tgz#6f0aebadcc5da16c13e1ecc11137d85f9b883b25" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.11" + form-data@~2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" @@ -1779,6 +2393,10 @@ generate-object-property@^1.1.0: dependencies: is-property "^1.0.0" +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + getpass@^0.1.1: version "0.1.6" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" @@ -1842,7 +2460,7 @@ glob@7.0.5, glob@~7.0.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^5.0.15: +glob@^5.0.14, glob@^5.0.15: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" dependencies: @@ -1862,7 +2480,7 @@ glob@^6.0.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.3, glob@^7.0.5: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: version "7.1.1" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" dependencies: @@ -1884,11 +2502,22 @@ glob@~7.0.6: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^9.0.0: +globals@^9.0.0, globals@^9.14.0: version "9.14.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.14.0.tgz#8859936af0038741263053b39d0e76ca241e4034" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@~4.1.3, graceful-fs@~4.1.6: +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +graceful-fs@^4.1.0, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@~4.1.3, graceful-fs@~4.1.6: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -1900,6 +2529,16 @@ growl@1.9.2: version "1.9.2" resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" +handlebars@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + har-validator@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" @@ -1996,6 +2635,14 @@ https-browserify@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" +https-proxy-agent@^1.0.0, https-proxy-agent@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6" + dependencies: + agent-base "2" + debug "2" + extend "3" + i@0.3.x: version "0.3.5" resolved "https://registry.yarnpkg.com/i/-/i-0.3.5.tgz#1d2b854158ec8169113c6cb7f6b6801e99e211d5" @@ -2012,10 +2659,20 @@ iferr@^0.1.5, iferr@~0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" -imurmurhash@*, imurmurhash@^0.1.4: +ignore@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.0.tgz#8d88f03c3002a0ac52114db25d2c673b0bf1e435" + +imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" + indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" @@ -2052,10 +2709,32 @@ init-package-json@~1.9.3, init-package-json@~1.9.4: validate-npm-package-license "^3.0.1" validate-npm-package-name "^2.0.1" +inquirer@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" + dependencies: + ansi-escapes "^1.1.0" + ansi-regex "^2.0.0" + chalk "^1.0.0" + cli-cursor "^1.0.1" + cli-width "^2.0.0" + figures "^1.3.5" + lodash "^4.3.0" + readline2 "^1.0.1" + run-async "^0.1.0" + rx-lite "^3.1.2" + string-width "^1.0.1" + strip-ansi "^3.0.0" + through "^2.3.6" + interpret@^0.6.4: version "0.6.6" resolved "https://registry.yarnpkg.com/interpret/-/interpret-0.6.6.tgz#fecd7a18e7ce5ca6abfb953e1f86213a49f1625b" +interpret@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.1.tgz#d579fb7f693b858004947af39fa0db49f795602c" + invariant@^2.2.0: version "2.2.2" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" @@ -2070,22 +2749,12 @@ is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" -is-arrow-function@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-arrow-function/-/is-arrow-function-2.0.3.tgz#29be2c2d8d9450852b8bbafb635ba7b8d8e87ec2" - dependencies: - is-callable "^1.0.4" - is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" dependencies: binary-extensions "^1.0.0" -is-boolean-object@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.0.tgz#98f8b28030684219a95f375cfbd88ce3405dff93" - is-buffer@^1.0.2: version "1.1.4" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" @@ -2096,7 +2765,7 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" -is-callable@^1.0.4, is-callable@^1.1.1, is-callable@^1.1.3: +is-callable@^1.1.1, is-callable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" @@ -2114,22 +2783,6 @@ is-equal-shallow@^0.1.3: dependencies: is-primitive "^2.0.0" -is-equal@^1.5.1: - version "1.5.3" - resolved "https://registry.yarnpkg.com/is-equal/-/is-equal-1.5.3.tgz#05b7fa3a1122cbc71c1ef41ce0142d5532013b29" - dependencies: - has "^1.0.1" - is-arrow-function "^2.0.3" - is-boolean-object "^1.0.0" - is-callable "^1.1.3" - is-date-object "^1.0.1" - is-generator-function "^1.0.3" - is-number-object "^1.0.3" - is-regex "^1.0.3" - is-string "^1.0.4" - is-symbol "^1.0.1" - object.entries "^1.0.3" - is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -2150,9 +2803,9 @@ is-fullwidth-code-point@^1.0.0: dependencies: number-is-nan "^1.0.0" -is-generator-function@^1.0.3: - version "1.0.6" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.6.tgz#9e71653cd15fff341c79c4151460a131d31e9fc4" +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" @@ -2160,7 +2813,7 @@ is-glob@^2.0.0, is-glob@^2.0.1: dependencies: is-extglob "^1.0.0" -is-my-json-valid@^2.12.4: +is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: version "2.15.0" resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" dependencies: @@ -2169,10 +2822,6 @@ is-my-json-valid@^2.12.4: jsonpointer "^4.0.0" xtend "^4.0.0" -is-number-object@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.3.tgz#f265ab89a9f445034ef6aff15a8f00b00f551799" - is-number@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" @@ -2183,6 +2832,22 @@ is-number@^2.0.2, is-number@^2.1.0: dependencies: kind-of "^3.0.2" +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + dependencies: + path-is-inside "^1.0.1" + is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" @@ -2199,14 +2864,20 @@ is-regex@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.3.tgz#0d55182bddf9f2fde278220aec3a75642c908637" +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + +is-resolvable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" + dependencies: + tryit "^1.0.1" + is-stream@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" -is-string@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.4.tgz#cc3a9b69857d621e963725a24caeec873b826e64" - is-symbol@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" @@ -2252,6 +2923,33 @@ isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" +istanbul-instrumenter-loader@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-0.2.0.tgz#643e4e5e4e8f9466863a29a977d283ab372c019c" + dependencies: + istanbul "0.x.x" + loader-utils "0.x.x" + object-assign "4.x.x" + +istanbul@0.x.x, istanbul@^0.4.0: + version "0.4.5" + resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" + dependencies: + abbrev "1.0.x" + async "1.x" + escodegen "1.8.x" + esprima "2.7.x" + glob "^5.0.15" + handlebars "^4.0.1" + js-yaml "3.x" + mkdirp "0.5.x" + nopt "3.x" + once "1.x" + resolve "1.1.x" + supports-color "^3.1.0" + which "^1.1.1" + wordwrap "^1.0.0" + jju@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jju/-/jju-1.3.0.tgz#dadd9ef01924bc728b03f2f7979bdbd62f7a2aaa" @@ -2266,6 +2964,13 @@ js-tokens@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" +js-yaml@3.6.1, js-yaml@3.x, js-yaml@^3.5.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" + dependencies: + argparse "^1.0.7" + esprima "^2.6.0" + jsbn@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" @@ -2288,6 +2993,12 @@ json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" +json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -2336,6 +3047,13 @@ jstransform@^11.0.3: object-assign "^2.0.0" source-map "^0.4.2" +jsx-ast-utils@^1.0.0, jsx-ast-utils@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.3.5.tgz#9ba6297198d9f754594d62e59496ffb923778dd4" + dependencies: + acorn-jsx "^3.0.1" + object-assign "^4.1.0" + karma-chrome-launcher@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-2.0.0.tgz#c2790c5a32b15577d0fff5a4d5a2703b3b439c25" @@ -2349,6 +3067,16 @@ karma-cli@1.0.1: dependencies: resolve "^1.1.6" +karma-coverage@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/karma-coverage/-/karma-coverage-1.1.1.tgz#5aff8b39cf6994dc22de4c84362c76001b637cf6" + dependencies: + dateformat "^1.0.6" + istanbul "^0.4.0" + lodash "^3.8.0" + minimatch "^3.0.0" + source-map "^0.5.1" + karma-firefox-launcher@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/karma-firefox-launcher/-/karma-firefox-launcher-1.0.0.tgz#e08af3ce42e39860c2952ea7b7eaa64d63508bdc" @@ -2365,6 +3093,15 @@ karma-mocha@^1.3.0: dependencies: minimist "1.2.0" +karma-sauce-launcher@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/karma-sauce-launcher/-/karma-sauce-launcher-1.1.0.tgz#3d083cf5659d6736ab97bcee5d8acd86ad522212" + dependencies: + q "^1.4.1" + sauce-connect-launcher "^0.17.0" + saucelabs "^1.3.0" + wd "^1.0.0" + karma-sourcemap-loader@^0.3.7: version "0.3.7" resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz#91322c77f8f13d46fed062b042e1009d4c4505d8" @@ -2428,6 +3165,23 @@ lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" +lazystream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" + dependencies: + readable-stream "^2.0.5" + +lcov-parse@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -2438,7 +3192,7 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -loader-utils@^0.2.11, loader-utils@^0.2.5: +loader-utils@0.x.x, loader-utils@^0.2.11, loader-utils@^0.2.5: version "0.2.16" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.16.tgz#f08632066ed8282835dff88dfb52704765adee6d" dependencies: @@ -2480,10 +3234,6 @@ lodash._baseflatten@~4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash._baseflatten/-/lodash._baseflatten-4.1.1.tgz#5c87403b88f3687a88d26424faadf3aa054aab0d" -lodash._baseindexof@*: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" - lodash._baseuniq@~4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.4.0.tgz#a445294347a2f5311f585fe3225644530b9b8fae" @@ -2498,25 +3248,11 @@ lodash._baseuniq@~4.5.0: lodash._createset "~4.0.0" lodash._setcache "~4.1.0" -lodash._bindcallback@*: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" - -lodash._cacheindexof@*: - version "3.0.2" - resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" - -lodash._createcache@*: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" - dependencies: - lodash._getnative "^3.0.0" - lodash._createset@~4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" -lodash._getnative@*, lodash._getnative@^3.0.0: +lodash._getnative@^3.0.0: version "3.9.1" resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" @@ -2542,6 +3278,10 @@ lodash.clonedeep@~4.3.0: dependencies: lodash._baseclone "~4.5.0" +lodash.cond@^4.3.0: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" + lodash.create@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" @@ -2586,14 +3326,14 @@ lodash.padstart@^4.1.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b" +lodash.pickby@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz#7dea21d8c18d7703a27c704c15d3b84a67e33aff" + lodash.rest@^4.0.0: version "4.0.5" resolved "https://registry.yarnpkg.com/lodash.rest/-/lodash.rest-4.0.5.tgz#954ef75049262038c96d1fc98b28fdaf9f0772aa" -lodash.restparam@*: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - lodash.union@~4.2.0: version "4.2.1" resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.2.1.tgz#6871017b9b1ff71952c1e2bb2e25b1046a7e2842" @@ -2615,18 +3355,26 @@ lodash.without@~4.1.0: lodash._basedifference "~4.4.0" lodash.rest "^4.0.0" +lodash@3.10.1, lodash@^3.8.0: + version "3.10.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + +lodash@4.16.2: + version "4.16.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.2.tgz#3e626db827048a699281a8a125226326cfc0e652" + lodash@4.5.1: version "4.5.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.5.1.tgz#80e8a074ca5f3893a6b1c10b2a636492d710c316" -lodash@^3.8.0: - version "3.10.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" - -lodash@^4.14.0, lodash@^4.2.0, lodash@^4.5.0: +lodash@^4.0.0, lodash@^4.14.0, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.0, lodash@^4.8.0: version "4.17.3" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.3.tgz#557ed7d2a9438cac5fd5a43043ca60cb455e01f7" +log-driver@1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.5.tgz#7ae4ec257302fd790d557cb10c97100d857b0056" + log4js@^0.6.31: version "0.6.38" resolved "https://registry.yarnpkg.com/log4js/-/log4js-0.6.38.tgz#2c494116695d6fb25480943d3fc872e662a522fd" @@ -2648,6 +3396,13 @@ loose-envify@^1.0.0, loose-envify@^1.1.0: dependencies: js-tokens "^2.0.0" +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + lru-cache@2, lru-cache@2.2.x: version "2.2.4" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" @@ -2659,6 +3414,10 @@ lru-cache@^4.0.1, lru-cache@~4.0.1: pseudomap "^1.0.1" yallist "^2.0.0" +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + map-stream@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" @@ -2693,6 +3452,21 @@ memory-fs@~0.4.1: errno "^0.1.3" readable-stream "^2.0.1" +meow@^3.3.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -2750,7 +3524,7 @@ minimatch@1: lru-cache "2" sigmund "~1.0.0" -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@~3.0.3: +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@~3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" dependencies: @@ -2766,11 +3540,11 @@ minimist@0.0.8, minimist@~0.0.1: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -minimist@1.2.0, minimist@^1.2.0: +minimist@1.2.0, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -mkdirp@0.5.1, mkdirp@0.x.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@0.x.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: @@ -2800,14 +3574,22 @@ ms@0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" -mute-stream@~0.0.4: - version "0.0.6" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" +mute-stream@0.0.5, mute-stream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" nan@^2.3.0: version "2.5.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.0.tgz#aa8f1e34531d807e9e27755b234b4a6ec0c152a8" +native-promise-only@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/native-promise-only/-/native-promise-only-0.8.1.tgz#20a318c30cb45f71fe7adfbf7b21c99c1472ef11" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + ncp@0.4.x: version "0.4.2" resolved "https://registry.yarnpkg.com/ncp/-/ncp-0.4.2.tgz#abcc6cbd3ec2ed2a729ff6e7c1fa8f01784a8574" @@ -2915,7 +3697,7 @@ node-uuid@~1.4.7: version "1.4.7" resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f" -"nopt@2 || 3", nopt@~3.0.6: +"nopt@2 || 3", nopt@3.x, nopt@~3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" dependencies: @@ -2925,7 +3707,7 @@ normalize-git-url@~3.0.1, normalize-git-url@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/normalize-git-url/-/normalize-git-url-3.0.2.tgz#8e5f14be0bdaedb73e07200310aa416c27350fc4" -normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, "normalize-package-data@~1.0.1 || ^2.0.0", normalize-package-data@~2.3.5: +normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, "normalize-package-data@~1.0.1 || ^2.0.0", normalize-package-data@~2.3.5: version "2.3.5" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.5.tgz#8d924f142960e1777e7ffe170543631cc7cb02df" dependencies: @@ -2934,7 +3716,7 @@ normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, "normalize-package semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.1: +normalize-path@^2.0.0, normalize-path@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" @@ -3204,35 +3986,26 @@ oauth-sign@~0.8.0, oauth-sign@~0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" +object-assign@4.x.x, object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + object-assign@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" -object-assign@^4.0.1, object-assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" - object-component@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" -object-inspect@^1.1.0: +object-inspect@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.2.1.tgz#3b62226eb8f6d441751c7d8f22a20ff80ac9dc3f" -object-keys@^1.0.8, object-keys@^1.0.9: +object-keys@^1.0.8: version "1.0.11" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" -object.entries@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.0.4.tgz#1bf9a4dd2288f5b33f3a993d257661f05d161a5f" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.6.1" - function-bind "^1.1.0" - has "^1.0.1" - object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" @@ -3246,18 +4019,22 @@ on-finished@~2.3.0: dependencies: ee-first "1.1.1" -once@^1.3.0, once@^1.3.3, once@~1.4.0: +once@1.x, once@^1.3.0, once@^1.3.3, once@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: wrappy "1" -once@~1.3.3: +once@~1.3.0, once@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" dependencies: wrappy "1" +onetime@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + opener@~1.4.1: version "1.4.2" resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.2.tgz#b32582080042af8680c389a499175b4c54fff523" @@ -3269,6 +4046,17 @@ optimist@0.6.1, optimist@^0.6.1, optimist@~0.6.0: minimist "~0.0.1" wordwrap "~0.0.2" +optionator@^0.8.1, optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + options@>=0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" @@ -3379,6 +4167,12 @@ path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" +path-to-regexp@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + dependencies: + isarray "0.0.1" + path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" @@ -3417,6 +4211,12 @@ pkg-dir@^1.0.0: dependencies: find-up "^1.0.0" +pkg-up@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-1.0.0.tgz#3e08fb461525c4421624a33b9f7e6d0af5b05a26" + dependencies: + find-up "^1.0.0" + pkginfo@0.2.x: version "0.2.3" resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.2.3.tgz#7239c42a5ef6c30b8f328439d9b9ff71042490f8" @@ -3425,6 +4225,14 @@ pkginfo@0.x.x: version "0.4.0" resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.0.tgz#349dbb7ffd38081fcadc0853df687f0c7744cd65" +pluralize@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" @@ -3441,6 +4249,10 @@ process@^0.11.0: version "0.11.9" resolved "https://registry.yarnpkg.com/process/-/process-0.11.9.tgz#7bd5ad21aa6253e7da8682264f1e11d11c0318c1" +progress@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + promise@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf" @@ -3496,7 +4308,7 @@ punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" -q@1.4.1, q@^1.1.2: +q@1.4.1, q@^1.1.2, q@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" @@ -3632,7 +4444,7 @@ read@1, read@1.0.x, read@~1.0.1, read@~1.0.7: dependencies: mute-stream "~0.0.4" -"readable-stream@1 || 2", "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.1.0, readable-stream@^2.2.2: +"readable-stream@1 || 2", readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.1.0, readable-stream@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e" dependencies: @@ -3676,7 +4488,7 @@ readable-stream@~2.1.4, readable-stream@~2.1.5: string_decoder "~0.10.x" util-deprecate "~1.0.1" -readdir-scoped-modules@*, readdir-scoped-modules@^1.0.0: +readdir-scoped-modules@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" dependencies: @@ -3694,6 +4506,14 @@ readdirp@^2.0.0: readable-stream "^2.0.2" set-immediate-shim "^1.0.1" +readline2@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + mute-stream "0.0.5" + realize-package-specifier@~3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/realize-package-specifier/-/realize-package-specifier-3.0.3.tgz#d0def882952b8de3f67eba5e91199661271f41f4" @@ -3710,6 +4530,19 @@ recast@^0.11.17: private "~0.1.5" source-map "~0.5.0" +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + regenerate@^1.2.1: version "1.3.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" @@ -3769,9 +4602,9 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request@2, request@^2.47.0, request@^2.74.0, request@~2.74.0: - version "2.74.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.74.0.tgz#7693ca768bbb0ea5c8ce08c084a45efa05b892ab" +request@2, request@2.75.0, request@^2.47.0, request@^2.74.0: + version "2.75.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.75.0.tgz#d2b8268a286da13eaa5d01adf5d18cc90f657d93" dependencies: aws-sign2 "~0.6.0" aws4 "^1.2.1" @@ -3780,7 +4613,7 @@ request@2, request@^2.47.0, request@^2.74.0, request@~2.74.0: combined-stream "~1.0.5" extend "~3.0.0" forever-agent "~0.6.1" - form-data "~1.0.0-rc4" + form-data "~2.0.0" har-validator "~2.0.6" hawk "~3.1.3" http-signature "~1.1.0" @@ -3850,14 +4683,62 @@ request@~2.69.0: tough-cookie "~2.2.0" tunnel-agent "~0.4.1" +request@~2.74.0: + version "2.74.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.74.0.tgz#7693ca768bbb0ea5c8ce08c084a45efa05b892ab" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + bl "~1.1.2" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~1.0.0-rc4" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + node-uuid "~1.4.7" + oauth-sign "~0.8.1" + qs "~6.2.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + +require-uncached@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + requires-port@1.x.x: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + +resolve@1.1.x: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + resolve@^1.1.6: version "1.2.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.2.0.tgz#9589c3f2f6149d1417a40becc1663db6ec6bc26c" +restore-cursor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + dependencies: + exit-hook "^1.0.0" + onetime "^1.0.0" + retry@^0.10.0, retry@~0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" @@ -3900,10 +4781,26 @@ rimraf@2, rimraf@2.x.x, rimraf@^2.2.8, rimraf@^2.3.3, rimraf@^2.5.2, rimraf@^2.5 dependencies: glob "^7.0.5" +rimraf@2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.4.3.tgz#e5b51c9437a4c582adb955e9f28cf8d945e272af" + dependencies: + glob "^5.0.14" + ripemd160@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-0.2.0.tgz#2bf198bde167cacfa51c0a928e84b68bbe171fce" +run-async@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" + dependencies: + once "^1.3.0" + +rx-lite@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" + samsam@^1.1.3: version "1.2.1" resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.2.1.tgz#edd39093a3184370cb859243b2bdf255e7d8ea67" @@ -3912,6 +4809,22 @@ samsam@~1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.3.tgz#9f5087419b4d091f232571e7fa52e90b0f552621" +sauce-connect-launcher@^0.17.0: + version "0.17.0" + resolved "https://registry.yarnpkg.com/sauce-connect-launcher/-/sauce-connect-launcher-0.17.0.tgz#908d9311ecaf17dd9b4647a1435fd4a2072e80ce" + dependencies: + adm-zip "~0.4.3" + async "1.4.0" + https-proxy-agent "~1.0.0" + lodash "3.10.1" + rimraf "2.4.3" + +saucelabs@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-1.3.0.tgz#d240e8009df7fa87306ec4578a69ba3b5c424fee" + dependencies: + https-proxy-agent "^1.0.0" + "semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@4 || 5", semver@5.1.0, "semver@^2.3.0 || 3.x || 4 || 5", semver@~5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.1.0.tgz#85f2cf8550465c4df000cf7d86f6b054106ab9e5" @@ -3920,6 +4833,10 @@ semver@^4.1.0, semver@~4.3.3: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" +semver@~5.0.1: + version "5.0.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a" + semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -3999,6 +4916,14 @@ shell-quote@^1.6.1: array-reduce "~0.0.0" jsonify "~0.0.0" +shelljs@^0.7.5: + version "0.7.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.5.tgz#2eef7a50a21e1ccf37da00df767ec69e30ad0675" + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + sigmund@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" @@ -4008,18 +4933,26 @@ signal-exit@^3.0.0: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" sinon@next: - version "2.0.0-pre.4" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-2.0.0-pre.4.tgz#f29fbcca8d2fa73b633a3b0c0e4e3c78f2360c2c" + version "2.0.0-pre.5" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-2.0.0-pre.5.tgz#d87357f93ba0404c89b9d50e29e4681382f766d6" dependencies: + colors "^1.1.2" + diff "^3.1.0" formatio "1.1.1" lolex "^1.4.0" + native-promise-only "^0.8.1" + path-to-regexp "^1.7.0" samsam "^1.1.3" - text-encoding "0.5.2" + text-encoding "0.6.2" slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + slide@^1.1.3, slide@^1.1.5, slide@~1.1.3, slide@~1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" @@ -4139,16 +5072,22 @@ source-map@^0.1.41: dependencies: amdefine ">=0.0.4" -source-map@^0.4.2, source-map@~0.4.1: +source-map@^0.4.2, source-map@^0.4.4, source-map@~0.4.1: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" dependencies: amdefine ">=0.0.4" -source-map@^0.5.0, source-map@^0.5.3, source-map@~0.5.0, source-map@~0.5.1: +source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@~0.5.0, source-map@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + dependencies: + amdefine ">=0.0.4" + spdx-correct@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" @@ -4169,6 +5108,10 @@ split@0.3: dependencies: through "2" +sprintf-js@^1.0.3, sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + sshpk@^1.7.0: version "1.10.1" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.1.tgz#30e1a5d329244974a1af61511339d595af6638b0" @@ -4227,6 +5170,13 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" +string-width@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^3.0.0" + string.prototype.padend@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz#f3aaef7c1719f170c5eab1c32bf780d96e21f2f0" @@ -4243,7 +5193,7 @@ stringstream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" -strip-ansi@*, strip-ansi@^3.0.0, strip-ansi@^3.0.1, strip-ansi@~3.0.1: +strip-ansi@^3.0.0, strip-ansi@^3.0.1, strip-ansi@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" dependencies: @@ -4255,7 +5205,17 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" -strip-json-comments@~1.0.4: +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + +strip-json-comments@~1.0.1, strip-json-comments@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" @@ -4273,6 +5233,17 @@ supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" +table@^3.7.8: + version "3.8.3" + resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" + dependencies: + ajv "^4.7.0" + ajv-keywords "^1.0.0" + chalk "^1.1.1" + lodash "^4.0.0" + slice-ansi "0.0.4" + string-width "^2.0.0" + tapable@^0.1.8, tapable@~0.1.8: version "0.1.10" resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" @@ -4290,6 +5261,15 @@ tar-pack@~3.3.0: tar "~2.2.1" uid-number "~0.0.6" +tar-stream@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.2.tgz#fbc6c6e83c1a19d4cb48c7d96171fc248effc7bf" + dependencies: + bl "^1.0.0" + end-of-stream "^1.0.0" + readable-stream "^2.0.0" + xtend "^4.0.0" + tar@^2.0.0, tar@~2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" @@ -4298,15 +5278,15 @@ tar@^2.0.0, tar@~2.2.1: fstream "^1.0.2" inherits "2" -text-encoding@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.5.2.tgz#85b4660819f088777609465551690fea137d824a" +text-encoding@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.2.tgz#111e648e757bea92d34ef0019d9fdb06ebb9f53e" text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" -through@2, through@~2.3, through@~2.3.1, through@~2.3.4: +through@2, through@^2.3.6, through@~2.3, through@~2.3.1, through@~2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -4316,10 +5296,6 @@ timers-browserify@^2.0.2: dependencies: setimmediate "^1.0.4" -tmatch@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/tmatch/-/tmatch-2.0.1.tgz#0c56246f33f30da1b8d3d72895abaf16660f38cf" - tmp@0.0.28: version "0.0.28" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" @@ -4348,6 +5324,14 @@ tough-cookie@~2.3.0: dependencies: punycode "^1.4.1" +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + +tryit@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" + tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" @@ -4360,6 +5344,12 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + type-is@~1.6.13: version "1.6.14" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.14.tgz#e219639c17ded1ca0789092dd54a03826b817cb2" @@ -4384,7 +5374,7 @@ uglify-js@2.4.24: uglify-to-browserify "~1.0.0" yargs "~3.5.4" -uglify-js@~2.7.3: +uglify-js@^2.6, uglify-js@~2.7.3: version "2.7.5" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.5.tgz#4612c0c7baaee2ba7c487de4904ae122079f2ca8" dependencies: @@ -4409,6 +5399,13 @@ umask@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" +underscore.string@3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db" + dependencies: + sprintf-js "^1.0.3" + util-deprecate "^1.0.2" + unique-filename@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" @@ -4432,7 +5429,7 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" -user-home@2.0.0: +user-home@2.0.0, user-home@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" dependencies: @@ -4448,7 +5445,7 @@ utf8@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.0.tgz#0cfec5c8052d44a23e3aaa908104e8075f95dfd5" -util-deprecate@~1.0.1: +util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -4481,7 +5478,7 @@ uuid@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" -validate-npm-package-license@*, validate-npm-package-license@^3.0.1, validate-npm-package-license@~3.0.1: +validate-npm-package-license@^3.0.1, validate-npm-package-license@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" dependencies: @@ -4494,6 +5491,10 @@ validate-npm-package-name@^2.0.1, validate-npm-package-name@~2.2.2: dependencies: builtins "0.0.7" +vargs@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/vargs/-/vargs-0.1.0.tgz#6b6184da6520cc3204ce1b407cac26d92609ebff" + vary@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.0.tgz#e1e5affbbd16ae768dd2674394b9ad3022653140" @@ -4528,6 +5529,18 @@ wcwidth@^1.0.0: dependencies: defaults "^1.0.3" +wd@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/wd/-/wd-1.1.1.tgz#f2c6c41700f69e3009dcfc3574f42e9ae70fb5c1" + dependencies: + archiver "1.1.0" + async "2.0.1" + lodash "4.16.2" + q "1.4.1" + request "2.75.0" + underscore.string "3.3.4" + vargs "0.1.0" + webpack-core@~0.6.9: version "0.6.9" resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2" @@ -4584,7 +5597,7 @@ whatwg-fetch@>=0.10.0: version "2.0.1" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.1.tgz#078b9461bbe91cea73cbce8bb122a05f9e92b772" -which@1, which@^1.2.1, which@^1.2.9, which@~1.2.11, which@~1.2.4: +which@1, which@^1.1.1, which@^1.2.1, which@^1.2.9, which@~1.2.11, which@~1.2.4: version "1.2.12" resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" dependencies: @@ -4612,13 +5625,13 @@ winston@0.6.x: request "2.9.x" stack-trace "0.0.x" -wordwrap@0.0.2: +wordwrap@0.0.2, wordwrap@~0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" +wordwrap@^1.0.0, wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" wrappy@1, wrappy@~1.0.1, wrappy@~1.0.2: version "1.0.2" @@ -4632,6 +5645,12 @@ write-file-atomic@~1.1.4: imurmurhash "^0.1.4" slide "^1.1.5" +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + dependencies: + mkdirp "^0.5.1" + ws@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/ws/-/ws-1.0.1.tgz#7d0b2a2e58cddd819039c29c9de65045e1b310e9" @@ -4687,3 +5706,12 @@ yargs@~3.5.4: yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + +zip-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.1.0.tgz#2ad479fffc168e05a888e8c348ff6813b3f13733" + dependencies: + archiver-utils "^1.3.0" + compress-commons "^1.1.0" + lodash "^4.8.0" + readable-stream "^2.0.0"