From c40b89f317572702fe2a3faa670374f12236c8bf Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 27 Jun 2017 08:34:24 -0700 Subject: [PATCH 001/862] build(ReactTransitionGroup): Externalize ReactTransitionGroup (fixes big file size) (#474) * Externalize ReactTransitionGroup * Update transition group imports * Revert incorrect fix #433 * Revert change to main and fix in future PR. --- rollup.config.js | 1 + src/Alert.js | 2 +- src/Modal.js | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/rollup.config.js b/rollup.config.js index 5819435c6..04ae194ac 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -24,6 +24,7 @@ const config = { globals: { react: 'React', 'react-dom': 'ReactDOM', + 'react-transition-group': 'ReactTransitionGroup', }, targets: [ { dest: 'dist/reactstrap.es.js', format: 'es' }, diff --git a/src/Alert.js b/src/Alert.js index 2b7d1ad66..8717b6fd0 100644 --- a/src/Alert.js +++ b/src/Alert.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; -import CSSTransitionGroup from 'react-transition-group/CSSTransitionGroup'; +import { CSSTransitionGroup } from 'react-transition-group'; import { mapToCssModules } from './utils'; const FirstChild = ({ children }) => ( diff --git a/src/Modal.js b/src/Modal.js index cd618b984..07a85e49f 100644 --- a/src/Modal.js +++ b/src/Modal.js @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import ReactDOM from 'react-dom'; import classNames from 'classnames'; -import TransitionGroup from 'react-transition-group/TransitionGroup'; +import { TransitionGroup } from 'react-transition-group'; import Fade from './Fade'; import { getOriginalBodyPadding, From d1448e09928c040cd4905aba7e32d15a421ce694 Mon Sep 17 00:00:00 2001 From: Mark Johnson Date: Tue, 27 Jun 2017 08:43:01 -0700 Subject: [PATCH 002/862] fix(DropdownToggle): ensures color attribute is not leaked * fix(DropdownToggle): Fixes #461 (reverting bad PR#402) which ensures color attribute is NOT leaked * fix(DropdownToggle): Adding tests for color attribute and fixing logic to ensure that the color attribute is used for Buttons only. --- src/DropdownToggle.js | 3 +- src/__tests__/DropdownToggle.spec.js | 62 ++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/src/DropdownToggle.js b/src/DropdownToggle.js index 92dd2c20a..5948664a2 100644 --- a/src/DropdownToggle.js +++ b/src/DropdownToggle.js @@ -55,7 +55,7 @@ class DropdownToggle extends React.Component { } render() { - const { className, cssModule, caret, split, nav, tag, ...props } = this.props; + const { className, color, cssModule, caret, split, nav, tag, ...props } = this.props; const ariaLabel = props['aria-label'] || 'Toggle Dropdown'; const classes = mapToCssModules(classNames( className, @@ -75,6 +75,7 @@ class DropdownToggle extends React.Component { props.href = '#'; } else if (!tag) { Tag = Button; + props.color = color; } else { Tag = tag; } diff --git a/src/__tests__/DropdownToggle.spec.js b/src/__tests__/DropdownToggle.spec.js index fe3b95fb7..af4e6feb3 100644 --- a/src/__tests__/DropdownToggle.spec.js +++ b/src/__tests__/DropdownToggle.spec.js @@ -85,6 +85,68 @@ describe('DropdownToggle', () => { expect(wrapper.find('[data-toggle="dropdown"]').hasClass('dropdown-toggle')).toBe(true); }); + describe('color', () => { + it('should render the dropdown as a BUTTON element with default color secondary', () => { + const wrapper = mount( + , + { + context: { + isOpen: isOpen, + toggle: toggle + } + } + ); + + expect(wrapper.find('button').length).toBe(1); + expect(wrapper.find('button').hasClass('btn-secondary')).toBe(true); + }); + + it('should render the dropdown as a BUTTON element with explicit color success', () => { + const wrapper = mount( + , + { + context: { + isOpen: isOpen, + toggle: toggle + } + } + ); + + expect(wrapper.find('button').length).toBe(1); + expect(wrapper.find('button').hasClass('btn-success')).toBe(true); + }); + + it('should render the dropdown as an A element with no color attribute', () => { + const wrapper = mount( + , + { + context: { + isOpen: isOpen, + toggle: toggle + } + } + ); + + expect(wrapper.find('a').length).toBe(1); + expect(wrapper.find('a[color]').length).toBe(0); + }); + + it('should render the dropdown as a DIV element with no color attribute', () => { + const wrapper = mount( + , + { + context: { + isOpen: isOpen, + toggle: toggle + } + } + ); + + expect(wrapper.find('div').length).toBe(1); + expect(wrapper.find('div[color]').length).toBe(0); + }); + }); + it('should render a split', () => { const wrapper = mount( Ello world, From ba69f71af42f93f854b073dc94771e80bb173fff Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 27 Jun 2017 08:43:45 -0700 Subject: [PATCH 003/862] build(omit): Remove lodash.omit (#478) * Remove lodash.omit * Lint --- package.json | 1 - src/Collapse.js | 3 +-- src/Dropdown.js | 3 +-- src/DropdownItem.js | 3 +-- src/Fade.js | 3 +-- src/Popover.js | 3 +-- src/TabContent.js | 3 +-- src/Tooltip.js | 3 +-- src/__tests__/utils.spec.js | 42 +++++++++++++++++++++++++++++++++++++ src/utils.js | 13 ++++++++++++ 10 files changed, 62 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index d98f67721..205ec3c5f 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,6 @@ "classnames": "^2.2.3", "lodash.isfunction": "^3.0.8", "lodash.isobject": "^3.0.2", - "lodash.omit": "^4.4.1", "lodash.tonumber": "^4.0.3", "prop-types": "^15.5.8", "reactstrap-tether": "1.3.4" diff --git a/src/Collapse.js b/src/Collapse.js index 73b0368a1..039bf9ad9 100644 --- a/src/Collapse.js +++ b/src/Collapse.js @@ -1,8 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; -import omit from 'lodash.omit'; -import { mapToCssModules } from './utils'; +import { mapToCssModules, omit } from './utils'; const SHOW = 'SHOW'; const SHOWN = 'SHOWN'; diff --git a/src/Dropdown.js b/src/Dropdown.js index 53097752d..e8b9f91a8 100644 --- a/src/Dropdown.js +++ b/src/Dropdown.js @@ -5,8 +5,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import ReactDOM from 'react-dom'; import classNames from 'classnames'; -import omit from 'lodash.omit'; -import { mapToCssModules } from './utils'; +import { mapToCssModules, omit } from './utils'; import TetherContent from './TetherContent'; import DropdownMenu from './DropdownMenu'; diff --git a/src/DropdownItem.js b/src/DropdownItem.js index ca808ca78..6fbe02eb5 100644 --- a/src/DropdownItem.js +++ b/src/DropdownItem.js @@ -1,8 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -import omit from 'lodash.omit'; import classNames from 'classnames'; -import { mapToCssModules } from './utils'; +import { mapToCssModules, omit } from './utils'; const propTypes = { children: PropTypes.node, diff --git a/src/Fade.js b/src/Fade.js index ab92551be..9d4360dae 100644 --- a/src/Fade.js +++ b/src/Fade.js @@ -1,8 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; -import omit from 'lodash.omit'; -import { mapToCssModules } from './utils'; +import { mapToCssModules, omit } from './utils'; const propTypes = { baseClass: PropTypes.string, diff --git a/src/Popover.js b/src/Popover.js index 9d29d2545..52e639f4d 100644 --- a/src/Popover.js +++ b/src/Popover.js @@ -1,9 +1,8 @@ import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; -import omit from 'lodash.omit'; import TetherContent from './TetherContent'; -import { getTetherAttachments, mapToCssModules, tetherAttachements } from './utils'; +import { getTetherAttachments, mapToCssModules, omit, tetherAttachements } from './utils'; const propTypes = { placement: PropTypes.oneOf(tetherAttachements), diff --git a/src/TabContent.js b/src/TabContent.js index 43ea24aab..8c856d5ef 100644 --- a/src/TabContent.js +++ b/src/TabContent.js @@ -1,8 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; -import omit from 'lodash.omit'; -import { mapToCssModules } from './utils'; +import { mapToCssModules, omit } from './utils'; const propTypes = { tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]), diff --git a/src/Tooltip.js b/src/Tooltip.js index 1959757ef..00eb1d001 100644 --- a/src/Tooltip.js +++ b/src/Tooltip.js @@ -1,9 +1,8 @@ import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; -import omit from 'lodash.omit'; import TetherContent from './TetherContent'; -import { getTetherAttachments, tetherAttachements, mapToCssModules } from './utils'; +import { getTetherAttachments, mapToCssModules, omit, tetherAttachements } from './utils'; const propTypes = { placement: PropTypes.oneOf(tetherAttachements), diff --git a/src/__tests__/utils.spec.js b/src/__tests__/utils.spec.js index 925d158df..2ec31fa46 100644 --- a/src/__tests__/utils.spec.js +++ b/src/__tests__/utils.spec.js @@ -154,6 +154,48 @@ describe('Utils', () => { }); }); + describe('omit', () => { + it('should omit keys', () => { + const input = { + hello: 'world', + speed: 'fast', + size: 'small' + }; + expect(Utils.omit(input, ['hello'])).toEqual({ speed: 'fast', size: 'small' }); + }); + + it('should not alter source object', () => { + const input = { + hello: 'world', + speed: 'fast', + size: 'small' + }; + expect(Utils.omit(input, ['hello'])).toEqual({ speed: 'fast', size: 'small' }); + expect(input).toEqual({ + hello: 'world', + speed: 'fast', + size: 'small' + }); + }); + + it('should ignore non-existing keys', () => { + const input = { + hello: 'world', + speed: 'fast', + size: 'small' + }; + expect(Utils.omit(input, ['non-existing', 'hello'])).toEqual({ speed: 'fast', size: 'small' }); + }); + + it('should return a new object', () => { + const input = { + hello: 'world' + }; + // toBe tests equality using `===` and so will test if it's not the same object. + expect(Utils.omit(input, [])).not.toBe(input); + }); + }); + // TODO // describe('getScrollbarWidth', () => { // // jsdom workaround https://github.com/tmpvar/jsdom/issues/135#issuecomment-68191941 diff --git a/src/utils.js b/src/utils.js index 699ee69cd..2383cfae7 100644 --- a/src/utils.js +++ b/src/utils.js @@ -154,3 +154,16 @@ export function mapToCssModules(className, cssModule) { if (!cssModule) return className; return className.split(' ').map(c => cssModule[c] || c).join(' '); } + +/** + * Returns a new object with the key/value pairs from `obj` that are not in the array `omitKeys`. + */ +export function omit(obj, omitKeys) { + const result = {}; + Object.keys(obj).forEach(key => { + if (omitKeys.indexOf(key) === -1) { + result[key] = obj[key]; + } + }); + return result; +} From 2e3c687c0b5e8b41398285a153da62121f78c255 Mon Sep 17 00:00:00 2001 From: Evan Sharp Date: Tue, 27 Jun 2017 11:45:12 -0400 Subject: [PATCH 004/862] fix(Alert): map close class css modules (#471) Also adds ability to add additional classes to the close button closes #470 --- docs/lib/Components/AlertsPage.js | 1 + src/Alert.js | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/lib/Components/AlertsPage.js b/docs/lib/Components/AlertsPage.js index dfe9e4be8..aca94d71d 100644 --- a/docs/lib/Components/AlertsPage.js +++ b/docs/lib/Components/AlertsPage.js @@ -34,6 +34,7 @@ export default class AlertsPage extends React.Component { {`Alert.propTypes = { className: PropTypes.string, + closeClassName: PropTypes.string, color: PropTypes.string, // default: 'success' isOpen: PropTypes.bool, // default: true toggle: PropTypes.func, diff --git a/src/Alert.js b/src/Alert.js index 8717b6fd0..970947823 100644 --- a/src/Alert.js +++ b/src/Alert.js @@ -11,6 +11,7 @@ const FirstChild = ({ children }) => ( const propTypes = { children: PropTypes.node, className: PropTypes.string, + closeClassName: PropTypes.string, cssModule: PropTypes.object, color: PropTypes.string, isOpen: PropTypes.bool, @@ -33,6 +34,7 @@ const defaultProps = { const Alert = (props) => { const { className, + closeClassName, cssModule, tag: Tag, color, @@ -52,10 +54,12 @@ const Alert = (props) => { { 'alert-dismissible': toggle } ), cssModule); + const closeClasses = mapToCssModules(classNames('close', closeClassName), cssModule); + const alert = ( { toggle ? - : null } From 9e4d38105697549ca492213d26d1441b298260ee Mon Sep 17 00:00:00 2001 From: Joshua Antonson Date: Tue, 27 Jun 2017 11:48:32 -0400 Subject: [PATCH 005/862] docs(ButtonDropdown): fix typo in Button Dropdown docs (#447) This change fixes a typo in the button dropdown docs where "danger" was misspelled. --- docs/lib/Components/ButtonDropdownPage.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/lib/Components/ButtonDropdownPage.js b/docs/lib/Components/ButtonDropdownPage.js index dbd504013..f8521b680 100644 --- a/docs/lib/Components/ButtonDropdownPage.js +++ b/docs/lib/Components/ButtonDropdownPage.js @@ -73,7 +73,7 @@ DropdownToggle.propTypes = { - +
@@ -100,7 +100,7 @@ DropdownToggle.propTypes = {
             
             
             
-            
+            
           
         
         

From b598a4075e08ef9977a5b65aaa1f5a26e83a8d65 Mon Sep 17 00:00:00 2001
From: Evan Sharp 
Date: Tue, 27 Jun 2017 11:48:54 -0400
Subject: [PATCH 006/862] fix(Modal): add back attribute passthrough (#444)

fixes #443
---
 src/Modal.js                |  6 ++++++
 src/__tests__/Modal.spec.js | 15 +++++++++++++++
 2 files changed, 21 insertions(+)

diff --git a/src/Modal.js b/src/Modal.js
index 07a85e49f..6b8829008 100644
--- a/src/Modal.js
+++ b/src/Modal.js
@@ -9,6 +9,7 @@ import {
   conditionallyUpdateScrollbar,
   setScrollbarWidth,
   mapToCssModules,
+  omit
 } from './utils';
 
 const propTypes = {
@@ -45,6 +46,8 @@ const propTypes = {
   modalTransitionLeaveTimeout: PropTypes.number,
 };
 
+const propsToOmit = Object.keys(propTypes);
+
 const defaultProps = {
   isOpen: false,
   autoFocus: true,
@@ -182,6 +185,8 @@ class Modal extends React.Component {
   }
 
   renderModalDialog() {
+    const attributes = omit(this.props, propsToOmit);
+
     return (
       
(this._dialog = c)} + {...attributes} >
{ wrapper.unmount(); }); + it('should render with additional props if provided', () => { + isOpen = true; + const wrapper = mount( + + Yo! + + ); + + jasmine.clock().tick(300); + expect(wrapper.children().length).toBe(0); + expect(document.getElementsByClassName('modal-dialog').length).toBe(1); + expect(document.getElementsByClassName('modal-dialog')[0].style.maxWidth).toBe('95%'); + wrapper.unmount(); + }); + it('should render without fade transition if provided with fade={false}', () => { isOpen = true; const wrapper = mount( From f607b2cb5eaf5cb96aa583b5e501bf0676100ed7 Mon Sep 17 00:00:00 2001 From: Mark Johnson Date: Tue, 27 Jun 2017 08:51:55 -0700 Subject: [PATCH 007/862] fix(Navbar): remove default navigation role * fix(Navbar): Fixes #463 by ensuring that the default role is now empty for nav elements. * Updating tests. * Removing trailing spaces. --- src/Navbar.js | 1 - src/__tests__/Navbar.spec.js | 18 ++++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/Navbar.js b/src/Navbar.js index e4cf745b4..0040a7e63 100644 --- a/src/Navbar.js +++ b/src/Navbar.js @@ -19,7 +19,6 @@ const propTypes = { const defaultProps = { tag: 'nav', - role: 'navigation', toggleable: false, }; diff --git a/src/__tests__/Navbar.spec.js b/src/__tests__/Navbar.spec.js index 2f086be31..ba19f1af1 100644 --- a/src/__tests__/Navbar.spec.js +++ b/src/__tests__/Navbar.spec.js @@ -6,31 +6,37 @@ describe('Navbar', () => { it('should render .navbar markup', () => { const wrapper = shallow(); - expect(wrapper.html()).toBe(''); + expect(wrapper.html()).toBe(''); }); it('should render default .navbar-toggleable class', () => { const wrapper = shallow(); - expect(wrapper.html()).toBe(''); + expect(wrapper.html()).toBe(''); }); it('should render size based .navbar-toggleable-* classes', () => { const wrapper = shallow(); - expect(wrapper.html()).toBe(''); + expect(wrapper.html()).toBe(''); }); it('should render custom tag', () => { const wrapper = shallow(); - expect(wrapper.html()).toBe(''); + expect(wrapper.html()).toBe(''); + }); + + it('should render role', () => { + const wrapper = shallow(); + + expect(wrapper.html()).toBe(''); }); - it('sholid render children', () => { + it('should render children', () => { const wrapper = shallow(Children); - expect(wrapper.html()).toBe(''); + expect(wrapper.html()).toBe(''); }); it('should pass additional classNames', () => { From 2e861320a006d12061e08d4e06d6b8487d2f89b5 Mon Sep 17 00:00:00 2001 From: Matthew Heck Date: Tue, 27 Jun 2017 11:53:39 -0400 Subject: [PATCH 008/862] fix(Label): add form-control-label to appropriate Label components (#452) --- src/Label.js | 3 ++- src/__tests__/Label.spec.js | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/Label.js b/src/Label.js index 30fdd7ed3..d03fc759c 100644 --- a/src/Label.js +++ b/src/Label.js @@ -79,7 +79,8 @@ const Label = (props) => { check && inline && disabled ? 'disabled' : false, size ? `col-form-label-${size}` : false, colClasses, - colClasses.length ? 'col-form-label' : false + colClasses.length ? 'col-form-label' : false, + !check && !colClasses.length ? 'form-control-label' : false ), cssModule); return ( diff --git a/src/__tests__/Label.spec.js b/src/__tests__/Label.spec.js index d92f6f139..7b7929e5d 100644 --- a/src/__tests__/Label.spec.js +++ b/src/__tests__/Label.spec.js @@ -21,6 +21,30 @@ describe('Label', () => { expect(wrapper.hasClass('extra')).toBe(true); }); + it('should render with "form-control-label" class', () => { + const wrapper = shallow(); + + expect(wrapper.hasClass('form-control-label')).toBe(true); + }); + + it('should render with "form-control-label" class when inline prop is truthy', () => { + const wrapper = shallow(); + + expect(wrapper.hasClass('form-control-label')).toBe(true); + }); + + it('should not render with "form-control-label" class when a col is provided', () => { + const wrapper = shallow(); + + expect(wrapper.hasClass('form-control-label')).toBe(false); + }); + + it('should not render with "form-control-label" class when check prop is truthy', () => { + const wrapper = shallow(); + + expect(wrapper.hasClass('form-control-label')).toBe(false); + }); + it('should render with "col-form-label" class when a col is provided', () => { const wrapper = shallow(); From f15054fb3e53f90510f03de23fb4983c0dad1d29 Mon Sep 17 00:00:00 2001 From: Eddy Hernandez Date: Tue, 27 Jun 2017 09:06:46 -0700 Subject: [PATCH 009/862] chore(release): adding 4.7.0 (#479) --- CHANGELOG.md | 14 + package.json | 2 +- yarn.lock | 7005 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 7020 insertions(+), 1 deletion(-) create mode 100644 yarn.lock diff --git a/CHANGELOG.md b/CHANGELOG.md index 81711735e..9535db22d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,17 @@ + +# [4.7.0](https://github.com/reactstrap/reactstrap/compare/4.6.2...4.7.0) (2017-06-27) + + +### Bug Fixes + +* **Alert:** map close class css modules ([#471](https://github.com/reactstrap/reactstrap/issues/471)) ([2e3c687](https://github.com/reactstrap/reactstrap/commit/2e3c687)), closes [#470](https://github.com/reactstrap/reactstrap/issues/470) +* **DropdownToggle:** ensures color attribute is not leaked ([d1448e0](https://github.com/reactstrap/reactstrap/commit/d1448e0)), closes [#461](https://github.com/reactstrap/reactstrap/issues/461) [PR#402](https://github.com/PR/issues/402) +* **Label:** add form-control-label to appropriate Label components ([#452](https://github.com/reactstrap/reactstrap/issues/452)) ([2e86132](https://github.com/reactstrap/reactstrap/commit/2e86132)) +* **Modal:** add back attribute passthrough ([#444](https://github.com/reactstrap/reactstrap/issues/444)) ([b598a40](https://github.com/reactstrap/reactstrap/commit/b598a40)), closes [#443](https://github.com/reactstrap/reactstrap/issues/443) +* **Navbar:** remove default navigation role ([f607b2c](https://github.com/reactstrap/reactstrap/commit/f607b2c)), closes [#463](https://github.com/reactstrap/reactstrap/issues/463) + + + ## [4.6.2](https://github.com/reactstrap/reactstrap/compare/4.6.1...4.6.2) (2017-05-16) diff --git a/package.json b/package.json index 205ec3c5f..42985411a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "reactstrap", - "version": "4.6.2", + "version": "4.7.0", "description": "React Bootstrap 4 components", "main": "lib/index.js", "jsnext:main": "dist/reactstrap.es.js", diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 000000000..af5fff18c --- /dev/null +++ b/yarn.lock @@ -0,0 +1,7005 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@comandeer/babel-plugin-banner@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@comandeer/babel-plugin-banner/-/babel-plugin-banner-1.0.0.tgz#40bcce0bbee084b5b02545a33635d053c248356f" + +JSONStream@^1.0.4: + version "1.3.1" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.1.tgz#707f761e01dae9e16f1bcf93703b78c70966579a" + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abab@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d" + +abbrev@1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" + +accepts@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + dependencies: + mime-types "~2.1.11" + negotiator "0.6.1" + +acorn-globals@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" + dependencies: + acorn "^4.0.4" + +acorn-jsx@^3.0.0: + 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: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +acorn@^4.0.1, acorn@^4.0.4: + version "4.0.13" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + +acorn@^5.0.1: + version "5.0.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d" + +add-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" + +ajv-keywords@^1.0.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" + +ajv@^4.7.0, ajv@^4.9.1: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + 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" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-escapes@^1.1.0, ansi-escapes@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + +ansi-html@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.5.tgz#0dcaa5a081206866bc240a3b773a184ea3b88b64" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansicolors@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" + +anymatch@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + dependencies: + arrify "^1.0.0" + micromatch "^2.1.5" + +append-transform@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + dependencies: + default-require-extensions "^1.0.0" + +aproba@^1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" + +are-we-there-yet@~1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +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" + +aria-query@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-0.3.0.tgz#cb8a9984e2862711c83c80ade5b8f5ca0de2b467" + dependencies: + ast-types-flow "0.0.7" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1" + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + +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" + +array-ify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" + +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" + +array.prototype.find@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.0.4.tgz#556a5c5362c08648323ddaeb9de9d14bc1864c90" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + +arrify@^1.0.0, arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asap@~2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assert@^1.1.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + dependencies: + util "0.10.3" + +ast-types-flow@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async@^0.9.0: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + +async@^1.3.0, async@^1.4.0, async@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@^2.1.4: + version "2.4.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.4.1.tgz#62a56b279c98a11d0987096a01cc3eeb8eb7bbd7" + dependencies: + lodash "^4.14.0" + +async@~0.2.6: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +autoprefixer@6.7.2, autoprefixer@^6.3.1: + version "6.7.2" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.2.tgz#172ab07b998ae9b957530928a59a40be54a45023" + dependencies: + browserslist "^1.7.1" + caniuse-db "^1.0.30000618" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^5.2.11" + postcss-value-parser "^3.2.3" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +babel-cli@^6.14.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.24.1.tgz#207cd705bba61489b2ea41b5312341cf6aca2283" + dependencies: + babel-core "^6.24.1" + babel-polyfill "^6.23.0" + babel-register "^6.24.1" + babel-runtime "^6.22.0" + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.0.0" + glob "^7.0.0" + lodash "^4.2.0" + output-file-sync "^1.1.0" + path-is-absolute "^1.0.0" + slash "^1.0.0" + source-map "^0.5.0" + v8flags "^2.0.10" + optionalDependencies: + chokidar "^1.6.1" + +babel-code-frame@^6.11.0, babel-code-frame@^6.16.0, babel-code-frame@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +babel-core@6, babel-core@^6.0.0, babel-core@^6.14.0, babel-core@^6.21.0, babel-core@^6.24.1: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.25.0.tgz#7dd42b0463c742e9d5296deb3ec67a9322dad729" + dependencies: + babel-code-frame "^6.22.0" + babel-generator "^6.25.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.25.0" + babel-traverse "^6.25.0" + babel-types "^6.25.0" + babylon "^6.17.2" + convert-source-map "^1.1.0" + debug "^2.1.1" + json5 "^0.5.0" + lodash "^4.2.0" + minimatch "^3.0.2" + path-is-absolute "^1.0.0" + private "^0.1.6" + slash "^1.0.0" + source-map "^0.5.0" + +babel-core@6.22.1: + version "6.22.1" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.22.1.tgz#9c5fd658ba1772d28d721f6d25d968fc7ae21648" + dependencies: + babel-code-frame "^6.22.0" + babel-generator "^6.22.0" + babel-helpers "^6.22.0" + babel-messages "^6.22.0" + babel-register "^6.22.0" + babel-runtime "^6.22.0" + babel-template "^6.22.0" + babel-traverse "^6.22.1" + babel-types "^6.22.0" + babylon "^6.11.0" + convert-source-map "^1.1.0" + debug "^2.1.1" + json5 "^0.5.0" + lodash "^4.2.0" + minimatch "^3.0.2" + path-is-absolute "^1.0.0" + private "^0.1.6" + 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.18.0, babel-generator@^6.22.0, babel-generator@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.25.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-builder-react-jsx@^6.22.0, babel-helper-builder-react-jsx@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.24.1.tgz#0ad7917e33c8d751e646daca4e77cc19377d2cbc" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + esutils "^2.0.0" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-helper-evaluate-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.1.0.tgz#95d98c4ea36150483db2e7d3ec9e1954a72629cb" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-flip-expressions@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.1.2.tgz#77f6652f9de9c42401d827bd46ebd2109e3ef18a" + +babel-helper-function-name@^6.22.0, babel-helper-function-name@^6.24.1, babel-helper-function-name@^6.8.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-is-nodes-equiv@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz#34e9b300b1479ddd98ec77ea0bbe9342dfe39684" + +babel-helper-is-void-0@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/babel-helper-is-void-0/-/babel-helper-is-void-0-0.1.1.tgz#72f21a3abba0bef3837f9174fca731aed9a02888" + +babel-helper-mark-eval-scopes@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.1.1.tgz#4554345edf9f2549427bd2098e530253f8af2992" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-remove-or-void@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.1.1.tgz#9d7e1856dc6fafcb41b283a416730dc1844f66d7" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-to-multiple-sequence-expressions@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.1.1.tgz#5f1b832b39e4acf954e9137f0251395c71196b35" + +babel-helpers@^6.22.0, babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-jest@18.0.0, babel-jest@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-18.0.0.tgz#17ebba8cb3285c906d859e8707e4e79795fb65e3" + dependencies: + babel-core "^6.0.0" + babel-plugin-istanbul "^3.0.0" + babel-preset-jest "^18.0.0" + +babel-loader@6.2.10: + version "6.2.10" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.2.10.tgz#adefc2b242320cd5d15e65b31cea0e8b1b02d4b0" + dependencies: + find-cache-dir "^0.1.1" + loader-utils "^0.2.11" + mkdirp "^0.5.1" + object-assign "^4.0.1" + +babel-loader@^6.2.2: + version "6.4.1" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.4.1.tgz#0b34112d5b0748a8dcdbf51acf6f9bd42d50b8ca" + dependencies: + find-cache-dir "^0.1.1" + loader-utils "^0.2.16" + mkdirp "^0.5.1" + object-assign "^4.0.1" + +babel-messages@^6.22.0, babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0, babel-plugin-check-es2015-constants@^6.3.13: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-external-helpers@^6.18.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.22.0.tgz#2285f48b02bd5dede85175caf8c62e86adccefa1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-istanbul@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-3.1.2.tgz#11d5abde18425ec24b5d648c7e0b5d25cd354a22" + dependencies: + find-up "^1.1.2" + istanbul-lib-instrument "^1.4.2" + object-assign "^4.1.0" + test-exclude "^3.3.0" + +babel-plugin-jest-hoist@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-18.0.0.tgz#4150e70ecab560e6e7344adc849498072d34e12a" + +babel-plugin-minify-builtins@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.1.2.tgz#36de34a8d27436b6c3207e0ae239e6cff390914a" + dependencies: + babel-helper-evaluate-path "^0.1.0" + +babel-plugin-minify-constant-folding@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.1.2.tgz#53f05f792df7d7ceca4c490408ff11a961f9d01c" + dependencies: + babel-helper-evaluate-path "^0.1.0" + +babel-plugin-minify-dead-code-elimination@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.1.7.tgz#774f536f347b98393a27baa717872968813c342c" + dependencies: + babel-helper-mark-eval-scopes "^0.1.1" + babel-helper-remove-or-void "^0.1.1" + lodash.some "^4.6.0" + +babel-plugin-minify-flip-comparisons@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.1.2.tgz#e286b40b7599b18dfea195071e4279465cfc1884" + dependencies: + babel-helper-is-void-0 "^0.1.1" + +babel-plugin-minify-guarded-expressions@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.1.2.tgz#dfc3d473b0362d9605d3ce0ac1e22328c60d1007" + dependencies: + babel-helper-flip-expressions "^0.1.2" + +babel-plugin-minify-infinity@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.1.2.tgz#5f1cf67ddedcba13c8a00da832542df0091a1cd4" + +babel-plugin-minify-mangle-names@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.1.3.tgz#bfa24661a6794fb03833587e55828b65449e06fe" + dependencies: + babel-helper-mark-eval-scopes "^0.1.1" + +babel-plugin-minify-numeric-literals@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.1.1.tgz#d4b8b0c925f874714ee33ee4b26678583d7ce7fb" + +babel-plugin-minify-replace@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.1.2.tgz#b90b9e71ab4d3b36325629a91beabe13b0b16ac1" + +babel-plugin-minify-simplify@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.1.2.tgz#a968f1658fdeb2fc759e81fe331d89829df0f6b9" + dependencies: + babel-helper-flip-expressions "^0.1.2" + babel-helper-is-nodes-equiv "^0.0.1" + babel-helper-to-multiple-sequence-expressions "^0.1.1" + +babel-plugin-minify-type-constructors@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.1.2.tgz#db53c5b76cb8e2fcd45d862f17104c78761337ee" + dependencies: + babel-helper-is-void-0 "^0.1.1" + +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-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-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" + +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.13.0, babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + +babel-plugin-transform-async-to-generator@^6.24.1, babel-plugin-transform-async-to-generator@^6.8.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-class-properties@6.11.5: + version "6.11.5" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.11.5.tgz#429c7a4e7d8ac500448eb14ec502604bc568c91c" + dependencies: + babel-helper-function-name "^6.8.0" + babel-plugin-syntax-class-properties "^6.8.0" + babel-runtime "^6.9.1" + +babel-plugin-transform-class-properties@6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.22.0.tgz#aa78f8134495c7de06c097118ba061844e1dc1d8" + dependencies: + babel-helper-function-name "^6.22.0" + babel-plugin-syntax-class-properties "^6.8.0" + babel-runtime "^6.22.0" + babel-template "^6.22.0" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0, babel-plugin-transform-es2015-arrow-functions@^6.3.13: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0, babel-plugin-transform-es2015-block-scoped-functions@^6.3.13: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.14.0, babel-plugin-transform-es2015-block-scoping@^6.24.1, babel-plugin-transform-es2015-block-scoping@^6.6.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-plugin-transform-es2015-classes@^6.24.1, babel-plugin-transform-es2015-classes@^6.6.0, babel-plugin-transform-es2015-classes@^6.9.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.24.1, babel-plugin-transform-es2015-computed-properties@^6.3.13: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.22.0, babel-plugin-transform-es2015-destructuring@^6.6.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.24.1, babel-plugin-transform-es2015-duplicate-keys@^6.6.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.22.0, babel-plugin-transform-es2015-for-of@^6.6.0, babel-plugin-transform-es2015-for-of@^6.8.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.24.1, babel-plugin-transform-es2015-function-name@^6.3.13: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0, babel-plugin-transform-es2015-literals@^6.3.13: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.24.1, babel-plugin-transform-es2015-modules-amd@^6.8.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.24.1, babel-plugin-transform-es2015-modules-commonjs@^6.6.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-modules-systemjs@^6.12.0, babel-plugin-transform-es2015-modules-systemjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.12.0, babel-plugin-transform-es2015-modules-umd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.24.1, babel-plugin-transform-es2015-object-super@^6.3.13: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.24.1, babel-plugin-transform-es2015-parameters@^6.6.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.24.1, babel-plugin-transform-es2015-shorthand-properties@^6.3.13: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0, babel-plugin-transform-es2015-spread@^6.3.13: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.24.1, babel-plugin-transform-es2015-sticky-regex@^6.3.13: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0, babel-plugin-transform-es2015-template-literals@^6.6.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.22.0, babel-plugin-transform-es2015-typeof-symbol@^6.6.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.24.1, babel-plugin-transform-es2015-unicode-regex@^6.3.13: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.24.1, babel-plugin-transform-exponentiation-operator@^6.8.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-flow-strip-types@^6.22.0, babel-plugin-transform-flow-strip-types@^6.3.13: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" + dependencies: + babel-plugin-syntax-flow "^6.18.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-inline-consecutive-adds@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.1.2.tgz#5442e9f1c19c78a7899f8a4dee6fd481f61001f5" + +babel-plugin-transform-member-expression-literals@^6.8.4: + version "6.8.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.8.4.tgz#05679bc40596b91293401959aa1620ab1b2be437" + +babel-plugin-transform-merge-sibling-variables@^6.8.5: + version "6.8.5" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.8.5.tgz#03abdf107c61241913eb268ddede6d5bc541862c" + +babel-plugin-transform-minify-booleans@^6.8.2: + version "6.8.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.8.2.tgz#8451579f706e702c1e1ab2756de5c8ea369cf07c" + +babel-plugin-transform-object-rest-spread@6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.22.0.tgz#1d419b55e68d2e4f64a5ff3373bd67d73c8e83bc" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-object-rest-spread@6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.8.0.tgz#03d1308e257a9d8e1a815ae1fd3db21bdebf08d9" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-object-rest-spread@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-property-literals@^6.8.4: + version "6.8.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.8.4.tgz#6ad311110b80a192a56efb5ddf4fe3ca6f7a61da" + dependencies: + esutils "^2.0.2" + +babel-plugin-transform-react-constant-elements@6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.22.0.tgz#4af456f80d283e8be00f00f12852354defa08ee1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-react-constant-elements@6.9.1: + version "6.9.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.9.1.tgz#125b86d96cb322e2139b607fd749ad5fbb17f005" + dependencies: + babel-runtime "^6.9.1" + +babel-plugin-transform-react-display-name@^6.22.0, babel-plugin-transform-react-display-name@^6.23.0, babel-plugin-transform-react-display-name@^6.3.13: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-react-jsx-self@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.11.0.tgz#605c9450c1429f97a930f7e1dfe3f0d9d0dbd0f4" + dependencies: + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.9.0" + +babel-plugin-transform-react-jsx-self@6.22.0, babel-plugin-transform-react-jsx-self@^6.11.0, babel-plugin-transform-react-jsx-self@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e" + dependencies: + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-react-jsx-source@6.22.0, babel-plugin-transform-react-jsx-source@^6.22.0, babel-plugin-transform-react-jsx-source@^6.3.13: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6" + dependencies: + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-react-jsx-source@6.9.0: + version "6.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.9.0.tgz#af684a05c2067a86e0957d4f343295ccf5dccf00" + dependencies: + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.9.0" + +babel-plugin-transform-react-jsx@6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.22.0.tgz#48556b7dd4c3fe97d1c943bcd54fc3f2561c1817" + dependencies: + babel-helper-builder-react-jsx "^6.22.0" + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-react-jsx@^6.22.0, babel-plugin-transform-react-jsx@^6.24.1, babel-plugin-transform-react-jsx@^6.3.13: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" + dependencies: + babel-helper-builder-react-jsx "^6.24.1" + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-regenerator@6.14.0: + version "6.14.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.14.0.tgz#119119b20c8b4283f6c77f0170d404c3c654bec8" + dependencies: + babel-core "^6.14.0" + babel-plugin-syntax-async-functions "^6.8.0" + babel-plugin-transform-es2015-block-scoping "^6.14.0" + babel-plugin-transform-es2015-for-of "^6.8.0" + babel-runtime "^6.9.0" + babel-traverse "^6.14.0" + babel-types "^6.14.0" + babylon "^6.9.0" + private "~0.1.5" + +babel-plugin-transform-regenerator@6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.22.0.tgz#65740593a319c44522157538d690b84094617ea6" + dependencies: + regenerator-transform "0.9.8" + +babel-plugin-transform-regenerator@^6.24.1, babel-plugin-transform-regenerator@^6.6.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" + dependencies: + regenerator-transform "0.9.11" + +babel-plugin-transform-regexp-constructors@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.1.1.tgz#312ab7487cc88a1c62ee25ea1b6087e89b87799c" + +babel-plugin-transform-remove-console@^6.8.4: + version "6.8.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.8.4.tgz#41fddac19a729a4c3dd7ef2964eac07b096f9a8f" + +babel-plugin-transform-remove-debugger@^6.8.4: + version "6.8.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.8.4.tgz#f85704a08adaa71b55d77005b5b94e9b9df21f6e" + +babel-plugin-transform-remove-undefined@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.1.2.tgz#e1ebf51110f6b1e0665f28382ef73f95e5023652" + +babel-plugin-transform-runtime@6.15.0: + version "6.15.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.15.0.tgz#3d75b4d949ad81af157570273846fb59aeb0d57c" + dependencies: + babel-runtime "^6.9.0" + +babel-plugin-transform-runtime@6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.22.0.tgz#10968d760bbf6517243081eec778e10fa828551c" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-simplify-comparison-operators@^6.8.4: + version "6.8.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.8.4.tgz#2aa24a262d664c8cb3e125a306c798d7a2de08d5" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-undefined-to-void@^6.8.2: + version "6.8.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.8.2.tgz#fe2b1d294eb05e87524eb93724dea6e2c3d66fa1" + +babel-polyfill@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" + dependencies: + babel-runtime "^6.22.0" + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-preset-babili@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/babel-preset-babili/-/babel-preset-babili-0.1.3.tgz#d2b08ddcec59e0a36f11a32803cdefce7085d80e" + dependencies: + babel-plugin-minify-builtins "^0.1.2" + babel-plugin-minify-constant-folding "^0.1.2" + babel-plugin-minify-dead-code-elimination "^0.1.7" + babel-plugin-minify-flip-comparisons "^0.1.2" + babel-plugin-minify-guarded-expressions "^0.1.2" + babel-plugin-minify-infinity "^0.1.2" + babel-plugin-minify-mangle-names "^0.1.3" + babel-plugin-minify-numeric-literals "^0.1.1" + babel-plugin-minify-replace "^0.1.2" + babel-plugin-minify-simplify "^0.1.2" + babel-plugin-minify-type-constructors "^0.1.2" + babel-plugin-transform-inline-consecutive-adds "^0.1.2" + babel-plugin-transform-member-expression-literals "^6.8.4" + babel-plugin-transform-merge-sibling-variables "^6.8.5" + babel-plugin-transform-minify-booleans "^6.8.2" + babel-plugin-transform-property-literals "^6.8.4" + babel-plugin-transform-regexp-constructors "^0.1.1" + babel-plugin-transform-remove-console "^6.8.4" + babel-plugin-transform-remove-debugger "^6.8.4" + babel-plugin-transform-remove-undefined "^0.1.2" + babel-plugin-transform-simplify-comparison-operators "^6.8.4" + babel-plugin-transform-undefined-to-void "^6.8.2" + lodash.isplainobject "^4.0.6" + +babel-preset-env@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.2.1.tgz#659178f54df74a74765f796be4d290b5beeb3f5f" + dependencies: + babel-plugin-check-es2015-constants "^6.3.13" + babel-plugin-syntax-trailing-function-commas "^6.13.0" + babel-plugin-transform-async-to-generator "^6.8.0" + babel-plugin-transform-es2015-arrow-functions "^6.3.13" + babel-plugin-transform-es2015-block-scoped-functions "^6.3.13" + babel-plugin-transform-es2015-block-scoping "^6.6.0" + babel-plugin-transform-es2015-classes "^6.6.0" + babel-plugin-transform-es2015-computed-properties "^6.3.13" + babel-plugin-transform-es2015-destructuring "^6.6.0" + babel-plugin-transform-es2015-duplicate-keys "^6.6.0" + babel-plugin-transform-es2015-for-of "^6.6.0" + babel-plugin-transform-es2015-function-name "^6.3.13" + babel-plugin-transform-es2015-literals "^6.3.13" + babel-plugin-transform-es2015-modules-amd "^6.8.0" + babel-plugin-transform-es2015-modules-commonjs "^6.6.0" + babel-plugin-transform-es2015-modules-systemjs "^6.12.0" + babel-plugin-transform-es2015-modules-umd "^6.12.0" + babel-plugin-transform-es2015-object-super "^6.3.13" + babel-plugin-transform-es2015-parameters "^6.6.0" + babel-plugin-transform-es2015-shorthand-properties "^6.3.13" + babel-plugin-transform-es2015-spread "^6.3.13" + babel-plugin-transform-es2015-sticky-regex "^6.3.13" + babel-plugin-transform-es2015-template-literals "^6.6.0" + babel-plugin-transform-es2015-typeof-symbol "^6.6.0" + babel-plugin-transform-es2015-unicode-regex "^6.3.13" + babel-plugin-transform-exponentiation-operator "^6.8.0" + babel-plugin-transform-regenerator "^6.6.0" + browserslist "^1.4.0" + electron-to-chromium "^1.1.0" + invariant "^2.2.2" + +babel-preset-es2015-rollup@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/babel-preset-es2015-rollup/-/babel-preset-es2015-rollup-3.0.0.tgz#854b63ecde2ee98cac40e882f67bfcf185b1f24a" + dependencies: + babel-plugin-external-helpers "^6.18.0" + babel-preset-es2015 "^6.3.13" + require-relative "^0.8.7" + +babel-preset-es2015@^6.14.0, babel-preset-es2015@^6.3.13: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel-plugin-transform-es2015-classes "^6.24.1" + babel-plugin-transform-es2015-computed-properties "^6.24.1" + babel-plugin-transform-es2015-destructuring "^6.22.0" + babel-plugin-transform-es2015-duplicate-keys "^6.24.1" + babel-plugin-transform-es2015-for-of "^6.22.0" + babel-plugin-transform-es2015-function-name "^6.24.1" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-plugin-transform-es2015-modules-systemjs "^6.24.1" + babel-plugin-transform-es2015-modules-umd "^6.24.1" + babel-plugin-transform-es2015-object-super "^6.24.1" + babel-plugin-transform-es2015-parameters "^6.24.1" + babel-plugin-transform-es2015-shorthand-properties "^6.24.1" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.24.1" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.22.0" + babel-plugin-transform-es2015-unicode-regex "^6.24.1" + babel-plugin-transform-regenerator "^6.24.1" + +babel-preset-es2016@^6.11.3: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2016/-/babel-preset-es2016-6.24.1.tgz#f900bf93e2ebc0d276df9b8ab59724ebfd959f8b" + dependencies: + babel-plugin-transform-exponentiation-operator "^6.24.1" + +babel-preset-es2017@^6.14.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2017/-/babel-preset-es2017-6.24.1.tgz#597beadfb9f7f208bcfd8a12e9b2b29b8b2f14d1" + dependencies: + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.24.1" + +babel-preset-flow@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d" + dependencies: + babel-plugin-transform-flow-strip-types "^6.22.0" + +babel-preset-jest@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-18.0.0.tgz#84faf8ca3ec65aba7d5e3f59bbaed935ab24049e" + dependencies: + babel-plugin-jest-hoist "^18.0.0" + +babel-preset-latest@6.14.0: + version "6.14.0" + resolved "https://registry.yarnpkg.com/babel-preset-latest/-/babel-preset-latest-6.14.0.tgz#1684ace816c998ce72d20e5c5f710329d40f9246" + dependencies: + babel-preset-es2015 "^6.14.0" + babel-preset-es2016 "^6.11.3" + babel-preset-es2017 "^6.14.0" + +babel-preset-react-app@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-0.2.1.tgz#bf94623382adc2c4c7e098a66229c6671a79f842" + dependencies: + babel-plugin-transform-class-properties "6.11.5" + babel-plugin-transform-object-rest-spread "6.8.0" + babel-plugin-transform-react-constant-elements "6.9.1" + babel-plugin-transform-react-jsx-self "6.11.0" + babel-plugin-transform-react-jsx-source "6.9.0" + babel-plugin-transform-regenerator "6.14.0" + babel-plugin-transform-runtime "6.15.0" + babel-preset-latest "6.14.0" + babel-preset-react "6.11.1" + babel-runtime "6.11.6" + +babel-preset-react-app@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-2.2.0.tgz#3143bcf316049f78b5f9d0422fd7822ca4715ca4" + dependencies: + babel-plugin-transform-class-properties "6.22.0" + babel-plugin-transform-object-rest-spread "6.22.0" + babel-plugin-transform-react-constant-elements "6.22.0" + babel-plugin-transform-react-jsx "6.22.0" + babel-plugin-transform-react-jsx-self "6.22.0" + babel-plugin-transform-react-jsx-source "6.22.0" + babel-plugin-transform-regenerator "6.22.0" + babel-plugin-transform-runtime "6.22.0" + babel-preset-env "1.2.1" + babel-preset-react "6.22.0" + babel-runtime "6.22.0" + +babel-preset-react@6.11.1: + version "6.11.1" + resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.11.1.tgz#98ac2bd3c1b76f3062ae082580eade154a19b590" + dependencies: + babel-plugin-syntax-flow "^6.3.13" + babel-plugin-syntax-jsx "^6.3.13" + babel-plugin-transform-flow-strip-types "^6.3.13" + babel-plugin-transform-react-display-name "^6.3.13" + babel-plugin-transform-react-jsx "^6.3.13" + babel-plugin-transform-react-jsx-self "^6.11.0" + babel-plugin-transform-react-jsx-source "^6.3.13" + +babel-preset-react@6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.22.0.tgz#7bc97e2d73eec4b980fb6b4e4e0884e81ccdc165" + dependencies: + babel-plugin-syntax-flow "^6.3.13" + babel-plugin-syntax-jsx "^6.3.13" + babel-plugin-transform-flow-strip-types "^6.22.0" + babel-plugin-transform-react-display-name "^6.22.0" + babel-plugin-transform-react-jsx "^6.22.0" + babel-plugin-transform-react-jsx-self "^6.22.0" + babel-plugin-transform-react-jsx-source "^6.22.0" + +babel-preset-react@^6.11.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" + dependencies: + babel-plugin-syntax-jsx "^6.3.13" + babel-plugin-transform-react-display-name "^6.23.0" + babel-plugin-transform-react-jsx "^6.24.1" + babel-plugin-transform-react-jsx-self "^6.22.0" + babel-plugin-transform-react-jsx-source "^6.22.0" + babel-preset-flow "^6.23.0" + +babel-register@^6.22.0, babel-register@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" + dependencies: + babel-core "^6.24.1" + babel-runtime "^6.22.0" + core-js "^2.4.0" + home-or-tmp "^2.0.0" + lodash "^4.2.0" + mkdirp "^0.5.1" + source-map-support "^0.4.2" + +babel-runtime@6.11.6: + version "6.11.6" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.11.6.tgz#6db707fef2d49c49bfa3cb64efdb436b518b8222" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.9.5" + +babel-runtime@6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.22.0.tgz#1cf8b4ac67c77a4ddb0db2ae1f74de52ac4ca611" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-runtime@^6.0.0, babel-runtime@^6.18.0, babel-runtime@^6.20.0, babel-runtime@^6.22.0, babel-runtime@^6.9.0, babel-runtime@^6.9.1: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-template@^6.16.0, babel-template@^6.22.0, babel-template@^6.24.1, babel-template@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.25.0" + babel-types "^6.25.0" + babylon "^6.17.2" + lodash "^4.2.0" + +babel-traverse@^6.14.0, babel-traverse@^6.15.0, babel-traverse@^6.18.0, babel-traverse@^6.22.1, babel-traverse@^6.24.1, babel-traverse@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1" + dependencies: + babel-code-frame "^6.22.0" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.25.0" + babylon "^6.17.2" + debug "^2.2.0" + globals "^9.0.0" + invariant "^2.2.0" + lodash "^4.2.0" + +babel-types@^6.14.0, babel-types@^6.15.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.22.0, babel-types@^6.24.1, babel-types@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e" + dependencies: + babel-runtime "^6.22.0" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + +babylon@^6.11.0, babylon@^6.13.0, babylon@^6.17.2, babylon@^6.9.0: + version "6.17.3" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.3.tgz#1327d709950b558f204e5352587fd0290f8d8e48" + +balanced-match@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +base64-js@^1.0.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +big.js@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" + +binary-extensions@^1.0.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^2.10.2: + version "2.11.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" + +bluebird@^3.0.5, bluebird@^3.4.6: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" + +boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +bootstrap@^4.0.0-alpha.6: + version "4.0.0-alpha.6" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.0.0-alpha.6.tgz#4f54dd33ac0deac3b28407bc2df7ec608869c9c8" + dependencies: + jquery ">=1.9.1" + tether "^1.4.0" + +brace-expansion@^1.0.0, brace-expansion@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +browser-resolve@^1.11.0, browser-resolve@^1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + dependencies: + resolve "1.1.7" + +browserify-aes@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-0.4.0.tgz#067149b668df31c4b58533e02d01e806d8608e2c" + dependencies: + inherits "^2.0.1" + +browserify-zlib@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" + dependencies: + pako "~0.2.0" + +browserslist@^1.3.6, browserslist@^1.4.0, browserslist@^1.5.2, browserslist@^1.7.1: + version "1.7.7" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" + dependencies: + caniuse-db "^1.0.30000639" + electron-to-chromium "^1.2.7" + +bser@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169" + dependencies: + node-int64 "^0.4.0" + +buffer@^4.9.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-modules@^1.0.0, builtin-modules@^1.1.0, builtin-modules@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + +bytes@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.3.0.tgz#d5b680a165b6201739acb611542aabc2d8ceb070" + +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" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + +camel-case@3.0.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + +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" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + +caniuse-api@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" + dependencies: + browserslist "^1.3.6" + caniuse-db "^1.0.30000529" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000618, caniuse-db@^1.0.30000639: + version "1.0.30000690" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000690.tgz#ee4e0750070f6aae6f40e76477984449bd6cb48a" + +cardinal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-1.0.0.tgz#50e21c1b0aa37729f9377def196b5a9cec932ee9" + dependencies: + ansicolors "~0.2.1" + redeyed "~1.0.0" + +case-sensitive-paths-webpack-plugin@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-1.1.4.tgz#8aaedd5699a86cac2b34cf40d9b4145758978472" + +caseless@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chain-function@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.0.tgz#0d4ab37e7e18ead0bdc47b920764118ce58733dc" + +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: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +cheerio@^0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash.assignin "^4.0.9" + lodash.bind "^4.1.4" + lodash.defaults "^4.0.1" + lodash.filter "^4.4.0" + lodash.flatten "^4.2.0" + lodash.foreach "^4.3.0" + lodash.map "^4.4.0" + lodash.merge "^4.4.0" + lodash.pick "^4.2.1" + lodash.reduce "^4.4.0" + lodash.reject "^4.4.0" + lodash.some "^4.4.0" + +chokidar@^1.0.0, chokidar@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +ci-info@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534" + +circular-json@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" + +clap@^1.0.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.0.tgz#59c90fe3e137104746ff19469a27a634ff68c857" + dependencies: + chalk "^1.1.3" + +classnames@^2.2.3: + version "2.2.5" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" + +clean-css@4.1.x: + version "4.1.4" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.4.tgz#eec8811db27457e0078d8ca921fa81b72fa82bf4" + dependencies: + source-map "0.5.x" + +clean-webpack-plugin@^0.1.8: + version "0.1.16" + resolved "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-0.1.16.tgz#422a8e150bf3d5abfd3d14bfacb070e80fb2e23f" + dependencies: + rimraf "~2.5.1" + +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-table@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + dependencies: + colors "1.0.3" + +cli-usage@^0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/cli-usage/-/cli-usage-0.1.4.tgz#7c01e0dc706c234b39c933838c8e20b2175776e2" + dependencies: + marked "^0.3.6" + marked-terminal "^1.6.2" + +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" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +clone@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +coa@~1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.3.tgz#1b54a5e1dcf77c990455d4deea98c564416dc893" + dependencies: + q "^1.1.2" + +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" + +color-convert@^1.3.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" + dependencies: + color-name "^1.1.1" + +color-name@^1.0.0, color-name@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.2.tgz#5c8ab72b64bd2215d617ae9559ebb148475cf98d" + +color-string@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" + dependencies: + color-name "^1.0.0" + +color@^0.11.0: + version "0.11.4" + resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" + dependencies: + clone "^1.0.2" + color-convert "^1.3.0" + color-string "^0.3.0" + +colormin@^1.0.5: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" + dependencies: + color "^0.11.0" + css-color-names "0.0.4" + has "^1.0.1" + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + +colors@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@2.9.x, commander@^2.8.1, commander@^2.9.0, commander@~2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + +compare-func@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648" + dependencies: + array-ify "^1.0.0" + dot-prop "^3.0.0" + +compressible@~2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.10.tgz#feda1c7f7617912732b29bf8cf26252a20b9eecd" + dependencies: + mime-db ">= 1.27.0 < 2" + +compression@^1.5.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.6.2.tgz#cceb121ecc9d09c52d7ad0c3350ea93ddd402bc3" + dependencies: + accepts "~1.3.3" + bytes "2.3.0" + compressible "~2.0.8" + debug "~2.2.0" + on-headers "~1.0.1" + vary "~1.1.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@^1.4.10, concat-stream@^1.4.6, concat-stream@^1.5.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + dependencies: + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +connect-history-api-fallback@1.3.0, connect-history-api-fallback@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz#e51d17f8f0ef0db90a64fdb47de3051556e9f169" + +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +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.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + +content-type-parser@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.1.tgz#c3e56988c53c65127fb46d4032a3a900246fdc94" + +content-type@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" + +conventional-changelog-angular@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.3.4.tgz#7d7cdfbd358948312904d02229a61fd6075cf455" + dependencies: + compare-func "^1.3.1" + github-url-from-git "^1.4.0" + q "^1.4.1" + +conventional-changelog-atom@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-atom/-/conventional-changelog-atom-0.1.0.tgz#67a47c66a42b2f8909ef1587c9989ae1de730b92" + dependencies: + q "^1.4.1" + +conventional-changelog-cli@^1.1.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-cli/-/conventional-changelog-cli-1.3.1.tgz#1cd5a9dbae25ffb5ffe67afef1e136eaceefd2d5" + dependencies: + add-stream "^1.0.0" + conventional-changelog "^1.1.3" + lodash "^4.1.0" + meow "^3.7.0" + tempfile "^1.1.1" + +conventional-changelog-codemirror@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.1.0.tgz#7577a591dbf9b538e7a150a7ee62f65a2872b334" + dependencies: + q "^1.4.1" + +conventional-changelog-core@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-1.9.0.tgz#de5dfbc091847656508d4a389e35c9a1bc49e7f4" + dependencies: + conventional-changelog-writer "^1.1.0" + conventional-commits-parser "^1.0.0" + dateformat "^1.0.12" + get-pkg-repo "^1.0.0" + git-raw-commits "^1.2.0" + git-remote-origin-url "^2.0.0" + git-semver-tags "^1.2.0" + lodash "^4.0.0" + normalize-package-data "^2.3.5" + q "^1.4.1" + read-pkg "^1.1.0" + read-pkg-up "^1.0.1" + through2 "^2.0.0" + +conventional-changelog-ember@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-0.2.6.tgz#8b7355419f5127493c4c562473ab2fc792f1c2b6" + dependencies: + q "^1.4.1" + +conventional-changelog-eslint@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-eslint/-/conventional-changelog-eslint-0.1.0.tgz#a52411e999e0501ce500b856b0a643d0330907e2" + dependencies: + q "^1.4.1" + +conventional-changelog-express@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-express/-/conventional-changelog-express-0.1.0.tgz#55c6c841c811962036c037bdbd964a54ae310fce" + dependencies: + q "^1.4.1" + +conventional-changelog-jquery@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz#0208397162e3846986e71273b6c79c5b5f80f510" + dependencies: + q "^1.4.1" + +conventional-changelog-jscs@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz#0479eb443cc7d72c58bf0bcf0ef1d444a92f0e5c" + dependencies: + q "^1.4.1" + +conventional-changelog-jshint@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-0.1.0.tgz#00cab8e9a3317487abd94c4d84671342918d2a07" + dependencies: + compare-func "^1.3.1" + q "^1.4.1" + +conventional-changelog-writer@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-1.4.1.tgz#3f4cb4d003ebb56989d30d345893b52a43639c8e" + dependencies: + compare-func "^1.3.1" + conventional-commits-filter "^1.0.0" + dateformat "^1.0.11" + handlebars "^4.0.2" + json-stringify-safe "^5.0.1" + lodash "^4.0.0" + meow "^3.3.0" + semver "^5.0.1" + split "^1.0.0" + through2 "^2.0.0" + +conventional-changelog@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-1.1.4.tgz#108bc750c2a317e200e2f9b413caaa1f8c7efa3b" + dependencies: + conventional-changelog-angular "^1.3.4" + conventional-changelog-atom "^0.1.0" + conventional-changelog-codemirror "^0.1.0" + conventional-changelog-core "^1.9.0" + conventional-changelog-ember "^0.2.6" + conventional-changelog-eslint "^0.1.0" + conventional-changelog-express "^0.1.0" + conventional-changelog-jquery "^0.1.0" + conventional-changelog-jscs "^0.1.0" + conventional-changelog-jshint "^0.1.0" + +conventional-commits-filter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-1.0.0.tgz#6fc2a659372bc3f2339cf9ffff7e1b0344b93039" + dependencies: + is-subset "^0.1.1" + modify-values "^1.0.0" + +conventional-commits-parser@^1.0.0, conventional-commits-parser@^1.0.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-1.3.0.tgz#e327b53194e1a7ad5dc63479ee9099a52b024865" + dependencies: + JSONStream "^1.0.4" + is-text-path "^1.0.0" + lodash "^4.2.1" + meow "^3.3.0" + split2 "^2.0.0" + through2 "^2.0.0" + trim-off-newlines "^1.0.0" + +conventional-recommended-bump@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-0.3.0.tgz#e839de8f57cbb43445c8b4967401de0644c425d8" + dependencies: + concat-stream "^1.4.10" + conventional-commits-filter "^1.0.0" + conventional-commits-parser "^1.0.1" + git-latest-semver-tag "^1.0.0" + git-raw-commits "^1.0.0" + meow "^3.3.0" + object-assign "^4.0.1" + +convert-source-map@^1.1.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +copy-webpack-plugin@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-3.0.1.tgz#9bb3e9d6c6064de65c5bce44cf236b4d077a2131" + dependencies: + bluebird "^2.10.2" + fs-extra "^0.26.4" + glob "^6.0.4" + lodash "^4.3.0" + minimatch "^3.0.0" + node-dir "^0.1.10" + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + +core-js@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" + +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" + +cosmiconfig@^2.1.0, cosmiconfig@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-2.1.3.tgz#952771eb0dddc1cb3fa2f6fbe51a522e93b3ee0a" + dependencies: + is-directory "^0.3.1" + js-yaml "^3.4.3" + minimist "^1.2.0" + object-assign "^4.1.0" + os-homedir "^1.0.1" + parse-json "^2.2.0" + require-from-string "^1.1.0" + +coveralls@^2.11.12: + version "2.13.1" + resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-2.13.1.tgz#d70bb9acc1835ec4f063ff9dac5423c17b11f178" + dependencies: + js-yaml "3.6.1" + lcov-parse "0.0.10" + log-driver "1.2.5" + minimist "1.2.0" + request "2.79.0" + +create-react-class@^15.6.0: + version "15.6.0" + resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.0.tgz#ab448497c26566e1e29413e883207d57cfe7bed4" + dependencies: + fbjs "^0.8.9" + loose-envify "^1.3.1" + object-assign "^4.1.1" + +cross-env@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-2.0.1.tgz#f283b4039ea759ada9ab7e987ad3bddb241b79a6" + dependencies: + cross-spawn "^3.0.1" + lodash.assign "^3.2.0" + +cross-spawn@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cross-spawn@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +crypto-browserify@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.3.0.tgz#b9fc75bb4a0ed61dcf1cd5dae96eb30c9c3e506c" + dependencies: + browserify-aes "0.4.0" + pbkdf2-compat "2.0.1" + ripemd160 "0.2.0" + sha.js "2.2.6" + +css-color-names@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + +css-loader@0.26.1: + version "0.26.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.26.1.tgz#2ba7f20131b93597496b3e9bb500785a49cd29ea" + dependencies: + babel-code-frame "^6.11.0" + css-selector-tokenizer "^0.7.0" + cssnano ">=2.6.1 <4" + loader-utils "~0.2.2" + lodash.camelcase "^4.3.0" + object-assign "^4.0.1" + postcss "^5.0.6" + postcss-modules-extract-imports "^1.0.0" + postcss-modules-local-by-default "^1.0.1" + postcss-modules-scope "^1.0.0" + postcss-modules-values "^1.1.0" + source-list-map "^0.1.4" + +css-loader@^0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.25.0.tgz#c3febc8ce28f4c83576b6b13707f47f90c390223" + dependencies: + babel-code-frame "^6.11.0" + css-selector-tokenizer "^0.6.0" + cssnano ">=2.6.1 <4" + loader-utils "~0.2.2" + lodash.camelcase "^3.0.1" + object-assign "^4.0.1" + postcss "^5.0.6" + postcss-modules-extract-imports "^1.0.0" + postcss-modules-local-by-default "^1.0.1" + postcss-modules-scope "^1.0.0" + postcss-modules-values "^1.1.0" + source-list-map "^0.1.4" + +css-select@^1.1.0, css-select@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-selector-tokenizer@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.6.0.tgz#6445f582c7930d241dcc5007a43d6fcb8f073152" + dependencies: + cssesc "^0.1.0" + fastparse "^1.1.1" + regexpu-core "^1.0.0" + +css-selector-tokenizer@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" + dependencies: + cssesc "^0.1.0" + fastparse "^1.1.1" + regexpu-core "^1.0.0" + +css-what@2.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" + +cssesc@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" + +"cssnano@>=2.6.1 <4": + version "3.10.0" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" + dependencies: + autoprefixer "^6.3.1" + decamelize "^1.1.2" + defined "^1.0.0" + has "^1.0.1" + object-assign "^4.0.1" + postcss "^5.0.14" + postcss-calc "^5.2.0" + postcss-colormin "^2.1.8" + postcss-convert-values "^2.3.4" + postcss-discard-comments "^2.0.4" + postcss-discard-duplicates "^2.0.1" + postcss-discard-empty "^2.0.1" + postcss-discard-overridden "^0.1.1" + postcss-discard-unused "^2.2.1" + postcss-filter-plugins "^2.0.0" + postcss-merge-idents "^2.1.5" + postcss-merge-longhand "^2.0.1" + postcss-merge-rules "^2.0.3" + postcss-minify-font-values "^1.0.2" + postcss-minify-gradients "^1.0.1" + postcss-minify-params "^1.0.4" + postcss-minify-selectors "^2.0.4" + postcss-normalize-charset "^1.1.0" + postcss-normalize-url "^3.0.7" + postcss-ordered-values "^2.1.0" + postcss-reduce-idents "^2.2.2" + postcss-reduce-initial "^1.0.0" + postcss-reduce-transforms "^1.0.3" + postcss-svgo "^2.1.1" + postcss-unique-selectors "^2.0.2" + postcss-value-parser "^3.2.3" + postcss-zindex "^2.0.1" + +csso@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" + dependencies: + clap "^1.0.9" + source-map "^0.5.3" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + +"cssstyle@>= 0.2.37 < 0.3.0": + version "0.2.37" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + dependencies: + cssom "0.3.x" + +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" + +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + dependencies: + es5-ext "^0.10.9" + +damerau-levenshtein@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514" + +dargs@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" + dependencies: + number-is-nan "^1.0.0" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +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.11, dateformat@^1.0.12: + 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@2.2.0, debug@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +debug@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e" + dependencies: + ms "2.0.0" + +debug@2.6.8, debug@^2.1.0, debug@^2.1.1, debug@^2.2.0, debug@^2.6.0, debug@^2.6.3, debug@^2.6.6: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + dependencies: + ms "2.0.0" + +decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-equal@^1.0.0, deep-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + +deep-extend@~0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +default-require-extensions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + dependencies: + strip-bom "^2.0.0" + +define-properties@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" + dependencies: + foreach "^2.0.5" + object-keys "^1.0.8" + +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" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +depd@1.1.0, depd@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +detect-port@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.1.0.tgz#fde7574591ea3de74445782643c3f921b2a4618c" + dependencies: + debug "^2.6.0" + +diff@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + +doctrine@1.3.x, doctrine@^1.2.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.3.0.tgz#13e75682b55518424276f7c173783456ef913d26" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +dom-converter@~0.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.1.4.tgz#a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b" + dependencies: + utila "~0.3" + +dom-helpers@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.2.1.tgz#3203e07fed217bd1f424b019735582fc37b2825a" + +dom-serializer@0, dom-serializer@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + dependencies: + domelementtype "~1.1.1" + entities "~1.1.1" + +domain-browser@^1.1.1: + version "1.1.7" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" + +domelementtype@1, domelementtype@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" + +domelementtype@~1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" + +domhandler@2.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz#d2646f5e57f6c3bab11cf6cb05d3c0acf7412594" + dependencies: + domelementtype "1" + +domhandler@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.1.tgz#892e47000a99be55bbf3774ffea0561d8879c259" + dependencies: + domelementtype "1" + +domutils@1.1: + version "1.1.6" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485" + dependencies: + domelementtype "1" + +domutils@1.5.1, domutils@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" + dependencies: + is-obj "^1.0.0" + +dotenv@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-2.0.0.tgz#bd759c357aaa70365e01c96b7b0bec08a6e0d949" + +duplexer@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +ejs@^2.5.1: + version "2.5.6" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.6.tgz#479636bfa3fe3b1debd52087f0acb204b4f19c88" + +electron-to-chromium@^1.1.0, electron-to-chromium@^1.2.7: + version "1.3.14" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.14.tgz#64af0f9efd3c3c6acd57d71f83b49ca7ee9c4b43" + +emoji-regex@^6.1.0: + version "6.4.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.4.2.tgz#a30b6fee353d406d96cfb9fa765bdc82897eff6e" + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + +encodeurl@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + +enhanced-resolve@~0.9.0: + version "0.9.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e" + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.2.0" + tapable "^0.1.8" + +entities@^1.1.1, entities@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + +enzyme@^2.8.2: + version "2.8.2" + resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-2.8.2.tgz#6c8bcb05012abc4aa4bc3213fb23780b9b5b1714" + dependencies: + cheerio "^0.22.0" + function.prototype.name "^1.0.0" + is-subset "^0.1.1" + lodash "^4.17.2" + object-is "^1.0.1" + object.assign "^4.0.4" + object.entries "^1.0.3" + object.values "^1.0.3" + prop-types "^15.5.4" + uuid "^2.0.3" + +"errno@>=0.1.1 <0.2.0-0", errno@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" + dependencies: + prr "~0.0.0" + +error-ex@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.6.1, es-abstract@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.7.0.tgz#dfade774e01bfcd97f96180298c449c8623fb94c" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.0" + is-callable "^1.1.3" + is-regex "^1.0.3" + +es-to-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + dependencies: + is-callable "^1.1.1" + is-date-object "^1.0.1" + is-symbol "^1.0.1" + +es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.23" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.23.tgz#7578b51be974207a5487821b56538c224e4e7b38" + dependencies: + es6-iterator "2" + es6-symbol "~3.1" + +es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512" + dependencies: + d "1" + es5-ext "^0.10.14" + es6-symbol "^3.1" + +es6-map@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-set "~0.1.5" + es6-symbol "~3.1.1" + event-emitter "~0.3.5" + +es6-set@^0.1.4, es6-set@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-symbol "3.1.1" + event-emitter "~0.3.5" + +es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + dependencies: + d "1" + es5-ext "~0.10.14" + +es6-weak-map@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" + dependencies: + d "1" + es5-ext "^0.10.14" + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + +escape-html@~1.0.1, 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: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escodegen@^1.6.1: + 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@^5.0.2: + version "5.0.3" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-5.0.3.tgz#9714ac35ec2cd7fab0d44d148a9f91db2944074d" + +eslint-config-airbnb@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-10.0.1.tgz#a470108646d6c45e1f639a03f11d504a1aa4aedc" + dependencies: + eslint-config-airbnb-base "^5.0.2" + +eslint-config-react-app@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-0.6.2.tgz#ee535cbaaf9e3576ea16b99afe720353d8730ec0" + +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-loader@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-1.6.0.tgz#38f9a1e6c602a4f1f3f3516289726e5d26e6e165" + dependencies: + find-cache-dir "^0.1.1" + loader-utils "^0.2.7" + object-assign "^4.0.1" + +eslint-module-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-1.0.0.tgz#c4a57fd3a53efd8426cc2d5550aadab9bbd05fd0" + dependencies: + debug "2.2.0" + pkg-dir "^1.0.0" + +eslint-plugin-flowtype@2.21.0: + version "2.21.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.21.0.tgz#a47e85abcdd181d37a336054bd552149ae387d9c" + dependencies: + lodash "^4.15.0" + +eslint-plugin-import@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.0.1.tgz#dcfe96357d476b3f822570d42c29bec66f5d9c5c" + dependencies: + builtin-modules "^1.1.1" + contains-path "^0.1.0" + debug "^2.2.0" + doctrine "1.3.x" + eslint-import-resolver-node "^0.2.0" + eslint-module-utils "^1.0.0" + has "^1.0.1" + lodash.cond "^4.3.0" + minimatch "^3.0.3" + pkg-up "^1.0.0" + +eslint-plugin-import@^1.12.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-1.16.0.tgz#b2fa07ebcc53504d0f2a4477582ec8bff1871b9f" + dependencies: + builtin-modules "^1.1.1" + contains-path "^0.1.0" + debug "^2.2.0" + doctrine "1.3.x" + es6-map "^0.1.3" + es6-set "^0.1.4" + eslint-import-resolver-node "^0.2.0" + has "^1.0.1" + lodash.cond "^4.3.0" + lodash.endswith "^4.0.1" + lodash.find "^4.3.0" + lodash.findindex "^4.3.0" + minimatch "^3.0.3" + object-assign "^4.0.1" + pkg-dir "^1.0.0" + pkg-up "^1.0.0" + +eslint-plugin-jsx-a11y@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-4.0.0.tgz#779bb0fe7b08da564a422624911de10061e048ee" + dependencies: + aria-query "^0.3.0" + ast-types-flow "0.0.7" + damerau-levenshtein "^1.0.0" + emoji-regex "^6.1.0" + jsx-ast-utils "^1.0.0" + object-assign "^4.0.1" + +eslint-plugin-jsx-a11y@^2.0.1: + 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.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.4.1.tgz#7d1aade747db15892f71eee1fea4addf97bcfa2b" + dependencies: + doctrine "^1.2.2" + jsx-ast-utils "^1.3.1" + +eslint-plugin-react@^6.0.0: + version "6.10.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz#c5435beb06774e12c7db2f6abaddcbf900cd3f78" + dependencies: + array.prototype.find "^2.0.1" + doctrine "^1.2.2" + has "^1.0.1" + jsx-ast-utils "^1.3.4" + object.assign "^4.0.4" + +eslint-plugin-standard@^2.0.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-2.3.1.tgz#6765bd2a6d9ecdc7bdf1b145ae4bb30e2b7b86f8" + +eslint@3.16.1: + version "3.16.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.16.1.tgz#9bc31fc7341692cf772e80607508f67d711c5609" + 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.4.0" + 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 "~2.0.1" + table "^3.7.8" + text-table "~0.2.0" + user-home "^2.0.0" + +eslint@^3.2.2: + version "3.19.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc" + dependencies: + babel-code-frame "^6.16.0" + chalk "^1.1.3" + concat-stream "^1.5.2" + debug "^2.1.1" + doctrine "^2.0.0" + escope "^3.6.0" + espree "^3.4.0" + esquery "^1.0.0" + 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 "~2.0.1" + table "^3.7.8" + text-table "~0.2.0" + user-home "^2.0.0" + +espree@^3.4.0: + version "3.4.3" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.3.tgz#2910b5ccd49ce893c2ffffaab4fd8b3a31b82374" + dependencies: + acorn "^5.0.1" + acorn-jsx "^3.0.0" + +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.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + +esprima@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.0.0.tgz#53cf247acda77313e551c3aa2e73342d3fb4f7d9" + +esquery@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" + dependencies: + estraverse "^4.0.0" + +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.0.0, 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" + +estree-walker@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e" + +estree-walker@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.3.1.tgz#e6b1a51cf7292524e7237c312e5fe6660c1ce1aa" + +esutils@^2.0.0, esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +etag@~1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051" + +eval@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/eval/-/eval-0.1.2.tgz#9f7103284c105a66df4030b2b3273165837013da" + dependencies: + require-like ">= 0.1.1" + +event-emitter@~0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + dependencies: + d "1" + es5-ext "~0.10.14" + +eventemitter3@1.x.x: + version "1.2.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" + +events@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + +eventsource@0.1.6, eventsource@^0.1.3: + version "0.1.6" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" + dependencies: + original ">=0.0.5" + +exec-sh@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.0.tgz#14f75de3f20d286ef933099b2ce50a90359cef10" + dependencies: + merge "^1.1.3" + +exenv@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" + +exit-hook@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +express@^4.13.3: + version "4.15.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.15.3.tgz#bab65d0f03aa80c358408972fc700f916944b662" + dependencies: + accepts "~1.3.3" + array-flatten "1.1.1" + content-disposition "0.5.2" + content-type "~1.0.2" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.7" + depd "~1.1.0" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.0" + finalhandler "~1.0.3" + fresh "0.5.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.1" + path-to-regexp "0.1.7" + proxy-addr "~1.1.4" + qs "6.4.0" + range-parser "~1.2.0" + send "0.15.3" + serve-static "1.12.3" + setprototypeof "1.0.3" + statuses "~1.3.1" + type-is "~1.6.15" + utils-merge "1.0.0" + vary "~1.1.1" + +extend@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extract-text-webpack-plugin@1.0.1, extract-text-webpack-plugin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-1.0.1.tgz#c95bf3cbaac49dc96f1dc6e072549fbb654ccd2c" + dependencies: + async "^1.5.0" + loader-utils "^0.2.3" + webpack-sources "^0.1.0" + +extsprintf@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +fastparse@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" + +faye-websocket@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + dependencies: + websocket-driver ">=0.5.1" + +faye-websocket@~0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" + dependencies: + websocket-driver ">=0.5.1" + +faye-websocket@~0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.7.3.tgz#cc4074c7f4a4dfd03af54dd65c354b135132ce11" + dependencies: + websocket-driver ">=0.3.6" + +fb-watchman@^1.8.0, fb-watchman@^1.9.0: + version "1.9.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.2.tgz#a24cf47827f82d38fb59a69ad70b76e3b6ae7383" + dependencies: + bser "1.0.2" + +fbjs@^0.8.9: + version "0.8.12" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.12.tgz#10b5d92f76d45575fd63a217d4ea02bea2f8ed04" + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + 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" + +file-loader@0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-0.10.0.tgz#bbe6db7474ac92c7f54fdc197cf547e98b6b8e12" + dependencies: + loader-utils "~0.2.5" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +fileset@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + dependencies: + glob "^7.0.3" + minimatch "^3.0.3" + +filesize@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.3.0.tgz#53149ea3460e3b2e024962a51648aa572cf98122" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +finalhandler@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.3.tgz#ef47e77950e999780e86022a560e3217e0d0cc89" + dependencies: + debug "2.6.7" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.1" + statuses "~1.3.1" + unpipe "~1.0.0" + +find-cache-dir@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + dependencies: + commondir "^1.0.1" + mkdirp "^0.5.1" + pkg-dir "^1.0.0" + +find-up@^1.0.0, find-up@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + 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" + +flatten@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +forwarded@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" + +fresh@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" + +fs-extra@0.30.0, fs-extra@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-extra@^0.26.4: + version "0.26.7" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-readdir-recursive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@1.0.17, fsevents@^1.0.0: + version "1.0.17" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.17.tgz#8537f3f12272678765b4fd6528c0f1f66f8f4558" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.29" + +fstream-ignore@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.0.2, function-bind@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" + +function.prototype.name@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.0.0.tgz#5f523ca64e491a5f95aba80cc1e391080a14482e" + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.0" + is-callable "^1.1.2" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +generate-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" + +generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + dependencies: + is-property "^1.0.0" + +get-caller-file@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + +get-pkg-repo@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.3.0.tgz#43c6b4c048b75dd604fc5388edecde557f6335df" + dependencies: + hosted-git-info "^2.1.4" + meow "^3.3.0" + normalize-package-data "^2.3.0" + parse-github-repo-url "^1.3.0" + through2 "^2.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.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +git-latest-semver-tag@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/git-latest-semver-tag/-/git-latest-semver-tag-1.0.2.tgz#061130cbf4274111cc6be4612b3ff3a6d93e2660" + dependencies: + git-semver-tags "^1.1.2" + meow "^3.3.0" + +git-raw-commits@^1.0.0, git-raw-commits@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-1.2.0.tgz#0f3a8bfd99ae0f2d8b9224d58892975e9a52d03c" + dependencies: + dargs "^4.0.1" + lodash.template "^4.0.2" + meow "^3.3.0" + split2 "^2.0.0" + through2 "^2.0.0" + +git-remote-origin-url@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" + dependencies: + gitconfiglocal "^1.0.0" + pify "^2.3.0" + +git-semver-tags@^1.1.2, git-semver-tags@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-1.2.0.tgz#b31fd02c8ab578bd6c9b5cacca5e1c64c1177ac1" + dependencies: + meow "^3.3.0" + semver "^5.0.1" + +gitconfiglocal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" + dependencies: + ini "^1.3.2" + +github-url-from-git@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/github-url-from-git/-/github-url-from-git-1.5.0.tgz#f985fedcc0a9aa579dc88d7aff068d55cc6251a0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^9.0.0, globals@^9.14.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + +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.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +growly@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + +gzip-size@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520" + dependencies: + duplexer "^0.1.1" + +handlebars@^4.0.2, handlebars@^4.0.3: + version "4.0.10" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-validator@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" + dependencies: + chalk "^1.1.1" + commander "^2.9.0" + is-my-json-valid "^2.12.4" + pinkie-promise "^2.0.0" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +has@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + dependencies: + function-bind "^1.0.2" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +he@1.1.x: + version "1.1.1" + resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + +history@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/history/-/history-2.1.2.tgz#4aa2de897a0e4867e4539843be6ecdb2986bfdec" + dependencies: + deep-equal "^1.0.0" + invariant "^2.0.0" + query-string "^3.0.0" + warning "^2.0.0" + +history@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/history/-/history-3.3.0.tgz#fcedcce8f12975371545d735461033579a6dae9c" + dependencies: + invariant "^2.2.1" + loose-envify "^1.2.0" + query-string "^4.2.2" + warning "^3.0.0" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +hoist-non-react-statics@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz#aa448cf0986d55cc40773b17174b7dd066cb7cfb" + +holderjs@^2.9.3: + version "2.9.4" + resolved "https://registry.yarnpkg.com/holderjs/-/holderjs-2.9.4.tgz#a165dbc2532ebff975491312259d0c520c059898" + dependencies: + shaven "^0.8.1" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +hosted-git-info@^2.1.4: + version "2.4.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67" + +html-comment-regex@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" + +html-encoding-sniffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz#79bf7a785ea495fe66165e734153f363ff5437da" + dependencies: + whatwg-encoding "^1.0.1" + +html-entities@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.0.tgz#41948caf85ce82fed36e4e6a0ed371a6664379e2" + +html-minifier@^3.1.0: + version "3.5.2" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.2.tgz#d73bc3ff448942408818ce609bf3fb0ea7ef4eb7" + dependencies: + camel-case "3.0.x" + clean-css "4.1.x" + commander "2.9.x" + he "1.1.x" + ncname "1.0.x" + param-case "2.1.x" + relateurl "0.2.x" + uglify-js "3.0.x" + +html-webpack-plugin@2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-2.24.0.tgz#53697cea79a9f3cd1f8c239ac71f949d5673cacb" + dependencies: + bluebird "^3.4.6" + html-minifier "^3.1.0" + loader-utils "^0.2.16" + lodash "^4.16.4" + pretty-error "^2.0.2" + toposort "^1.0.0" + +htmlparser2@^3.9.1: + version "3.9.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" + dependencies: + domelementtype "^1.3.0" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^2.0.2" + +htmlparser2@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe" + dependencies: + domelementtype "1" + domhandler "2.1" + domutils "1.1" + readable-stream "1.0" + +http-errors@~1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" + dependencies: + depd "1.1.0" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +http-proxy-middleware@0.17.3, http-proxy-middleware@~0.17.1: + version "0.17.3" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.3.tgz#940382147149b856084f5534752d5b5a8168cd1d" + dependencies: + http-proxy "^1.16.2" + is-glob "^3.1.0" + lodash "^4.17.2" + micromatch "^2.3.11" + +http-proxy@^1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" + dependencies: + eventemitter3 "1.x.x" + requires-port "1.x.x" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" + +iconv-lite@0.4.13: + version "0.4.13" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" + +iconv-lite@~0.4.13: + version "0.4.18" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" + +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + +ieee754@^1.1.4: + version "1.1.8" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" + +ignore@^3.2.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d" + +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" + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + +ini@^1.3.2, ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +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.3" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90" + +invariant@^2.0.0, invariant@^2.2.0, invariant@^2.2.1, invariant@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +ipaddr.js@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.3.0.tgz#1e03a52fdad83a8bbb2b25cbf4998b4cffcd3dec" + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +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-buffer@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-callable@^1.1.1, is-callable@^1.1.2, is-callable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" + +is-ci@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" + dependencies: + ci-info "^1.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-extglob@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +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" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + dependencies: + is-extglob "^2.1.0" + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + +is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: + version "2.16.0" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + +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-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + +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" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-regex@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + dependencies: + has "^1.0.1" + +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-subset@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" + +is-svg@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" + +is-text-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" + dependencies: + text-extensions "^1.0.0" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +istanbul-api@^1.1.0-alpha.1: + version "1.1.9" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.9.tgz#2827920d380d4286d857d57a2968a841db8a7ec8" + dependencies: + async "^2.1.4" + fileset "^2.0.2" + istanbul-lib-coverage "^1.1.1" + istanbul-lib-hook "^1.0.7" + istanbul-lib-instrument "^1.7.2" + istanbul-lib-report "^1.1.1" + istanbul-lib-source-maps "^1.2.1" + istanbul-reports "^1.1.1" + js-yaml "^3.7.0" + mkdirp "^0.5.1" + once "^1.4.0" + +istanbul-lib-coverage@^1.0.0, istanbul-lib-coverage@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da" + +istanbul-lib-hook@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz#dd6607f03076578fe7d6f2a630cf143b49bacddc" + dependencies: + append-transform "^0.4.0" + +istanbul-lib-instrument@^1.1.1, istanbul-lib-instrument@^1.4.2, istanbul-lib-instrument@^1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.2.tgz#6014b03d3470fb77638d5802508c255c06312e56" + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.13.0" + istanbul-lib-coverage "^1.1.1" + semver "^5.3.0" + +istanbul-lib-report@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#f0e55f56655ffa34222080b7a0cd4760e1405fc9" + dependencies: + istanbul-lib-coverage "^1.1.1" + mkdirp "^0.5.1" + path-parse "^1.0.5" + supports-color "^3.1.2" + +istanbul-lib-source-maps@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz#a6fe1acba8ce08eebc638e572e294d267008aa0c" + dependencies: + debug "^2.6.3" + istanbul-lib-coverage "^1.1.1" + mkdirp "^0.5.1" + rimraf "^2.6.1" + source-map "^0.5.3" + +istanbul-reports@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.1.tgz#042be5c89e175bc3f86523caab29c014e77fee4e" + dependencies: + handlebars "^4.0.3" + +jest-changed-files@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-17.0.2.tgz#f5657758736996f590a51b87e5c9369d904ba7b7" + +jest-cli@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-18.1.0.tgz#5ead36ecad420817c2c9baa2aa7574f63257b3d6" + dependencies: + ansi-escapes "^1.4.0" + callsites "^2.0.0" + chalk "^1.1.1" + graceful-fs "^4.1.6" + is-ci "^1.0.9" + istanbul-api "^1.1.0-alpha.1" + istanbul-lib-coverage "^1.0.0" + istanbul-lib-instrument "^1.1.1" + jest-changed-files "^17.0.2" + jest-config "^18.1.0" + jest-environment-jsdom "^18.1.0" + jest-file-exists "^17.0.0" + jest-haste-map "^18.1.0" + jest-jasmine2 "^18.1.0" + jest-mock "^18.0.0" + jest-resolve "^18.1.0" + jest-resolve-dependencies "^18.1.0" + jest-runtime "^18.1.0" + jest-snapshot "^18.1.0" + jest-util "^18.1.0" + json-stable-stringify "^1.0.0" + node-notifier "^4.6.1" + sane "~1.4.1" + strip-ansi "^3.0.1" + throat "^3.0.0" + which "^1.1.1" + worker-farm "^1.3.1" + yargs "^6.3.0" + +jest-config@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-18.1.0.tgz#6111740a6d48aab86ff5a9e6ab0b98bd993b6ff4" + dependencies: + chalk "^1.1.1" + jest-environment-jsdom "^18.1.0" + jest-environment-node "^18.1.0" + jest-jasmine2 "^18.1.0" + jest-mock "^18.0.0" + jest-resolve "^18.1.0" + jest-util "^18.1.0" + json-stable-stringify "^1.0.0" + +jest-diff@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-18.1.0.tgz#4ff79e74dd988c139195b365dc65d87f606f4803" + dependencies: + chalk "^1.1.3" + diff "^3.0.0" + jest-matcher-utils "^18.1.0" + pretty-format "^18.1.0" + +jest-environment-jsdom@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-18.1.0.tgz#18b42f0c4ea2bae9f36cab3639b1e8f8c384e24e" + dependencies: + jest-mock "^18.0.0" + jest-util "^18.1.0" + jsdom "^9.9.1" + +jest-environment-node@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-18.1.0.tgz#4d6797572c8dda99acf5fae696eb62945547c779" + dependencies: + jest-mock "^18.0.0" + jest-util "^18.1.0" + +jest-file-exists@^17.0.0: + version "17.0.0" + resolved "https://registry.yarnpkg.com/jest-file-exists/-/jest-file-exists-17.0.0.tgz#7f63eb73a1c43a13f461be261768b45af2cdd169" + +jest-haste-map@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-18.1.0.tgz#06839c74b770a40c1a106968851df8d281c08375" + dependencies: + fb-watchman "^1.9.0" + graceful-fs "^4.1.6" + micromatch "^2.3.11" + sane "~1.4.1" + worker-farm "^1.3.1" + +jest-jasmine2@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-18.1.0.tgz#094e104c2c189708766c77263bb2aecb5860a80b" + dependencies: + graceful-fs "^4.1.6" + jest-matcher-utils "^18.1.0" + jest-matchers "^18.1.0" + jest-snapshot "^18.1.0" + jest-util "^18.1.0" + +jest-matcher-utils@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-18.1.0.tgz#1ac4651955ee2a60cef1e7fcc98cdfd773c0f932" + dependencies: + chalk "^1.1.3" + pretty-format "^18.1.0" + +jest-matchers@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-18.1.0.tgz#0341484bf87a1fd0bac0a4d2c899e2b77a3f1ead" + dependencies: + jest-diff "^18.1.0" + jest-matcher-utils "^18.1.0" + jest-util "^18.1.0" + pretty-format "^18.1.0" + +jest-mock@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-18.0.0.tgz#5c248846ea33fa558b526f5312ab4a6765e489b3" + +jest-resolve-dependencies@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-18.1.0.tgz#8134fb5caf59c9ed842fe0152ab01c52711f1bbb" + dependencies: + jest-file-exists "^17.0.0" + jest-resolve "^18.1.0" + +jest-resolve@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-18.1.0.tgz#6800accb536658c906cd5e29de412b1ab9ac249b" + dependencies: + browser-resolve "^1.11.2" + jest-file-exists "^17.0.0" + jest-haste-map "^18.1.0" + resolve "^1.2.0" + +jest-runtime@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-18.1.0.tgz#3abfd687175b21fc3b85a2b8064399e997859922" + dependencies: + babel-core "^6.0.0" + babel-jest "^18.0.0" + babel-plugin-istanbul "^3.0.0" + chalk "^1.1.3" + graceful-fs "^4.1.6" + jest-config "^18.1.0" + jest-file-exists "^17.0.0" + jest-haste-map "^18.1.0" + jest-mock "^18.0.0" + jest-resolve "^18.1.0" + jest-snapshot "^18.1.0" + jest-util "^18.1.0" + json-stable-stringify "^1.0.0" + micromatch "^2.3.11" + yargs "^6.3.0" + +jest-snapshot@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-18.1.0.tgz#55b96d2ee639c9bce76f87f2a3fd40b71c7a5916" + dependencies: + jest-diff "^18.1.0" + jest-file-exists "^17.0.0" + jest-matcher-utils "^18.1.0" + jest-util "^18.1.0" + natural-compare "^1.4.0" + pretty-format "^18.1.0" + +jest-util@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-18.1.0.tgz#3a99c32114ab17f84be094382527006e6d4bfc6a" + dependencies: + chalk "^1.1.1" + diff "^3.0.0" + graceful-fs "^4.1.6" + jest-file-exists "^17.0.0" + jest-mock "^18.0.0" + mkdirp "^0.5.1" + +jest@18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-18.1.0.tgz#bcebf1e203dee5c2ad2091c805300a343d9e6c7d" + dependencies: + jest-cli "^18.1.0" + +jquery@>=1.9.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.2.1.tgz#5c4d9de652af6cd0a770154a631bba12b015c787" + +js-base64@^2.1.9: + version "2.1.9" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce" + +js-tokens@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" + +js-yaml@3.6.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" + +js-yaml@^3.4.3, js-yaml@^3.5.1, js-yaml@^3.7.0: + version "3.8.4" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.4.tgz#520b4564f86573ba96662af85a8cafa7b4b5a6f6" + dependencies: + argparse "^1.0.7" + esprima "^3.1.1" + +js-yaml@~3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" + dependencies: + argparse "^1.0.7" + esprima "^2.6.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jsdom@^9.9.1: + version "9.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" + dependencies: + abab "^1.0.3" + acorn "^4.0.4" + acorn-globals "^3.1.0" + array-equal "^1.0.0" + content-type-parser "^1.0.1" + cssom ">= 0.3.2 < 0.4.0" + cssstyle ">= 0.2.37 < 0.3.0" + escodegen "^1.6.1" + html-encoding-sniffer "^1.0.1" + nwmatcher ">= 1.3.9 < 2.0.0" + parse5 "^1.5.1" + request "^2.79.0" + sax "^1.2.1" + symbol-tree "^3.2.1" + tough-cookie "^2.3.2" + webidl-conversions "^4.0.0" + whatwg-encoding "^1.0.1" + whatwg-url "^4.3.0" + xml-name-validator "^2.0.1" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-loader@0.5.4, json-loader@^0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.4.tgz#8baa1365a632f58a3c46d20175fc6002c96e37de" + +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, 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" + +json3@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +json5@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + +jsonpointer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" + +jsprim@^1.2.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" + dependencies: + assert-plus "1.0.0" + extsprintf "1.0.2" + json-schema "0.2.3" + verror "1.3.6" + +jsx-ast-utils@^1.0.0, jsx-ast-utils@^1.3.1, jsx-ast-utils@^1.3.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + optionalDependencies: + graceful-fs "^4.1.9" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +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" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +loader-utils@0.2.x, loader-utils@^0.2.11, loader-utils@^0.2.16, loader-utils@^0.2.3, loader-utils@^0.2.7, loader-utils@~0.2.2, loader-utils@~0.2.5: + version "0.2.17" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + object-assign "^4.0.1" + +loader-utils@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + +lodash._arraycopy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1" + +lodash._arrayeach@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz#bab156b2a90d3f1bbd5c653403349e5e5933ef9e" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._baseclone@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz#303519bf6393fe7e42f34d8b630ef7794e3542b7" + dependencies: + lodash._arraycopy "^3.0.0" + lodash._arrayeach "^3.0.0" + lodash._baseassign "^3.0.0" + lodash._basefor "^3.0.0" + lodash.isarray "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basefor@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basefor/-/lodash._basefor-3.0.3.tgz#7550b4e9218ef09fad24343b612021c79b4c20c2" + +lodash._bindcallback@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + +lodash._createassigner@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" + dependencies: + lodash._bindcallback "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash.restparam "^3.0.0" + +lodash._createcompounder@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._createcompounder/-/lodash._createcompounder-3.0.0.tgz#5dd2cb55372d6e70e0e2392fb2304d6631091075" + dependencies: + lodash.deburr "^3.0.0" + lodash.words "^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" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash._reinterpolate@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + +lodash._root@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + +lodash.assign@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" + dependencies: + lodash._baseassign "^3.0.0" + lodash._createassigner "^3.0.0" + lodash.keys "^3.0.0" + +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + +lodash.assignin@^4.0.9: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" + +lodash.bind@^4.1.4: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" + +lodash.camelcase@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-3.0.1.tgz#932c8b87f8a4377897c67197533282f97aeac298" + dependencies: + lodash._createcompounder "^3.0.0" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + +lodash.clonedeep@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz#a0a1e40d82a5ea89ff5b147b8444ed63d92827db" + dependencies: + lodash._baseclone "^3.0.0" + lodash._bindcallback "^3.0.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.deburr@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.deburr/-/lodash.deburr-3.2.0.tgz#6da8f54334a366a7cf4c4c76ef8d80aa1b365ed5" + dependencies: + lodash._root "^3.0.0" + +lodash.defaults@^4.0.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + +lodash.endswith@^4.0.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.endswith/-/lodash.endswith-4.2.1.tgz#fed59ac1738ed3e236edd7064ec456448b37bc09" + +lodash.filter@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" + +lodash.find@^4.3.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" + +lodash.findindex@^4.3.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.findindex/-/lodash.findindex-4.6.0.tgz#a3245dee61fb9b6e0624b535125624bb69c11106" + +lodash.flatten@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + +lodash.foreach@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.isfunction@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.8.tgz#4db709fc81bc4a8fd7127a458a5346c5cdce2c6b" + +lodash.isobject@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d" + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.map@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + +lodash.merge@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5" + +lodash.omit@^4.4.1: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" + +lodash.pick@^4.2.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + +lodash.pickby@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz#7dea21d8c18d7703a27c704c15d3b84a67e33aff" + +lodash.reduce@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" + +lodash.reject@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash.some@^4.4.0, lodash.some@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" + +lodash.template@^4.0.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" + dependencies: + lodash._reinterpolate "~3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" + dependencies: + lodash._reinterpolate "~3.0.0" + +lodash.tonumber@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/lodash.tonumber/-/lodash.tonumber-4.0.3.tgz#0b96b31b35672793eb7f5a63ee791f1b9e9025d9" + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + +lodash.words@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.words/-/lodash.words-3.2.0.tgz#4e2a8649bc08745b17c695b1a3ce8fee596623b3" + dependencies: + lodash._root "^3.0.0" + +"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.1.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.16.4, lodash@^4.17.2, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +log-driver@1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.5.tgz#7ae4ec257302fd790d557cb10c97100d857b0056" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.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" + +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + +lru-cache@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +macaddress@^0.2.8: + version "0.2.8" + resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" + +magic-string@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.15.2.tgz#0681d7388741bbc3addaa65060992624c6c09e9c" + dependencies: + vlq "^0.2.1" + +magic-string@^0.19.0: + version "0.19.1" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.19.1.tgz#14d768013caf2ec8fdea16a49af82fc377e75201" + dependencies: + vlq "^0.2.1" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + dependencies: + tmpl "1.0.x" + +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" + +marked-terminal@^1.6.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-1.7.0.tgz#c8c460881c772c7604b64367007ee5f77f125904" + dependencies: + cardinal "^1.0.0" + chalk "^1.1.3" + cli-table "^0.3.1" + lodash.assign "^4.2.0" + node-emoji "^1.4.1" + +marked@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" + +math-expression-evaluator@^1.2.14: + version "1.2.17" + resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +memory-fs@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" + +memory-fs@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.3.0.tgz#7bcc6b629e3a43e871d7e29aca6ae8a7f15cbb20" + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@^3.3.0, meow@^3.7.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" + +merge@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +micromatch@^2.1.5, micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +"mime-db@>= 1.27.0 < 2", mime-db@~1.27.0: + version "1.27.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" + +mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.7: + version "2.1.15" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" + dependencies: + mime-db "~1.27.0" + +mime@1.2.x: + version "1.2.11" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10" + +mime@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + +mime@^1.3.4: + version "1.3.6" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0" + +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimatch@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" + dependencies: + brace-expansion "^1.0.0" + +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.1.1, 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 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: + minimist "0.0.8" + +modify-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.0.tgz#e2b6cdeb9ce19f99317a53722f3dbf5df5eaaab2" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +mute-stream@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" + +nan@^2.3.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +ncname@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ncname/-/ncname-1.0.0.tgz#5b57ad18b1ca092864ef62b0b1ed8194f383b71c" + dependencies: + xml-char-classes "^1.0.0" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +no-case@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.1.tgz#7aeba1c73a52184265554b7dc03baf720df80081" + dependencies: + lower-case "^1.1.1" + +node-dir@^0.1.10: + version "0.1.17" + resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" + dependencies: + minimatch "^3.0.2" + +node-emoji@^1.4.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.5.1.tgz#fd918e412769bf8c448051238233840b2aff16a1" + dependencies: + string.prototype.codepointat "^0.2.0" + +node-fetch@^1.0.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.1.tgz#899cb3d0a3c92f952c47f1b876f4c8aeabd400d5" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + +node-libs-browser@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-0.7.0.tgz#3e272c0819e308935e26674408d7af0e1491b83b" + dependencies: + assert "^1.1.1" + browserify-zlib "^0.1.4" + buffer "^4.9.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "3.3.0" + domain-browser "^1.1.1" + events "^1.0.0" + https-browserify "0.0.1" + os-browserify "^0.2.0" + path-browserify "0.0.0" + process "^0.11.0" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.0.5" + stream-browserify "^2.0.1" + stream-http "^2.3.1" + string_decoder "^0.10.25" + timers-browserify "^2.0.2" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.10.3" + vm-browserify "0.0.4" + +node-notifier@^4.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-4.6.1.tgz#056d14244f3dcc1ceadfe68af9cff0c5473a33f3" + dependencies: + cli-usage "^0.1.1" + growly "^1.2.0" + lodash.clonedeep "^3.0.0" + minimist "^1.1.1" + semver "^5.1.0" + shellwords "^0.1.0" + which "^1.0.5" + +node-pre-gyp@^0.6.29: + version "0.6.36" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" + dependencies: + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "^2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5: + version "2.3.8" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + +normalize-url@^1.4.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +npmlog@^4.0.2: + version "4.1.0" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.0.tgz#dc59bee85f64f00ed424efb2af0783df25d1c0b5" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +nth-check@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" + dependencies: + boolbase "~1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +"nwmatcher@>= 1.3.9 < 2.0.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.0.tgz#b4389362170e7ef9798c3c7716d80ebc0106fccf" + +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.1.1, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-is@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6" + +object-keys@^1.0.10, object-keys@^1.0.8: + version "1.0.11" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" + +object.assign@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.0.4.tgz#b1c9cc044ef1b9fe63606fc141abbb32e14730cc" + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.0" + object-keys "^1.0.10" + +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" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +object.values@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.6.1" + function-bind "^1.1.0" + has "^1.0.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + +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" + +onetime@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + +open@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc" + +opn@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95" + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + +optimist@^0.6.1, optimist@~0.6.0, optimist@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + 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" + +original@>=0.0.5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b" + dependencies: + url-parse "1.0.x" + +os-browserify@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f" + +os-homedir@^1.0.0, os-homedir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +output-file-sync@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + +pako@~0.2.0: + version "0.2.9" + resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + +param-case@2.1.x: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + dependencies: + no-case "^2.2.0" + +parse-github-repo-url@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.0.tgz#286c53e2c9962e0641649ee3ac9508fca4dd959c" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parse5@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" + +parseurl@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" + +path-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +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-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +pbkdf2-compat@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz#b6e0c8fa99494d94e0511575802a59a5c142f288" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + 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" + +pluralize@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" + +postcss-calc@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" + dependencies: + postcss "^5.0.2" + postcss-message-helpers "^2.0.0" + reduce-css-calc "^1.2.6" + +postcss-colormin@^2.1.8: + version "2.2.2" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" + dependencies: + colormin "^1.0.5" + postcss "^5.0.13" + postcss-value-parser "^3.2.3" + +postcss-convert-values@^2.3.4: + version "2.6.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" + dependencies: + postcss "^5.0.11" + postcss-value-parser "^3.1.2" + +postcss-discard-comments@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" + dependencies: + postcss "^5.0.14" + +postcss-discard-duplicates@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" + dependencies: + postcss "^5.0.4" + +postcss-discard-empty@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" + dependencies: + postcss "^5.0.14" + +postcss-discard-overridden@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" + dependencies: + postcss "^5.0.16" + +postcss-discard-unused@^2.2.1: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" + dependencies: + postcss "^5.0.14" + uniqs "^2.0.0" + +postcss-filter-plugins@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz#6d85862534d735ac420e4a85806e1f5d4286d84c" + dependencies: + postcss "^5.0.4" + uniqid "^4.0.0" + +postcss-load-config@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-1.2.0.tgz#539e9afc9ddc8620121ebf9d8c3673e0ce50d28a" + dependencies: + cosmiconfig "^2.1.0" + object-assign "^4.1.0" + postcss-load-options "^1.2.0" + postcss-load-plugins "^2.3.0" + +postcss-load-options@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-load-options/-/postcss-load-options-1.2.0.tgz#b098b1559ddac2df04bc0bb375f99a5cfe2b6d8c" + dependencies: + cosmiconfig "^2.1.0" + object-assign "^4.1.0" + +postcss-load-plugins@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz#745768116599aca2f009fad426b00175049d8d92" + dependencies: + cosmiconfig "^2.1.1" + object-assign "^4.1.0" + +postcss-loader@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-1.2.2.tgz#bbf4e19a8cde85597e0c9bfd96015fe775a157ac" + dependencies: + loader-utils "^0.2.16" + object-assign "^4.1.0" + postcss "^5.2.9" + postcss-load-config "^1.1.0" + +postcss-merge-idents@^2.1.5: + version "2.1.7" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" + dependencies: + has "^1.0.1" + postcss "^5.0.10" + postcss-value-parser "^3.1.1" + +postcss-merge-longhand@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" + dependencies: + postcss "^5.0.4" + +postcss-merge-rules@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" + dependencies: + browserslist "^1.5.2" + caniuse-api "^1.5.2" + postcss "^5.0.4" + postcss-selector-parser "^2.2.2" + vendors "^1.0.0" + +postcss-message-helpers@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" + +postcss-minify-font-values@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" + dependencies: + object-assign "^4.0.1" + postcss "^5.0.4" + postcss-value-parser "^3.0.2" + +postcss-minify-gradients@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" + dependencies: + postcss "^5.0.12" + postcss-value-parser "^3.3.0" + +postcss-minify-params@^1.0.4: + version "1.2.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" + dependencies: + alphanum-sort "^1.0.1" + postcss "^5.0.2" + postcss-value-parser "^3.0.2" + uniqs "^2.0.0" + +postcss-minify-selectors@^2.0.4: + version "2.1.1" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" + dependencies: + alphanum-sort "^1.0.2" + has "^1.0.1" + postcss "^5.0.14" + postcss-selector-parser "^2.0.0" + +postcss-modules-extract-imports@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85" + dependencies: + postcss "^6.0.1" + +postcss-modules-local-by-default@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-scope@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-values@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^6.0.1" + +postcss-normalize-charset@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" + dependencies: + postcss "^5.0.5" + +postcss-normalize-url@^3.0.7: + version "3.0.8" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^1.4.0" + postcss "^5.0.14" + postcss-value-parser "^3.2.3" + +postcss-ordered-values@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" + dependencies: + postcss "^5.0.4" + postcss-value-parser "^3.0.1" + +postcss-reduce-idents@^2.2.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" + dependencies: + postcss "^5.0.4" + postcss-value-parser "^3.0.2" + +postcss-reduce-initial@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" + dependencies: + postcss "^5.0.4" + +postcss-reduce-transforms@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" + dependencies: + has "^1.0.1" + postcss "^5.0.8" + postcss-value-parser "^3.0.1" + +postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-svgo@^2.1.1: + version "2.1.6" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" + dependencies: + is-svg "^2.0.0" + postcss "^5.0.14" + postcss-value-parser "^3.2.3" + svgo "^0.7.0" + +postcss-unique-selectors@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" + dependencies: + alphanum-sort "^1.0.1" + postcss "^5.0.4" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" + +postcss-zindex@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" + dependencies: + has "^1.0.1" + postcss "^5.0.4" + uniqs "^2.0.0" + +postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.11, postcss@^5.2.9: + version "5.2.17" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.17.tgz#cf4f597b864d65c8a492b2eabe9d706c879c388b" + dependencies: + chalk "^1.1.3" + js-base64 "^2.1.9" + source-map "^0.5.6" + supports-color "^3.2.3" + +postcss@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.2.tgz#5c4fea589f0ac3b00caa75b1cbc3a284195b7e5d" + dependencies: + chalk "^1.1.3" + source-map "^0.5.6" + supports-color "^3.2.3" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +pretty-error@^2.0.2: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.0.tgz#87f4e9d706a24c87d6cbee9fabec001fcf8c75d8" + dependencies: + renderkid "^2.0.1" + utila "~0.4" + +pretty-format@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-18.1.0.tgz#fb65a86f7a7f9194963eee91865c1bcf1039e284" + dependencies: + ansi-styles "^2.2.1" + +private@^0.1.6, private@~0.1.5: + version "0.1.7" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +process@^0.11.0: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + +progress@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + +promise@7.1.1, promise@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf" + dependencies: + asap "~2.0.3" + +prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.8: + version "15.5.10" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.10.tgz#2797dfc3126182e3a95e3dfbb2e893ddd7456154" + dependencies: + fbjs "^0.8.9" + loose-envify "^1.3.1" + +proxy-addr@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.4.tgz#27e545f6960a44a627d9b44467e35c1b6b4ce2f3" + dependencies: + forwarded "~0.1.0" + ipaddr.js "1.3.0" + +prr@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + +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.1.2, q@^1.4.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" + +qs@6.4.0, qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +qs@~6.3.0: + version "6.3.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" + +query-string@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-3.0.3.tgz#ae2e14b4d05071d4e9b9eb4873c35b0dcd42e638" + dependencies: + strict-uri-encode "^1.0.0" + +query-string@^4.1.0, query-string@^4.2.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + +querystringify@0.0.x: + version "0.0.4" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c" + +querystringify@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-1.0.0.tgz#6286242112c5b712fa654e526652bf6a13ff05cb" + +randomatic@^1.1.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +range-parser@^1.0.3, range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +raw-loader@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" + +rc@^1.1.7: + version "1.2.1" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-addons-test-utils@^15.3.0: + version "15.6.0" + resolved "https://registry.yarnpkg.com/react-addons-test-utils/-/react-addons-test-utils-15.6.0.tgz#062d36117fe8d18f3ba5e06eb33383b0b85ea5b9" + +react-dev-utils@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-0.5.2.tgz#50d0b962d3a94b6c2e8f2011ed6468e4124bc410" + dependencies: + ansi-html "0.0.5" + chalk "1.1.3" + escape-string-regexp "1.0.5" + filesize "3.3.0" + gzip-size "3.0.0" + html-entities "1.2.0" + opn "4.0.2" + recursive-readdir "2.1.1" + sockjs-client "1.0.1" + strip-ansi "3.0.1" + +react-dom@^15.3.0: + version "15.6.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.6.1.tgz#2cb0ed4191038e53c209eb3a79a23e2a4cf99470" + dependencies: + fbjs "^0.8.9" + loose-envify "^1.1.0" + object-assign "^4.1.0" + prop-types "^15.5.10" + +react-helmet@^5.0.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-5.1.3.tgz#cd40626593a29eecf684b6d38d711f44c48188af" + dependencies: + deep-equal "^1.0.1" + object-assign "^4.1.1" + prop-types "^15.5.4" + react-side-effect "^1.1.0" + +react-prism@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/react-prism/-/react-prism-4.1.0.tgz#f1f75b106eee207e72725d76bfc1307a1fb68495" + +react-router@^2.6.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-2.8.1.tgz#73e9491f6ceb316d0f779829081863e378ee4ed7" + dependencies: + history "^2.1.2" + hoist-non-react-statics "^1.2.0" + invariant "^2.2.1" + loose-envify "^1.2.0" + warning "^3.0.0" + +react-scripts@^0.9.5: + version "0.9.5" + resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-0.9.5.tgz#e9f05c8427e27131662a9b9d7a9786d1ff16bb3f" + dependencies: + autoprefixer "6.7.2" + babel-core "6.22.1" + babel-eslint "7.1.1" + babel-jest "18.0.0" + babel-loader "6.2.10" + babel-preset-react-app "^2.2.0" + babel-runtime "^6.20.0" + case-sensitive-paths-webpack-plugin "1.1.4" + chalk "1.1.3" + connect-history-api-fallback "1.3.0" + cross-spawn "4.0.2" + css-loader "0.26.1" + detect-port "1.1.0" + dotenv "2.0.0" + eslint "3.16.1" + eslint-config-react-app "^0.6.2" + eslint-loader "1.6.0" + eslint-plugin-flowtype "2.21.0" + eslint-plugin-import "2.0.1" + eslint-plugin-jsx-a11y "4.0.0" + eslint-plugin-react "6.4.1" + extract-text-webpack-plugin "1.0.1" + file-loader "0.10.0" + fs-extra "0.30.0" + html-webpack-plugin "2.24.0" + http-proxy-middleware "0.17.3" + jest "18.1.0" + json-loader "0.5.4" + object-assign "4.1.1" + postcss-loader "1.2.2" + promise "7.1.1" + react-dev-utils "^0.5.2" + style-loader "0.13.1" + url-loader "0.5.7" + webpack "1.14.0" + webpack-dev-server "1.16.2" + webpack-manifest-plugin "1.1.0" + whatwg-fetch "2.0.2" + optionalDependencies: + fsevents "1.0.17" + +react-side-effect@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-1.1.3.tgz#512c25abe0dec172834c4001ec5c51e04d41bc5c" + dependencies: + exenv "^1.2.1" + shallowequal "^1.0.1" + +react-test-renderer@^15.5.4: + version "15.6.1" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-15.6.1.tgz#026f4a5bb5552661fd2cc4bbcd0d4bc8a35ebf7e" + dependencies: + fbjs "^0.8.9" + object-assign "^4.1.0" + +react-transition-group@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-1.2.0.tgz#b51fc921b0c3835a7ef7c571c79fc82c73e9204f" + dependencies: + chain-function "^1.0.0" + dom-helpers "^3.2.0" + loose-envify "^1.3.1" + prop-types "^15.5.6" + warning "^3.0.0" + +react@^15.3.0: + version "15.6.1" + resolved "https://registry.yarnpkg.com/react/-/react-15.6.1.tgz#baa8434ec6780bde997cdc380b79cd33b96393df" + dependencies: + create-react-class "^15.6.0" + fbjs "^0.8.9" + loose-envify "^1.1.0" + object-assign "^4.1.0" + prop-types "^15.5.10" + +reactstrap-tether@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/reactstrap-tether/-/reactstrap-tether-1.3.4.tgz#86d94d30216ffa34ceb2c626f4b9912c0d193894" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0, read-pkg@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +readable-stream@1.0: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.6: + version "2.2.11" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.11.tgz#0796b31f8d7688007ff0b93a8088d34aa17c0f72" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + safe-buffer "~5.0.1" + string_decoder "~1.0.0" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + 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" + +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" + +recursive-readdir@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.1.1.tgz#a01cfc7f7f38a53ec096a096f63a50489c3e297c" + dependencies: + minimatch "3.0.3" + +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" + +redeyed@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-1.0.1.tgz#e96c193b40c0816b00aec842698e61185e55498a" + dependencies: + esprima "~3.0.0" + +reduce-css-calc@^1.2.6: + version "1.3.0" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" + dependencies: + balanced-match "^0.4.2" + math-expression-evaluator "^1.2.14" + reduce-function-call "^1.0.1" + +reduce-function-call@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" + dependencies: + balanced-match "^0.4.2" + +regenerate@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" + +regenerator-runtime@^0.10.0: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + +regenerator-runtime@^0.9.5: + version "0.9.6" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz#d33eb95d0d2001a4be39659707c51b0cb71ce029" + +regenerator-transform@0.9.11: + version "0.9.11" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regenerator-transform@0.9.8: + version "0.9.8" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.8.tgz#0f88bb2bc03932ddb7b6b7312e68078f01026d6c" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + dependencies: + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + +regexpu-core@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +relateurl@0.2.x: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + +remove-trailing-separator@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz#69b062d978727ad14dc6b56ba4ab772fd8d70511" + +renderkid@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.1.tgz#898cabfc8bede4b7b91135a3ffd323e58c0db319" + dependencies: + css-select "^1.1.0" + dom-converter "~0.1" + htmlparser2 "~3.3.0" + strip-ansi "^3.0.0" + utila "~0.3" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request@2.79.0: + version "2.79.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + 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" + oauth-sign "~0.8.1" + qs "~6.3.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + uuid "^3.0.0" + +request@^2.79.0, request@^2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + 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" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-from-string@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" + +"require-like@>= 0.1.1": + version "0.1.2" + resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +require-relative@^0.8.7: + version "0.8.7" + resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" + +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.0.x, 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.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.2.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" + dependencies: + path-parse "^1.0.5" + +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" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" + dependencies: + glob "^7.0.5" + +rimraf@^2.2.8, rimraf@~2.5.1: + version "2.5.4" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" + dependencies: + glob "^7.0.5" + +ripemd160@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-0.2.0.tgz#2bf198bde167cacfa51c0a928e84b68bbe171fce" + +rollup-plugin-babel@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-2.7.1.tgz#16528197b0f938a1536f44683c7a93d573182f57" + dependencies: + babel-core "6" + babel-plugin-transform-es2015-classes "^6.9.0" + object-assign "^4.1.0" + rollup-pluginutils "^1.5.0" + +rollup-plugin-babili@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-babili/-/rollup-plugin-babili-3.1.0.tgz#27ada043a0ed021050a712528f68ed641888b5dc" + dependencies: + "@comandeer/babel-plugin-banner" "^1.0.0" + babel-core "^6.21.0" + babel-preset-babili "^0.1.2" + +rollup-plugin-commonjs@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.0.2.tgz#98b1589bfe32a6c0f67790b60c0b499972afed89" + dependencies: + acorn "^4.0.1" + estree-walker "^0.3.0" + magic-string "^0.19.0" + resolve "^1.1.7" + rollup-pluginutils "^2.0.1" + +rollup-plugin-node-resolve@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.0.0.tgz#8b897c4c3030d5001277b0514b25d2ca09683ee0" + dependencies: + browser-resolve "^1.11.0" + builtin-modules "^1.1.0" + is-module "^1.0.0" + resolve "^1.1.6" + +rollup-plugin-replace@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-replace/-/rollup-plugin-replace-1.1.1.tgz#396315ded050a6ce43b9518a886a3f60efb1ea33" + dependencies: + magic-string "^0.15.2" + minimatch "^3.0.2" + rollup-pluginutils "^1.5.0" + +rollup-pluginutils@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408" + dependencies: + estree-walker "^0.2.1" + minimatch "^3.0.2" + +rollup-pluginutils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.0.1.tgz#7ec95b3573f6543a46a6461bd9a7c544525d0fc0" + dependencies: + estree-walker "^0.3.0" + micromatch "^2.3.11" + +rollup@^0.41.5: + version "0.41.6" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.41.6.tgz#e0d05497877a398c104d816d2733a718a7a94e2a" + dependencies: + source-map-support "^0.4.0" + +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" + +safe-buffer@^5.0.1, safe-buffer@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" + +sane@~1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sane/-/sane-1.4.1.tgz#88f763d74040f5f0c256b6163db399bf110ac715" + dependencies: + exec-sh "^0.2.0" + fb-watchman "^1.8.0" + minimatch "^3.0.2" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.10.0" + +sax@^1.2.1, sax@~1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828" + +"semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.1.0, semver@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +send@0.15.3: + version "0.15.3" + resolved "https://registry.yarnpkg.com/send/-/send-0.15.3.tgz#5013f9f99023df50d1bd9892c19e3defd1d53309" + dependencies: + debug "2.6.7" + depd "~1.1.0" + destroy "~1.0.4" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.0" + fresh "0.5.0" + http-errors "~1.6.1" + mime "1.3.4" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.3.1" + +serve-index@^1.7.2: + version "1.9.0" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.0.tgz#d2b280fc560d616ee81b48bf0fa82abed2485ce7" + dependencies: + accepts "~1.3.3" + batch "0.6.1" + debug "2.6.8" + escape-html "~1.0.3" + http-errors "~1.6.1" + mime-types "~2.1.15" + parseurl "~1.3.1" + +serve-static@1.12.3: + version "1.12.3" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.3.tgz#9f4ba19e2f3030c547f8af99107838ec38d5b1e2" + dependencies: + encodeurl "~1.0.1" + escape-html "~1.0.3" + parseurl "~1.3.1" + send "0.15.3" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +setimmediate@^1.0.4, setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + +sha.js@2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.2.6.tgz#17ddeddc5f722fb66501658895461977867315ba" + +shallowequal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.0.1.tgz#4349160418200bad3b82d723ded65f2354db2a23" + +shaven@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/shaven/-/shaven-0.8.1.tgz#0f42d4fb32c4048349ff9ee9c296f5effb2dcaaf" + dependencies: + escape-html "~1.0.1" + +shelljs@^0.7.5: + version "0.7.8" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +shellwords@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14" + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +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" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +sockjs-client@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.0.1.tgz#8943ae05b46547bc2054816c409002cf5e2fe026" + dependencies: + debug "^2.1.0" + eventsource "^0.1.3" + faye-websocket "~0.7.3" + inherits "^2.0.1" + json3 "^3.3.2" + url-parse "^1.0.1" + +sockjs-client@^1.0.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.4.tgz#5babe386b775e4cf14e7520911452654016c8b12" + dependencies: + debug "^2.6.6" + eventsource "0.1.6" + faye-websocket "~0.11.0" + inherits "^2.0.1" + json3 "^3.3.2" + url-parse "^1.1.8" + +sockjs@^0.3.15: + version "0.3.18" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.18.tgz#d9b289316ca7df77595ef299e075f0f937eb4207" + dependencies: + faye-websocket "^0.10.0" + uuid "^2.0.2" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + dependencies: + is-plain-obj "^1.0.0" + +source-list-map@^0.1.4, source-list-map@~0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" + +source-map-support@^0.4.0, source-map-support@^0.4.2: + version "0.4.15" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" + dependencies: + source-map "^0.5.6" + +source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + +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.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" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +split2@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/split2/-/split2-2.1.1.tgz#7a1f551e176a90ecd3345f7246a0cfe175ef4fd0" + dependencies: + through2 "^2.0.2" + +split@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/split/-/split-1.0.0.tgz#c4395ce683abcd254bc28fe1dabb6e5c27dcffae" + dependencies: + through "2" + +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.13.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +static-site-generator-webpack-plugin@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-2.1.1.tgz#96df57c67bc1143cecf0c592938b5fe6693c1cef" + dependencies: + bluebird "^3.0.5" + eval "^0.1.0" + +"statuses@>= 1.3.1 < 2", statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + +stream-browserify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-cache@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/stream-cache/-/stream-cache-0.0.2.tgz#1ac5ad6832428ca55667dbdee395dad4e6db118f" + +stream-http@^2.3.1: + version "2.7.2" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.2.tgz#40a050ec8dc3b53b33d9909415c02c0bf1abfbad" + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.2.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + 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.codepointat@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/string.prototype.codepointat/-/string.prototype.codepointat-0.2.0.tgz#6b26e9bd3afcaa7be3b4269b526de1b82000ac78" + +string_decoder@^0.10.25, string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string_decoder@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.2.tgz#b29e1f4e1125fa97a10382b8a533737b7491e179" + dependencies: + safe-buffer "~5.0.1" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@3.0.1, strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +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@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +style-loader@0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.13.1.tgz#468280efbc0473023cd3a6cd56e33b5a1d7fc3a9" + dependencies: + loader-utils "^0.2.7" + +style-loader@^0.13.1: + version "0.13.2" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.13.2.tgz#74533384cf698c7104c7951150b49717adc2f3bb" + dependencies: + loader-utils "^1.0.2" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.1.0, supports-color@^3.1.1, supports-color@^3.1.2, supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +svgo@^0.7.0: + version "0.7.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" + dependencies: + coa "~1.0.1" + colors "~1.1.2" + csso "~2.3.1" + js-yaml "~3.7.0" + mkdirp "~0.5.1" + sax "~1.2.1" + whet.extend "~0.9.9" + +symbol-tree@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + +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" + +tar-pack@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + +tar@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +tempfile@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-1.1.1.tgz#5bcc4eaecc4ab2c707d8bc11d99ccc9a2cb287f2" + dependencies: + os-tmpdir "^1.0.0" + uuid "^2.0.1" + +test-exclude@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-3.3.0.tgz#7a17ca1239988c98367b0621456dbb7d4bc38977" + dependencies: + arrify "^1.0.1" + micromatch "^2.3.11" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + +tether@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/tether/-/tether-1.4.0.tgz#0f9fa171f75bf58485d8149e94799d7ae74d1c1a" + +text-extensions@^1.0.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.5.0.tgz#d1cb2d14b5d0bc45bfdca8a08a473f68c7eb0cbc" + +text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +throat@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-3.2.0.tgz#50cb0670edbc40237b9e347d7e1f88e4620af836" + +through2@^2.0.0, through2@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +through@2, "through@>=2.2.7 <3", through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +timers-browserify@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.2.tgz#ab4883cf597dcd50af211349a00fbca56ac86b86" + dependencies: + setimmediate "^1.0.4" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + +to-fast-properties@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + +toposort@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.3.tgz#f02cd8a74bd8be2fc0e98611c3bacb95a171869c" + +tough-cookie@^2.3.2, tough-cookie@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + +trim-off-newlines@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +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" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tunnel-agent@~0.4.1: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + +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.15: + version "1.6.15" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.15" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +ua-parser-js@^0.7.9: + version "0.7.12" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.12.tgz#04c81a99bdd5dc52263ea29d24c6bf8d4818a4bb" + +uglify-js@3.0.x: + version "3.0.17" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.0.17.tgz#d228cd55c2df9b3d2f53f147568cb4cc4a72cc06" + dependencies: + commander "~2.9.0" + source-map "~0.5.1" + +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: + async "~0.2.6" + source-map "~0.5.1" + uglify-to-browserify "~1.0.0" + yargs "~3.10.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uid-number@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + +uniqid@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-4.1.1.tgz#89220ddf6b751ae52b5f72484863528596bb84c1" + dependencies: + macaddress "^0.2.8" + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + +unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + +url-loader@0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.5.7.tgz#67e8779759f8000da74994906680c943a9b0925d" + dependencies: + loader-utils "0.2.x" + mime "1.2.x" + +url-parse@1.0.x: + version "1.0.5" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b" + dependencies: + querystringify "0.0.x" + requires-port "1.0.x" + +url-parse@^1.0.1, url-parse@^1.1.8: + version "1.1.9" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.1.9.tgz#c67f1d775d51f0a18911dd7b3ffad27bb9e5bd19" + dependencies: + querystringify "~1.0.0" + requires-port "1.0.x" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +user-home@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" + dependencies: + os-homedir "^1.0.0" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +util@0.10.3, util@^0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + +utila@~0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.3.3.tgz#d7e8e7d7e309107092b05f8d9688824d633a4226" + +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + +utils-merge@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" + +uuid@^2.0.1, uuid@^2.0.2, uuid@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + +uuid@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" + +v8flags@^2.0.10: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + dependencies: + user-home "^1.1.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: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +vary@~1.1.0, vary@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" + +vendors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22" + +verror@1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" + dependencies: + extsprintf "1.0.2" + +vlq@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.2.tgz#e316d5257b40b86bb43cb8d5fea5d7f54d6b0ca1" + +vm-browserify@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + dependencies: + indexof "0.0.1" + +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + dependencies: + makeerror "1.0.x" + +warning@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/warning/-/warning-2.1.0.tgz#21220d9c63afc77a8c92111e011af705ce0c6901" + dependencies: + loose-envify "^1.0.0" + +warning@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" + dependencies: + loose-envify "^1.0.0" + +watch@~0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" + +watchpack@^0.2.1: + version "0.2.9" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-0.2.9.tgz#62eaa4ab5e5ba35fdfc018275626e3c0f5e3fb0b" + dependencies: + async "^0.9.0" + chokidar "^1.0.0" + graceful-fs "^4.1.2" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + +webidl-conversions@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.1.tgz#8015a17ab83e7e1b311638486ace81da6ce206a0" + +webpack-core@~0.6.9: + version "0.6.9" + resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2" + dependencies: + source-list-map "~0.1.7" + source-map "~0.4.1" + +webpack-dev-middleware@^1.10.2, webpack-dev-middleware@^1.4.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.10.2.tgz#2e252ce1dfb020dbda1ccb37df26f30ab014dbd1" + dependencies: + memory-fs "~0.4.1" + mime "^1.3.4" + path-is-absolute "^1.0.0" + range-parser "^1.0.3" + +webpack-dev-server@1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-1.16.2.tgz#8bebc2c4ce1c45a15c72dd769d9ba08db306a793" + dependencies: + compression "^1.5.2" + connect-history-api-fallback "^1.3.0" + express "^4.13.3" + http-proxy-middleware "~0.17.1" + open "0.0.5" + optimist "~0.6.1" + serve-index "^1.7.2" + sockjs "^0.3.15" + sockjs-client "^1.0.3" + stream-cache "~0.0.1" + strip-ansi "^3.0.0" + supports-color "^3.1.1" + webpack-dev-middleware "^1.4.0" + +webpack-dev-server@^1.14.1: + version "1.16.5" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-1.16.5.tgz#0cbd5f2d2ac8d4e593aacd5c9702e7bbd5e59892" + dependencies: + compression "^1.5.2" + connect-history-api-fallback "^1.3.0" + express "^4.13.3" + http-proxy-middleware "~0.17.1" + open "0.0.5" + optimist "~0.6.1" + serve-index "^1.7.2" + sockjs "^0.3.15" + sockjs-client "^1.0.3" + stream-cache "~0.0.1" + strip-ansi "^3.0.0" + supports-color "^3.1.1" + webpack-dev-middleware "^1.10.2" + +webpack-manifest-plugin@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-1.1.0.tgz#6b6c718aade8a2537995784b46bd2e9836057caa" + dependencies: + fs-extra "^0.30.0" + lodash ">=3.5 <5" + +webpack-sources@^0.1.0: + version "0.1.5" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.1.5.tgz#aa1f3abf0f0d74db7111c40e500b84f966640750" + dependencies: + source-list-map "~0.1.7" + source-map "~0.5.3" + +webpack@1.14.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-1.14.0.tgz#54f1ffb92051a328a5b2057d6ae33c289462c823" + dependencies: + acorn "^3.0.0" + async "^1.3.0" + clone "^1.0.2" + enhanced-resolve "~0.9.0" + interpret "^0.6.4" + loader-utils "^0.2.11" + memory-fs "~0.3.0" + mkdirp "~0.5.0" + node-libs-browser "^0.7.0" + optimist "~0.6.0" + supports-color "^3.1.0" + tapable "~0.1.8" + uglify-js "~2.7.3" + watchpack "^0.2.1" + webpack-core "~0.6.9" + +webpack@^1.12.13: + version "1.15.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-1.15.0.tgz#4ff31f53db03339e55164a9d468ee0324968fe98" + dependencies: + acorn "^3.0.0" + async "^1.3.0" + clone "^1.0.2" + enhanced-resolve "~0.9.0" + interpret "^0.6.4" + loader-utils "^0.2.11" + memory-fs "~0.3.0" + mkdirp "~0.5.0" + node-libs-browser "^0.7.0" + optimist "~0.6.0" + supports-color "^3.1.0" + tapable "~0.1.8" + uglify-js "~2.7.3" + watchpack "^0.2.1" + webpack-core "~0.6.9" + +websocket-driver@>=0.3.6, websocket-driver@>=0.5.1: + version "0.6.5" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + dependencies: + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" + +whatwg-encoding@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz#3c6c451a198ee7aec55b1ec61d0920c67801a5f4" + dependencies: + iconv-lite "0.4.13" + +whatwg-fetch@2.0.2, whatwg-fetch@>=0.10.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.2.tgz#fe294d1d89e36c5be8b3195057f2e4bc74fc980e" + +whatwg-url@^4.3.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +whet.extend@~0.9.9: + version "0.9.9" + resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + +which@^1.0.5, which@^1.1.1, which@^1.2.9: + version "1.2.14" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + dependencies: + string-width "^1.0.2" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +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: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +worker-farm@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.3.1.tgz#4333112bb49b17aa050b87895ca6b2cacf40e5ff" + dependencies: + errno ">=0.1.1 <0.2.0-0" + xtend ">=4.0.0 <4.1.0-0" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +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" + +xml-char-classes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/xml-char-classes/-/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d" + +xml-name-validator@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + +yargs-parser@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" + dependencies: + camelcase "^3.0.0" + +yargs@^6.3.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^4.2.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" From 4e54609cc44d2ad7fccf9569da594ae8385169c2 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 27 Jun 2017 20:13:58 -0700 Subject: [PATCH 010/862] build(rollup): Optimize CommonJS and module build (#477) * Externalize ReactTransitionGroup * Update transition group imports * Add CJS build without embedded dependencies * Rename babel environment --- .babelrc | 2 +- package.json | 14 +++---- rollup.config.js | 102 ++++++++++++++++++++++++++++++++--------------- 3 files changed, 77 insertions(+), 41 deletions(-) diff --git a/.babelrc b/.babelrc index e6d732264..3fed1fce7 100644 --- a/.babelrc +++ b/.babelrc @@ -7,7 +7,7 @@ "transform-object-rest-spread" ], "env": { - "dist-dir": { + "lib-dir": { "plugins": ["transform-es2015-modules-commonjs"] }, "webpack": { diff --git a/package.json b/package.json index 42985411a..cc1a83143 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "reactstrap", "version": "4.7.0", "description": "React Bootstrap 4 components", - "main": "lib/index.js", + "main": "dist/reactstrap.cjs.js", "jsnext:main": "dist/reactstrap.es.js", "module": "dist/reactstrap.es.js", "scripts": { @@ -11,8 +11,8 @@ "cover": "npm test -- --coverage", "start": "BABEL_ENV=webpack webpack-dev-server --config ./webpack.dev.config.js --watch", "build-docs": "cross-env WEBPACK_BUILD=production webpack --config ./webpack.dev.config.js --progress --colors", - "build": "cross-env NODE_ENV=production rollup -c", - "prebuild": "BABEL_ENV=dist-dir babel src --out-dir lib --ignore src/__tests__/", + "build": "rollup -c", + "prebuild": "BABEL_ENV=lib-dir babel src --out-dir lib --ignore src/__tests__/", "create-release": "npm test && sh ./scripts/release", "publish-release": "npm test && sh ./scripts/publish", "lint": "eslint src" @@ -95,8 +95,8 @@ }, "peerDependencies": { "react": "^0.14.9 || ^15.3.0", - "react-transition-group": "^1.1.2", - "react-dom": "^0.14.9 || ^15.3.0" + "react-dom": "^0.14.9 || ^15.3.0", + "react-transition-group": "^1.1.2" }, "devDependencies": { "babel-cli": "^6.14.0", @@ -135,9 +135,9 @@ "react-scripts": "^0.9.5", "react-test-renderer": "^15.5.4", "react-transition-group": "^1.1.2", - "rollup": "^0.41.5", + "rollup": "^0.43.0", "rollup-plugin-babel": "^2.7.1", - "rollup-plugin-babili": "^3.0.0", + "rollup-plugin-babili": "^3.1.0", "rollup-plugin-commonjs": "^8.0.2", "rollup-plugin-node-resolve": "^3.0.0", "rollup-plugin-replace": "^1.1.1", diff --git a/rollup.config.js b/rollup.config.js index 04ae194ac..ccf89eb25 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -4,39 +4,75 @@ import babel from 'rollup-plugin-babel'; import babili from 'rollup-plugin-babili'; import replace from 'rollup-plugin-replace'; -const config = { - moduleName: 'Reactstrap', - entry: 'src/index.js', - plugins: [ - nodeResolve(), - commonjs(), - babel({ - plugins: ['external-helpers'], - }), - ], - sourceMap: true, - external: [ - 'react', - 'react-dom', - 'react-transition-group', - ], - // Used for the UMD bundles - globals: { - react: 'React', - 'react-dom': 'ReactDOM', - 'react-transition-group': 'ReactTransitionGroup', - }, - targets: [ - { dest: 'dist/reactstrap.es.js', format: 'es' }, - { dest: 'dist/reactstrap.min.js', format: 'umd' }, - ], -}; +// Require understands JSON files. +const packageJson = require('./package.json'); +const peerDependencies = Object.keys(packageJson.peerDependencies); +const dependencies = Object.keys(packageJson.dependencies); + +function baseConfig() { + return { + moduleName: 'Reactstrap', + entry: 'src/index.js', + plugins: [ + nodeResolve(), + commonjs(), + babel({ + plugins: ['external-helpers'], + }), + ], + sourceMap: true, + }; +} + +/* + COMMONJS / MODULE CONFIG + ------------------------ -if (process.env.NODE_ENV === 'production') { - config.plugins.push(babili({ comments: false })); - config.plugins.push(replace({ - 'process.env.NODE_ENV': JSON.stringify('production'), - })); + Goal of this configuration is to generate bundles to be consumed by bundlers. + This configuration is not minimized and will import all dependencies. +*/ +const libConfig = baseConfig(); +// Do not include any of the dependencies +libConfig.external = peerDependencies.concat(dependencies); +libConfig.targets = [ + { dest: 'dist/reactstrap.cjs.js', format: 'cjs' }, + { dest: 'dist/reactstrap.es.js', format: 'es' }, +]; + +/* + UMD CONFIG + ---------- + + Goal of this configuration is to be directly included on web pages. + This configuration is minimized and will include dependencies that are not + marked as peer dependencies. + + Defining this config will also check that all peer dependencies are set up + correctly in the globals entry. +*/ +const umdConfig = baseConfig(); +umdConfig.external = peerDependencies; +umdConfig.plugins.push(replace({ + 'process.env.NODE_ENV': JSON.stringify('production'), +})); +umdConfig.plugins.push(babili({ comments: false })); +umdConfig.targets = [ + { dest: 'dist/reactstrap.min.js', format: 'umd' }, +]; +umdConfig.globals = { + react: 'React', + 'react-dom': 'ReactDOM', + 'react-transition-group': 'ReactTransitionGroup', +}; +const missingGlobals = peerDependencies.filter(dep => !(dep in umdConfig.globals)); +if (missingGlobals.length) { + console.error('All peer dependencies need to be mentioned in globals, please update rollup.config.js.'); + console.error('Missing: ' + missingGlobals.join(', ')); + console.error('Aborting build.'); + process.exit(1); } -export default config; +export default [ + libConfig, + umdConfig, +]; From 83df86ef84892bb5684200840c79070c77b1bcdc Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Wed, 28 Jun 2017 11:17:18 +0800 Subject: [PATCH 011/862] feat(DropdownItem): support the "active" property for dropdown items (#469) --- src/DropdownItem.js | 3 +++ src/__tests__/DropdownItem.spec.js | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/src/DropdownItem.js b/src/DropdownItem.js index 6fbe02eb5..99f95f478 100644 --- a/src/DropdownItem.js +++ b/src/DropdownItem.js @@ -5,6 +5,7 @@ import { mapToCssModules, omit } from './utils'; const propTypes = { children: PropTypes.node, + active: PropTypes.bool, disabled: PropTypes.bool, divider: PropTypes.bool, tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]), @@ -63,6 +64,7 @@ class DropdownItem extends React.Component { divider, tag: Tag, header, + active, ...props } = omit(this.props, ['toggle']); const classes = mapToCssModules(classNames( @@ -70,6 +72,7 @@ class DropdownItem extends React.Component { { disabled: props.disabled, 'dropdown-item': !divider && !header, + active: active, 'dropdown-header': header, 'dropdown-divider': divider } diff --git a/src/__tests__/DropdownItem.spec.js b/src/__tests__/DropdownItem.spec.js index 4eb1bf77e..829781021 100644 --- a/src/__tests__/DropdownItem.spec.js +++ b/src/__tests__/DropdownItem.spec.js @@ -73,6 +73,14 @@ describe('DropdownItem', () => { }); }); + describe('active', () => { + it('should render an active class', () => { + const wrapper = mount(); + + expect(wrapper.find('.active').length).toBe(1); + }); + }); + describe('divider', () => { it('should render a divider element', () => { const wrapper = mount(); From d153a7801bb88f117a5e6c92b4bf838c9af3feb5 Mon Sep 17 00:00:00 2001 From: Eddy Hernandez Date: Tue, 27 Jun 2017 20:27:14 -0700 Subject: [PATCH 012/862] chore(release): adding 4.8.0 (#480) --- CHANGELOG.md | 10 ++++++++++ package.json | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9535db22d..146b90122 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ + +# [4.8.0](https://github.com/reactstrap/reactstrap/compare/4.7.0...4.8.0) (2017-06-28) + + +### Features + +* **DropdownItem:** support the "active" property for dropdown items ([#469](https://github.com/reactstrap/reactstrap/issues/469)) ([83df86e](https://github.com/reactstrap/reactstrap/commit/83df86e)) + + + # [4.7.0](https://github.com/reactstrap/reactstrap/compare/4.6.2...4.7.0) (2017-06-27) diff --git a/package.json b/package.json index cc1a83143..784cc36a5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "reactstrap", - "version": "4.7.0", + "version": "4.8.0", "description": "React Bootstrap 4 components", "main": "dist/reactstrap.cjs.js", "jsnext:main": "dist/reactstrap.es.js", From 8e978a4a7935d9ba2025b29d4d4b25f06e652499 Mon Sep 17 00:00:00 2001 From: Eddy Hernandez Date: Tue, 27 Jun 2017 21:18:27 -0700 Subject: [PATCH 013/862] build(travis): update secrets --- .travis.yml | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3f8f9784e..94640f749 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,34 +2,23 @@ sudo: false dist: trusty language: node_js node_js: - - 6 +- 6 cache: directories: - - node_modules + - node_modules before_script: - - chmod +x scripts/docs +- chmod +x scripts/docs script: - - npm run lint - - npm run cover -- --runInBand +- npm run lint +- npm run cover -- --runInBand after_script: - - npm run report-coverage +- npm run report-coverage after_success: - - scripts/docs +- scripts/docs env: global: - secure: GKu1vrkY7RWrrp0VOyxBjGSyTOGdU9jNT+oYR7P12PbCX4yzZ2mbsPpxWWs7Uh8ZXm5VEEfkrF80v/ccUEMvf1MD/q95nqLcQRoN/31yDhiJ66uW+mZk0C6OqUUZJlcSt1Ta6oLmLVmkJUu2euOo4ZTGQ1iwV9EOS+auPYUjXF7df8JE9sTof4YM3jUiQ+3ABIG8cOcsf81AyS9TOcpH6xPEs71Hz0uXta3TAAYpLgJSuuCciQn5Sr/9UIh9w10zAasSZBy27+A5mTf0C0xk3vN95cHfyS25r5x/zC3++YS//6MQASruT05Hf7STpF9Dy/6mdg6tMfGr+85zDqpMaF1dP5Rm9f8KHqZzYD52PtwLEkHpWwi/gqHY5vc+wHla5FEXiqawtBTRMj/hlvkvdN55qZnnFmsVEPrhHAIm1a8ECngzkZhG9QblszGgc55RtAtgGSlVsS5VWStsj29xLs2VJb6gYj69cMDSIND4e5VYzmrnaO/qRbzvRWJUIWFo/nmpSnAQbq5yV8K1+VukbxX/hF7+mE55ieeVww8tnC2bkxuQF1CbzTul5kPgAD7Hf8YdsSczvdZpSRHtN6OXGCotw4DRAiXZRb5TLFvEQFvbrNGciN5/Z1rXxlMr8WWwckAFxVW1EQd+kKg8abjCOLE+YY04a+h3W/+XOgDPUlA= + secure: Jb9Q9+XnCh+n5uNJuqUmLmPG6mUUv7iTi5bNeK6TpLdrVKk+2mLdobV3iRUy/DEqNLwt2lxwzp1oq4YI/lZ0vlUam7HpFWpSf4PAI8ckGRqFdus7K45o+zxHLJ2zBQwXacsZB204qtO8RDdXaNb9PjRGNFdKm3ZuqZTv6PkO+hS05EFxmcW95HiSHpV/qPxKjEsDdCpoTNEA3MP0dNtSKygeht2nFQVr7WkOhkjDvUtU9EypkGbJeBCd0AckqXM0Qvmdi++csyz5VRQhhUwI/2BKSjbBVUZ6Q3m8sX2p4G/wFEbhXl5eKTzAYLuf+9kT9Jg+gKdT30PoChx2NPKHv0XS8BOrKQScs6KIwOVH2/CNCKqAxh3HkCMSONmqEQRqBK1V/gSCZ4zDX9PgrfyE23FLN/GM4YtBlkVCMLh8Y/hiapXUaDobxh/o2tfOoQkeoZWZeoeIydhwULTDSG2R3PKV7rkGYas0VQ+qtU+i8VG+PzjPT4DRf4xIKzNzJbFIq9oTNYBTasWi6+OKzNw0uH3ydmRzf+GxaTwOIdR3nRQMQN60dH+6qeJkrIvpfrGAB5gqTutXPfe0xf2rMrW6dyipnSgGlk1JOgA+cU4CPyHql1OA+ox/kIQ4I3PIJBu5YYE3amFmKLu3vnDHELSzM1CYeOs0sDasRyiDkKE79l0= branches: only: - master - v4 -before_deploy: - - npm run build -deploy: - skip_cleanup: true - provider: npm - email: edward.d.hernandez@gmail.com - api_key: - secure: FFlZtXFtzHE0mnYlYPnv5g7CE3IYj4DdO28qxSLV1sa1UC/FJOAY6no5iiQ62aL0CH66B9sgXjvOvRDYoSfIWjOxYS49OcYQ1U6cW4x3azI34FTVCkjfsmoOrnsiBkNjYkKbz+XW7rsdN/u4CA9womdqHq4v4dNroB8mgrHKli5/CK7PhodRf9JYq758cc/cwZjnIQ3ioZ9vcsgsBcYO+705kh0x6HNEYQyhDMm++DMEupa7OtzZTeZbeDFxDCVlFWCxMJCbwkjqK4tqxXJglBbr2SPZ+LKi2EMHaILUoYwFsMimBFy+rYjCCe55zYnuYw2z+6lPeqbJ7pvhodTYcf/kUVpHzUKBMrCW4oJXlQ7MjaX9gaiiD8K+pnP7IF3N+j7iiroxsRa7floYTjDLstxNwrawfrIajL1C0wRTZ9g7CUX/Pbxjs818zOAloHqzlVQewIt3Jcj0CyXeVgZSQvcHvU1ROSJkN9qYyBXbb9rou4j+mgYvLLy+aql91dvmSjQIuDGqG9x+Acyz5Zl5N36JNjNAwJxF1NV1E/Vks8TPdgU3O6zylP+tg9HAzu7jG9gnIAusC7vkE/9RZ1TFQPAMTVrL+sqHmliDBHWBmMRibbkEsTl2vvV2ZSriHqQGqRFqv7jhON96RdzU6uxDtoRJb4ZGZrqEmt7l8n5USAU= - on: - tags: true - repo: reactstrap/reactstrap From ea18f7cd228d678bd43f552652ca7e589ec8382b Mon Sep 17 00:00:00 2001 From: Eddy Hernandez Date: Tue, 27 Jun 2017 21:20:14 -0700 Subject: [PATCH 014/862] docs(release): simplify release scripts and document --- README.md | 26 ++++++++++++++++++++++++++ scripts/docs | 0 scripts/publish | 14 +------------- scripts/release | 9 +-------- 4 files changed, 28 insertions(+), 21 deletions(-) mode change 100644 => 100755 scripts/docs mode change 100644 => 100755 scripts/publish mode change 100644 => 100755 scripts/release diff --git a/README.md b/README.md index 889eebe18..548765476 100644 --- a/README.md +++ b/README.md @@ -118,6 +118,32 @@ Watch tests: npm run test-watch ``` +## Releasing + +#### Create Release Branch + +To create a release branch and changelog, run the following command with a semantic release type (major, minor, patch): + +``` +./scripts/release +``` + +Verify changelog in branch. Create a PR if everything looks good. Merge when tests are green. + +#### Tagging and Publishing + +Once the release branch is merged, checkout master and run: + +``` +./scripts/publish +``` + +This will build the current state of master, tag it based on the release version and push the tag up to GitHub. If that all looks good, the final command to run is: + +``` +npm publish +``` + ## In the wild Organizations and projects using `reactstrap` diff --git a/scripts/docs b/scripts/docs old mode 100644 new mode 100755 diff --git a/scripts/publish b/scripts/publish old mode 100644 new mode 100755 index 9867b15a0..6ffb9c9af --- a/scripts/publish +++ b/scripts/publish @@ -20,11 +20,6 @@ if [ -z "$TRAVIS" ]; then npm run build fi -if [ -z "$GITHUB_TOKEN" ]; then - error "Environment variable GITHUB_TOKEN does not exist. Stopping deploy." - exit 1 -fi - if [ -z "$CURRENT_BRANCH" ]; then error "Not in a branch. Stopping deploy." exit 1 @@ -35,15 +30,8 @@ if [ -z "$VERSION" ]; then exit 1 fi -if ! [ -z "$TRAVIS" ]; then - git remote rm origin - git remote add origin https://${GITHUB_TOKEN}@github.com/reactstrap/reactstrap.git > /dev/null 2>&1 - git config user.name "Travis-CI" - git config user.email "reactstrap@github.io" -fi - git tag -a $VERSION -m "release $VERSION" git push --set-upstream origin $CURRENT_BRANCH > /dev/null 2>&1 git push --tags > /dev/null 2>&1 -success "pushed $VERSION tag to GitHub" +success "pushed $VERSION tag to GitHub. If everything looks good, run: npm publish" diff --git a/scripts/release b/scripts/release old mode 100644 new mode 100755 index 991038818..64cdf27cd --- a/scripts/release +++ b/scripts/release @@ -54,16 +54,9 @@ npm run build echo "==> Committing changes" -if ! [ -z "$TRAVIS" ]; then - git remote rm origin - git remote add origin https://${GITHUB_TOKEN}@github.com/reactstrap/reactstrap.git > /dev/null 2>&1 - git config user.name "Travis-CI" - git config user.email "reactstrap@github.io" -fi - git checkout -b "release-$VERSION" git add --all git commit --message "chore(release): adding $VERSION" git push --set-upstream origin "release-$VERSION" > /dev/null 2>&1 -success "release-$VERSION branch has been pushed" +success "release-$VERSION branch has been pushed. Verify at https://github.com/reactstrap/reactstrap/tree/release-$VERSION" From 1d2810d0ec9cdab245e6560a0fa8f1605b05117e Mon Sep 17 00:00:00 2001 From: Mark Johnson Date: Sat, 1 Jul 2017 11:06:55 -0700 Subject: [PATCH 015/862] docs(readme): add badges for CDN, NPM, and license + CDN info. (#486) --- README.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 548765476..d8463f0cf 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [![reactstrap](https://cloud.githubusercontent.com/assets/399776/13906899/1de62f0c-ee9f-11e5-95c0-c515fee8e918.png)](https://reactstrap.github.io) -[![Build Status](https://travis-ci.org/reactstrap/reactstrap.svg?branch=master)](https://travis-ci.org/reactstrap/reactstrap) [![Coverage Status](https://coveralls.io/repos/github/reactstrap/reactstrap/badge.svg?branch=master)](https://coveralls.io/github/reactstrap/reactstrap?branch=master) +[![CDNJS](https://img.shields.io/cdnjs/v/reactstrap.svg)](https://cdnjs.com/libraries/reactstrap) [![NPM Version](https://img.shields.io/npm/v/reactstrap.svg?branch=master)](https://www.npmjs.com/package/reactstrap) [![Build Status](https://travis-ci.org/reactstrap/reactstrap.svg?branch=master)](https://travis-ci.org/reactstrap/reactstrap) [![Coverage Status](https://coveralls.io/repos/github/reactstrap/reactstrap/badge.svg?branch=master)](https://coveralls.io/github/reactstrap/reactstrap?branch=master) [![License](https://img.shields.io/npm/l/reactstrap.svg)](https://github.com/reactstrap/reactstrap/blob/master/LICENSE) # reactstrap @@ -45,6 +45,19 @@ import { Button } from 'reactstrap'; Now you are ready to use the imported reactstrap components within your component hierarchy defined in the render method. Here is an example [`App.js`](https://gist.github.com/eddywashere/e13033c0e655ab7cda995f8bc77ce40d) redone using reactstrap. +### CDN + +Reactstrap can be included directly in your application's bundle or excluded during compilation and linked directly to a CDN. + +```html +https://cdnjs.cloudflare.com/ajax/libs/reactstrap/4.8.0/reactstrap.min.js +``` + +> Note: When using the external CDN library, be sure to include the required dependencies as necessary **prior** to the Reactstrap library: +> * [React](https://cdnjs.com/libraries/react) +> * [ReactTransitionGroup](https://unpkg.com/react-transition-group/dist/react-transition-group.min.js) + + ## About the Project This library contains React Bootstrap 4 components that favor composition and control. The library does not depend on jQuery or Bootstrap javascript. However, [Tether](http://tether.io/) is relied upon for advanced positioning of content like Tooltips, Popovers, and auto-flipping Dropdowns. From 9ab3e7c7b31cbc5f09e7263b7a63d724661ef4bb Mon Sep 17 00:00:00 2001 From: Mark Johnson Date: Sat, 1 Jul 2017 15:40:37 -0700 Subject: [PATCH 016/862] docs(Home): add improved CDN information (#488) --- docs/lib/Home/index.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/lib/Home/index.js b/docs/lib/Home/index.js index 0fe9fdfe0..bc4e34fbd 100644 --- a/docs/lib/Home/index.js +++ b/docs/lib/Home/index.js @@ -82,11 +82,21 @@ npm install --save reactstrap react-addons-transition-group react-addons-css-tra

Now you are ready to use the imported reactstrap components within your component hierarchy defined in the render method. Here is an example App.js redone using reactstrap.

CDN

+

Reactstrap can be included directly in your application's bundle or excluded during compilation and linked directly to a CDN.

               
-                https://unpkg.com/reactstrap/dist/reactstrap.min.js
+                https://cdnjs.cloudflare.com/ajax/libs/reactstrap/4.8.0/reactstrap.min.js
               
             
+
+

+ Note: When using the external CDN library, be sure to include the required dependencies as necessary prior to the Reactstrap library: +

+ +

Check out the demo here

About the Project


From 01250672e8c387aff5010666c7529cbc182cdd6c Mon Sep 17 00:00:00 2001 From: Evan Sharp Date: Tue, 11 Jul 2017 14:18:44 -0400 Subject: [PATCH 017/862] chore(readme): add version to install instructions (#497) closes #495 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d8463f0cf..bb21835f5 100644 --- a/README.md +++ b/README.md @@ -27,8 +27,8 @@ Then open [http://localhost:3000/](http://localhost:3000/) to see your app. The Install reactstrap and Bootstrap from NPM. Reactstrap does not include Bootstrap CSS so this needs to be installed as well: ``` -npm install bootstrap@4.0.0-alpha.6 --save -npm install --save reactstrap react-transition-group react react-dom +npm install --save bootstrap@4.0.0-alpha.6 +npm install --save reactstrap react-transition-group@^1.1.2 react@^15.3.0 react-dom@^15.3.0 ``` Import Bootstrap CSS in the ```src/index.js``` file: From 9c6154c5a1ec5b25238d3e402b52cbed2897fefe Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Wed, 12 Jul 2017 02:31:31 +0800 Subject: [PATCH 018/862] add "justified" attribute to Nav, missing unit tests for others (#491) --- src/Nav.js | 3 +++ src/__tests__/Nav.spec.js | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/src/Nav.js b/src/Nav.js index 96109b8a8..f576939a8 100644 --- a/src/Nav.js +++ b/src/Nav.js @@ -7,6 +7,7 @@ const propTypes = { tabs: PropTypes.bool, pills: PropTypes.bool, vertical: PropTypes.bool, + justified: PropTypes.bool, navbar: PropTypes.bool, tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]), className: PropTypes.string, @@ -24,6 +25,7 @@ const Nav = (props) => { tabs, pills, vertical, + justified, navbar, tag: Tag, ...attributes @@ -35,6 +37,7 @@ const Nav = (props) => { { 'nav-tabs': tabs, 'nav-pills': pills, + 'nav-justified': justified, 'flex-column': vertical } ), cssModule); diff --git a/src/__tests__/Nav.spec.js b/src/__tests__/Nav.spec.js index f85ed24e7..ea54485ad 100644 --- a/src/__tests__/Nav.spec.js +++ b/src/__tests__/Nav.spec.js @@ -21,6 +21,30 @@ describe('Nav', () => { expect(wrapper.html()).toBe(''); }); + it('should handle justified attribute', () => { + const wrapper = shallow(

Alignment

-

To align the DropdownMenu to the right, add a right prop to it.

+

To align the DropdownMenu to the right, add a right prop to Dropdown.

- Dropdown + This dropdown's menu is right-aligned Header @@ -103,7 +107,7 @@ DropdownToggle.propTypes = { {` - Dropdown + This dropdown's menu is right-aligned Header diff --git a/docs/lib/Components/NavsPage.js b/docs/lib/Components/NavsPage.js index 6fc306726..5baf1e76b 100644 --- a/docs/lib/Components/NavsPage.js +++ b/docs/lib/Components/NavsPage.js @@ -71,7 +71,6 @@ export default class NavssPage extends React.Component { group: PropTypes.bool, isOpen: PropTypes.bool, tag: PropTypes.string, - tether: PropTypes.oneOfType([PropTypes.object, PropTypes.bool]), toggle: PropTypes.func };`} diff --git a/docs/lib/Components/PopoversPage.js b/docs/lib/Components/PopoversPage.js index 481ffefe3..29bae733c 100644 --- a/docs/lib/Components/PopoversPage.js +++ b/docs/lib/Components/PopoversPage.js @@ -13,7 +13,7 @@ export default class PopoversPage extends React.Component {

Popovers

-

Popovers are built with http://tether.io.

+

Popovers are built with https://popper.js.org/ via https://github.com/souporserious/react-popper.

@@ -30,32 +30,34 @@ export default class PopoversPage extends React.Component { // boolean to control the state of the popover toggle: PropTypes.func, // callback for toggling isOpen in the controlling component - target: PropTypes.string.isRequired, - // target div ID, popover is attached to this element - tether: PropTypes.object, - // optionally overide tether config http://tether.io/#options - tetherRef: PropType.function, - // function which is passed a reference to the instance of tether for manually \`position()\`ing + target: PropTypes.oneOfType([ + PropTypes.string, + PropTypes.func, + DOMElement, // instanceof Element (https://developer.mozilla.org/en-US/docs/Web/API/Element) + ]).isRequired, + disabled: PropTypes.bool, + placementPrefix: PropTypes.string, + delay: PropTypes.oneOfType([ + PropTypes.shape({ show: PropTypes.number, hide: PropTypes.number }), + PropTypes.number, + ]), placement: PropTypes.oneOf([ + 'auto', + 'auto-start', + 'auto-end', 'top', + 'top-start', + 'top-end', + 'right', + 'right-start', + 'right-end', 'bottom', + 'bottom-start', + 'bottom-end', 'left', - 'right', - 'top left', - 'top center', - 'top right', - 'right top', - 'right middle', - 'right bottom', - 'bottom right', - 'bottom center', - 'bottom left', - 'left top', - 'left middle', - 'left bottom' + 'left-start', + 'left-end', ]) - // convenience attachments for popover - // examples http://github.hubspot.com/tooltip/docs/welcome/ }`} diff --git a/docs/lib/Components/TooltipsPage.js b/docs/lib/Components/TooltipsPage.js index 9bea30a05..52af3d3b8 100644 --- a/docs/lib/Components/TooltipsPage.js +++ b/docs/lib/Components/TooltipsPage.js @@ -17,7 +17,7 @@ export default class TooltipsPage extends React.Component {

Tooltips

-

Tooltips are built with http://tether.io.

+

Tooltips are built with https://popper.js.org/ via https://github.com/souporserious/react-popper.

@@ -39,10 +39,6 @@ export default class TooltipsPage extends React.Component { PropTypes.object ]).isRequired, // target element or element ID, popover is attached to this element - tether: PropTypes.oneOfType([PropTypes.object, PropTypes.bool]), - // optionally overide tether config http://tether.io/#options - tetherRef: PropType.function, - // function which is passed a reference to the instance of tether for manually \`position()\`ing delay: PropTypes.oneOfType([ PropTypes.shape({ show: PropTypes.number, hide: PropTypes.number }), PropTypes.number @@ -51,22 +47,21 @@ export default class TooltipsPage extends React.Component { autohide: PropTypes.bool, // optionally hide tooltip when hovering over tooltip content - default true placement: PropTypes.oneOf([ + 'auto', + 'auto-start', + 'auto-end', 'top', + 'top-start', + 'top-end', + 'right', + 'right-start', + 'right-end', 'bottom', + 'bottom-start', + 'bottom-end', 'left', - 'right', - 'top left', - 'top center', - 'top right', - 'right top', - 'right middle', - 'right bottom', - 'bottom right', - 'bottom center', - 'bottom left', - 'left top', - 'left middle', - 'left bottom' + 'left-start', + 'left-end', ]) // convenience attachments for popover // examples http://github.hubspot.com/tooltip/docs/welcome/ diff --git a/docs/lib/Home/index.js b/docs/lib/Home/index.js index bc4e34fbd..2263d385c 100644 --- a/docs/lib/Home/index.js +++ b/docs/lib/Home/index.js @@ -100,7 +100,7 @@ npm install --save reactstrap react-addons-transition-group react-addons-css-tra

Check out the demo here

About the Project


-

This library contains React Bootstrap 4 components that favor composition and control. The library does not depend on jQuery or Bootstrap javascript. However, Tether is relied upon for advanced positioning of content like Tooltips, Popovers, and auto-flipping Dropdowns.

+

This library contains React Bootstrap 4 components that favor composition and control. The library does not depend on jQuery or Bootstrap javascript. However, https://popper.js.org/ via https://github.com/souporserious/react-popper is relied upon for advanced positioning of content like Tooltips, Popovers, and auto-flipping Dropdowns.

There are a few core concepts to understand in order to make the most out of this library.

1) Your content is expected to be composed via props.children rather than using named props to pass in Components.

@@ -126,7 +126,7 @@ const PreferredExample = (props) => {
               
             

- 2) Attributes in this library are used to pass in state, conveniently apply modifier classes, enable advanced functionality (like tether), or automatically include non-content based elements. + 2) Attributes in this library are used to pass in state, conveniently apply modifier classes, enable advanced functionality (like popperjs), or automatically include non-content based elements.

Examples:

    diff --git a/docs/lib/examples/CustomDropdown.js b/docs/lib/examples/CustomDropdown.js index 570ceb47b..ab1df4344 100644 --- a/docs/lib/examples/CustomDropdown.js +++ b/docs/lib/examples/CustomDropdown.js @@ -1,5 +1,5 @@ import React from 'react'; -import { Dropdown, DropdownMenu } from 'reactstrap'; +import { Dropdown, DropdownMenu, DropdownToggle } from 'reactstrap'; export default class Example extends React.Component { constructor(props) { @@ -20,14 +20,15 @@ export default class Example extends React.Component { render() { return ( - Custom Dropdown Content - +
    Custom dropdown item
    Custom dropdown item
    diff --git a/package.json b/package.json index 516c79cc1..e86a32a82 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,9 @@ "lodash.isfunction": "^3.0.8", "lodash.isobject": "^3.0.2", "lodash.tonumber": "^4.0.3", + "popper.js": "^1.10.8", "prop-types": "^15.5.8", + "react-popper": "^0.7.2", "reactstrap-tether": "1.3.4" }, "peerDependencies": { @@ -115,11 +117,11 @@ "css-loader": "^0.25.0", "ejs": "^2.5.1", "enzyme": "^2.8.2", - "eslint": "^3.2.2", - "eslint-config-airbnb": "^10.0.0", - "eslint-plugin-import": "^1.12.0", - "eslint-plugin-jsx-a11y": "^2.0.1", - "eslint-plugin-react": "^6.0.0", + "eslint": "^4.1.1", + "eslint-config-airbnb": "^15.1.0", + "eslint-plugin-import": "^2.6.0", + "eslint-plugin-jsx-a11y": "^5.1.1", + "eslint-plugin-react": "^7.1.0", "eslint-plugin-standard": "^2.0.0", "extract-text-webpack-plugin": "^1.0.1", "history": "^3.0.0", @@ -132,7 +134,7 @@ "react-helmet": "^5.0.3", "react-prism": "^4.1.0", "react-router": "^2.6.1", - "react-scripts": "^0.9.5", + "react-scripts": "^1.0.12", "react-test-renderer": "^15.5.4", "react-transition-group": "^1.1.2", "rollup": "^0.43.0", diff --git a/src/Button.js b/src/Button.js index 1c77cf4aa..e039ba970 100644 --- a/src/Button.js +++ b/src/Button.js @@ -10,7 +10,7 @@ const propTypes = { disabled: PropTypes.bool, outline: PropTypes.bool, tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]), - getRef: PropTypes.oneOfType([PropTypes.func, PropTypes.string]), + innerRef: PropTypes.oneOfType([PropTypes.func, PropTypes.string]), onClick: PropTypes.func, size: PropTypes.string, children: PropTypes.node, @@ -51,7 +51,7 @@ class Button extends React.Component { outline, size, tag: Tag, - getRef, + innerRef, ...attributes } = this.props; @@ -73,7 +73,7 @@ class Button extends React.Component { type={(Tag === 'button' && attributes.onClick) ? 'button' : undefined} {...attributes} className={classes} - ref={getRef} + ref={innerRef} onClick={this.onClick} /> ); diff --git a/src/CardLink.js b/src/CardLink.js index f1217f92f..8b05cbd0a 100644 --- a/src/CardLink.js +++ b/src/CardLink.js @@ -5,7 +5,7 @@ import { mapToCssModules } from './utils'; const propTypes = { tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]), - getRef: PropTypes.oneOfType([PropTypes.func, PropTypes.string]), + innerRef: PropTypes.oneOfType([PropTypes.func, PropTypes.string]), className: PropTypes.string, cssModule: PropTypes.object, }; @@ -19,7 +19,7 @@ const CardLink = (props) => { className, cssModule, tag: Tag, - getRef, + innerRef, ...attributes } = props; const classes = mapToCssModules(classNames( @@ -28,7 +28,7 @@ const CardLink = (props) => { ), cssModule); return ( - + ); }; diff --git a/src/Carousel.js b/src/Carousel.js index ff3475003..de38a3906 100644 --- a/src/Carousel.js +++ b/src/Carousel.js @@ -5,7 +5,6 @@ import { TransitionGroup } from 'react-transition-group'; import { mapToCssModules } from './utils'; class Carousel extends React.Component { - constructor(props) { super(props); this.handleKeyPress = this.handleKeyPress.bind(this); @@ -60,13 +59,13 @@ class Carousel extends React.Component { render() { const { children, cssModule, activeIndex, hoverStart, hoverEnd } = this.props; const outerClasses = mapToCssModules(classNames( - 'carousel', - 'slide' - ), cssModule); + 'carousel', + 'slide' + ), cssModule); const innerClasses = mapToCssModules(classNames( - 'carousel-inner' - ), cssModule); + 'carousel-inner' + ), cssModule); const slidesOnly = children.every((child) => { @@ -108,7 +107,14 @@ class Carousel extends React.Component { const controlRight = children[3]; return ( -
    { this.carousel = carousel; }} className={outerClasses} onMouseEnter={hoverStart} onMouseLeave={hoverEnd}> +
    { + this.carousel = carousel; + }} + className={outerClasses} + onMouseEnter={hoverStart} + onMouseLeave={hoverEnd} + > {indicators} {carouselItems[activeIndex]} @@ -118,7 +124,6 @@ class Carousel extends React.Component {
    ); } - } Carousel.propTypes = { diff --git a/src/CarouselCaption.js b/src/CarouselCaption.js index a68712cb6..defb2ccdd 100644 --- a/src/CarouselCaption.js +++ b/src/CarouselCaption.js @@ -6,10 +6,10 @@ import { mapToCssModules } from './utils'; const CarouselCaption = (props) => { const { captionHeader, captionText, cssModule } = props; const classes = mapToCssModules(classNames( - 'carousel-caption', - 'd-none', - 'd-md-block' - ), cssModule); + 'carousel-caption', + 'd-none', + 'd-md-block' + ), cssModule); return (
    diff --git a/src/CarouselControl.js b/src/CarouselControl.js index 8a3a396fc..bdc2c0ac5 100644 --- a/src/CarouselControl.js +++ b/src/CarouselControl.js @@ -7,21 +7,24 @@ const CarouselControl = (props) => { const { direction, onClickHandler, cssModule, directionText } = props; const anchorClasses = mapToCssModules(classNames( - `carousel-control-${direction}` - ), cssModule); + `carousel-control-${direction}` + ), cssModule); const iconClasses = mapToCssModules(classNames( - `carousel-control-${direction}-icon` - ), cssModule); + `carousel-control-${direction}-icon` + ), cssModule); const screenReaderClasses = mapToCssModules(classNames( - 'sr-only' - ), cssModule); + 'sr-only' + ), cssModule); return ( { + className={anchorClasses} + role="button" + tabIndex="0" + onClick={(e) => { e.preventDefault(); onClickHandler(); }} diff --git a/src/CarouselIndicators.js b/src/CarouselIndicators.js index 2d040ebab..b63c88f31 100644 --- a/src/CarouselIndicators.js +++ b/src/CarouselIndicators.js @@ -9,14 +9,16 @@ const CarouselIndicators = (props) => { const listClasses = mapToCssModules('carousel-indicators', cssModule); const indicators = items.map((item, idx) => { const indicatorClasses = mapToCssModules(classNames( - { active: activeIndex === idx } - ), cssModule); + { active: activeIndex === idx } + ), cssModule); return (
  • { + key={`${item.src}${item.caption}${item.altText}`} + onClick={(e) => { e.preventDefault(); onClickHandler(idx); - }} className={indicatorClasses} + }} + className={indicatorClasses} />); }); diff --git a/src/CarouselItem.js b/src/CarouselItem.js index 21f5835b9..b03318de2 100644 --- a/src/CarouselItem.js +++ b/src/CarouselItem.js @@ -5,7 +5,6 @@ import { mapToCssModules } from './utils'; import CarouselCaption from './CarouselCaption'; class CarouselItem extends React.Component { - constructor(props) { super(props); this.state = { animation: [] }; @@ -68,14 +67,19 @@ class CarouselItem extends React.Component { render() { const { src, altText, children, cssModule } = this.props; const classes = mapToCssModules(classNames( - 'd-block', - 'img-fluid' + 'd-block', + 'img-fluid' ), cssModule); const itemClasses = mapToCssModules(classNames('carousel-item', ...this.state.animation), cssModule); return ( -
    { this.slide = slide; }}> +
    { + this.slide = slide; + }} + > {altText} {children}
    diff --git a/src/Col.js b/src/Col.js index 840b316af..72e9548bd 100644 --- a/src/Col.js +++ b/src/Col.js @@ -65,7 +65,7 @@ const Col = (props) => { delete attributes[colWidth]; - if (!columnProp) { + if (!columnProp && columnProp !== '') { return; } diff --git a/src/Dropdown.js b/src/Dropdown.js index e8b9f91a8..7e172746d 100644 --- a/src/Dropdown.js +++ b/src/Dropdown.js @@ -4,10 +4,9 @@ import React from 'react'; import PropTypes from 'prop-types'; import ReactDOM from 'react-dom'; +import { Manager } from 'react-popper'; import classNames from 'classnames'; import { mapToCssModules, omit } from './utils'; -import TetherContent from './TetherContent'; -import DropdownMenu from './DropdownMenu'; const propTypes = { disabled: PropTypes.bool, @@ -16,7 +15,6 @@ const propTypes = { isOpen: PropTypes.bool, size: PropTypes.string, tag: PropTypes.string, - tether: PropTypes.oneOfType([PropTypes.object, PropTypes.bool]), toggle: PropTypes.func, children: PropTypes.node, className: PropTypes.string, @@ -25,21 +23,14 @@ const propTypes = { const defaultProps = { isOpen: false, - tag: 'div' + dropup: false, + tag: 'div', }; const childContextTypes = { toggle: PropTypes.func.isRequired, isOpen: PropTypes.bool.isRequired, -}; - -const defaultTetherConfig = { - classPrefix: 'bs-tether', - classes: { element: 'dropdown', enabled: 'show' }, - constraints: [ - { to: 'scrollParent', attachment: 'together none' }, - { to: 'window', attachment: 'together none' } - ] + dropup: PropTypes.bool.isRequired, }; class Dropdown extends React.Component { @@ -47,7 +38,6 @@ class Dropdown extends React.Component { super(props); this.addEvents = this.addEvents.bind(this); - this.getTetherConfig = this.getTetherConfig.bind(this); this.handleDocumentClick = this.handleDocumentClick.bind(this); this.removeEvents = this.removeEvents.bind(this); this.toggle = this.toggle.bind(this); @@ -56,7 +46,8 @@ class Dropdown extends React.Component { getChildContext() { return { toggle: this.props.toggle, - isOpen: this.props.isOpen + isOpen: this.props.isOpen, + dropup: this.props.dropup, }; } @@ -74,38 +65,6 @@ class Dropdown extends React.Component { this.removeEvents(); } - getTetherTarget() { - const container = ReactDOM.findDOMNode(this); - - return container.querySelector('[data-toggle="dropdown"]'); - } - - getTetherConfig(childProps) { - const target = () => this.getTetherTarget(); - let vElementAttach = 'top'; - let hElementAttach = 'left'; - let vTargetAttach = 'bottom'; - let hTargetAttach = 'left'; - - if (childProps.right) { - hElementAttach = 'right'; - hTargetAttach = 'right'; - } - - if (this.props.dropup) { - vElementAttach = 'bottom'; - vTargetAttach = 'top'; - } - - return { - ...defaultTetherConfig, - attachment: vElementAttach + ' ' + hElementAttach, - targetAttachment: vTargetAttach + ' ' + hTargetAttach, - target, - ...this.props.tether - }; - } - addEvents() { document.addEventListener('click', this.handleDocumentClick, true); } @@ -125,10 +84,6 @@ class Dropdown extends React.Component { } handleProps() { - if (this.props.tether) { - return; - } - if (this.props.isOpen) { this.addEvents(); } else { @@ -141,23 +96,7 @@ class Dropdown extends React.Component { return e && e.preventDefault(); } - return this.props.toggle(); - } - - renderChildren() { - const { tether, children, ...attrs } = this.props; - attrs.toggle = this.toggle; - - return React.Children.map(React.Children.toArray(children), (child) => { - if (tether && child.type === DropdownMenu) { - let tetherConfig = this.getTetherConfig(child.props); - return ( - {child} - ); - } - - return child; - }); + return this.props.toggle(e); } render() { @@ -165,12 +104,11 @@ class Dropdown extends React.Component { className, cssModule, dropup, + isOpen, group, size, - tag: Tag, - isOpen, - ...attributes - } = omit(this.props, ['toggle', 'tether']); + ...attrs + } = omit(this.props, ['toggle', 'disabled']); const classes = mapToCssModules(classNames( className, @@ -182,15 +120,7 @@ class Dropdown extends React.Component { dropup: dropup } ), cssModule); - - return ( - - {this.renderChildren()} - - ); + return {}; } } diff --git a/src/DropdownItem.js b/src/DropdownItem.js index 99f95f478..262e47567 100644 --- a/src/DropdownItem.js +++ b/src/DropdownItem.js @@ -44,7 +44,7 @@ class DropdownItem extends React.Component { } if (this.props.toggle) { - this.context.toggle(); + this.context.toggle(e); } } diff --git a/src/DropdownMenu.js b/src/DropdownMenu.js index 0fd5f62da..4a01d9a8b 100644 --- a/src/DropdownMenu.js +++ b/src/DropdownMenu.js @@ -1,26 +1,34 @@ import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; +import { Popper } from 'react-popper'; import { mapToCssModules } from './utils'; const propTypes = { - tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]), + tag: PropTypes.string, children: PropTypes.node.isRequired, right: PropTypes.bool, + flip: PropTypes.bool, className: PropTypes.string, cssModule: PropTypes.object, }; const defaultProps = { tag: 'div', + flip: true, }; const contextTypes = { - isOpen: PropTypes.bool.isRequired + isOpen: PropTypes.bool.isRequired, + dropup: PropTypes.bool.isRequired, }; +const noFlipModifier = { flip: { enabled: false } }; + const DropdownMenu = (props, context) => { - const { className, cssModule, right, tag: Tag, ...attributes } = props; + const { className, cssModule, right, tag, flip, ...attrs } = props; + const position1 = context.dropup ? 'top' : 'bottom'; + const position2 = right ? 'end' : 'start'; const classes = mapToCssModules(classNames( className, 'dropdown-menu', @@ -30,8 +38,18 @@ const DropdownMenu = (props, context) => { } ), cssModule); + attrs.placement = `${position1}-${position2}`; + return ( - + ); }; diff --git a/src/DropdownToggle.js b/src/DropdownToggle.js index 12769746b..4621cbd94 100644 --- a/src/DropdownToggle.js +++ b/src/DropdownToggle.js @@ -1,6 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; +import { Target } from 'react-popper'; import { mapToCssModules } from './utils'; import Button from './Button'; @@ -27,7 +28,7 @@ const defaultProps = { const contextTypes = { isOpen: PropTypes.bool.isRequired, - toggle: PropTypes.func.isRequired + toggle: PropTypes.func.isRequired, }; class DropdownToggle extends React.Component { @@ -51,7 +52,7 @@ class DropdownToggle extends React.Component { this.props.onClick(e); } - this.context.toggle(); + this.context.toggle(e); } render() { @@ -81,9 +82,10 @@ class DropdownToggle extends React.Component { } return ( - { cssModule, inline, tag: Tag, - getRef, + innerRef, ...attributes } = props; @@ -32,7 +32,7 @@ const Form = (props) => { ), cssModule); return ( - + ); }; diff --git a/src/Input.js b/src/Input.js index a313533ca..262e21567 100644 --- a/src/Input.js +++ b/src/Input.js @@ -11,7 +11,7 @@ const propTypes = { size: PropTypes.string, state: PropTypes.string, tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]), - getRef: PropTypes.oneOfType([PropTypes.func, PropTypes.string]), + innerRef: PropTypes.oneOfType([PropTypes.func, PropTypes.string]), static: PropTypes.bool, addon: PropTypes.bool, className: PropTypes.string, @@ -34,7 +34,7 @@ class Input extends React.Component { tag, addon, static: staticInput, - getRef, + innerRef, ...attributes } = this.props; @@ -72,7 +72,7 @@ class Input extends React.Component { } return ( - + ); } } diff --git a/src/Label.js b/src/Label.js index dc4f77649..669e3fd5b 100644 --- a/src/Label.js +++ b/src/Label.js @@ -75,7 +75,7 @@ const Label = (props) => { delete attributes[colWidth]; - if (!columnProp) { + if (!columnProp && columnProp !== '') { return; } diff --git a/src/Modal.js b/src/Modal.js index 553dec75f..aa38da979 100644 --- a/src/Modal.js +++ b/src/Modal.js @@ -204,7 +204,9 @@ class Modal extends React.Component { [`modal-${this.props.size}`]: this.props.size }), this.props.cssModule)} role="document" - ref={(c) => (this._dialog = c)} + ref={(c) => { + this._dialog = c; + }} {...attributes} >
    + ); } } diff --git a/src/Popover.js b/src/Popover.js index 52e639f4d..b56cc52a6 100644 --- a/src/Popover.js +++ b/src/Popover.js @@ -1,53 +1,139 @@ import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; -import TetherContent from './TetherContent'; -import { getTetherAttachments, mapToCssModules, omit, tetherAttachements } from './utils'; +import { placements } from 'popper.js'; +import PopperContent from './PopperContent'; +import { getTarget, DOMElement, mapToCssModules, omit } from './utils'; const propTypes = { - placement: PropTypes.oneOf(tetherAttachements), - target: PropTypes.string.isRequired, + placement: PropTypes.oneOf(placements), + target: PropTypes.oneOfType([ + PropTypes.string, + PropTypes.func, + DOMElement, + ]).isRequired, isOpen: PropTypes.bool, - tether: PropTypes.object, - tetherRef: PropTypes.func, + disabled: PropTypes.bool, className: PropTypes.string, + placementPrefix: PropTypes.string, cssModule: PropTypes.object, toggle: PropTypes.func, + delay: PropTypes.oneOfType([ + PropTypes.shape({ show: PropTypes.number, hide: PropTypes.number }), + PropTypes.number, + ]), }; -const defaultProps = { - isOpen: false, - placement: 'bottom', - toggle: () => {} +const DEFAULT_DELAYS = { + show: 0, + hide: 0, }; -const defaultTetherConfig = { - classPrefix: 'bs-tether', - classes: { - element: false, - enabled: 'show', - }, - constraints: [ - { to: 'scrollParent', attachment: 'together none' }, - { to: 'window', attachment: 'together none' } - ] +const defaultProps = { + isOpen: false, + placement: 'right', + placementPrefix: 'bs-popover', + delay: DEFAULT_DELAYS, + toggle: () => {}, }; class Popover extends React.Component { constructor(props) { super(props); - this.getTetherConfig = this.getTetherConfig.bind(this); + this.addTargetEvents = this.addTargetEvents.bind(this); + this.handleDocumentClick = this.handleDocumentClick.bind(this); + this.removeTargetEvents = this.removeTargetEvents.bind(this); + this.toggle = this.toggle.bind(this); + this.show = this.show.bind(this); + this.hide = this.hide.bind(this); + } + + componentDidMount() { + this._target = getTarget(this.props.target); + this.handleProps(); } - getTetherConfig() { - const attachments = getTetherAttachments(this.props.placement); - return { - ...defaultTetherConfig, - ...attachments, - target: '#' + this.props.target, - ...this.props.tether - }; + componentDidUpdate() { + this.handleProps(); + } + + componentWillUnmount() { + this.clearShowTimeout(); + this.clearHideTimeout(); + this.removeTargetEvents(); + } + + getDelay(key) { + const { delay } = this.props; + if (typeof delay === 'object') { + return isNaN(delay[key]) ? DEFAULT_DELAYS[key] : delay[key]; + } + return delay; + } + + handleProps() { + if (this.props.isOpen) { + this.show(); + } else { + this.hide(); + } + } + + show() { + this.clearHideTimeout(); + this.addTargetEvents(); + if (!this.props.isOpen) { + this.clearShowTimeout(); + this._showTimeout = setTimeout(this.toggle, this.getDelay('show')); + } + } + + hide() { + this.clearShowTimeout(); + this.removeTargetEvents(); + if (this.props.isOpen) { + this.clearHideTimeout(); + this._hideTimeout = setTimeout(this.toggle, this.getDelay('hide')); + } + } + + clearShowTimeout() { + clearTimeout(this._showTimeout); + this._showTimeout = undefined; + } + + clearHideTimeout() { + clearTimeout(this._hideTimeout); + this._hideTimeout = undefined; + } + + handleDocumentClick(e) { + if (e.target !== this._target && !this._target.contains(e.target)) { + if (this._hideTimeout) { + this.clearHideTimeout(); + } + + if (this.props.isOpen) { + this.toggle(); + } + } + } + + addTargetEvents() { + document.addEventListener('click', this.handleDocumentClick, true); + } + + removeTargetEvents() { + document.removeEventListener('click', this.handleDocumentClick, true); + } + + toggle(e) { + if (this.props.disabled) { + return e && e.preventDefault(); + } + + return this.props.toggle(); } render() { @@ -55,25 +141,27 @@ class Popover extends React.Component { return null; } - let tetherConfig = this.getTetherConfig(); - + const attributes = omit(this.props, Object.keys(propTypes)); const classes = mapToCssModules(classNames( 'popover-inner', this.props.className ), this.props.cssModule); - const attributes = omit(this.props, Object.keys(propTypes)); + const popperClasses = mapToCssModules(classNames( + 'popover', + 'show' + ), this.props.cssModule); return ( -
    - + ); } } diff --git a/src/PopperContent.js b/src/PopperContent.js new file mode 100644 index 000000000..77f4c3231 --- /dev/null +++ b/src/PopperContent.js @@ -0,0 +1,96 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import classNames from 'classnames'; +import { Arrow, Manager, Popper as ReactPopper } from 'react-popper'; +import PopperTargetHelper from './PopperTargetHelper'; +import { DOMElement, mapToCssModules } from './utils'; + +const propTypes = { + children: PropTypes.node.isRequired, + className: PropTypes.string, + placement: PropTypes.string, + placementPrefix: PropTypes.string, + tag: PropTypes.string, + isOpen: PropTypes.bool.isRequired, + cssModule: PropTypes.object, + wrapTag: PropTypes.string, + wrapClassName: PropTypes.string, + offset: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + fallbackPlacement: PropTypes.oneOfType([PropTypes.string, PropTypes.array]), + flip: PropTypes.bool, + target: PropTypes.oneOfType([PropTypes.string, PropTypes.func, DOMElement]).isRequired, +}; + +const defaultProps = { + placement: 'auto', + isOpen: false, + offset: 0, + fallbackPlacement: 'flip', + wrapTag: 'span', + flip: true, +}; + +class PopperContent extends React.Component { + constructor(props) { + super(props); + + this.handlePlacementChange = this.handlePlacementChange.bind(this); + this.state = {}; + } + + handlePlacementChange(data) { + if (this.state.placement !== data.placement) { + this.setState({ placement: data.placement }); + } + return data; + } + + render() { + const { + cssModule, + children, + isOpen, + flip, + target, + offset, + fallbackPlacement, + placementPrefix, + className, + wrapTag, + wrapClassName, + tag, + ...attrs } = this.props; + const arrowClassName = mapToCssModules('arrow', cssModule); + const placement = (this.state.placement || attrs.placement).split('-')[0]; + const managerClass = mapToCssModules(wrapClassName, this.props.cssModule); + const popperClassName = mapToCssModules(classNames( + className, + placementPrefix ? `${placementPrefix}-${placement}` : placement + ), this.props.cssModule); + + const modifiers = { + offset: { offset }, + flip: { enabled: flip, behavior: fallbackPlacement }, + update: { + enabled: true, + order: 950, + fn: this.handlePlacementChange, + }, + }; + + return ( + + + {isOpen && + {children} + + } + + ); + } +} + +PopperContent.propTypes = propTypes; +PopperContent.defaultProps = defaultProps; + +export default PopperContent; diff --git a/src/PopperTargetHelper.js b/src/PopperTargetHelper.js new file mode 100644 index 000000000..cea7a85d9 --- /dev/null +++ b/src/PopperTargetHelper.js @@ -0,0 +1,17 @@ +import PropTypes from 'prop-types'; +import { getTarget, DOMElement } from './utils'; + +const PopperTargetHelper = (props, context) => { + context.popperManager.setTargetNode(getTarget(props.target)); + return null; +}; + +PopperTargetHelper.contextTypes = { + popperManager: PropTypes.object.isRequired, +}; + +PopperTargetHelper.propTypes = { + target: PropTypes.oneOfType([PropTypes.string, PropTypes.func, DOMElement]).isRequired, +}; + +export default PopperTargetHelper; diff --git a/src/TetherContent.js b/src/TetherContent.js deleted file mode 100644 index 62e0e5d06..000000000 --- a/src/TetherContent.js +++ /dev/null @@ -1,146 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import ReactDOM from 'react-dom'; -import isFunction from 'lodash.isfunction'; -import Tether from 'reactstrap-tether'; - -const propTypes = { - children: PropTypes.node.isRequired, - className: PropTypes.string, - arrow: PropTypes.string, - disabled: PropTypes.bool, - isOpen: PropTypes.bool.isRequired, - toggle: PropTypes.func.isRequired, - tether: PropTypes.object.isRequired, - tetherRef: PropTypes.func, - style: PropTypes.node, - cssModule: PropTypes.object, -}; - -const defaultProps = { - isOpen: false, - tetherRef: function () {} -}; - -class TetherContent extends React.Component { - constructor(props) { - super(props); - - this.handleDocumentClick = this.handleDocumentClick.bind(this); - this.toggle = this.toggle.bind(this); - } - - componentDidMount() { - this.handleProps(); - } - - componentDidUpdate(prevProps) { - if (this.props.isOpen !== prevProps.isOpen) { - this.handleProps(); - } else if (this._element) { - // rerender - this.renderIntoSubtree(); - } - } - - componentWillUnmount() { - this.hide(); - } - - getTarget() { - const target = this.props.tether.target; - - if (isFunction(target)) { - return target(); - } - - return target; - } - - getTetherConfig() { - const config = { - ...this.props.tether - }; - - config.element = this._element; - config.target = this.getTarget(); - return config; - } - - handleDocumentClick(e) { - const container = this._element; - if (e.target === container || !container.contains(e.target)) { - this.toggle(); - } - } - - handleProps() { - if (this.props.isOpen) { - this.show(); - } else { - this.hide(); - } - } - - hide() { - document.removeEventListener('click', this.handleDocumentClick, true); - - if (this._element) { - document.body.removeChild(this._element); - ReactDOM.unmountComponentAtNode(this._element); - this._element = null; - } - - if (this._tether) { - this._tether.destroy(); - this._tether = null; - this.props.tetherRef(this._tether); - } - } - - show() { - document.addEventListener('click', this.handleDocumentClick, true); - - this._element = document.createElement('div'); - this._element.className = this.props.className; - document.body.appendChild(this._element); - this.renderIntoSubtree(); - this._tether = new Tether(this.getTetherConfig()); - this.props.tetherRef(this._tether); - this._tether.position(); - this._element.childNodes[0].focus(); - } - - toggle(e) { - if (this.props.disabled) { - return e && e.preventDefault(); - } - - return this.props.toggle(); - } - - renderIntoSubtree() { - ReactDOM.unstable_renderSubtreeIntoContainer( - this, - this.renderChildren(), - this._element - ); - } - - renderChildren() { - const { children, style } = this.props; - return React.cloneElement( - children, - { style } - ); - } - - render() { - return null; - } -} - -TetherContent.propTypes = propTypes; -TetherContent.defaultProps = defaultProps; - -export default TetherContent; diff --git a/src/Tooltip.js b/src/Tooltip.js index e2a6a1170..c4b1e764b 100644 --- a/src/Tooltip.js +++ b/src/Tooltip.js @@ -1,23 +1,24 @@ import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; -import TetherContent from './TetherContent'; -import { getTetherAttachments, mapToCssModules, omit, tetherAttachements } from './utils'; +import { placements } from 'popper.js'; +import Popper from './PopperContent'; +import { getTarget, DOMElement, mapToCssModules, omit } from './utils'; const propTypes = { - placement: PropTypes.oneOf(tetherAttachements), + placement: PropTypes.oneOf(placements), target: PropTypes.oneOfType([ PropTypes.string, - PropTypes.object + PropTypes.func, + DOMElement, ]).isRequired, isOpen: PropTypes.bool, disabled: PropTypes.bool, - tether: PropTypes.object, - tetherRef: PropTypes.func, className: PropTypes.string, cssModule: PropTypes.object, toggle: PropTypes.func, autohide: PropTypes.bool, + placementPrefix: PropTypes.string, delay: PropTypes.oneOfType([ PropTypes.shape({ show: PropTypes.number, hide: PropTypes.number }), PropTypes.number, @@ -31,31 +32,18 @@ const DEFAULT_DELAYS = { const defaultProps = { isOpen: false, - placement: 'bottom', + placement: 'top', + placementPrefix: 'bs-tooltip', delay: DEFAULT_DELAYS, autohide: true, toggle: function () {} }; -const defaultTetherConfig = { - classPrefix: 'bs-tether', - classes: { - element: false, - enabled: 'show', - }, - constraints: [ - { to: 'scrollParent', attachment: 'together none' }, - { to: 'window', attachment: 'together none' } - ] -}; - class Tooltip extends React.Component { constructor(props) { super(props); this.addTargetEvents = this.addTargetEvents.bind(this); - this.getTarget = this.getTarget.bind(this); - this.getTetherConfig = this.getTetherConfig.bind(this); this.handleDocumentClick = this.handleDocumentClick.bind(this); this.removeTargetEvents = this.removeTargetEvents.bind(this); this.toggle = this.toggle.bind(this); @@ -68,7 +56,7 @@ class Tooltip extends React.Component { } componentDidMount() { - this._target = this.getTarget(); + this._target = getTarget(this.props.target); this.addTargetEvents(); } @@ -117,24 +105,6 @@ class Tooltip extends React.Component { return delay; } - getTarget() { - const { target } = this.props; - if (typeof target === 'object') { - return target; - } - return document.getElementById(target); - } - - getTetherConfig() { - const attachments = getTetherAttachments(this.props.placement); - return { - ...defaultTetherConfig, - ...attachments, - target: this.getTarget, - ...this.props.tether - }; - } - show() { if (!this.props.isOpen) { this.clearShowTimeout(); @@ -202,15 +172,18 @@ class Tooltip extends React.Component { this.props.className ), this.props.cssModule); - let tetherConfig = this.getTetherConfig(); + const popperClasses = mapToCssModules(classNames( + 'tooltip', + 'show' + ), this.props.cssModule); return ( -
    - + ); } } diff --git a/src/Uncontrolled.js b/src/Uncontrolled.js index 1aeac7f65..80c50bd6b 100644 --- a/src/Uncontrolled.js +++ b/src/Uncontrolled.js @@ -14,7 +14,7 @@ const components = { UncontrolledTooltip: Tooltip, }; -Object.keys(components).forEach(key => { +Object.keys(components).forEach((key) => { const Tag = components[key]; const defaultValue = Tag === Alert; diff --git a/src/__tests__/.eslintrc b/src/__tests__/.eslintrc index c21a7ba50..7ab747f3f 100644 --- a/src/__tests__/.eslintrc +++ b/src/__tests__/.eslintrc @@ -1,12 +1,18 @@ { "env": { - "jasmine": true + "jest": true + }, + "globals": { + "createSpyObj": true }, "rules": { "import/no-unresolved": 0, "import/no-extraneous-dependencies": 0, "react/no-multi-comp": 0, "react/prop-types": 0, - "react/no-find-dom-node": 0 + "react/no-find-dom-node": 0, + "react/no-array-index-key": 0, + "no-template-curly-in-string": 0, + "jsx-a11y/no-static-element-interactions": 0 } } diff --git a/src/__tests__/Alert.spec.js b/src/__tests__/Alert.spec.js index b4f04eaeb..f89563cf3 100644 --- a/src/__tests__/Alert.spec.js +++ b/src/__tests__/Alert.spec.js @@ -88,7 +88,7 @@ describe('Alert', () => { }); it('should be dismissible', () => { - const onClick = jasmine.createSpy('onClick'); + const onClick = jest.fn(); const alert = shallow(Yo!); alert.find('button').simulate('click'); diff --git a/src/__tests__/Button.spec.js b/src/__tests__/Button.spec.js index 46d53a0a3..3b54061b5 100644 --- a/src/__tests__/Button.spec.js +++ b/src/__tests__/Button.spec.js @@ -10,7 +10,7 @@ describe('Button', () => { }); it('should render custom element', () => { - const Link = (props) => {props.children}; + const Link = props => {props.children}; const wrapper = mount(); expect(wrapper.find('a').length).toBe(1); @@ -99,7 +99,7 @@ describe('Button', () => { describe('onClick', () => { it('calls props.onClick if it exists', () => { - const onClick = jasmine.createSpy('onClick'); + const onClick = jest.fn(); const wrapper = mount(); wrapper.find('button').simulate('click'); @@ -107,7 +107,7 @@ describe('Button', () => { }); it('is not called when disabled', () => { - const e = jasmine.createSpyObj('e', ['preventDefault']); + const e = createSpyObj('e', ['preventDefault']); const wrapper = mount(); wrapper.instance().onClick(e); diff --git a/src/__tests__/Carousel.spec.js b/src/__tests__/Carousel.spec.js index 05618009c..f78bfb640 100644 --- a/src/__tests__/Carousel.spec.js +++ b/src/__tests__/Carousel.spec.js @@ -8,17 +8,17 @@ import CarouselCaption from '../CarouselCaption'; describe('Carousel', () => { beforeEach(() => { - jasmine.clock().install(); + jest.useFakeTimers(); }); afterEach(() => { - jasmine.clock().uninstall(); + jest.clearAllTimers(); }); const items = [ - { src: '', altText: 'a', caption: 'caption 1' }, - { src: '', altText: 'b', caption: 'caption 2' }, - { src: '', altText: 'c', caption: 'caption 3' } + { src: '', altText: 'a', caption: 'caption 1' }, + { src: '', altText: 'b', caption: 'caption 2' }, + { src: '', altText: 'c', caption: 'caption 3' } ]; describe('captions', () => { @@ -55,10 +55,10 @@ describe('Carousel', () => { }); it('should call the callback after 500 when componentWillEnter is called', () => { - const callback = jasmine.createSpy('callback'); + const callback = jest.fn(); const wrapper = mount(, { context: { direction: 'right' } }); wrapper.instance().componentWillEnter(callback); - jasmine.clock().tick(500); + jest.runTimersToTime(500); expect(callback).toHaveBeenCalled(); }); @@ -78,10 +78,10 @@ describe('Carousel', () => { }); it('should call the callback after 500 when componentWillLeave is called', () => { - const callback = jasmine.createSpy('callback'); + const callback = jest.fn(); const wrapper = mount(, { context: { direction: 'right' } }); wrapper.instance().componentWillLeave(callback); - jasmine.clock().tick(500); + jest.runTimersToTime(500); expect(callback).toHaveBeenCalled(); }); @@ -112,7 +112,7 @@ describe('Carousel', () => { }); it('should call the click hanlder', () => { - const onClick = jasmine.createSpy('onClick'); + const onClick = jest.fn(); const wrapper = mount(); wrapper.find('li').first().simulate('click'); expect(onClick).toHaveBeenCalled(); @@ -126,7 +126,7 @@ describe('Carousel', () => { }); it('should call the onClickHandler', () => { - const onClick = jasmine.createSpy('onClick'); + const onClick = jest.fn(); const wrapper = mount(); wrapper.find('a').first().simulate('click'); expect(onClick).toHaveBeenCalled(); @@ -325,7 +325,7 @@ describe('Carousel', () => { describe('interval', () => { it('should not cycle when paused', () => { - const next = jasmine.createSpy('next'); + const next = jest.fn(); const slides = items.map((item, idx) => { return ( { {slides} ); - jasmine.clock().tick(1000); + jest.runTimersToTime(1000); expect(next).not.toHaveBeenCalled(); wrapper.unmount(); }); it('should accept a number', () => { - const next = jasmine.createSpy('next'); + const next = jest.fn(); const slides = items.map((item, idx) => { return ( { {slides} ); - jasmine.clock().tick(1000); + jest.runTimersToTime(1000); expect(next).toHaveBeenCalled(); wrapper.unmount(); }); it('should accept a boolean', () => { - const next = jasmine.createSpy('next'); + const next = jest.fn(); const slides = items.map((item, idx) => { return ( { {slides} ); - jasmine.clock().tick(5000); + jest.runTimersToTime(5000); expect(next).not.toHaveBeenCalled(); wrapper.unmount(); }); it('should default to 5000', () => { - const next = jasmine.createSpy('next'); + const next = jest.fn(); const slides = items.map((item, idx) => { return ( { {slides} ); - jasmine.clock().tick(5000); + jest.runTimersToTime(5000); expect(next).toHaveBeenCalled(); wrapper.unmount(); }); it('it should accept a string', () => { - const next = jasmine.createSpy('next'); + const next = jest.fn(); const slides = items.map((item, idx) => { return ( { {slides} ); - jasmine.clock().tick(1000); + jest.runTimersToTime(1000); expect(next).toHaveBeenCalled(); wrapper.unmount(); }); diff --git a/src/__tests__/Collapse.spec.js b/src/__tests__/Collapse.spec.js index 6d8996914..0003487d7 100644 --- a/src/__tests__/Collapse.spec.js +++ b/src/__tests__/Collapse.spec.js @@ -9,13 +9,13 @@ describe('Collapse', () => { beforeEach(() => { isOpen = false; toggle = () => { isOpen = !isOpen; }; - jasmine.clock().install(); + jest.useFakeTimers(); }); afterEach(() => { // fast forward time for collapse to fade out - jasmine.clock().tick(400); - jasmine.clock().uninstall(); + jest.runTimersToTime(400); + jest.clearAllTimers(); }); describe('delay', () => { @@ -23,7 +23,7 @@ describe('Collapse', () => { const wrapper = mount(); toggle(); wrapper.setProps({ isOpen: isOpen }); - jasmine.clock().tick(200); + jest.runTimersToTime(200); expect(wrapper.state('collapse')).toEqual('SHOWN'); wrapper.unmount(); }); @@ -32,12 +32,12 @@ describe('Collapse', () => { const wrapper = mount(); toggle(); wrapper.setProps({ isOpen: isOpen }); - jasmine.clock().tick(110); + jest.runTimersToTime(110); expect(wrapper.state('collapse')).toEqual('SHOWN'); toggle(); wrapper.setProps({ isOpen: isOpen }); - jasmine.clock().tick(120); + jest.runTimersToTime(120); expect(wrapper.state('collapse')).toEqual('HIDDEN'); }); @@ -45,12 +45,12 @@ describe('Collapse', () => { const wrapper = mount(); toggle(); wrapper.setProps({ isOpen: isOpen }); - jasmine.clock().tick(110); + jest.runTimersToTime(110); expect(wrapper.state('collapse')).toEqual('SHOWN'); toggle(); wrapper.setProps({ isOpen: isOpen }); - jasmine.clock().tick(350); + jest.runTimersToTime(350); expect(wrapper.state('collapse')).toEqual('HIDDEN'); }); }); @@ -94,7 +94,7 @@ describe('Collapse', () => { it('should render with class "collapse" with default collapse state', () => { const wrapper = mount(); wrapper.setState({ collapse: null }); - jasmine.clock().tick(360); + jest.runTimersToTime(360); wrapper.update(); expect(wrapper.find('.collapse').length).toBe(1); wrapper.unmount(); @@ -112,7 +112,7 @@ describe('Collapse', () => { const wrapper = mount(); toggle(); wrapper.setProps({ isOpen: isOpen }); - jasmine.clock().tick(350); + jest.runTimersToTime(350); expect(wrapper.state('collapse')).toEqual('SHOWN'); wrapper.unmount(); }); @@ -131,7 +131,7 @@ describe('Collapse', () => { const wrapper = mount(); toggle(); wrapper.setProps({ isOpen: isOpen }); - jasmine.clock().tick(360); + jest.runTimersToTime(360); expect(wrapper.state('collapse')).toEqual('HIDDEN'); wrapper.unmount(); }); @@ -149,31 +149,31 @@ describe('Collapse', () => { const wrapper = mount(); toggle(); wrapper.setProps({ isOpen: isOpen }); - jasmine.clock().tick(380); + jest.runTimersToTime(380); expect(wrapper.state('height')).toBe(null); wrapper.unmount(); }); it('should remove timeout tag after unmount', () => { - spyOn(Collapse.prototype, 'componentWillUnmount').and.callThrough(); + jest.spyOn(Collapse.prototype, 'componentWillUnmount'); const wrapper = mount(); wrapper.unmount(); expect(Collapse.prototype.componentWillUnmount).toHaveBeenCalled(); }); it('should call onOpened after opening', () => { - const onOpened = jasmine.createSpy('onOpenedSpy'); - const onClosed = jasmine.createSpy('onClosedSpy'); + const onOpened = jest.fn(); + const onClosed = jest.fn(); const wrapper = mount(); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(false); expect(onOpened).not.toHaveBeenCalled(); expect(onClosed).not.toHaveBeenCalled(); toggle(); wrapper.setProps({ isOpen }); - jasmine.clock().tick(380); + jest.runTimersToTime(380); expect(isOpen).toBe(true); expect(onOpened).toHaveBeenCalled(); expect(onClosed).not.toHaveBeenCalled(); @@ -182,19 +182,19 @@ describe('Collapse', () => { }); it('should call onClosed after closing', () => { - const onOpened = jasmine.createSpy('onOpenedSpy'); - const onClosed = jasmine.createSpy('onClosedSpy'); + const onOpened = jest.fn(); + const onClosed = jest.fn(); toggle(); const wrapper = mount(); - jasmine.clock().tick(380); + jest.runTimersToTime(380); expect(isOpen).toBe(true); expect(onOpened).not.toHaveBeenCalled(); expect(onClosed).not.toHaveBeenCalled(); toggle(); wrapper.setProps({ isOpen }); - jasmine.clock().tick(380); + jest.runTimersToTime(380); expect(isOpen).toBe(false); expect(onOpened).not.toHaveBeenCalled(); expect(onClosed).toHaveBeenCalled(); diff --git a/src/__tests__/Dropdown.spec.js b/src/__tests__/Dropdown.spec.js index fb9e0fd44..aaf76fe1f 100644 --- a/src/__tests__/Dropdown.spec.js +++ b/src/__tests__/Dropdown.spec.js @@ -1,6 +1,6 @@ import React from 'react'; import { mount } from 'enzyme'; -import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem, TetherContent } from '../'; +import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from '../'; describe('Dropdown', () => { @@ -16,6 +16,10 @@ describe('Dropdown', () => { }); afterEach(() => { + if (jest.isMockFunction(Dropdown.prototype.componentDidUpdate)) Dropdown.prototype.componentDidUpdate.mockRestore(); + if (jest.isMockFunction(Dropdown.prototype.handleProps)) Dropdown.prototype.handleProps.mockRestore(); + if (jest.isMockFunction(Dropdown.prototype.toggle)) Dropdown.prototype.toggle.mockRestore(); + if (jest.isMockFunction(Dropdown.prototype.handleDocumentClick)) Dropdown.prototype.handleDocumentClick.mockRestore(); document.body.removeChild(element); element = null; }); @@ -46,7 +50,7 @@ describe('Dropdown', () => { it('should not call props.toggle when disabled ', () => { isOpen = true; - let props = jasmine.createSpyObj('props', ['toggle']); + let props = createSpyObj('props', ['toggle']); const wrapper = mount( Toggle @@ -63,8 +67,8 @@ describe('Dropdown', () => { describe('handleProps', () => { it('should be called on componentDidUpdate when isOpen changed', () => { - spyOn(Dropdown.prototype, 'componentDidUpdate').and.callThrough(); - spyOn(Dropdown.prototype, 'handleProps').and.callThrough(); + jest.spyOn(Dropdown.prototype, 'componentDidUpdate'); + jest.spyOn(Dropdown.prototype, 'handleProps'); const wrapper = mount( Toggle @@ -76,21 +80,21 @@ describe('Dropdown', () => { const instance = wrapper.instance(); - expect(Dropdown.prototype.componentDidUpdate.calls.count()).toBe(0); - expect(Dropdown.prototype.handleProps.calls.count()).toBe(1); + expect(Dropdown.prototype.componentDidUpdate.mock.calls.length).toBe(0); + expect(Dropdown.prototype.handleProps.mock.calls.length).toBe(1); expect(instance.props.isOpen).toBe(false); isOpen = true; wrapper.setProps({ isOpen: isOpen }); - expect(Dropdown.prototype.componentDidUpdate.calls.count()).toBe(1); - expect(Dropdown.prototype.handleProps.calls.count()).toBe(2); + expect(Dropdown.prototype.componentDidUpdate.mock.calls.length).toBe(1); + expect(Dropdown.prototype.handleProps.mock.calls.length).toBe(2); expect(instance.props.isOpen).toBe(true); }); it('should not be called on componentDidUpdate when isOpen did not change', () => { - spyOn(Dropdown.prototype, 'componentDidUpdate').and.callThrough(); - spyOn(Dropdown.prototype, 'handleProps').and.callThrough(); + jest.spyOn(Dropdown.prototype, 'componentDidUpdate'); + jest.spyOn(Dropdown.prototype, 'handleProps'); const wrapper = mount( Toggle @@ -101,25 +105,25 @@ describe('Dropdown', () => { ); const instance = wrapper.instance(); - expect(Dropdown.prototype.componentDidUpdate.calls.count()).toBe(0); - expect(Dropdown.prototype.handleProps.calls.count()).toBe(1); + expect(Dropdown.prototype.componentDidUpdate.mock.calls.length).toBe(0); + expect(Dropdown.prototype.handleProps.mock.calls.length).toBe(1); expect(instance.props.isOpen).toBe(false); wrapper.setProps({ 'data-foo': 'bar' }); - expect(Dropdown.prototype.componentDidUpdate.calls.count()).toBe(1); - expect(Dropdown.prototype.handleProps.calls.count()).toBe(1); + expect(Dropdown.prototype.componentDidUpdate.mock.calls.length).toBe(1); + expect(Dropdown.prototype.handleProps.mock.calls.length).toBe(1); expect(instance.props.isOpen).toBe(false); }); }); describe('removeEvents', () => { it('should be called on componentWillUnmount', () => { - spyOn(Dropdown.prototype, 'componentWillUnmount').and.callThrough(); - spyOn(Dropdown.prototype, 'removeEvents').and.callThrough(); + jest.spyOn(Dropdown.prototype, 'componentWillUnmount'); + jest.spyOn(Dropdown.prototype, 'removeEvents'); isOpen = true; const wrapper = mount( - + Toggle Test @@ -127,55 +131,21 @@ describe('Dropdown', () => { ); - expect(Dropdown.prototype.componentWillUnmount.calls.count()).toBe(0); - expect(Dropdown.prototype.removeEvents.calls.count()).toBe(0); - - wrapper.unmount(); - - expect(Dropdown.prototype.componentWillUnmount.calls.count()).toBe(1); - expect(Dropdown.prototype.removeEvents.calls.count()).toBe(1); - }); - }); - - describe('getTetherConfig', () => { - it('should be called when tether is enabled', () => { - isOpen = true; - spyOn(Dropdown.prototype, 'getTetherConfig').and.callThrough(); - const wrapper = mount( - - Toggle - - Test - - - ); + expect(Dropdown.prototype.componentWillUnmount.mock.calls.length).toBe(0); + expect(Dropdown.prototype.removeEvents.mock.calls.length).toBe(0); - expect(Dropdown.prototype.getTetherConfig).toHaveBeenCalled(); wrapper.unmount(); - }); - it('should apply dropup tether values', () => { - isOpen = true; - const wrapper = mount( - - Toggle - - Test - - - ); - - expect(wrapper.find(TetherContent).props().tether.attachment).toBe('bottom right'); - expect(wrapper.find(TetherContent).props().tether.targetAttachment).toBe('top right'); - wrapper.unmount(); + expect(Dropdown.prototype.componentWillUnmount.mock.calls.length).toBe(1); + expect(Dropdown.prototype.removeEvents.mock.calls.length).toBe(1); }); }); describe('handleDocumentClick', () => { it('should call toggle on document click', () => { isOpen = true; - spyOn(Dropdown.prototype, 'handleDocumentClick').and.callThrough(); - spyOn(Dropdown.prototype, 'toggle').and.callThrough(); + jest.spyOn(Dropdown.prototype, 'handleDocumentClick'); + jest.spyOn(Dropdown.prototype, 'toggle'); mount( @@ -186,19 +156,19 @@ describe('Dropdown', () => { ); - expect(Dropdown.prototype.handleDocumentClick.calls.count()).toBe(0); - expect(Dropdown.prototype.toggle.calls.count()).toBe(0); + expect(Dropdown.prototype.handleDocumentClick.mock.calls.length).toBe(0); + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); document.body.click(); - expect(Dropdown.prototype.handleDocumentClick.calls.count()).toBe(1); - expect(Dropdown.prototype.toggle.calls.count()).toBe(1); + expect(Dropdown.prototype.handleDocumentClick.mock.calls.length).toBe(1); + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(1); }); it('should call toggle on container click', () => { isOpen = true; - spyOn(Dropdown.prototype, 'handleDocumentClick').and.callThrough(); - spyOn(Dropdown.prototype, 'toggle').and.callThrough(); + jest.spyOn(Dropdown.prototype, 'handleDocumentClick'); + jest.spyOn(Dropdown.prototype, 'toggle'); const wrapper = mount( @@ -208,21 +178,21 @@ describe('Dropdown', () => { , { attachTo: element }); - expect(Dropdown.prototype.handleDocumentClick.calls.count()).toBe(0); - expect(Dropdown.prototype.toggle.calls.count()).toBe(0); + expect(Dropdown.prototype.handleDocumentClick.mock.calls.length).toBe(0); + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); document.getElementById('test').click(); - expect(Dropdown.prototype.handleDocumentClick.calls.count()).toBe(1); - expect(Dropdown.prototype.toggle.calls.count()).toBe(1); + expect(Dropdown.prototype.handleDocumentClick.mock.calls.length).toBe(1); + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(1); wrapper.detach(); }); it('should not call toggle on inner container click', () => { isOpen = true; - spyOn(Dropdown.prototype, 'handleDocumentClick').and.callThrough(); - spyOn(Dropdown.prototype, 'toggle').and.callThrough(); + jest.spyOn(Dropdown.prototype, 'handleDocumentClick'); + jest.spyOn(Dropdown.prototype, 'toggle'); const wrapper = mount( @@ -233,13 +203,13 @@ describe('Dropdown', () => { , { attachTo: element }); - expect(Dropdown.prototype.handleDocumentClick.calls.count()).toBe(0); - expect(Dropdown.prototype.toggle.calls.count()).toBe(0); + expect(Dropdown.prototype.handleDocumentClick.mock.calls.length).toBe(0); + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); document.getElementById('divider').click(); - expect(Dropdown.prototype.handleDocumentClick.calls.count()).toBe(1); - expect(Dropdown.prototype.toggle.calls.count()).toBe(0); + expect(Dropdown.prototype.handleDocumentClick.mock.calls.length).toBe(1); + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); wrapper.detach(); }); diff --git a/src/__tests__/DropdownItem.spec.js b/src/__tests__/DropdownItem.spec.js index 829781021..ce419d2b9 100644 --- a/src/__tests__/DropdownItem.spec.js +++ b/src/__tests__/DropdownItem.spec.js @@ -55,7 +55,7 @@ describe('DropdownItem', () => { }); it('should render custom element', () => { - const Link = (props) => {props.children}; + const Link = props => {props.children}; const wrapper = mount(Home); expect(wrapper.find('a').length).toBe(1); @@ -101,7 +101,7 @@ describe('DropdownItem', () => { describe('onClick', () => { it('should not be called when disabled', () => { - const e = { preventDefault: jasmine.createSpy('preventDefault') }; + const e = { preventDefault: jest.fn() }; const wrapper = mount(Item); const instance = wrapper.instance(); @@ -110,7 +110,7 @@ describe('DropdownItem', () => { }); it('should not be called when divider is set', () => { - const e = { preventDefault: jasmine.createSpy('preventDefault') }; + const e = { preventDefault: jest.fn() }; const wrapper = mount(); const instance = wrapper.instance(); @@ -119,7 +119,7 @@ describe('DropdownItem', () => { }); it('should not be called when header item', () => { - const e = { preventDefault: jasmine.createSpy('preventDefault') }; + const e = { preventDefault: jest.fn() }; const wrapper = mount(Header); const instance = wrapper.instance(); @@ -128,8 +128,8 @@ describe('DropdownItem', () => { }); it('should be called when not disabled, heading, or divider', () => { - const e = { preventDefault: jasmine.createSpy('preventDefault') }; - const onClick = jasmine.createSpy('onClick'); + const e = { preventDefault: jest.fn() }; + const onClick = jest.fn(); const wrapper = mount( onClick()}>Click me, { @@ -145,7 +145,7 @@ describe('DropdownItem', () => { }); it('should call toggle', () => { - toggle = jasmine.createSpy('toggle'); + toggle = jest.fn(); const wrapper = mount( Click me, { diff --git a/src/__tests__/DropdownMenu.spec.js b/src/__tests__/DropdownMenu.spec.js index 4496dfc07..4471e2874 100644 --- a/src/__tests__/DropdownMenu.spec.js +++ b/src/__tests__/DropdownMenu.spec.js @@ -1,12 +1,18 @@ import React from 'react'; -import { shallow, mount } from 'enzyme'; +import { mount } from 'enzyme'; import { DropdownMenu } from '../'; describe('DropdownMenu', () => { let isOpen; + let dropup; + let popperManager; beforeEach(() => { isOpen = false; + dropup = false; + popperManager = { + getTargetNode: () => ({}), + }; }); it('should render children', () => { @@ -16,9 +22,8 @@ describe('DropdownMenu', () => {

    Content

    , { - context: { - isOpen: isOpen - } + context: { isOpen, dropup, popperManager }, + childContextTypes: { popperManager } } ); @@ -33,9 +38,8 @@ describe('DropdownMenu', () => {

    Content

    , { - context: { - isOpen: isOpen - } + context: { isOpen, dropup, popperManager }, + childContextTypes: { popperManager } } ); @@ -50,9 +54,8 @@ describe('DropdownMenu', () => {

    Content

    , { - context: { - isOpen: isOpen - } + context: { isOpen, dropup, popperManager }, + childContextTypes: { popperManager } } ); @@ -65,9 +68,8 @@ describe('DropdownMenu', () => { const wrapper = mount( Ello world, { - context: { - isOpen: isOpen - } + context: { isOpen, dropup, popperManager }, + childContextTypes: { popperManager } } ); @@ -78,9 +80,8 @@ describe('DropdownMenu', () => { const wrapper = mount( Ello world, { - context: { - isOpen: isOpen - } + context: { isOpen, dropup, popperManager }, + childContextTypes: { popperManager } } ); @@ -88,15 +89,14 @@ describe('DropdownMenu', () => { }); it('should render custom tag', () => { - const wrapper = shallow(Yo!, + const wrapper = mount(Yo!, { - context: { - isOpen: isOpen - } + context: { isOpen, dropup, popperManager }, + childContextTypes: { popperManager } }); expect(wrapper.text()).toBe('Yo!'); expect(wrapper.hasClass('dropdown-menu')).toBe(true); - expect(wrapper.type()).toBe('main'); + expect(wrapper.getDOMNode().tagName.toLowerCase()).toBe('main'); }); }); diff --git a/src/__tests__/DropdownToggle.spec.js b/src/__tests__/DropdownToggle.spec.js index af4e6feb3..f9944bff4 100644 --- a/src/__tests__/DropdownToggle.spec.js +++ b/src/__tests__/DropdownToggle.spec.js @@ -4,21 +4,25 @@ import { DropdownToggle } from '../'; describe('DropdownToggle', () => { let isOpen; + let popperManager; let toggle; beforeEach(() => { isOpen = false; - toggle = () => { isOpen = !isOpen; }; + popperManager = { + setTargetNode: () => {} + }; + toggle = () => { + isOpen = !isOpen; + }; }); it('should wrap text', () => { const wrapper = mount( Ello world, { - context: { - isOpen: isOpen, - toggle: toggle - } + context: { isOpen, toggle, popperManager }, + childContextTypes: { popperManager } } ); @@ -30,10 +34,8 @@ describe('DropdownToggle', () => { const wrapper = mount( , { - context: { - isOpen: isOpen, - toggle: toggle - } + context: { isOpen, toggle, popperManager }, + childContextTypes: { popperManager } } ); @@ -45,10 +47,8 @@ describe('DropdownToggle', () => { const wrapper = mount( , { - context: { - isOpen: isOpen, - toggle: toggle - } + context: { isOpen, toggle, popperManager }, + childContextTypes: { popperManager } } ); @@ -60,10 +60,8 @@ describe('DropdownToggle', () => { const wrapper = mount( Click Me, { - context: { - isOpen: isOpen, - toggle: toggle - } + context: { isOpen, toggle, popperManager }, + childContextTypes: { popperManager } } ); @@ -75,10 +73,8 @@ describe('DropdownToggle', () => { const wrapper = mount( Ello world, { - context: { - isOpen: isOpen, - toggle: toggle - } + context: { isOpen, toggle, popperManager }, + childContextTypes: { popperManager } } ); @@ -90,10 +86,8 @@ describe('DropdownToggle', () => { const wrapper = mount( , { - context: { - isOpen: isOpen, - toggle: toggle - } + context: { isOpen, toggle, popperManager }, + childContextTypes: { popperManager } } ); @@ -105,10 +99,8 @@ describe('DropdownToggle', () => { const wrapper = mount( , { - context: { - isOpen: isOpen, - toggle: toggle - } + context: { isOpen, toggle, popperManager }, + childContextTypes: { popperManager } } ); @@ -120,10 +112,8 @@ describe('DropdownToggle', () => { const wrapper = mount( , { - context: { - isOpen: isOpen, - toggle: toggle - } + context: { isOpen, toggle, popperManager }, + childContextTypes: { popperManager } } ); @@ -135,10 +125,8 @@ describe('DropdownToggle', () => { const wrapper = mount( , { - context: { - isOpen: isOpen, - toggle: toggle - } + context: { isOpen, toggle, popperManager }, + childContextTypes: { popperManager } } ); @@ -151,10 +139,8 @@ describe('DropdownToggle', () => { const wrapper = mount( Ello world, { - context: { - isOpen: isOpen, - toggle: toggle - } + context: { isOpen, toggle, popperManager }, + childContextTypes: { popperManager } } ); @@ -163,14 +149,12 @@ describe('DropdownToggle', () => { describe('onClick', () => { it('should call props.onClick if it exists', () => { - const onClick = jasmine.createSpy('onClick'); + const onClick = jest.fn(); const wrapper = mount( onClick()}>Ello world, { - context: { - isOpen: isOpen, - toggle: toggle - } + context: { isOpen, toggle, popperManager }, + childContextTypes: { popperManager } } ); const instance = wrapper.instance(); @@ -180,33 +164,32 @@ describe('DropdownToggle', () => { }); it('should call context.toggle when present ', () => { - toggle = jasmine.createSpy('toggle'); + toggle = jest.fn(); const wrapper = mount( Ello world, { - context: { - isOpen: isOpen, - toggle: toggle - } + context: { isOpen, toggle, popperManager }, + childContextTypes: { popperManager } } ); const instance = wrapper.instance(); - instance.onClick({ preventDefault: () => { } }); + instance.onClick({ + preventDefault: () => { + } + }); expect(toggle).toHaveBeenCalled(); }); }); describe('disabled', () => { it('should preventDefault when disabled', () => { - const e = { preventDefault: jasmine.createSpy('preventDefault') }; + const e = { preventDefault: jest.fn() }; const wrapper = mount( Ello world, { - context: { - isOpen: isOpen, - toggle: toggle - } + context: { isOpen, toggle, popperManager }, + childContextTypes: { popperManager } } ); const instance = wrapper.instance(); @@ -221,10 +204,8 @@ describe('DropdownToggle', () => { const wrapper = mount( Ello world, { - context: { - isOpen: isOpen, - toggle: toggle - } + context: { isOpen, toggle, popperManager }, + childContextTypes: { popperManager } } ); @@ -236,10 +217,8 @@ describe('DropdownToggle', () => { const wrapper = mount( Ello world, { - context: { - isOpen: isOpen, - toggle: toggle - } + context: { isOpen, toggle, popperManager }, + childContextTypes: { popperManager } } ); @@ -247,14 +226,12 @@ describe('DropdownToggle', () => { }); it('should preventDefault', () => { - const e = { preventDefault: jasmine.createSpy('preventDefault') }; + const e = { preventDefault: jest.fn() }; const wrapper = mount( Ello world, { - context: { - isOpen: isOpen, - toggle: toggle - } + context: { isOpen, toggle, popperManager }, + childContextTypes: { popperManager } } ); const instance = wrapper.instance(); diff --git a/src/__tests__/Fade.spec.js b/src/__tests__/Fade.spec.js index b2f72ca9a..57665bdcf 100644 --- a/src/__tests__/Fade.spec.js +++ b/src/__tests__/Fade.spec.js @@ -32,11 +32,11 @@ class Helper extends React.Component { describe('Fade', () => { beforeEach(() => { - jasmine.clock().install(); + jest.useFakeTimers(); }); afterEach(() => { - jasmine.clock().uninstall(); + jest.clearAllTimers(); }); it('should transition classes from "fade" to "fade show" on appear', () => { @@ -51,7 +51,7 @@ describe('Fade', () => { expect(wrapper.find('div.fade').length).toBe(2); expect(wrapper.find('div.fade.show').length).toBe(1); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(wrapper.find('div.fade.show').length).toBe(2); @@ -60,8 +60,8 @@ describe('Fade', () => { }); it('should transition classes from "fade" to "fade show" on enter', () => { - const onEnter = jasmine.createSpy('spy'); - const onLeave = jasmine.createSpy('spy'); + const onEnter = jest.fn(); + const onLeave = jest.fn(); let isOpen = false; const wrapper = mount( @@ -79,7 +79,7 @@ describe('Fade', () => { expect(wrapper.find('div.fade.show').length).toBe(1); expect(onEnter).not.toHaveBeenCalled(); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(onEnter).toHaveBeenCalled(); expect(onLeave).not.toHaveBeenCalled(); diff --git a/src/__tests__/Label.spec.js b/src/__tests__/Label.spec.js index 95d837bc4..844b7c2ea 100644 --- a/src/__tests__/Label.spec.js +++ b/src/__tests__/Label.spec.js @@ -63,12 +63,48 @@ describe('Label', () => { expect(wrapper.hasClass('col-sm-6')).toBe(true); }); + it('should pass col size specific classes as Strings (auto)', () => { + const wrapper = shallow(); + + expect(wrapper.hasClass('col-sm-auto')).toBe(true); + }); + + it('should pass col size specific classes as Strings ("")', () => { + const wrapper = shallow(); + + expect(wrapper.hasClass('col-sm')).toBe(true); + }); + + it('should pass col size specific classes as Strings (true)', () => { + const wrapper = shallow(); + + expect(wrapper.hasClass('col-sm')).toBe(true); + }); + it('should pass col size specific classes as Strings (xs)', () => { const wrapper = shallow(); expect(wrapper.hasClass('col-6')).toBe(true); }); + it('should pass col size specific classes as Strings (xs="")', () => { + const wrapper = shallow(); + + expect(wrapper.hasClass('col')).toBe(true); + }); + + it('should pass col size specific classes as Strings (xs (true))', () => { + const wrapper = shallow(); + + expect(wrapper.hasClass('col')).toBe(true); + }); + + it('should pass col size specific classes as Strings (xs="auto")', () => { + const wrapper = shallow(); + + expect(wrapper.hasClass('col-auto')).toBe(true); + }); + it('should render with "sr-only" class when hidden prop is truthy', () => { const wrapper = shallow(); diff --git a/src/__tests__/ListGroupItem.spec.js b/src/__tests__/ListGroupItem.spec.js index 511de2806..42a20492c 100644 --- a/src/__tests__/ListGroupItem.spec.js +++ b/src/__tests__/ListGroupItem.spec.js @@ -34,7 +34,7 @@ describe('ListGroupItem', () => { }); it('should prevent click event when disabled is passed', () => { - const onDisableClick = jasmine.createSpy('click'); + const onDisableClick = jest.fn(); const wrapper = mount(Yo!); wrapper.find('li').simulate('click'); expect(onDisableClick).not.toHaveBeenCalled(); diff --git a/src/__tests__/Modal.spec.js b/src/__tests__/Modal.spec.js index ca7c01cb2..eeb977782 100644 --- a/src/__tests__/Modal.spec.js +++ b/src/__tests__/Modal.spec.js @@ -16,13 +16,13 @@ describe('Modal', () => { isOpenNested = false; toggleNested = () => { isOpenNested = !isOpenNested; }; - jasmine.clock().install(); + jest.useFakeTimers(); }); afterEach(() => { // fast forward time for modal to fade out - jasmine.clock().tick(300); - jasmine.clock().uninstall(); + jest.runTimersToTime(300); + jest.clearAllTimers(); }); it('should render with the class "modal-dialog"', () => { @@ -33,7 +33,7 @@ describe('Modal', () => { ); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(wrapper.children().length).toBe(0); expect(document.getElementsByClassName('modal-dialog').length).toBe(1); wrapper.unmount(); @@ -47,7 +47,7 @@ describe('Modal', () => { ); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(wrapper.children().length).toBe(0); expect(document.getElementsByClassName('modal-backdrop').length).toBe(1); wrapper.unmount(); @@ -61,7 +61,7 @@ describe('Modal', () => { ); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(wrapper.children().length).toBe(0); expect(document.getElementsByClassName('modal-backdrop').length).toBe(1); wrapper.unmount(); @@ -75,7 +75,7 @@ describe('Modal', () => { ); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(wrapper.children().length).toBe(0); expect(document.getElementsByClassName('modal-dialog').length).toBe(1); expect(document.getElementsByClassName('modal-backdrop').length).toBe(0); @@ -90,7 +90,7 @@ describe('Modal', () => { ); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(wrapper.children().length).toBe(0); expect(document.getElementsByClassName('modal-dialog').length).toBe(1); expect(document.getElementsByClassName('my-custom-modal').length).toBe(1); @@ -105,7 +105,7 @@ describe('Modal', () => { ); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(wrapper.children().length).toBe(0); expect(document.getElementsByClassName('modal-dialog').length).toBe(1); expect(document.getElementsByClassName('modal-dialog')[0].style.maxWidth).toBe('95%'); @@ -121,7 +121,7 @@ describe('Modal', () => { ); // Modal should appear instantaneously - jasmine.clock().tick(1); + jest.runTimersToTime(1); expect(wrapper.children().length).toBe(0); const matchedModals = document.getElementsByClassName('fadeless-modal'); @@ -142,7 +142,7 @@ describe('Modal', () => { ); - jasmine.clock().tick(20); + jest.runTimersToTime(20); expect(wrapper.children().length).toBe(0); const matchedModals = document.getElementsByClassName('custom-timeout-modal'); @@ -160,7 +160,7 @@ describe('Modal', () => { ); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(wrapper.children().length).toBe(0); expect(document.querySelectorAll('.modal.my-custom-modal').length).toBe(1); wrapper.unmount(); @@ -174,7 +174,7 @@ describe('Modal', () => { ); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(wrapper.children().length).toBe(0); expect(document.getElementsByClassName('my-custom-modal').length).toBe(1); wrapper.unmount(); @@ -188,7 +188,7 @@ describe('Modal', () => { ); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(wrapper.children().length).toBe(0); expect(document.querySelectorAll('.modal-content.my-custom-modal').length).toBe(1); wrapper.unmount(); @@ -202,7 +202,7 @@ describe('Modal', () => { ); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(wrapper.children().length).toBe(0); expect(document.querySelectorAll('.modal-backdrop.my-custom-modal').length).toBe(1); wrapper.unmount(); @@ -216,7 +216,7 @@ describe('Modal', () => { ); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(wrapper.children().length).toBe(0); expect(document.getElementsByClassName('modal-dialog').length).toBe(1); expect(document.getElementsByClassName('modal-crazy').length).toBe(1); @@ -232,7 +232,7 @@ describe('Modal', () => { ); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(wrapper.children().length).toBe(0); expect(document.getElementsByClassName('modal').length).toBe(1); expect(document.getElementsByClassName('modal-backdrop').length).toBe(1); @@ -247,7 +247,7 @@ describe('Modal', () => { ); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(wrapper.children().length).toBe(0); expect(document.getElementsByClassName('modal')[0].getAttribute('role')).toBe('dialog'); wrapper.unmount(); @@ -261,7 +261,7 @@ describe('Modal', () => { ); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(wrapper.children().length).toBe(0); expect(document.getElementsByClassName('modal')[0].getAttribute('role')).toBe('alert'); wrapper.unmount(); @@ -275,7 +275,7 @@ describe('Modal', () => { ); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(wrapper.children().length).toBe(0); expect(document.getElementsByClassName('modal')[0].getAttribute('aria-labelledby')).toBe('myModalTitle'); wrapper.unmount(); @@ -288,7 +288,7 @@ describe('Modal', () => { ); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(wrapper.children().length).toBe(0); expect(document.getElementsByClassName('modal').length).toBe(0); expect(document.getElementsByClassName('modal-backdrop').length).toBe(0); @@ -302,7 +302,7 @@ describe('Modal', () => { ); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(false); expect(document.getElementsByClassName('modal').length).toBe(0); expect(document.getElementsByClassName('modal-backdrop').length).toBe(0); @@ -312,7 +312,7 @@ describe('Modal', () => { isOpen: isOpen }); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(true); expect(document.getElementsByClassName('modal').length).toBe(1); expect(document.getElementsByClassName('modal-backdrop').length).toBe(1); @@ -320,17 +320,17 @@ describe('Modal', () => { }); it('should call onClosed & onOpened', () => { - spyOn(Modal.prototype, 'onOpened').and.callThrough(); - spyOn(Modal.prototype, 'onClosed').and.callThrough(); - const onOpened = jasmine.createSpy('spy'); - const onClosed = jasmine.createSpy('spy'); + jest.spyOn(Modal.prototype, 'onOpened'); + jest.spyOn(Modal.prototype, 'onClosed'); + const onOpened = jest.fn(); + const onClosed = jest.fn(); const wrapper = mount( Yo! ); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(false); expect(onOpened).not.toHaveBeenCalled(); expect(Modal.prototype.onOpened).not.toHaveBeenCalled(); @@ -341,7 +341,7 @@ describe('Modal', () => { wrapper.setProps({ isOpen: isOpen }); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(true); expect(onOpened).toHaveBeenCalled(); @@ -353,7 +353,7 @@ describe('Modal', () => { wrapper.setProps({ isOpen: isOpen }); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(false); expect(onClosed).toHaveBeenCalled(); @@ -363,58 +363,51 @@ describe('Modal', () => { }); it('should call onClosed & onOpened when fade={false}', () => { - spyOn(Modal.prototype, 'onOpened').and.callThrough(); - spyOn(Modal.prototype, 'onClosed').and.callThrough(); - const onOpened = jasmine.createSpy('spy'); - const onClosed = jasmine.createSpy('spy'); + const onOpened = jest.fn(); + const onClosed = jest.fn(); const wrapper = mount( Yo! ); - jasmine.clock().tick(1); + jest.runTimersToTime(1); expect(isOpen).toBe(false); expect(onOpened).not.toHaveBeenCalled(); - expect(Modal.prototype.onOpened).not.toHaveBeenCalled(); expect(onClosed).not.toHaveBeenCalled(); - expect(Modal.prototype.onClosed).not.toHaveBeenCalled(); toggle(); wrapper.setProps({ isOpen: isOpen }); - jasmine.clock().tick(1); + jest.runTimersToTime(1); expect(isOpen).toBe(true); expect(onOpened).toHaveBeenCalled(); - expect(Modal.prototype.onOpened).toHaveBeenCalled(); expect(onClosed).not.toHaveBeenCalled(); - expect(Modal.prototype.onClosed).not.toHaveBeenCalled(); toggle(); wrapper.setProps({ isOpen: isOpen }); - jasmine.clock().tick(1); + jest.runTimersToTime(1); expect(isOpen).toBe(false); expect(onClosed).toHaveBeenCalled(); - expect(Modal.prototype.onClosed).toHaveBeenCalled(); wrapper.unmount(); }); it('should not call togglePortal when isOpen does not change', () => { - spyOn(Modal.prototype, 'togglePortal').and.callThrough(); - spyOn(Modal.prototype, 'componentDidUpdate').and.callThrough(); + jest.spyOn(Modal.prototype, 'togglePortal'); + jest.spyOn(Modal.prototype, 'componentDidUpdate'); const wrapper = mount( Yo! ); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(false); expect(Modal.prototype.togglePortal).not.toHaveBeenCalled(); expect(Modal.prototype.componentDidUpdate).not.toHaveBeenCalled(); @@ -422,7 +415,7 @@ describe('Modal', () => { wrapper.setProps({ isOpen: isOpen }); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(false); expect(Modal.prototype.togglePortal).not.toHaveBeenCalled(); @@ -433,27 +426,27 @@ describe('Modal', () => { it('should renderIntoSubtree when props updated', () => { isOpen = true; - spyOn(Modal.prototype, 'togglePortal').and.callThrough(); - spyOn(Modal.prototype, 'renderIntoSubtree').and.callThrough(); + jest.spyOn(Modal.prototype, 'togglePortal'); + jest.spyOn(Modal.prototype, 'renderIntoSubtree'); const wrapper = mount( Yo! ); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(true); - expect(Modal.prototype.togglePortal.calls.count()).toEqual(1); - expect(Modal.prototype.renderIntoSubtree.calls.count()).toEqual(1); + expect(Modal.prototype.togglePortal.mock.calls.length).toEqual(1); + expect(Modal.prototype.renderIntoSubtree.mock.calls.length).toEqual(1); wrapper.setProps({ isOpen: isOpen }); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(true); - expect(Modal.prototype.togglePortal.calls.count()).toEqual(1); - expect(Modal.prototype.renderIntoSubtree.calls.count()).toEqual(2); + expect(Modal.prototype.togglePortal.mock.calls.length).toEqual(1); + expect(Modal.prototype.renderIntoSubtree.mock.calls.length).toEqual(2); wrapper.unmount(); }); @@ -467,26 +460,26 @@ describe('Modal', () => { ); const instance = wrapper.instance(); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(true); expect(document.getElementsByClassName('modal').length).toBe(1); instance.handleEscape({ keyCode: 13 }); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(true); expect(document.getElementsByClassName('modal').length).toBe(1); instance.handleEscape({ keyCode: 27 }); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(false); wrapper.setProps({ isOpen: isOpen }); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(document.getElementsByClassName('modal').length).toBe(0); @@ -502,26 +495,26 @@ describe('Modal', () => { ); const instance = wrapper.instance(); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(true); expect(document.getElementsByClassName('modal').length).toBe(1); instance.handleEscape({ keyCode: 13 }); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(true); expect(document.getElementsByClassName('modal').length).toBe(1); instance.handleEscape({ keyCode: 27 }); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(true); wrapper.setProps({ isOpen: isOpen }); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(document.getElementsByClassName('modal').length).toBe(1); @@ -536,18 +529,18 @@ describe('Modal', () => { ); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(true); expect(document.getElementsByClassName('modal').length).toBe(1); // document.getElementById('clicker').click(); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(true); document.getElementsByClassName('modal')[0].click(); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(false); @@ -562,18 +555,18 @@ describe('Modal', () => { ); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(true); expect(document.getElementsByClassName('modal').length).toBe(1); document.getElementById('clicker').click(); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(true); document.getElementsByClassName('modal-backdrop')[0].click(); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(true); @@ -589,7 +582,7 @@ describe('Modal', () => { ); const instance = wrapper.instance(); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(instance._element).toBeTruthy(); instance.destroy(); @@ -613,7 +606,7 @@ describe('Modal', () => { ); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(wrapper.children().length).toBe(0); expect(document.getElementsByClassName('modal-dialog').length).toBe(2); expect(document.body.className).toBe('modal-open modal-open'); @@ -634,7 +627,7 @@ describe('Modal', () => { ); // assert that the modal is closed and the body class is what was set initially - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(false); expect(document.body.className).toBe('my-modal-opened'); @@ -644,7 +637,7 @@ describe('Modal', () => { }); // assert that the modal is open and the body class is what was set initially + modal-open - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(true); expect(document.body.className).toBe('my-modal-opened modal-open'); @@ -659,7 +652,7 @@ describe('Modal', () => { }); // assert that the modal is closed and the body class is what was set initially - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(false); expect(document.body.className).toBe('my-modal-opened modal-opened'); @@ -667,8 +660,8 @@ describe('Modal', () => { }); it('should call onEnter & onExit props if provided', () => { - const onEnter = jasmine.createSpy('spy'); - const onExit = jasmine.createSpy('spy'); + const onEnter = jest.fn(); + const onExit = jest.fn(); const wrapper = mount( Yo! @@ -679,27 +672,27 @@ describe('Modal', () => { expect(onEnter).toHaveBeenCalled(); expect(onExit).not.toHaveBeenCalled(); - onEnter.calls.reset(); - onExit.calls.reset(); + onEnter.mockReset(); + onExit.mockReset(); toggle(); wrapper.setProps({ isOpen: isOpen }); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(isOpen).toBe(true); expect(onEnter).not.toHaveBeenCalled(); expect(onExit).not.toHaveBeenCalled(); - onEnter.calls.reset(); - onExit.calls.reset(); + onEnter.mockReset(); + onExit.mockReset(); toggle(); wrapper.setProps({ isOpen: isOpen }); - jasmine.clock().tick(300); + jest.runTimersToTime(300); wrapper.unmount(); expect(onEnter).not.toHaveBeenCalled(); diff --git a/src/__tests__/NavLink.spec.js b/src/__tests__/NavLink.spec.js index b43111913..bdf42955e 100644 --- a/src/__tests__/NavLink.spec.js +++ b/src/__tests__/NavLink.spec.js @@ -41,8 +41,8 @@ describe('NavLink', () => { }); it('handles onClick prop', () => { - const onClick = jasmine.createSpy('onClick'); - const e = jasmine.createSpyObj('e', ['preventDefault']); + const onClick = jest.fn(); + const e = createSpyObj('e', ['preventDefault']); const wrapper = shallow( ); @@ -53,7 +53,7 @@ describe('NavLink', () => { }); it('handles onClick events', () => { - const e = jasmine.createSpyObj('e', ['preventDefault']); + const e = createSpyObj('e', ['preventDefault']); const wrapper = shallow( ); @@ -63,7 +63,7 @@ describe('NavLink', () => { }); it('prevents link clicks via onClick for dropdown nav-items', () => { - const e = jasmine.createSpyObj('e', ['preventDefault']); + const e = createSpyObj('e', ['preventDefault']); const wrapper = shallow( ); @@ -73,8 +73,8 @@ describe('NavLink', () => { }); it('is not called when disabled', () => { - const onClick = jasmine.createSpy('onClick'); - const e = jasmine.createSpyObj('e', ['preventDefault']); + const onClick = jest.fn(); + const e = createSpyObj('e', ['preventDefault']); const wrapper = shallow( ); diff --git a/src/__tests__/Popover.spec.js b/src/__tests__/Popover.spec.js index 8094a1575..8a6cfb67a 100644 --- a/src/__tests__/Popover.spec.js +++ b/src/__tests__/Popover.spec.js @@ -1,65 +1,72 @@ import React from 'react'; import { mount } from 'enzyme'; -import { Popover, PopoverHeader, PopoverBody, TetherContent } from '../'; +import { Popover, PopoverHeader, PopoverBody } from '../'; describe('Popover', () => { let element; + let container; + let outerTarget; + let innerTarget; let isOpen; let toggle; let placement; beforeEach(() => { element = document.createElement('div'); + container = document.createElement('div'); + element.innerHTML = '

    This is the popover target.

    '; + container.setAttribute('id', 'container'); + outerTarget = document.getElementById('outerTarget'); + innerTarget = document.getElementById('innerTarget'); + element.appendChild(container); + document.body.appendChild(element); isOpen = false; toggle = () => { isOpen = !isOpen; }; placement = 'top'; - element.setAttribute('id', 'popover-target'); - - document.body.appendChild(element); + jest.useFakeTimers(); }); afterEach(() => { + jest.clearAllTimers(); document.body.removeChild(element); element = null; }); - it('should render inner TetherContent when isOpen', () => { + it('should render inner popper when isOpen', () => { isOpen = true; const wrapper = mount( - + Title Content ); - expect(wrapper.find(TetherContent).length).toBe(1); - expect(document.getElementsByClassName('popover').length).toBe(1); - expect(document.getElementsByClassName('popover-inner').length).toBe(1); - expect(document.getElementsByClassName('popover-header').length).toBe(1); - expect(document.getElementsByClassName('popover-body').length).toBe(1); + expect(wrapper.find('.popover').length).toBe(1); + expect(wrapper.find('.popover-inner').length).toBe(1); + expect(wrapper.find('.popover-header').length).toBe(1); + expect(wrapper.find('.popover-body').length).toBe(1); wrapper.unmount(); }); - it('should not render inner TetherContent when not isOpen', () => { + it('should not render inner popper when not isOpen', () => { const wrapper = mount( - + Title Content ); - expect(wrapper.find(TetherContent).length).toBe(0); - expect(document.getElementsByClassName('popover').length).toBe(0); - expect(document.getElementsByClassName('popover-inner').length).toBe(0); - expect(document.getElementsByClassName('popover-header').length).toBe(0); - expect(document.getElementsByClassName('popover-body').length).toBe(0); + expect(wrapper.find('.popover').length).toBe(0); + expect(wrapper.find('.popover-inner').length).toBe(0); + expect(wrapper.find('.popover-header').length).toBe(0); + expect(wrapper.find('.popover-body').length).toBe(0); wrapper.unmount(); }); it('should be able to show the popover', () => { const wrapper = mount( - + Title Content @@ -67,12 +74,11 @@ describe('Popover', () => { expect(isOpen).toBe(false); - expect(wrapper.find(TetherContent).length).toBe(0); - expect(document.body.querySelectorAll('.popover.show').length).toBe(0); - expect(document.getElementsByClassName('popover').length).toBe(0); - expect(document.getElementsByClassName('popover-inner').length).toBe(0); - expect(document.getElementsByClassName('popover-header').length).toBe(0); - expect(document.getElementsByClassName('popover-body').length).toBe(0); + expect(wrapper.find('.popover.show').length).toBe(0); + expect(wrapper.find('.popover').length).toBe(0); + expect(wrapper.find('.popover-inner').length).toBe(0); + expect(wrapper.find('.popover-header').length).toBe(0); + expect(wrapper.find('.popover-body').length).toBe(0); toggle(); wrapper.setProps({ @@ -80,12 +86,11 @@ describe('Popover', () => { }); expect(isOpen).toBe(true); - expect(wrapper.find(TetherContent).length).toBe(1); - expect(document.body.querySelectorAll('.popover.show').length).toBe(1); - expect(document.getElementsByClassName('popover').length).toBe(1); - expect(document.getElementsByClassName('popover-inner').length).toBe(1); - expect(document.getElementsByClassName('popover-header').length).toBe(1); - expect(document.getElementsByClassName('popover-body').length).toBe(1); + expect(wrapper.find('.popover.show').length).toBe(1); + expect(wrapper.find('.popover').length).toBe(1); + expect(wrapper.find('.popover-inner').length).toBe(1); + expect(wrapper.find('.popover-header').length).toBe(1); + expect(wrapper.find('.popover-body').length).toBe(1); wrapper.unmount(); }); @@ -93,18 +98,17 @@ describe('Popover', () => { it('should be able to hide the popover', () => { isOpen = true; const wrapper = mount( - + Title Content ); expect(isOpen).toBe(true); - expect(wrapper.find(TetherContent).length).toBe(1); - expect(document.getElementsByClassName('popover').length).toBe(1); - expect(document.getElementsByClassName('popover-inner').length).toBe(1); - expect(document.getElementsByClassName('popover-header').length).toBe(1); - expect(document.getElementsByClassName('popover-body').length).toBe(1); + expect(wrapper.find('.popover').length).toBe(1); + expect(wrapper.find('.popover-inner').length).toBe(1); + expect(wrapper.find('.popover-header').length).toBe(1); + expect(wrapper.find('.popover-body').length).toBe(1); toggle(); wrapper.setProps({ @@ -112,18 +116,17 @@ describe('Popover', () => { }); expect(isOpen).toBe(false); - expect(wrapper.find(TetherContent).length).toBe(0); - expect(document.getElementsByClassName('popover').length).toBe(0); - expect(document.getElementsByClassName('popover-inner').length).toBe(0); - expect(document.getElementsByClassName('popover-header').length).toBe(0); - expect(document.getElementsByClassName('popover-body').length).toBe(0); + expect(wrapper.find('.popover').length).toBe(0); + expect(wrapper.find('.popover-inner').length).toBe(0); + expect(wrapper.find('.popover-header').length).toBe(0); + expect(wrapper.find('.popover-body').length).toBe(0); wrapper.unmount(); }); it('default toggle prop does nothing', () => { const wrapper = mount( - + Title Content @@ -139,14 +142,277 @@ describe('Popover', () => { it('should allow custom classes to be added to the popover-inner', () => { const wrapper = mount( - + Title Content ); - expect(document.getElementsByClassName('popover-inner')[0].className.indexOf('popover-special') > -1).toBe(true); + expect(wrapper.find('.popover-inner').hasClass('popover-special')).toBe(true); wrapper.unmount(); }); + + it('should not handle outside of target clicks when isOpen is false', () => { + const wrapper = mount( + + Popover Content + , + { attachTo: container } + ); + const instance = wrapper.instance(); + + expect(isOpen).toBe(false); + instance.handleDocumentClick({ target: outerTarget }); + jest.runTimersToTime(0); // toggle is still async + expect(isOpen).toBe(false); + + wrapper.detach(); + }); + + it('should handle outside of target clicks when isOpen is true', () => { + isOpen = true; + const wrapper = mount( + + Popover Content + , + { attachTo: container } + ); + const instance = wrapper.instance(); + + expect(isOpen).toBe(true); + instance.handleDocumentClick({ target: outerTarget }); + jest.runTimersToTime(0); // toggle is still async + expect(isOpen).toBe(false); + + wrapper.detach(); + }); + + it('should clear the hide timeout when handling outside of target clicks when isOpen is true', () => { + isOpen = true; + const wrapper = mount( + + Popover Content + , + { attachTo: container } + ); + const instance = wrapper.instance(); + + expect(isOpen).toBe(true); + instance._hideTimeout = 1; + instance.handleDocumentClick({ target: outerTarget }); + jest.runTimersToTime(0); // toggle is still async + expect(instance._hideTimeout).toBeUndefined(); + expect(isOpen).toBe(false); + + wrapper.detach(); + }); + + it('should NOT handle inner target clicks', () => { + const wrapper = mount( + + Popover Content + , + { attachTo: container } + ); + const instance = wrapper.instance(); + + expect(isOpen).toBe(false); + instance.handleDocumentClick({ target: innerTarget }); + jest.runTimersToTime(0); // toggle is still async + expect(isOpen).toBe(false); + + wrapper.detach(); + }); + + it('should not do anything when document click outside of target', () => { + const wrapper = mount( + + Popover Content + , + { attachTo: container } + ); + const instance = wrapper.instance(); + + expect(isOpen).toBe(false); + instance.handleDocumentClick({ target: container }); + expect(isOpen).toBe(false); + + wrapper.detach(); + }); + + it('should not call props.toggle when disabled ', () => { + const props = createSpyObj('props', ['toggle']); + const event = createSpyObj('event', ['preventDefault']); + + const wrapper = mount( + + Popover Content + , + { attachTo: container } + ); + const instance = wrapper.instance(); + + instance.toggle(event); + + expect(event.preventDefault).toHaveBeenCalled(); + expect(props.toggle).not.toHaveBeenCalled(); + + wrapper.detach(); + }); + + it('should not throw when props.toggle is not provided ', () => { + const event = createSpyObj('event', ['preventDefault']); + + const wrapper = mount( + + Popover Content + , + { attachTo: container } + ); + const instance = wrapper.instance(); + + instance.toggle(event); + + wrapper.detach(); + }); + + describe('delay', () => { + it('should accept a number', () => { + isOpen = true; + const wrapper = mount( + + Popover Content + , + { attachTo: container } + ); + const instance = wrapper.instance(); + + instance.hide(); + jest.runTimersToTime(0); // toggle is still async + expect(isOpen).toBe(true); + jest.runTimersToTime(200); + expect(isOpen).toBe(false); + }); + + it('should accept an object', () => { + isOpen = true; + const wrapper = mount( + + Popover Content + , + { attachTo: container } + ); + const instance = wrapper.instance(); + + instance.hide(); + jest.runTimersToTime(0); // toggle is still async + expect(isOpen).toBe(true); + jest.runTimersToTime(200); + expect(isOpen).toBe(false); + }); + + it('should use default value if value is missing from object', () => { + isOpen = true; + const wrapper = mount( + + Popover Content + , + { attachTo: container } + ); + const instance = wrapper.instance(); + + instance.hide(); + jest.runTimersToTime(0); // toggle is still async + expect(isOpen).toBe(true); + jest.runTimersToTime(250); // Default hide value: 250 + expect(isOpen).toBe(false); + }); + }); + + describe('hide', () => { + it('should call toggle when isOpen', () => { + const spy = jest.fn(toggle); + isOpen = true; + const wrapper = mount( + + Popover Content + , + { attachTo: container } + ); + const instance = wrapper.instance(); + + expect(spy).not.toHaveBeenCalled(); + + instance.hide(); + jest.runTimersToTime(0); // toggle is still async + + expect(spy).toHaveBeenCalled(); + + wrapper.detach(); + }); + + it('should not call toggle when isOpen is false', () => { + const spy = jest.fn(toggle); + const wrapper = mount( + + Popover Content + , + { attachTo: container } + ); + const instance = wrapper.instance(); + + expect(spy).not.toHaveBeenCalled(); + + instance.hide(); + jest.runTimersToTime(0); // toggle is still async + + expect(spy).not.toHaveBeenCalled(); + + wrapper.detach(); + }); + }); + + describe('show', () => { + it('should call toggle when isOpen is false', () => { + const spy = jest.fn(toggle); + const wrapper = mount( + + Popover Content + , + { attachTo: container } + ); + const instance = wrapper.instance(); + + expect(spy).not.toHaveBeenCalled(); + + instance.show(); + jest.runTimersToTime(0); // toggle is still async + + expect(spy).toHaveBeenCalled(); + + wrapper.detach(); + }); + + it('should not call toggle when isOpen', () => { + const spy = jest.fn(toggle); + isOpen = true; + const wrapper = mount( + + Popover Content + , + { attachTo: container } + ); + const instance = wrapper.instance(); + + expect(spy).not.toHaveBeenCalled(); + + instance.show(); + jest.runTimersToTime(0); // toggle is still async + + expect(spy).not.toHaveBeenCalled(); + + wrapper.detach(); + }); + }); }); diff --git a/src/__tests__/PopperContent.spec.js b/src/__tests__/PopperContent.spec.js new file mode 100644 index 000000000..08ce4ebe5 --- /dev/null +++ b/src/__tests__/PopperContent.spec.js @@ -0,0 +1,160 @@ +import React from 'react'; +import { shallow, mount } from 'enzyme'; +import { Arrow, Manager, Popper } from 'react-popper'; +import { PopperContent, PopperTargetHelper } from '../'; + +describe('PopperContent', () => { + let element; + let container; + + beforeEach(() => { + element = document.createElement('div'); + container = document.createElement('div'); + element.innerHTML = '

    This is the popover target.

    '; + container.setAttribute('id', 'container'); + element.appendChild(container); + document.body.appendChild(element); + + jest.useFakeTimers(); + }); + + afterEach(() => { + jest.clearAllTimers(); + document.body.removeChild(element); + element = null; + }); + + it('should render a Manager by default', () => { + const wrapper = shallow(Yo!); + + expect(wrapper.type()).toBe(Manager); + }); + + it('should render a Manager as a span by default', () => { + const wrapper = mount(Yo!); + + expect(wrapper.find('span').length).toBe(1); + }); + + it('should render a PopperTargetHelper', () => { + const wrapper = mount(Yo!); + + expect(wrapper.containsMatchingElement()).toBe(true); + }); + + it('should NOT render children when isOpen is false', () => { + const wrapper = mount(Yo!); + + expect(wrapper.text()).toBe(''); + }); + + it('should render children when isOpen is true', () => { + const wrapper = mount(Yo!); + + expect(wrapper.text()).toBe('Yo!'); + }); + + it('should render an Arrow in the Popper when isOpen is true', () => { + const wrapper = mount(Yo!); + + expect(wrapper.containsMatchingElement()).toBe(true); + }); + + it('should not render children', () => { + const wrapper = mount(Yo!); + + expect(wrapper.text()).toBe(''); + }); + + it('should pass additional classNames to the wrap', () => { + const wrapper = shallow(Yo!); + + expect(wrapper.hasClass('extra')).toBe(true); + }); + + it('should pass additional classNames to the popper', () => { + const wrapper = shallow(Yo!); + + expect(wrapper.hasClass('extra')).toBe(false); + expect(wrapper.find('.extra').exists()).toBe(true); + }); + + it('should have placement class of top by default', () => { + const wrapper = shallow(Yo!); + + expect(wrapper.find('.auto').exists()).toBe(true); + }); + + it('should override placement class', () => { + const wrapper = shallow(Yo!); + + expect(wrapper.find('.auto').exists()).toBe(false); + expect(wrapper.find('.top').exists()).toBe(true); + }); + + it('should allow for a placement prefix', () => { + const wrapper = shallow(Yo!); + + expect(wrapper.find('.dropdown-auto').exists()).toBe(true); + }); + + it('should allow for a placement prefix with custom placement', () => { + const wrapper = shallow(Yo!); + + expect(wrapper.find('.dropdown-auto').exists()).toBe(false); + expect(wrapper.find('.dropdown-top').exists()).toBe(true); + }); + + it('should render custom wrap tag', () => { + const wrapper = mount(Yo!); + + expect(wrapper.getDOMNode().tagName.toLowerCase()).toBe('main'); + }); + + it('should render custom tag for the popper', () => { + const wrapper = mount(Yo!); + + expect(wrapper.getDOMNode().tagName.toLowerCase()).toBe('span'); + expect(wrapper.find('main').getDOMNode().tagName.toLowerCase()).toBe('main'); + }); + + it('should handle placement changes from popperjs', () => { + jest.spyOn(PopperContent.prototype, 'setState'); + const wrapper = mount(Yo!); + + const instance = wrapper.instance(); + const placement = 'top'; + expect(PopperContent.prototype.setState).not.toHaveBeenCalled(); + instance.handlePlacementChange({ placement }); + expect(PopperContent.prototype.setState).toHaveBeenCalled(); + expect(wrapper.state('placement')).toBe(placement); + + PopperContent.prototype.setState.mockRestore(); + }); + + it('should not update when placement does not change', () => { + jest.spyOn(PopperContent.prototype, 'setState'); + const wrapper = mount(Yo!); + + const instance = wrapper.instance(); + const placement = 'top'; + expect(PopperContent.prototype.setState).not.toHaveBeenCalled(); + instance.handlePlacementChange({ placement }); + expect(PopperContent.prototype.setState).toHaveBeenCalled(); + PopperContent.prototype.setState.mockClear(); + instance.handlePlacementChange({ placement }); + expect(PopperContent.prototype.setState).not.toHaveBeenCalled(); + expect(wrapper.state('placement')).toBe(placement); + + PopperContent.prototype.setState.mockRestore(); + }); + + it('should return data from handle placement changes', () => { + const wrapper = mount(Yo!); + + const instance = wrapper.instance(); + const data = { placement: 'top' }; + const result = instance.handlePlacementChange(data); + expect(result).toEqual(data); + }); +}); diff --git a/src/__tests__/Tabs.spec.js b/src/__tests__/Tabs.spec.js index 456b305f7..0eb7b39f2 100644 --- a/src/__tests__/Tabs.spec.js +++ b/src/__tests__/Tabs.spec.js @@ -53,7 +53,7 @@ describe('Tabs', () => { it('should not setState when the active tab does not change during a prop update', () => { const tab1 = mount(); const instance = tab1.instance(); - spyOn(instance, 'setState').and.callThrough(); + jest.spyOn(instance, 'setState'); tab1.setProps({ style: { textAlign: 'left' } }); expect(instance.setState).not.toHaveBeenCalled(); }); @@ -81,7 +81,7 @@ describe('Tabs', () => { it('should call setState when the active tab does change during a prop update', () => { const tab1 = mount(); const instance = tab1.instance(); - spyOn(instance, 'setState').and.callThrough(); + jest.spyOn(instance, 'setState'); expect(instance.setState).not.toHaveBeenCalled(); tab1.setProps({ activeTab: 2 }); expect(instance.setState).toHaveBeenCalled(); diff --git a/src/__tests__/TetherContent.spec.js b/src/__tests__/TetherContent.spec.js deleted file mode 100644 index 789173d89..000000000 --- a/src/__tests__/TetherContent.spec.js +++ /dev/null @@ -1,324 +0,0 @@ -import React from 'react'; -import { mount } from 'enzyme'; -import { TetherContent } from '../'; - -describe('TetherContent', () => { - let state; - let toggle; - let tetherConfig; - - beforeEach(() => { - state = false; - toggle = () => { state = !state; }; - tetherConfig = { - target: () => document.body, - attachment: 'middle left', - targetAttachment: 'middle right' - }; - }); - - it('should not return children', () => { - const wrapper = mount(

    Content

    ); - const instance = wrapper.instance(); - expect(wrapper.children().length).toBe(0); - expect(instance._element).toBe(undefined); - }); - - it('should renderChildren with className', () => { - state = true; - spyOn(TetherContent.prototype, 'componentDidMount').and.callThrough(); - spyOn(TetherContent.prototype, 'renderChildren').and.callThrough(); - const wrapper = mount(

    Content

    ); - const instance = wrapper.instance(); - - expect(instance._element.className.indexOf('foo') > -1).toBe(true); - }); - - it('should renderChildren when isOpen is true', () => { - state = true; - spyOn(TetherContent.prototype, 'componentDidMount').and.callThrough(); - spyOn(TetherContent.prototype, 'renderChildren').and.callThrough(); - const wrapper = mount(

    Content

    ); - const instance = wrapper.instance(); - - expect(TetherContent.prototype.componentDidMount.calls.count()).toBe(1); - expect(TetherContent.prototype.renderChildren.calls.count()).toBe(1); - expect(instance.props.isOpen).toBe(true); - expect(instance._element.className.indexOf('tether') > -1).toBe(true); - }); - - it('should not call props.toggle when disabled ', () => { - state = true; - let props = jasmine.createSpyObj('props', ['toggle']); - const wrapper = mount(

    Content

    ); - const instance = wrapper.instance(); - - instance.toggle({ preventDefault: () => { } }); - expect(props.toggle).not.toHaveBeenCalled(); - }); - - describe('hide', () => { - it('should be called on componentWillUnmount', () => { - state = true; - spyOn(TetherContent.prototype, 'componentWillUnmount').and.callThrough(); - spyOn(TetherContent.prototype, 'hide').and.callThrough(); - const wrapper = mount(

    Content

    ); - const instance = wrapper.instance(); - - expect(TetherContent.prototype.componentWillUnmount.calls.count()).toBe(0); - expect(TetherContent.prototype.hide.calls.count()).toBe(0); - expect(instance._element.textContent).toBe('Content'); - expect(instance._tether.enabled).toBe(true); - - wrapper.unmount(); - - expect(TetherContent.prototype.componentWillUnmount.calls.count()).toBe(1); - expect(TetherContent.prototype.hide.calls.count()).toBe(1); - expect(instance._element).toBe(null); - expect(instance._tether).toBe(null); - }); - - it('should pass the new tether reference', () => { - state = true; - const tetherRef = jasmine.createSpy(); - const wrapper = mount(

    Content

    ); - const instance = wrapper.instance(); - - wrapper.unmount(); - - expect(tetherRef.calls.count()).toBe(2); - expect(tetherRef.calls.mostRecent().args[0]).toEqual(instance._tether); - }); - }); - - describe('show', () => { - it('should be called on componentDidMount', () => { - state = true; - spyOn(TetherContent.prototype, 'componentDidMount').and.callThrough(); - spyOn(TetherContent.prototype, 'show').and.callThrough(); - const wrapper = mount(

    Content

    ); - const instance = wrapper.instance(); - - expect(TetherContent.prototype.componentDidMount.calls.count()).toBe(1); - expect(TetherContent.prototype.show.calls.count()).toBe(1); - expect(instance._element.textContent).toBe('Content'); - expect(instance._tether.enabled).toBe(true); - }); - - it('should pass the new tether reference', () => { - state = true; - const tetherRef = jasmine.createSpy(); - const wrapper = mount(

    Content

    ); - const instance = wrapper.instance(); - expect(tetherRef.calls.count()).toBe(1); - expect(tetherRef.calls.first().args[0]).toEqual(instance._tether); - }); - }); - - describe('getTarget', () => { - it('should grab dom node from function', () => { - state = true; - spyOn(tetherConfig, 'target').and.callThrough(); - const wrapper = mount(

    Content

    ); - const instance = wrapper.instance(); - - expect(instance._element.textContent).toBe('Content'); - expect(instance._tether.enabled).toBe(true); - expect(tetherConfig.target).toHaveBeenCalled(); - }); - - it('should grab dom node from string', () => { - state = true; - tetherConfig.target = 'body'; - const wrapper = mount(

    Content

    ); - const instance = wrapper.instance(); - - expect(instance._element.textContent).toBe('Content'); - expect(instance._tether.enabled).toBe(true); - }); - }); - - describe('handleDocumentClick', () => { - it('should call toggle on document click', () => { - state = true; - spyOn(TetherContent.prototype, 'handleDocumentClick').and.callThrough(); - spyOn(TetherContent.prototype, 'toggle').and.callThrough(); - - mount(

    Content

    ); - - expect(TetherContent.prototype.handleDocumentClick.calls.count()).toBe(0); - expect(TetherContent.prototype.toggle.calls.count()).toBe(0); - - document.body.click(); - - expect(TetherContent.prototype.handleDocumentClick.calls.count()).toBe(1); - expect(TetherContent.prototype.toggle.calls.count()).toBe(1); - }); - - it('should call toggle on container click', () => { - state = true; - spyOn(TetherContent.prototype, 'handleDocumentClick').and.callThrough(); - spyOn(TetherContent.prototype, 'toggle').and.callThrough(); - - const wrapper = mount(

    Content

    ); - const instance = wrapper.instance(); - - expect(TetherContent.prototype.handleDocumentClick.calls.count()).toBe(0); - expect(TetherContent.prototype.toggle.calls.count()).toBe(0); - - instance._element.click(); - - expect(TetherContent.prototype.handleDocumentClick.calls.count()).toBe(1); - expect(TetherContent.prototype.toggle.calls.count()).toBe(1); - }); - - it('should not call toggle on tethered element click', () => { - state = true; - spyOn(TetherContent.prototype, 'handleDocumentClick').and.callThrough(); - spyOn(TetherContent.prototype, 'toggle').and.callThrough(); - - const wrapper = mount(

    Content

    ); - const instance = wrapper.instance(); - - expect(TetherContent.prototype.handleDocumentClick.calls.count()).toBe(0); - expect(TetherContent.prototype.toggle.calls.count()).toBe(0); - - instance._element.childNodes[0].click(); - - expect(TetherContent.prototype.handleDocumentClick.calls.count()).toBe(1); - expect(TetherContent.prototype.toggle.calls.count()).toBe(0); - }); - }); - - describe('handleProps', () => { - it('should call .hide when false', () => { - spyOn(TetherContent.prototype, 'componentDidMount').and.callThrough(); - spyOn(TetherContent.prototype, 'hide').and.callThrough(); - spyOn(TetherContent.prototype, 'handleProps').and.callThrough(); - const wrapper = mount(

    Content

    ); - const instance = wrapper.instance(); - - expect(TetherContent.prototype.componentDidMount.calls.count()).toBe(1); - expect(TetherContent.prototype.hide.calls.count()).toBe(1); - expect(TetherContent.prototype.handleProps.calls.count()).toBe(1); - expect(instance.props.isOpen).toBe(false); - }); - - it('should call .show when true', () => { - state = true; - spyOn(TetherContent.prototype, 'componentDidMount').and.callThrough(); - spyOn(TetherContent.prototype, 'show').and.callThrough(); - spyOn(TetherContent.prototype, 'handleProps').and.callThrough(); - const wrapper = mount(

    Content

    ); - const instance = wrapper.instance(); - - expect(TetherContent.prototype.componentDidMount.calls.count()).toBe(1); - expect(TetherContent.prototype.show.calls.count()).toBe(1); - expect(TetherContent.prototype.handleProps.calls.count()).toBe(1); - expect(instance.props.isOpen).toBe(true); - expect(instance._element.className.indexOf('tether') > -1).toBe(true); - }); - - it('should be called on componentDidUpdate when isOpen changed', () => { - spyOn(TetherContent.prototype, 'componentDidUpdate').and.callThrough(); - spyOn(TetherContent.prototype, 'handleProps').and.callThrough(); - const wrapper = mount(

    Content

    ); - const instance = wrapper.instance(); - - expect(TetherContent.prototype.componentDidUpdate.calls.count()).toBe(0); - expect(TetherContent.prototype.handleProps.calls.count()).toBe(1); - expect(instance.props.isOpen).toBe(false); - - state = true; - wrapper.setProps({ isOpen: state }); - - expect(TetherContent.prototype.componentDidUpdate.calls.count()).toBe(1); - expect(TetherContent.prototype.handleProps.calls.count()).toBe(2); - expect(instance.props.isOpen).toBe(true); - }); - - it('should not be called on componentDidUpdate when isOpen did not change', () => { - spyOn(TetherContent.prototype, 'componentDidUpdate').and.callThrough(); - spyOn(TetherContent.prototype, 'handleProps').and.callThrough(); - const wrapper = mount(

    Content

    ); - const instance = wrapper.instance(); - - expect(TetherContent.prototype.componentDidUpdate.calls.count()).toBe(0); - expect(TetherContent.prototype.handleProps.calls.count()).toBe(1); - expect(instance.props.isOpen).toBe(false); - - wrapper.setProps({ foo: 'bar' }); - - expect(TetherContent.prototype.componentDidUpdate.calls.count()).toBe(1); - expect(TetherContent.prototype.handleProps.calls.count()).toBe(1); - expect(instance.props.isOpen).toBe(false); - }); - }); - - describe('renderIntoSubtree', () => { - it('should be called when the content is shown', () => { - spyOn(TetherContent.prototype, 'renderIntoSubtree').and.callThrough(); - mount(

    Content

    ); - - expect(TetherContent.prototype.renderIntoSubtree.calls.count()).toBe(1); - }); - - it('should be called when the content is not shown', () => { - spyOn(TetherContent.prototype, 'renderIntoSubtree').and.callThrough(); - mount(

    Content

    ); - - expect(TetherContent.prototype.renderIntoSubtree.calls.count()).toBe(0); - }); - - it('should be called on componentDidUpdate when isOpen did not change is true', () => { - spyOn(TetherContent.prototype, 'componentDidUpdate').and.callThrough(); - spyOn(TetherContent.prototype, 'renderIntoSubtree').and.callThrough(); - const wrapper = mount(

    Content

    ); - const instance = wrapper.instance(); - - expect(TetherContent.prototype.componentDidUpdate.calls.count()).toBe(0); - expect(TetherContent.prototype.renderIntoSubtree.calls.count()).toBe(1); - expect(instance.props.isOpen).toBe(true); - - wrapper.setProps({ children: something }); - - expect(TetherContent.prototype.componentDidUpdate.calls.count()).toBe(1); - expect(TetherContent.prototype.renderIntoSubtree.calls.count()).toBe(2); - expect(instance.props.isOpen).toBe(true); - }); - - it('should not be called on componentDidUpdate when isOpen changed to false', () => { - spyOn(TetherContent.prototype, 'componentDidUpdate').and.callThrough(); - spyOn(TetherContent.prototype, 'renderIntoSubtree').and.callThrough(); - const wrapper = mount(

    Content

    ); - const instance = wrapper.instance(); - - expect(TetherContent.prototype.componentDidUpdate.calls.count()).toBe(0); - expect(TetherContent.prototype.renderIntoSubtree.calls.count()).toBe(1); - expect(instance.props.isOpen).toBe(true); - - wrapper.setProps({ isOpen: false }); - - expect(TetherContent.prototype.componentDidUpdate.calls.count()).toBe(1); - expect(TetherContent.prototype.renderIntoSubtree.calls.count()).toBe(1); - expect(instance.props.isOpen).toBe(false); - }); - - it('should not be called on componentDidUpdate when isOpen did not change and is false', () => { - spyOn(TetherContent.prototype, 'componentDidUpdate').and.callThrough(); - spyOn(TetherContent.prototype, 'renderIntoSubtree').and.callThrough(); - const wrapper = mount(

    Content

    ); - const instance = wrapper.instance(); - - expect(TetherContent.prototype.componentDidUpdate.calls.count()).toBe(0); - expect(TetherContent.prototype.renderIntoSubtree.calls.count()).toBe(0); - expect(instance.props.isOpen).toBe(false); - - wrapper.setProps({ children: something }); - - expect(TetherContent.prototype.componentDidUpdate.calls.count()).toBe(1); - expect(TetherContent.prototype.renderIntoSubtree.calls.count()).toBe(0); - expect(instance.props.isOpen).toBe(false); - }); - }); -}); diff --git a/src/__tests__/Tooltip.spec.js b/src/__tests__/Tooltip.spec.js index 5268ffaad..3af0515e6 100644 --- a/src/__tests__/Tooltip.spec.js +++ b/src/__tests__/Tooltip.spec.js @@ -24,11 +24,11 @@ describe('Tooltip', () => { target = document.getElementById('target'); innerTarget = document.getElementById('innerTarget'); - jasmine.clock().install(); + jest.useFakeTimers(); }); afterEach(() => { - jasmine.clock().uninstall(); + jest.clearAllTimers(); document.body.removeChild(element); element = null; container = null; @@ -43,11 +43,10 @@ describe('Tooltip', () => { , { attachTo: container } ); - const instance = wrapper.instance(); + const tooltips = document.getElementsByClassName('tooltip'); - expect(ReactDOM.findDOMNode(instance)).toBe(null); - expect(document.body.querySelectorAll('.tooltip.show').length).toBe(0); + expect(wrapper.find('.tooltip.show').length).toBe(0); expect(target.className).toBe(''); expect(tooltips.length).toBe(0); wrapper.detach(); @@ -61,12 +60,10 @@ describe('Tooltip', () => { , { attachTo: container } ); - const instance = wrapper.instance(); + const tooltips = document.getElementsByClassName('tooltip'); - expect(ReactDOM.findDOMNode(instance)).toBe(null); - expect(document.body.querySelectorAll('.tooltip.show').length).toBe(1); - expect(target.className.indexOf('bs-tether-target') > -1).toBe(true); + expect(wrapper.find('.tooltip.show').length).toBe(1); expect(tooltips.length).toBe(1); expect(tooltips[0].textContent).toBe('Tooltip Content'); wrapper.detach(); @@ -80,12 +77,10 @@ describe('Tooltip', () => { , { attachTo: container } ); - const instance = wrapper.instance(); + const tooltips = document.getElementsByClassName('tooltip'); - expect(ReactDOM.findDOMNode(instance)).toBe(null); - expect(document.body.querySelectorAll('.tooltip.show').length).toBe(1); - expect(target.className.indexOf('bs-tether-target') > -1).toBe(true); + expect(wrapper.find('.tooltip.show').length).toBe(1); expect(tooltips.length).toBe(1); expect(tooltips[0].textContent).toBe('Tooltip Content'); wrapper.detach(); @@ -168,7 +163,7 @@ describe('Tooltip', () => { instance.onMouseLeaveTooltip(); expect(isOpen).toBe(false); instance.handleDocumentClick({ target: target }); - jasmine.clock().tick(200); + jest.runTimersToTime(200); expect(isOpen).toBe(true); wrapper.setProps({ isOpen: isOpen }); instance.handleDocumentClick({ target: target }); @@ -178,8 +173,8 @@ describe('Tooltip', () => { }); it('should not call props.toggle when disabled ', () => { - const props = jasmine.createSpyObj('props', ['toggle']); - const event = jasmine.createSpyObj('event', ['preventDefault']); + const props = createSpyObj('props', ['toggle']); + const event = createSpyObj('event', ['preventDefault']); const wrapper = mount( @@ -198,7 +193,7 @@ describe('Tooltip', () => { }); it('should not throw when props.toggle is not provided ', () => { - const event = jasmine.createSpyObj('event', ['preventDefault']); + const event = createSpyObj('event', ['preventDefault']); const wrapper = mount( @@ -226,7 +221,7 @@ describe('Tooltip', () => { instance.onMouseLeaveTooltip(); expect(isOpen).toBe(true); - jasmine.clock().tick(200); + jest.runTimersToTime(200); expect(isOpen).toBe(false); }); @@ -242,7 +237,7 @@ describe('Tooltip', () => { instance.onMouseLeaveTooltip(); expect(isOpen).toBe(true); - jasmine.clock().tick(200); + jest.runTimersToTime(200); expect(isOpen).toBe(false); }); @@ -258,47 +253,47 @@ describe('Tooltip', () => { instance.onMouseLeaveTooltip(); expect(isOpen).toBe(true); - jasmine.clock().tick(250); // Default hide value: 250 + jest.runTimersToTime(250); // Default hide value: 250 expect(isOpen).toBe(false); }); }); describe('hide', () => { it('should call toggle when isOpen', () => { - spyOn(Tooltip.prototype, 'toggle').and.callThrough(); + const spy = jest.fn(toggle); isOpen = true; const wrapper = mount( - + Tooltip Content , { attachTo: container } ); const instance = wrapper.instance(); - expect(Tooltip.prototype.toggle).not.toHaveBeenCalled(); + expect(spy).not.toHaveBeenCalled(); instance.hide(); - expect(Tooltip.prototype.toggle).toHaveBeenCalled(); + expect(spy).toHaveBeenCalled(); wrapper.detach(); }); it('should not call toggle when isOpen is false', () => { - spyOn(Tooltip.prototype, 'toggle').and.callThrough(); + const spy = jest.fn(toggle); const wrapper = mount( - + Tooltip Content , { attachTo: container } ); const instance = wrapper.instance(); - expect(Tooltip.prototype.toggle).not.toHaveBeenCalled(); + expect(spy).not.toHaveBeenCalled(); instance.hide(); - expect(Tooltip.prototype.toggle).not.toHaveBeenCalled(); + expect(spy).not.toHaveBeenCalled(); wrapper.detach(); }); @@ -306,40 +301,40 @@ describe('Tooltip', () => { describe('show', () => { it('should call toggle when isOpen is false', () => { - spyOn(Tooltip.prototype, 'toggle').and.callThrough(); + const spy = jest.fn(toggle); const wrapper = mount( - + Tooltip Content , { attachTo: container } ); const instance = wrapper.instance(); - expect(Tooltip.prototype.toggle).not.toHaveBeenCalled(); + expect(spy).not.toHaveBeenCalled(); instance.show(); - expect(Tooltip.prototype.toggle).toHaveBeenCalled(); + expect(spy).toHaveBeenCalled(); wrapper.detach(); }); it('should not call toggle when isOpen', () => { - spyOn(Tooltip.prototype, 'toggle').and.callThrough(); + const spy = jest.fn(toggle); isOpen = true; const wrapper = mount( - + Tooltip Content , { attachTo: container } ); const instance = wrapper.instance(); - expect(Tooltip.prototype.toggle).not.toHaveBeenCalled(); + expect(spy).not.toHaveBeenCalled(); instance.show(); - expect(Tooltip.prototype.toggle).not.toHaveBeenCalled(); + expect(spy).not.toHaveBeenCalled(); wrapper.detach(); }); @@ -347,9 +342,9 @@ describe('Tooltip', () => { describe('onMouseOverTooltip', () => { it('should clear timeout if it exists on target click', () => { - spyOn(Tooltip.prototype, 'toggle').and.callThrough(); + const spy = jest.fn(toggle); const wrapper = mount( - + Tooltip Content , { attachTo: container } @@ -359,21 +354,21 @@ describe('Tooltip', () => { instance.onMouseLeaveTooltip(); expect(isOpen).toBe(false); - expect(Tooltip.prototype.toggle).not.toHaveBeenCalled(); + expect(spy).not.toHaveBeenCalled(); instance.onMouseOverTooltip(); - jasmine.clock().tick(200); + jest.runTimersToTime(200); - expect(Tooltip.prototype.toggle).toHaveBeenCalled(); + expect(spy).toHaveBeenCalled(); wrapper.detach(); }); it('should not call .toggle if isOpen', () => { - spyOn(Tooltip.prototype, 'toggle').and.callThrough(); + const spy = jest.fn(toggle); isOpen = true; const wrapper = mount( - + Tooltip Content , { attachTo: container } @@ -381,10 +376,10 @@ describe('Tooltip', () => { const instance = wrapper.instance(); instance.onMouseOverTooltip(); - jasmine.clock().tick(0); // delay: 0 toggle is still async + jest.runTimersToTime(0); // delay: 0 toggle is still async expect(isOpen).toBe(true); - expect(Tooltip.prototype.toggle).not.toHaveBeenCalled(); + expect(spy).not.toHaveBeenCalled(); wrapper.detach(); }); @@ -392,10 +387,10 @@ describe('Tooltip', () => { describe('onMouseLeaveTooltip', () => { it('should clear timeout if it exists on target click', () => { - spyOn(Tooltip.prototype, 'toggle').and.callThrough(); + const spy = jest.fn(toggle); isOpen = true; const wrapper = mount( - + Tooltip Content , { attachTo: container } @@ -405,21 +400,21 @@ describe('Tooltip', () => { instance.onMouseOverTooltip(); expect(isOpen).toBe(true); - expect(Tooltip.prototype.toggle).not.toHaveBeenCalled(); + expect(spy).not.toHaveBeenCalled(); instance.onMouseLeaveTooltip(); - jasmine.clock().tick(200); + jest.runTimersToTime(200); - expect(Tooltip.prototype.toggle).toHaveBeenCalled(); + expect(spy).toHaveBeenCalled(); wrapper.detach(); }); it('should not call .toggle if isOpen is false', () => { - spyOn(Tooltip.prototype, 'toggle').and.callThrough(); + const spy = jest.fn(toggle); isOpen = false; const wrapper = mount( - + Tooltip Content , { attachTo: container } @@ -427,10 +422,10 @@ describe('Tooltip', () => { const instance = wrapper.instance(); instance.onMouseLeaveTooltip(); - jasmine.clock().tick(0); // delay: 0 toggle is still async + jest.runTimersToTime(0); // delay: 0 toggle is still async expect(isOpen).toBe(false); - expect(Tooltip.prototype.toggle).not.toHaveBeenCalled(); + expect(spy).not.toHaveBeenCalled(); wrapper.detach(); }); @@ -438,10 +433,10 @@ describe('Tooltip', () => { describe('autohide', () => { it('should keep tooltip around when false and onmouseleave from tooltip content', () => { - spyOn(Tooltip.prototype, 'toggle').and.callThrough(); + const spy = jest.fn(toggle); isOpen = true; const wrapper = mount( - + Tooltip Content , { attachTo: container } @@ -449,22 +444,22 @@ describe('Tooltip', () => { const instance = wrapper.instance(); expect(isOpen).toBe(true); - expect(Tooltip.prototype.toggle).not.toHaveBeenCalled(); + expect(spy).not.toHaveBeenCalled(); instance.onMouseLeaveTooltipContent(); - jasmine.clock().tick(100); - expect(Tooltip.prototype.toggle).not.toHaveBeenCalled(); - jasmine.clock().tick(200); - expect(Tooltip.prototype.toggle).toHaveBeenCalled(); + jest.runTimersToTime(100); + expect(spy).not.toHaveBeenCalled(); + jest.runTimersToTime(200); + expect(spy).toHaveBeenCalled(); wrapper.detach(); }); it('clears showTimeout in onMouseLeaveTooltipContent', () => { - spyOn(Tooltip.prototype, 'toggle').and.callThrough(); + const spy = jest.fn(toggle); isOpen = true; const wrapper = mount( - + Tooltip Content , { attachTo: container } @@ -474,16 +469,16 @@ describe('Tooltip', () => { instance.onMouseOverTooltip(); expect(instance._showTimeout).toBeTruthy(); instance.onMouseLeaveTooltipContent(); - jasmine.clock().tick(300); + jest.runTimersToTime(300); expect(instance._showTimeout).toBeFalsy(); wrapper.detach(); }); it('clears hide timeout in onMouseOverTooltipContent', () => { - spyOn(Tooltip.prototype, 'toggle').and.callThrough(); + const spy = jest.fn(toggle); isOpen = true; const wrapper = mount( - + Tooltip Content , { attachTo: container } @@ -491,9 +486,9 @@ describe('Tooltip', () => { const instance = wrapper.instance(); expect(isOpen).toBe(true); - expect(Tooltip.prototype.toggle).not.toHaveBeenCalled(); + expect(spy).not.toHaveBeenCalled(); instance.onMouseLeaveTooltipContent(); - jasmine.clock().tick(100); + jest.runTimersToTime(100); expect(instance._hideTimeout).toBeTruthy(); instance.onMouseOverTooltipContent(); expect(instance._hideTimeout).toBeFalsy(); @@ -502,22 +497,22 @@ describe('Tooltip', () => { }); it('should not keep tooltip around when autohide is true and tooltip content is hovered over', () => { - spyOn(Tooltip.prototype, 'toggle').and.callThrough(); + const spy = jest.fn(toggle); isOpen = true; const wrapper = mount( - + Tooltip Content , { attachTo: container } ); const instance = wrapper.instance(); expect(isOpen).toBe(true); - expect(Tooltip.prototype.toggle).not.toHaveBeenCalled(); + expect(spy).not.toHaveBeenCalled(); instance.onMouseLeaveTooltip(); - jasmine.clock().tick(100); + jest.runTimersToTime(100); instance.onMouseOverTooltipContent(); - jasmine.clock().tick(200); - expect(Tooltip.prototype.toggle).toHaveBeenCalled(); + jest.runTimersToTime(200); + expect(spy).toHaveBeenCalled(); instance.onMouseLeaveTooltipContent(); expect(instance._hideTimeout).toBeFalsy(); wrapper.detach(); diff --git a/src/__tests__/Uncontrolled.spec.js b/src/__tests__/Uncontrolled.spec.js index 370d38353..e72af8a8f 100644 --- a/src/__tests__/Uncontrolled.spec.js +++ b/src/__tests__/Uncontrolled.spec.js @@ -26,7 +26,7 @@ describe('UncontrolledAlert', () => { it('should have toggle function', () => { const alert = shallow(Yo!); - expect(alert.prop('toggle')).toEqual(jasmine.any(Function)); + expect(alert.prop('toggle')).toEqual(expect.any(Function)); }); it('should toggle isOpen when toggle is called', () => { @@ -50,7 +50,7 @@ describe('UncontrolledButtonDropdown', () => { it('should have toggle function', () => { const buttonDropdown = shallow(Yo!); - expect(buttonDropdown.prop('toggle')).toEqual(jasmine.any(Function)); + expect(buttonDropdown.prop('toggle')).toEqual(expect.any(Function)); }); it('should toggle isOpen when toggle is called', () => { @@ -74,7 +74,7 @@ describe('UncontrolledDropdown', () => { it('should have toggle function', () => { const dropdown = shallow(Yo!); - expect(dropdown.prop('toggle')).toEqual(jasmine.any(Function)); + expect(dropdown.prop('toggle')).toEqual(expect.any(Function)); }); it('should toggle isOpen when toggle is called', () => { @@ -98,7 +98,7 @@ describe('UncontrolledNavDropdown', () => { it('should have toggle function', () => { const navDropdown = shallow(Yo!); - expect(navDropdown.prop('toggle')).toEqual(jasmine.any(Function)); + expect(navDropdown.prop('toggle')).toEqual(expect.any(Function)); }); it('should toggle isOpen when toggle is called', () => { @@ -122,7 +122,7 @@ describe('UncontrolledTooltip', () => { it('should have toggle function', () => { const tooltip = shallow(Yo!); - expect(tooltip.prop('toggle')).toEqual(jasmine.any(Function)); + expect(tooltip.prop('toggle')).toEqual(expect.any(Function)); }); it('should toggle isOpen when toggle is called', () => { diff --git a/src/__tests__/utils.spec.js b/src/__tests__/utils.spec.js index 2ec31fa46..5442422e1 100644 --- a/src/__tests__/utils.spec.js +++ b/src/__tests__/utils.spec.js @@ -1,123 +1,10 @@ import * as Utils from '../utils'; describe('Utils', () => { - describe('getTetherAttachments', () => { - let expectedConfig; - - beforeEach(() => { - expectedConfig = { - attachment: '', - targetAttachment: '' - }; - }); - - it('should return a default config when placement is not matched', () => { - expectedConfig.attachment = 'top center'; - expectedConfig.targetAttachment = 'bottom center'; - - expect(Utils.getTetherAttachments()).toEqual(expectedConfig); - }); - - it('should return config for "top" & "top center"', () => { - expectedConfig.attachment = 'bottom center'; - expectedConfig.targetAttachment = 'top center'; - - expect(Utils.getTetherAttachments('top')).toEqual(expectedConfig); - expect(Utils.getTetherAttachments('top center')).toEqual(expectedConfig); - }); - - it('should return config for "bottom" & "bottom center"', () => { - expectedConfig.attachment = 'top center'; - expectedConfig.targetAttachment = 'bottom center'; - - expect(Utils.getTetherAttachments('bottom')).toEqual(expectedConfig); - expect(Utils.getTetherAttachments('bottom center')).toEqual(expectedConfig); - }); - - it('should return config for "left" & "left center"', () => { - expectedConfig.attachment = 'middle right'; - expectedConfig.targetAttachment = 'middle left'; - - expect(Utils.getTetherAttachments('left')).toEqual(expectedConfig); - expect(Utils.getTetherAttachments('left center')).toEqual(expectedConfig); - }); - - it('should return config for "right" & "right center"', () => { - expectedConfig.attachment = 'middle left'; - expectedConfig.targetAttachment = 'middle right'; - - expect(Utils.getTetherAttachments('right')).toEqual(expectedConfig); - expect(Utils.getTetherAttachments('right center')).toEqual(expectedConfig); - }); - - it('should return config for "top left"', () => { - expectedConfig.attachment = 'bottom left'; - expectedConfig.targetAttachment = 'top left'; - - expect(Utils.getTetherAttachments('top left')).toEqual(expectedConfig); - }); - - it('should return config for "top left"', () => { - expectedConfig.attachment = 'bottom left'; - expectedConfig.targetAttachment = 'top left'; - - expect(Utils.getTetherAttachments('top left')).toEqual(expectedConfig); - }); - - it('should return config for "top right"', () => { - expectedConfig.attachment = 'bottom right'; - expectedConfig.targetAttachment = 'top right'; - - expect(Utils.getTetherAttachments('top right')).toEqual(expectedConfig); - }); - - it('should return config for "bottom left"', () => { - expectedConfig.attachment = 'top left'; - expectedConfig.targetAttachment = 'bottom left'; - - expect(Utils.getTetherAttachments('bottom left')).toEqual(expectedConfig); - }); - - it('should return config for "bottom right"', () => { - expectedConfig.attachment = 'top right'; - expectedConfig.targetAttachment = 'bottom right'; - - expect(Utils.getTetherAttachments('bottom right')).toEqual(expectedConfig); - }); - - it('should return config for "right top"', () => { - expectedConfig.attachment = 'top left'; - expectedConfig.targetAttachment = 'top right'; - - expect(Utils.getTetherAttachments('right top')).toEqual(expectedConfig); - }); - - it('should return config for "right bottom"', () => { - expectedConfig.attachment = 'bottom left'; - expectedConfig.targetAttachment = 'bottom right'; - - expect(Utils.getTetherAttachments('right bottom')).toEqual(expectedConfig); - }); - - it('should return config for "left top"', () => { - expectedConfig.attachment = 'top right'; - expectedConfig.targetAttachment = 'top left'; - - expect(Utils.getTetherAttachments('left top')).toEqual(expectedConfig); - }); - - it('should return config for "left bottom"', () => { - expectedConfig.attachment = 'bottom right'; - expectedConfig.targetAttachment = 'bottom left'; - - expect(Utils.getTetherAttachments('left bottom')).toEqual(expectedConfig); - }); - }); - describe('mapToCssModules', () => { describe('without css module', () => { it('should return a string', () => { - expect(Utils.mapToCssModules('btn btn-primary')).toEqual(jasmine.any(String)); + expect(Utils.mapToCssModules('btn btn-primary')).toEqual(expect.any(String)); }); it('should return the classnames it was given, unchanged', () => { @@ -132,7 +19,7 @@ describe('Utils', () => { 'btn-success': 'b1', 'btn-primary': 'c2', }; - expect(Utils.mapToCssModules('btn btn-primary', cssModule)).toEqual(jasmine.any(String)); + expect(Utils.mapToCssModules('btn btn-primary', cssModule)).toEqual(expect.any(String)); }); it('should return the mapped classnames', () => { @@ -196,6 +83,65 @@ describe('Utils', () => { }); }); + describe('DOMElement', () => { + it('should not return an error when the prop is an instance of an Element', () => { + const props = { + dom: document.createElement('div'), + }; + const propName = 'dom'; + const componentName = 'ComponentName'; + + expect(Utils.DOMElement(props, propName, componentName)).toBeUndefined(); + }); + + it('should return an error when the prop is NOT an instance of an Element', () => { + const props = { + dom: 'not an Element', + }; + const propName = 'dom'; + const componentName = 'ComponentName'; + + expect(Utils.DOMElement(props, propName, componentName)).toEqual(new Error( + 'Invalid prop `' + propName + '` supplied to `' + componentName + + '`. Expected prop to be an instance of Element. Validation failed.' + )); + }); + }); + + describe('getTarget', () => { + it('should return the result of target if target is a function', () => { + const data = {}; + const spy = jest.fn(() => data); + expect(Utils.getTarget(spy)).toEqual(data); + expect(spy).toHaveBeenCalled(); + }); + + it('should query the document for the target if the target is a string', () => { + const element = document.createElement('div'); + element.className = 'thing'; + document.body.appendChild(element); + jest.spyOn(document, 'querySelector'); + expect(Utils.getTarget('.thing')).toEqual(element); + expect(document.querySelector).toHaveBeenCalledWith('.thing'); + document.querySelector.mockRestore(); + }); + + it('should query the document for the id target if the target is a string and could not be found normally', () => { + const element = document.createElement('div'); + element.setAttribute('id', 'thing'); + document.body.appendChild(element); + jest.spyOn(document, 'querySelector'); + expect(Utils.getTarget('thing')).toEqual(element); + expect(document.querySelector).toHaveBeenCalledWith('#thing'); + document.querySelector.mockRestore(); + }); + + it('should return the input target if it is not a function nor a string', () => { + const target = {}; + expect(Utils.getTarget(target)).toEqual(target); + }); + }); + // TODO // describe('getScrollbarWidth', () => { // // jsdom workaround https://github.com/tmpvar/jsdom/issues/135#issuecomment-68191941 @@ -221,7 +167,7 @@ describe('Utils', () => { // TODO verify setScrollbarWidth is called with values when body overflows // it('should conditionallyUpdateScrollbar when isBodyOverflowing is true', () => { - // const stubbedSetScrollbarWidth = jasmine.createSpy('Utils', setScrollbarWidth).and.callThrough(); + // const stubbedSetScrollbarWidth = jest.fn().and.callThrough(); // const prevClientWidth = document.body.clientWidth; // const prevWindowInnerWidth = window.innerWidth; // document.body.clientWidth = 100; diff --git a/src/index.js b/src/index.js index 9caf067d1..b7be0a126 100644 --- a/src/index.js +++ b/src/index.js @@ -39,6 +39,8 @@ import CarouselCaption from './CarouselCaption'; import CardSubtitle from './CardSubtitle'; import CardText from './CardText'; import CardTitle from './CardTitle'; +import PopperContent from './PopperContent'; +import PopperTargetHelper from './PopperTargetHelper'; import Popover from './Popover'; import PopoverHeader from './PopoverHeader'; import PopoverTitle from './PopoverTitle'; @@ -49,7 +51,6 @@ import Modal from './Modal'; import ModalHeader from './ModalHeader'; import ModalBody from './ModalBody'; import ModalFooter from './ModalFooter'; -import TetherContent from './TetherContent'; import Tooltip from './Tooltip'; import Table from './Table'; import ListGroup from './ListGroup'; @@ -135,7 +136,8 @@ export { ModalHeader, ModalBody, ModalFooter, - TetherContent, + PopperContent, + PopperTargetHelper, Tooltip, Table, ListGroup, diff --git a/src/setupTests.js b/src/setupTests.js new file mode 100644 index 000000000..5504fc2d9 --- /dev/null +++ b/src/setupTests.js @@ -0,0 +1,17 @@ +/* global jest */ +global.requestAnimationFrame = function (cb) { cb(0); }; +global.window.cancelAnimationFrame = function () { }; +global.createSpyObj = (baseName, methodNames) => { + const obj = {}; + + for (let i = 0; i < methodNames.length; i += 1) { + obj[methodNames[i]] = jest.fn(); + } + + return obj; +}; +global.document.createRange = () => ({ + setStart: () => {}, + setEnd: () => {}, + commonAncestorContainer: {} +}); diff --git a/src/utils.js b/src/utils.js index 51e25b6bb..12d82821b 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,110 +1,4 @@ -export function getTetherAttachments(placement) { - let attachments = {}; - switch (placement) { - case 'top': - case 'top center': - attachments = { - attachment: 'bottom center', - targetAttachment: 'top center' - }; - break; - case 'bottom': - case 'bottom center': - attachments = { - attachment: 'top center', - targetAttachment: 'bottom center' - }; - break; - case 'left': - case 'left center': - attachments = { - attachment: 'middle right', - targetAttachment: 'middle left' - }; - break; - case 'right': - case 'right center': - attachments = { - attachment: 'middle left', - targetAttachment: 'middle right' - }; - break; - case 'top left': - attachments = { - attachment: 'bottom left', - targetAttachment: 'top left' - }; - break; - case 'top right': - attachments = { - attachment: 'bottom right', - targetAttachment: 'top right' - }; - break; - case 'bottom left': - attachments = { - attachment: 'top left', - targetAttachment: 'bottom left' - }; - break; - case 'bottom right': - attachments = { - attachment: 'top right', - targetAttachment: 'bottom right' - }; - break; - case 'right top': - attachments = { - attachment: 'top left', - targetAttachment: 'top right' - }; - break; - case 'right bottom': - attachments = { - attachment: 'bottom left', - targetAttachment: 'bottom right' - }; - break; - case 'left top': - attachments = { - attachment: 'top right', - targetAttachment: 'top left' - }; - break; - case 'left bottom': - attachments = { - attachment: 'bottom right', - targetAttachment: 'bottom left' - }; - break; - default: - attachments = { - attachment: 'top center', - targetAttachment: 'bottom center' - }; - } - - return attachments; -} - -export const tetherAttachements = [ - 'top', - 'bottom', - 'left', - 'right', - 'top left', - 'top center', - 'top right', - 'right top', - 'right middle', - 'right bottom', - 'bottom right', - 'bottom center', - 'bottom left', - 'left top', - 'left middle', - 'left bottom' -]; +import isFunction from 'lodash.isfunction'; // https://github.com/twbs/bootstrap/blob/v4.0.0-alpha.4/js/src/modal.js#L436-L443 export function getScrollbarWidth() { @@ -160,7 +54,7 @@ export function mapToCssModules(className, cssModule) { */ export function omit(obj, omitKeys) { const result = {}; - Object.keys(obj).forEach(key => { + Object.keys(obj).forEach((key) => { if (omitKeys.indexOf(key) === -1) { result[key] = obj[key]; } @@ -172,6 +66,7 @@ let warned = {}; export function warnOnce(message) { if (!warned[message]) { + /* istanbul ignore else */ if (typeof console !== 'undefined') { console.error(message); // eslint-disable-line no-console } @@ -188,3 +83,28 @@ export function deprecated(propType, explanation) { return propType(props, propName, componentName, ...rest); }; } + +export function DOMElement(props, propName, componentName) { + if (!(props[propName] instanceof Element)) { + return new Error( + 'Invalid prop `' + propName + '` supplied to `' + componentName + + '`. Expected prop to be an instance of Element. Validation failed.' + ); + } +} + +export function getTarget(target) { + if (isFunction(target)) { + return target(); + } + + if (typeof target === 'string' && document) { + const selection = document.querySelector(target); + if (selection === null) { + return document.querySelector(`#${target}`); + } + return selection; + } + + return target; +} From 0a9394d18804f47108222aa8e9ebe99dd5d2ebce Mon Sep 17 00:00:00 2001 From: Joe Duchnowski Date: Wed, 13 Sep 2017 10:45:11 -0400 Subject: [PATCH 037/862] fix(popperjs): fixed error in build (#571) Fixed Error 'placements' is not exported by node_modules/popper.js/dist/esm/popper.js Renamed Popper to PopperContent in Tooltip.js to match Popover.js. --- src/Popover.js | 4 ++-- src/Tooltip.js | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Popover.js b/src/Popover.js index b56cc52a6..9308b7495 100644 --- a/src/Popover.js +++ b/src/Popover.js @@ -1,12 +1,12 @@ import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; -import { placements } from 'popper.js'; +import PopperJS from 'popper.js'; import PopperContent from './PopperContent'; import { getTarget, DOMElement, mapToCssModules, omit } from './utils'; const propTypes = { - placement: PropTypes.oneOf(placements), + placement: PropTypes.oneOf(PopperJS.placements), target: PropTypes.oneOfType([ PropTypes.string, PropTypes.func, diff --git a/src/Tooltip.js b/src/Tooltip.js index c4b1e764b..429f32448 100644 --- a/src/Tooltip.js +++ b/src/Tooltip.js @@ -1,12 +1,12 @@ import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; -import { placements } from 'popper.js'; -import Popper from './PopperContent'; +import PopperJS from 'popper.js'; +import PopperContent from './PopperContent'; import { getTarget, DOMElement, mapToCssModules, omit } from './utils'; const propTypes = { - placement: PropTypes.oneOf(placements), + placement: PropTypes.oneOf(PopperJS.placements), target: PropTypes.oneOfType([ PropTypes.string, PropTypes.func, @@ -178,7 +178,7 @@ class Tooltip extends React.Component { ), this.props.cssModule); return ( - - + ); } } From 6ce79ff9bb8c6126dfc00d3cae39bd93a7ed0f43 Mon Sep 17 00:00:00 2001 From: Marek Takac Date: Wed, 13 Sep 2017 19:14:33 +0200 Subject: [PATCH 038/862] docs(Alert): update docs (#537) Update Alert documentation to stay up to date with bootstrap v4 beta. Add light and dark colors and add examples with Link color and Additional content. --- docs/lib/Components/AlertsPage.js | 26 +++++++++++++++++++++++ docs/lib/examples/Alert.js | 24 +++++++++++++++------ docs/lib/examples/AlertContent.js | 23 ++++++++++++++++++++ docs/lib/examples/AlertLink.js | 35 +++++++++++++++++++++++++++++++ 4 files changed, 102 insertions(+), 6 deletions(-) create mode 100644 docs/lib/examples/AlertContent.js create mode 100644 docs/lib/examples/AlertLink.js diff --git a/docs/lib/Components/AlertsPage.js b/docs/lib/Components/AlertsPage.js index aca94d71d..04847be5e 100644 --- a/docs/lib/Components/AlertsPage.js +++ b/docs/lib/Components/AlertsPage.js @@ -7,6 +7,12 @@ import Helmet from 'react-helmet'; import AlertExample from '../examples/Alert'; const AlertExampleSource = require('!!raw!../examples/Alert'); +import AlertLinkExample from '../examples/AlertLink'; +const AlertLinkExampleSource = require('!!raw!../examples/AlertLink'); + +import AlertContentExample from '../examples/AlertContent'; +const AlertContentExampleSource = require('!!raw!../examples/AlertContent'); + import AlertDismissExample from '../examples/AlertDismiss'; const AlertDismissExampleSource = require('!!raw!../examples/AlertDismiss'); @@ -48,6 +54,26 @@ export default class AlertsPage extends React.Component { +

    Link color

    +
    + +
    +
    +          
    +            {AlertLinkExampleSource}
    +          
    +        
    + +

    Additional content

    +
    + +
    +
    +          
    +            {AlertContentExampleSource}
    +          
    +        
    +

    Dismissing

    diff --git a/docs/lib/examples/Alert.js b/docs/lib/examples/Alert.js index 315db74c6..150acd65e 100644 --- a/docs/lib/examples/Alert.js +++ b/docs/lib/examples/Alert.js @@ -4,17 +4,29 @@ import { Alert } from 'reactstrap'; const Example = (props) => { return (
    + + This is a primary alert — check it out! + + + This is a secondary alert — check it out! + - Well done! You successfully read this important alert message. + This is a success alert — check it out! - - Heads up! This alert needs your attention, but it's not super important. + + This is a danger alert — check it out! - Warning! Better check yourself, you're not looking too good. + This is a warning alert — check it out! - - Oh snap! Change a few things up and try submitting again. + + This is a info alert — check it out! + + + This is a light alert — check it out! + + + This is a dark alert — check it out!
    ); diff --git a/docs/lib/examples/AlertContent.js b/docs/lib/examples/AlertContent.js new file mode 100644 index 000000000..8b3256468 --- /dev/null +++ b/docs/lib/examples/AlertContent.js @@ -0,0 +1,23 @@ +import React from 'react'; +import { Alert } from 'reactstrap'; + +const Example = (props) => { + return ( +
    + +

    Well done!

    +

    + Aww yeah, you successfully read this important alert message. This example text is going + to run a bit longer so that you can see how spacing within an alert works with this kind + of content. +

    +
    +

    + Whenever you need to, be sure to use margin utilities to keep things nice and tidy. +

    +
    +
    + ); +}; + +export default Example; diff --git a/docs/lib/examples/AlertLink.js b/docs/lib/examples/AlertLink.js new file mode 100644 index 000000000..6395bfe03 --- /dev/null +++ b/docs/lib/examples/AlertLink.js @@ -0,0 +1,35 @@ +import React from 'react'; +import { Alert } from 'reactstrap'; + +const Example = (props) => { + return ( +
    + + This is a primary alert with an example link. Give it a click if you like. + + + This is a secondary alert with an example link. Give it a click if you like. + + + This is a success alert with an example link. Give it a click if you like. + + + This is a danger alert with an example link. Give it a click if you like. + + + This is a warning alert with an example link. Give it a click if you like. + + + This is a info alert with an example link. Give it a click if you like. + + + This is a light alert with an example link. Give it a click if you like. + + + This is a dark alert with an example link. Give it a click if you like. + +
    + ); +}; + +export default Example; From db245a744e54c294cfa05c3b32a8971280735a7b Mon Sep 17 00:00:00 2001 From: Marek Takac Date: Wed, 13 Sep 2017 19:49:35 +0200 Subject: [PATCH 039/862] docs(Badge) update and fix docs (#538) Remove default badge and update documentation so it's closer to bootstrap v4 beta docs --- docs/lib/Components/BadgePage.js | 14 +++++++++++++- docs/lib/examples/Badge.js | 12 ++++++------ docs/lib/examples/BadgeButton.js | 14 ++++++++++++++ docs/lib/examples/BadgePills.js | 14 ++++++++------ docs/lib/examples/BadgeVariations.js | 14 ++++++++------ 5 files changed, 49 insertions(+), 19 deletions(-) create mode 100644 docs/lib/examples/BadgeButton.js diff --git a/docs/lib/Components/BadgePage.js b/docs/lib/Components/BadgePage.js index 546b1fe04..c657b1594 100644 --- a/docs/lib/Components/BadgePage.js +++ b/docs/lib/Components/BadgePage.js @@ -6,6 +6,9 @@ import Helmet from 'react-helmet'; import BadgeExample from '../examples/Badge'; const BadgeExampleSource = require('!!raw!../examples/Badge'); +import BadgeButtonExample from '../examples/BadgeButton'; +const BadgeButtonExampleSource = require('!!raw!../examples/BadgeButton'); + import BadgePillsExample from '../examples/BadgePills'; const BadgePillsExampleSource = require('!!raw!../examples/BadgePills'); @@ -28,7 +31,16 @@ export default class BadgesPage extends React.Component { {BadgeExampleSource} -

    Variations

    +

    Badges can be used as part of links or buttons to provide a counter.

    +
    + +
    +
    +          
    +            {BadgeButtonExampleSource}
    +          
    +        
    +

    Contextual variations

    diff --git a/docs/lib/examples/Badge.js b/docs/lib/examples/Badge.js index 4ca43030d..42291144f 100644 --- a/docs/lib/examples/Badge.js +++ b/docs/lib/examples/Badge.js @@ -5,12 +5,12 @@ export default class Example extends React.Component { render() { return (
    -

    Heading New

    -

    Heading New

    -

    Heading New

    -

    Heading New

    -
    Heading New
    -
    Heading New
    +

    Heading New

    +

    Heading New

    +

    Heading New

    +

    Heading New

    +
    Heading New
    +
    Heading New
    ); } diff --git a/docs/lib/examples/BadgeButton.js b/docs/lib/examples/BadgeButton.js new file mode 100644 index 000000000..acb221765 --- /dev/null +++ b/docs/lib/examples/BadgeButton.js @@ -0,0 +1,14 @@ +import React from 'react'; +import { Badge, Button } from 'reactstrap'; + +export default class Example extends React.Component { + render() { + return ( +
    + +
    + ); + } +} diff --git a/docs/lib/examples/BadgePills.js b/docs/lib/examples/BadgePills.js index f1b0deec5..ed559cddd 100644 --- a/docs/lib/examples/BadgePills.js +++ b/docs/lib/examples/BadgePills.js @@ -5,12 +5,14 @@ export default class Example extends React.Component { render() { return (
    - default{' '} - primary{' '} - success{' '} - info{' '} - warning{' '} - danger + Primary + Secondary + Success + Danger + Warning + Info + Light + Dark
    ); } diff --git a/docs/lib/examples/BadgeVariations.js b/docs/lib/examples/BadgeVariations.js index 74bc451be..313a06be2 100644 --- a/docs/lib/examples/BadgeVariations.js +++ b/docs/lib/examples/BadgeVariations.js @@ -5,12 +5,14 @@ export default class Example extends React.Component { render() { return (
    - default - primary - success - info - warning - danger + Primary + Secondary + Success + Danger + Warning + Info + Light + Dark
    ); } From e8737a532732ec2e0e281bdb519ef46075a83867 Mon Sep 17 00:00:00 2001 From: Alex Mikhalev Date: Fri, 15 Sep 2017 21:07:11 -0600 Subject: [PATCH 040/862] feat(transitions) update react transition group (#557) * Updated rollup and webpack configs Removed global 'react-transition-group' from both rollup and webpack configs * Updated Alert for react-transition-group@2.x Also updated props related to transitions in order to better match updated react-transition-group props * Updated AlertPage.js docs for new transition props * Fixed Alert tests for new transition props * Fixed lint issues related to Alert changes * Almost fixed Fade and Modal to work with react-transition-group@2.x * Fixed Modal exit transition * Fixed lint issues * Fixed Fade test * Fixed Modal test; removed use of setImmediate * Fixed Modal.spec.js formatting * Updated install docs to remove react-transition-group * Updated modal documentation * Almost got carousel to work * Fixed fade props passing * Changed the way Carousel works; still not quite fixed * More attempts at fixing Carousel * Changed Alert to use Fade * Fixed all react-transition-group imports to not cherry pick * Now modal is broken :/ Fixing this * Some mork work * Changed Transition uses to use constants instead of strings * Made Carousel work! Plus added Carousel slide prop * Minor change to Fade test * Removed debug logging from CarouselItem * Fixed Modal and siplified logic * Extracted transition timeouts to utils * Simplified CarouselItem transition logic * Removed unnecessary noop props (they exist in Transition.defaultProps) * Removed CarouselItem status field * Added docs for Fade This meant adding FadePage, plus adding to routes and navigation. I also updated prism to add the autolinker plugin to enable links in the docs for proptypes * Updated Alert and Modal docs to point to Fade docs * Added mountOnEnter for Modal backdrop * Updated carousel proptypes doc * Fixed eslint issues * Updated Collapse to use Transition * Removed confusing callbacks from Modal. The callbacks on modalTransition can be used instead * Updated react-transition-group in package.json * Fixed collapse tests * Fixed eslint issues * Fixed Collapse callback issue, updated test, updated examples * Updated Collapse Docs * Added some Alert tests * Updated Collapse and Collapse tests * Updated Carousel tests * Updated Fade tests * Fixed modal tests --- README.md | 3 +- docs/lib/Components/AlertsPage.js | 8 +- docs/lib/Components/CarouselPage.js | 27 +- docs/lib/Components/CollapsePage.js | 22 +- docs/lib/Components/FadePage.js | 77 + docs/lib/Components/ModalsPage.js | 24 +- docs/lib/Components/index.js | 4 + docs/lib/examples/CollapseEvents.js | 35 +- docs/lib/examples/Fade.js | 27 + docs/lib/examples/ModalCustomTimeout.js | 3 +- docs/lib/examples/NavbarToggler.js | 6 +- docs/lib/routes.js | 2 + docs/static/docs.css | 232 +- docs/static/prism.js | 17 +- package.json | 5 +- rollup.config.js | 1 - src/Alert.js | 61 +- src/Carousel.js | 56 +- src/CarouselItem.js | 134 +- src/Collapse.js | 204 +- src/Fade.js | 155 +- src/Modal.js | 161 +- src/__tests__/Alert.spec.js | 80 +- src/__tests__/Carousel.spec.js | 143 +- src/__tests__/Collapse.spec.js | 190 +- src/__tests__/Fade.spec.js | 36 +- src/__tests__/Modal.spec.js | 12 +- src/utils.js | 11 + webpack.base.config.js | 7 - yarn.lock | 3490 ++++++++++++++++------- 30 files changed, 3302 insertions(+), 1931 deletions(-) create mode 100644 docs/lib/Components/FadePage.js create mode 100644 docs/lib/examples/Fade.js diff --git a/README.md b/README.md index bb21835f5..bb13e841f 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Install reactstrap and Bootstrap from NPM. Reactstrap does not include Bootstrap ``` npm install --save bootstrap@4.0.0-alpha.6 -npm install --save reactstrap react-transition-group@^1.1.2 react@^15.3.0 react-dom@^15.3.0 +npm install --save reactstrap react@^15.3.0 react-dom@^15.3.0 ``` Import Bootstrap CSS in the ```src/index.js``` file: @@ -55,7 +55,6 @@ https://cdnjs.cloudflare.com/ajax/libs/reactstrap/4.8.0/reactstrap.min.js > Note: When using the external CDN library, be sure to include the required dependencies as necessary **prior** to the Reactstrap library: > * [React](https://cdnjs.com/libraries/react) -> * [ReactTransitionGroup](https://unpkg.com/react-transition-group/dist/react-transition-group.min.js) ## About the Project diff --git a/docs/lib/Components/AlertsPage.js b/docs/lib/Components/AlertsPage.js index 04847be5e..52096ebf1 100644 --- a/docs/lib/Components/AlertsPage.js +++ b/docs/lib/Components/AlertsPage.js @@ -45,11 +45,9 @@ export default class AlertsPage extends React.Component { isOpen: PropTypes.bool, // default: true toggle: PropTypes.func, tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]), - - // Set any of the timeouts to 0 to disable animation - transitionAppearTimeout: PropTypes.number, - transitionEnterTimeout: PropTypes.number, - transitionLeaveTimeout: PropTypes.number + // Controls the transition of the alert fading in and out + // See [Fade](/components/fade/) for more details + transition: PropTypes.shape(Fade.propTypes), }`} diff --git a/docs/lib/Components/CarouselPage.js b/docs/lib/Components/CarouselPage.js index 44812b586..3da5ad505 100644 --- a/docs/lib/Components/CarouselPage.js +++ b/docs/lib/Components/CarouselPage.js @@ -25,17 +25,30 @@ export default class CarouselPage extends React.Component {
               
     {`Carousel.propTypes = {
    -  items: PropTypes.array.isRequired,
    -  cssModule: PropTypes.object,
    +  // the current active slide of the carousel
       activeIndex: PropTypes.number,
    -  cycle: PropTypes.bool,
    -  wrap: PropTypes.bool,
    +  // a function which should advance the carousel to the next slide (via activeIndex)
    +  next: PropTypes.func.isRequired,
    +  // a function which should advance the carousel to the previous slide (via activeIndex)
    +  previous: PropTypes.func.isRequired,
    +  // controls if the left and right arrow keys should control the carousel
    +  keyboard: PropTypes.bool,
    +  // controls if the carousel should not automatically cycle (default: false)
    +  paused: PropTypes.bool,
    +  // the interval at which the carousel automatically cycles (default: 5000) 
       interval: PropTypes.oneOfType([
         PropTypes.number,
    -    PropTypes.bool
    +    PropTypes.string,
    +    PropTypes.bool,
       ]),
    -  keyboard: PropTypes.bool,
    -  hover: PropTypes.string
    +  children: PropTypes.array,
    +  // called when the mouse enters the Carousel
    +  hoverStart: PropTypes.func,
    +  // called when the mouse exits the Carousel
    +  hoverEnd: PropTypes.func,
    +  // controls whether the slide animation on the Carousel works or not
    +  slide: PropTypes.bool,
    +  cssModule: PropTypes.object,
     };`}
               
             
    diff --git a/docs/lib/Components/CollapsePage.js b/docs/lib/Components/CollapsePage.js index 874a29142..fe81aa877 100644 --- a/docs/lib/Components/CollapsePage.js +++ b/docs/lib/Components/CollapsePage.js @@ -28,22 +28,26 @@ export default class CollapsePage extends React.Component {

    Properties

               
    -{`Collapse.propTypes = {
    +            {`Collapse.propTypes = {
    +  ...Transition.propTypes,
       isOpen: PropTypes.bool,
    +  children: PropTypes.oneOfType([
    +    PropTypes.arrayOf(PropTypes.node),
    +    PropTypes.node
    +  ]),
    +  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),
       className: PropTypes.node,
       navbar: PropTypes.bool,
    -  delay: PropTypes.oneOfType([
    -    PropTypes.shape({ show: PropTypes.number, hide: PropTypes.number }),
    -    PropTypes.number
    -  ]), // optionally override show/hide delays - default { show: 350, hide: 350 }
    -  onOpened: PropTypes.func,
    -  onClosed: PropTypes.func,
    -}`}
    +  cssModule: PropTypes.object,
    +};`}
               
             

    Events

    -

    Use the onOpened and onClosed props for callbacks when the Collapse has finished opening or closing.

    +

    + Use the onEnter, onEntering, onEntered, onExit, onExiting and onExited props for callbacks when the + Collapse has finished opening (entering) or closing (exiting). +

    diff --git a/docs/lib/Components/FadePage.js b/docs/lib/Components/FadePage.js new file mode 100644 index 000000000..4b99c5d57 --- /dev/null +++ b/docs/lib/Components/FadePage.js @@ -0,0 +1,77 @@ +/* eslint react/no-multi-comp: 0, react/prop-types: 0 */ +import React from 'react'; +import { PrismCode } from 'react-prism'; +import { Alert } from 'reactstrap'; +import Helmet from 'react-helmet'; + +import FadeExample from '../examples/Fade'; +const FadeExampleSource = require('!!raw!../examples/Fade'); + +export default class FadePage extends React.Component { + render() { + return ( +
    + + +

    Fade

    +
    + +
    +
    +          
    +            {FadeExampleSource}
    +          
    +        
    + +

    Properties

    +
    +          
    +{`Fade.propTypes = {
    +    // Controls if the fade is currently showing or not (default: true)
    +    in: PropTypes.bool, 
    +
    +    // All of these match [react-transition-group/Transition](https://reactcommunity.org/react-transition-group/#Transition) props
    +    mountOnEnter: PropTypes.bool,
    +    unmountOnExit: PropTypes.bool,
    +    appear: PropTypes.bool, // (default: true)
    +    enter: PropTypes.bool,  // (default: true)
    +    exit: PropTypes.bool,   // (default: true)
    +    timeout: PropTypes.oneOfType([ // (default: 150)
    +        PropTypes.number,
    +        PropTypes.shape({
    +            enter: PropTypes.number,
    +            exit: PropTypes.number,
    +        }).isRequired,
    +    ]),
    +    addEndListener: PropTypes.func,
    +    onEnter: PropTypes.func,
    +    onEntering: PropTypes.func,
    +    onEntered: PropTypes.func,
    +    onExit: PropTypes.func,
    +    onExiting: PropTypes.func,
    +    onExited: PropTypes.func,
    +
    +    // The component(s) that should be faded
    +    children: PropTypes.oneOfType([
    +        PropTypes.arrayOf(PropTypes.node),
    +        PropTypes.node
    +    ]),
    +    // Pass in a component or primitive component name to override the default element
    +    // (default: 'div')
    +    tag: PropTypes.oneOfType([PropTypes.string, PropTypes.func]),
    +    // Class always applied to the Fade element (default: 'fade')
    +    baseClass: PropTypes.string,
    +    // Class applied to transition the Fade element in (default: 'show')
    +    baseClassActive: PropTypes.string,
    +    // Other classes that should always be applied
    +    className: PropTypes.string,
    +    cssModule: PropTypes.object,
    +
    +    // Any other props provided will be applied to the element created (specified by tag)
    +}`}
    +          
    +        
    +
    + ); + } +} diff --git a/docs/lib/Components/ModalsPage.js b/docs/lib/Components/ModalsPage.js index 343742976..1a7591c37 100644 --- a/docs/lib/Components/ModalsPage.js +++ b/docs/lib/Components/ModalsPage.js @@ -64,7 +64,9 @@ export default class ModalsPage extends React.Component { onEnter: PropTypes.func, // called on componentWillUnmount onExit: PropTypes.func, + // called when done transitioning in onOpened: PropTypes.func, + // called when done transitioning out onClosed: PropTypes.func, className: PropTypes.string, wrapClassName: PropTypes.string, @@ -79,20 +81,14 @@ export default class ModalsPage extends React.Component { PropTypes.number, PropTypes.string, ]), - // backdropTransitionTimeout - controls appear, enter, and leave (default: 150) - // If you need different values for appear v. enter v. leave, use the more - // specific props like backdropTransitionAppearTimeout. - backdropTransitionTimeout: PropTypes.number - backdropTransitionAppearTimeout: PropTypes.number, - backdropTransitionEnterTimeout: PropTypes.number, - backdropTransitionLeaveTimeout: PropTypes.number, - // modalTransitionTimeout - controls appear, enter, and leave (default: 300) - // If you need different values for appear v. enter v. leave, use the more - // specific props like modalTransitionAppearTimeout. - modalTransitionTimeout: PropTypes.number, - modalTransitionAppearTimeout: PropTypes.number, - modalTransitionEnterTimeout: PropTypes.number, - modalTransitionLeaveTimeout: PropTypes.number, + // backdropTransition - controls backdrop transition + // timeout is 150ms by default to match bootstrap + // see [Fade](/components/fade/) for more details + backdropTransition: PropTypes.shape(Fade.propTypes), + // modalTransition - controls modal transition + // timeout is 300ms by default to match bootstrap + // see [Fade](/components/fade/) for more details + modalTransition: PropTypes.shape(Fade.propTypes), }`} diff --git a/docs/lib/Components/index.js b/docs/lib/Components/index.js index 9486678d0..e7a889b6c 100644 --- a/docs/lib/Components/index.js +++ b/docs/lib/Components/index.js @@ -62,6 +62,10 @@ class Components extends React.Component { name: 'Dropdowns', to: '/components/dropdowns/' }, + { + name: 'Fade', + to: '/components/fade/' + }, { name: 'Form', to: '/components/form/' diff --git a/docs/lib/examples/CollapseEvents.js b/docs/lib/examples/CollapseEvents.js index d42229c9f..2c2c03cf5 100644 --- a/docs/lib/examples/CollapseEvents.js +++ b/docs/lib/examples/CollapseEvents.js @@ -4,23 +4,32 @@ import { Collapse, Button, CardBody, Card } from 'reactstrap'; class Example extends Component { constructor(props) { super(props); - this.onOpened = this.onOpened.bind(this); - this.onClosed = this.onClosed.bind(this); + this.onEntering = this.onEntering.bind(this); + this.onEntered = this.onEntered.bind(this); + this.onExiting = this.onExiting.bind(this); + this.onExited = this.onExited.bind(this); this.toggle = this.toggle.bind(this); this.state = { collapse: false, status: 'Closed' }; } - onOpened() { - this.setState({ ...this.state, status: 'Opened' }); + onEntering() { + this.setState({ status: 'Opening...' }); } - onClosed() { - this.setState({ ...this.state, status: 'Closed' }); + onEntered() { + this.setState({ status: 'Opened' }); + } + + onExiting() { + this.setState({ status: 'Closing...' }); + } + + onExited() { + this.setState({ status: 'Closed' }); } toggle() { - const status = !this.state.collapse ? 'Opening...' : 'Closing...'; - this.setState({ collapse: !this.state.collapse, status }); + this.setState({ collapse: !this.state.collapse }); } render() { @@ -28,10 +37,16 @@ class Example extends Component {
    Current state: {this.state.status}
    - + - Anim pariatur cliche reprehenderit, + Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. diff --git a/docs/lib/examples/Fade.js b/docs/lib/examples/Fade.js new file mode 100644 index 000000000..162de7828 --- /dev/null +++ b/docs/lib/examples/Fade.js @@ -0,0 +1,27 @@ +import React from 'react'; +import { Button, Fade } from 'reactstrap'; + +export default class Example extends React.Component { + constructor(props) { + super(props); + this.state = { fadeIn: true }; + this.toggle = this.toggle.bind(this); + } + + render() { + return ( +
    + + + This content will fade in and out as the button is pressed + +
    + ); + } + + toggle() { + this.setState({ + fadeIn: !this.state.fadeIn + }); + } +}; diff --git a/docs/lib/examples/ModalCustomTimeout.js b/docs/lib/examples/ModalCustomTimeout.js index 7664e9af5..c019208fa 100644 --- a/docs/lib/examples/ModalCustomTimeout.js +++ b/docs/lib/examples/ModalCustomTimeout.js @@ -23,7 +23,8 @@ class ModalExample extends React.Component { return (
    - + Modal title Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. diff --git a/docs/lib/examples/NavbarToggler.js b/docs/lib/examples/NavbarToggler.js index d3287987c..5d06fd230 100644 --- a/docs/lib/examples/NavbarToggler.js +++ b/docs/lib/examples/NavbarToggler.js @@ -20,9 +20,9 @@ export default class Example extends React.Component { return (
    - - - reactstrap + + reactstrap +
    @@ -127,27 +136,38 @@ class Carousel extends React.Component { } Carousel.propTypes = { - paused: PropTypes.bool, + // the current active slide of the carousel + activeIndex: PropTypes.number, + // a function which should advance the carousel to the next slide (via activeIndex) next: PropTypes.func.isRequired, + // a function which should advance the carousel to the previous slide (via activeIndex) previous: PropTypes.func.isRequired, + // controls if the left and right arrow keys should control the carousel keyboard: PropTypes.bool, - cssModule: PropTypes.object, - activeIndex: PropTypes.number, + // controls if the carousel should not automatically cycle (default: false) + paused: PropTypes.bool, + // the interval at which the carousel automatically cycles (default: 5000) interval: PropTypes.oneOfType([ PropTypes.number, PropTypes.string, - PropTypes.bool + PropTypes.bool, ]), children: PropTypes.array, + // called when the mouse enters the Carousel hoverStart: PropTypes.func, - hoverEnd: PropTypes.func + // called when the mouse exits the Carousel + hoverEnd: PropTypes.func, + // controls whether the slide animation on the Carousel works or not + slide: PropTypes.bool, + cssModule: PropTypes.object, }; Carousel.defaultProps = { interval: 5000, hover: false, paused: false, - keyboard: true + keyboard: true, + slide: true, }; Carousel.childContextTypes = { diff --git a/src/CarouselItem.js b/src/CarouselItem.js index b03318de2..ff194b328 100644 --- a/src/CarouselItem.js +++ b/src/CarouselItem.js @@ -1,97 +1,115 @@ import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; -import { mapToCssModules } from './utils'; +import Transition, { ENTERING, ENTERED, EXITING } from 'react-transition-group/Transition'; +import { mapToCssModules, TransitionTimeouts } from './utils'; import CarouselCaption from './CarouselCaption'; class CarouselItem extends React.Component { constructor(props) { super(props); - this.state = { animation: [] }; - } - componentWillUnmount() { - clearTimeout(this.willEnterTimeout); - clearTimeout(this.willLeaveTimeout); - } + this.state = { + startAnimation: false, + }; - componentWillAppear(callBack) { - this.setState({ - animation: ['active'] - }); - callBack(); + this.onEnter = this.onEnter.bind(this); + this.onEntering = this.onEntering.bind(this); + this.onExit = this.onExit.bind(this); + this.onExiting = this.onExiting.bind(this); + this.onExited = this.onExited.bind(this); } - componentWillEnter(callBack) { - const classes = this.context.direction === 'right' ? - ['carousel-item-next', 'carousel-item-left'] : - ['carousel-item-prev', 'carousel-item-right']; - this.setState({ - animation: classes - }); - - this.willEnterTimeout = setTimeout(() => { - callBack(); - }, 500); + onEnter(node, isAppearing) { + this.setState({ startAnimation: false }); + this.props.onEnter(node, isAppearing); } - componentDidEnter() { - this.setState({ - animation: ['active'] - }); + onEntering(node, isAppearing) { + // getting this variable triggers a reflow + const _unused = node.offsetHeight; // eslint-disable-line no-unused-vars + this.setState({ startAnimation: true }); + this.props.onEntering(node, isAppearing); } - componentWillLeave(callBack) { - const classes = this.context.direction === 'right' ? - ['carousel-item-left', 'active'] : - ['carousel-item-right', 'active']; - this.setState({ - animation: classes - }); - - this.slide.dispatchEvent(new CustomEvent('slide.bs.carousel')); - - this.willLeaveTimeout = setTimeout(() => { - callBack(); - }, 500); + onExit(node) { + this.setState({ startAnimation: false }); + this.props.onExit(node); } - componentDidLeave() { - this.setState({ - animation: [] - }); - this.slide.dispatchEvent(new CustomEvent('slid.bs.carousel')); + onExiting(node) { + this.setState({ startAnimation: true }); + node.dispatchEvent(new CustomEvent('slide.bs.carousel')); + this.props.onExiting(node); } + onExited(node) { + node.dispatchEvent(new CustomEvent('slid.bs.carousel')); + this.props.onExited(node); + } render() { - const { src, altText, children, cssModule } = this.props; - const classes = mapToCssModules(classNames( + const { src, altText, in: isIn, children, cssModule, slide, ...transitionProps } = this.props; + const imgClasses = mapToCssModules(classNames( 'd-block', 'img-fluid' ), cssModule); - const itemClasses = mapToCssModules(classNames('carousel-item', ...this.state.animation), cssModule); - return ( -
    { - this.slide = slide; - }} + - {altText} - {children} -
    + {(status) => { + const { direction } = this.context; + const isActive = (status === ENTERED) || (status === EXITING); + const directionClassName = (status === ENTERING || status === EXITING) && + this.state.startAnimation && + (direction === 'right' ? 'carousel-item-left' : 'carousel-item-right'); + const orderClassName = (status === ENTERING) && + (direction === 'right' ? 'carousel-item-next' : 'carousel-item-prev'); + const itemClasses = mapToCssModules(classNames( + 'carousel-item', + isActive && 'active', + directionClassName, + orderClassName, + ), cssModule); + + return ( +
    + {altText} + {children} +
    + ); + }} + ); } } CarouselItem.propTypes = { + ...Transition.propTypes, + in: PropTypes.bool, src: PropTypes.string.isRequired, altText: PropTypes.string, cssModule: PropTypes.object, - children: PropTypes.instanceOf(CarouselCaption) + children: PropTypes.shape({ + type: PropTypes.oneOf([CarouselCaption]), + }), + slide: PropTypes.bool, +}; + +CarouselItem.defaultProps = { + ...Transition.defaultProps, + timeout: TransitionTimeouts.Carousel, + slide: true, }; CarouselItem.contextTypes = { diff --git a/src/Collapse.js b/src/Collapse.js index 039bf9ad9..4b9ff7c07 100644 --- a/src/Collapse.js +++ b/src/Collapse.js @@ -1,159 +1,131 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; -import { mapToCssModules, omit } from './utils'; - -const SHOW = 'SHOW'; -const SHOWN = 'SHOWN'; -const HIDE = 'HIDE'; -const HIDDEN = 'HIDDEN'; +import Transition, { EXITED, ENTERING, ENTERED, EXITING } from 'react-transition-group/Transition'; +import { mapToCssModules, omit, TransitionTimeouts } from './utils'; const propTypes = { + ...Transition.propTypes, isOpen: PropTypes.bool, - className: PropTypes.node, + children: PropTypes.oneOfType([ + PropTypes.arrayOf(PropTypes.node), + PropTypes.node + ]), tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]), - cssModule: PropTypes.object, + className: PropTypes.node, navbar: PropTypes.bool, - delay: PropTypes.oneOfType([ - PropTypes.shape({ show: PropTypes.number, hide: PropTypes.number }), - PropTypes.number, - ]), - onOpened: PropTypes.func, - onClosed: PropTypes.func, -}; - -const DEFAULT_DELAYS = { - show: 350, - hide: 350 + cssModule: PropTypes.object, }; const defaultProps = { + ...Transition.defaultProps, isOpen: false, + appear: false, + enter: true, + exit: true, tag: 'div', - delay: DEFAULT_DELAYS, - onOpened: () => {}, - onClosed: () => {}, + timeout: TransitionTimeouts.Collapse, }; +function getTransitionClass(status) { + if (status === ENTERING) { + return 'collapsing'; + } else if (status === ENTERED) { + return 'collapse show'; + } else if (status === EXITING) { + return 'collapsing'; + } else if (status === EXITED) { + return 'collapse'; + } + return 'collapse'; +} + +function getHeight(node) { + return node.scrollHeight; +} + class Collapse extends Component { constructor(props) { super(props); this.state = { - collapse: props.isOpen ? SHOWN : HIDDEN, height: null }; - this.element = null; - } - componentWillReceiveProps(nextProps) { - const willOpen = nextProps.isOpen; - const collapse = this.state.collapse; - - if (willOpen && collapse === HIDDEN) { - // will open - this.setState({ collapse: SHOW }, () => { - // the height transition will work after class "collapsing" applied - this.setState({ height: this.getHeight() }); - this.transitionTag = setTimeout(() => { - this.setState({ - collapse: SHOWN, - height: null - }); - }, this.getDelay('show')); - }); - } else if (!willOpen && collapse === SHOWN) { - // will hide - this.setState({ height: this.getHeight() }, () => { - this.setState({ - collapse: HIDE, - height: this.getHeight() - }, () => { - this.setState({ height: 0 }); - }); - }); - - this.transitionTag = setTimeout(() => { - this.setState({ - collapse: HIDDEN, - height: null - }); - }, this.getDelay('hide')); - } - // else: do nothing. + ['onEntering', 'onEntered', 'onExit', 'onExiting', 'onExited'].forEach((name) => { + this[name] = this[name].bind(this); + }); } - componentDidUpdate(prevProps, prevState) { - if (this.state.collapse === SHOWN && - prevState && - prevState.collapse !== SHOWN) { - this.props.onOpened(); - } + onEntering(node, isAppearing) { + this.setState({ height: getHeight(node) }); + this.props.onEntering(node, isAppearing); + } - if (this.state.collapse === HIDDEN && - prevState && - prevState.collapse !== HIDDEN) { - this.props.onClosed(); - } + onEntered(node, isAppearing) { + this.setState({ height: null }); + this.props.onEntered(node, isAppearing); } - componentWillUnmount() { - clearTimeout(this.transitionTag); + onExit(node) { + this.setState({ height: getHeight(node) }); + this.props.onExit(node); } - getDelay(key) { - const { delay } = this.props; - if (typeof delay === 'object') { - return isNaN(delay[key]) ? DEFAULT_DELAYS[key] : delay[key]; - } - return delay; + onExiting(node) { + // getting this variable triggers a reflow + const _unused = node.offsetHeight; // eslint-disable-line no-unused-vars + this.setState({ height: 0 }); + this.props.onExiting(node); } - getHeight() { - return this.element.scrollHeight; + onExited(node) { + this.setState({ height: null }); + this.props.onExited(node); } render() { const { - navbar, + tag: Tag, + isOpen, className, + navbar, cssModule, - tag: Tag, - ...attributes - } = omit(this.props, ['isOpen', 'delay', 'onOpened', 'onClosed']); - const { collapse, height } = this.state; - let collapseClass; - switch (collapse) { - case SHOW: - collapseClass = 'collapsing'; - break; - case SHOWN: - collapseClass = 'collapse show'; - break; - case HIDE: - collapseClass = 'collapsing'; - break; - case HIDDEN: - collapseClass = 'collapse'; - break; - default: - // HIDDEN - collapseClass = 'collapse'; - } + children, + ...transitionProps + } = this.props; + const otherProps = omit(transitionProps, Object.keys(propTypes)); + const { height } = this.state; - const classes = mapToCssModules(classNames( - className, - collapseClass, - navbar && 'navbar-collapse' - ), cssModule); - const style = height === null ? null : { height }; return ( - { this.element = c; }} - /> + + {(status) => { + let collapseClass = getTransitionClass(status); + const classes = mapToCssModules(classNames( + className, + collapseClass, + navbar && 'navbar-collapse' + ), cssModule); + const style = height === null ? null : { height }; + return ( + + {children} + + ); + }} + ); } } diff --git a/src/Fade.js b/src/Fade.js index 9d4360dae..d5f4318b5 100644 --- a/src/Fade.js +++ b/src/Fade.js @@ -1,128 +1,63 @@ import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; -import { mapToCssModules, omit } from './utils'; +import Transition, { ENTERING, ENTERED } from 'react-transition-group/Transition'; +import { mapToCssModules, omit, TransitionTimeouts } from './utils'; const propTypes = { + ...Transition.propTypes, + children: PropTypes.oneOfType([ + PropTypes.arrayOf(PropTypes.node), + PropTypes.node + ]), + tag: PropTypes.oneOfType([PropTypes.string, PropTypes.func]), baseClass: PropTypes.string, - baseClassIn: PropTypes.string, - tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]), + baseClassActive: PropTypes.string, className: PropTypes.string, cssModule: PropTypes.object, - transitionAppearTimeout: PropTypes.number, - transitionEnterTimeout: PropTypes.number, - transitionLeaveTimeout: PropTypes.number, - transitionAppear: PropTypes.bool, - transitionEnter: PropTypes.bool, - transitionLeave: PropTypes.bool, - onLeave: PropTypes.func, - onEnter: PropTypes.func, }; const defaultProps = { + ...Transition.defaultProps, tag: 'div', baseClass: 'fade', - baseClassIn: 'show', - transitionAppearTimeout: 0, - transitionEnterTimeout: 0, - transitionLeaveTimeout: 0, - transitionAppear: true, - transitionEnter: true, - transitionLeave: true + baseClassActive: 'show', + timeout: TransitionTimeouts.Fade, + appear: true, + enter: true, + exit: true, + in: true, }; -class Fade extends React.Component { - constructor(props) { - super(props); - - this.state = { - mounted: !props.transitionAppear, - }; - - this.onLeave = this.onLeave.bind(this); - this.onEnter = this.onEnter.bind(this); - this.timers = []; - } - - componentWillUnmount() { - this.timers.forEach(timer => clearTimeout(timer)); - } - onEnter(cb) { - return () => { - cb(); - if (this.props.onEnter) { - this.props.onEnter(); - } - }; - } - onLeave(cb) { - return () => { - cb(); - if (this.props.onLeave) { - this.props.onLeave(); - } - }; - } - - componentWillAppear(cb) { - if (!this.props.transitionAppear) { - this.onEnter(cb)(); - } - - this.timers.push(setTimeout(this.onEnter(cb), this.props.transitionAppearTimeout)); - } - - componentDidAppear() { - this.setState({ - mounted: true - }); - } - - componentWillEnter(cb) { - if (!this.props.transitionEnter) { - this.onEnter(cb)(); - } - - this.timers.push(setTimeout(this.onEnter(cb), this.props.transitionEnterTimeout)); - } - - componentDidEnter() { - this.setState({ - mounted: true - }); - } - - componentWillLeave(cb) { - this.setState({ - mounted: false - }); - - if (!this.props.transitionLeave) { - this.onLeave(cb)(); - } - - this.timers.push(setTimeout(this.onLeave(cb), this.props.transitionLeaveTimeout)); - } - render() { - const { - baseClass, - baseClassIn, - className, - cssModule, - tag: Tag - } = this.props; - const attributes = omit(this.props, Object.keys(propTypes)); - - const classes = mapToCssModules(classNames( - className, - baseClass, - this.state.mounted ? baseClassIn : false - ), cssModule); - - return ( - - ); - } +function Fade(props) { + const { + tag: Tag, + baseClass, + baseClassActive, + className, + cssModule, + children, + ...transitionProps + } = props; + const otherProps = omit(transitionProps, Object.keys(propTypes)); + + return ( + + {(status) => { + const isActive = status === ENTERING || status === ENTERED; + const classes = mapToCssModules(classNames( + className, + baseClass, + isActive ? baseClassActive : false + ), cssModule); + return ( + + {children} + + ); + }} + + ); } Fade.propTypes = propTypes; diff --git a/src/Modal.js b/src/Modal.js index aa38da979..903bb8d26 100644 --- a/src/Modal.js +++ b/src/Modal.js @@ -2,16 +2,20 @@ import React from 'react'; import PropTypes from 'prop-types'; import ReactDOM from 'react-dom'; import classNames from 'classnames'; -import { TransitionGroup } from 'react-transition-group'; import Fade from './Fade'; import { getOriginalBodyPadding, conditionallyUpdateScrollbar, setScrollbarWidth, mapToCssModules, - omit + omit, + TransitionTimeouts } from './utils'; +function noop() { } + +const FadePropTypes = PropTypes.shape(Fade.propTypes); + const propTypes = { isOpen: PropTypes.bool, autoFocus: PropTypes.bool, @@ -40,14 +44,8 @@ const propTypes = { PropTypes.number, PropTypes.string, ]), - backdropTransitionTimeout: PropTypes.number, - backdropTransitionAppearTimeout: PropTypes.number, - backdropTransitionEnterTimeout: PropTypes.number, - backdropTransitionLeaveTimeout: PropTypes.number, - modalTransitionTimeout: PropTypes.number, - modalTransitionAppearTimeout: PropTypes.number, - modalTransitionEnterTimeout: PropTypes.number, - modalTransitionLeaveTimeout: PropTypes.number, + backdropTransition: FadePropTypes, + modalTransition: FadePropTypes, }; const propsToOmit = Object.keys(propTypes); @@ -60,8 +58,15 @@ const defaultProps = { keyboard: true, zIndex: 1050, fade: true, - modalTransitionTimeout: 300, - backdropTransitionTimeout: 150, + onOpened: noop, + onClosed: noop, + modalTransition: { + timeout: TransitionTimeouts.Modal, + }, + backdropTransition: { + mountOnEnter: true, + timeout: TransitionTimeouts.Fade, // uses standard fade transition + }, }; class Modal extends React.Component { @@ -104,17 +109,16 @@ class Modal extends React.Component { } } - onOpened() { - if (this.props.onOpened) { - this.props.onOpened(); - } + onOpened(node, isAppearing) { + this.props.onOpened(); + (this.props.modalTransition.onEntered || noop)(node, isAppearing); } - onClosed() { - this.destroy(); - if (this.props.onClosed) { - this.props.onClosed(); - } + onClosed(node) { + // so all methods get called before it is unmounted + setTimeout(() => this.destroy(), 0); + this.props.onClosed(); + (this.props.modalTransition.onExited || noop)(node); } handleEscape(e) { @@ -133,28 +137,14 @@ class Modal extends React.Component { } } - hasTransition() { - if (this.props.fade === false) { - return false; - } - - return this.props.modalTransitionTimeout > 0; - } - togglePortal() { if (this.props.isOpen) { if (this.props.autoFocus) { this._focus = true; } this.show(); - if (!this.hasTransition()) { - this.onOpened(); - } } else { this.hide(); - if (!this.hasTransition()) { - this.onClosed(); - } } } @@ -245,8 +235,6 @@ class Modal extends React.Component { cssModule, isOpen, backdrop, - modalTransitionTimeout, - backdropTransitionTimeout, role, labelledBy } = this.props; @@ -260,77 +248,38 @@ class Modal extends React.Component { tabIndex: '-1' }; - if (this.hasTransition()) { - return ( - - {isOpen && ( - - {this.renderModalDialog()} - - )} - {isOpen && backdrop && ( - - )} - - ); - } - + const hasTransition = this.props.fade; + const modalTransition = { + ...Fade.defaultProps, + ...this.props.modalTransition, + baseClass: hasTransition ? this.props.modalTransition.baseClass : '', + timeout: hasTransition ? this.props.modalTransition.timeout : 0, + }; + const backdropTransition = { + ...Fade.defaultProps, + ...this.props.backdropTransition, + baseClass: hasTransition ? this.props.backdropTransition.baseClass : '', + timeout: hasTransition ? this.props.backdropTransition.timeout : 0, + }; return (
    - {isOpen && ( -
    - {this.renderModalDialog()} -
    - )} - {isOpen && backdrop && ( -
    - )} + + {this.renderModalDialog()} + +
    ); } diff --git a/src/__tests__/Alert.spec.js b/src/__tests__/Alert.spec.js index f89563cf3..977906ee4 100644 --- a/src/__tests__/Alert.spec.js +++ b/src/__tests__/Alert.spec.js @@ -1,85 +1,83 @@ import React from 'react'; -import { shallow } from 'enzyme'; +import { shallow, mount } from 'enzyme'; import { Alert } from '../'; describe('Alert', () => { it('should render children', () => { - const alert = shallow(Yo!).find('div'); + const alert = mount(Yo!); expect(alert.text()).toBe('Yo!'); }); - it('should transition on appear, enter, and leave using fade', () => { - const alert = shallow(Yo!); - expect(alert.prop('transitionName')).toEqual({ - appear: 'fade', - appearActive: 'show', - enter: 'fade', - enterActive: 'show', - leave: 'fade', - leaveActive: 'out' - }); + it('should pass className down', () => { + const alert = mount(Yo!); + expect(alert.find('.alert').prop('className')).toContain('test-class-name'); + }); + + it('should pass close className down', () => { + function noop() { } + const alert = mount(Yo!); + expect(alert.find('.close').prop('className')).toContain('test-class-name'); + }); + + it('should pass other props down', () => { + const alert = mount(Yo!); + expect(alert.find('.alert').prop('data-testprop')).toContain('testvalue'); }); it('should have default transitionTimeouts', () => { - const alert = shallow(Yo!); - - expect(alert.prop('transitionAppearTimeout')).toBe(150); - expect(alert.prop('transitionAppear')).toBe(true); - expect(alert.prop('transitionEnterTimeout')).toBe(150); - expect(alert.prop('transitionEnter')).toBe(true); - expect(alert.prop('transitionLeaveTimeout')).toBe(150); - expect(alert.prop('transitionLeave')).toBe(true); + const alert = mount(Yo!); + + const transition = alert.find('Transition'); + expect(transition.prop('timeout')).toEqual(150); + expect(transition.prop('appear')).toBe(true); + expect(transition.prop('enter')).toBe(true); + expect(transition.prop('exit')).toBe(true); }); it('should have support configurable transitionTimeouts', () => { - const alert = shallow( - + const alert = mount( + Yo! ); - expect(alert.prop('transitionAppearTimeout')).toBe(0); - expect(alert.prop('transitionAppear')).toBe(false); - expect(alert.prop('transitionEnterTimeout')).toBe(0); - expect(alert.prop('transitionEnter')).toBe(false); - expect(alert.prop('transitionLeaveTimeout')).toBe(0); - expect(alert.prop('transitionLeave')).toBe(false); + const transition = alert.find('Transition'); + expect(transition.prop('timeout')).toEqual(0); + expect(transition.prop('appear')).toBe(false); + expect(transition.prop('enter')).toBe(false); + expect(transition.prop('exit')).toBe(false); }); it('should have "success" as default color', () => { - const alert = shallow(Yo!).find('div'); + const alert = mount(Yo!).find('div'); expect(alert.hasClass('alert-success')).toBe(true); }); it('should accept color prop', () => { - const alert = shallow(Yo!).find('div'); + const alert = mount(Yo!).find('div'); expect(alert.hasClass('alert-warning')).toBe(true); }); it('should use a div tag by default', () => { - const alert = shallow(Yo!).children().first(); - expect(alert.type()).toBe('div'); + const alert = mount(Yo!); + expect(alert.find('div').length).toBe(1); }); it('should be non dismissible by default', () => { - const alert = shallow(Yo!).find('div'); + const alert = mount(Yo!).find('div'); expect(alert.find('button').length).toEqual(0); expect(alert.hasClass('alert-dismissible')).toBe(false); }); it('should show dismiss button if passed toggle', () => { - const alert = shallow( {}}>Yo!).find('div'); + const alert = mount( { }}>Yo!).find('div'); expect(alert.find('button').length).toEqual(1); expect(alert.hasClass('alert-dismissible')).toBe(true); }); it('should support custom tag', () => { - const alert = shallow(Yo!).children().first(); - expect(alert.type()).toBe('p'); + const alert = mount(Yo!); + expect(alert.find('p').length).toBe(1); }); it('should be empty if not isOpen', () => { @@ -96,7 +94,7 @@ describe('Alert', () => { }); it('should render close button with custom aria-label', () => { - const alert = shallow( {}} closeAriaLabel="oseclay">Yo!).find('div'); + const alert = mount( { }} closeAriaLabel="oseclay">Yo!).find('div'); const closeButton = alert.find('button').first(); expect(closeButton.prop('aria-label')).toBe('oseclay'); }); diff --git a/src/__tests__/Carousel.spec.js b/src/__tests__/Carousel.spec.js index f78bfb640..0fd93cf4d 100644 --- a/src/__tests__/Carousel.spec.js +++ b/src/__tests__/Carousel.spec.js @@ -45,69 +45,72 @@ describe('Carousel', () => { }); describe('transitions', () => { - it('should add the appropriate classes when componentWillEnter is fired', () => { - const wrapper = mount(, { context: { direction: 'right' } }); - wrapper.instance().componentWillEnter(); - expect(wrapper.state('animation')).toEqual(['carousel-item-next', 'carousel-item-left']); - wrapper.setContext({ direction: 'left' }); - wrapper.instance().componentWillEnter(); - expect(wrapper.state('animation')).toEqual(['carousel-item-prev', 'carousel-item-right']); + it('should add the appropriate classes when entering right', () => { + const wrapper = mount(, { context: { direction: 'right' } }); + + wrapper.setProps({ in: true }); + expect(wrapper.find('div').prop('className')).toEqual('carousel-item carousel-item-left carousel-item-next'); + jest.runTimersToTime(600); + expect(wrapper.find('div').prop('className')).toEqual('carousel-item active'); + wrapper.setProps({ in: false }); + expect(wrapper.find('div').prop('className')).toEqual('carousel-item active carousel-item-left'); + jest.runTimersToTime(600); + expect(wrapper.find('div').prop('className')).toEqual('carousel-item'); }); - it('should call the callback after 500 when componentWillEnter is called', () => { - const callback = jest.fn(); - const wrapper = mount(, { context: { direction: 'right' } }); - wrapper.instance().componentWillEnter(callback); - jest.runTimersToTime(500); - expect(callback).toHaveBeenCalled(); + it('should add the appropriate classes when entering left', () => { + const wrapper = mount(, { context: { direction: 'left' } }); + + wrapper.setProps({ in: true }); + expect(wrapper.find('div').prop('className')).toEqual('carousel-item carousel-item-right carousel-item-prev'); + jest.runTimersToTime(600); + expect(wrapper.find('div').prop('className')).toEqual('carousel-item active'); + wrapper.setProps({ in: false }); + expect(wrapper.find('div').prop('className')).toEqual('carousel-item active carousel-item-right'); + jest.runTimersToTime(600); + expect(wrapper.find('div').prop('className')).toEqual('carousel-item'); }); - it('should add the appropriate classes when componentDidEnter is fired', () => { - const wrapper = mount(, { context: { direction: 'right' } }); - wrapper.instance().componentDidEnter(); - expect(wrapper.state('animation')).toEqual(['active']); - }); - - it('should add the appropriate classes when componentWillLeave is fired', () => { - const wrapper = mount(, { context: { direction: 'right' } }); - wrapper.instance().componentWillLeave(); - expect(wrapper.state('animation')).toEqual(['carousel-item-left', 'active']); - wrapper.setContext({ direction: 'left' }); - wrapper.instance().componentWillLeave(); - expect(wrapper.state('animation')).toEqual(['carousel-item-right', 'active']); - }); - - it('should call the callback after 500 when componentWillLeave is called', () => { - const callback = jest.fn(); - const wrapper = mount(, { context: { direction: 'right' } }); - wrapper.instance().componentWillLeave(callback); - jest.runTimersToTime(500); - expect(callback).toHaveBeenCalled(); - }); - - it('should add the appropriate classes when componentDidLeave is fired', () => { - const wrapper = mount(, { context: { direction: 'right' } }); - wrapper.instance().componentDidLeave(); - expect(wrapper.state('animation')).toEqual([]); - }); - - it('should add the appropriate classes when componentWillAppear is fired', () => { - const wrapper = mount(, { context: { direction: 'right' } }); - wrapper.instance().componentWillAppear(() => {}); - expect(wrapper.state('animation')).toEqual(['active']); + it('should call all callbacks when transitioning in and out', () => { + const callbacks = { + onEnter: jest.fn(), + onEntering: jest.fn(), + onEntered: jest.fn(), + onExit: jest.fn(), + onExiting: jest.fn(), + onExited: jest.fn(), + }; + const wrapper = mount(); + wrapper.setProps({ in: true }); + expect(callbacks.onEnter).toHaveBeenCalled(); + expect(callbacks.onEntering).toHaveBeenCalled(); + expect(callbacks.onEntered).not.toHaveBeenCalled(); + jest.runTimersToTime(600); + expect(callbacks.onEntered).toHaveBeenCalled(); + expect(callbacks.onExit).not.toHaveBeenCalled(); + + wrapper.setProps({ in: false }); + expect(callbacks.onExit).toHaveBeenCalled(); + expect(callbacks.onExiting).toHaveBeenCalled(); + expect(callbacks.onExited).not.toHaveBeenCalled(); + jest.runTimersToTime(600); + expect(callbacks.onExiting).toHaveBeenCalled(); + expect(callbacks.onExited).toHaveBeenCalled(); + + wrapper.unmount(); }); }); }); describe('indicators', () => { it('should render a list with the right number of items', () => { - const wrapper = mount(); + const wrapper = mount( { }} />); expect(wrapper.find('ol').length).toEqual(1); expect(wrapper.find('li').length).toEqual(3); }); it('should append the correct active class', () => { - const wrapper = mount(); + const wrapper = mount( { }} />); expect(wrapper.find('.active').length).toEqual(1); }); @@ -121,13 +124,13 @@ describe('Carousel', () => { describe('controls', () => { it('should render an anchor tag', () => { - const wrapper = mount(); + const wrapper = mount( { }} />); expect(wrapper.find('a').length).toEqual(1); }); it('should call the onClickHandler', () => { const onClick = jest.fn(); - const wrapper = mount(); + const wrapper = mount(); wrapper.find('a').first().simulate('click'); expect(onClick).toHaveBeenCalled(); }); @@ -148,8 +151,8 @@ describe('Carousel', () => { }); const wrapper = mount( - - + { }} previous={() => { }}> + { }} /> {slides} ); @@ -171,10 +174,10 @@ describe('Carousel', () => { }); const wrapper = mount( - + { }} previous={() => { }}> {slides} - - + { }} /> + { }} /> ); @@ -195,11 +198,11 @@ describe('Carousel', () => { }); const wrapper = mount( - + { }} previous={() => { }}> {slides} ); - expect(wrapper.find(CarouselItem).length).toEqual(1); + expect(wrapper.find('.carousel-item.active').length).toEqual(1); }); it('should show indicators and controls', () => { @@ -216,11 +219,11 @@ describe('Carousel', () => { }); const wrapper = mount( - - + { }} previous={() => { }}> + { }} /> {slides} - - + { }} /> + { }} /> ); @@ -244,7 +247,7 @@ describe('Carousel', () => { }); const wrapper = mount( - + { }} previous={() => { }}> {slides} ); @@ -267,7 +270,7 @@ describe('Carousel', () => { }); const wrapper = mount( - + { }} previous={() => { }}> {slides} ); @@ -290,7 +293,7 @@ describe('Carousel', () => { }); const wrapper = mount( - + { }} previous={() => { }}> {slides} ); @@ -313,7 +316,7 @@ describe('Carousel', () => { }); const wrapper = mount( - + { }} previous={() => { }}> {slides} ); @@ -339,7 +342,7 @@ describe('Carousel', () => { }); const wrapper = mount( - + { }} interval={1000} activeIndex={0} paused> {slides} ); @@ -363,7 +366,7 @@ describe('Carousel', () => { }); const wrapper = mount( - + { }} interval={1000} activeIndex={0}> {slides} ); @@ -387,7 +390,7 @@ describe('Carousel', () => { }); const wrapper = mount( - + { }} activeIndex={0} interval={false}> {slides} ); @@ -411,7 +414,7 @@ describe('Carousel', () => { }); const wrapper = mount( - + { }} activeIndex={0}> {slides} ); @@ -434,7 +437,7 @@ describe('Carousel', () => { ); }); const wrapper = mount( - + { }} interval="1000" activeIndex={0}> {slides} ); diff --git a/src/__tests__/Collapse.spec.js b/src/__tests__/Collapse.spec.js index 0003487d7..a1a53c47c 100644 --- a/src/__tests__/Collapse.spec.js +++ b/src/__tests__/Collapse.spec.js @@ -4,11 +4,16 @@ import { Collapse } from '../'; describe('Collapse', () => { let isOpen; - let toggle; + let wrapper; + const toggle = () => { + isOpen = !isOpen; + if (wrapper != null) { + wrapper.setProps({ isOpen }); + } + }; beforeEach(() => { isOpen = false; - toggle = () => { isOpen = !isOpen; }; jest.useFakeTimers(); }); @@ -18,187 +23,104 @@ describe('Collapse', () => { jest.clearAllTimers(); }); - describe('delay', () => { - it('should accept a number', () => { - const wrapper = mount(); - toggle(); - wrapper.setProps({ isOpen: isOpen }); - jest.runTimersToTime(200); - expect(wrapper.state('collapse')).toEqual('SHOWN'); - wrapper.unmount(); - }); - - it('should accept an object', () => { - const wrapper = mount(); - toggle(); - wrapper.setProps({ isOpen: isOpen }); - jest.runTimersToTime(110); - expect(wrapper.state('collapse')).toEqual('SHOWN'); - - toggle(); - wrapper.setProps({ isOpen: isOpen }); - jest.runTimersToTime(120); - expect(wrapper.state('collapse')).toEqual('HIDDEN'); - }); - - it('should use default value if value is missing from object', () => { - const wrapper = mount(); - toggle(); - wrapper.setProps({ isOpen: isOpen }); - jest.runTimersToTime(110); - expect(wrapper.state('collapse')).toEqual('SHOWN'); - - toggle(); - wrapper.setProps({ isOpen: isOpen }); - jest.runTimersToTime(350); - expect(wrapper.state('collapse')).toEqual('HIDDEN'); - }); - }); - it('should render children', () => { - const wrapper = shallow(

    hello

    ).find('p'); - expect(wrapper.text()).toBe('hello'); + wrapper = mount(

    hello

    ); + expect(wrapper.find('p').text()).toBe('hello'); }); it('should have default isOpen value', () => { - const wrapper = shallow(); + wrapper = shallow(); expect(wrapper.instance().props.isOpen).toEqual(false); }); it('should render with class "collapse"', () => { - const wrapper = shallow(); - expect(wrapper.hasClass('collapse')).toEqual(true); + wrapper = mount(); + expect(wrapper.find('div').hasClass('collapse')).toEqual(true); }); - it('should render with class "navbar"', () => { - const wrapper = shallow(); - expect(wrapper.hasClass('navbar-collapse')).toEqual(true); + it('should render with class "navbar-collapse" if it has prop navbar', () => { + wrapper = mount(); + expect(wrapper.find('div').hasClass('navbar-collapse')).toEqual(true); }); it('should render with class "show" when isOpen is true', () => { - const wrapper = shallow(); - expect(wrapper.hasClass('show')).toEqual(true); + wrapper = mount(); + expect(wrapper.find('div').hasClass('show')).toEqual(true); }); it('should set height to null when isOpen is true', () => { - isOpen = true; - const wrapper = shallow(); + wrapper = shallow(); expect(wrapper.state('height')).toBe(null); }); it('should not set height when isOpen is false', () => { - const wrapper = shallow(); + wrapper = shallow(); expect(wrapper.state('height')).toBe(null); }); - it('should render with class "collapse" with default collapse state', () => { - const wrapper = mount(); - wrapper.setState({ collapse: null }); - jest.runTimersToTime(360); - wrapper.update(); - expect(wrapper.find('.collapse').length).toBe(1); - wrapper.unmount(); + it('should forward all styles', () => { + wrapper = mount(); + expect(wrapper.find('div').prop('style').backgroundColor).toBe('black'); }); - it('should change state with { collapse: ${State} } when isOpen change to true before transition', () => { - const wrapper = mount(); + it('should forward all callbacks', () => { + const callbacks = { + onEnter: jest.fn(), + onEntering: jest.fn(), + onEntered: jest.fn(), + onExit: jest.fn(), + onExiting: jest.fn(), + onExited: jest.fn(), + }; + wrapper = mount(); toggle(); - wrapper.setProps({ isOpen: isOpen }); - expect(wrapper.state('collapse')).toEqual('SHOW'); - wrapper.unmount(); - }); + expect(callbacks.onEnter).toHaveBeenCalled(); + expect(callbacks.onEntering).toHaveBeenCalled(); + expect(callbacks.onEntered).not.toHaveBeenCalled(); + jest.runTimersToTime(350); + expect(callbacks.onEntered).toHaveBeenCalled(); + expect(callbacks.onExit).not.toHaveBeenCalled(); - it('should change state with { collapse: ${State} } when isOpen change to true after transition', () => { - const wrapper = mount(); toggle(); - wrapper.setProps({ isOpen: isOpen }); + expect(callbacks.onExit).toHaveBeenCalled(); + expect(callbacks.onExiting).toHaveBeenCalled(); + expect(callbacks.onExited).not.toHaveBeenCalled(); jest.runTimersToTime(350); - expect(wrapper.state('collapse')).toEqual('SHOWN'); + expect(callbacks.onExiting).toHaveBeenCalled(); + expect(callbacks.onExited).toHaveBeenCalled(); + wrapper.unmount(); }); - it('should change state with { collapse: ${State} } when isOpen change to false before transition', () => { - isOpen = true; - const wrapper = mount(); + it('should apply correct bootstrap classes', () => { + wrapper = mount(); + const elem = wrapper.find('div'); toggle(); - wrapper.setProps({ isOpen: isOpen }); - expect(wrapper.state('collapse')).toEqual('HIDE'); - wrapper.unmount(); - }); + expect(elem.prop('className')).toBe('collapsing'); + jest.runTimersToTime(350); + expect(elem.prop('className')).toBe('collapse show'); - it('should change state with { collapse: ${State} } when isOpen change to false after transition', () => { - isOpen = true; - const wrapper = mount(); toggle(); - wrapper.setProps({ isOpen: isOpen }); - jest.runTimersToTime(360); - expect(wrapper.state('collapse')).toEqual('HIDDEN'); + expect(elem.prop('className')).toBe('collapsing'); + jest.runTimersToTime(350); + expect(elem.prop('className')).toBe('collapse'); + wrapper.unmount(); }); it('should set inline style to 0 when isOpen change to false', () => { isOpen = true; - const wrapper = mount(); + wrapper = mount(); toggle(); - wrapper.setProps({ isOpen: isOpen }); expect(wrapper.state('height')).toBe(0); wrapper.unmount(); }); it('should remove inline style when isOpen change to true after transition', () => { - const wrapper = mount(); + wrapper = mount(); toggle(); - wrapper.setProps({ isOpen: isOpen }); jest.runTimersToTime(380); expect(wrapper.state('height')).toBe(null); wrapper.unmount(); }); - - it('should remove timeout tag after unmount', () => { - jest.spyOn(Collapse.prototype, 'componentWillUnmount'); - const wrapper = mount(); - wrapper.unmount(); - expect(Collapse.prototype.componentWillUnmount).toHaveBeenCalled(); - }); - - it('should call onOpened after opening', () => { - const onOpened = jest.fn(); - const onClosed = jest.fn(); - const wrapper = mount(); - - jest.runTimersToTime(300); - expect(isOpen).toBe(false); - expect(onOpened).not.toHaveBeenCalled(); - expect(onClosed).not.toHaveBeenCalled(); - - toggle(); - wrapper.setProps({ isOpen }); - jest.runTimersToTime(380); - expect(isOpen).toBe(true); - expect(onOpened).toHaveBeenCalled(); - expect(onClosed).not.toHaveBeenCalled(); - - wrapper.unmount(); - }); - - it('should call onClosed after closing', () => { - const onOpened = jest.fn(); - const onClosed = jest.fn(); - toggle(); - const wrapper = mount(); - - jest.runTimersToTime(380); - expect(isOpen).toBe(true); - expect(onOpened).not.toHaveBeenCalled(); - expect(onClosed).not.toHaveBeenCalled(); - - toggle(); - wrapper.setProps({ isOpen }); - jest.runTimersToTime(380); - expect(isOpen).toBe(false); - expect(onOpened).not.toHaveBeenCalled(); - expect(onClosed).toHaveBeenCalled(); - - wrapper.unmount(); - }); }); diff --git a/src/__tests__/Fade.spec.js b/src/__tests__/Fade.spec.js index 57665bdcf..5b9d8bf69 100644 --- a/src/__tests__/Fade.spec.js +++ b/src/__tests__/Fade.spec.js @@ -1,6 +1,6 @@ import React from 'react'; import { mount } from 'enzyme'; -import TransitionGroup from 'react-transition-group/TransitionGroup'; +import { TransitionGroup } from 'react-transition-group'; import { Fade } from '../'; class Helper extends React.Component { @@ -23,7 +23,7 @@ class Helper extends React.Component {
    Toggle
    - { this.state.showItem ? this.props.children : null } + {this.state.showItem ? this.props.children : null}
    ); @@ -44,12 +44,12 @@ describe('Fade', () => { const wrapper = mount( Yo! - Yo 2! + Yo 2! ); expect(wrapper.find('div.fade').length).toBe(2); - expect(wrapper.find('div.fade.show').length).toBe(1); + expect(wrapper.find('div.fade.show').length).toBe(2); jest.runTimersToTime(300); @@ -61,12 +61,12 @@ describe('Fade', () => { it('should transition classes from "fade" to "fade show" on enter', () => { const onEnter = jest.fn(); - const onLeave = jest.fn(); + const onExit = jest.fn(); let isOpen = false; const wrapper = mount( - Yo! - Yo 2! + Yo 3! + Yo 4! ); @@ -76,16 +76,32 @@ describe('Fade', () => { wrapper.find('.trigger').simulate('click'); expect(wrapper.find('div.fade').length).toBe(2); - expect(wrapper.find('div.fade.show').length).toBe(1); - expect(onEnter).not.toHaveBeenCalled(); + expect(wrapper.find('div.fade.show').length).toBe(2); + expect(onEnter).toHaveBeenCalled(); jest.runTimersToTime(300); expect(onEnter).toHaveBeenCalled(); - expect(onLeave).not.toHaveBeenCalled(); + expect(onExit).not.toHaveBeenCalled(); expect(wrapper.find('div.fade.show').length).toBe(2); wrapper.find('.trigger').simulate('click'); expect(wrapper.find('div.fade.show').length).toBe(0); + expect(onExit).toHaveBeenCalled(); + }); + + it('should pass className down', () => { + const alert = mount(Yo!); + expect(alert.find('.fade').prop('className')).toContain('test-class-name'); + }); + + it('should pass other props down', () => { + const alert = mount(Yo!); + expect(alert.find('.fade').prop('data-testprop')).toContain('testvalue'); + }); + + it('should support custom tag', () => { + const alert = mount(Yo!); + expect(alert.find('p').length).toBe(1); }); }); diff --git a/src/__tests__/Modal.spec.js b/src/__tests__/Modal.spec.js index eeb977782..415cb807b 100644 --- a/src/__tests__/Modal.spec.js +++ b/src/__tests__/Modal.spec.js @@ -134,10 +134,16 @@ describe('Modal', () => { wrapper.unmount(); }); - it('should render when expected when passed modalTransitionTimeout and backdropTransitionTimeout props', () => { + it('should render when expected when passed modalTransition and backdropTransition props', () => { isOpen = true; const wrapper = mount( - + Hello, world! ); @@ -652,7 +658,7 @@ describe('Modal', () => { }); // assert that the modal is closed and the body class is what was set initially - jest.runTimersToTime(300); + jest.runTimersToTime(301); expect(isOpen).toBe(false); expect(document.body.className).toBe('my-modal-opened modal-opened'); diff --git a/src/utils.js b/src/utils.js index 12d82821b..4e39f2793 100644 --- a/src/utils.js +++ b/src/utils.js @@ -108,3 +108,14 @@ export function getTarget(target) { return target; } + + +/* eslint key-spacing: ["error", { afterColon: true, align: "value" }] */ +// These are all setup to match what is in the bootstrap _variables.scss +// https://github.com/twbs/bootstrap/blob/v4-dev/scss/_variables.scss +export const TransitionTimeouts = { + Fade: 150, // $transition-fade + Collapse: 350, // $transition-collapse + Modal: 300, // $modal-transition + Carousel: 600, // $carousel-transition +}; diff --git a/webpack.base.config.js b/webpack.base.config.js index 56ac0f276..1c4840495 100644 --- a/webpack.base.config.js +++ b/webpack.base.config.js @@ -55,13 +55,6 @@ module.exports = function (env) { commonjs: 'react-dom', amd: 'react-dom' } - }, - { - 'react-transition-group': { - commonjs: 'react-transition-group', - commonjs2: 'react-transition-group', - amd: 'react-transition-group', - } } ], module: { diff --git a/yarn.lock b/yarn.lock index af5fff18c..a743a07a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -28,6 +28,12 @@ accepts@~1.3.3: mime-types "~2.1.11" negotiator "0.6.1" +acorn-dynamic-import@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" + dependencies: + acorn "^4.0.3" + acorn-globals@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" @@ -44,22 +50,34 @@ acorn@^3.0.0, acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" -acorn@^4.0.1, acorn@^4.0.4: +acorn@^4.0.1, acorn@^4.0.3, acorn@^4.0.4: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" -acorn@^5.0.1: - version "5.0.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d" +acorn@^5.0.0, acorn@^5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.2.tgz#911cb53e036807cf0fa778dc5d370fbd864246d7" add-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" +address@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.0.2.tgz#480081e82b587ba319459fef512f516fe03d58af" + +address@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9" + ajv-keywords@^1.0.0: version "1.5.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" +ajv-keywords@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.0.tgz#a296e17f7bfae7c1ce4f7e0de53d29cb32162df0" + ajv@^4.7.0, ajv@^4.9.1: version "4.11.8" resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" @@ -67,6 +85,15 @@ ajv@^4.7.0, ajv@^4.9.1: co "^4.6.0" json-stable-stringify "^1.0.1" +ajv@^5.0.0, ajv@^5.1.5, ajv@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.2.tgz#47c68d69e86f5d953103b0074a9430dc63da5e39" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + json-schema-traverse "^0.3.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" @@ -83,25 +110,45 @@ amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" -ansi-escapes@^1.1.0, ansi-escapes@^1.4.0: +anser@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.1.tgz#c3641863a962cebef941ea2c8706f2cb4f0716bd" + +ansi-align@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-1.1.0.tgz#2f0c1658829739add5ebb15e6b0c6e3423f016ba" + dependencies: + string-width "^1.0.1" + +ansi-escapes@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" -ansi-html@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.5.tgz#0dcaa5a081206866bc240a3b773a184ea3b88b64" +ansi-escapes@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" -ansi-regex@^2.0.0: +ansi-regex@^2.0.0, ansi-regex@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" -ansicolors@~0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" +ansi-styles@^3.0.0, ansi-styles@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" + dependencies: + color-convert "^1.9.0" anymatch@^1.3.0: version "1.3.0" @@ -133,9 +180,9 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -aria-query@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-0.3.0.tgz#cb8a9984e2862711c83c80ade5b8f5ca0de2b467" +aria-query@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-0.7.0.tgz#4af10a1e61573ddea0cf3b99b51c52c05b424d24" dependencies: ast-types-flow "0.0.7" @@ -153,6 +200,10 @@ array-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" +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" @@ -161,10 +212,29 @@ array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" +array-flatten@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" + array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" +array-includes@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + +array-map@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" + +array-reduce@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" + array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -179,13 +249,6 @@ array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" -array.prototype.find@^2.0.1: - version "2.0.4" - resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.0.4.tgz#556a5c5362c08648323ddaeb9de9d14bc1864c90" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.7.0" - arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -194,6 +257,14 @@ asap@~2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f" +asn1.js@^4.0.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40" + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" @@ -224,10 +295,16 @@ async@^0.9.0: version "0.9.2" resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" -async@^1.3.0, async@^1.4.0, async@^1.5.0: +async@^1.3.0, async@^1.4.0, async@^1.5.0, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" +async@^2.1.2, async@^2.4.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" + dependencies: + lodash "^4.14.0" + async@^2.1.4: version "2.4.1" resolved "https://registry.yarnpkg.com/async/-/async-2.4.1.tgz#62a56b279c98a11d0987096a01cc3eeb8eb7bbd7" @@ -242,7 +319,18 @@ asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" -autoprefixer@6.7.2, autoprefixer@^6.3.1: +autoprefixer@7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.1.2.tgz#fbeaf07d48fd878e0682bf7cbeeade728adb2b18" + dependencies: + browserslist "^2.1.5" + caniuse-lite "^1.0.30000697" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^6.0.6" + postcss-value-parser "^3.2.3" + +autoprefixer@^6.3.1: version "6.7.2" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.2.tgz#172ab07b998ae9b957530928a59a40be54a45023" dependencies: @@ -261,6 +349,12 @@ aws4@^1.2.1: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" +axobject-query@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-0.1.0.tgz#62f59dbc59c9f9242759ca349960e7a2fe3c36c0" + dependencies: + ast-types-flow "0.0.7" + babel-cli@^6.14.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.24.1.tgz#207cd705bba61489b2ea41b5312341cf6aca2283" @@ -282,7 +376,7 @@ babel-cli@^6.14.0: optionalDependencies: chokidar "^1.6.1" -babel-code-frame@^6.11.0, babel-code-frame@^6.16.0, babel-code-frame@^6.22.0: +babel-code-frame@6.22.0, babel-code-frame@^6.11.0, babel-code-frame@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" dependencies: @@ -290,7 +384,15 @@ babel-code-frame@^6.11.0, babel-code-frame@^6.16.0, babel-code-frame@^6.22.0: esutils "^2.0.2" js-tokens "^3.0.0" -babel-core@6, babel-core@^6.0.0, babel-core@^6.14.0, babel-core@^6.21.0, babel-core@^6.24.1: +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@6, babel-core@6.25.0, babel-core@^6.0.0, babel-core@^6.14.0, babel-core@^6.21.0, babel-core@^6.24.1: version "6.25.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.25.0.tgz#7dd42b0463c742e9d5296deb3ec67a9322dad729" dependencies: @@ -314,41 +416,16 @@ babel-core@6, babel-core@^6.0.0, babel-core@^6.14.0, babel-core@^6.21.0, babel-c slash "^1.0.0" source-map "^0.5.0" -babel-core@6.22.1: - version "6.22.1" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.22.1.tgz#9c5fd658ba1772d28d721f6d25d968fc7ae21648" +babel-eslint@7.2.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.2.3.tgz#b2fe2d80126470f5c19442dc757253a897710827" dependencies: babel-code-frame "^6.22.0" - babel-generator "^6.22.0" - babel-helpers "^6.22.0" - babel-messages "^6.22.0" - babel-register "^6.22.0" - babel-runtime "^6.22.0" - babel-template "^6.22.0" - babel-traverse "^6.22.1" - babel-types "^6.22.0" - babylon "^6.11.0" - convert-source-map "^1.1.0" - debug "^2.1.1" - json5 "^0.5.0" - lodash "^4.2.0" - minimatch "^3.0.2" - path-is-absolute "^1.0.0" - private "^0.1.6" - 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-traverse "^6.23.1" + babel-types "^6.23.0" + babylon "^6.17.0" -babel-generator@^6.18.0, babel-generator@^6.22.0, babel-generator@^6.25.0: +babel-generator@^6.18.0, babel-generator@^6.25.0: version "6.25.0" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc" dependencies: @@ -369,7 +446,7 @@ babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-helper-builder-react-jsx@^6.22.0, babel-helper-builder-react-jsx@^6.24.1: +babel-helper-builder-react-jsx@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.24.1.tgz#0ad7917e33c8d751e646daca4e77cc19377d2cbc" dependencies: @@ -411,7 +488,7 @@ babel-helper-flip-expressions@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.1.2.tgz#77f6652f9de9c42401d827bd46ebd2109e3ef18a" -babel-helper-function-name@^6.22.0, babel-helper-function-name@^6.24.1, babel-helper-function-name@^6.8.0: +babel-helper-function-name@^6.24.1, babel-helper-function-name@^6.8.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" dependencies: @@ -491,29 +568,28 @@ babel-helper-to-multiple-sequence-expressions@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.1.1.tgz#5f1b832b39e4acf954e9137f0251395c71196b35" -babel-helpers@^6.22.0, babel-helpers@^6.24.1: +babel-helpers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" dependencies: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-jest@18.0.0, babel-jest@^18.0.0: - version "18.0.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-18.0.0.tgz#17ebba8cb3285c906d859e8707e4e79795fb65e3" +babel-jest@20.0.3, babel-jest@^20.0.3: + version "20.0.3" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-20.0.3.tgz#e4a03b13dc10389e140fc645d09ffc4ced301671" dependencies: babel-core "^6.0.0" - babel-plugin-istanbul "^3.0.0" - babel-preset-jest "^18.0.0" + babel-plugin-istanbul "^4.0.0" + babel-preset-jest "^20.0.3" -babel-loader@6.2.10: - version "6.2.10" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.2.10.tgz#adefc2b242320cd5d15e65b31cea0e8b1b02d4b0" +babel-loader@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.1.tgz#b87134c8b12e3e4c2a94e0546085bc680a2b8488" dependencies: - find-cache-dir "^0.1.1" - loader-utils "^0.2.11" + find-cache-dir "^1.0.0" + loader-utils "^1.0.2" mkdirp "^0.5.1" - object-assign "^4.0.1" babel-loader@^6.2.2: version "6.4.1" @@ -524,46 +600,53 @@ babel-loader@^6.2.2: mkdirp "^0.5.1" object-assign "^4.0.1" -babel-messages@^6.22.0, babel-messages@^6.23.0: +babel-messages@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" dependencies: babel-runtime "^6.22.0" -babel-plugin-check-es2015-constants@^6.22.0, babel-plugin-check-es2015-constants@^6.3.13: +babel-plugin-check-es2015-constants@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" dependencies: babel-runtime "^6.22.0" +babel-plugin-dynamic-import-node@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.0.2.tgz#adb5bc8f48a89311540395ae9f0cc3ed4b10bb2e" + dependencies: + babel-plugin-syntax-dynamic-import "^6.18.0" + babel-template "^6.24.1" + babel-types "^6.24.1" + babel-plugin-external-helpers@^6.18.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.22.0.tgz#2285f48b02bd5dede85175caf8c62e86adccefa1" dependencies: babel-runtime "^6.22.0" -babel-plugin-istanbul@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-3.1.2.tgz#11d5abde18425ec24b5d648c7e0b5d25cd354a22" +babel-plugin-istanbul@^4.0.0: + version "4.1.4" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.4.tgz#18dde84bf3ce329fddf3f4103fae921456d8e587" dependencies: - find-up "^1.1.2" - istanbul-lib-instrument "^1.4.2" - object-assign "^4.1.0" - test-exclude "^3.3.0" + find-up "^2.1.0" + istanbul-lib-instrument "^1.7.2" + test-exclude "^4.1.1" -babel-plugin-jest-hoist@^18.0.0: - version "18.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-18.0.0.tgz#4150e70ecab560e6e7344adc849498072d34e12a" +babel-plugin-jest-hoist@^20.0.3: + version "20.0.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz#afedc853bd3f8dc3548ea671fbe69d03cc2c1767" -babel-plugin-minify-builtins@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.1.2.tgz#36de34a8d27436b6c3207e0ae239e6cff390914a" +babel-plugin-minify-builtins@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.1.3.tgz#4f21a7dcb51f91a04ea71d47ff0e8e3b05fec021" dependencies: babel-helper-evaluate-path "^0.1.0" -babel-plugin-minify-constant-folding@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.1.2.tgz#53f05f792df7d7ceca4c490408ff11a961f9d01c" +babel-plugin-minify-constant-folding@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.1.3.tgz#57bd172adf8b8d74ad7c99612eb950414ebea3ca" dependencies: babel-helper-evaluate-path "^0.1.0" @@ -627,6 +710,10 @@ 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-dynamic-import@6.18.0, 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" @@ -643,11 +730,11 @@ 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.13.0, babel-plugin-syntax-trailing-function-commas@^6.22.0: +babel-plugin-syntax-trailing-function-commas@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" -babel-plugin-transform-async-to-generator@^6.24.1, babel-plugin-transform-async-to-generator@^6.8.0: +babel-plugin-transform-async-to-generator@^6.22.0, babel-plugin-transform-async-to-generator@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" dependencies: @@ -663,28 +750,28 @@ babel-plugin-transform-class-properties@6.11.5: babel-plugin-syntax-class-properties "^6.8.0" babel-runtime "^6.9.1" -babel-plugin-transform-class-properties@6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.22.0.tgz#aa78f8134495c7de06c097118ba061844e1dc1d8" +babel-plugin-transform-class-properties@6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" dependencies: - babel-helper-function-name "^6.22.0" + babel-helper-function-name "^6.24.1" babel-plugin-syntax-class-properties "^6.8.0" babel-runtime "^6.22.0" - babel-template "^6.22.0" + babel-template "^6.24.1" -babel-plugin-transform-es2015-arrow-functions@^6.22.0, babel-plugin-transform-es2015-arrow-functions@^6.3.13: +babel-plugin-transform-es2015-arrow-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0, babel-plugin-transform-es2015-block-scoped-functions@^6.3.13: +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-block-scoping@^6.14.0, babel-plugin-transform-es2015-block-scoping@^6.24.1, babel-plugin-transform-es2015-block-scoping@^6.6.0: +babel-plugin-transform-es2015-block-scoping@^6.14.0, babel-plugin-transform-es2015-block-scoping@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" dependencies: @@ -694,7 +781,17 @@ babel-plugin-transform-es2015-block-scoping@^6.14.0, babel-plugin-transform-es20 babel-types "^6.24.1" lodash "^4.2.0" -babel-plugin-transform-es2015-classes@^6.24.1, babel-plugin-transform-es2015-classes@^6.6.0, babel-plugin-transform-es2015-classes@^6.9.0: +babel-plugin-transform-es2015-block-scoping@^6.23.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.23.0, babel-plugin-transform-es2015-classes@^6.24.1, babel-plugin-transform-es2015-classes@^6.9.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" dependencies: @@ -708,33 +805,33 @@ babel-plugin-transform-es2015-classes@^6.24.1, babel-plugin-transform-es2015-cla babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-plugin-transform-es2015-computed-properties@^6.24.1, babel-plugin-transform-es2015-computed-properties@^6.3.13: +babel-plugin-transform-es2015-computed-properties@^6.22.0, babel-plugin-transform-es2015-computed-properties@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" dependencies: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-plugin-transform-es2015-destructuring@^6.22.0, babel-plugin-transform-es2015-destructuring@^6.6.0: +babel-plugin-transform-es2015-destructuring@^6.22.0, babel-plugin-transform-es2015-destructuring@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-duplicate-keys@^6.24.1, babel-plugin-transform-es2015-duplicate-keys@^6.6.0: +babel-plugin-transform-es2015-duplicate-keys@^6.22.0, babel-plugin-transform-es2015-duplicate-keys@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-plugin-transform-es2015-for-of@^6.22.0, babel-plugin-transform-es2015-for-of@^6.6.0, babel-plugin-transform-es2015-for-of@^6.8.0: +babel-plugin-transform-es2015-for-of@^6.22.0, babel-plugin-transform-es2015-for-of@^6.23.0, babel-plugin-transform-es2015-for-of@^6.8.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-function-name@^6.24.1, babel-plugin-transform-es2015-function-name@^6.3.13: +babel-plugin-transform-es2015-function-name@^6.22.0, babel-plugin-transform-es2015-function-name@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" dependencies: @@ -742,13 +839,13 @@ babel-plugin-transform-es2015-function-name@^6.24.1, babel-plugin-transform-es20 babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-plugin-transform-es2015-literals@^6.22.0, babel-plugin-transform-es2015-literals@^6.3.13: +babel-plugin-transform-es2015-literals@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-modules-amd@^6.24.1, babel-plugin-transform-es2015-modules-amd@^6.8.0: +babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" dependencies: @@ -756,7 +853,16 @@ babel-plugin-transform-es2015-modules-amd@^6.24.1, babel-plugin-transform-es2015 babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-plugin-transform-es2015-modules-commonjs@^6.24.1, babel-plugin-transform-es2015-modules-commonjs@^6.6.0: +babel-plugin-transform-es2015-modules-commonjs@^6.23.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-commonjs@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" dependencies: @@ -765,7 +871,7 @@ babel-plugin-transform-es2015-modules-commonjs@^6.24.1, babel-plugin-transform-e babel-template "^6.24.1" babel-types "^6.24.1" -babel-plugin-transform-es2015-modules-systemjs@^6.12.0, babel-plugin-transform-es2015-modules-systemjs@^6.24.1: +babel-plugin-transform-es2015-modules-systemjs@^6.23.0, babel-plugin-transform-es2015-modules-systemjs@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" dependencies: @@ -773,7 +879,7 @@ babel-plugin-transform-es2015-modules-systemjs@^6.12.0, babel-plugin-transform-e babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-plugin-transform-es2015-modules-umd@^6.12.0, babel-plugin-transform-es2015-modules-umd@^6.24.1: +babel-plugin-transform-es2015-modules-umd@^6.23.0, babel-plugin-transform-es2015-modules-umd@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" dependencies: @@ -781,14 +887,14 @@ babel-plugin-transform-es2015-modules-umd@^6.12.0, babel-plugin-transform-es2015 babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-plugin-transform-es2015-object-super@^6.24.1, babel-plugin-transform-es2015-object-super@^6.3.13: +babel-plugin-transform-es2015-object-super@^6.22.0, babel-plugin-transform-es2015-object-super@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" dependencies: babel-helper-replace-supers "^6.24.1" babel-runtime "^6.22.0" -babel-plugin-transform-es2015-parameters@^6.24.1, babel-plugin-transform-es2015-parameters@^6.6.0: +babel-plugin-transform-es2015-parameters@^6.23.0, babel-plugin-transform-es2015-parameters@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" dependencies: @@ -799,20 +905,20 @@ babel-plugin-transform-es2015-parameters@^6.24.1, babel-plugin-transform-es2015- babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-plugin-transform-es2015-shorthand-properties@^6.24.1, babel-plugin-transform-es2015-shorthand-properties@^6.3.13: +babel-plugin-transform-es2015-shorthand-properties@^6.22.0, babel-plugin-transform-es2015-shorthand-properties@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-plugin-transform-es2015-spread@^6.22.0, babel-plugin-transform-es2015-spread@^6.3.13: +babel-plugin-transform-es2015-spread@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-sticky-regex@^6.24.1, babel-plugin-transform-es2015-sticky-regex@^6.3.13: +babel-plugin-transform-es2015-sticky-regex@^6.22.0, babel-plugin-transform-es2015-sticky-regex@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" dependencies: @@ -820,19 +926,19 @@ babel-plugin-transform-es2015-sticky-regex@^6.24.1, babel-plugin-transform-es201 babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-plugin-transform-es2015-template-literals@^6.22.0, babel-plugin-transform-es2015-template-literals@^6.6.0: +babel-plugin-transform-es2015-template-literals@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-typeof-symbol@^6.22.0, babel-plugin-transform-es2015-typeof-symbol@^6.6.0: +babel-plugin-transform-es2015-typeof-symbol@^6.22.0, babel-plugin-transform-es2015-typeof-symbol@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-unicode-regex@^6.24.1, babel-plugin-transform-es2015-unicode-regex@^6.3.13: +babel-plugin-transform-es2015-unicode-regex@^6.22.0, babel-plugin-transform-es2015-unicode-regex@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" dependencies: @@ -840,7 +946,7 @@ babel-plugin-transform-es2015-unicode-regex@^6.24.1, babel-plugin-transform-es20 babel-runtime "^6.22.0" regexpu-core "^2.0.0" -babel-plugin-transform-exponentiation-operator@^6.24.1, babel-plugin-transform-exponentiation-operator@^6.8.0: +babel-plugin-transform-exponentiation-operator@^6.22.0, babel-plugin-transform-exponentiation-operator@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" dependencies: @@ -871,9 +977,9 @@ babel-plugin-transform-minify-booleans@^6.8.2: version "6.8.2" resolved "https://registry.yarnpkg.com/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.8.2.tgz#8451579f706e702c1e1ab2756de5c8ea369cf07c" -babel-plugin-transform-object-rest-spread@6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.22.0.tgz#1d419b55e68d2e4f64a5ff3373bd67d73c8e83bc" +babel-plugin-transform-object-rest-spread@6.23.0, babel-plugin-transform-object-rest-spread@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921" dependencies: babel-plugin-syntax-object-rest-spread "^6.8.0" babel-runtime "^6.22.0" @@ -885,22 +991,15 @@ babel-plugin-transform-object-rest-spread@6.8.0: babel-plugin-syntax-object-rest-spread "^6.8.0" babel-runtime "^6.0.0" -babel-plugin-transform-object-rest-spread@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921" - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.22.0" - babel-plugin-transform-property-literals@^6.8.4: version "6.8.4" resolved "https://registry.yarnpkg.com/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.8.4.tgz#6ad311110b80a192a56efb5ddf4fe3ca6f7a61da" dependencies: esutils "^2.0.2" -babel-plugin-transform-react-constant-elements@6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.22.0.tgz#4af456f80d283e8be00f00f12852354defa08ee1" +babel-plugin-transform-react-constant-elements@6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.23.0.tgz#2f119bf4d2cdd45eb9baaae574053c604f6147dd" dependencies: babel-runtime "^6.22.0" @@ -910,7 +1009,7 @@ babel-plugin-transform-react-constant-elements@6.9.1: dependencies: babel-runtime "^6.9.1" -babel-plugin-transform-react-display-name@^6.22.0, babel-plugin-transform-react-display-name@^6.23.0, babel-plugin-transform-react-display-name@^6.3.13: +babel-plugin-transform-react-display-name@^6.23.0, babel-plugin-transform-react-display-name@^6.3.13: version "6.25.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" dependencies: @@ -944,15 +1043,7 @@ babel-plugin-transform-react-jsx-source@6.9.0: babel-plugin-syntax-jsx "^6.8.0" babel-runtime "^6.9.0" -babel-plugin-transform-react-jsx@6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.22.0.tgz#48556b7dd4c3fe97d1c943bcd54fc3f2561c1817" - dependencies: - babel-helper-builder-react-jsx "^6.22.0" - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-react-jsx@^6.22.0, babel-plugin-transform-react-jsx@^6.24.1, babel-plugin-transform-react-jsx@^6.3.13: +babel-plugin-transform-react-jsx@6.24.1, babel-plugin-transform-react-jsx@^6.24.1, babel-plugin-transform-react-jsx@^6.3.13: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" dependencies: @@ -974,18 +1065,18 @@ babel-plugin-transform-regenerator@6.14.0: babylon "^6.9.0" private "~0.1.5" -babel-plugin-transform-regenerator@6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.22.0.tgz#65740593a319c44522157538d690b84094617ea6" - dependencies: - regenerator-transform "0.9.8" - -babel-plugin-transform-regenerator@^6.24.1, babel-plugin-transform-regenerator@^6.6.0: +babel-plugin-transform-regenerator@6.24.1, babel-plugin-transform-regenerator@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" dependencies: regenerator-transform "0.9.11" +babel-plugin-transform-regenerator@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + dependencies: + regenerator-transform "^0.10.0" + babel-plugin-transform-regexp-constructors@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.1.1.tgz#312ab7487cc88a1c62ee25ea1b6087e89b87799c" @@ -1008,9 +1099,9 @@ babel-plugin-transform-runtime@6.15.0: dependencies: babel-runtime "^6.9.0" -babel-plugin-transform-runtime@6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.22.0.tgz#10968d760bbf6517243081eec778e10fa828551c" +babel-plugin-transform-runtime@6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" dependencies: babel-runtime "^6.22.0" @@ -1037,12 +1128,12 @@ babel-polyfill@^6.23.0: core-js "^2.4.0" regenerator-runtime "^0.10.0" -babel-preset-babili@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/babel-preset-babili/-/babel-preset-babili-0.1.3.tgz#d2b08ddcec59e0a36f11a32803cdefce7085d80e" +babel-preset-babili@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/babel-preset-babili/-/babel-preset-babili-0.1.4.tgz#ad9d6651002f5bc3f07cab300781167f54724bf2" dependencies: - babel-plugin-minify-builtins "^0.1.2" - babel-plugin-minify-constant-folding "^0.1.2" + babel-plugin-minify-builtins "^0.1.3" + babel-plugin-minify-constant-folding "^0.1.3" babel-plugin-minify-dead-code-elimination "^0.1.7" babel-plugin-minify-flip-comparisons "^0.1.2" babel-plugin-minify-guarded-expressions "^0.1.2" @@ -1065,40 +1156,40 @@ babel-preset-babili@^0.1.2: babel-plugin-transform-undefined-to-void "^6.8.2" lodash.isplainobject "^4.0.6" -babel-preset-env@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.2.1.tgz#659178f54df74a74765f796be4d290b5beeb3f5f" - dependencies: - babel-plugin-check-es2015-constants "^6.3.13" - babel-plugin-syntax-trailing-function-commas "^6.13.0" - babel-plugin-transform-async-to-generator "^6.8.0" - babel-plugin-transform-es2015-arrow-functions "^6.3.13" - babel-plugin-transform-es2015-block-scoped-functions "^6.3.13" - babel-plugin-transform-es2015-block-scoping "^6.6.0" - babel-plugin-transform-es2015-classes "^6.6.0" - babel-plugin-transform-es2015-computed-properties "^6.3.13" - babel-plugin-transform-es2015-destructuring "^6.6.0" - babel-plugin-transform-es2015-duplicate-keys "^6.6.0" - babel-plugin-transform-es2015-for-of "^6.6.0" - babel-plugin-transform-es2015-function-name "^6.3.13" - babel-plugin-transform-es2015-literals "^6.3.13" - babel-plugin-transform-es2015-modules-amd "^6.8.0" - babel-plugin-transform-es2015-modules-commonjs "^6.6.0" - babel-plugin-transform-es2015-modules-systemjs "^6.12.0" - babel-plugin-transform-es2015-modules-umd "^6.12.0" - babel-plugin-transform-es2015-object-super "^6.3.13" - babel-plugin-transform-es2015-parameters "^6.6.0" - babel-plugin-transform-es2015-shorthand-properties "^6.3.13" - babel-plugin-transform-es2015-spread "^6.3.13" - babel-plugin-transform-es2015-sticky-regex "^6.3.13" - babel-plugin-transform-es2015-template-literals "^6.6.0" - babel-plugin-transform-es2015-typeof-symbol "^6.6.0" - babel-plugin-transform-es2015-unicode-regex "^6.3.13" - babel-plugin-transform-exponentiation-operator "^6.8.0" - babel-plugin-transform-regenerator "^6.6.0" - browserslist "^1.4.0" - electron-to-chromium "^1.1.0" +babel-preset-env@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.5.2.tgz#cd4ae90a6e94b709f97374b33e5f8b983556adef" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^2.1.2" invariant "^2.2.2" + semver "^5.3.0" babel-preset-es2015-rollup@^3.0.0: version "3.0.0" @@ -1156,11 +1247,11 @@ babel-preset-flow@^6.23.0: dependencies: babel-plugin-transform-flow-strip-types "^6.22.0" -babel-preset-jest@^18.0.0: - version "18.0.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-18.0.0.tgz#84faf8ca3ec65aba7d5e3f59bbaed935ab24049e" +babel-preset-jest@^20.0.3: + version "20.0.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz#cbacaadecb5d689ca1e1de1360ebfc66862c178a" dependencies: - babel-plugin-jest-hoist "^18.0.0" + babel-plugin-jest-hoist "^20.0.3" babel-preset-latest@6.14.0: version "6.14.0" @@ -1185,21 +1276,22 @@ babel-preset-react-app@^0.2.1: babel-preset-react "6.11.1" babel-runtime "6.11.6" -babel-preset-react-app@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-2.2.0.tgz#3143bcf316049f78b5f9d0422fd7822ca4715ca4" - dependencies: - babel-plugin-transform-class-properties "6.22.0" - babel-plugin-transform-object-rest-spread "6.22.0" - babel-plugin-transform-react-constant-elements "6.22.0" - babel-plugin-transform-react-jsx "6.22.0" +babel-preset-react-app@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-3.0.2.tgz#d062fca5dce68ed9c2615f2fecbc08861720f8e5" + dependencies: + babel-plugin-dynamic-import-node "1.0.2" + babel-plugin-syntax-dynamic-import "6.18.0" + babel-plugin-transform-class-properties "6.24.1" + babel-plugin-transform-object-rest-spread "6.23.0" + babel-plugin-transform-react-constant-elements "6.23.0" + babel-plugin-transform-react-jsx "6.24.1" babel-plugin-transform-react-jsx-self "6.22.0" babel-plugin-transform-react-jsx-source "6.22.0" - babel-plugin-transform-regenerator "6.22.0" - babel-plugin-transform-runtime "6.22.0" - babel-preset-env "1.2.1" - babel-preset-react "6.22.0" - babel-runtime "6.22.0" + babel-plugin-transform-regenerator "6.24.1" + babel-plugin-transform-runtime "6.23.0" + babel-preset-env "1.5.2" + babel-preset-react "6.24.1" babel-preset-react@6.11.1: version "6.11.1" @@ -1213,19 +1305,7 @@ babel-preset-react@6.11.1: babel-plugin-transform-react-jsx-self "^6.11.0" babel-plugin-transform-react-jsx-source "^6.3.13" -babel-preset-react@6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.22.0.tgz#7bc97e2d73eec4b980fb6b4e4e0884e81ccdc165" - dependencies: - babel-plugin-syntax-flow "^6.3.13" - babel-plugin-syntax-jsx "^6.3.13" - babel-plugin-transform-flow-strip-types "^6.22.0" - babel-plugin-transform-react-display-name "^6.22.0" - babel-plugin-transform-react-jsx "^6.22.0" - babel-plugin-transform-react-jsx-self "^6.22.0" - babel-plugin-transform-react-jsx-source "^6.22.0" - -babel-preset-react@^6.11.1: +babel-preset-react@6.24.1, babel-preset-react@^6.11.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" dependencies: @@ -1236,7 +1316,7 @@ babel-preset-react@^6.11.1: babel-plugin-transform-react-jsx-source "^6.22.0" babel-preset-flow "^6.23.0" -babel-register@^6.22.0, babel-register@^6.24.1: +babel-register@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" dependencies: @@ -1255,21 +1335,21 @@ babel-runtime@6.11.6: core-js "^2.4.0" regenerator-runtime "^0.9.5" -babel-runtime@6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.22.0.tgz#1cf8b4ac67c77a4ddb0db2ae1f74de52ac4ca611" +babel-runtime@6.26.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" dependencies: core-js "^2.4.0" - regenerator-runtime "^0.10.0" + regenerator-runtime "^0.11.0" -babel-runtime@^6.0.0, babel-runtime@^6.18.0, babel-runtime@^6.20.0, babel-runtime@^6.22.0, babel-runtime@^6.9.0, babel-runtime@^6.9.1: +babel-runtime@^6.0.0, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.9.0, babel-runtime@^6.9.1: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" dependencies: core-js "^2.4.0" regenerator-runtime "^0.10.0" -babel-template@^6.16.0, babel-template@^6.22.0, babel-template@^6.24.1, babel-template@^6.25.0: +babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.25.0: version "6.25.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071" dependencies: @@ -1279,7 +1359,17 @@ babel-template@^6.16.0, babel-template@^6.22.0, babel-template@^6.24.1, babel-te babylon "^6.17.2" lodash "^4.2.0" -babel-traverse@^6.14.0, babel-traverse@^6.15.0, babel-traverse@^6.18.0, babel-traverse@^6.22.1, babel-traverse@^6.24.1, babel-traverse@^6.25.0: +babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.14.0, babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.25.0: version "6.25.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1" dependencies: @@ -1293,7 +1383,21 @@ babel-traverse@^6.14.0, babel-traverse@^6.15.0, babel-traverse@^6.18.0, babel-tr invariant "^2.2.0" lodash "^4.2.0" -babel-types@^6.14.0, babel-types@^6.15.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.22.0, babel-types@^6.24.1, babel-types@^6.25.0: +babel-traverse@^6.23.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.14.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.25.0: version "6.25.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e" dependencies: @@ -1302,10 +1406,23 @@ babel-types@^6.14.0, babel-types@^6.15.0, babel-types@^6.18.0, babel-types@^6.19 lodash "^4.2.0" to-fast-properties "^1.0.1" -babylon@^6.11.0, babylon@^6.13.0, babylon@^6.17.2, babylon@^6.9.0: +babel-types@^6.23.0, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.13.0, babylon@^6.17.2, babylon@^6.9.0: version "6.17.3" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.3.tgz#1327d709950b558f204e5352587fd0290f8d8e48" +babylon@^6.17.0, babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + balanced-match@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" @@ -1336,6 +1453,10 @@ binary-extensions@^1.0.0: version "1.8.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" +bindings@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7" + block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" @@ -1346,10 +1467,25 @@ bluebird@^2.10.2: version "2.11.0" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" -bluebird@^3.0.5, bluebird@^3.4.6: +bluebird@^3.0.5, bluebird@^3.4.7: version "3.5.0" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" @@ -1360,12 +1496,23 @@ boom@2.x.x: dependencies: hoek "2.x.x" -bootstrap@^4.0.0-alpha.6: - version "4.0.0-alpha.6" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.0.0-alpha.6.tgz#4f54dd33ac0deac3b28407bc2df7ec608869c9c8" +bootstrap@4.0.0-beta: + version "4.0.0-beta" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.0.0-beta.tgz#dc5928175d2e71310bc668cf9e05a907211b72a6" + +boxen@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-0.6.0.tgz#8364d4248ac34ff0ef1b2f2bf49a6c60ce0d81b6" dependencies: - jquery ">=1.9.1" - tether "^1.4.0" + ansi-align "^1.1.0" + camelcase "^2.1.0" + chalk "^1.1.1" + cli-boxes "^1.0.0" + filled-array "^1.0.0" + object-assign "^4.0.1" + repeating "^2.0.0" + string-width "^1.0.1" + widest-line "^1.0.0" brace-expansion@^1.0.0, brace-expansion@^1.1.7: version "1.1.8" @@ -1382,6 +1529,10 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + browser-resolve@^1.11.0, browser-resolve@^1.11.2: version "1.11.2" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" @@ -1394,26 +1545,93 @@ browserify-aes@0.4.0: dependencies: inherits "^2.0.1" +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.0.8" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.8.tgz#c8fa3b1b7585bb7ba77c5560b60996ddec6d5309" + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + browserify-zlib@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" dependencies: pako "~0.2.0" -browserslist@^1.3.6, browserslist@^1.4.0, browserslist@^1.5.2, browserslist@^1.7.1: +browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.1: version "1.7.7" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" dependencies: caniuse-db "^1.0.30000639" electron-to-chromium "^1.2.7" +browserslist@^2.1.2, browserslist@^2.1.5: + version "2.4.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.4.0.tgz#693ee93d01e66468a6348da5498e011f578f87f8" + dependencies: + caniuse-lite "^1.0.30000718" + electron-to-chromium "^1.3.18" + bser@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169" dependencies: node-int64 "^0.4.0" -buffer@^4.9.0: +bser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + dependencies: + node-int64 "^0.4.0" + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + +buffer@^4.3.0, buffer@^4.9.0: version "4.9.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" dependencies: @@ -1465,7 +1683,7 @@ camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" -camelcase@^2.0.0: +camelcase@^2.0.0, camelcase@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" @@ -1473,6 +1691,10 @@ camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + caniuse-api@^1.5.2: version "1.6.1" resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" @@ -1486,16 +1708,17 @@ caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000618, caniuse-db@^1.0.30000639: version "1.0.30000690" resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000690.tgz#ee4e0750070f6aae6f40e76477984449bd6cb48a" -cardinal@^1.0.0: +caniuse-lite@^1.0.30000697, caniuse-lite@^1.0.30000718: + version "1.0.30000727" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000727.tgz#20c895768398ded5f98a4beab4a76c285def41d2" + +capture-stack-trace@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-1.0.0.tgz#50e21c1b0aa37729f9377def196b5a9cec932ee9" - dependencies: - ansicolors "~0.2.1" - redeyed "~1.0.0" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" -case-sensitive-paths-webpack-plugin@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-1.1.4.tgz#8aaedd5699a86cac2b34cf40d9b4145758978472" +case-sensitive-paths-webpack-plugin@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.1.1.tgz#3d29ced8c1f124bf6f53846fb3f5894731fdc909" caseless@~0.11.0: version "0.11.0" @@ -1526,6 +1749,14 @@ chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" +chalk@^2.0.0, chalk@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + cheerio@^0.22.0: version "0.22.0" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" @@ -1547,7 +1778,7 @@ cheerio@^0.22.0: lodash.reject "^4.4.0" lodash.some "^4.4.0" -chokidar@^1.0.0, chokidar@^1.6.1: +chokidar@^1.0.0, chokidar@^1.6.0, chokidar@^1.6.1, chokidar@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" dependencies: @@ -1566,6 +1797,13 @@ ci-info@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534" +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + circular-json@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" @@ -1576,7 +1814,7 @@ clap@^1.0.9: dependencies: chalk "^1.1.3" -classnames@^2.2.3: +classnames@^2.2.3, classnames@^2.2.5: version "2.2.5" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" @@ -1592,24 +1830,15 @@ clean-webpack-plugin@^0.1.8: dependencies: rimraf "~2.5.1" -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-table@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" - dependencies: - colors "1.0.3" +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" -cli-usage@^0.1.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/cli-usage/-/cli-usage-0.1.4.tgz#7c01e0dc706c234b39c933838c8e20b2175776e2" +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" dependencies: - marked "^0.3.6" - marked-terminal "^1.6.2" + restore-cursor "^2.0.0" cli-width@^2.0.0: version "2.1.0" @@ -1649,7 +1878,7 @@ 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" -color-convert@^1.3.0: +color-convert@^1.3.0, color-convert@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" dependencies: @@ -1681,10 +1910,6 @@ colormin@^1.0.5: css-color-names "0.0.4" has "^1.0.1" -colors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" - colors@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" @@ -1695,7 +1920,11 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" -commander@2.9.x, commander@^2.8.1, commander@^2.9.0, commander@~2.9.0: +commander@2.11.x, commander@~2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + +commander@^2.8.1, commander@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" dependencies: @@ -1733,7 +1962,7 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@^1.4.10, concat-stream@^1.4.6, concat-stream@^1.5.2: +concat-stream@^1.4.10, concat-stream@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" dependencies: @@ -1741,7 +1970,21 @@ concat-stream@^1.4.10, concat-stream@^1.4.6, concat-stream@^1.5.2: readable-stream "^2.2.2" typedarray "^0.0.6" -connect-history-api-fallback@1.3.0, connect-history-api-fallback@^1.3.0: +configstore@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-2.1.0.tgz#737a3a7036e9886102aa6099e47bb33ab1aba1a1" + dependencies: + dot-prop "^3.0.0" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + object-assign "^4.0.1" + os-tmpdir "^1.0.0" + osenv "^0.1.0" + uuid "^2.0.1" + write-file-atomic "^1.1.2" + xdg-basedir "^2.0.0" + +connect-history-api-fallback@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz#e51d17f8f0ef0db90a64fdb47de3051556e9f169" @@ -1921,7 +2164,7 @@ conventional-recommended-bump@^0.3.0: meow "^3.3.0" object-assign "^4.0.1" -convert-source-map@^1.1.0: +convert-source-map@^1.1.0, convert-source-map@^1.4.0: version "1.5.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" @@ -1978,8 +2221,41 @@ coveralls@^2.11.12: minimist "1.2.0" request "2.79.0" -create-react-class@^15.6.0: - version "15.6.0" +create-ecdh@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-error-class@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + dependencies: + capture-stack-trace "^1.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + ripemd160 "^2.0.0" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.6" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +create-react-class@^15.6.0: + version "15.6.0" resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.0.tgz#ab448497c26566e1e29413e883207d57cfe7bed4" dependencies: fbjs "^0.8.9" @@ -1993,11 +2269,12 @@ cross-env@^2.0.0: cross-spawn "^3.0.1" lodash.assign "^3.2.0" -cross-spawn@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" +cross-spawn@5.1.0, cross-spawn@^5.0.1, cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" dependencies: lru-cache "^4.0.1" + shebang-command "^1.2.0" which "^1.2.9" cross-spawn@^3.0.1: @@ -2022,18 +2299,34 @@ crypto-browserify@3.3.0: ripemd160 "0.2.0" sha.js "2.2.6" +crypto-browserify@^3.11.0: + version "3.11.1" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.1.tgz#948945efc6757a400d6e5e5af47194d10064279f" + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + css-color-names@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" -css-loader@0.26.1: - version "0.26.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.26.1.tgz#2ba7f20131b93597496b3e9bb500785a49cd29ea" +css-loader@0.28.4: + version "0.28.4" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.4.tgz#6cf3579192ce355e8b38d5f42dd7a1f2ec898d0f" dependencies: babel-code-frame "^6.11.0" css-selector-tokenizer "^0.7.0" cssnano ">=2.6.1 <4" - loader-utils "~0.2.2" + icss-utils "^2.1.0" + loader-utils "^1.0.2" lodash.camelcase "^4.3.0" object-assign "^4.0.1" postcss "^5.0.6" @@ -2041,7 +2334,8 @@ css-loader@0.26.1: postcss-modules-local-by-default "^1.0.1" postcss-modules-scope "^1.0.0" postcss-modules-values "^1.1.0" - source-list-map "^0.1.4" + postcss-value-parser "^3.3.0" + source-list-map "^0.1.7" css-loader@^0.25.0: version "0.25.0" @@ -2186,29 +2480,29 @@ dateformat@^1.0.11, dateformat@^1.0.12: get-stdin "^4.0.1" meow "^3.3.0" -debug@2.2.0, debug@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" - dependencies: - ms "0.7.1" - debug@2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e" dependencies: ms "2.0.0" -debug@2.6.8, debug@^2.1.0, debug@^2.1.1, debug@^2.2.0, debug@^2.6.0, debug@^2.6.3, debug@^2.6.6: +debug@2.6.8, debug@^2.1.1, debug@^2.2.0, debug@^2.6.0, debug@^2.6.3, debug@^2.6.6, debug@^2.6.8: version "2.6.8" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" dependencies: ms "2.0.0" +debug@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" -deep-equal@^1.0.0, deep-equal@^1.0.1: +deep-equal@^1.0.0, deep-equal@^1.0.1, deep-equal@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" @@ -2233,11 +2527,11 @@ define-properties@^1.1.2: foreach "^2.0.5" object-keys "^1.0.8" -defined@^1.0.0: +defined@^1.0.0, defined@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" -del@^2.0.2: +del@^2.0.2, del@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" dependencies: @@ -2249,6 +2543,17 @@ del@^2.0.2: pinkie-promise "^2.0.0" rimraf "^2.2.8" +del@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" + dependencies: + globby "^6.1.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + p-map "^1.1.1" + pify "^3.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" @@ -2261,6 +2566,13 @@ depd@1.1.0, depd@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" @@ -2271,19 +2583,49 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" -detect-port@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.1.0.tgz#fde7574591ea3de74445782643c3f921b2a4618c" +detect-node@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" + +detect-port-alt@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.3.tgz#a4d2f061d757a034ecf37c514260a98750f2b131" dependencies: + address "^1.0.1" debug "^2.6.0" -diff@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" +diff@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75" -doctrine@1.3.x, doctrine@^1.2.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.3.0.tgz#13e75682b55518424276f7c173783456ef913d26" +diffie-hellman@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + +dns-packet@^1.0.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.2.2.tgz#a8a26bec7646438963fc86e06f8f8b16d6c8bf7a" + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + dependencies: + buffer-indexof "^1.0.0" + +doctrine@1.5.0: + 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" @@ -2312,6 +2654,12 @@ dom-serializer@0, dom-serializer@~0.1.0: domelementtype "~1.1.1" entities "~1.1.1" +dom-urls@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/dom-urls/-/dom-urls-1.1.0.tgz#001ddf81628cd1e706125c7176f53ccec55d918e" + dependencies: + urijs "^1.16.1" + domain-browser@^1.1.1: version "1.1.7" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" @@ -2355,9 +2703,15 @@ dot-prop@^3.0.0: dependencies: is-obj "^1.0.0" -dotenv@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-2.0.0.tgz#bd759c357aaa70365e01c96b7b0bec08a6e0d949" +dotenv@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-4.0.0.tgz#864ef1379aced55ce6f95debecdce179f7a0cd1d" + +duplexer2@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + dependencies: + readable-stream "^2.0.2" duplexer@^0.1.1: version "0.1.1" @@ -2377,10 +2731,26 @@ ejs@^2.5.1: version "2.5.6" resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.6.tgz#479636bfa3fe3b1debd52087f0acb204b4f19c88" -electron-to-chromium@^1.1.0, electron-to-chromium@^1.2.7: +electron-to-chromium@^1.2.7: version "1.3.14" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.14.tgz#64af0f9efd3c3c6acd57d71f83b49ca7ee9c4b43" +electron-to-chromium@^1.3.18: + version "1.3.21" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.21.tgz#a967ebdcfe8ed0083fc244d1894022a8e8113ea2" + +elliptic@^6.0.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + emoji-regex@^6.1.0: version "6.4.2" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.4.2.tgz#a30b6fee353d406d96cfb9fa765bdc82897eff6e" @@ -2399,6 +2769,15 @@ encoding@^0.1.11: dependencies: iconv-lite "~0.4.13" +enhanced-resolve@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + object-assign "^4.0.1" + tapable "^0.2.7" + enhanced-resolve@~0.9.0: version "0.9.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e" @@ -2438,6 +2817,16 @@ error-ex@^1.2.0: dependencies: is-arrayish "^0.2.1" +es-abstract@^1.5.0: + version "1.8.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.8.2.tgz#25103263dc4decbda60e0c737ca32313518027ee" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + es-abstract@^1.6.1, es-abstract@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.7.0.tgz#dfade774e01bfcd97f96180298c449c8623fb94c" @@ -2481,7 +2870,11 @@ es6-map@^0.1.3: es6-symbol "~3.1.1" event-emitter "~0.3.5" -es6-set@^0.1.4, es6-set@~0.1.5: +es6-promise@^4.0.5: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.1.1.tgz#8811e90915d9a0dba36274f0b242dbda78f9c92a" + +es6-set@~0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" dependencies: @@ -2535,209 +2928,199 @@ escope@^3.6.0: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-config-airbnb-base@^5.0.2: - version "5.0.3" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-5.0.3.tgz#9714ac35ec2cd7fab0d44d148a9f91db2944074d" +eslint-config-airbnb-base@^11.3.0: + version "11.3.2" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-11.3.2.tgz#8703b11abe3c88ac7ec2b745b7fdf52e00ae680a" + dependencies: + eslint-restricted-globals "^0.1.1" -eslint-config-airbnb@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-10.0.1.tgz#a470108646d6c45e1f639a03f11d504a1aa4aedc" +eslint-config-airbnb@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-15.1.0.tgz#fd432965a906e30139001ba830f58f73aeddae8e" dependencies: - eslint-config-airbnb-base "^5.0.2" + eslint-config-airbnb-base "^11.3.0" -eslint-config-react-app@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-0.6.2.tgz#ee535cbaaf9e3576ea16b99afe720353d8730ec0" +eslint-config-react-app@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-2.0.0.tgz#8a5fb357c028336578c37a4bd2fc72b1817717cf" -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" +eslint-import-resolver-node@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.1.tgz#4422574cde66a9a7b099938ee4d508a199e0e3cc" dependencies: - debug "^2.2.0" - object-assign "^4.0.1" - resolve "^1.1.6" + debug "^2.6.8" + resolve "^1.2.0" -eslint-loader@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-1.6.0.tgz#38f9a1e6c602a4f1f3f3516289726e5d26e6e165" +eslint-loader@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-1.9.0.tgz#7e1be9feddca328d3dcfaef1ad49d5beffe83a13" dependencies: - find-cache-dir "^0.1.1" - loader-utils "^0.2.7" + loader-fs-cache "^1.0.0" + loader-utils "^1.0.2" object-assign "^4.0.1" + object-hash "^1.1.4" + rimraf "^2.6.1" -eslint-module-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-1.0.0.tgz#c4a57fd3a53efd8426cc2d5550aadab9bbd05fd0" +eslint-module-utils@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz#abaec824177613b8a95b299639e1b6facf473449" dependencies: - debug "2.2.0" + debug "^2.6.8" pkg-dir "^1.0.0" -eslint-plugin-flowtype@2.21.0: - version "2.21.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.21.0.tgz#a47e85abcdd181d37a336054bd552149ae387d9c" +eslint-plugin-flowtype@2.35.0: + version "2.35.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.35.0.tgz#d17494f0ae8b727c632d8b9d4b4a848e7e0c04af" dependencies: lodash "^4.15.0" -eslint-plugin-import@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.0.1.tgz#dcfe96357d476b3f822570d42c29bec66f5d9c5c" - dependencies: - builtin-modules "^1.1.1" - contains-path "^0.1.0" - debug "^2.2.0" - doctrine "1.3.x" - eslint-import-resolver-node "^0.2.0" - eslint-module-utils "^1.0.0" - has "^1.0.1" - lodash.cond "^4.3.0" - minimatch "^3.0.3" - pkg-up "^1.0.0" - -eslint-plugin-import@^1.12.0: - version "1.16.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-1.16.0.tgz#b2fa07ebcc53504d0f2a4477582ec8bff1871b9f" +eslint-plugin-import@2.7.0, eslint-plugin-import@^2.6.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.7.0.tgz#21de33380b9efb55f5ef6d2e210ec0e07e7fa69f" dependencies: builtin-modules "^1.1.1" contains-path "^0.1.0" - debug "^2.2.0" - doctrine "1.3.x" - es6-map "^0.1.3" - es6-set "^0.1.4" - eslint-import-resolver-node "^0.2.0" + debug "^2.6.8" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.1" + eslint-module-utils "^2.1.1" has "^1.0.1" lodash.cond "^4.3.0" - lodash.endswith "^4.0.1" - lodash.find "^4.3.0" - lodash.findindex "^4.3.0" minimatch "^3.0.3" - object-assign "^4.0.1" - pkg-dir "^1.0.0" - pkg-up "^1.0.0" + read-pkg-up "^2.0.0" -eslint-plugin-jsx-a11y@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-4.0.0.tgz#779bb0fe7b08da564a422624911de10061e048ee" +eslint-plugin-jsx-a11y@5.1.1, eslint-plugin-jsx-a11y@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-5.1.1.tgz#5c96bb5186ca14e94db1095ff59b3e2bd94069b1" dependencies: - aria-query "^0.3.0" + aria-query "^0.7.0" + array-includes "^3.0.3" ast-types-flow "0.0.7" + axobject-query "^0.1.0" damerau-levenshtein "^1.0.0" emoji-regex "^6.1.0" - jsx-ast-utils "^1.0.0" - object-assign "^4.0.1" - -eslint-plugin-jsx-a11y@^2.0.1: - 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" + jsx-ast-utils "^1.4.0" -eslint-plugin-react@6.4.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.4.1.tgz#7d1aade747db15892f71eee1fea4addf97bcfa2b" +eslint-plugin-react@7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.1.0.tgz#27770acf39f5fd49cd0af4083ce58104eb390d4c" dependencies: - doctrine "^1.2.2" - jsx-ast-utils "^1.3.1" + doctrine "^2.0.0" + has "^1.0.1" + jsx-ast-utils "^1.4.1" -eslint-plugin-react@^6.0.0: - version "6.10.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz#c5435beb06774e12c7db2f6abaddcbf900cd3f78" +eslint-plugin-react@^7.1.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.3.0.tgz#ca9368da36f733fbdc05718ae4e91f778f38e344" dependencies: - array.prototype.find "^2.0.1" - doctrine "^1.2.2" + doctrine "^2.0.0" has "^1.0.1" - jsx-ast-utils "^1.3.4" - object.assign "^4.0.4" + jsx-ast-utils "^2.0.0" + prop-types "^15.5.10" eslint-plugin-standard@^2.0.0: version "2.3.1" resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-2.3.1.tgz#6765bd2a6d9ecdc7bdf1b145ae4bb30e2b7b86f8" -eslint@3.16.1: - version "3.16.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.16.1.tgz#9bc31fc7341692cf772e80607508f67d711c5609" +eslint-restricted-globals@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz#35f0d5cbc64c2e3ed62e93b4b1a7af05ba7ed4d7" + +eslint-scope@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint@4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.4.1.tgz#99cd7eafcffca2ff99a5c8f5f2a474d6364b4bd3" dependencies: - babel-code-frame "^6.16.0" + ajv "^5.2.0" + babel-code-frame "^6.22.0" chalk "^1.1.3" - concat-stream "^1.4.6" - debug "^2.1.1" - doctrine "^1.2.2" - escope "^3.6.0" - espree "^3.4.0" + concat-stream "^1.6.0" + cross-spawn "^5.1.0" + debug "^2.6.8" + doctrine "^2.0.0" + eslint-scope "^3.7.1" + espree "^3.5.0" + esquery "^1.0.0" 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" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^9.17.0" + ignore "^3.3.3" imurmurhash "^0.1.4" - inquirer "^0.12.0" - is-my-json-valid "^2.10.0" + inquirer "^3.0.6" is-resolvable "^1.0.0" - js-yaml "^3.5.1" - json-stable-stringify "^1.0.0" + js-yaml "^3.9.1" + json-stable-stringify "^1.0.1" levn "^0.3.0" - lodash "^4.0.0" - mkdirp "^0.5.0" + lodash "^4.17.4" + minimatch "^3.0.2" + mkdirp "^0.5.1" 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" + path-is-inside "^1.0.2" + pluralize "^4.0.0" + progress "^2.0.0" + require-uncached "^1.0.3" + semver "^5.3.0" strip-json-comments "~2.0.1" - table "^3.7.8" + table "^4.0.1" text-table "~0.2.0" - user-home "^2.0.0" -eslint@^3.2.2: - version "3.19.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc" +eslint@^4.1.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.6.1.tgz#ddc7fc7fd70bf93205b0b3449bb16a1e9e7d4950" dependencies: - babel-code-frame "^6.16.0" - chalk "^1.1.3" - concat-stream "^1.5.2" - debug "^2.1.1" + ajv "^5.2.0" + babel-code-frame "^6.22.0" + chalk "^2.1.0" + concat-stream "^1.6.0" + cross-spawn "^5.1.0" + debug "^2.6.8" doctrine "^2.0.0" - escope "^3.6.0" - espree "^3.4.0" + eslint-scope "^3.7.1" + espree "^3.5.0" esquery "^1.0.0" 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" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^9.17.0" + ignore "^3.3.3" imurmurhash "^0.1.4" - inquirer "^0.12.0" - is-my-json-valid "^2.10.0" + inquirer "^3.0.6" is-resolvable "^1.0.0" - js-yaml "^3.5.1" - json-stable-stringify "^1.0.0" + js-yaml "^3.9.1" + json-stable-stringify "^1.0.1" levn "^0.3.0" - lodash "^4.0.0" - mkdirp "^0.5.0" + lodash "^4.17.4" + minimatch "^3.0.2" + mkdirp "^0.5.1" 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" + path-is-inside "^1.0.2" + pluralize "^4.0.0" + progress "^2.0.0" + require-uncached "^1.0.3" + semver "^5.3.0" + strip-ansi "^4.0.0" strip-json-comments "~2.0.1" - table "^3.7.8" + table "^4.0.1" text-table "~0.2.0" - user-home "^2.0.0" -espree@^3.4.0: - version "3.4.3" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.3.tgz#2910b5ccd49ce893c2ffffaab4fd8b3a31b82374" +espree@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.0.tgz#98358625bdd055861ea27e2867ea729faf463d8d" dependencies: - acorn "^5.0.1" + acorn "^5.1.1" acorn-jsx "^3.0.0" esprima@^2.6.0, esprima@^2.7.1: @@ -2748,9 +3131,9 @@ esprima@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" -esprima@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.0.0.tgz#53cf247acda77313e551c3aa2e73342d3fb4f7d9" +esprima@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" esquery@^1.0.0: version "1.0.0" @@ -2814,26 +3197,41 @@ events@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" -eventsource@0.1.6, eventsource@^0.1.3: +eventsource@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" dependencies: original ">=0.0.5" +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + exec-sh@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.0.tgz#14f75de3f20d286ef933099b2ce50a90359cef10" dependencies: merge "^1.1.3" +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + exenv@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" -exit-hook@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" - expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" @@ -2846,6 +3244,12 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + dependencies: + homedir-polyfill "^1.0.1" + express@^4.13.3: version "4.15.3" resolved "https://registry.yarnpkg.com/express/-/express-4.15.3.tgz#bab65d0f03aa80c358408972fc700f916944b662" @@ -2883,13 +3287,30 @@ extend@~3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" +external-editor@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972" + dependencies: + iconv-lite "^0.4.17" + jschardet "^1.4.2" + tmp "^0.0.31" + extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" dependencies: is-extglob "^1.0.0" -extract-text-webpack-plugin@1.0.1, extract-text-webpack-plugin@^1.0.1: +extract-text-webpack-plugin@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.0.tgz#90caa7907bc449f335005e3ac7532b41b00de612" + dependencies: + async "^2.4.1" + loader-utils "^1.1.0" + schema-utils "^0.3.0" + webpack-sources "^1.0.1" + +extract-text-webpack-plugin@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-1.0.1.tgz#c95bf3cbaac49dc96f1dc6e072549fbb654ccd2c" dependencies: @@ -2901,6 +3322,10 @@ extsprintf@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" +fast-deep-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" @@ -2921,18 +3346,18 @@ faye-websocket@~0.11.0: dependencies: websocket-driver ">=0.5.1" -faye-websocket@~0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.7.3.tgz#cc4074c7f4a4dfd03af54dd65c354b135132ce11" - dependencies: - websocket-driver ">=0.3.6" - -fb-watchman@^1.8.0, fb-watchman@^1.9.0: +fb-watchman@^1.8.0: version "1.9.2" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.2.tgz#a24cf47827f82d38fb59a69ad70b76e3b6ae7383" dependencies: bser "1.0.2" +fb-watchman@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + dependencies: + bser "^2.0.0" + fbjs@^0.8.9: version "0.8.12" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.12.tgz#10b5d92f76d45575fd63a217d4ea02bea2f8ed04" @@ -2945,12 +3370,11 @@ fbjs@^0.8.9: 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" +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" dependencies: escape-string-regexp "^1.0.5" - object-assign "^4.1.0" file-entry-cache@^2.0.0: version "2.0.0" @@ -2959,11 +3383,11 @@ file-entry-cache@^2.0.0: flat-cache "^1.2.1" object-assign "^4.0.1" -file-loader@0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-0.10.0.tgz#bbe6db7474ac92c7f54fdc197cf547e98b6b8e12" +file-loader@0.11.2: + version "0.11.2" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-0.11.2.tgz#4ff1df28af38719a6098093b88c82c71d1794a34" dependencies: - loader-utils "~0.2.5" + loader-utils "^1.0.2" filename-regex@^2.0.0: version "2.0.1" @@ -2976,9 +3400,9 @@ fileset@^2.0.2: glob "^7.0.3" minimatch "^3.0.3" -filesize@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.3.0.tgz#53149ea3460e3b2e024962a51648aa572cf98122" +filesize@3.5.10: + version "3.5.10" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.10.tgz#fc8fa23ddb4ef9e5e0ab6e1e64f679a24a56761f" fill-range@^2.1.0: version "2.2.3" @@ -2990,6 +3414,10 @@ fill-range@^2.1.0: repeat-element "^1.1.2" repeat-string "^1.5.2" +filled-array@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/filled-array/-/filled-array-1.1.0.tgz#c3c4f6c663b923459a9aa29912d2d031f1507f84" + finalhandler@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.3.tgz#ef47e77950e999780e86022a560e3217e0d0cc89" @@ -3010,13 +3438,27 @@ find-cache-dir@^0.1.1: mkdirp "^0.5.1" pkg-dir "^1.0.0" -find-up@^1.0.0, find-up@^1.1.2: +find-cache-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^2.0.0" + +find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" dependencies: path-exists "^2.0.0" pinkie-promise "^2.0.0" +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^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" @@ -3030,6 +3472,12 @@ flatten@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" +for-each@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4" + dependencies: + is-function "~1.0.0" + for-in@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -3064,9 +3512,17 @@ fresh@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" -fs-extra@0.30.0, fs-extra@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" +fs-extra@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^3.0.0" + universalify "^0.1.0" + +fs-extra@^0.26.4: + version "0.26.7" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -3074,9 +3530,9 @@ fs-extra@0.30.0, fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@^0.26.4: - version "0.26.7" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" +fs-extra@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -3092,7 +3548,14 @@ fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" -fsevents@1.0.17, fsevents@^1.0.0: +fsevents@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.36" + +fsevents@^1.0.0: version "1.0.17" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.17.tgz#8537f3f12272678765b4fd6528c0f1f66f8f4558" dependencies: @@ -3120,6 +3583,10 @@ function-bind@^1.0.2, function-bind@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" +function-bind@^1.1.1, function-bind@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + function.prototype.name@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.0.0.tgz#5f523ca64e491a5f95aba80cc1e391080a14482e" @@ -3128,6 +3595,10 @@ function.prototype.name@^1.0.0: function-bind "^1.1.0" is-callable "^1.1.2" +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -3169,6 +3640,10 @@ get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -3239,7 +3714,7 @@ glob@^6.0.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: @@ -3250,7 +3725,25 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^9.0.0, globals@^9.14.0: +global-modules@1.0.0, global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +globals@^9.0.0, globals@^9.17.0, globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -3265,7 +3758,37 @@ globby@^5.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +got@^5.0.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35" + dependencies: + create-error-class "^3.0.1" + duplexer2 "^0.1.4" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + node-status-codes "^1.0.0" + object-assign "^4.0.1" + parse-json "^2.1.0" + pinkie-promise "^2.0.0" + read-all-stream "^3.0.0" + readable-stream "^2.0.5" + timed-out "^3.0.0" + unzip-response "^1.0.2" + url-parse-lax "^1.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -3273,7 +3796,7 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" -growly@^1.2.0: +growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -3283,6 +3806,10 @@ gzip-size@3.0.0: dependencies: duplexer "^0.1.1" +handle-thing@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" + handlebars@^4.0.2, handlebars@^4.0.3: version "4.0.10" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f" @@ -3323,17 +3850,41 @@ has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" -has@^1.0.1: +has@^1.0.1, has@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" dependencies: function-bind "^1.0.2" -hawk@~3.1.3: +hash-base@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" + dependencies: + inherits "^2.0.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.0" + +hawk@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" dependencies: @@ -3364,6 +3915,14 @@ history@^3.0.0: query-string "^4.2.2" warning "^3.0.0" +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" @@ -3385,10 +3944,25 @@ home-or-tmp@^2.0.0: os-homedir "^1.0.0" os-tmpdir "^1.0.1" +homedir-polyfill@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" + dependencies: + parse-passwd "^1.0.0" + hosted-git-info@^2.1.4: version "2.4.2" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67" +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + html-comment-regex@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" @@ -3399,31 +3973,31 @@ html-encoding-sniffer@^1.0.1: dependencies: whatwg-encoding "^1.0.1" -html-entities@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.0.tgz#41948caf85ce82fed36e4e6a0ed371a6664379e2" +html-entities@1.2.1, html-entities@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" -html-minifier@^3.1.0: - version "3.5.2" - resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.2.tgz#d73bc3ff448942408818ce609bf3fb0ea7ef4eb7" +html-minifier@^3.2.3: + version "3.5.4" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.4.tgz#e9bbcca964a6815617ed7c31f1f20b476b50b807" dependencies: camel-case "3.0.x" clean-css "4.1.x" - commander "2.9.x" + commander "2.11.x" he "1.1.x" ncname "1.0.x" param-case "2.1.x" relateurl "0.2.x" - uglify-js "3.0.x" + uglify-js "3.1.x" -html-webpack-plugin@2.24.0: - version "2.24.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-2.24.0.tgz#53697cea79a9f3cd1f8c239ac71f949d5673cacb" +html-webpack-plugin@2.29.0: + version "2.29.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-2.29.0.tgz#e987f421853d3b6938c8c4c8171842e5fd17af23" dependencies: - bluebird "^3.4.6" - html-minifier "^3.1.0" + bluebird "^3.4.7" + html-minifier "^3.2.3" loader-utils "^0.2.16" - lodash "^4.16.4" + lodash "^4.17.3" pretty-error "^2.0.2" toposort "^1.0.0" @@ -3447,6 +4021,10 @@ htmlparser2@~3.3.0: domutils "1.1" readable-stream "1.0" +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + http-errors@~1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" @@ -3456,7 +4034,7 @@ http-errors@~1.6.1: setprototypeof "1.0.3" statuses ">= 1.3.1 < 2" -http-proxy-middleware@0.17.3, http-proxy-middleware@~0.17.1: +http-proxy-middleware@~0.17.1: version "0.17.3" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.3.tgz#940382147149b856084f5534752d5b5a8168cd1d" dependencies: @@ -3465,6 +4043,15 @@ http-proxy-middleware@0.17.3, http-proxy-middleware@~0.17.1: lodash "^4.17.2" micromatch "^2.3.11" +http-proxy-middleware@~0.17.4: + version "0.17.4" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz#642e8848851d66f09d4f124912846dbaeb41b833" + dependencies: + http-proxy "^1.16.2" + is-glob "^3.1.0" + lodash "^4.17.2" + micromatch "^2.3.11" + http-proxy@^1.16.2: version "1.16.2" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" @@ -3488,6 +4075,10 @@ iconv-lite@0.4.13: version "0.4.13" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" +iconv-lite@^0.4.17: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + iconv-lite@~0.4.13: version "0.4.18" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" @@ -3496,13 +4087,19 @@ icss-replace-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" +icss-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" + dependencies: + postcss "^6.0.1" + ieee754@^1.1.4: version "1.1.8" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" -ignore@^3.2.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d" +ignore@^3.3.3: + version "3.3.5" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.5.tgz#c4e715455f6073a8d7e5dae72d2fc9d71663dba6" imurmurhash@^0.1.4: version "0.1.4" @@ -3529,7 +4126,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1: +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -3537,28 +4134,54 @@ inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" -ini@^1.3.2, ini@~1.3.0: +ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: version "1.3.4" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" -inquirer@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" +inquirer@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.2.1.tgz#06ceb0f540f45ca548c17d6840959878265fa175" dependencies: - ansi-escapes "^1.1.0" - ansi-regex "^2.0.0" - chalk "^1.0.0" - cli-cursor "^1.0.1" + ansi-escapes "^2.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" cli-width "^2.0.0" - figures "^1.3.5" + external-editor "^2.0.4" + figures "^2.0.0" 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" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +inquirer@^3.0.6: + version "3.2.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.2.3.tgz#1c7b1731cf77b934ec47d22c9ac5aa8fe7fbe095" + dependencies: + ansi-escapes "^2.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" through "^2.3.6" +internal-ip@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz#ae9fbf93b984878785d50a8de1b356956058cf5c" + dependencies: + meow "^3.3.0" + interpret@^0.6.4: version "0.6.6" resolved "https://registry.yarnpkg.com/interpret/-/interpret-0.6.6.tgz#fecd7a18e7ce5ca6abfb953e1f86213a49f1625b" @@ -3577,6 +4200,10 @@ invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + ipaddr.js@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.3.0.tgz#1e03a52fdad83a8bbb2b25cbf4998b4cffcd3dec" @@ -3609,7 +4236,7 @@ is-callable@^1.1.1, is-callable@^1.1.2, is-callable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" -is-ci@^1.0.9: +is-ci@^1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" dependencies: @@ -3661,6 +4288,10 @@ 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-function@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" + is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -3677,7 +4308,7 @@ is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" -is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: +is-my-json-valid@^2.12.4: version "2.16.0" resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" dependencies: @@ -3686,6 +4317,10 @@ is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: jsonpointer "^4.0.0" xtend "^4.0.0" +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" @@ -3730,11 +4365,19 @@ is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + is-property@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" -is-regex@^1.0.3: +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + +is-regex@^1.0.3, is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" dependencies: @@ -3746,7 +4389,15 @@ is-resolvable@^1.0.0: dependencies: tryit "^1.0.1" -is-stream@^1.0.1: +is-retry-allowed@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + +is-root@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-1.0.0.tgz#07b6c233bc394cd9d02ba15c966bd6660d6342d5" + +is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -3778,6 +4429,14 @@ is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" +is-windows@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.1.tgz#310db70f742d259a16a369202b51af84233310d9" + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -3807,23 +4466,23 @@ isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" -istanbul-api@^1.1.0-alpha.1: - version "1.1.9" - resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.9.tgz#2827920d380d4286d857d57a2968a841db8a7ec8" +istanbul-api@^1.1.1: + version "1.1.14" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.14.tgz#25bc5701f7c680c0ffff913de46e3619a3a6e680" dependencies: async "^2.1.4" fileset "^2.0.2" istanbul-lib-coverage "^1.1.1" istanbul-lib-hook "^1.0.7" - istanbul-lib-instrument "^1.7.2" + istanbul-lib-instrument "^1.8.0" istanbul-lib-report "^1.1.1" istanbul-lib-source-maps "^1.2.1" - istanbul-reports "^1.1.1" + istanbul-reports "^1.1.2" js-yaml "^3.7.0" mkdirp "^0.5.1" once "^1.4.0" -istanbul-lib-coverage@^1.0.0, istanbul-lib-coverage@^1.1.1: +istanbul-lib-coverage@^1.0.1, istanbul-lib-coverage@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da" @@ -3833,7 +4492,7 @@ istanbul-lib-hook@^1.0.7: dependencies: append-transform "^0.4.0" -istanbul-lib-instrument@^1.1.1, istanbul-lib-instrument@^1.4.2, istanbul-lib-instrument@^1.7.2: +istanbul-lib-instrument@^1.4.2, istanbul-lib-instrument@^1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.2.tgz#6014b03d3470fb77638d5802508c255c06312e56" dependencies: @@ -3845,6 +4504,18 @@ istanbul-lib-instrument@^1.1.1, istanbul-lib-instrument@^1.4.2, istanbul-lib-ins istanbul-lib-coverage "^1.1.1" semver "^5.3.0" +istanbul-lib-instrument@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.8.0.tgz#66f6c9421cc9ec4704f76f2db084ba9078a2b532" + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.18.0" + istanbul-lib-coverage "^1.1.1" + semver "^5.3.0" + istanbul-lib-report@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#f0e55f56655ffa34222080b7a0cd4760e1405fc9" @@ -3854,7 +4525,7 @@ istanbul-lib-report@^1.1.1: path-parse "^1.0.5" supports-color "^3.1.2" -istanbul-lib-source-maps@^1.2.1: +istanbul-lib-source-maps@^1.1.0, istanbul-lib-source-maps@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz#a6fe1acba8ce08eebc638e572e294d267008aa0c" dependencies: @@ -3864,197 +4535,222 @@ istanbul-lib-source-maps@^1.2.1: rimraf "^2.6.1" source-map "^0.5.3" -istanbul-reports@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.1.tgz#042be5c89e175bc3f86523caab29c014e77fee4e" +istanbul-reports@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.2.tgz#0fb2e3f6aa9922bd3ce45d05d8ab4d5e8e07bd4f" dependencies: handlebars "^4.0.3" -jest-changed-files@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-17.0.2.tgz#f5657758736996f590a51b87e5c9369d904ba7b7" +jest-changed-files@^20.0.3: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-20.0.3.tgz#9394d5cc65c438406149bef1bf4d52b68e03e3f8" -jest-cli@^18.1.0: - version "18.1.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-18.1.0.tgz#5ead36ecad420817c2c9baa2aa7574f63257b3d6" +jest-cli@^20.0.4: + version "20.0.4" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-20.0.4.tgz#e532b19d88ae5bc6c417e8b0593a6fe954b1dc93" dependencies: ansi-escapes "^1.4.0" callsites "^2.0.0" - chalk "^1.1.1" - graceful-fs "^4.1.6" - is-ci "^1.0.9" - istanbul-api "^1.1.0-alpha.1" - istanbul-lib-coverage "^1.0.0" - istanbul-lib-instrument "^1.1.1" - jest-changed-files "^17.0.2" - jest-config "^18.1.0" - jest-environment-jsdom "^18.1.0" - jest-file-exists "^17.0.0" - jest-haste-map "^18.1.0" - jest-jasmine2 "^18.1.0" - jest-mock "^18.0.0" - jest-resolve "^18.1.0" - jest-resolve-dependencies "^18.1.0" - jest-runtime "^18.1.0" - jest-snapshot "^18.1.0" - jest-util "^18.1.0" - json-stable-stringify "^1.0.0" - node-notifier "^4.6.1" - sane "~1.4.1" - strip-ansi "^3.0.1" + chalk "^1.1.3" + graceful-fs "^4.1.11" + is-ci "^1.0.10" + istanbul-api "^1.1.1" + istanbul-lib-coverage "^1.0.1" + istanbul-lib-instrument "^1.4.2" + istanbul-lib-source-maps "^1.1.0" + jest-changed-files "^20.0.3" + jest-config "^20.0.4" + jest-docblock "^20.0.3" + jest-environment-jsdom "^20.0.3" + jest-haste-map "^20.0.4" + jest-jasmine2 "^20.0.4" + jest-message-util "^20.0.3" + jest-regex-util "^20.0.3" + jest-resolve-dependencies "^20.0.3" + jest-runtime "^20.0.4" + jest-snapshot "^20.0.3" + jest-util "^20.0.3" + micromatch "^2.3.11" + node-notifier "^5.0.2" + pify "^2.3.0" + slash "^1.0.0" + string-length "^1.0.1" throat "^3.0.0" - which "^1.1.1" + which "^1.2.12" worker-farm "^1.3.1" - yargs "^6.3.0" + yargs "^7.0.2" -jest-config@^18.1.0: - version "18.1.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-18.1.0.tgz#6111740a6d48aab86ff5a9e6ab0b98bd993b6ff4" +jest-config@^20.0.4: + version "20.0.4" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-20.0.4.tgz#e37930ab2217c913605eff13e7bd763ec48faeea" dependencies: - chalk "^1.1.1" - jest-environment-jsdom "^18.1.0" - jest-environment-node "^18.1.0" - jest-jasmine2 "^18.1.0" - jest-mock "^18.0.0" - jest-resolve "^18.1.0" - jest-util "^18.1.0" - json-stable-stringify "^1.0.0" - -jest-diff@^18.1.0: - version "18.1.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-18.1.0.tgz#4ff79e74dd988c139195b365dc65d87f606f4803" + chalk "^1.1.3" + glob "^7.1.1" + jest-environment-jsdom "^20.0.3" + jest-environment-node "^20.0.3" + jest-jasmine2 "^20.0.4" + jest-matcher-utils "^20.0.3" + jest-regex-util "^20.0.3" + jest-resolve "^20.0.4" + jest-validate "^20.0.3" + pretty-format "^20.0.3" + +jest-diff@^20.0.3: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-20.0.3.tgz#81f288fd9e675f0fb23c75f1c2b19445fe586617" dependencies: chalk "^1.1.3" - diff "^3.0.0" - jest-matcher-utils "^18.1.0" - pretty-format "^18.1.0" + diff "^3.2.0" + jest-matcher-utils "^20.0.3" + pretty-format "^20.0.3" -jest-environment-jsdom@^18.1.0: - version "18.1.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-18.1.0.tgz#18b42f0c4ea2bae9f36cab3639b1e8f8c384e24e" - dependencies: - jest-mock "^18.0.0" - jest-util "^18.1.0" - jsdom "^9.9.1" +jest-docblock@^20.0.3: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-20.0.3.tgz#17bea984342cc33d83c50fbe1545ea0efaa44712" -jest-environment-node@^18.1.0: - version "18.1.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-18.1.0.tgz#4d6797572c8dda99acf5fae696eb62945547c779" +jest-environment-jsdom@^20.0.3: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz#048a8ac12ee225f7190417713834bb999787de99" dependencies: - jest-mock "^18.0.0" - jest-util "^18.1.0" + jest-mock "^20.0.3" + jest-util "^20.0.3" + jsdom "^9.12.0" -jest-file-exists@^17.0.0: - version "17.0.0" - resolved "https://registry.yarnpkg.com/jest-file-exists/-/jest-file-exists-17.0.0.tgz#7f63eb73a1c43a13f461be261768b45af2cdd169" +jest-environment-node@^20.0.3: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-20.0.3.tgz#d488bc4612af2c246e986e8ae7671a099163d403" + dependencies: + jest-mock "^20.0.3" + jest-util "^20.0.3" -jest-haste-map@^18.1.0: - version "18.1.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-18.1.0.tgz#06839c74b770a40c1a106968851df8d281c08375" +jest-haste-map@^20.0.4: + version "20.0.5" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-20.0.5.tgz#abad74efb1a005974a7b6517e11010709cab9112" dependencies: - fb-watchman "^1.9.0" - graceful-fs "^4.1.6" + fb-watchman "^2.0.0" + graceful-fs "^4.1.11" + jest-docblock "^20.0.3" micromatch "^2.3.11" - sane "~1.4.1" + sane "~1.6.0" worker-farm "^1.3.1" -jest-jasmine2@^18.1.0: - version "18.1.0" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-18.1.0.tgz#094e104c2c189708766c77263bb2aecb5860a80b" +jest-jasmine2@^20.0.4: + version "20.0.4" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz#fcc5b1411780d911d042902ef1859e852e60d5e1" dependencies: - graceful-fs "^4.1.6" - jest-matcher-utils "^18.1.0" - jest-matchers "^18.1.0" - jest-snapshot "^18.1.0" - jest-util "^18.1.0" + chalk "^1.1.3" + graceful-fs "^4.1.11" + jest-diff "^20.0.3" + jest-matcher-utils "^20.0.3" + jest-matchers "^20.0.3" + jest-message-util "^20.0.3" + jest-snapshot "^20.0.3" + once "^1.4.0" + p-map "^1.1.1" -jest-matcher-utils@^18.1.0: - version "18.1.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-18.1.0.tgz#1ac4651955ee2a60cef1e7fcc98cdfd773c0f932" +jest-matcher-utils@^20.0.3: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz#b3a6b8e37ca577803b0832a98b164f44b7815612" dependencies: chalk "^1.1.3" - pretty-format "^18.1.0" + pretty-format "^20.0.3" + +jest-matchers@^20.0.3: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-20.0.3.tgz#ca69db1c32db5a6f707fa5e0401abb55700dfd60" + dependencies: + jest-diff "^20.0.3" + jest-matcher-utils "^20.0.3" + jest-message-util "^20.0.3" + jest-regex-util "^20.0.3" -jest-matchers@^18.1.0: - version "18.1.0" - resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-18.1.0.tgz#0341484bf87a1fd0bac0a4d2c899e2b77a3f1ead" +jest-message-util@^20.0.3: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-20.0.3.tgz#6aec2844306fcb0e6e74d5796c1006d96fdd831c" dependencies: - jest-diff "^18.1.0" - jest-matcher-utils "^18.1.0" - jest-util "^18.1.0" - pretty-format "^18.1.0" + chalk "^1.1.3" + micromatch "^2.3.11" + slash "^1.0.0" -jest-mock@^18.0.0: - version "18.0.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-18.0.0.tgz#5c248846ea33fa558b526f5312ab4a6765e489b3" +jest-mock@^20.0.3: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-20.0.3.tgz#8bc070e90414aa155c11a8d64c869a0d5c71da59" -jest-resolve-dependencies@^18.1.0: - version "18.1.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-18.1.0.tgz#8134fb5caf59c9ed842fe0152ab01c52711f1bbb" +jest-regex-util@^20.0.3: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-20.0.3.tgz#85bbab5d133e44625b19faf8c6aa5122d085d762" + +jest-resolve-dependencies@^20.0.3: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz#6e14a7b717af0f2cb3667c549de40af017b1723a" dependencies: - jest-file-exists "^17.0.0" - jest-resolve "^18.1.0" + jest-regex-util "^20.0.3" -jest-resolve@^18.1.0: - version "18.1.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-18.1.0.tgz#6800accb536658c906cd5e29de412b1ab9ac249b" +jest-resolve@^20.0.4: + version "20.0.4" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-20.0.4.tgz#9448b3e8b6bafc15479444c6499045b7ffe597a5" dependencies: browser-resolve "^1.11.2" - jest-file-exists "^17.0.0" - jest-haste-map "^18.1.0" - resolve "^1.2.0" + is-builtin-module "^1.0.0" + resolve "^1.3.2" -jest-runtime@^18.1.0: - version "18.1.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-18.1.0.tgz#3abfd687175b21fc3b85a2b8064399e997859922" +jest-runtime@^20.0.4: + version "20.0.4" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-20.0.4.tgz#a2c802219c4203f754df1404e490186169d124d8" dependencies: babel-core "^6.0.0" - babel-jest "^18.0.0" - babel-plugin-istanbul "^3.0.0" + babel-jest "^20.0.3" + babel-plugin-istanbul "^4.0.0" chalk "^1.1.3" - graceful-fs "^4.1.6" - jest-config "^18.1.0" - jest-file-exists "^17.0.0" - jest-haste-map "^18.1.0" - jest-mock "^18.0.0" - jest-resolve "^18.1.0" - jest-snapshot "^18.1.0" - jest-util "^18.1.0" - json-stable-stringify "^1.0.0" + convert-source-map "^1.4.0" + graceful-fs "^4.1.11" + jest-config "^20.0.4" + jest-haste-map "^20.0.4" + jest-regex-util "^20.0.3" + jest-resolve "^20.0.4" + jest-util "^20.0.3" + json-stable-stringify "^1.0.1" micromatch "^2.3.11" - yargs "^6.3.0" + strip-bom "3.0.0" + yargs "^7.0.2" -jest-snapshot@^18.1.0: - version "18.1.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-18.1.0.tgz#55b96d2ee639c9bce76f87f2a3fd40b71c7a5916" +jest-snapshot@^20.0.3: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-20.0.3.tgz#5b847e1adb1a4d90852a7f9f125086e187c76566" dependencies: - jest-diff "^18.1.0" - jest-file-exists "^17.0.0" - jest-matcher-utils "^18.1.0" - jest-util "^18.1.0" + chalk "^1.1.3" + jest-diff "^20.0.3" + jest-matcher-utils "^20.0.3" + jest-util "^20.0.3" natural-compare "^1.4.0" - pretty-format "^18.1.0" + pretty-format "^20.0.3" -jest-util@^18.1.0: - version "18.1.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-18.1.0.tgz#3a99c32114ab17f84be094382527006e6d4bfc6a" +jest-util@^20.0.3: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-20.0.3.tgz#0c07f7d80d82f4e5a67c6f8b9c3fe7f65cfd32ad" dependencies: - chalk "^1.1.1" - diff "^3.0.0" - graceful-fs "^4.1.6" - jest-file-exists "^17.0.0" - jest-mock "^18.0.0" + chalk "^1.1.3" + graceful-fs "^4.1.11" + jest-message-util "^20.0.3" + jest-mock "^20.0.3" + jest-validate "^20.0.3" + leven "^2.1.0" mkdirp "^0.5.1" -jest@18.1.0: - version "18.1.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-18.1.0.tgz#bcebf1e203dee5c2ad2091c805300a343d9e6c7d" +jest-validate@^20.0.3: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-20.0.3.tgz#d0cfd1de4f579f298484925c280f8f1d94ec3cab" dependencies: - jest-cli "^18.1.0" + chalk "^1.1.3" + jest-matcher-utils "^20.0.3" + leven "^2.1.0" + pretty-format "^20.0.3" -jquery@>=1.9.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.2.1.tgz#5c4d9de652af6cd0a770154a631bba12b015c787" +jest@20.0.4: + version "20.0.4" + resolved "https://registry.yarnpkg.com/jest/-/jest-20.0.4.tgz#3dd260c2989d6dad678b1e9cc4d91944f6d602ac" + dependencies: + jest-cli "^20.0.4" js-base64@^2.1.9: version "2.1.9" @@ -4064,6 +4760,10 @@ js-tokens@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + js-yaml@3.6.1: version "3.6.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" @@ -4071,13 +4771,20 @@ js-yaml@3.6.1: argparse "^1.0.7" esprima "^2.6.0" -js-yaml@^3.4.3, js-yaml@^3.5.1, js-yaml@^3.7.0: +js-yaml@^3.4.3, js-yaml@^3.7.0: version "3.8.4" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.4.tgz#520b4564f86573ba96662af85a8cafa7b4b5a6f6" dependencies: argparse "^1.0.7" esprima "^3.1.1" +js-yaml@^3.9.1: + version "3.10.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@~3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" @@ -4089,7 +4796,11 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" -jsdom@^9.9.1: +jschardet@^1.4.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.5.1.tgz#c519f629f86b3a5bedba58a88d311309eec097f9" + +jsdom@^9.12.0: version "9.12.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" dependencies: @@ -4121,15 +4832,19 @@ jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" -json-loader@0.5.4, json-loader@^0.5.4: +json-loader@^0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.4.tgz#8baa1365a632f58a3c46d20175fc6002c96e37de" +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + 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: +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: @@ -4143,7 +4858,7 @@ json3@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" -json5@^0.5.0: +json5@^0.5.0, json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -4153,6 +4868,12 @@ jsonfile@^2.1.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + optionalDependencies: + graceful-fs "^4.1.6" + jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" @@ -4174,10 +4895,16 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.3.6" -jsx-ast-utils@^1.0.0, jsx-ast-utils@^1.3.1, jsx-ast-utils@^1.3.4: +jsx-ast-utils@^1.4.0, jsx-ast-utils@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1" +jsx-ast-utils@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" + dependencies: + array-includes "^3.0.3" + kind-of@^3.0.2: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -4196,10 +4923,20 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" +latest-version@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-2.0.0.tgz#56f8d6139620847b8017f8f1f4d78e211324168b" + dependencies: + package-json "^2.0.0" + lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" +lazy-req@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-1.1.0.tgz#bdaebead30f8d824039ce0ce149d4daa07ba1fac" + lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -4210,6 +4947,10 @@ lcov-parse@0.0.10: version "0.0.10" resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" +leven@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -4227,7 +4968,27 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -loader-utils@0.2.x, loader-utils@^0.2.11, loader-utils@^0.2.16, loader-utils@^0.2.3, loader-utils@^0.2.7, loader-utils@~0.2.2, loader-utils@~0.2.5: +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +loader-fs-cache@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz#56e0bf08bd9708b26a765b68509840c8dec9fdbc" + dependencies: + find-cache-dir "^0.1.1" + mkdirp "0.5.1" + +loader-runner@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" + +loader-utils@^0.2.11, loader-utils@^0.2.16, loader-utils@^0.2.3, loader-utils@~0.2.2: version "0.2.17" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" dependencies: @@ -4236,7 +4997,7 @@ loader-utils@0.2.x, loader-utils@^0.2.11, loader-utils@^0.2.16, loader-utils@^0. json5 "^0.5.0" object-assign "^4.0.1" -loader-utils@^1.0.2: +loader-utils@^1.0.2, loader-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" dependencies: @@ -4244,13 +5005,12 @@ loader-utils@^1.0.2: emojis-list "^2.0.0" json5 "^0.5.0" -lodash._arraycopy@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1" - -lodash._arrayeach@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz#bab156b2a90d3f1bbd5c653403349e5e5933ef9e" +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" lodash._baseassign@^3.0.0: version "3.2.0" @@ -4259,25 +5019,10 @@ lodash._baseassign@^3.0.0: lodash._basecopy "^3.0.0" lodash.keys "^3.0.0" -lodash._baseclone@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz#303519bf6393fe7e42f34d8b630ef7794e3542b7" - dependencies: - lodash._arraycopy "^3.0.0" - lodash._arrayeach "^3.0.0" - lodash._baseassign "^3.0.0" - lodash._basefor "^3.0.0" - lodash.isarray "^3.0.0" - lodash.keys "^3.0.0" - lodash._basecopy@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" -lodash._basefor@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash._basefor/-/lodash._basefor-3.0.3.tgz#7550b4e9218ef09fad24343b612021c79b4c20c2" - lodash._bindcallback@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" @@ -4321,10 +5066,6 @@ lodash.assign@^3.2.0: lodash._createassigner "^3.0.0" lodash.keys "^3.0.0" -lodash.assign@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - lodash.assignin@^4.0.9: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" @@ -4343,13 +5084,6 @@ lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" -lodash.clonedeep@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz#a0a1e40d82a5ea89ff5b147b8444ed63d92827db" - dependencies: - lodash._baseclone "^3.0.0" - lodash._bindcallback "^3.0.0" - lodash.cond@^4.3.0: version "4.5.2" resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" @@ -4360,26 +5094,14 @@ lodash.deburr@^3.0.0: dependencies: lodash._root "^3.0.0" -lodash.defaults@^4.0.1: +lodash.defaults@^4.0.1, lodash.defaults@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" -lodash.endswith@^4.0.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/lodash.endswith/-/lodash.endswith-4.2.1.tgz#fed59ac1738ed3e236edd7064ec456448b37bc09" - lodash.filter@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" -lodash.find@^4.3.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" - -lodash.findindex@^4.3.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.findindex/-/lodash.findindex-4.6.0.tgz#a3245dee61fb9b6e0624b535125624bb69c11106" - lodash.flatten@^4.2.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" @@ -4428,18 +5150,10 @@ lodash.merge@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5" -lodash.omit@^4.4.1: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" - lodash.pick@^4.2.1: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" -lodash.pickby@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz#7dea21d8c18d7703a27c704c15d3b84a67e33aff" - lodash.reduce@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" @@ -4456,7 +5170,7 @@ lodash.some@^4.4.0, lodash.some@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" -lodash.template@^4.0.2: +lodash.template@^4.0.2, lodash.template@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" dependencies: @@ -4483,7 +5197,7 @@ lodash.words@^3.0.0: dependencies: lodash._root "^3.0.0" -"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.1.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.16.4, lodash@^4.17.2, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0: +"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.1.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -4491,6 +5205,10 @@ log-driver@1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.5.tgz#7ae4ec257302fd790d557cb10c97100d857b0056" +loglevel@^1.4.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.5.0.tgz#3863984a2c326b986fbb965f378758a6dc8a4324" + longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" @@ -4512,6 +5230,10 @@ lower-case@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" +lowercase-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + lru-cache@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" @@ -4535,6 +5257,12 @@ magic-string@^0.19.0: dependencies: vlq "^0.2.1" +make-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978" + dependencies: + pify "^2.3.0" + makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" @@ -4545,42 +5273,41 @@ 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" -marked-terminal@^1.6.2: - version "1.7.0" - resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-1.7.0.tgz#c8c460881c772c7604b64367007ee5f77f125904" - dependencies: - cardinal "^1.0.0" - chalk "^1.1.3" - cli-table "^0.3.1" - lodash.assign "^4.2.0" - node-emoji "^1.4.1" - -marked@^0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" - math-expression-evaluator@^1.2.14: version "1.2.17" resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" +md5.js@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + dependencies: + mimic-fn "^1.0.0" + memory-fs@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" -memory-fs@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.3.0.tgz#7bcc6b629e3a43e871d7e29aca6ae8a7f15cbb20" +memory-fs@^0.4.0, memory-fs@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" dependencies: errno "^0.1.3" readable-stream "^2.0.1" -memory-fs@~0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" +memory-fs@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.3.0.tgz#7bcc6b629e3a43e871d7e29aca6ae8a7f15cbb20" dependencies: errno "^0.1.3" readable-stream "^2.0.1" @@ -4630,6 +5357,13 @@ micromatch@^2.1.5, micromatch@^2.3.11: parse-glob "^3.0.4" regex-cache "^0.4.2" +miller-rabin@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d" + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + "mime-db@>= 1.27.0 < 2", mime-db@~1.27.0: version "1.27.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" @@ -4640,18 +5374,26 @@ mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.7: dependencies: mime-db "~1.27.0" -mime@1.2.x: - version "1.2.11" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10" - mime@1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" -mime@^1.3.4: +mime@1.3.x, mime@^1.3.4: version "1.3.6" resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0" +mimic-fn@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + +minimalistic-assert@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + "minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -4668,11 +5410,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.1.1, minimist@^1.1.3, minimist@^1.2.0: +minimist@1.2.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -"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.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: @@ -4690,9 +5432,24 @@ ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" -mute-stream@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + +multicast-dns@^6.0.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.1.1.tgz#6e7de86a570872ab17058adea7160bbeca814dde" + dependencies: + dns-packet "^1.0.1" + thunky "^0.1.0" + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + +nan@^2.0.5: + version "2.7.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" nan@^2.3.0: version "2.6.2" @@ -4724,12 +5481,6 @@ node-dir@^0.1.10: dependencies: minimatch "^3.0.2" -node-emoji@^1.4.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.5.1.tgz#fd918e412769bf8c448051238233840b2aff16a1" - dependencies: - string.prototype.codepointat "^0.2.0" - node-fetch@^1.0.1: version "1.7.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.1.tgz#899cb3d0a3c92f952c47f1b876f4c8aeabd400d5" @@ -4737,6 +5488,10 @@ node-fetch@^1.0.1: encoding "^0.1.11" is-stream "^1.0.1" +node-forge@0.6.33: + version "0.6.33" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.6.33.tgz#463811879f573d45155ad6a9f43dc296e8e85ebc" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -4769,31 +5524,75 @@ node-libs-browser@^0.7.0: util "^0.10.3" vm-browserify "0.0.4" -node-notifier@^4.6.1: - version "4.6.1" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-4.6.1.tgz#056d14244f3dcc1ceadfe68af9cff0c5473a33f3" - dependencies: - cli-usage "^0.1.1" - growly "^1.2.0" - lodash.clonedeep "^3.0.0" - minimist "^1.1.1" - semver "^5.1.0" - shellwords "^0.1.0" - which "^1.0.5" - -node-pre-gyp@^0.6.29: - version "0.6.36" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" +node-libs-browser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646" dependencies: - mkdirp "^0.5.1" - nopt "^4.0.1" - npmlog "^4.0.2" - rc "^1.1.7" - request "^2.81.0" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^2.2.1" - tar-pack "^3.4.0" + assert "^1.1.1" + browserify-zlib "^0.1.4" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^1.0.0" + https-browserify "0.0.1" + os-browserify "^0.2.0" + path-browserify "0.0.0" + process "^0.11.0" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.0.5" + stream-browserify "^2.0.1" + stream-http "^2.3.1" + string_decoder "^0.10.25" + timers-browserify "^2.0.2" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.10.3" + vm-browserify "0.0.4" + +node-notifier@^5.0.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.1.2.tgz#2fa9e12605fa10009d44549d6fcd8a63dde0e4ff" + dependencies: + growly "^1.3.0" + semver "^5.3.0" + shellwords "^0.1.0" + which "^1.2.12" + +node-pre-gyp@^0.6.29: + version "0.6.36" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" + dependencies: + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "^2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +node-pre-gyp@^0.6.36: + version "0.6.37" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.37.tgz#3c872b236b2e266e4140578fe1ee88f693323a05" + dependencies: + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "^2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tape "^4.6.3" + tar "^2.2.1" + tar-pack "^3.4.0" + +node-status-codes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f" nopt@^4.0.1: version "4.0.1" @@ -4830,6 +5629,12 @@ normalize-url@^1.4.0: query-string "^4.1.0" sort-keys "^1.0.0" +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + npmlog@^4.0.2: version "4.1.0" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.0.tgz#dc59bee85f64f00ed424efb2af0783df25d1c0b5" @@ -4865,6 +5670,14 @@ object-assign@4.1.1, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^ version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" +object-hash@^1.1.4: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.1.8.tgz#28a659cf987d96a4dabe7860289f3b5326c4a03c" + +object-inspect@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.3.0.tgz#5b1eb8e6742e2ee83342a637034d844928ba2f6d" + object-is@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6" @@ -4906,6 +5719,10 @@ object.values@^1.0.3: function-bind "^1.1.0" has "^1.0.1" +obuf@^1.0.0, obuf@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e" + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -4922,9 +5739,11 @@ once@^1.3.0, once@^1.3.3, once@^1.4.0: dependencies: wrappy "1" -onetime@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" open@0.0.5: version "0.0.5" @@ -4937,6 +5756,12 @@ opn@4.0.2: object-assign "^4.0.1" pinkie-promise "^2.0.0" +opn@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.1.0.tgz#72ce2306a17dbea58ff1041853352b4a8fc77519" + dependencies: + is-wsl "^1.1.0" + optimist@^0.6.1, optimist@~0.6.0, optimist@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" @@ -4975,11 +5800,19 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" -osenv@^0.1.4: +osenv@^0.1.0, osenv@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" dependencies: @@ -4994,6 +5827,33 @@ output-file-sync@^1.1.0: mkdirp "^0.5.1" object-assign "^4.1.0" +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + +p-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +p-map@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.1.1.tgz#05f5e4ae97a068371bc2a5cc86bfbdbc19c4ae7a" + +package-json@^2.0.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-2.4.0.tgz#0d15bd67d1cbbddbb2ca222ff2edb86bcb31a8bb" + dependencies: + got "^5.0.0" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + pako@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" @@ -5004,6 +5864,16 @@ param-case@2.1.x: dependencies: no-case "^2.2.0" +parse-asn1@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712" + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + parse-github-repo-url@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.0.tgz#286c53e2c9962e0641649ee3ac9508fca4dd959c" @@ -5017,12 +5887,16 @@ parse-glob@^3.0.4: is-extglob "^1.0.0" is-glob "^2.0.0" -parse-json@^2.2.0: +parse-json@^2.1.0, parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" dependencies: error-ex "^1.2.0" +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + parse5@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" @@ -5041,14 +5915,22 @@ path-exists@^2.0.0: dependencies: pinkie-promise "^2.0.0" +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" -path-is-inside@^1.0.1: +path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" @@ -5057,6 +5939,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.0.1: + 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" @@ -5065,10 +5953,26 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + dependencies: + pify "^2.0.0" + pbkdf2-compat@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz#b6e0c8fa99494d94e0511575802a59a5c142f288" +pbkdf2@^3.0.3: + version "3.0.14" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade" + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" @@ -5077,6 +5981,10 @@ pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" @@ -5093,15 +6001,27 @@ 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" +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" dependencies: - find-up "^1.0.0" + find-up "^2.1.0" -pluralize@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" +pluralize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-4.0.0.tgz#59b708c1c0190a2f692f1c7618c446b052fd1762" + +popper.js@^1.10.8: + version "1.12.5" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.12.5.tgz#229e4dea01629e1f1a1e26991ffade5024220fa6" + +portfinder@^1.0.9: + version "1.0.13" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" + dependencies: + async "^1.5.2" + debug "^2.2.0" + mkdirp "0.5.x" postcss-calc@^5.2.0: version "5.3.1" @@ -5164,7 +6084,13 @@ postcss-filter-plugins@^2.0.0: postcss "^5.0.4" uniqid "^4.0.0" -postcss-load-config@^1.1.0: +postcss-flexbugs-fixes@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-3.2.0.tgz#9b8b932c53f9cf13ba0f61875303e447c33dcc51" + dependencies: + postcss "^6.0.1" + +postcss-load-config@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-1.2.0.tgz#539e9afc9ddc8620121ebf9d8c3673e0ce50d28a" dependencies: @@ -5187,14 +6113,14 @@ postcss-load-plugins@^2.3.0: cosmiconfig "^2.1.1" object-assign "^4.1.0" -postcss-loader@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-1.2.2.tgz#bbf4e19a8cde85597e0c9bfd96015fe775a157ac" +postcss-loader@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-2.0.6.tgz#8c7e0055a3df1889abc6bad52dd45b2f41bbc6fc" dependencies: - loader-utils "^0.2.16" - object-assign "^4.1.0" - postcss "^5.2.9" - postcss-load-config "^1.1.0" + loader-utils "^1.1.0" + postcss "^6.0.2" + postcss-load-config "^1.2.0" + schema-utils "^0.3.0" postcss-merge-idents@^2.1.5: version "2.1.7" @@ -5364,7 +6290,7 @@ postcss-zindex@^2.0.1: postcss "^5.0.4" uniqs "^2.0.0" -postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.11, postcss@^5.2.9: +postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.11: version "5.2.17" resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.17.tgz#cf4f597b864d65c8a492b2eabe9d706c879c388b" dependencies: @@ -5381,11 +6307,19 @@ postcss@^6.0.1: source-map "^0.5.6" supports-color "^3.2.3" +postcss@^6.0.2, postcss@^6.0.6: + version "6.0.11" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.11.tgz#f48db210b1d37a7f7ab6499b7a54982997ab6f72" + dependencies: + chalk "^2.1.0" + source-map "^0.5.7" + supports-color "^4.4.0" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" -prepend-http@^1.0.0: +prepend-http@^1.0.0, prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" @@ -5393,6 +6327,10 @@ preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" +pretty-bytes@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9" + pretty-error@^2.0.2: version "2.1.0" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.0.tgz#87f4e9d706a24c87d6cbee9fabec001fcf8c75d8" @@ -5400,11 +6338,12 @@ pretty-error@^2.0.2: renderkid "^2.0.1" utila "~0.4" -pretty-format@^18.1.0: - version "18.1.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-18.1.0.tgz#fb65a86f7a7f9194963eee91865c1bcf1039e284" +pretty-format@^20.0.3: + version "20.0.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-20.0.3.tgz#020e350a560a1fe1a98dc3beb6ccffb386de8b14" dependencies: - ansi-styles "^2.2.1" + ansi-regex "^2.1.1" + ansi-styles "^3.0.0" private@^0.1.6, private@~0.1.5: version "0.1.7" @@ -5418,17 +6357,23 @@ process@^0.11.0: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" -progress@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" +progress@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" -promise@7.1.1, promise@^7.1.1: +promise@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.0.1.tgz#e45d68b00a17647b6da711bf85ed6ed47208f450" + dependencies: + asap "~2.0.3" + +promise@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf" dependencies: asap "~2.0.3" -prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.8: +prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8: version "15.5.10" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.10.tgz#2797dfc3126182e3a95e3dfbb2e893ddd7456154" dependencies: @@ -5450,6 +6395,16 @@ pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" +public-encrypt@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" @@ -5506,6 +6461,12 @@ randomatic@^1.1.3: is-number "^3.0.0" kind-of "^4.0.0" +randombytes@^2.0.0, randombytes@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.5.tgz#dc009a246b8d09a177b4b7a0ae77bc570f4b1b79" + dependencies: + safe-buffer "^5.1.0" + range-parser@^1.0.3, range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" @@ -5514,7 +6475,7 @@ raw-loader@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" -rc@^1.1.7: +rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: version "1.2.1" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" dependencies: @@ -5527,22 +6488,30 @@ react-addons-test-utils@^15.3.0: version "15.6.0" resolved "https://registry.yarnpkg.com/react-addons-test-utils/-/react-addons-test-utils-15.6.0.tgz#062d36117fe8d18f3ba5e06eb33383b0b85ea5b9" -react-dev-utils@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-0.5.2.tgz#50d0b962d3a94b6c2e8f2011ed6468e4124bc410" +react-dev-utils@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-4.0.1.tgz#106ae3d29f811c169d459bb9215a5933b7e11fb6" dependencies: - ansi-html "0.0.5" + address "1.0.2" + babel-code-frame "6.22.0" chalk "1.1.3" + cross-spawn "5.1.0" + detect-port-alt "1.1.3" escape-string-regexp "1.0.5" - filesize "3.3.0" + filesize "3.5.10" + global-modules "1.0.0" gzip-size "3.0.0" - html-entities "1.2.0" - opn "4.0.2" - recursive-readdir "2.1.1" - sockjs-client "1.0.1" + inquirer "3.2.1" + is-root "1.0.0" + opn "5.1.0" + react-error-overlay "^2.0.1" + recursive-readdir "2.2.1" + shell-quote "1.6.1" + sockjs-client "1.1.4" strip-ansi "3.0.1" + text-table "0.2.0" -react-dom@^15.3.0: +"react-dom@^15 || ^16", react-dom@^15.3.0: version "15.6.1" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.6.1.tgz#2cb0ed4191038e53c209eb3a79a23e2a4cf99470" dependencies: @@ -5551,6 +6520,19 @@ react-dom@^15.3.0: object-assign "^4.1.0" prop-types "^15.5.10" +react-error-overlay@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-2.0.1.tgz#622e3cc85cdfb4bcfc8e93f47ddcddd38e1e176e" + dependencies: + anser "1.4.1" + babel-code-frame "6.22.0" + babel-runtime "6.26.0" + html-entities "1.2.1" + react "^15 || ^16" + react-dom "^15 || ^16" + settle-promise "1.0.0" + source-map "0.5.6" + react-helmet@^5.0.3: version "5.1.3" resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-5.1.3.tgz#cd40626593a29eecf684b6d38d711f44c48188af" @@ -5560,6 +6542,14 @@ react-helmet@^5.0.3: prop-types "^15.5.4" react-side-effect "^1.1.0" +react-popper@^0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-0.7.2.tgz#5daa821eadc6f2ca802176d7be271d0f03f25f58" + dependencies: + is-equal-shallow "^0.1.3" + popper.js "^1.10.8" + prop-types "^15.5.10" + react-prism@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/react-prism/-/react-prism-4.1.0.tgz#f1f75b106eee207e72725d76bfc1307a1fb68495" @@ -5574,50 +6564,47 @@ react-router@^2.6.1: loose-envify "^1.2.0" warning "^3.0.0" -react-scripts@^0.9.5: - version "0.9.5" - resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-0.9.5.tgz#e9f05c8427e27131662a9b9d7a9786d1ff16bb3f" - dependencies: - autoprefixer "6.7.2" - babel-core "6.22.1" - babel-eslint "7.1.1" - babel-jest "18.0.0" - babel-loader "6.2.10" - babel-preset-react-app "^2.2.0" - babel-runtime "^6.20.0" - case-sensitive-paths-webpack-plugin "1.1.4" +react-scripts@^1.0.12: + version "1.0.13" + resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-1.0.13.tgz#a51d775a4b195ab2653c562b735735c8f70cba0e" + dependencies: + autoprefixer "7.1.2" + babel-core "6.25.0" + babel-eslint "7.2.3" + babel-jest "20.0.3" + babel-loader "7.1.1" + babel-preset-react-app "^3.0.2" + babel-runtime "6.26.0" + case-sensitive-paths-webpack-plugin "2.1.1" chalk "1.1.3" - connect-history-api-fallback "1.3.0" - cross-spawn "4.0.2" - css-loader "0.26.1" - detect-port "1.1.0" - dotenv "2.0.0" - eslint "3.16.1" - eslint-config-react-app "^0.6.2" - eslint-loader "1.6.0" - eslint-plugin-flowtype "2.21.0" - eslint-plugin-import "2.0.1" - eslint-plugin-jsx-a11y "4.0.0" - eslint-plugin-react "6.4.1" - extract-text-webpack-plugin "1.0.1" - file-loader "0.10.0" - fs-extra "0.30.0" - html-webpack-plugin "2.24.0" - http-proxy-middleware "0.17.3" - jest "18.1.0" - json-loader "0.5.4" + css-loader "0.28.4" + dotenv "4.0.0" + eslint "4.4.1" + eslint-config-react-app "^2.0.0" + eslint-loader "1.9.0" + eslint-plugin-flowtype "2.35.0" + eslint-plugin-import "2.7.0" + eslint-plugin-jsx-a11y "5.1.1" + eslint-plugin-react "7.1.0" + extract-text-webpack-plugin "3.0.0" + file-loader "0.11.2" + fs-extra "3.0.1" + html-webpack-plugin "2.29.0" + jest "20.0.4" object-assign "4.1.1" - postcss-loader "1.2.2" - promise "7.1.1" - react-dev-utils "^0.5.2" - style-loader "0.13.1" - url-loader "0.5.7" - webpack "1.14.0" - webpack-dev-server "1.16.2" - webpack-manifest-plugin "1.1.0" - whatwg-fetch "2.0.2" + postcss-flexbugs-fixes "3.2.0" + postcss-loader "2.0.6" + promise "8.0.1" + react-dev-utils "^4.0.1" + style-loader "0.18.2" + sw-precache-webpack-plugin "0.11.4" + url-loader "0.5.9" + webpack "3.5.1" + webpack-dev-server "2.7.1" + webpack-manifest-plugin "1.2.1" + whatwg-fetch "2.0.3" optionalDependencies: - fsevents "1.0.17" + fsevents "1.1.2" react-side-effect@^1.1.0: version "1.1.3" @@ -5633,17 +6620,18 @@ react-test-renderer@^15.5.4: fbjs "^0.8.9" object-assign "^4.1.0" -react-transition-group@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-1.2.0.tgz#b51fc921b0c3835a7ef7c571c79fc82c73e9204f" +react-transition-group@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.2.0.tgz#793bf8cb15bfe91b3101b24bce1c1d2891659575" dependencies: chain-function "^1.0.0" + classnames "^2.2.5" dom-helpers "^3.2.0" loose-envify "^1.3.1" - prop-types "^15.5.6" + prop-types "^15.5.8" warning "^3.0.0" -react@^15.3.0: +"react@^15 || ^16", react@^15.3.0: version "15.6.1" resolved "https://registry.yarnpkg.com/react/-/react-15.6.1.tgz#baa8434ec6780bde997cdc380b79cd33b96393df" dependencies: @@ -5657,6 +6645,13 @@ reactstrap-tether@1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/reactstrap-tether/-/reactstrap-tether-1.3.4.tgz#86d94d30216ffa34ceb2c626f4b9912c0d193894" +read-all-stream@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" + dependencies: + pinkie-promise "^2.0.0" + readable-stream "^2.0.0" + read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" @@ -5664,6 +6659,13 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + read-pkg@^1.0.0, read-pkg@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -5672,6 +6674,14 @@ read-pkg@^1.0.0, read-pkg@^1.1.0: normalize-package-data "^2.3.2" path-type "^1.0.0" +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + readable-stream@1.0: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" @@ -5681,6 +6691,18 @@ readable-stream@1.0: isarray "0.0.1" string_decoder "~0.10.x" +readable-stream@^2.0.0, readable-stream@^2.2.9: + version "2.3.3" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.6: version "2.2.11" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.11.tgz#0796b31f8d7688007ff0b93a8088d34aa17c0f72" @@ -5702,23 +6724,9 @@ 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" - -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" - -recursive-readdir@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.1.1.tgz#a01cfc7f7f38a53ec096a096f63a50489c3e297c" +recursive-readdir@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.1.tgz#90ef231d0778c5ce093c9a48d74e5c5422d13a99" dependencies: minimatch "3.0.3" @@ -5729,12 +6737,6 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" -redeyed@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-1.0.1.tgz#e96c193b40c0816b00aec842698e61185e55498a" - dependencies: - esprima "~3.0.0" - reduce-css-calc@^1.2.6: version "1.3.0" resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" @@ -5757,6 +6759,10 @@ regenerator-runtime@^0.10.0: version "0.10.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" +regenerator-runtime@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" + regenerator-runtime@^0.9.5: version "0.9.6" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz#d33eb95d0d2001a4be39659707c51b0cb71ce029" @@ -5769,9 +6775,9 @@ regenerator-transform@0.9.11: babel-types "^6.19.0" private "^0.1.6" -regenerator-transform@0.9.8: - version "0.9.8" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.8.tgz#0f88bb2bc03932ddb7b6b7312e68078f01026d6c" +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" dependencies: babel-runtime "^6.18.0" babel-types "^6.19.0" @@ -5800,6 +6806,19 @@ regexpu-core@^2.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" +registry-auth-token@^3.0.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006" + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + dependencies: + rc "^1.0.1" + regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" @@ -5914,7 +6933,7 @@ require-relative@^0.8.7: version "0.8.7" resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" -require-uncached@^1.0.2: +require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" dependencies: @@ -5925,6 +6944,13 @@ requires-port@1.0.x, requires-port@1.x.x: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" +resolve-dir@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" @@ -5939,12 +6965,24 @@ resolve@^1.1.6, resolve@^1.1.7, resolve@^1.2.0: dependencies: path-parse "^1.0.5" -restore-cursor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" +resolve@^1.3.2, resolve@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86" dependencies: - exit-hook "^1.0.0" - onetime "^1.0.0" + path-parse "^1.0.5" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +resumer@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" + dependencies: + through "~2.3.4" right-align@^0.1.1: version "0.1.3" @@ -5968,6 +7006,13 @@ ripemd160@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-0.2.0.tgz#2bf198bde167cacfa51c0a928e84b68bbe171fce" +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" + dependencies: + hash-base "^2.0.0" + inherits "^2.0.1" + rollup-plugin-babel@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-2.7.1.tgz#16528197b0f938a1536f44683c7a93d573182f57" @@ -5977,13 +7022,13 @@ rollup-plugin-babel@^2.7.1: object-assign "^4.1.0" rollup-pluginutils "^1.5.0" -rollup-plugin-babili@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-babili/-/rollup-plugin-babili-3.1.0.tgz#27ada043a0ed021050a712528f68ed641888b5dc" +rollup-plugin-babili@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-babili/-/rollup-plugin-babili-3.1.1.tgz#a8bfed146691fff982c397364a67f75a78754889" dependencies: "@comandeer/babel-plugin-banner" "^1.0.0" babel-core "^6.21.0" - babel-preset-babili "^0.1.2" + babel-preset-babili "^0.1.3" rollup-plugin-commonjs@^8.0.2: version "8.0.2" @@ -6026,30 +7071,43 @@ rollup-pluginutils@^2.0.1: estree-walker "^0.3.0" micromatch "^2.3.11" -rollup@^0.41.5: - version "0.41.6" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.41.6.tgz#e0d05497877a398c104d816d2733a718a7a94e2a" +rollup@^0.43.0: + version "0.43.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.43.1.tgz#a7770af9711bd21dda977e7cce3d0f63fdfdfa04" dependencies: source-map-support "^0.4.0" + optionalDependencies: + weak "^1.0.1" -run-async@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" dependencies: - once "^1.3.0" + is-promise "^2.1.0" -rx-lite@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" safe-buffer@^5.0.1, safe-buffer@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" -sane@~1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/sane/-/sane-1.4.1.tgz#88f763d74040f5f0c256b6163db399bf110ac715" +safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +sane@~1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-1.6.0.tgz#9610c452307a135d29c1fdfe2547034180c46775" dependencies: + anymatch "^1.3.0" exec-sh "^0.2.0" fb-watchman "^1.8.0" minimatch "^3.0.2" @@ -6061,10 +7119,36 @@ sax@^1.2.1, sax@~1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828" +schema-utils@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" + dependencies: + ajv "^5.0.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + +selfsigned@^1.9.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.1.tgz#bf8cb7b83256c4551e31347c6311778db99eec52" + dependencies: + node-forge "0.6.33" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + dependencies: + semver "^5.0.3" + "semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.1.0, semver@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" +semver@^5.0.3: + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + send@0.15.3: version "0.15.3" resolved "https://registry.yarnpkg.com/send/-/send-0.15.3.tgz#5013f9f99023df50d1bd9892c19e3defd1d53309" @@ -6104,6 +7188,10 @@ serve-static@1.12.3: parseurl "~1.3.1" send "0.15.3" +serviceworker-cache-polyfill@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz#de19ee73bef21ab3c0740a37b33db62464babdeb" + set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -6120,10 +7208,20 @@ setprototypeof@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" +settle-promise@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/settle-promise/-/settle-promise-1.0.0.tgz#697adb58b821f387ce2757c06efc9de5f0ee33d8" + sha.js@2.2.6: version "2.2.6" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.2.6.tgz#17ddeddc5f722fb66501658895461977867315ba" +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.8" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.8.tgz#37068c2c476b6baf402d14a49c67f597921f634f" + dependencies: + inherits "^2.0.1" + shallowequal@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.0.1.tgz#4349160418200bad3b82d723ded65f2354db2a23" @@ -6134,19 +7232,30 @@ shaven@^0.8.1: dependencies: escape-html "~1.0.1" -shelljs@^0.7.5: - version "0.7.8" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +shell-quote@1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" + dependencies: + array-filter "~0.0.0" + array-map "~0.0.0" + array-reduce "~0.0.0" + jsonify "~0.0.0" shellwords@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14" -signal-exit@^3.0.0: +signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -6158,24 +7267,17 @@ 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.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" dependencies: hoek "2.x.x" -sockjs-client@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.0.1.tgz#8943ae05b46547bc2054816c409002cf5e2fe026" - dependencies: - debug "^2.1.0" - eventsource "^0.1.3" - faye-websocket "~0.7.3" - inherits "^2.0.1" - json3 "^3.3.2" - url-parse "^1.0.1" - -sockjs-client@^1.0.3: +sockjs-client@1.1.4, sockjs-client@^1.0.3: version "1.1.4" resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.4.tgz#5babe386b775e4cf14e7520911452654016c8b12" dependencies: @@ -6186,7 +7288,7 @@ sockjs-client@^1.0.3: json3 "^3.3.2" url-parse "^1.1.8" -sockjs@^0.3.15: +sockjs@0.3.18, sockjs@^0.3.15: version "0.3.18" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.18.tgz#d9b289316ca7df77595ef299e075f0f937eb4207" dependencies: @@ -6199,17 +7301,21 @@ sort-keys@^1.0.0: dependencies: is-plain-obj "^1.0.0" -source-list-map@^0.1.4, source-list-map@~0.1.7: +source-list-map@^0.1.4, source-list-map@^0.1.7, source-list-map@~0.1.7: version "0.1.8" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" +source-list-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" + source-map-support@^0.4.0, source-map-support@^0.4.2: version "0.4.15" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" dependencies: source-map "^0.5.6" -source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3: +source-map@0.5.6, source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" @@ -6219,6 +7325,10 @@ source-map@^0.4.4, source-map@~0.4.1: dependencies: amdefine ">=0.0.4" +source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + source-map@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" @@ -6239,6 +7349,29 @@ spdx-license-ids@^1.0.2: version "1.2.2" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" +spdy-transport@^2.0.18: + version "2.0.20" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.0.20.tgz#735e72054c486b2354fe89e702256004a39ace4d" + dependencies: + debug "^2.6.8" + detect-node "^2.0.3" + hpack.js "^2.1.6" + obuf "^1.1.1" + readable-stream "^2.2.9" + safe-buffer "^5.0.1" + wbuf "^1.7.2" + +spdy@^3.4.1: + version "3.4.7" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" + dependencies: + debug "^2.6.8" + handle-thing "^1.2.5" + http-deceiver "^1.2.7" + safe-buffer "^5.0.1" + select-hose "^2.0.0" + spdy-transport "^2.0.18" + split2@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/split2/-/split2-2.1.1.tgz#7a1f551e176a90ecd3345f7246a0cfe175ef4fd0" @@ -6305,6 +7438,12 @@ strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" +string-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" + dependencies: + strip-ansi "^3.0.0" + string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -6320,9 +7459,20 @@ string-width@^2.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^3.0.0" -string.prototype.codepointat@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/string.prototype.codepointat/-/string.prototype.codepointat-0.2.0.tgz#6b26e9bd3afcaa7be3b4269b526de1b82000ac78" +string-width@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string.prototype.trim@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.0" + function-bind "^1.0.2" string_decoder@^0.10.25, string_decoder@~0.10.x: version "0.10.31" @@ -6334,6 +7484,12 @@ string_decoder@~1.0.0: dependencies: safe-buffer "~5.0.1" +string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + stringstream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -6344,15 +7500,25 @@ strip-ansi@3.0.1, strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-bom@3.0.0, strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" dependencies: is-utf8 "^0.2.0" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" strip-indent@^1.0.1: version "1.0.1" @@ -6364,11 +7530,12 @@ strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" -style-loader@0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.13.1.tgz#468280efbc0473023cd3a6cd56e33b5a1d7fc3a9" +style-loader@0.18.2: + version "0.18.2" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.18.2.tgz#cc31459afbcd6d80b7220ee54b291a9fd66ff5eb" dependencies: - loader-utils "^0.2.7" + loader-utils "^1.0.2" + schema-utils "^0.3.0" style-loader@^0.13.1: version "0.13.2" @@ -6386,6 +7553,12 @@ supports-color@^3.1.0, supports-color@^3.1.1, supports-color@^3.1.2, supports-co dependencies: has-flag "^1.0.0" +supports-color@^4.0.0, supports-color@^4.2.1, supports-color@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" + dependencies: + has-flag "^2.0.0" + svgo@^0.7.0: version "0.7.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" @@ -6398,13 +7571,43 @@ svgo@^0.7.0: sax "~1.2.1" whet.extend "~0.9.9" +sw-precache-webpack-plugin@0.11.4: + version "0.11.4" + resolved "https://registry.yarnpkg.com/sw-precache-webpack-plugin/-/sw-precache-webpack-plugin-0.11.4.tgz#a695017e54eed575551493a519dc1da8da2dc5e0" + dependencies: + del "^2.2.2" + sw-precache "^5.1.1" + uglify-js "^3.0.13" + +sw-precache@^5.1.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/sw-precache/-/sw-precache-5.2.0.tgz#eb6225ce580ceaae148194578a0ad01ab7ea199c" + dependencies: + dom-urls "^1.1.0" + es6-promise "^4.0.5" + glob "^7.1.1" + lodash.defaults "^4.2.0" + lodash.template "^4.4.0" + meow "^3.7.0" + mkdirp "^0.5.1" + pretty-bytes "^4.0.2" + sw-toolbox "^3.4.0" + update-notifier "^1.0.3" + +sw-toolbox@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/sw-toolbox/-/sw-toolbox-3.6.0.tgz#26df1d1c70348658e4dea2884319149b7b3183b5" + dependencies: + path-to-regexp "^1.0.1" + serviceworker-cache-polyfill "^4.0.0" + symbol-tree@^3.2.1: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" -table@^3.7.8: - version "3.8.3" - resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" +table@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.1.tgz#a8116c133fac2c61f4a420ab6cdf5c4d61f0e435" dependencies: ajv "^4.7.0" ajv-keywords "^1.0.0" @@ -6417,6 +7620,28 @@ tapable@^0.1.8, tapable@~0.1.8: version "0.1.10" resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" +tapable@^0.2.7: + version "0.2.8" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" + +tape@^4.6.3: + version "4.8.0" + resolved "https://registry.yarnpkg.com/tape/-/tape-4.8.0.tgz#f6a9fec41cc50a1de50fa33603ab580991f6068e" + dependencies: + deep-equal "~1.0.1" + defined "~1.0.0" + for-each "~0.3.2" + function-bind "~1.1.0" + glob "~7.1.2" + has "~1.0.1" + inherits "~2.0.3" + minimist "~1.2.0" + object-inspect "~1.3.0" + resolve "~1.4.0" + resumer "~0.0.0" + string.prototype.trim "~1.1.2" + through "~2.3.8" + tar-pack@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" @@ -6445,9 +7670,9 @@ tempfile@^1.1.1: os-tmpdir "^1.0.0" uuid "^2.0.1" -test-exclude@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-3.3.0.tgz#7a17ca1239988c98367b0621456dbb7d4bc38977" +test-exclude@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.1.tgz#4d84964b0966b0087ecc334a2ce002d3d9341e26" dependencies: arrify "^1.0.1" micromatch "^2.3.11" @@ -6455,15 +7680,11 @@ test-exclude@^3.3.0: read-pkg-up "^1.0.1" require-main-filename "^1.0.1" -tether@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/tether/-/tether-1.4.0.tgz#0f9fa171f75bf58485d8149e94799d7ae74d1c1a" - text-extensions@^1.0.0: version "1.5.0" resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.5.0.tgz#d1cb2d14b5d0bc45bfdca8a08a473f68c7eb0cbc" -text-table@~0.2.0: +text-table@0.2.0, text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -6478,16 +7699,34 @@ through2@^2.0.0, through2@^2.0.2: readable-stream "^2.1.5" xtend "~4.0.1" -through@2, "through@>=2.2.7 <3", through@^2.3.6: +through@2, "through@>=2.2.7 <3", through@^2.3.6, through@~2.3.4, through@~2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" +thunky@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-0.1.0.tgz#bf30146824e2b6e67b0f2d7a4ac8beb26908684e" + +time-stamp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.0.0.tgz#95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357" + +timed-out@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217" + timers-browserify@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.2.tgz#ab4883cf597dcd50af211349a00fbca56ac86b86" dependencies: setimmediate "^1.0.4" +tmp@^0.0.31: + version "0.0.31" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" + dependencies: + os-tmpdir "~1.0.1" + tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" @@ -6496,7 +7735,7 @@ to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" -to-fast-properties@^1.0.1: +to-fast-properties@^1.0.1, to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" @@ -6569,11 +7808,11 @@ ua-parser-js@^0.7.9: version "0.7.12" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.12.tgz#04c81a99bdd5dc52263ea29d24c6bf8d4818a4bb" -uglify-js@3.0.x: - version "3.0.17" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.0.17.tgz#d228cd55c2df9b3d2f53f147568cb4cc4a72cc06" +uglify-js@3.1.x, uglify-js@^3.0.13: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.1.0.tgz#92fae17b88dfbc3c394175a935044cdbcf4085ae" dependencies: - commander "~2.9.0" + commander "~2.11.0" source-map "~0.5.1" uglify-js@^2.6, uglify-js@~2.7.3: @@ -6585,10 +7824,27 @@ uglify-js@^2.6, uglify-js@~2.7.3: uglify-to-browserify "~1.0.0" yargs "~3.10.0" +uglify-js@^2.8.29: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" +uglifyjs-webpack-plugin@^0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309" + dependencies: + source-map "^0.5.6" + uglify-js "^2.8.29" + webpack-sources "^1.0.1" + uid-number@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" @@ -6607,20 +7863,51 @@ uniqs@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" +universalify@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" +unzip-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" + +update-notifier@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-1.0.3.tgz#8f92c515482bd6831b7c93013e70f87552c7cf5a" + dependencies: + boxen "^0.6.0" + chalk "^1.0.0" + configstore "^2.0.0" + is-npm "^1.0.0" + latest-version "^2.0.0" + lazy-req "^1.1.0" + semver-diff "^2.0.0" + xdg-basedir "^2.0.0" + upper-case@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" -url-loader@0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.5.7.tgz#67e8779759f8000da74994906680c943a9b0925d" +urijs@^1.16.1: + version "1.18.12" + resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.18.12.tgz#f04d91e1fabb29c16fc842f9a14ee8ddc3fda64e" + +url-loader@0.5.9: + version "0.5.9" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.5.9.tgz#cc8fea82c7b906e7777019250869e569e995c295" + dependencies: + loader-utils "^1.0.2" + mime "1.3.x" + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" dependencies: - loader-utils "0.2.x" - mime "1.2.x" + prepend-http "^1.0.1" url-parse@1.0.x: version "1.0.5" @@ -6629,7 +7916,7 @@ url-parse@1.0.x: querystringify "0.0.x" requires-port "1.0.x" -url-parse@^1.0.1, url-parse@^1.1.8: +url-parse@^1.1.8: version "1.1.9" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.1.9.tgz#c67f1d775d51f0a18911dd7b3ffad27bb9e5bd19" dependencies: @@ -6647,12 +7934,6 @@ user-home@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" -user-home@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" - dependencies: - os-homedir "^1.0.0" - util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -6750,6 +8031,27 @@ watchpack@^0.2.1: chokidar "^1.0.0" graceful-fs "^4.1.2" +watchpack@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.4.0.tgz#4a1472bcbb952bd0a9bb4036801f954dfb39faac" + dependencies: + async "^2.1.2" + chokidar "^1.7.0" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.2.tgz#d697b99f1f59512df2751be42769c1580b5801fe" + dependencies: + minimalistic-assert "^1.0.0" + +weak@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/weak/-/weak-1.0.1.tgz#ab99aab30706959aa0200cb8cf545bb9cb33b99e" + dependencies: + bindings "^1.2.1" + nan "^2.0.5" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -6765,7 +8067,7 @@ webpack-core@~0.6.9: source-list-map "~0.1.7" source-map "~0.4.1" -webpack-dev-middleware@^1.10.2, webpack-dev-middleware@^1.4.0: +webpack-dev-middleware@^1.10.2: version "1.10.2" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.10.2.tgz#2e252ce1dfb020dbda1ccb37df26f30ab014dbd1" dependencies: @@ -6774,23 +8076,43 @@ webpack-dev-middleware@^1.10.2, webpack-dev-middleware@^1.4.0: path-is-absolute "^1.0.0" range-parser "^1.0.3" -webpack-dev-server@1.16.2: - version "1.16.2" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-1.16.2.tgz#8bebc2c4ce1c45a15c72dd769d9ba08db306a793" +webpack-dev-middleware@^1.11.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz#d34efefb2edda7e1d3b5dbe07289513219651709" + dependencies: + memory-fs "~0.4.1" + mime "^1.3.4" + path-is-absolute "^1.0.0" + range-parser "^1.0.3" + time-stamp "^2.0.0" + +webpack-dev-server@2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.7.1.tgz#21580f5a08cd065c71144cf6f61c345bca59a8b8" dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^1.6.0" compression "^1.5.2" connect-history-api-fallback "^1.3.0" + del "^3.0.0" express "^4.13.3" - http-proxy-middleware "~0.17.1" - open "0.0.5" - optimist "~0.6.1" + html-entities "^1.2.0" + http-proxy-middleware "~0.17.4" + internal-ip "^1.2.0" + ip "^1.1.5" + loglevel "^1.4.1" + opn "4.0.2" + portfinder "^1.0.9" + selfsigned "^1.9.1" serve-index "^1.7.2" - sockjs "^0.3.15" - sockjs-client "^1.0.3" - stream-cache "~0.0.1" + sockjs "0.3.18" + sockjs-client "1.1.4" + spdy "^3.4.1" strip-ansi "^3.0.0" supports-color "^3.1.1" - webpack-dev-middleware "^1.4.0" + webpack-dev-middleware "^1.11.0" + yargs "^6.0.0" webpack-dev-server@^1.14.1: version "1.16.5" @@ -6810,9 +8132,9 @@ webpack-dev-server@^1.14.1: supports-color "^3.1.1" webpack-dev-middleware "^1.10.2" -webpack-manifest-plugin@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-1.1.0.tgz#6b6c718aade8a2537995784b46bd2e9836057caa" +webpack-manifest-plugin@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-1.2.1.tgz#e02f0846834ce98dca516946ee3ee679745e7db1" dependencies: fs-extra "^0.30.0" lodash ">=3.5 <5" @@ -6824,25 +8146,39 @@ webpack-sources@^0.1.0: source-list-map "~0.1.7" source-map "~0.5.3" -webpack@1.14.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-1.14.0.tgz#54f1ffb92051a328a5b2057d6ae33c289462c823" +webpack-sources@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.0.1.tgz#c7356436a4d13123be2e2426a05d1dad9cbe65cf" dependencies: - acorn "^3.0.0" - async "^1.3.0" - clone "^1.0.2" - enhanced-resolve "~0.9.0" - interpret "^0.6.4" - loader-utils "^0.2.11" - memory-fs "~0.3.0" + source-list-map "^2.0.0" + source-map "~0.5.3" + +webpack@3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.5.1.tgz#b749ee3d2b5a118dad53e8e41585b3f71e75499a" + dependencies: + acorn "^5.0.0" + acorn-dynamic-import "^2.0.0" + ajv "^5.1.5" + ajv-keywords "^2.0.0" + async "^2.1.2" + enhanced-resolve "^3.4.0" + escope "^3.6.0" + interpret "^1.0.0" + json-loader "^0.5.4" + json5 "^0.5.1" + loader-runner "^2.3.0" + loader-utils "^1.1.0" + memory-fs "~0.4.1" mkdirp "~0.5.0" - node-libs-browser "^0.7.0" - optimist "~0.6.0" - supports-color "^3.1.0" - tapable "~0.1.8" - uglify-js "~2.7.3" - watchpack "^0.2.1" - webpack-core "~0.6.9" + node-libs-browser "^2.0.0" + source-map "^0.5.3" + supports-color "^4.2.1" + tapable "^0.2.7" + uglifyjs-webpack-plugin "^0.4.6" + watchpack "^1.4.0" + webpack-sources "^1.0.1" + yargs "^8.0.2" webpack@^1.12.13: version "1.15.0" @@ -6864,7 +8200,7 @@ webpack@^1.12.13: watchpack "^0.2.1" webpack-core "~0.6.9" -websocket-driver@>=0.3.6, websocket-driver@>=0.5.1: +websocket-driver@>=0.5.1: version "0.6.5" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" dependencies: @@ -6880,7 +8216,11 @@ whatwg-encoding@^1.0.1: dependencies: iconv-lite "0.4.13" -whatwg-fetch@2.0.2, whatwg-fetch@>=0.10.0: +whatwg-fetch@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" + +whatwg-fetch@>=0.10.0: version "2.0.2" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.2.tgz#fe294d1d89e36c5be8b3195057f2e4bc74fc980e" @@ -6899,7 +8239,17 @@ which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" -which@^1.0.5, which@^1.1.1, which@^1.2.9: +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + +which@^1.2.12, which@^1.2.14: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + dependencies: + isexe "^2.0.0" + +which@^1.2.9: version "1.2.14" resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" dependencies: @@ -6911,6 +8261,12 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2" +widest-line@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" + dependencies: + string-width "^1.0.1" + window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" @@ -6945,12 +8301,26 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" +write-file-atomic@^1.1.2: + version "1.3.4" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" + dependencies: + graceful-fs "^4.1.11" + 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" +xdg-basedir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" + dependencies: + os-homedir "^1.0.0" + xml-char-classes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/xml-char-classes/-/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d" @@ -6977,7 +8347,19 @@ yargs-parser@^4.2.0: dependencies: camelcase "^3.0.0" -yargs@^6.3.0: +yargs-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + dependencies: + camelcase "^3.0.0" + +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + dependencies: + camelcase "^4.1.0" + +yargs@^6.0.0: version "6.6.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" dependencies: @@ -6995,6 +8377,42 @@ yargs@^6.3.0: y18n "^3.2.1" yargs-parser "^4.2.0" +yargs@^7.0.2: + version "7.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.0" + +yargs@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + read-pkg-up "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^7.0.0" + yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" From 627a73ef1c851ed72596ccfeb0906c6df661355c Mon Sep 17 00:00:00 2001 From: Evan Sharp Date: Sat, 16 Sep 2017 01:47:03 -0400 Subject: [PATCH 041/862] feat(UncontrolledCarousel): add UncontrolledCarousel --- docs/lib/Components/CarouselPage.js | 49 +++++++-- docs/lib/examples/Carousel.js | 38 +++---- docs/lib/examples/CarouselUncontrolled.js | 24 +++++ src/Carousel.js | 98 +++++++++++------- src/CarouselIndicators.js | 2 +- src/CarouselItem.js | 3 +- src/UncontrolledCarousel.js | 111 ++++++++++++++++++++ src/__tests__/Carousel.spec.js | 34 +++++- src/__tests__/UncontrolledCarousel.spec.js | 115 +++++++++++++++++++++ src/index.js | 2 + 10 files changed, 409 insertions(+), 67 deletions(-) create mode 100644 docs/lib/examples/CarouselUncontrolled.js create mode 100644 src/UncontrolledCarousel.js create mode 100644 src/__tests__/UncontrolledCarousel.spec.js diff --git a/docs/lib/Components/CarouselPage.js b/docs/lib/Components/CarouselPage.js index 3da5ad505..d67fd99b7 100644 --- a/docs/lib/Components/CarouselPage.js +++ b/docs/lib/Components/CarouselPage.js @@ -3,7 +3,9 @@ import React from 'react'; import { PrismCode } from 'react-prism'; import Helmet from 'react-helmet'; import CarouselExample from '../examples/Carousel'; -const CarouslExampleSource = require('!!raw!../examples/Carousel'); +const CarouselExampleSource = require('!!raw!../examples/Carousel'); +import CarouselUncontrolledExample from '../examples/CarouselUncontrolled'; +const CarouselUncontrolledExampleSource = require('!!raw!../examples/CarouselUncontrolled'); export default class CarouselPage extends React.Component { render() { @@ -17,7 +19,7 @@ export default class CarouselPage extends React.Component {
               
    -            {CarouslExampleSource}
    +            {CarouselExampleSource}
               
             
    @@ -33,9 +35,14 @@ export default class CarouselPage extends React.Component { previous: PropTypes.func.isRequired, // controls if the left and right arrow keys should control the carousel keyboard: PropTypes.bool, - // controls if the carousel should not automatically cycle (default: false) - paused: PropTypes.bool, - // the interval at which the carousel automatically cycles (default: 5000) + /* If set to "hover", pauses the cycling of the carousel on mouseenter and resumes the cycling of the carousel on + * mouseleave. If set to false, hovering over the carousel won't pause it. (default: "hover") + */ + pause: PropTypes.oneOf(['hover', false]), + // Autoplays the carousel after the user manually cycles the first item. If "carousel", autoplays the carousel on load. + // This is how bootstrap defines it... I would prefer a bool named autoplay or something... + ride: PropTypes.oneOf(['carousel']), + // the interval at which the carousel automatically cycles (default: 5000) interval: PropTypes.oneOfType([ PropTypes.number, PropTypes.string, @@ -43,12 +50,40 @@ export default class CarouselPage extends React.Component { ]), children: PropTypes.array, // called when the mouse enters the Carousel - hoverStart: PropTypes.func, + mouseEnter: PropTypes.func, // called when the mouse exits the Carousel - hoverEnd: PropTypes.func, + mouseLeave: PropTypes.func, // controls whether the slide animation on the Carousel works or not slide: PropTypes.bool, cssModule: PropTypes.object, +};`} + + + +

    Uncontrolled Carousel

    +

    + For the most basic use-case an uncontrolled component can provide the functionality wanted without the need to manage/control the state of the component. UncontrolledCarousel does not require previous, next nor activeIndex props to work. + Anything provided to a normal Carousel can also be provided to UncontrolledCarousel, overriding the control UncontrolledCarousel provides. Additionally, you can hide the controls by passing false to the controls prop + and you can disable the indicators by passing false to the indicators prop; both are visible by default. Autoplay (ride="carousel") is enabled by default, you can disable it by passing false to the autoPlay prop. +

    +
    + +
    +
    +          
    +            {CarouselUncontrolledExampleSource}
    +          
    +        
    + +

    Uncontrolled Carousel Properties

    +

    Same as Carousel (except children) can be overridden plus the following

    +
    +          
    +{`UncontrolledCarousel.propTypes = {
    +  items: PropTypes.array,isRequired,
    +  indicators: PropTypes.bool, // default: true
    +  controls: PropTypes.bool, // default: true
    +  autoPlay: PropTypes.bool, // default: true
     };`}
               
             
    diff --git a/docs/lib/examples/Carousel.js b/docs/lib/examples/Carousel.js index 2d26c5c5a..772136345 100644 --- a/docs/lib/examples/Carousel.js +++ b/docs/lib/examples/Carousel.js @@ -28,43 +28,48 @@ const items = [ class Example extends Component { constructor(props) { super(props); - this.state = { activeIndex: 0, paused: false }; + this.state = { activeIndex: 0 }; this.next = this.next.bind(this); this.previous = this.previous.bind(this); this.goToIndex = this.goToIndex.bind(this); - this.pause = this.pause.bind(this); - this.cycle = this.cycle.bind(this); + this.onExiting = this.onExiting.bind(this); + this.onExited = this.onExited.bind(this); + } + + onExiting() { + this.animating = true; + } + + onExited() { + this.animating = false; } next() { + if (this.animating) return; const nextIndex = this.state.activeIndex === items.length - 1 ? 0 : this.state.activeIndex + 1; this.setState({ activeIndex: nextIndex }); } previous() { + if (this.animating) return; const nextIndex = this.state.activeIndex === 0 ? items.length - 1 : this.state.activeIndex - 1; this.setState({ activeIndex: nextIndex }); } goToIndex(newIndex) { + if (this.animating) return; this.setState({ activeIndex: newIndex }); } - pause() { - this.setState({ paused: true }); - } - - cycle() { - this.setState({ paused: false }); - } - render() { const { activeIndex } = this.state; - const slides = items.map((item, idx) => { + const slides = items.map((item) => { return ( @@ -75,14 +80,11 @@ class Example extends Component { return ( - + {slides} diff --git a/docs/lib/examples/CarouselUncontrolled.js b/docs/lib/examples/CarouselUncontrolled.js new file mode 100644 index 000000000..80437235e --- /dev/null +++ b/docs/lib/examples/CarouselUncontrolled.js @@ -0,0 +1,24 @@ +import React from 'react'; +import { UncontrolledCarousel } from 'reactstrap'; + +const items = [ + { + src: 'data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%22800%22%20height%3D%22400%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20800%20400%22%20preserveAspectRatio%3D%22none%22%3E%3Cdefs%3E%3Cstyle%20type%3D%22text%2Fcss%22%3E%23holder_15ba800aa1d%20text%20%7B%20fill%3A%23555%3Bfont-weight%3Anormal%3Bfont-family%3AHelvetica%2C%20monospace%3Bfont-size%3A40pt%20%7D%20%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cg%20id%3D%22holder_15ba800aa1d%22%3E%3Crect%20width%3D%22800%22%20height%3D%22400%22%20fill%3D%22%23777%22%3E%3C%2Frect%3E%3Cg%3E%3Ctext%20x%3D%22285.921875%22%20y%3D%22218.3%22%3EFirst%20slide%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E', + altText: 'Slide 1', + caption: 'Slide 1' + }, + { + src: 'data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%22800%22%20height%3D%22400%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20800%20400%22%20preserveAspectRatio%3D%22none%22%3E%3Cdefs%3E%3Cstyle%20type%3D%22text%2Fcss%22%3E%23holder_15ba800aa20%20text%20%7B%20fill%3A%23444%3Bfont-weight%3Anormal%3Bfont-family%3AHelvetica%2C%20monospace%3Bfont-size%3A40pt%20%7D%20%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cg%20id%3D%22holder_15ba800aa20%22%3E%3Crect%20width%3D%22800%22%20height%3D%22400%22%20fill%3D%22%23666%22%3E%3C%2Frect%3E%3Cg%3E%3Ctext%20x%3D%22247.3203125%22%20y%3D%22218.3%22%3ESecond%20slide%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E', + altText: 'Slide 2', + caption: 'Slide 2' + }, + { + src: 'data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%22800%22%20height%3D%22400%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20800%20400%22%20preserveAspectRatio%3D%22none%22%3E%3Cdefs%3E%3Cstyle%20type%3D%22text%2Fcss%22%3E%23holder_15ba800aa21%20text%20%7B%20fill%3A%23333%3Bfont-weight%3Anormal%3Bfont-family%3AHelvetica%2C%20monospace%3Bfont-size%3A40pt%20%7D%20%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cg%20id%3D%22holder_15ba800aa21%22%3E%3Crect%20width%3D%22800%22%20height%3D%22400%22%20fill%3D%22%23555%22%3E%3C%2Frect%3E%3Cg%3E%3Ctext%20x%3D%22277%22%20y%3D%22218.3%22%3EThird%20slide%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E', + altText: 'Slide 3', + caption: 'Slide 3' + } +]; + +const Example = () => ; + +export default Example; diff --git a/src/Carousel.js b/src/Carousel.js index 27e897a3f..3d999178e 100644 --- a/src/Carousel.js +++ b/src/Carousel.js @@ -1,6 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; +import CarouselItem from './CarouselItem'; import { mapToCssModules } from './utils'; class Carousel extends React.Component { @@ -8,6 +9,8 @@ class Carousel extends React.Component { super(props); this.handleKeyPress = this.handleKeyPress.bind(this); this.renderItems = this.renderItems.bind(this); + this.hoverStart = this.hoverStart.bind(this); + this.hoverEnd = this.hoverEnd.bind(this); this.state = { direction: 'right' }; } @@ -17,20 +20,16 @@ class Carousel extends React.Component { componentDidMount() { // Set up the cycle - if (this.props.interval) { - this.cycleInterval = setInterval(() => { - if (!this.props.paused) { - this.props.next(); - } - }, parseInt(this.props.interval, 10)); + if (this.props.ride === 'carousel') { + this.setInterval(); } - if (this.props.keyboard) { - document.addEventListener('keyup', this.handleKeyPress); - } + // TODO: move this to the specific carousel like bootstrap. Currently it will trigger ALL carousels on the page. + document.addEventListener('keyup', this.handleKeyPress); } componentWillReceiveProps(nextProps) { + this.setInterval(nextProps); // Calculate the direction to turn if (this.props.activeIndex + 1 === nextProps.activeIndex) { this.setState({ direction: 'right' }); @@ -38,21 +37,55 @@ class Carousel extends React.Component { this.setState({ direction: 'left' }); } else if (this.props.activeIndex > nextProps.activeIndex) { this.setState({ direction: 'right' }); - } else { + } else if (this.props.activeIndex !== nextProps.activeIndex) { this.setState({ direction: 'left' }); } } componentWillUnmount() { + this.clearInterval(); + document.removeEventListener('keyup', this.handleKeyPress); + } + + setInterval(props = this.props) { + // make sure not to have multiple intervals going... + this.clearInterval(); + if (props.interval) { + this.cycleInterval = setInterval(() => { + props.next(); + }, parseInt(props.interval, 10)); + } + } + + clearInterval() { clearInterval(this.cycleInterval); - document.removeEventListener('key', this.handleKeyPress); + } + + hoverStart(...args) { + if (this.props.pause === 'hover') { + this.clearInterval(); + } + if (this.props.mouseEnter) { + this.props.mouseEnter(...args); + } + } + + hoverEnd(...args) { + if (this.props.pause === 'hover') { + this.setInterval(); + } + if (this.props.mouseLeave) { + this.props.mouseLeave(...args); + } } handleKeyPress(evt) { - if (this.props.keyboard && evt.keyCode === 37) { - this.props.previous(); - } else if (this.props.keyboard && evt.keyCode === 39) { - this.props.next(); + if (this.props.keyboard) { + if (evt.keyCode === 37) { + this.props.previous(); + } else if (evt.keyCode === 39) { + this.props.next(); + } } } @@ -72,7 +105,7 @@ class Carousel extends React.Component { } render() { - const { children, cssModule, hoverStart, hoverEnd, slide } = this.props; + const { children, cssModule, slide } = this.props; const outerClasses = mapToCssModules(classNames( 'carousel', slide && 'slide', @@ -83,14 +116,12 @@ class Carousel extends React.Component { ), cssModule); - const slidesOnly = children.every((child) => { - return child.type && child.type.name === 'CarouselItem'; - }); + const slidesOnly = children.every(child => child.type === CarouselItem); // Rendering only slides if (slidesOnly) { return ( -
    +
    {this.renderItems(children, innerClasses)}
    ); @@ -103,7 +134,7 @@ class Carousel extends React.Component { const controlRight = children[2]; return ( -
    +
    {this.renderItems(carouselItems, innerClasses)} {controlLeft} {controlRight} @@ -118,14 +149,7 @@ class Carousel extends React.Component { const controlRight = children[3]; return ( -
    { - this.carousel = carousel; - }} - className={outerClasses} - onMouseEnter={hoverStart} - onMouseLeave={hoverEnd} - > +
    {indicators} {this.renderItems(carouselItems, innerClasses)} {controlLeft} @@ -144,8 +168,13 @@ Carousel.propTypes = { previous: PropTypes.func.isRequired, // controls if the left and right arrow keys should control the carousel keyboard: PropTypes.bool, - // controls if the carousel should not automatically cycle (default: false) - paused: PropTypes.bool, + /* If set to "hover", pauses the cycling of the carousel on mouseenter and resumes the cycling of the carousel on + * mouseleave. If set to false, hovering over the carousel won't pause it. (default: "hover") + */ + pause: PropTypes.oneOf(['hover', false]), + // Autoplays the carousel after the user manually cycles the first item. If "carousel", autoplays the carousel on load. + // This is how bootstrap defines it... I would prefer a bool named autoplay or something... + ride: PropTypes.oneOf(['carousel']), // the interval at which the carousel automatically cycles (default: 5000) interval: PropTypes.oneOfType([ PropTypes.number, @@ -154,9 +183,9 @@ Carousel.propTypes = { ]), children: PropTypes.array, // called when the mouse enters the Carousel - hoverStart: PropTypes.func, + mouseEnter: PropTypes.func, // called when the mouse exits the Carousel - hoverEnd: PropTypes.func, + mouseLeave: PropTypes.func, // controls whether the slide animation on the Carousel works or not slide: PropTypes.bool, cssModule: PropTypes.object, @@ -164,8 +193,7 @@ Carousel.propTypes = { Carousel.defaultProps = { interval: 5000, - hover: false, - paused: false, + pause: 'hover', keyboard: true, slide: true, }; diff --git a/src/CarouselIndicators.js b/src/CarouselIndicators.js index b63c88f31..546c4f495 100644 --- a/src/CarouselIndicators.js +++ b/src/CarouselIndicators.js @@ -13,7 +13,7 @@ const CarouselIndicators = (props) => { ), cssModule); return (
  • { e.preventDefault(); onClickHandler(idx); diff --git a/src/CarouselItem.js b/src/CarouselItem.js index ff194b328..bb6fbd5a0 100644 --- a/src/CarouselItem.js +++ b/src/CarouselItem.js @@ -27,9 +27,10 @@ class CarouselItem extends React.Component { onEntering(node, isAppearing) { // getting this variable triggers a reflow - const _unused = node.offsetHeight; // eslint-disable-line no-unused-vars + const offsetHeight = node.offsetHeight; this.setState({ startAnimation: true }); this.props.onEntering(node, isAppearing); + return offsetHeight; } onExit(node) { diff --git a/src/UncontrolledCarousel.js b/src/UncontrolledCarousel.js new file mode 100644 index 000000000..81ed55a89 --- /dev/null +++ b/src/UncontrolledCarousel.js @@ -0,0 +1,111 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import Carousel from './Carousel'; +import CarouselItem from './CarouselItem'; +import CarouselControl from './CarouselControl'; +import CarouselIndicators from './CarouselIndicators'; +import CarouselCaption from './CarouselCaption'; + +const propTypes = { + items: PropTypes.array.isRequired, + indicators: PropTypes.bool, + controls: PropTypes.bool, + autoPlay: PropTypes.bool, + activeIndex: PropTypes.number, + next: PropTypes.func, + previous: PropTypes.func, + goToIndex: PropTypes.func, +}; + +class UncontrolledCarousel extends Component { + constructor(props) { + super(props); + this.animating = false; + this.state = { activeIndex: 0 }; + this.next = this.next.bind(this); + this.previous = this.previous.bind(this); + this.goToIndex = this.goToIndex.bind(this); + this.onExiting = this.onExiting.bind(this); + this.onExited = this.onExited.bind(this); + } + + onExiting() { + this.animating = true; + } + + onExited() { + this.animating = false; + } + + next() { + if (this.animating) return; + const nextIndex = this.state.activeIndex === this.props.items.length - 1 ? 0 : this.state.activeIndex + 1; + this.setState({ activeIndex: nextIndex }); + } + + previous() { + if (this.animating) return; + const nextIndex = this.state.activeIndex === 0 ? this.props.items.length - 1 : this.state.activeIndex - 1; + this.setState({ activeIndex: nextIndex }); + } + + goToIndex(newIndex) { + if (this.animating) return; + this.setState({ activeIndex: newIndex }); + } + + render() { + const { autoPlay, indicators, controls, items, goToIndex, ...props } = this.props; + const { activeIndex } = this.state; + + const slides = items.map((item) => { + return ( + + + + ); + }); + + return ( + + {indicators && } + {slides} + {controls && } + {controls && } + + ); + } +} + +UncontrolledCarousel.propTypes = propTypes; +UncontrolledCarousel.defaultProps = { + controls: true, + indicators: true, + autoPlay: true, +}; + +export default UncontrolledCarousel; diff --git a/src/__tests__/Carousel.spec.js b/src/__tests__/Carousel.spec.js index 0fd93cf4d..1fc8141a7 100644 --- a/src/__tests__/Carousel.spec.js +++ b/src/__tests__/Carousel.spec.js @@ -327,7 +327,7 @@ describe('Carousel', () => { }); describe('interval', () => { - it('should not cycle when paused', () => { + it('should not autoplay by default', () => { const next = jest.fn(); const slides = items.map((item, idx) => { return ( @@ -342,7 +342,7 @@ describe('Carousel', () => { }); const wrapper = mount( - { }} interval={1000} activeIndex={0} paused> + { }} interval={1000} activeIndex={0}> {slides} ); @@ -351,6 +351,30 @@ describe('Carousel', () => { wrapper.unmount(); }); + it('should autoplay when ride is carousel', () => { + const next = jest.fn(); + const slides = items.map((item, idx) => { + return ( + + + + ); + }); + + const wrapper = mount( + { }} interval={1000} activeIndex={0} ride="carousel"> + {slides} + + ); + jest.runTimersToTime(1000); + expect(next).toHaveBeenCalled(); + wrapper.unmount(); + }); + it('should accept a number', () => { const next = jest.fn(); const slides = items.map((item, idx) => { @@ -366,7 +390,7 @@ describe('Carousel', () => { }); const wrapper = mount( - { }} interval={1000} activeIndex={0}> + { }} interval={1000} activeIndex={0} ride="carousel"> {slides} ); @@ -414,7 +438,7 @@ describe('Carousel', () => { }); const wrapper = mount( - { }} activeIndex={0}> + { }} activeIndex={0} ride="carousel"> {slides} ); @@ -437,7 +461,7 @@ describe('Carousel', () => { ); }); const wrapper = mount( - { }} interval="1000" activeIndex={0}> + { }} interval="1000" activeIndex={0} ride="carousel"> {slides} ); diff --git a/src/__tests__/UncontrolledCarousel.spec.js b/src/__tests__/UncontrolledCarousel.spec.js new file mode 100644 index 000000000..3c1cfd216 --- /dev/null +++ b/src/__tests__/UncontrolledCarousel.spec.js @@ -0,0 +1,115 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import { Carousel, UncontrolledCarousel } from '../'; + +const items = [ + { src: '', altText: 'a', caption: 'caption 1' }, + { src: '', altText: 'b', caption: 'caption 2' }, + { src: '', altText: 'c', caption: 'caption 3' } +]; + +describe('UncontrolledCarousel', () => { + it('should be an Carousel', () => { + const carousel = shallow(); + expect(carousel.type()).toBe(Carousel); + }); + + it('should have activeIndex default to 0', () => { + const carousel = shallow(); + expect(carousel.prop('activeIndex')).toBe(0); + }); + + it('should have next function', () => { + const carousel = shallow(); + expect(carousel.prop('next')).toEqual(expect.any(Function)); + }); + + it('should have prev function', () => { + const carousel = shallow(); + expect(carousel.prop('previous')).toEqual(expect.any(Function)); + }); + + it('should have ride set to "carousel" by default', () => { + const carousel = shallow(); + expect(carousel.prop('ride')).toBe('carousel'); + }); + + it('should increase the activeIndex when next is called', () => { + const carousel = shallow(); + const instance = carousel.instance(); + instance.next(); + expect(carousel.prop('activeIndex')).toBe(1); + }); + + it('should not increase the activeIndex when next is called while animating', () => { + const carousel = shallow(); + const instance = carousel.instance(); + instance.animating = true; + instance.next(); + expect(carousel.prop('activeIndex')).toBe(0); + }); + + it('should wrap the activeIndex when next is called on the last item', () => { + const carousel = shallow(); + const instance = carousel.instance(); + instance.next(); + expect(carousel.prop('activeIndex')).toBe(1); + instance.next(); + expect(carousel.prop('activeIndex')).toBe(2); + instance.next(); + expect(carousel.prop('activeIndex')).toBe(0); + instance.next(); + expect(carousel.prop('activeIndex')).toBe(1); + }); + + it('should decrease the activeIndex when previous is called', () => { + const carousel = shallow(); + const instance = carousel.instance(); + instance.next(); + expect(carousel.prop('activeIndex')).toBe(1); + instance.previous(); + expect(carousel.prop('activeIndex')).toBe(0); + }); + + it('should not decrease the activeIndex when previous is called while animating', () => { + const carousel = shallow(); + const instance = carousel.instance(); + instance.next(); + expect(carousel.prop('activeIndex')).toBe(1); + instance.animating = true; + instance.previous(); + expect(carousel.prop('activeIndex')).toBe(1); + }); + + it('should wrap the activeIndex when previous is called on the first item', () => { + const carousel = shallow(); + const instance = carousel.instance(); + instance.previous(); + expect(carousel.prop('activeIndex')).toBe(2); + }); + + it('should set the activeIndex when goToIndex is called with a value', () => { + const carousel = shallow(); + const instance = carousel.instance(); + instance.goToIndex(2); + expect(carousel.prop('activeIndex')).toBe(2); + }); + + it('should not set the activeIndex when goToIndex is called with a value when animating', () => { + const carousel = shallow(); + const instance = carousel.instance(); + instance.animating = true; + instance.goToIndex(2); + expect(carousel.prop('activeIndex')).toBe(0); + }); + + it('should track animating of the slides', () => { + const carousel = shallow(); + const instance = carousel.instance(); + expect(instance.animating).toBe(false); + instance.onExiting(); + expect(instance.animating).toBe(true); + instance.onExited(); + expect(instance.animating).toBe(false); + }); +}); diff --git a/src/index.js b/src/index.js index b7be0a126..205d4f0ca 100644 --- a/src/index.js +++ b/src/index.js @@ -32,6 +32,7 @@ import CardHeader from './CardHeader'; import CardImg from './CardImg'; import CardImgOverlay from './CardImgOverlay'; import Carousel from './Carousel'; +import UncontrolledCarousel from './UncontrolledCarousel'; import CarouselControl from './CarouselControl'; import CarouselItem from './CarouselItem'; import CarouselIndicators from './CarouselIndicators'; @@ -119,6 +120,7 @@ export { CardImg, CardImgOverlay, Carousel, + UncontrolledCarousel, CarouselControl, CarouselItem, CarouselIndicators, From fd59d37eb6234ab0a0cffb241736c59cdf8d27f1 Mon Sep 17 00:00:00 2001 From: Evan Sharp Date: Sat, 16 Sep 2017 03:18:42 -0400 Subject: [PATCH 042/862] feat(popper): add container prop to popper --- docs/lib/Components/PopoversPage.js | 6 +- docs/lib/Components/TooltipsPage.js | 18 +++-- docs/lib/examples/CustomDropdown.js | 1 - src/Dropdown.js | 2 +- src/DropdownToggle.js | 4 +- src/PopperContent.js | 121 +++++++++++++++++++++++----- src/__tests__/Popover.spec.js | 54 ++++++------- src/__tests__/PopperContent.spec.js | 70 +++++----------- src/__tests__/Tooltip.spec.js | 4 +- 9 files changed, 171 insertions(+), 109 deletions(-) diff --git a/docs/lib/Components/PopoversPage.js b/docs/lib/Components/PopoversPage.js index 29bae733c..c07c401ec 100644 --- a/docs/lib/Components/PopoversPage.js +++ b/docs/lib/Components/PopoversPage.js @@ -26,15 +26,17 @@ export default class PopoversPage extends React.Component {
               
     {`Popover.propTypes = {
    -  isOpen:  PropTypes.bool,
       // boolean to control the state of the popover
    -  toggle:  PropTypes.func,
    +  isOpen:  PropTypes.bool,
       // callback for toggling isOpen in the controlling component
    +  toggle:  PropTypes.func,
       target:  PropTypes.oneOfType([
         PropTypes.string,
         PropTypes.func,
         DOMElement, // instanceof Element (https://developer.mozilla.org/en-US/docs/Web/API/Element)
       ]).isRequired,
    +  // Where to inject the popper DOM node, default to body
    +  container: PropTypes.oneOfType([PropTypes.string, PropTypes.func, DOMElement]),
       disabled: PropTypes.bool,
       placementPrefix: PropTypes.string,
       delay: PropTypes.oneOfType([
    diff --git a/docs/lib/Components/TooltipsPage.js b/docs/lib/Components/TooltipsPage.js
    index 52af3d3b8..effe4f4ff 100644
    --- a/docs/lib/Components/TooltipsPage.js
    +++ b/docs/lib/Components/TooltipsPage.js
    @@ -30,22 +30,26 @@ export default class TooltipsPage extends React.Component {
             
               
     {`Tooltip.propTypes = {
    -  isOpen:  PropTypes.bool,
       // boolean to control the state of the tooltip
    -  toggle:  PropTypes.func,
    +  isOpen: PropTypes.bool,
       // callback for toggling isOpen in the controlling component
    +  toggle: PropTypes.func,
    +  // target element or element ID, popover is attached to this element
       target:  PropTypes.oneOfType([
         PropTypes.string,
    -    PropTypes.object
    +    PropTypes.func,
    +    DOMElement, // instanceof Element (https://developer.mozilla.org/en-US/docs/Web/API/Element)
       ]).isRequired,
    -  // target element or element ID, popover is attached to this element
    +  // Where to inject the popper DOM node, default to body
    +  container: PropTypes.oneOfType([PropTypes.string, PropTypes.func, DOMElement]),
    +  // optionally override show/hide delays - default { show: 0, hide: 250 }
       delay: PropTypes.oneOfType([
         PropTypes.shape({ show: PropTypes.number, hide: PropTypes.number }),
         PropTypes.number
       ]),
    -  // optionally override show/hide delays - default { show: 0, hide: 250 }
    -  autohide: PropTypes.bool,
       // optionally hide tooltip when hovering over tooltip content - default true
    +  autohide: PropTypes.bool,
    +  // convenience attachments for popover
       placement: PropTypes.oneOf([
         'auto',
         'auto-start',
    @@ -63,8 +67,6 @@ export default class TooltipsPage extends React.Component {
         'left-start',
         'left-end',
       ])
    -  // convenience attachments for popover
    -  // examples http://github.hubspot.com/tooltip/docs/welcome/
     }`}
               
             
    diff --git a/docs/lib/examples/CustomDropdown.js b/docs/lib/examples/CustomDropdown.js index ab1df4344..91796e150 100644 --- a/docs/lib/examples/CustomDropdown.js +++ b/docs/lib/examples/CustomDropdown.js @@ -24,7 +24,6 @@ export default class Example extends React.Component { tag="span" onClick={this.toggle} data-toggle="dropdown" - aria-haspopup="true" aria-expanded={this.state.dropdownOpen} > Custom Dropdown Content diff --git a/src/Dropdown.js b/src/Dropdown.js index 7e172746d..3b97339e5 100644 --- a/src/Dropdown.js +++ b/src/Dropdown.js @@ -120,7 +120,7 @@ class Dropdown extends React.Component { dropup: dropup } ), cssModule); - return {}; + return ; } } diff --git a/src/DropdownToggle.js b/src/DropdownToggle.js index 4621cbd94..6d1964c96 100644 --- a/src/DropdownToggle.js +++ b/src/DropdownToggle.js @@ -56,7 +56,7 @@ class DropdownToggle extends React.Component { } render() { - const { className, color, cssModule, caret, split, nav, tag, ...props } = this.props; + const { className, color, cssModule, caret, split, nav, tag, 'aria-haspopup': ariaHaspopup, ...props } = this.props; const ariaLabel = props['aria-label'] || 'Toggle Dropdown'; const classes = mapToCssModules(classNames( className, @@ -87,7 +87,7 @@ class DropdownToggle extends React.Component { className={classes} component={Tag} onClick={this.onClick} - aria-haspopup="true" + aria-haspopup={ariaHaspopup ? 'true' : 'false'} aria-expanded={this.context.isOpen} children={children} /> diff --git a/src/PopperContent.js b/src/PopperContent.js index 77f4c3231..2c2ad37e4 100644 --- a/src/PopperContent.js +++ b/src/PopperContent.js @@ -1,9 +1,9 @@ import React from 'react'; import PropTypes from 'prop-types'; +import ReactDOM from 'react-dom'; import classNames from 'classnames'; -import { Arrow, Manager, Popper as ReactPopper } from 'react-popper'; -import PopperTargetHelper from './PopperTargetHelper'; -import { DOMElement, mapToCssModules } from './utils'; +import { Arrow, Popper as ReactPopper } from 'react-popper'; +import { getTarget, DOMElement, mapToCssModules } from './utils'; const propTypes = { children: PropTypes.node.isRequired, @@ -13,11 +13,10 @@ const propTypes = { tag: PropTypes.string, isOpen: PropTypes.bool.isRequired, cssModule: PropTypes.object, - wrapTag: PropTypes.string, - wrapClassName: PropTypes.string, offset: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), fallbackPlacement: PropTypes.oneOfType([PropTypes.string, PropTypes.array]), flip: PropTypes.bool, + container: PropTypes.oneOfType([PropTypes.string, PropTypes.func, DOMElement]), target: PropTypes.oneOfType([PropTypes.string, PropTypes.func, DOMElement]).isRequired, }; @@ -26,8 +25,12 @@ const defaultProps = { isOpen: false, offset: 0, fallbackPlacement: 'flip', - wrapTag: 'span', flip: true, + container: 'body', +}; + +const childContextTypes = { + popperManager: PropTypes.object.isRequired, }; class PopperContent extends React.Component { @@ -35,9 +38,49 @@ class PopperContent extends React.Component { super(props); this.handlePlacementChange = this.handlePlacementChange.bind(this); + this.setTargetNode = this.setTargetNode.bind(this); + this.getTargetNode = this.getTargetNode.bind(this); this.state = {}; } + getChildContext() { + return { + popperManager: { + setTargetNode: this.setTargetNode, + getTargetNode: this.getTargetNode, + }, + }; + } + + componentDidMount() { + this.handleProps(); + } + + componentDidUpdate(prevProps) { + if (this.props.isOpen !== prevProps.isOpen) { + this.handleProps(); + } else if (this._element) { + // rerender + this.renderIntoSubtree(); + } + } + + componentWillUnmount() { + this.hide(); + } + + setTargetNode(node) { + this.targetNode = node; + } + + getTargetNode() { + return this.targetNode; + } + + getContainerNode() { + return getTarget(this.props.container); + } + handlePlacementChange(data) { if (this.state.placement !== data.placement) { this.setState({ placement: data.placement }); @@ -45,7 +88,42 @@ class PopperContent extends React.Component { return data; } - render() { + handleProps() { + if (this.props.container !== 'inline') { + if (this.props.isOpen) { + this.show(); + } else { + this.hide(); + } + } + } + + hide() { + if (this._element) { + this.getContainerNode().removeChild(this._element); + ReactDOM.unmountComponentAtNode(this._element); + this._element = null; + } + } + + show() { + this._element = document.createElement('div'); + this.getContainerNode().appendChild(this._element); + this.renderIntoSubtree(); + if (this._element.childNodes && this._element.childNodes[0] && this._element.childNodes[0].focus) { + this._element.childNodes[0].focus(); + } + } + + renderIntoSubtree() { + ReactDOM.unstable_renderSubtreeIntoContainer( + this, + this.renderChildren(), + this._element + ); + } + + renderChildren() { const { cssModule, children, @@ -56,13 +134,12 @@ class PopperContent extends React.Component { fallbackPlacement, placementPrefix, className, - wrapTag, - wrapClassName, tag, - ...attrs } = this.props; + container, + ...attrs + } = this.props; const arrowClassName = mapToCssModules('arrow', cssModule); const placement = (this.state.placement || attrs.placement).split('-')[0]; - const managerClass = mapToCssModules(wrapClassName, this.props.cssModule); const popperClassName = mapToCssModules(classNames( className, placementPrefix ? `${placementPrefix}-${placement}` : placement @@ -79,18 +156,26 @@ class PopperContent extends React.Component { }; return ( - - - {isOpen && - {children} - - } - + + {children} + + ); } + + render() { + this.setTargetNode(getTarget(this.props.target)); + + if (this.props.container === 'inline') { + return this.props.isOpen ? this.renderChildren() : null; + } + + return null; + } } PopperContent.propTypes = propTypes; PopperContent.defaultProps = defaultProps; +PopperContent.childContextTypes = childContextTypes; export default PopperContent; diff --git a/src/__tests__/Popover.spec.js b/src/__tests__/Popover.spec.js index 8a6cfb67a..1ab1ab188 100644 --- a/src/__tests__/Popover.spec.js +++ b/src/__tests__/Popover.spec.js @@ -42,10 +42,10 @@ describe('Popover', () => { ); - expect(wrapper.find('.popover').length).toBe(1); - expect(wrapper.find('.popover-inner').length).toBe(1); - expect(wrapper.find('.popover-header').length).toBe(1); - expect(wrapper.find('.popover-body').length).toBe(1); + expect(document.getElementsByClassName('popover').length).toBe(1); + expect(document.getElementsByClassName('popover-inner').length).toBe(1); + expect(document.getElementsByClassName('popover-header').length).toBe(1); + expect(document.getElementsByClassName('popover-body').length).toBe(1); wrapper.unmount(); }); @@ -57,10 +57,10 @@ describe('Popover', () => { ); - expect(wrapper.find('.popover').length).toBe(0); - expect(wrapper.find('.popover-inner').length).toBe(0); - expect(wrapper.find('.popover-header').length).toBe(0); - expect(wrapper.find('.popover-body').length).toBe(0); + expect(document.getElementsByClassName('popover').length).toBe(0); + expect(document.getElementsByClassName('popover-inner').length).toBe(0); + expect(document.getElementsByClassName('popover-header').length).toBe(0); + expect(document.getElementsByClassName('popover-body').length).toBe(0); wrapper.unmount(); }); @@ -74,11 +74,11 @@ describe('Popover', () => { expect(isOpen).toBe(false); - expect(wrapper.find('.popover.show').length).toBe(0); - expect(wrapper.find('.popover').length).toBe(0); - expect(wrapper.find('.popover-inner').length).toBe(0); - expect(wrapper.find('.popover-header').length).toBe(0); - expect(wrapper.find('.popover-body').length).toBe(0); + expect(document.getElementsByClassName('show').length).toBe(0); + expect(document.getElementsByClassName('popover').length).toBe(0); + expect(document.getElementsByClassName('popover-inner').length).toBe(0); + expect(document.getElementsByClassName('popover-header').length).toBe(0); + expect(document.getElementsByClassName('popover-body').length).toBe(0); toggle(); wrapper.setProps({ @@ -86,11 +86,11 @@ describe('Popover', () => { }); expect(isOpen).toBe(true); - expect(wrapper.find('.popover.show').length).toBe(1); - expect(wrapper.find('.popover').length).toBe(1); - expect(wrapper.find('.popover-inner').length).toBe(1); - expect(wrapper.find('.popover-header').length).toBe(1); - expect(wrapper.find('.popover-body').length).toBe(1); + expect(document.getElementsByClassName('show').length).toBe(1); + expect(document.getElementsByClassName('popover').length).toBe(1); + expect(document.getElementsByClassName('popover-inner').length).toBe(1); + expect(document.getElementsByClassName('popover-header').length).toBe(1); + expect(document.getElementsByClassName('popover-body').length).toBe(1); wrapper.unmount(); }); @@ -105,10 +105,10 @@ describe('Popover', () => { ); expect(isOpen).toBe(true); - expect(wrapper.find('.popover').length).toBe(1); - expect(wrapper.find('.popover-inner').length).toBe(1); - expect(wrapper.find('.popover-header').length).toBe(1); - expect(wrapper.find('.popover-body').length).toBe(1); + expect(document.getElementsByClassName('popover').length).toBe(1); + expect(document.getElementsByClassName('popover-inner').length).toBe(1); + expect(document.getElementsByClassName('popover-header').length).toBe(1); + expect(document.getElementsByClassName('popover-body').length).toBe(1); toggle(); wrapper.setProps({ @@ -116,10 +116,10 @@ describe('Popover', () => { }); expect(isOpen).toBe(false); - expect(wrapper.find('.popover').length).toBe(0); - expect(wrapper.find('.popover-inner').length).toBe(0); - expect(wrapper.find('.popover-header').length).toBe(0); - expect(wrapper.find('.popover-body').length).toBe(0); + expect(document.getElementsByClassName('popover').length).toBe(0); + expect(document.getElementsByClassName('popover-inner').length).toBe(0); + expect(document.getElementsByClassName('popover-header').length).toBe(0); + expect(document.getElementsByClassName('popover-body').length).toBe(0); wrapper.unmount(); }); @@ -148,7 +148,7 @@ describe('Popover', () => { ); - expect(wrapper.find('.popover-inner').hasClass('popover-special')).toBe(true); + expect(document.getElementsByClassName('popover-inner')[0].className.indexOf('popover-special') > -1).toBe(true); wrapper.unmount(); }); diff --git a/src/__tests__/PopperContent.spec.js b/src/__tests__/PopperContent.spec.js index 08ce4ebe5..bdcb17df7 100644 --- a/src/__tests__/PopperContent.spec.js +++ b/src/__tests__/PopperContent.spec.js @@ -1,6 +1,6 @@ import React from 'react'; import { shallow, mount } from 'enzyme'; -import { Arrow, Manager, Popper } from 'react-popper'; +import { Arrow, Popper } from 'react-popper'; import { PopperContent, PopperTargetHelper } from '../'; describe('PopperContent', () => { @@ -24,103 +24,77 @@ describe('PopperContent', () => { element = null; }); - it('should render a Manager by default', () => { + it('should render a null by default', () => { const wrapper = shallow(Yo!); - expect(wrapper.type()).toBe(Manager); - }); - - it('should render a Manager as a span by default', () => { - const wrapper = mount(Yo!); - - expect(wrapper.find('span').length).toBe(1); - }); - - it('should render a PopperTargetHelper', () => { - const wrapper = mount(Yo!); - - expect(wrapper.containsMatchingElement()).toBe(true); + expect(wrapper.type()).toBe(null); }); it('should NOT render children when isOpen is false', () => { - const wrapper = mount(Yo!); + const wrapper = shallow(Yo!); - expect(wrapper.text()).toBe(''); + expect(wrapper.type()).toBe(null); }); - it('should render children when isOpen is true', () => { - const wrapper = mount(Yo!); + it('should render children when isOpen is true and container is inline', () => { + const wrapper = mount(Yo!); expect(wrapper.text()).toBe('Yo!'); }); - it('should render an Arrow in the Popper when isOpen is true', () => { - const wrapper = mount(Yo!); + it('should render an Arrow in the Popper when isOpen is true and container is inline', () => { + const wrapper = mount(Yo!); expect(wrapper.containsMatchingElement()).toBe(true); }); it('should not render children', () => { - const wrapper = mount(Yo!); - - expect(wrapper.text()).toBe(''); - }); - - it('should pass additional classNames to the wrap', () => { - const wrapper = shallow(Yo!); + const wrapper = shallow(Yo!); - expect(wrapper.hasClass('extra')).toBe(true); + expect(wrapper.type()).toBe(null); }); it('should pass additional classNames to the popper', () => { - const wrapper = shallow(Yo!); + const wrapper = shallow(Yo!); - expect(wrapper.hasClass('extra')).toBe(false); - expect(wrapper.find('.extra').exists()).toBe(true); + expect(wrapper.hasClass('extra')).toBe(true); }); it('should have placement class of top by default', () => { - const wrapper = shallow(Yo!); + const wrapper = shallow(Yo!); expect(wrapper.find('.auto').exists()).toBe(true); }); it('should override placement class', () => { - const wrapper = shallow(Yo!); + const wrapper = shallow(Yo!); expect(wrapper.find('.auto').exists()).toBe(false); expect(wrapper.find('.top').exists()).toBe(true); }); it('should allow for a placement prefix', () => { - const wrapper = shallow(Yo!); + const wrapper = shallow(Yo!); expect(wrapper.find('.dropdown-auto').exists()).toBe(true); }); it('should allow for a placement prefix with custom placement', () => { - const wrapper = shallow(Yo!); + const wrapper = shallow(Yo!); expect(wrapper.find('.dropdown-auto').exists()).toBe(false); expect(wrapper.find('.dropdown-top').exists()).toBe(true); }); - it('should render custom wrap tag', () => { - const wrapper = mount(Yo!); - - expect(wrapper.getDOMNode().tagName.toLowerCase()).toBe('main'); - }); - it('should render custom tag for the popper', () => { - const wrapper = mount(Yo!); + const wrapper = mount(Yo!); - expect(wrapper.getDOMNode().tagName.toLowerCase()).toBe('span'); - expect(wrapper.find('main').getDOMNode().tagName.toLowerCase()).toBe('main'); + expect(wrapper.getDOMNode().tagName.toLowerCase()).toBe('main'); }); it('should handle placement changes from popperjs', () => { jest.spyOn(PopperContent.prototype, 'setState'); - const wrapper = mount(Yo!); + const wrapper = mount(Yo!); const instance = wrapper.instance(); const placement = 'top'; @@ -134,7 +108,7 @@ describe('PopperContent', () => { it('should not update when placement does not change', () => { jest.spyOn(PopperContent.prototype, 'setState'); - const wrapper = mount(Yo!); + const wrapper = mount(Yo!); const instance = wrapper.instance(); const placement = 'top'; @@ -150,7 +124,7 @@ describe('PopperContent', () => { }); it('should return data from handle placement changes', () => { - const wrapper = mount(Yo!); + const wrapper = mount(Yo!); const instance = wrapper.instance(); const data = { placement: 'top' }; diff --git a/src/__tests__/Tooltip.spec.js b/src/__tests__/Tooltip.spec.js index 3af0515e6..f3594ac87 100644 --- a/src/__tests__/Tooltip.spec.js +++ b/src/__tests__/Tooltip.spec.js @@ -63,7 +63,7 @@ describe('Tooltip', () => { const tooltips = document.getElementsByClassName('tooltip'); - expect(wrapper.find('.tooltip.show').length).toBe(1); + expect(wrapper.find('.tooltip.show').length).toBe(0); expect(tooltips.length).toBe(1); expect(tooltips[0].textContent).toBe('Tooltip Content'); wrapper.detach(); @@ -80,7 +80,7 @@ describe('Tooltip', () => { const tooltips = document.getElementsByClassName('tooltip'); - expect(wrapper.find('.tooltip.show').length).toBe(1); + expect(wrapper.find('.tooltip.show').length).toBe(0); expect(tooltips.length).toBe(1); expect(tooltips[0].textContent).toBe('Tooltip Content'); wrapper.detach(); From 9b32cee71bb94091b8b102bc7056f3ac9c9f6e87 Mon Sep 17 00:00:00 2001 From: Evan Sharp Date: Sat, 16 Sep 2017 09:07:59 -0400 Subject: [PATCH 043/862] feat(Badge): handle links Updated tests Updated docs --- docs/lib/Components/BadgePage.js | 13 +++++++++++++ docs/lib/examples/BadgeLinks.js | 19 +++++++++++++++++++ src/Badge.js | 8 ++++++-- src/__tests__/Badge.spec.js | 22 ++++++++++++++++++++-- 4 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 docs/lib/examples/BadgeLinks.js diff --git a/docs/lib/Components/BadgePage.js b/docs/lib/Components/BadgePage.js index c657b1594..321e7264a 100644 --- a/docs/lib/Components/BadgePage.js +++ b/docs/lib/Components/BadgePage.js @@ -15,6 +15,9 @@ const BadgePillsExampleSource = require('!!raw!../examples/BadgePills'); import BadgeVariationsExample from '../examples/BadgeVariations'; const BadgeVariationsExampleSource = require('!!raw!../examples/BadgeVariations'); +import BadgeLinksExample from '../examples/BadgeLinks'; +const BadgeLinksExampleSource = require('!!raw!../examples/BadgeLinks'); + export default class BadgesPage extends React.Component { render() { return ( @@ -58,6 +61,16 @@ export default class BadgesPage extends React.Component { {BadgePillsExampleSource}
    +

    Links

    +

    Adding the href prop (without specifying a tag prop) will default the badge to a link.

    +
    + +
    +
    +          
    +            {BadgeLinksExampleSource}
    +          
    +        
  • ); } diff --git a/docs/lib/examples/BadgeLinks.js b/docs/lib/examples/BadgeLinks.js new file mode 100644 index 000000000..0c2f85af3 --- /dev/null +++ b/docs/lib/examples/BadgeLinks.js @@ -0,0 +1,19 @@ +import React from 'react'; +import { Badge } from 'reactstrap'; + +export default class Example extends React.Component { + render() { + return ( +
    + Primary + Secondary + Success + Danger + Warning + Info + Light + Dark +
    + ); + } +} diff --git a/src/Badge.js b/src/Badge.js index 7bcd899d5..6c7c52178 100644 --- a/src/Badge.js +++ b/src/Badge.js @@ -13,13 +13,13 @@ const propTypes = { }; const defaultProps = { - color: 'default', + color: 'secondary', pill: false, tag: 'span' }; const Badge = (props) => { - const { + let { className, cssModule, color, @@ -35,6 +35,10 @@ const Badge = (props) => { pill ? 'badge-pill' : false ), cssModule); + if (attributes.href && Tag === 'span') { + Tag = 'a'; + } + return ( ); diff --git a/src/__tests__/Badge.spec.js b/src/__tests__/Badge.spec.js index 39b960e73..33c1d67c4 100644 --- a/src/__tests__/Badge.spec.js +++ b/src/__tests__/Badge.spec.js @@ -3,16 +3,34 @@ import { shallow } from 'enzyme'; import { Badge } from '../'; describe('Badge', () => { + it('should render a span by default', () => { + const wrapper = shallow(Yo!); + + expect(wrapper.type()).toBe('span'); + }); + + it('should render an anchor when when href is provided', () => { + const wrapper = shallow(Yo!); + + expect(wrapper.type()).toBe('a'); + }); + + it('should render a custom tag when provided', () => { + const wrapper = shallow(Yo!); + + expect(wrapper.type()).toBe('main'); + }); + it('should render children', () => { const wrapper = shallow(Yo!); expect(wrapper.text()).toBe('Yo!'); }); - it('should render badges with default color', () => { + it('should render badges with secondary color', () => { const wrapper = shallow(Default Badge); - expect(wrapper.hasClass('badge-default')).toBe(true); + expect(wrapper.hasClass('badge-secondary')).toBe(true); }); it('should render Badges with other colors', () => { From 9b80d11447320ef4cb64d2aa97b2cc95672b686e Mon Sep 17 00:00:00 2001 From: Evan Sharp Date: Sat, 16 Sep 2017 09:20:41 -0400 Subject: [PATCH 044/862] fix(popper): account for touchstart fixes dropdowns, tooltips, and popovers not triggers on touch events Closes #456 #458 --- src/Dropdown.js | 8 ++++++-- src/Popover.js | 8 ++++++-- src/Tooltip.js | 8 ++++++-- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/Dropdown.js b/src/Dropdown.js index 3b97339e5..62c9579bd 100644 --- a/src/Dropdown.js +++ b/src/Dropdown.js @@ -66,11 +66,15 @@ class Dropdown extends React.Component { } addEvents() { - document.addEventListener('click', this.handleDocumentClick, true); + ['click', 'touchstart'].forEach(event => + document.addEventListener(event, this.handleDocumentClick, true) + ); } removeEvents() { - document.removeEventListener('click', this.handleDocumentClick, true); + ['click', 'touchstart'].forEach(event => + document.removeEventListener(event, this.handleDocumentClick, true) + ); } handleDocumentClick(e) { diff --git a/src/Popover.js b/src/Popover.js index 9308b7495..8a2ac4adf 100644 --- a/src/Popover.js +++ b/src/Popover.js @@ -121,11 +121,15 @@ class Popover extends React.Component { } addTargetEvents() { - document.addEventListener('click', this.handleDocumentClick, true); + ['click', 'touchstart'].forEach(event => + document.addEventListener(event, this.handleDocumentClick, true) + ); } removeTargetEvents() { - document.removeEventListener('click', this.handleDocumentClick, true); + ['click', 'touchstart'].forEach(event => + document.removeEventListener(event, this.handleDocumentClick, true) + ); } toggle(e) { diff --git a/src/Tooltip.js b/src/Tooltip.js index 429f32448..3fcf544be 100644 --- a/src/Tooltip.js +++ b/src/Tooltip.js @@ -144,13 +144,17 @@ class Tooltip extends React.Component { addTargetEvents() { this._target.addEventListener('mouseover', this.onMouseOverTooltip, true); this._target.addEventListener('mouseout', this.onMouseLeaveTooltip, true); - document.addEventListener('click', this.handleDocumentClick, true); + ['click', 'touchstart'].forEach(event => + document.addEventListener(event, this.handleDocumentClick, true) + ); } removeTargetEvents() { this._target.removeEventListener('mouseover', this.onMouseOverTooltip, true); this._target.removeEventListener('mouseout', this.onMouseLeaveTooltip, true); - document.removeEventListener('click', this.handleDocumentClick, true); + ['click', 'touchstart'].forEach(event => + document.removeEventListener(event, this.handleDocumentClick, true) + ); } toggle(e) { From 8b2386f9b4b36474d5418f7dd25e6b3f805953f2 Mon Sep 17 00:00:00 2001 From: Evan Sharp Date: Sat, 16 Sep 2017 10:29:12 -0400 Subject: [PATCH 045/862] feat(validation): add/update form validation Added/updated test Added/updated docs deprecation: the state prop on input has now become the valid prop which accepts a boolean breaking change: The color prop has been removed from FromGroup, see the valid prop on Input. --- docs/lib/Components/FormPage.js | 2 +- docs/lib/examples/FormFeedback.js | 26 +++++++++++++------------- src/FormFeedback.js | 2 +- src/FormGroup.js | 3 --- src/FormText.js | 1 + src/Input.js | 19 +++++++++++++++---- src/__tests__/FormFeedback.spec.js | 4 ++-- src/__tests__/FormGroup.spec.js | 6 ------ src/__tests__/FormText.spec.js | 13 +++++++++++++ src/__tests__/Input.spec.js | 29 +++++++++++++++++++++++++++-- 10 files changed, 73 insertions(+), 32 deletions(-) diff --git a/docs/lib/Components/FormPage.js b/docs/lib/Components/FormPage.js index f871f53b3..c679b50cc 100644 --- a/docs/lib/Components/FormPage.js +++ b/docs/lib/Components/FormPage.js @@ -62,7 +62,7 @@ export default class FormPage extends React.Component { -

    Form Feedback

    +

    Form Validation

    diff --git a/docs/lib/examples/FormFeedback.js b/docs/lib/examples/FormFeedback.js index 6b85650fe..f6cb62c8c 100644 --- a/docs/lib/examples/FormFeedback.js +++ b/docs/lib/examples/FormFeedback.js @@ -5,23 +5,23 @@ export default class Example extends React.Component { render() { return (
    - + - - Success! You did it! - Example help text that remains unchanged. + + + A bug fixed in (the currently + unreleased) ( + PR + ) bootstrap v4 beta-2 shows invalid-feedback + with is-valid inputs. + + Example help text that remains unchanged. - - - - Whoops, check your formatting and try again. - Example help text that remains unchanged. - - + - + Oh noes! that name is already taken - Example help text that remains unchanged. + Example help text that remains unchanged. ); diff --git a/src/FormFeedback.js b/src/FormFeedback.js index a8a126565..64eb89088 100644 --- a/src/FormFeedback.js +++ b/src/FormFeedback.js @@ -24,7 +24,7 @@ const FormFeedback = (props) => { const classes = mapToCssModules(classNames( className, - 'form-control-feedback' + 'invalid-feedback' ), cssModule); return ( diff --git a/src/FormGroup.js b/src/FormGroup.js index 52e51045a..e62e6ed59 100644 --- a/src/FormGroup.js +++ b/src/FormGroup.js @@ -9,7 +9,6 @@ const propTypes = { check: PropTypes.bool, disabled: PropTypes.bool, tag: PropTypes.string, - color: PropTypes.string, className: PropTypes.string, cssModule: PropTypes.object, }; @@ -24,7 +23,6 @@ const FormGroup = (props) => { cssModule, row, disabled, - color, check, tag: Tag, ...attributes @@ -32,7 +30,6 @@ const FormGroup = (props) => { const classes = mapToCssModules(classNames( className, - color ? `has-${color}` : false, row ? 'row' : false, check ? 'form-check' : 'form-group', check && disabled ? 'disabled' : false diff --git a/src/FormText.js b/src/FormText.js index 8d463569c..9137312b7 100644 --- a/src/FormText.js +++ b/src/FormText.js @@ -14,6 +14,7 @@ const propTypes = { const defaultProps = { tag: 'small', + color: 'muted', }; const FormText = (props) => { diff --git a/src/Input.js b/src/Input.js index 262e21567..2d60dbf4d 100644 --- a/src/Input.js +++ b/src/Input.js @@ -3,13 +3,14 @@ import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; -import { mapToCssModules } from './utils'; +import { mapToCssModules, deprecated } from './utils'; const propTypes = { children: PropTypes.node, type: PropTypes.string, size: PropTypes.string, - state: PropTypes.string, + state: deprecated(PropTypes.string, 'Please use the prop "valid"'), + valid: PropTypes.bool, tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]), innerRef: PropTypes.oneOfType([PropTypes.func, PropTypes.string]), static: PropTypes.bool, @@ -25,12 +26,13 @@ const defaultProps = { class Input extends React.Component { render() { - const { + let { className, cssModule, type, size, state, + valid, tag, addon, static: staticInput, @@ -60,9 +62,18 @@ class Input extends React.Component { } } + if (state && typeof valid === 'undefined') { + if (state === 'danger') { + valid = false; + } else if (state === 'success') { + valid = true; + } + } + const classes = mapToCssModules(classNames( className, - state ? `form-control-${state}` : false, + valid === false && 'is-invalid', + valid && 'is-valid', size ? `form-control-${size}` : false, formControlClass ), cssModule); diff --git a/src/__tests__/FormFeedback.spec.js b/src/__tests__/FormFeedback.spec.js index c70457981..0f7280563 100644 --- a/src/__tests__/FormFeedback.spec.js +++ b/src/__tests__/FormFeedback.spec.js @@ -15,10 +15,10 @@ describe('FormFeedback', () => { expect(wrapper.text()).toBe('Yo!'); }); - it('should render with "form-control-feedback" class', () => { + it('should render with "invalid-feedback" class', () => { const wrapper = shallow(Yo!); - expect(wrapper.hasClass('form-control-feedback')).toBe(true); + expect(wrapper.hasClass('invalid-feedback')).toBe(true); }); it('should render additional classes', () => { diff --git a/src/__tests__/FormGroup.spec.js b/src/__tests__/FormGroup.spec.js index 44b0d2ec0..c76df5a07 100644 --- a/src/__tests__/FormGroup.spec.js +++ b/src/__tests__/FormGroup.spec.js @@ -64,12 +64,6 @@ describe('FormGroup', () => { expect(wrapper.hasClass('row')).toBe(false); }); - it('should render with "has-${color}" class when color prop is provided', () => { - const wrapper = shallow(Yo!); - - expect(wrapper.hasClass('has-yoyo')).toBe(true); - }); - it('should render additional classes', () => { const wrapper = shallow(Yo!); diff --git a/src/__tests__/FormText.spec.js b/src/__tests__/FormText.spec.js index 3eb5d26da..5b72bf1fb 100644 --- a/src/__tests__/FormText.spec.js +++ b/src/__tests__/FormText.spec.js @@ -27,6 +27,19 @@ describe('FormText', () => { expect(wrapper.hasClass('form-text')).toBe(false); }); + it('should render with "text-muted" class by default', () => { + const wrapper = shallow(Yo!); + + expect(wrapper.hasClass('text-muted')).toBe(true); + }); + + it('should render without "text-*" class when color is and empty string', () => { + const wrapper = shallow(Yo!); + + expect(wrapper.hasClass('text-muted')).toBe(false); + expect(wrapper.hasClass('text-')).toBe(false); + }); + it('should render with "text-${color}" class when color is provided', () => { const wrapper = shallow(Yo!); diff --git a/src/__tests__/Input.spec.js b/src/__tests__/Input.spec.js index 1e9b2b2de..4ee8409f1 100644 --- a/src/__tests__/Input.spec.js +++ b/src/__tests__/Input.spec.js @@ -63,10 +63,35 @@ describe('Input', () => { expect(wrapper.text()).toBe('Yo!'); }); - it('should render with "form-control-${state}" class when state is provided', () => { + it('should render with "is-invalid" class when state is "danger" [DEPRECATED]', () => { const wrapper = shallow(); - expect(wrapper.hasClass('form-control-danger')).toBe(true); + expect(wrapper.hasClass('is-invalid')).toBe(true); + }); + + it('should render with "is-valid" class when state is "success" [DEPRECATED]', () => { + const wrapper = shallow(); + + expect(wrapper.hasClass('is-valid')).toBe(true); + }); + + it('should not render with "is-valid" nor "is-invalid" class when state is "warning" [DEPRECATED]', () => { + const wrapper = shallow(); + + expect(wrapper.hasClass('is-valid')).toBe(false); + expect(wrapper.hasClass('is-invalid')).toBe(false); + }); + + it('should render with "is-invalid" class when valid is false', () => { + const wrapper = shallow(); + + expect(wrapper.hasClass('is-invalid')).toBe(true); + }); + + it('should render with "is-valid" class when valid is true', () => { + const wrapper = shallow(); + + expect(wrapper.hasClass('is-valid')).toBe(true); }); it('should render with "form-control-${size}" class when size is provided', () => { From a2f2822569edd1025a1b1a0b91b1d5f52e56daa7 Mon Sep 17 00:00:00 2001 From: Evan Sharp Date: Sat, 16 Sep 2017 10:48:55 -0400 Subject: [PATCH 046/862] chore(lint): make linter happy --- src/Carousel.js | 3 ++- src/__tests__/PopperContent.spec.js | 4 ++-- src/__tests__/Tooltip.spec.js | 1 - 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Carousel.js b/src/Carousel.js index 3d999178e..f6a38e0a9 100644 --- a/src/Carousel.js +++ b/src/Carousel.js @@ -175,7 +175,8 @@ Carousel.propTypes = { // Autoplays the carousel after the user manually cycles the first item. If "carousel", autoplays the carousel on load. // This is how bootstrap defines it... I would prefer a bool named autoplay or something... ride: PropTypes.oneOf(['carousel']), - // the interval at which the carousel automatically cycles (default: 5000) + // the interval at which the carousel automatically cycles (default: 5000) + // eslint-disable-next-line react/no-unused-prop-types interval: PropTypes.oneOfType([ PropTypes.number, PropTypes.string, diff --git a/src/__tests__/PopperContent.spec.js b/src/__tests__/PopperContent.spec.js index bdcb17df7..8a751a28c 100644 --- a/src/__tests__/PopperContent.spec.js +++ b/src/__tests__/PopperContent.spec.js @@ -1,7 +1,7 @@ import React from 'react'; import { shallow, mount } from 'enzyme'; -import { Arrow, Popper } from 'react-popper'; -import { PopperContent, PopperTargetHelper } from '../'; +import { Arrow } from 'react-popper'; +import { PopperContent } from '../'; describe('PopperContent', () => { let element; diff --git a/src/__tests__/Tooltip.spec.js b/src/__tests__/Tooltip.spec.js index f3594ac87..36bdbc54b 100644 --- a/src/__tests__/Tooltip.spec.js +++ b/src/__tests__/Tooltip.spec.js @@ -1,5 +1,4 @@ import React from 'react'; -import ReactDOM from 'react-dom'; import { mount } from 'enzyme'; import { Tooltip } from '../'; From 759934bcac0cac8b880e2fe3f7013ab10194b589 Mon Sep 17 00:00:00 2001 From: Evan Sharp Date: Tue, 19 Sep 2017 16:09:39 -0400 Subject: [PATCH 047/862] fix(*): Add container to Popover and Tooltip --- src/Popover.js | 6 ++++++ src/Tooltip.js | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/src/Popover.js b/src/Popover.js index 8a2ac4adf..f3cce4755 100644 --- a/src/Popover.js +++ b/src/Popover.js @@ -12,6 +12,11 @@ const propTypes = { PropTypes.func, DOMElement, ]).isRequired, + container: PropTypes.oneOfType([ + PropTypes.string, + PropTypes.func, + DOMElement, + ]), isOpen: PropTypes.bool, disabled: PropTypes.bool, className: PropTypes.string, @@ -163,6 +168,7 @@ class Popover extends React.Component { isOpen={this.props.isOpen} placement={this.props.placement} placementPrefix={this.props.placementPrefix} + container={this.props.container} >
    diff --git a/src/Tooltip.js b/src/Tooltip.js index 3fcf544be..e0b0cdedb 100644 --- a/src/Tooltip.js +++ b/src/Tooltip.js @@ -12,6 +12,11 @@ const propTypes = { PropTypes.func, DOMElement, ]).isRequired, + container: PropTypes.oneOfType([ + PropTypes.string, + PropTypes.func, + DOMElement, + ]), isOpen: PropTypes.bool, disabled: PropTypes.bool, className: PropTypes.string, @@ -188,6 +193,7 @@ class Tooltip extends React.Component { isOpen={this.props.isOpen} placement={this.props.placement} placementPrefix={this.props.placementPrefix} + container={this.props.container} >
    Date: Wed, 20 Sep 2017 07:18:35 -0400 Subject: [PATCH 048/862] fix(Tooltip/Popover): fix className/add innerClassName --- docs/lib/Components/PopoversPage.js | 3 +++ docs/lib/Components/TooltipsPage.js | 3 +++ src/Popover.js | 6 ++++-- src/Tooltip.js | 6 ++++-- src/__tests__/Popover.spec.js | 15 ++++++++++++++- src/__tests__/Tooltip.spec.js | 24 ++++++++++++++++++++++++ 6 files changed, 52 insertions(+), 5 deletions(-) diff --git a/docs/lib/Components/PopoversPage.js b/docs/lib/Components/PopoversPage.js index c07c401ec..d80f3d23a 100644 --- a/docs/lib/Components/PopoversPage.js +++ b/docs/lib/Components/PopoversPage.js @@ -37,6 +37,9 @@ export default class PopoversPage extends React.Component { ]).isRequired, // Where to inject the popper DOM node, default to body container: PropTypes.oneOfType([PropTypes.string, PropTypes.func, DOMElement]), + className: PropTypes.string, + // Apply class to the inner-popover + innerClassName: PropTypes.string, disabled: PropTypes.bool, placementPrefix: PropTypes.string, delay: PropTypes.oneOfType([ diff --git a/docs/lib/Components/TooltipsPage.js b/docs/lib/Components/TooltipsPage.js index effe4f4ff..6a86ca636 100644 --- a/docs/lib/Components/TooltipsPage.js +++ b/docs/lib/Components/TooltipsPage.js @@ -47,6 +47,9 @@ export default class TooltipsPage extends React.Component { PropTypes.shape({ show: PropTypes.number, hide: PropTypes.number }), PropTypes.number ]), + className: PropTypes.string, + // Apply class to the inner-tooltip + innerClassName: PropTypes.string, // optionally hide tooltip when hovering over tooltip content - default true autohide: PropTypes.bool, // convenience attachments for popover diff --git a/src/Popover.js b/src/Popover.js index f3cce4755..83b5e1a71 100644 --- a/src/Popover.js +++ b/src/Popover.js @@ -20,6 +20,7 @@ const propTypes = { isOpen: PropTypes.bool, disabled: PropTypes.bool, className: PropTypes.string, + innerClassName: PropTypes.string, placementPrefix: PropTypes.string, cssModule: PropTypes.object, toggle: PropTypes.func, @@ -153,12 +154,13 @@ class Popover extends React.Component { const attributes = omit(this.props, Object.keys(propTypes)); const classes = mapToCssModules(classNames( 'popover-inner', - this.props.className + this.props.innerClassName ), this.props.cssModule); const popperClasses = mapToCssModules(classNames( 'popover', - 'show' + 'show', + this.props.className ), this.props.cssModule); return ( diff --git a/src/Tooltip.js b/src/Tooltip.js index e0b0cdedb..877aa04b2 100644 --- a/src/Tooltip.js +++ b/src/Tooltip.js @@ -20,6 +20,7 @@ const propTypes = { isOpen: PropTypes.bool, disabled: PropTypes.bool, className: PropTypes.string, + innerClassName: PropTypes.string, cssModule: PropTypes.object, toggle: PropTypes.func, autohide: PropTypes.bool, @@ -178,12 +179,13 @@ class Tooltip extends React.Component { const attributes = omit(this.props, Object.keys(propTypes)); const classes = mapToCssModules(classNames( 'tooltip-inner', - this.props.className + this.props.innerClassName ), this.props.cssModule); const popperClasses = mapToCssModules(classNames( 'tooltip', - 'show' + 'show', + this.props.className ), this.props.cssModule); return ( diff --git a/src/__tests__/Popover.spec.js b/src/__tests__/Popover.spec.js index 1ab1ab188..316fa984e 100644 --- a/src/__tests__/Popover.spec.js +++ b/src/__tests__/Popover.spec.js @@ -142,7 +142,7 @@ describe('Popover', () => { it('should allow custom classes to be added to the popover-inner', () => { const wrapper = mount( - + Title Content @@ -153,6 +153,19 @@ describe('Popover', () => { wrapper.unmount(); }); + it('should allow custom classes to be added to the popover', () => { + const wrapper = mount( + + Title + Content + + ); + + expect(document.getElementsByClassName('popover')[0].className.indexOf('popover-special') > -1).toBe(true); + + wrapper.unmount(); + }); + it('should not handle outside of target clicks when isOpen is false', () => { const wrapper = mount( diff --git a/src/__tests__/Tooltip.spec.js b/src/__tests__/Tooltip.spec.js index 36bdbc54b..fcf02d61a 100644 --- a/src/__tests__/Tooltip.spec.js +++ b/src/__tests__/Tooltip.spec.js @@ -171,6 +171,30 @@ describe('Tooltip', () => { wrapper.detach(); }); + it('should allow custom classes to be added to the tooltip-inner', () => { + const wrapper = mount( + + Tooltip Content + + ); + + expect(document.getElementsByClassName('tooltip-inner')[0].className.indexOf('tooltip-special') > -1).toBe(true); + + wrapper.unmount(); + }); + + it('should allow custom classes to be added to the tooltip', () => { + const wrapper = mount( + + Tooltip Content + + ); + + expect(document.getElementsByClassName('tooltip')[0].className.indexOf('tooltip-special') > -1).toBe(true); + + wrapper.unmount(); + }); + it('should not call props.toggle when disabled ', () => { const props = createSpyObj('props', ['toggle']); const event = createSpyObj('event', ['preventDefault']); From aefbdd7379268531af85a56a03231d4294aa00c5 Mon Sep 17 00:00:00 2001 From: Evan Sharp Date: Wed, 20 Sep 2017 11:08:17 -0400 Subject: [PATCH 049/862] fix(Navbar): better backwards compatibility --- src/Navbar.js | 36 +++++++++++++++++++++++++++--------- src/__tests__/Navbar.spec.js | 28 +++++++++++++++++++++++----- 2 files changed, 50 insertions(+), 14 deletions(-) diff --git a/src/Navbar.js b/src/Navbar.js index 4f0e99ab7..8cb4aa8fe 100644 --- a/src/Navbar.js +++ b/src/Navbar.js @@ -15,30 +15,48 @@ const propTypes = { tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]), className: PropTypes.string, cssModule: PropTypes.object, - toggleable: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]), - expandable: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]), + toggleable: deprecated(PropTypes.oneOfType([PropTypes.bool, PropTypes.string]), 'Please use the prop "expand"'), + expand: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]), }; const defaultProps = { tag: 'nav', - toggleable: false, - expandable: false, + expand: false, +}; + +const getExpandClass = (expand) => { + if (expand === false) { + return false; + } else if (expand === true || expand === 'xs') { + return 'navbar-expand'; + } + + return `navbar-expand-${expand}`; +}; + +// To better maintain backwards compatibility while toggleable is deprecated. +// We must map breakpoints to the next breakpoint so that toggleable and expand do the same things at the same breakpoint. +const toggleableToExpand = { + xs: 'sm', + sm: 'md', + md: 'lg', + lg: 'xl', }; const getToggleableClass = (toggleable) => { - if (toggleable === false) { + if (toggleable === undefined || toggleable === 'xl') { return false; - } else if (toggleable === true || toggleable === 'xs') { + } else if (toggleable === false) { return 'navbar-expand'; } - return `navbar-expand-${toggleable}`; + return `navbar-expand-${toggleable === true ? 'sm' : (toggleableToExpand[toggleable] || toggleable)}`; }; const Navbar = (props) => { const { toggleable, - expandable, + expand, className, cssModule, light, @@ -54,7 +72,7 @@ const Navbar = (props) => { const classes = mapToCssModules(classNames( className, 'navbar', - getToggleableClass(toggleable || expandable), + getExpandClass(expand) || getToggleableClass(toggleable), { 'navbar-light': light, 'navbar-dark': inverse || dark, diff --git a/src/__tests__/Navbar.spec.js b/src/__tests__/Navbar.spec.js index 8f3284913..3650716e7 100644 --- a/src/__tests__/Navbar.spec.js +++ b/src/__tests__/Navbar.spec.js @@ -9,18 +9,36 @@ describe('Navbar', () => { expect(wrapper.html()).toBe(''); }); - it('should render default .navbar-toggleable class', () => { - const wrapper = shallow(); + it('should render default .navbar-expand class', () => { + const wrapper = shallow(); expect(wrapper.html()).toBe(''); }); - it('should render size based .navbar-toggleable-* classes', () => { - const wrapper = shallow(); + it('should render size based .navbar-expand-* classes', () => { + const wrapper = shallow(); expect(wrapper.html()).toBe(''); }); + it('should render default .navbar-expand class for toggleable false [DEPRECATED]', () => { + const wrapper = shallow(); + + expect(wrapper.html()).toBe(''); + }); + + it('should render default .navbar-expand class for toggleable true [DEPRECATED]', () => { + const wrapper = shallow(); + + expect(wrapper.html()).toBe(''); + }); + + it('should render size based .navbar-expand-* classes for toggleable (bumping breakpoint) [DEPRECATED]', () => { + const wrapper = shallow(); + + expect(wrapper.html()).toBe(''); + }); + it('should render custom tag', () => { const wrapper = shallow(); @@ -47,7 +65,7 @@ describe('Navbar', () => { }); it('should render prop based classes', () => { - const wrapper = shallow(); + const wrapper = shallow(); expect(wrapper.hasClass('bg-success')).toBe(true); expect(wrapper.hasClass('navbar')).toBe(true); From 49c76b41a24ecd9f3788ac0ef1809e210dd3dc39 Mon Sep 17 00:00:00 2001 From: Evan Sharp Date: Thu, 21 Sep 2017 10:16:20 -0400 Subject: [PATCH 050/862] chore(alpha): initial alpha release --- CHANGELOG.md | 43 +++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- scripts/publish | 2 +- scripts/release | 2 +- 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 146b90122..b7d2a42ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,46 @@ + +# [5.0.0-alpha.0](https://github.com/reactstrap/reactstrap/compare/4.8.0...5.0.0-alpha.0) (2017-09-21) + + +### Bug Fixes + +* Add container to Popover and Tooltip ([759934b](https://github.com/reactstrap/reactstrap/commit/759934b)) +* **Carousel:** use prop-types in carousel ([#503](https://github.com/reactstrap/reactstrap/issues/503)) ([e1bdadb](https://github.com/reactstrap/reactstrap/commit/e1bdadb)) +* **CSSModules:** pass modules to child components ([#483](https://github.com/reactstrap/reactstrap/issues/483)) ([12270d0](https://github.com/reactstrap/reactstrap/commit/12270d0)) +* **Label:** fix xs col class ([#512](https://github.com/reactstrap/reactstrap/issues/512)) ([683dbdb](https://github.com/reactstrap/reactstrap/commit/683dbdb)), closes [#510](https://github.com/reactstrap/reactstrap/issues/510) +* **Modal:** add workaround for Modal auto focus ([f12057d](https://github.com/reactstrap/reactstrap/commit/f12057d)) +* **Navbar:** better backwards compatibility ([aefbdd7](https://github.com/reactstrap/reactstrap/commit/aefbdd7)) +* **NavbarToggler:** fix syntax error ([a460912](https://github.com/reactstrap/reactstrap/commit/a460912)) +* **PaginationLink:** handle empty children array ([#511](https://github.com/reactstrap/reactstrap/issues/511)) ([72d82a3](https://github.com/reactstrap/reactstrap/commit/72d82a3)), closes [#494](https://github.com/reactstrap/reactstrap/issues/494) +* **popper:** account for touchstart ([9b80d11](https://github.com/reactstrap/reactstrap/commit/9b80d11)), closes [#456](https://github.com/reactstrap/reactstrap/issues/456) [#458](https://github.com/reactstrap/reactstrap/issues/458) +* **popperjs:** fixed error in build ([#571](https://github.com/reactstrap/reactstrap/issues/571)) ([0a9394d](https://github.com/reactstrap/reactstrap/commit/0a9394d)) +* **Tooltip/Popover:** fix className/add innerClassName ([a2a33e3](https://github.com/reactstrap/reactstrap/commit/a2a33e3)) + + +### Features + +* **aria:** add closeAriaLabel ([#525](https://github.com/reactstrap/reactstrap/issues/525)) ([3b4c0e6](https://github.com/reactstrap/reactstrap/commit/3b4c0e6)), closes [#524](https://github.com/reactstrap/reactstrap/issues/524) +* **Badge:** handle links ([9b32cee](https://github.com/reactstrap/reactstrap/commit/9b32cee)) +* **Card:** update Card for bs v4 beta ([c4609e2](https://github.com/reactstrap/reactstrap/commit/c4609e2)) +* **Dropdown:** update Dropdown for bs v4 beta ([53687fa](https://github.com/reactstrap/reactstrap/commit/53687fa)) +* **Modal:** onOpened and onClosed callbacks for modals ([#434](https://github.com/reactstrap/reactstrap/issues/434)) ([87c6c4e](https://github.com/reactstrap/reactstrap/commit/87c6c4e)), closes [#306](https://github.com/reactstrap/reactstrap/issues/306) +* **Nav/Navbar:** update to bs v4 beta ([5395e8d](https://github.com/reactstrap/reactstrap/commit/5395e8d)) +* **Popover:** update popovers to bs v4 beta ([bb00f4c](https://github.com/reactstrap/reactstrap/commit/bb00f4c)) +* **popper:** add container prop to popper ([fd59d37](https://github.com/reactstrap/reactstrap/commit/fd59d37)) +* **popperjs:** use popperjs instead of tether ([#561](https://github.com/reactstrap/reactstrap/issues/561)) ([5413022](https://github.com/reactstrap/reactstrap/commit/5413022)) +* **UncontrolledCarousel:** add UncontrolledCarousel ([627a73e](https://github.com/reactstrap/reactstrap/commit/627a73e)) +* **util:** add warnOnce and deprecated fns ([5faa94d](https://github.com/reactstrap/reactstrap/commit/5faa94d)) +* **validation:** add/update form validation ([8b2386f](https://github.com/reactstrap/reactstrap/commit/8b2386f)) + + +### BREAKING CHANGES + +* **validation:** The color prop has been removed from FromGroup, see the valid prop on Input. +* **popperjs:** getRef has been renamed to innerRef to line up with other libraries. +* **popperjs:** tether props have been removed. + + + # [4.8.0](https://github.com/reactstrap/reactstrap/compare/4.7.0...4.8.0) (2017-06-28) diff --git a/package.json b/package.json index d587d02fa..770437ede 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "reactstrap", - "version": "4.8.0", + "version": "5.0.0-alpha.0", "description": "React Bootstrap 4 components", "main": "dist/reactstrap.cjs.js", "jsnext:main": "dist/reactstrap.es.js", diff --git a/scripts/publish b/scripts/publish index 6ffb9c9af..d5fec6190 100755 --- a/scripts/publish +++ b/scripts/publish @@ -14,7 +14,7 @@ error() { } if [ -z "$TRAVIS" ]; then - git checkout master + git checkout v5 git pull npm install npm run build diff --git a/scripts/release b/scripts/release index 64cdf27cd..783a6bfd9 100755 --- a/scripts/release +++ b/scripts/release @@ -5,7 +5,7 @@ set -e BUMP_TYPE=$1 if [ -z "$TRAVIS" ]; then - git checkout master + git checkout v5 git pull npm install fi From d0c6e82f6e6b49014bf6efb8945845d8d52b83d7 Mon Sep 17 00:00:00 2001 From: Evan Sharp Date: Thu, 21 Sep 2017 13:12:23 -0400 Subject: [PATCH 051/862] feat(Input): add plaintext prop Deprecate static prop in favor of plaintext prop. Use plaintaxt prop in the same way (boolean) closes #485 --- docs/lib/Components/FormPage.js | 17 ++++++++++++ docs/lib/examples/InputType.js | 4 +-- src/Input.js | 8 +++--- src/__tests__/Input.spec.js | 46 +++++++++++++++++++-------------- 4 files changed, 51 insertions(+), 24 deletions(-) diff --git a/docs/lib/Components/FormPage.js b/docs/lib/Components/FormPage.js index c679b50cc..378cd9206 100644 --- a/docs/lib/Components/FormPage.js +++ b/docs/lib/Components/FormPage.js @@ -42,6 +42,23 @@ export default class FormPage extends React.Component { +{`Input.propTypes = { + children: PropTypes.node, + // type can be things like text, password, (typical input types) as well as select and textarea, providing children as you normally would to those. + type: PropTypes.string, + size: PropTypes.string, + state: deprecated(PropTypes.string, 'Please use the prop "valid"'), + valid: PropTypes.bool, + tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]), + // ref will only get you a reference to the Input component, use innerRef to get a reference to the DOM input (for things like focus management). + innerRef: PropTypes.oneOfType([PropTypes.func, PropTypes.string]), + static: deprecated(PropTypes.bool, 'Please use the prop "plaintext"'), + plaintext: PropTypes.bool, + addon: PropTypes.bool, + className: PropTypes.string, + cssModule: PropTypes.object, +};`} +

    Form Grid

    diff --git a/docs/lib/examples/InputType.js b/docs/lib/examples/InputType.js index fb7740160..6bdbe219f 100644 --- a/docs/lib/examples/InputType.js +++ b/docs/lib/examples/InputType.js @@ -6,8 +6,8 @@ export default class Example extends React.Component { return (
    - - Some static value + + Some plain text/ static value diff --git a/src/Input.js b/src/Input.js index 2d60dbf4d..c37cdb444 100644 --- a/src/Input.js +++ b/src/Input.js @@ -13,7 +13,8 @@ const propTypes = { valid: PropTypes.bool, tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]), innerRef: PropTypes.oneOfType([PropTypes.func, PropTypes.string]), - static: PropTypes.bool, + static: deprecated(PropTypes.bool, 'Please use the prop "plaintext"'), + plaintext: PropTypes.bool, addon: PropTypes.bool, className: PropTypes.string, cssModule: PropTypes.object, @@ -36,6 +37,7 @@ class Input extends React.Component { tag, addon, static: staticInput, + plaintext, innerRef, ...attributes } = this.props; @@ -49,8 +51,8 @@ class Input extends React.Component { let formControlClass = 'form-control'; - if (staticInput) { - formControlClass = `${formControlClass}-static`; + if (plaintext || staticInput) { + formControlClass = `${formControlClass}-plaintext`; Tag = tag; } else if (fileInput) { formControlClass = `${formControlClass}-file`; diff --git a/src/__tests__/Input.spec.js b/src/__tests__/Input.spec.js index 4ee8409f1..15a020855 100644 --- a/src/__tests__/Input.spec.js +++ b/src/__tests__/Input.spec.js @@ -21,31 +21,31 @@ describe('Input', () => { expect(wrapper.type()).toBe('textarea'); }); - it('should render with "p" tag when static prop is truthy', () => { - const wrapper = shallow(); + it('should render with "p" tag when plaintext prop is truthy', () => { + const wrapper = shallow(); expect(wrapper.type()).toBe('p'); }); - it('should render with "form-control-static" class when static prop is truthy', () => { - const wrapper = shallow(); + it('should render with "form-control-plaintext" class when plaintext prop is truthy', () => { + const wrapper = shallow(); - expect(wrapper.hasClass('form-control-static')).toBe(true); + expect(wrapper.hasClass('form-control-plaintext')).toBe(true); }); - it('should not render with "form-control" class when static prop is truthy', () => { - const wrapper = shallow(); + it('should not render with "form-control" class when plaintext prop is truthy', () => { + const wrapper = shallow(); expect(wrapper.hasClass('form-control')).toBe(false); }); - it('should render with custom tag when static prop is truthy and tag is provided', () => { - const wrapper = shallow(); + it('should render with custom tag when plaintext prop is truthy and tag is provided', () => { + const wrapper = shallow(); expect(wrapper.type()).toBe('div'); }); - it('should not render with custom tag when static prop is not truthy and tag is provided', () => { + it('should not render with custom tag when plaintext prop is not truthy and tag is provided', () => { const wrapper = shallow(); expect(wrapper.type()).toBe('select'); @@ -106,23 +106,31 @@ describe('Input', () => { expect(wrapper.hasClass('form-control')).toBe(true); }); - it('should not render with "form-control-file" nor "form-control-static" nor "form-check-input" class by default', () => { + it('should not render with "form-control-file" nor "form-control-plaintext" nor "form-check-input" class by default', () => { const wrapper = shallow(); expect(wrapper.hasClass('form-control-file')).toBe(false); - expect(wrapper.hasClass('form-control-static')).toBe(false); + expect(wrapper.hasClass('form-control-plaintext')).toBe(false); expect(wrapper.hasClass('form-check-input')).toBe(false); }); - it('should not render with "form-control" nor "form-control-static" nor "form-check-input" class when type is file', () => { + it('should not render with "form-control" nor "form-control-plaintext" nor "form-check-input" class when type is file', () => { const wrapper = shallow(); expect(wrapper.hasClass('form-control')).toBe(false); - expect(wrapper.hasClass('form-control-static')).toBe(false); + expect(wrapper.hasClass('form-control-plaintext')).toBe(false); expect(wrapper.hasClass('form-check-input')).toBe(false); }); - it('should not render with "form-control-file" nor "form-control" nor "form-check-input" class when static prop is truthy', () => { + it('should not render with "form-control-file" nor "form-control" nor "form-check-input" class when plaintext prop is truthy', () => { + const wrapper = shallow(); + + expect(wrapper.hasClass('form-control-file')).toBe(false); + expect(wrapper.hasClass('form-control')).toBe(false); + expect(wrapper.hasClass('form-check-input')).toBe(false); + }); + + it('should not render with "form-control-file" nor "form-control" nor "form-check-input" class when static prop is truthy [DEPRECATED]', () => { const wrapper = shallow(); expect(wrapper.hasClass('form-control-file')).toBe(false); @@ -130,19 +138,19 @@ describe('Input', () => { expect(wrapper.hasClass('form-check-input')).toBe(false); }); - it('should not render with "form-control-file" nor "form-control-static" nor "form-control" class when type is radio', () => { + it('should not render with "form-control-file" nor "form-control-plaintext" nor "form-control" class when type is radio', () => { const wrapper = shallow(); expect(wrapper.hasClass('form-control-file')).toBe(false); - expect(wrapper.hasClass('form-control-static')).toBe(false); + expect(wrapper.hasClass('form-control-plaintext')).toBe(false); expect(wrapper.hasClass('form-control')).toBe(false); }); - it('should not render with "form-control-file" nor "form-control-static" nor "form-control" class when type is checkbox', () => { + it('should not render with "form-control-file" nor "form-control-plaintext" nor "form-control" class when type is checkbox', () => { const wrapper = shallow(); expect(wrapper.hasClass('form-control-file')).toBe(false); - expect(wrapper.hasClass('form-control-static')).toBe(false); + expect(wrapper.hasClass('form-control-plaintext')).toBe(false); expect(wrapper.hasClass('form-control')).toBe(false); }); From e4479aabbce6efec8d4db0579119a6564f1a2a06 Mon Sep 17 00:00:00 2001 From: Evan Sharp Date: Thu, 21 Sep 2017 22:36:55 -0400 Subject: [PATCH 052/862] fix(Dropdown): fix perf issue Now when menu is not 'open' it will not be a popper Closes #584 --- src/DropdownMenu.js | 17 ++++-- src/DropdownToggle.js | 5 +- src/__tests__/DropdownMenu.spec.js | 82 +++++++++++++++++++++++++++- src/__tests__/DropdownToggle.spec.js | 9 ++- 4 files changed, 97 insertions(+), 16 deletions(-) diff --git a/src/DropdownMenu.js b/src/DropdownMenu.js index 4a01d9a8b..add7135e8 100644 --- a/src/DropdownMenu.js +++ b/src/DropdownMenu.js @@ -27,8 +27,6 @@ const noFlipModifier = { flip: { enabled: false } }; const DropdownMenu = (props, context) => { const { className, cssModule, right, tag, flip, ...attrs } = props; - const position1 = context.dropup ? 'top' : 'bottom'; - const position2 = right ? 'end' : 'start'; const classes = mapToCssModules(classNames( className, 'dropdown-menu', @@ -38,17 +36,24 @@ const DropdownMenu = (props, context) => { } ), cssModule); - attrs.placement = `${position1}-${position2}`; + let Tag = tag; + + if (context.isOpen) { + Tag = Popper; + const position1 = context.dropup ? 'top' : 'bottom'; + const position2 = right ? 'end' : 'start'; + attrs.placement = `${position1}-${position2}`; + attrs.component = tag; + attrs.modifiers = !flip ? noFlipModifier : undefined; + } return ( - ); }; diff --git a/src/DropdownToggle.js b/src/DropdownToggle.js index 6d1964c96..5262fe808 100644 --- a/src/DropdownToggle.js +++ b/src/DropdownToggle.js @@ -13,7 +13,6 @@ const propTypes = { cssModule: PropTypes.object, disabled: PropTypes.bool, onClick: PropTypes.func, - 'data-toggle': PropTypes.string, 'aria-haspopup': PropTypes.bool, split: PropTypes.bool, tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]), @@ -21,7 +20,6 @@ const propTypes = { }; const defaultProps = { - 'data-toggle': 'dropdown', 'aria-haspopup': true, color: 'secondary', }; @@ -56,7 +54,7 @@ class DropdownToggle extends React.Component { } render() { - const { className, color, cssModule, caret, split, nav, tag, 'aria-haspopup': ariaHaspopup, ...props } = this.props; + const { className, color, cssModule, caret, split, nav, tag, ...props } = this.props; const ariaLabel = props['aria-label'] || 'Toggle Dropdown'; const classes = mapToCssModules(classNames( className, @@ -87,7 +85,6 @@ class DropdownToggle extends React.Component { className={classes} component={Tag} onClick={this.onClick} - aria-haspopup={ariaHaspopup ? 'true' : 'false'} aria-expanded={this.context.isOpen} children={children} /> diff --git a/src/__tests__/DropdownMenu.spec.js b/src/__tests__/DropdownMenu.spec.js index 4471e2874..3c914f02b 100644 --- a/src/__tests__/DropdownMenu.spec.js +++ b/src/__tests__/DropdownMenu.spec.js @@ -1,5 +1,6 @@ import React from 'react'; -import { mount } from 'enzyme'; +import { mount, shallow } from 'enzyme'; +import { Popper } from 'react-popper'; import { DropdownMenu } from '../'; describe('DropdownMenu', () => { @@ -63,6 +64,19 @@ describe('DropdownMenu', () => { expect(wrapper.find('.show').length).toBe(1); }); + it('should render left aligned menus by default', () => { + isOpen = true; + const wrapper = mount( + Ello world, + { + context: { isOpen, dropup, popperManager }, + childContextTypes: { popperManager } + } + ); + + expect(wrapper.find('.dropdown-menu').hasClass('dropdown-menu-right')).toBe(false); + }); + it('should render right aligned menus', () => { isOpen = true; const wrapper = mount( @@ -76,6 +90,72 @@ describe('DropdownMenu', () => { expect(wrapper.find('.dropdown-menu').hasClass('dropdown-menu-right')).toBe(true); }); + it('should render down when dropup is false on the context', () => { + isOpen = true; + const wrapper = shallow( + Ello world, + { + context: { isOpen, dropup, popperManager }, + childContextTypes: { popperManager } + } + ); + + expect(wrapper.find(Popper).prop('placement')).toBe('bottom-start'); + }); + + it('should render up when dropup is true on the context', () => { + isOpen = true; + dropup = true; + const wrapper = shallow( + Ello world, + { + context: { isOpen, dropup, popperManager }, + childContextTypes: { popperManager } + } + ); + + expect(wrapper.find(Popper).prop('placement')).toBe('top-start'); + }); + + it('should render down when dropup is false on the context', () => { + isOpen = true; + const wrapper = shallow( + Ello world, + { + context: { isOpen, dropup, popperManager }, + childContextTypes: { popperManager } + } + ); + + expect(wrapper.find(Popper).prop('placement')).toBe('bottom-start'); + }); + + it('should not disable flip modifier by default', () => { + isOpen = true; + const wrapper = shallow( + Ello world, + { + context: { isOpen, dropup, popperManager }, + childContextTypes: { popperManager } + } + ); + + expect(wrapper.find(Popper).prop('modifiers').flip).toBe(undefined); + }); + + it('should disable flip modifier when flip is false', () => { + isOpen = true; + const wrapper = shallow( + Ello world, + { + context: { isOpen, dropup, popperManager }, + childContextTypes: { popperManager } + } + ); + + expect(wrapper.find(Popper).prop('modifiers')).toEqual({ flip: { enabled: false } }); + }); + it('should not render multiple children when isOpen is false', () => { const wrapper = mount( Ello world, diff --git a/src/__tests__/DropdownToggle.spec.js b/src/__tests__/DropdownToggle.spec.js index f9944bff4..860f1f714 100644 --- a/src/__tests__/DropdownToggle.spec.js +++ b/src/__tests__/DropdownToggle.spec.js @@ -27,7 +27,6 @@ describe('DropdownToggle', () => { ); expect(wrapper.text()).toBe('Ello world'); - expect(wrapper.find('[data-toggle="dropdown"]').length).toBe(1); }); it('should add default sr-only content', () => { @@ -78,7 +77,7 @@ describe('DropdownToggle', () => { } ); - expect(wrapper.find('[data-toggle="dropdown"]').hasClass('dropdown-toggle')).toBe(true); + expect(wrapper.hasClass('dropdown-toggle')).toBe(true); }); describe('color', () => { @@ -144,7 +143,7 @@ describe('DropdownToggle', () => { } ); - expect(wrapper.find('[data-toggle="dropdown"]').hasClass('dropdown-toggle-split')).toBe(true); + expect(wrapper.hasClass('dropdown-toggle-split')).toBe(true); }); describe('onClick', () => { @@ -215,14 +214,14 @@ describe('DropdownToggle', () => { it('should not set the tag prop when the tag is defined', () => { const wrapper = mount( - Ello world, + Ello world, { context: { isOpen, toggle, popperManager }, childContextTypes: { popperManager } } ); - expect(wrapper.find('[aria-haspopup="true"]').prop('tag')).toBe(undefined); + expect(wrapper.prop('tag')).toBe(undefined); }); it('should preventDefault', () => { From ac90f512d3adb3af924d548fd0233ee1098dedc7 Mon Sep 17 00:00:00 2001 From: Evan Sharp Date: Fri, 22 Sep 2017 15:00:57 -0400 Subject: [PATCH 053/862] feat(Dropdown): keyboard control/navigation Adds the ability to control/navigate the dropdown and it's menu using the keyboard (space, arrow, esc keys) This mimic bootstrap 4's functionality Closes #580 --- src/Dropdown.js | 73 ++++- src/__tests__/Dropdown.spec.js | 509 +++++++++++++++++++++++++++++++++ src/utils.js | 8 + 3 files changed, 583 insertions(+), 7 deletions(-) diff --git a/src/Dropdown.js b/src/Dropdown.js index 62c9579bd..50339a5cb 100644 --- a/src/Dropdown.js +++ b/src/Dropdown.js @@ -6,7 +6,7 @@ import PropTypes from 'prop-types'; import ReactDOM from 'react-dom'; import { Manager } from 'react-popper'; import classNames from 'classnames'; -import { mapToCssModules, omit } from './utils'; +import { mapToCssModules, omit, keyCodes } from './utils'; const propTypes = { disabled: PropTypes.bool, @@ -39,6 +39,7 @@ class Dropdown extends React.Component { this.addEvents = this.addEvents.bind(this); this.handleDocumentClick = this.handleDocumentClick.bind(this); + this.handleKeyDown = this.handleKeyDown.bind(this); this.removeEvents = this.removeEvents.bind(this); this.toggle = this.toggle.bind(this); } @@ -65,26 +66,84 @@ class Dropdown extends React.Component { this.removeEvents(); } + getContainer() { + return ReactDOM.findDOMNode(this); + } + addEvents() { - ['click', 'touchstart'].forEach(event => + ['click', 'touchstart', 'keyup'].forEach(event => document.addEventListener(event, this.handleDocumentClick, true) ); } removeEvents() { - ['click', 'touchstart'].forEach(event => + ['click', 'touchstart', 'keyup'].forEach(event => document.removeEventListener(event, this.handleDocumentClick, true) ); } handleDocumentClick(e) { - const container = ReactDOM.findDOMNode(this); + if (e && (e.which === 3 || (e.type === 'keyup' && e.which !== keyCodes.tab))) return; + const container = this.getContainer(); + + if (container.contains(e.target) && container !== e.target && (e.type !== 'keyup' || e.which === keyCodes.tab)) { + return; + } + + this.toggle(e); + } + + handleKeyDown(e) { + if ([keyCodes.esc, keyCodes.up, keyCodes.down, keyCodes.space].indexOf(e.which) === -1 || + (/button/i.test(e.target.tagName) && e.which === keyCodes.space) || + /input|textarea/i.test(e.target.tagName)) { + return; + } + + e.preventDefault(); + if (this.props.disabled) return; + + const container = this.getContainer(); + + if (e.which === keyCodes.space && this.props.isOpen && container !== e.target) { + e.target.click(); + } - if (container.contains(e.target) && container !== e.target) { + if (e.which === keyCodes.esc || !this.props.isOpen) { + this.toggle(e); + container.querySelector('[aria-expanded]').focus(); return; } - this.toggle(); + const menuClass = mapToCssModules('dropdown-menu', this.props.cssModule); + const itemClass = mapToCssModules('dropdown-item', this.props.cssModule); + const disabledClass = mapToCssModules('disabled', this.props.cssModule); + + const items = container.querySelectorAll(`.${menuClass} .${itemClass}:not(.${disabledClass})`); + + if (!items.length) return; + + let index = -1; + for (let i = 0; i < items.length; i += 1) { + if (items[i] === e.target) { + index = i; + break; + } + } + + if (e.which === keyCodes.up && index > 0) { + index -= 1; + } + + if (e.which === keyCodes.down && index < items.length - 1) { + index += 1; + } + + if (index < 0) { + index = 0; + } + + items[index].focus(); } handleProps() { @@ -124,7 +183,7 @@ class Dropdown extends React.Component { dropup: dropup } ), cssModule); - return ; + return ; } } diff --git a/src/__tests__/Dropdown.spec.js b/src/__tests__/Dropdown.spec.js index aaf76fe1f..533c038ea 100644 --- a/src/__tests__/Dropdown.spec.js +++ b/src/__tests__/Dropdown.spec.js @@ -1,6 +1,7 @@ import React from 'react'; import { mount } from 'enzyme'; import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from '../'; +import { keyCodes } from '../utils'; describe('Dropdown', () => { @@ -213,6 +214,514 @@ describe('Dropdown', () => { wrapper.detach(); }); + + it('should not call toggle when right-clicked', () => { + isOpen = true; + jest.spyOn(Dropdown.prototype, 'toggle'); + + const wrapper = mount( + + Toggle + + Test + + + , { attachTo: element }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + + wrapper.instance().handleDocumentClick({ type: 'click', which: 3 }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + wrapper.detach(); + }); + + it('should call toggle when key is tab', () => { + isOpen = true; + jest.spyOn(Dropdown.prototype, 'toggle'); + + const wrapper = mount( + + Toggle + + Test + + + , { attachTo: element }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + + wrapper.instance().handleDocumentClick({ type: 'keyup', which: keyCodes.tab }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(1); + wrapper.detach(); + }); + }); + + describe('keyboard events', () => { + it('should call toggle on ESC keydown when it isOpen is true', () => { + isOpen = true; + jest.spyOn(Dropdown.prototype, 'toggle'); + + const wrapper = mount( + + Toggle + + Test + + + , { attachTo: element }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + + wrapper.simulate('keydown', { which: keyCodes.esc }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(1); + + wrapper.detach(); + }); + + it('should call toggle on ESC keydown when it isOpen is true', () => { + isOpen = false; + jest.spyOn(Dropdown.prototype, 'toggle'); + + const wrapper = mount( + + Toggle + + Test + + + , { attachTo: element }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + + wrapper.simulate('keydown', { which: keyCodes.esc }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(1); + + wrapper.detach(); + }); + + it('should call toggle on down arrow keydown when it isOpen is false', () => { + isOpen = false; + jest.spyOn(Dropdown.prototype, 'toggle'); + + const wrapper = mount( + + Toggle + + Test + + + , { attachTo: element }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + + wrapper.simulate('keydown', { which: keyCodes.down }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(1); + + wrapper.detach(); + }); + + it('should call toggle on up arrow keydown when it isOpen is false', () => { + isOpen = false; + jest.spyOn(Dropdown.prototype, 'toggle'); + + const wrapper = mount( + + Toggle + + Test + + + , { attachTo: element }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + + wrapper.simulate('keydown', { which: keyCodes.up }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(1); + + wrapper.detach(); + }); + + it('should focus the first menu item on up arrow keydown when it isOpen is true', () => { + isOpen = true; + jest.spyOn(Dropdown.prototype, 'toggle'); + const focus = jest.fn(); + + const wrapper = mount( + + Toggle + + Test + + + , { attachTo: element }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + + wrapper.simulate('keydown', { which: keyCodes.up }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + expect(focus.mock.calls.length).toBe(1); + + wrapper.detach(); + }); + + it('should focus the first menu item on down arrow keydown when it isOpen is true', () => { + isOpen = true; + jest.spyOn(Dropdown.prototype, 'toggle'); + const focus1 = jest.fn(); + const focus2 = jest.fn(); + const focus3 = jest.fn(); + + const wrapper = mount( + + Toggle + + Test + Test + + Test + + , { attachTo: element }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + + wrapper.simulate('keydown', { which: keyCodes.down }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + expect(focus1.mock.calls.length).toBe(1); + expect(focus2.mock.calls.length).toBe(0); + expect(focus3.mock.calls.length).toBe(0); + + wrapper.detach(); + }); + + it('should focus the next menu item on down arrow keydown when it isOpen is true and anther item is focused', () => { + isOpen = true; + jest.spyOn(Dropdown.prototype, 'toggle'); + const focus1 = jest.fn(); + const focus2 = jest.fn(); + const focus3 = jest.fn(); + + const wrapper = mount( + + Toggle + + Test + Test + + Test + + , { attachTo: element }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + + wrapper.find('#first').simulate('keydown', { which: keyCodes.down }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + expect(focus1.mock.calls.length).toBe(0); + expect(focus2.mock.calls.length).toBe(1); + expect(focus3.mock.calls.length).toBe(0); + + wrapper.detach(); + }); + + it('should skip non-menu items focus the next menu item on down arrow keydown when it isOpen is true and anther item is focused', () => { + isOpen = true; + jest.spyOn(Dropdown.prototype, 'toggle'); + const focus1 = jest.fn(); + const focus2 = jest.fn(); + const focus3 = jest.fn(); + + const wrapper = mount( + + Toggle + + Test + Test + + Test + + , { attachTo: element }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + + wrapper.find('#second').simulate('keydown', { which: keyCodes.down }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + expect(focus1.mock.calls.length).toBe(0); + expect(focus2.mock.calls.length).toBe(0); + expect(focus3.mock.calls.length).toBe(1); + + wrapper.detach(); + }); + + it('should focus the previous menu item on up arrow keydown when it isOpen is true and anther item is focused', () => { + isOpen = true; + jest.spyOn(Dropdown.prototype, 'toggle'); + const focus1 = jest.fn(); + const focus2 = jest.fn(); + const focus3 = jest.fn(); + + const wrapper = mount( + + Toggle + + Test + Test + + Test + + , { attachTo: element }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + + wrapper.find('#second').simulate('keydown', { which: keyCodes.up }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + expect(focus1.mock.calls.length).toBe(1); + expect(focus2.mock.calls.length).toBe(0); + expect(focus3.mock.calls.length).toBe(0); + + wrapper.detach(); + }); + + it('should not wrap focus with down arrow keydown', () => { + isOpen = true; + jest.spyOn(Dropdown.prototype, 'toggle'); + const focus1 = jest.fn(); + const focus2 = jest.fn(); + const focus3 = jest.fn(); + + const wrapper = mount( + + Toggle + + Test + Test + + Test + + , { attachTo: element }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + + wrapper.find('#third').simulate('keydown', { which: keyCodes.down }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + expect(focus1.mock.calls.length).toBe(0); + expect(focus2.mock.calls.length).toBe(0); + expect(focus3.mock.calls.length).toBe(1); + + wrapper.detach(); + }); + + it('should not wrap focus with up arrow keydown', () => { + isOpen = true; + jest.spyOn(Dropdown.prototype, 'toggle'); + const focus1 = jest.fn(); + const focus2 = jest.fn(); + const focus3 = jest.fn(); + + const wrapper = mount( + + Toggle + + Test + Test + + Test + + , { attachTo: element }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + + wrapper.find('#first').simulate('keydown', { which: keyCodes.up }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + expect(focus1.mock.calls.length).toBe(1); + expect(focus2.mock.calls.length).toBe(0); + expect(focus3.mock.calls.length).toBe(0); + + wrapper.detach(); + }); + + it('should trigger a click on links when an item is focused and space[bar] it pressed', () => { + isOpen = true; + jest.spyOn(Dropdown.prototype, 'toggle'); + const click = jest.fn(); + + const wrapper = mount( + + Toggle + + Test + Test + + Test + + , { attachTo: element }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + + wrapper.find('#first').simulate('keydown', { which: keyCodes.space }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + expect(click.mock.calls.length).toBe(1); + + wrapper.detach(); + }); + + it('should not trigger a click on buttons when an item is focused and space[bar] it pressed (browser does this)', () => { + isOpen = true; + jest.spyOn(Dropdown.prototype, 'toggle'); + const click = jest.fn(); + + const wrapper = mount( + + Toggle + + Test + Test + + Test + + , { attachTo: element }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + + wrapper.find('#first').simulate('keydown', { which: keyCodes.space }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + expect(click.mock.calls.length).toBe(0); + + wrapper.detach(); + }); + + it('should not trigger anything when within an input', () => { + isOpen = true; + jest.spyOn(Dropdown.prototype, 'toggle'); + const click = jest.fn(); + const focus = jest.fn(); + + const wrapper = mount( + + Toggle + + + Test + + Test + + , { attachTo: element }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + + wrapper.find('#input').simulate('keydown', { which: keyCodes.up }); + wrapper.find('#input').simulate('keydown', { which: keyCodes.down }); + wrapper.find('#input').simulate('keydown', { which: keyCodes.space }); + + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + expect(click.mock.calls.length).toBe(0); + expect(focus.mock.calls.length).toBe(0); + + wrapper.detach(); + }); + + it('should not trigger anything when within a textarea', () => { + isOpen = true; + jest.spyOn(Dropdown.prototype, 'toggle'); + const click = jest.fn(); + const focus = jest.fn(); + + const wrapper = mount( + + Toggle + +