diff --git a/.babelrc b/.babelrc new file mode 100644 index 000000000..38733e673 --- /dev/null +++ b/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["react", "es2015", "stage-0"] +} diff --git a/.eslintrc.js b/.eslintrc.js index 8c84c06be..9b5b367bf 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,25 +1,34 @@ module.exports = { - "parser": "babel-eslint", "extends": [ "eslint:recommended" ], - "plugins": [ - "standard", - "promise", - "react" - ], + "globals": { + "document": true, + "Reflect": true, + "window": true + }, + "parser": "babel-eslint", "parserOptions": { + "ecmaVersion": 6, "ecmaFeatures": { "jsx": true } }, + "plugins": [ + "standard", + "promise", + "react" + ], "rules": { "react/jsx-uses-react": "error", - "react/jsx-uses-vars": "error" - }, - "globals": { - "document": true, - "Reflect": true, - "window": true + "react/jsx-uses-vars": "error", + "camelcase": "error", + "keyword-spacing": "error", + "max-len": ["error", 120, 4, { "ignoreComments": true }], + "max-lines": ["error", {"max": 250, "skipComments": true}], + "newline-after-var": ["error", "always"], + "no-nested-ternary": "error", + "no-useless-constructor": "error", + "semi": "error" } }; diff --git a/.gitignore b/.gitignore index 8e3d10168..4e1847959 100644 --- a/.gitignore +++ b/.gitignore @@ -67,5 +67,6 @@ typings/ dist/ DOCUMENTATION.md docs +coverage sandbox/rd3g.sandbox.bundle.js sandbox/rd3g.sandbox.bundle.js.map diff --git a/README.md b/README.md index d8bd53498..d8236a28e 100644 --- a/README.md +++ b/README.md @@ -46,8 +46,16 @@ export default { ``` ## TODOs -This are some ideas to further development: -- Expose a graph property **background-color** that is applied to the svg graph container. +This consists in a list of ideas for further development: +- Expose a graph property **background-color** that is applied to the svg graph container; +- Expose d3-force values as configurable such as **alphaTarget** simulation value; +- Improve opacity/highlightBehavior strategy maybe use a global *background: rgba(...)* value and then set a higher +value on selected nodes; +- At the moment highlightBehavior is highlighting the mouse hovered node, its 1st degree connections and their 1st +degree connections. Make **highlightBehaviorDegree** which consists in a *step value* on the depth that we wish to highlight. + +#### Sanbox/Playground +- Improve page layout (optimize space). ## Contributions Contributions are welcome fell free to submit new features or simply grab something from diff --git a/package.json b/package.json index aa67ab83f..c65a7a7dd 100644 --- a/package.json +++ b/package.json @@ -4,35 +4,53 @@ "description": "React component to build interactive and configurable graphs with d3 effortlessly", "author": "Daniel Caldas", "license": "MIT", + "scripts": { + "dev": "node_modules/.bin/webpack-dev-server -d --content-base sandbox --inline --hot --port 3002", + "dist": "node_modules/.bin/npm-run-all --parallel dist:*", + "dist:rd3g": "webpack --config webpack.config.dist.js -p --display-modules", + "dist:sandbox": "webpack --config webpack.config.js -p --display-modules", + "docs": "node_modules/documentation/bin/documentation.js build src/**/*.js -f html -o docs && node_modules/documentation/bin/documentation.js build src/**/*.js -f md > DOCUMENTATION.md", + "lint": "node_modules/eslint/bin/eslint.js --config=.eslintrc.js \"src/**/*.js\"", + "test": "jest --verbose --coverage", + "test:clean": "jest --no-cache --updateSnapshot --verbose --coverage", + "test:watch": "jest --verbose --watchAll" + }, "dependencies": { "d3": "4.7.4", - "react": "15.4.2" + "react": "^15.5.0" }, "devDependencies": { "babel-core": "6.24.0", + "babel-jest": "19.0.0", "babel-loader": "6.4.1", "babel-plugin-add-module-exports": "0.2.1", "babel-plugin-react-html-attrs": "2.0.0", "babel-plugin-transform-class-properties": "6.22.0", "babel-plugin-transform-decorators-legacy": "1.3.4", - "babel-preset-es2015": "6.16.0", - "babel-preset-react": "6.16.0", + "babel-preset-es2015": "6.24.1", + "babel-preset-react": "6.24.1", "babel-preset-stage-0": "6.16.0", - "css-loader": "^0.28.0", + "css-loader": "0.28.0", "documentation": "4.0.0-beta.18", "eslint": "3.18.0", "eslint-config-recommended": "1.5.0", "eslint-plugin-promise": "3.5.0", "eslint-plugin-standard": "2.1.1", "html-webpack-plugin": "2.28.0", + "jest": "19.0.2", "npm-run-all": "4.0.2", - "react-dom": "15.4.2", + "react-addons-test-utils": "^15.5.0", + "react-dom": "^15.5.0", "react-jsonschema-form": "0.46.0", "react-router-dom": "4.0.0", - "style-loader": "^0.16.1", + "react-test-renderer": "^15.5.0", + "style-loader": "0.16.1", "webpack": "2.3.2", "webpack-dev-server": "2.4.2" }, + "engines": { + "node": ">=6.9.5" + }, "repository": { "type": "git", "url": "git+https://github.com/danielcaldas/react-d3-graph.git" @@ -47,14 +65,5 @@ "social-network-analysis", "social-network-graph", "visualization" - ], - "scripts": { - "dev": "node_modules/.bin/webpack-dev-server -d --content-base sandbox --inline --hot --port 3002", - "dist": "node_modules/.bin/npm-run-all --parallel dist:*", - "dist:rd3g": "webpack --config webpack.config.dist.js -p --display-modules", - "dist:sandbox": "webpack --config webpack.config.js -p --display-modules", - "docs": "node_modules/documentation/bin/documentation.js build src/**/*.js -f html -o docs && node_modules/documentation/bin/documentation.js build src/**/*.js -f md > DOCUMENTATION.md", - "lint": "node_modules/eslint/bin/eslint.js --config=.eslintrc.js \"src/**/*.js\"", - "test": "echo \"Error: no test specified\" && exit 1" - } + ] } diff --git a/sandbox/Sandbox.js b/sandbox/Sandbox.js index 7c43ffb51..4de14af8b 100644 --- a/sandbox/Sandbox.js +++ b/sandbox/Sandbox.js @@ -93,6 +93,8 @@ export default class Sandbox extends React.Component { } resetGraphConfig = () => { + const generatedConfig = {}; + const schemaProps = Utils.generateFormSchema(defaultConfig, '', {}); const schema = { @@ -102,6 +104,7 @@ export default class Sandbox extends React.Component { this.setState({ config: defaultConfig, + generatedConfig, schema }); } @@ -109,7 +112,7 @@ export default class Sandbox extends React.Component { render() { const graphProps = { id: 'graph', - data: mock, + data: JSON.parse(JSON.stringify(mock)), config: this.state.config, onClickNode: this.onClickNode, onClickLink: this.onClickLink, @@ -130,7 +133,7 @@ export default class Sandbox extends React.Component {
-

Graph configurations

+

react-d3-graph configurations

Your config

- +

Graph data

- +
); @@ -156,7 +159,7 @@ export default class Sandbox extends React.Component { class JSONContainer extends React.Component { shouldComponentUpdate(nextProps, nextState) { - return JSON.stringify(nextProps.data) !== JSON.stringify(this.props.data); + return !this.props.staticData && !ReactD3GraphUtils.isEqual(nextProps.data, this.props.data); } render() { diff --git a/sandbox/miserables.js b/sandbox/miserables.js index d0c7f2b90..4528bdd3e 100644 --- a/sandbox/miserables.js +++ b/sandbox/miserables.js @@ -1,82 +1,82 @@ export default { nodes: [ - {id: 'Myriel', group: 1}, - {id: 'Napoleon', group: 1}, - {id: 'Mlle.Baptistine', group: 1}, - {id: 'Mme.Magloire', group: 1}, - {id: 'CountessdeLo', group: 1}, - {id: 'Geborand', group: 1}, - {id: 'Champtercier', group: 1}, - {id: 'Cravatte', group: 1}, - {id: 'Count', group: 1}, - {id: 'OldMan', group: 1}, - {id: 'Labarre', group: 2}, - {id: 'Valjean', group: 2}, - {id: 'Marguerite', group: 3}, - {id: 'Mme.deR', group: 2}, - {id: 'Isabeau', group: 2}, - {id: 'Gervais', group: 2}, - {id: 'Tholomyes', group: 3}, - {id: 'Listolier', group: 3}, - {id: 'Fameuil', group: 3}, - {id: 'Blacheville', group: 3}, - {id: 'Favourite', group: 3}, - {id: 'Dahlia', group: 3}, - {id: 'Zephine', group: 3}, - {id: 'Fantine', group: 3}, - {id: 'Mme.Thenardier', group: 4}, - {id: 'Thenardier', group: 4}, - {id: 'Cosette', group: 5}, - {id: 'Javert', group: 4}, - {id: 'Fauchelevent', group: 0}, - {id: 'Bamatabois', group: 2}, - {id: 'Perpetue', group: 3}, - {id: 'Simplice', group: 2}, - {id: 'Scaufflaire', group: 2}, - {id: 'Woman1', group: 2}, - {id: 'Judge', group: 2}, - {id: 'Champmathieu', group: 2}, - {id: 'Brevet', group: 2}, - {id: 'Chenildieu', group: 2}, - {id: 'Cochepaille', group: 2}, - {id: 'Pontmercy', group: 4}, - {id: 'Boulatruelle', group: 6}, - {id: 'Eponine', group: 4}, - {id: 'Anzelma', group: 4}, - {id: 'Woman2', group: 5}, - {id: 'MotherInnocent', group: 0}, - {id: 'Gribier', group: 0}, - {id: 'Jondrette', group: 7}, - {id: 'Mme.Burgon', group: 7}, - {id: 'Gavroche', group: 8}, - {id: 'Gillenormand', group: 5}, - {id: 'Magnon', group: 5}, - {id: 'Mlle.Gillenormand', group: 5}, - {id: 'Mme.Pontmercy', group: 5}, - {id: 'Mlle.Vaubois', group: 5}, - {id: 'Lt.Gillenormand', group: 5}, - {id: 'Marius', group: 8}, - {id: 'BaronessT', group: 5}, - {id: 'Mabeuf', group: 8}, - {id: 'Enjolras', group: 8}, - {id: 'Combeferre', group: 8}, - {id: 'Prouvaire', group: 8}, - {id: 'Feuilly', group: 8}, - {id: 'Courfeyrac', group: 8}, - {id: 'Bahorel', group: 8}, - {id: 'Bossuet', group: 8}, - {id: 'Joly', group: 8}, - {id: 'Grantaire', group: 8}, - {id: 'MotherPlutarch', group: 9}, - {id: 'Gueulemer', group: 4}, - {id: 'Babet', group: 4}, - {id: 'Claquesous', group: 4}, - {id: 'Montparnasse', group: 4}, - {id: 'Toussaint', group: 5}, - {id: 'Child1', group: 10}, - {id: 'Child2', group: 10}, - {id: 'Brujon', group: 4}, - {id: 'Mme.Hucheloup', group: 8} + {id: 'Myriel'}, + {id: 'Napoleon'}, + {id: 'Mlle.Baptistine'}, + {id: 'Mme.Magloire'}, + {id: 'CountessdeLo'}, + {id: 'Geborand'}, + {id: 'Champtercier'}, + {id: 'Cravatte'}, + {id: 'Count'}, + {id: 'OldMan'}, + {id: 'Labarre'}, + {id: 'Valjean'}, + {id: 'Marguerite'}, + {id: 'Mme.deR'}, + {id: 'Isabeau'}, + {id: 'Gervais'}, + {id: 'Tholomyes'}, + {id: 'Listolier'}, + {id: 'Fameuil'}, + {id: 'Blacheville'}, + {id: 'Favourite'}, + {id: 'Dahlia'}, + {id: 'Zephine'}, + {id: 'Fantine'}, + {id: 'Mme.Thenardier'}, + {id: 'Thenardier'}, + {id: 'Cosette'}, + {id: 'Javert'}, + {id: 'Fauchelevent'}, + {id: 'Bamatabois'}, + {id: 'Perpetue'}, + {id: 'Simplice'}, + {id: 'Scaufflaire'}, + {id: 'Woman1'}, + {id: 'Judge'}, + {id: 'Champmathieu'}, + {id: 'Brevet'}, + {id: 'Chenildieu'}, + {id: 'Cochepaille'}, + {id: 'Pontmercy'}, + {id: 'Boulatruelle'}, + {id: 'Eponine'}, + {id: 'Anzelma'}, + {id: 'Woman2'}, + {id: 'MotherInnocent'}, + {id: 'Gribier'}, + {id: 'Jondrette'}, + {id: 'Mme.Burgon'}, + {id: 'Gavroche'}, + {id: 'Gillenormand'}, + {id: 'Magnon'}, + {id: 'Mlle.Gillenormand'}, + {id: 'Mme.Pontmercy'}, + {id: 'Mlle.Vaubois'}, + {id: 'Lt.Gillenormand'}, + {id: 'Marius'}, + {id: 'BaronessT'}, + {id: 'Mabeuf'}, + {id: 'Enjolras'}, + {id: 'Combeferre'}, + {id: 'Prouvaire'}, + {id: 'Feuilly'}, + {id: 'Courfeyrac'}, + {id: 'Bahorel'}, + {id: 'Bossuet'}, + {id: 'Joly'}, + {id: 'Grantaire'}, + {id: 'MotherPlutarch'}, + {id: 'Gueulemer'}, + {id: 'Babet'}, + {id: 'Claquesous'}, + {id: 'Montparnasse'}, + {id: 'Toussaint'}, + {id: 'Child1'}, + {id: 'Child2'}, + {id: 'Brujon'}, + {id: 'Mme.Hucheloup'} ], links: [ {source: 'Napoleon', target: 'Myriel', value: 1}, diff --git a/src/components/Graph/helper.js b/src/components/Graph/helper.js index 2051f0640..c90fad318 100644 --- a/src/components/Graph/helper.js +++ b/src/components/Graph/helper.js @@ -7,26 +7,78 @@ import CONST from './const'; import Link from '../Link/'; import Node from '../Node/'; -function buildGraph(nodes, nodeCallbacks, links, linkCallbacks, config, someNodeHighlighted) { - let linksComponents = []; - let nodesComponents = []; +function _buildLinkProps(source, target, nodes, links, config, linkCallbacks, someNodeHighlighted) { + const x1 = nodes[source] && nodes[source].x || '0'; + const y1 = nodes[source] && nodes[source].y || '0'; + const x2 = nodes[target] && nodes[target].x || '0'; + const y2 = nodes[target] && nodes[target].y || '0'; + + let opacity = config.link.opacity; - for (let node of Object.values(nodes)) { - const props = buildNodeProps(node, config, nodeCallbacks, someNodeHighlighted); + if (someNodeHighlighted) { + opacity = (nodes[source].highlighted && nodes[target].highlighted) ? config.link.opacity + : config.highlightOpacity; + } - nodesComponents.push(); + let stroke = config.link.color; - linksComponents = linksComponents.concat(buildNodeLinks(node, nodes, links, config, linkCallbacks, someNodeHighlighted)); + if (nodes[source].highlighted && nodes[target].highlighted) { + stroke = config.link.highlightColor === CONST.KEYWORDS.SAME ? config.link.color + : config.link.highlightColor; + } + + const linkValue = links[source][target] || links[target][source]; + + let strokeWidth = config.link.strokeWidth; + + if (config.link.semanticStrokeWidth) { + strokeWidth += (linkValue * strokeWidth) / 10; } return { - nodes: nodesComponents, - links: linksComponents + source, + target, + x1, + y1, + x2, + y2, + strokeWidth, + stroke, + className: CONST.LINK_CLASS_NAME, + opacity, + onClickLink: linkCallbacks.onClickLink }; } -function buildNodeProps(node, config, nodeCallbacks, someNodeHighlighted) { - const opacity = someNodeHighlighted ? (node.highlighted ? config.node.opacity : config.highlightOpacity) : config.node.opacity; +function _buildNodeLinks(nodeId, nodes, links, config, linkCallbacks, someNodeHighlighted) { + let linksComponents = []; + + if (links[nodeId]) { + const adjacents = Object.keys(links[nodeId]); + const n = adjacents.length; + + for (let j=0; j < n; j++) { + const source = nodeId; + const target = adjacents[j]; + + if (nodes[target]) { + const key = `${nodeId}${CONST.COORDS_SEPARATOR}${target}`; + const props = _buildLinkProps(source, target, nodes, links, config, linkCallbacks, someNodeHighlighted); + + linksComponents.push(); + } + } + } + + return linksComponents; +} + +function _buildNodeProps(node, config, nodeCallbacks, someNodeHighlighted) { + let opacity = config.node.opacity; + + if (someNodeHighlighted) { + opacity = node.highlighted ? config.node.opacity : config.highlightOpacity; + } let fill = node.color || config.node.color; @@ -56,57 +108,23 @@ function buildNodeProps(node, config, nodeCallbacks, someNodeHighlighted) { }; } -function buildNodeLinks(node, nodes, links, config, linkCallbacks, someNodeHighlighted) { +function buildGraph(nodes, nodeCallbacks, links, linkCallbacks, config, someNodeHighlighted) { let linksComponents = []; + let nodesComponents = []; - if (links[node.id]) { - const x1 = node && node.x || '0'; - const y1 = node && node.y || '0'; - - const adjacents = Object.keys(links[node.id]); - const n = adjacents.length; - - for (let j=0; j < n; j++) { - const target = adjacents[j]; - - if (nodes[target]) { - const key = `${node.id}${CONST.COORDS_SEPARATOR}${target}`; - const props = buildLinkProps(node.id, target, x1, y1, nodes, links, config, linkCallbacks, someNodeHighlighted); - - linksComponents.push(); - } - } - } - - return linksComponents; -} - -function buildLinkProps(source, target, x1, y1, nodes, links, config, linkCallbacks, someNodeHighlighted) { - const opacity = someNodeHighlighted ? (nodes[source].highlighted && nodes[target].highlighted) ? config.link.opacity : config.highlightOpacity : config.link.opacity; - - const stroke = (nodes[source].highlighted && nodes[target].highlighted) ? - (config.link.highlightColor === CONST.KEYWORDS.SAME ? config.link.color : config.link.highlightColor) - : config.link.color; + for (let nodeId in nodes) { + const props = _buildNodeProps(nodes[nodeId], config, nodeCallbacks, someNodeHighlighted); - const linkValue = links[source][target] || links[target][source]; - let strokeWidth = config.link.strokeWidth; + nodesComponents.push(); - if (config.link.semanticStrokeWidth) { - strokeWidth += (linkValue * strokeWidth) / 10; + linksComponents = linksComponents.concat( + _buildNodeLinks(nodeId, nodes, links, config, linkCallbacks, someNodeHighlighted) + ); } return { - source, - target, - x1, - y1, - x2: nodes[target] && nodes[target].x || '0', - y2: nodes[target] && nodes[target].y || '0', - strokeWidth, - stroke, - className: CONST.LINK_CLASS_NAME, - opacity, - onClickLink: linkCallbacks.onClickLink + nodes: nodesComponents, + links: linksComponents }; } @@ -122,6 +140,25 @@ function createForceSimulation(width, height) { return simulation; } +function initializeLinks(graphLinks) { + let links = {}; + + graphLinks.forEach(l => { + if (!links[l.source]) { + links[l.source] = {}; + } + + if (!links[l.target]) { + links[l.target] = {}; + } + + // @TODO: If the graph is directed this should be adapted + links[l.source][l.target] = links[l.target][l.source] = l.value || 1; + }); + + return links; +} + function initializeNodes(graphNodes) { let nodes = {}; let indexMapping = {}; @@ -144,25 +181,6 @@ function initializeNodes(graphNodes) { }; } -function initializeLinks(graphLinks) { - let links = {}; - - graphLinks.forEach(l => { - if (!links[l.source]) { - links[l.source] = {}; - } - - if (!links[l.target]) { - links[l.target] = {}; - } - - // @TODO: If the graph is directed this should not happen - links[l.source][l.target] = links[l.target][l.source] = l.value || 1; - }); - - return links; -} - export default { buildGraph, createForceSimulation, diff --git a/src/components/Graph/index.js b/src/components/Graph/index.js index 52b88fc73..986e26a69 100644 --- a/src/components/Graph/index.js +++ b/src/components/Graph/index.js @@ -40,7 +40,7 @@ export default class Graph extends React.Component { componentWillReceiveProps(nextProps) { const config = Utils.merge(DEFAULT_CONFIG, nextProps.config || {}); - if (JSON.stringify(config) !== JSON.stringify(this.state.config)) { + if (Utils.isEqual(this.state.config, config) === false) { this.setState({ config }); @@ -80,9 +80,9 @@ export default class Graph extends React.Component { this.state.config.staticGraph && this.simulation.stop(); } - _zoomConfig = () => { - d3.select(`#${this.props.id}-${CONST.GRAPH_WRAPPER_ID}`).call(d3.zoom().scaleExtent([this.state.config.minZoom, this.state.config.maxZoom]).on('zoom', this._zoomed)); - } + _zoomConfig = () => d3.select(`#${this.props.id}-${CONST.GRAPH_WRAPPER_ID}`) + .call(d3.zoom().scaleExtent([this.state.config.minZoom, this.state.config.maxZoom]) + .on('zoom', this._zoomed)); _tick = () => this.setState(this.state || {}); @@ -146,12 +146,14 @@ export default class Graph extends React.Component { resetNodesPositions = () => { if (!this.state.config.staticGraph) { - Object.values(this.state.nodes).forEach(node => { + for (let nodeId in this.state.nodes) { + let node = this.state.nodes[nodeId]; + if (node.fx && node.fy) { Reflect.deleteProperty(node, 'fx'); Reflect.deleteProperty(node, 'fy'); } - }); + } // @TODO: hardcoded alpha target this.simulation.alphaTarget(0.08).restart(); @@ -173,7 +175,11 @@ export default class Graph extends React.Component { render() { const { nodes, links } = GraphHelper.buildGraph( this.state.nodes, - { onClickNode: this.props.onClickNode, onMouseOverNode: this.onMouseOverNode, onMouseOut: this.onMouseOutNode}, + { + onClickNode: this.props.onClickNode, + onMouseOverNode: this.onMouseOverNode, + onMouseOut: this.onMouseOutNode + }, this.state.links, { onClickLink: this.props.onClickLink }, this.state.config, diff --git a/src/components/Link/index.js b/src/components/Link/index.js index 4a27485d9..7f775df1a 100644 --- a/src/components/Link/index.js +++ b/src/components/Link/index.js @@ -1,16 +1,14 @@ import React from 'react'; export default class Link extends React.Component { - constructor(props) { - super(props); - } - + // Properties more likely to mutate are evaluated first to take advantage of short-circuit evaluation shouldComponentUpdate(nextProps) { return nextProps.x1 !== this.props.x1 || nextProps.y1 !== this.props.y1 || nextProps.x2 !== this.props.x2 || nextProps.y2 !== this.props.y2 || nextProps.opacity !== this.props.opacity || nextProps.stroke !== this.props.stroke || nextProps.strokeWidth !== this.props.strokeWidth + || nextProps.color !== this.props.color || nextProps.semanticStrokeWidth !== this.props.semanticStrokeWidth; } diff --git a/src/components/Node/index.js b/src/components/Node/index.js index e85c27df1..153e21343 100644 --- a/src/components/Node/index.js +++ b/src/components/Node/index.js @@ -5,10 +5,7 @@ import CONST from './const'; import NodeHelper from './helper'; export default class Node extends React.Component { - constructor(props) { - super(props); - } - + // Properties more likely to mutate are evaluated first to take advantage of short-circuit evaluation shouldComponentUpdate(nextProps) { return nextProps.cx !== this.props.cx || nextProps.cy !== this.props.cy || nextProps.opacity !== this.props.opacity @@ -40,7 +37,7 @@ export default class Node extends React.Component { * Handle mouse out node event. * @return {undefined} */ - handleOnMouseOut = () => this.props.onMouseOut && this.props.onMouseOut(this.props.id); + handleOnMouseOutNode = () => this.props.onMouseOut && this.props.onMouseOut(this.props.id); render() { const gProps = { @@ -56,7 +53,7 @@ export default class Node extends React.Component { d: NodeHelper.buildSvgSymbol(this.props.size, this.props.type), fill: this.props.fill, onClick: this.handleOnClickNode, - onMouseOut: this.handleOnMouseOut, + onMouseOut: this.handleOnMouseOutNode, onMouseOver: this.handleOnMouseOverNode, opacity: this.props.opacity, stroke: this.props.stroke, diff --git a/src/utils.js b/src/utils.js index 4ed07109c..fadaf2d4d 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,26 +1,95 @@ -const MAX_DEPTH = 3; +// This variable assures that recursive methods such as merge and isEqual do not fall on +// circular JSON structure evaluation. +const MAX_DEPTH = 5; + +/** + * Checks whether a certain object property is from object type and is a non empty object. + * @param {Object} o - the object. + * @param {number|string} k - the object property. + * @return {boolean} returns true if o[k] is an non empty object. + */ +function _isPropertyNestedObject(o, k) { + return o.hasOwnProperty(k) && typeof o[k] === 'object' && o[k] !== null && !isObjectEmpty(o[k]); +} + +/** + * Generic deep comparison between javascript simple or complex objects. + * @param {Object} o1 - one of the objects to be compared. + * @param {Object} o2 - second object to compare with first. + * @param {number} [_depth=0] - this parameter serves only for internal usage. + * @return {boolean} returns true if o1 and o2 have exactly the same content, or are exactly the same object (reference). + */ +function isEqual(o1, o2, _depth=0) { + let diffs = []; + + if (_depth === 0 && o1 === o2) { + return true; + } + + if (isObjectEmpty(o1) && !isObjectEmpty(o2) || !isObjectEmpty(o1) && isObjectEmpty(o2)) { + return false; + } + + for (let k of Object.keys(o1)) { + const nestedO = _isPropertyNestedObject(o1, k) && _isPropertyNestedObject(o2, k); + + if (nestedO && _depth < MAX_DEPTH) { + diffs.push(isEqual(o1[k], o2[k], _depth + 1)); + } else { + const r = isObjectEmpty(o1[k]) && isObjectEmpty(o2[k]) || o2.hasOwnProperty(k) && o2[k] === o1[k]; + + diffs.push(r); + + if (!r) { + break; + } + } + } + + return diffs.indexOf(false) === -1; +} + +/** + * Checks whether or not a certain object is empty. + * NOTE: If the passed parameter is not an object the method return false. + * @param {Object} o - object whom emptiness we want to check. + * @return {boolean} true if the given object is n ft and object and is empty. + */ +function isObjectEmpty(o) { + return !!o && typeof o === 'object' && !Object.keys(o).length; +} /** * This function merges two objects o1 and o2, where o2 properties override existent o1 properties, and * if o2 doesn't posses some o1 property the function will fallback to the o1 property. - * @param {Object} o1 - object. - * @param {Object} o2 - object that will override o1 properties. - * @param {int} deepth - the deepth at which we are merging the object. - * @return {Object} Object that is the result of merging o1 and o2, being o2 properties prioritray overriding + * @param {Object} o1 - object. + * @param {Object} o2 - object that will override o1 properties. + * @param {int} depth - the depth at which we are merging the object. + * @return {Object} object that is the result of merging o1 and o2, being o2 properties priority overriding * existent o1 properties. */ -function merge(o1, o2, deepth=0) { +function merge(o1={}, o2={}, _depth=0) { let o = {}; for (let k of Object.keys(o1)) { - const nestedO = o2[k] && typeof o2[k] === 'object' && typeof o1[k] === 'object' && deepth < MAX_DEPTH; + const nestedO = o2[k] && typeof o2[k] === 'object' && typeof o1[k] === 'object' && _depth < MAX_DEPTH; - o[k] = nestedO ? merge(o1[k], o2[k], deepth + 1) : o2.hasOwnProperty(k) ? o2[k] : o1[k]; + if (nestedO) { + o[k] = merge(o1[k], o2[k], _depth + 1); + } else { + o[k] = o2.hasOwnProperty(k) ? o2[k] : o1[k]; + } } return o; } +/** + * Helper function for customized error logging. + * @param {string} component - the name of the component where the error is to be thrown. + * @param {string} msg - the message contain a more detailed explanation about the error. + * @return {Error} the thrown error. + */ function throwErr(component, msg) { const error = `react-d3-graph :: ${component} :: ${msg}`; @@ -28,6 +97,8 @@ function throwErr(component, msg) { } export default { + isEqual, + isObjectEmpty, merge, throwErr }; diff --git a/test/Graph.test.js b/test/Graph.test.js new file mode 100644 index 000000000..666eeb8b6 --- /dev/null +++ b/test/Graph.test.js @@ -0,0 +1,101 @@ +import React from 'react'; +import renderer from 'react-test-renderer'; + +import Graph from '../src/components/Graph'; +import graphMock from './graph.mock.js' + +describe('Graph Component', () => { + let that = {}; + + that.nodeColor = 'red'; + that.highlightColor = 'blue'; + that.svgSize = 600; + that.highlightOpacity = 0.1; + that.config = { + height: that.svgSize, + width: that.svgSize, + highlightBehavior: true, + highlightOpacity: that.highlightOpacity, + staticGraph: true, + node: { + color: that.nodeColor, + highlightColor: that.highlightColor, + size: 100 + }, + link: { + highlightColor: that.highlightColor + } + }; + that.mouseOverNodeCallback = jest.fn(); + + beforeEach(() => { + that.graph = renderer.create( + + ); + + that.tree = that.graph.toJSON(); + }); + + test('should be properly rendered', () => { + expect(that.tree).toMatchSnapshot(); + }); + + describe('when onMouseOverNode is called', () => { + const nodeOffset = 1; + const nodeAdjOffset = 2; + const nodeNotAdjOffset = 10; + + test('should call mouseOverNode callback', () => { + const linksNodes = that.tree.children[0].children[0].children; + const node = linksNodes[linksNodes.length - 1]; + + node.children[0].props.onMouseOver(); + + expect(that.mouseOverNodeCallback).toBeCalled(); + }); + + test('node and their adjacent should have opacity equal to 1 and color (fill) equal to that.highlightColor', () => { + let linksNodes = that.tree.children[0].children[0].children; + let node = linksNodes[linksNodes.length - nodeOffset]; + + node.children[0].props.onMouseOver(); + + let tree = that.graph.toJSON(); // re-render + + linksNodes = tree.children[0].children[0].children; + + // Mouse overed node + node = linksNodes[linksNodes.length - nodeOffset]; + + let props = node.children[0].props; + + expect(props.fill).toEqual(that.highlightColor); + expect(props.opacity).toEqual(1); + + // Some adjacent node + node = linksNodes[linksNodes.length - nodeAdjOffset]; + + props = node.children[0].props; + + expect(props.fill).toEqual(that.highlightColor); + expect(props.opacity).toEqual(1); + }); + + test('non selected node and non adjacent should have opacity equal to that.highlightOpacity and color equal to that.nodeColor', () => { + let linksNodes = that.tree.children[0].children[0].children; + let node = linksNodes[linksNodes.length - nodeOffset]; + + node.children[0].props.onMouseOver(); + + let tree = that.graph.toJSON(); // re-render + + linksNodes = tree.children[0].children[0].children; + node = linksNodes[linksNodes.length - nodeNotAdjOffset]; + + const props = node.children[0].props; + + expect(props.fill).toEqual(that.nodeColor); + expect(props.opacity).toEqual(that.highlightOpacity); + }); + }); +}); diff --git a/test/Link.test.js b/test/Link.test.js new file mode 100644 index 000000000..559b930ba --- /dev/null +++ b/test/Link.test.js @@ -0,0 +1,27 @@ +import React from 'react'; +import renderer from 'react-test-renderer'; + +import Link from '../src/components/Link'; + +describe('Link Component', () => { + let that = {}; + + beforeEach(() => { + that.callbackMock = jest.fn(); + + that.link = renderer.create( + + ); + + that.tree = that.link.toJSON(); + }); + + test('should be properly rendered', () => { + expect(that.tree).toMatchSnapshot(); + }); + + test('should call callback function when onClick is performed', () => { + that.tree.props.onClick(); + expect(that.callbackMock).toBeCalled(); + }); +}); diff --git a/test/Node.test.js b/test/Node.test.js new file mode 100644 index 000000000..71f258e04 --- /dev/null +++ b/test/Node.test.js @@ -0,0 +1,48 @@ +import React from 'react'; +import renderer from 'react-test-renderer'; + +import Node from '../src/components/Node'; + +describe('Node Component', () => { + let that = {}; + + beforeEach(() => { + that.clickCallback = jest.fn(); + that.mouseOverCallback = jest.fn(); + that.mouseOutCallback = jest.fn(); + + that.node = renderer.create( + + ); + + that.tree = that.node.toJSON(); + }); + + test('should be properly rendered', () => { + expect(that.tree).toMatchSnapshot(); + }); + + test('should call callback function when onClick is called', () => { + that.tree.children[0].props.onClick(); + expect(that.clickCallback).toBeCalled(); + }); + + test('should call callback function when onMouseOut is called', () => { + that.tree.children[0].props.onMouseOver(); + expect(that.mouseOverCallback).toBeCalled(); + }); + + test('should call callback function when onMouseOver is called', () => { + that.tree.children[0].props.onMouseOut(); + expect(that.mouseOutCallback).toBeCalled(); + }); +}); diff --git a/test/__snapshots__/Graph.test.js.snap b/test/__snapshots__/Graph.test.js.snap new file mode 100644 index 000000000..ebd34c92d --- /dev/null +++ b/test/__snapshots__/Graph.test.js.snap @@ -0,0 +1,1151 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Graph Component should be properly rendered 1`] = ` +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Harry + + + + + + Sally + + + + + + Mario + + + + + + Sarah + + + + + + Alice + + + + + + Eveie + + + + + + Peter + + + + + + James + + + + + + Carol + + + + + + Nicky + + + + + + Bobby + + + + + + Frank + + + + + + Lynne + + + + + + Roger + + + + + + Maddy + + + + + + Sonny + + + + + + Johan + + + + + + Henry + + + + + + Mikey + + + + + + Elric + + + + +
+`; diff --git a/test/__snapshots__/Link.test.js.snap b/test/__snapshots__/Link.test.js.snap new file mode 100644 index 000000000..a4f7ca15e --- /dev/null +++ b/test/__snapshots__/Link.test.js.snap @@ -0,0 +1,19 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Link Component should be properly rendered 1`] = ` + +`; diff --git a/test/__snapshots__/Node.test.js.snap b/test/__snapshots__/Node.test.js.snap new file mode 100644 index 000000000..fe74ec5de --- /dev/null +++ b/test/__snapshots__/Node.test.js.snap @@ -0,0 +1,32 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Node Component should be properly rendered 1`] = ` + + + + text + + +`; diff --git a/test/graph.mock.js b/test/graph.mock.js new file mode 100644 index 000000000..725eebdc9 --- /dev/null +++ b/test/graph.mock.js @@ -0,0 +1,196 @@ +export default { + nodes: [{ + id: 'Harry', + x: '40', + y: '200' + }, { + id: 'Sally', + x: '140', + y: '20' + }, { + id: 'Mario', + x: '20', + y: '110' + }, { + id: 'Sarah', + x: '30', + y: '184' + }, { + id: 'Alice', + x: '305', + y: '745' + }, { + id: 'Eveie', + x: '200', + y: '300' + }, { + id: 'Peter', + x: '120', + y: '270' + }, { + id: 'James', + x: '190', + y: '609' + }, { + id: 'Carol', + x: '101', + y: '201' + }, { + id: 'Nicky', + x: '2', + y: '200' + }, { + id: 'Bobby', + x: '404', + y: '404' + }, { + id: 'Frank', + x: '14', + y: '30' + }, { + id: 'Lynne', + x: '14', + y: '250' + }, { + id: 'Roger', + x: '14', + y: '259' + }, { + id: 'Maddy', + x: '409', + y: '500' + }, { + id: 'Sonny', + x: '520', + y: '123' + }, { + id: 'Johan', + x: '14', + y: '20' + }, { + id: 'Henry', + x: '20', + y: '1' + }, { + id: 'Mikey', + x: '90', + y: '90' + }, { + id: 'Elric', + x: '90', + y: '656' + }], + links: [{ + source: 'Harry', + target: 'Sally', + value: '1.2' + }, { + source: 'Harry', + target: 'Mario', + value: '1.3' + }, { + source: 'Sarah', + target: 'Alice', + value: '0.2' + }, { + source: 'Eveie', + target: 'Alice', + value: '0.5' + }, { + source: 'Peter', + target: 'Alice', + value: '1.6' + }, { + source: 'Mario', + target: 'Alice', + value: '0.4' + }, { + source: 'James', + target: 'Alice', + value: '0.6' + }, { + source: 'Harry', + target: 'Carol', + value: '0.7' + }, { + source: 'Harry', + target: 'Nicky', + value: '0.8' + }, { + source: 'Bobby', + target: 'Frank', + value: '0.8' + }, { + source: 'Alice', + target: 'Mario', + value: '0.7' + }, { + source: 'Harry', + target: 'Lynne', + value: '0.5' + }, { + source: 'Sarah', + target: 'James', + value: '1.9' + }, { + source: 'Roger', + target: 'James', + value: '1.1' + }, { + source: 'Maddy', + target: 'James', + value: '0.3' + }, { + source: 'Sonny', + target: 'Roger', + value: '0.5' + }, { + source: 'James', + target: 'Roger', + value: '1.5' + }, { + source: 'Alice', + target: 'Peter', + value: '1.1' + }, { + source: 'Johan', + target: 'Peter', + value: '1.6' + }, { + source: 'Alice', + target: 'Eveie', + value: '0.5' + }, { + source: 'Harry', + target: 'Eveie', + value: '0.1' + }, { + source: 'Eveie', + target: 'Harry', + value: '2.0' + }, { + source: 'Henry', + target: 'Mikey', + value: '0.4' + }, { + source: 'Elric', + target: 'Mikey', + value: '0.6' + }, { + source: 'James', + target: 'Sarah', + value: '1.5' + }, { + source: 'Alice', + target: 'Sarah', + value: '0.6' + }, { + source: 'James', + target: 'Maddy', + value: '0.5' + }, { + source: 'Peter', + target: 'Johan', + value: '0.7' + }] +}; diff --git a/test/utils.test.js b/test/utils.test.js new file mode 100644 index 000000000..8f5d56cbe --- /dev/null +++ b/test/utils.test.js @@ -0,0 +1,152 @@ +import Utils from '../src/utils'; + +describe('Utils', () => { + describe('merge', () => { + let that = {}; + + beforeEach(() => { + that.o = { + a:1, + b:{ + c:{ d: false, e: 'test', f: 12 }, + j: { + k: null, + l: 'test', + } + } + }; + }); + + test('should merge properly: r.a should be 2 and r.b.c.d should true', () => { + const r = Utils.merge(that.o, { a:2, b: { c: { d: true } } }); + + expect(r.a).toEqual(2); + expect(r.b.c.d).toEqual(true); + expect(r.b.c.e).toEqual('test'); + expect(r.b.c.f).toEqual(12); + }); + + test('should merge properly: o2 is undefined', () => { + const r = Utils.merge(that.o, undefined); + + expect(r.a).toEqual(1); + expect(r.b.c.d).toEqual(false); + expect(r.b.c.e).toEqual('test'); + expect(r.b.c.f).toEqual(12); + }); + }); + + test('isObjectEmpty', () => { + expect(Utils.isObjectEmpty({ a: 1, b: {}})).toEqual(false); + expect(Utils.isObjectEmpty({ a: 1 })).toEqual(false); + expect(Utils.isObjectEmpty(null)).toEqual(false); + expect(Utils.isObjectEmpty(undefined)).toEqual(false); + expect(Utils.isObjectEmpty(0)).toEqual(false); + expect(Utils.isObjectEmpty('test')).toEqual(false); + expect(Utils.isObjectEmpty({})).toEqual(true); + }); + + describe('isEqual', () => { + let that = {}; + + beforeEach(() => { + that.o1 = { + a:1, + b:{ + c:{ d: false, e: 'test', f: 12 }, + g: 'test', + h: undefined, + i: {}, + j: { + k: null, + l: 'test', + m: { + n: { + o: 1 + } + } + } + } + }; + + that.o2 = { + a:1, + b:{ + c:{ d: false, e: 'test', f: 12 }, + g: 'test', + h: undefined, + i: {}, + j: { + k: null, + l: 'test', + m: { + n: { + o: 1 + } + } + } + } + }; + }); + + test('should return true if no modifications are performed', () => { + expect(Utils.isEqual(that.o1, that.o2)).toEqual(true); + }); + + test('should return false when o2 is an empty object but o1 is not', () => { + expect(Utils.isEqual(that.o1, {})).toEqual(false); + }); + + test('should return false when o1 is an empty object but o2 is not', () => { + expect(Utils.isEqual({}, that.o2)).toEqual(false); + }); + + test('should return true when both objects are empty', () => { + expect(Utils.isEqual({}, {})).toEqual(true); + }); + + test('should return false when: o2.b.j.k = undefined', () => { + that.o2.b.j.k = undefined; + expect(Utils.isEqual(that.o1, that.o2)).toEqual(false); + }); + + test('should return false when: o2.b.j.m.n.o = "1"', () => { + that.o2.b.j.m.n.o = '1'; + expect(Utils.isEqual(that.o1, that.o2)).toEqual(false); + }); + + test('should return false when: o2.b.c.e = "tests"', () => { + that.o2.b.c.e = 'tests'; + expect(Utils.isEqual(that.o1, that.o2)).toEqual(false); + }); + + test('should return false when: o1.b.i = false', () => { + that.o1.b.i = false; + expect(Utils.isEqual(that.o1, that.o2)).toEqual(false); + }); + + test('should return false when: o1.a = false', () => { + that.o1.a = false; + expect(Utils.isEqual(that.o1, that.o2)).toEqual(false); + }); + + test('should return false when: o2.b.g = "tests"', () => { + that.o2.b.g = 'tests'; + expect(Utils.isEqual(that.o1, that.o2)).toEqual(false); + }); + + test('should return true when: o1.b.g = o2.b and o2.b.g = o2.b (circular structure)', () => { + // isEqual will evaluate until certain depth + // but since objects still the same we expect the result to be true + that.o1.b.g = that.o2.b; + that.o2.b.g = that.o2.b; + expect(Utils.isEqual(that.o1, that.o2)).toEqual(true); + }); + + test('should return true when: o1.b.g = o2.b and o2.b.g = o2 (circular structure)', () => { + that.o1.b.g = that.o2.b; + that.o2.b.g = that.o2; + expect(Utils.isEqual(that.o1, that.o2)).toEqual(false); + }); + }); +}); diff --git a/webpack.config.dist.js b/webpack.config.dist.js index 3c1f91fc0..ebe31eff5 100644 --- a/webpack.config.dist.js +++ b/webpack.config.dist.js @@ -19,7 +19,7 @@ module.exports = { loader: 'babel-loader', options: { presets: ['react', 'es2015', 'stage-0'], - plugins: ['react-html-attrs', 'transform-class-properties', 'transform-decorators-legacy'], + plugins: ['react-html-attrs'], } } ] diff --git a/webpack.config.js b/webpack.config.js index 56da480b6..615dbc2a9 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -21,10 +21,9 @@ module.exports = { loader: 'babel-loader', options: { presets: ['react', 'es2015', 'stage-0'], - plugins: ['react-html-attrs', 'transform-class-properties', 'transform-decorators-legacy'], + plugins: ['react-html-attrs'], } } ] - }, - plugins: [] + } }; diff --git a/yarn.lock b/yarn.lock index 903291684..9b6e5ca4b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,6 +9,10 @@ JSONStream@^1.0.3: 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" @@ -26,6 +30,12 @@ acorn-dynamic-import@^2.0.0: 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" + 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" @@ -49,8 +59,8 @@ ajv-keywords@^1.0.0, ajv-keywords@^1.1.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.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.6.tgz#947e93049790942b2a2d60a8289b28924d39f987" + version "4.11.7" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.7.tgz#8655a5d86d0824985cc471a1d913fb6729a0ec48" dependencies: co "^4.6.0" json-stable-stringify "^1.0.1" @@ -67,7 +77,11 @@ 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" -ansi-escapes@^1.1.0: +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" @@ -87,6 +101,12 @@ ansi-styles@^2.0.1, ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" +ansi-styles@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.0.0.tgz#5404e93a544c4fec7f048262977bebfe3155e0c1" + dependencies: + color-convert "^1.0.0" + anymatch@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" @@ -94,6 +114,12 @@ anymatch@^1.3.0: 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.1" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab" @@ -118,8 +144,12 @@ arr-diff@^2.0.0: arr-flatten "^1.0.1" arr-flatten@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" + 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-filter@~0.0.0: version "0.0.1" @@ -157,7 +187,7 @@ array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" -arrify@^1.0.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" @@ -195,11 +225,11 @@ async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" -async@^1.5.2: +async@^1.4.0, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" -async@^2.1.2: +async@^2.1.2, async@^2.1.4: version "2.3.0" resolved "https://registry.yarnpkg.com/async/-/async-2.3.0.tgz#1013d1051047dd320fe24e494d5c66ecaf6147d9" dependencies: @@ -236,7 +266,7 @@ 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.24.0, babel-core@^6.17.0: +babel-core@6.24.0, babel-core@^6.0.0, babel-core@^6.17.0: version "6.24.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.0.tgz#8f36a0a77f5c155aed6f920b844d23ba56742a02" dependencies: @@ -306,7 +336,7 @@ babel-generator@6.19.0: lodash "^4.2.0" source-map "^0.5.0" -babel-generator@^6.24.0, babel-generator@^6.24.1: +babel-generator@^6.18.0, babel-generator@^6.24.0, babel-generator@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497" dependencies: @@ -445,6 +475,14 @@ babel-helpers@^6.23.0, babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" +babel-jest@19.0.0, babel-jest@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-19.0.0.tgz#59323ced99a3a84d359da219ca881074ffc6ce3f" + dependencies: + babel-core "^6.0.0" + babel-plugin-istanbul "^4.0.0" + babel-preset-jest "^19.0.0" + babel-loader@6.4.1: version "6.4.1" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.4.1.tgz#0b34112d5b0748a8dcdbf51acf6f9bd42d50b8ca" @@ -464,12 +502,24 @@ babel-plugin-add-module-exports@0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz#9ae9a1f4a8dc67f0cdec4f4aeda1e43a5ff65e25" -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-istanbul@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.1.tgz#c12de0fc6fe42adfb16be56f1ad11e4a9782eca9" + dependencies: + find-up "^2.1.0" + istanbul-lib-instrument "^1.6.2" + test-exclude "^4.0.3" + +babel-plugin-jest-hoist@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-19.0.0.tgz#4ae2a04ea612a6e73651f3fde52c178991304bea" + babel-plugin-react-html-attrs@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/babel-plugin-react-html-attrs/-/babel-plugin-react-html-attrs-2.0.0.tgz#7e74ad72a104a57cd265e7faf694a16f611d3a9d" @@ -510,7 +560,7 @@ babel-plugin-syntax-export-extensions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" -babel-plugin-syntax-flow@^6.18.0, babel-plugin-syntax-flow@^6.3.13: +babel-plugin-syntax-flow@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" @@ -601,19 +651,19 @@ babel-plugin-transform-do-expressions@^6.3.13: babel-plugin-syntax-do-expressions "^6.8.0" babel-runtime "^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.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: 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: @@ -623,7 +673,7 @@ babel-plugin-transform-es2015-block-scoping@^6.14.0: babel-types "^6.24.1" lodash "^4.2.0" -babel-plugin-transform-es2015-classes@^6.14.0: +babel-plugin-transform-es2015-classes@^6.24.1: 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: @@ -637,33 +687,33 @@ babel-plugin-transform-es2015-classes@^6.14.0: babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-plugin-transform-es2015-computed-properties@^6.3.13: +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.16.0: +babel-plugin-transform-es2015-destructuring@^6.22.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.6.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.6.0: +babel-plugin-transform-es2015-for-of@^6.22.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.9.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: @@ -671,13 +721,13 @@ babel-plugin-transform-es2015-function-name@^6.9.0: babel-runtime "^6.22.0" babel-types "^6.24.1" -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.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: @@ -685,7 +735,7 @@ 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.16.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: +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: @@ -694,7 +744,7 @@ babel-plugin-transform-es2015-modules-commonjs@^6.16.0, babel-plugin-transform-e babel-template "^6.24.1" babel-types "^6.24.1" -babel-plugin-transform-es2015-modules-systemjs@^6.14.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: @@ -702,7 +752,7 @@ babel-plugin-transform-es2015-modules-systemjs@^6.14.0: 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: @@ -710,14 +760,14 @@ babel-plugin-transform-es2015-modules-umd@^6.12.0: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-plugin-transform-es2015-object-super@^6.3.13: +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.16.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: @@ -728,20 +778,20 @@ babel-plugin-transform-es2015-parameters@^6.16.0: babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-plugin-transform-es2015-shorthand-properties@^6.3.13: +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.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.3.13: +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: @@ -749,19 +799,19 @@ babel-plugin-transform-es2015-sticky-regex@^6.3.13: babel-runtime "^6.22.0" babel-types "^6.24.1" -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.6.0: +babel-plugin-transform-es2015-typeof-symbol@^6.22.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.3.13: +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: @@ -784,7 +834,7 @@ babel-plugin-transform-export-extensions@^6.22.0: babel-plugin-syntax-export-extensions "^6.8.0" babel-runtime "^6.22.0" -babel-plugin-transform-flow-strip-types@^6.3.13: +babel-plugin-transform-flow-strip-types@^6.22.0: 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: @@ -805,27 +855,27 @@ babel-plugin-transform-object-rest-spread@^6.22.0: babel-plugin-syntax-object-rest-spread "^6.8.0" babel-runtime "^6.22.0" -babel-plugin-transform-react-display-name@^6.3.13: +babel-plugin-transform-react-display-name@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.23.0.tgz#4398910c358441dc4cef18787264d0412ed36b37" dependencies: babel-runtime "^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.3.13: +babel-plugin-transform-react-jsx-source@^6.22.0: 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@^6.3.13: +babel-plugin-transform-react-jsx@^6.24.1: 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: @@ -833,7 +883,7 @@ babel-plugin-transform-react-jsx@^6.3.13: babel-plugin-syntax-jsx "^6.8.0" babel-runtime "^6.22.0" -babel-plugin-transform-regenerator@^6.16.0: +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: @@ -846,46 +896,57 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-preset-es2015@6.16.0, babel-preset-es2015@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.16.0.tgz#59acecd1efbebaf48f89404840f2fe78c4d2ad5c" - dependencies: - babel-plugin-check-es2015-constants "^6.3.13" - 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.14.0" - babel-plugin-transform-es2015-classes "^6.14.0" - babel-plugin-transform-es2015-computed-properties "^6.3.13" - babel-plugin-transform-es2015-destructuring "^6.16.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.9.0" - babel-plugin-transform-es2015-literals "^6.3.13" - babel-plugin-transform-es2015-modules-amd "^6.8.0" - babel-plugin-transform-es2015-modules-commonjs "^6.16.0" - babel-plugin-transform-es2015-modules-systemjs "^6.14.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.16.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-regenerator "^6.16.0" - -babel-preset-react@6.16.0, babel-preset-react@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.16.0.tgz#aa117d60de0928607e343c4828906e4661824316" +babel-preset-es2015@6.24.1, babel-preset-es2015@^6.16.0: + 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-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@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-19.0.0.tgz#22d67201d02324a195811288eb38294bb3cac396" + dependencies: + babel-plugin-jest-hoist "^19.0.0" + +babel-preset-react@6.24.1, babel-preset-react@^6.16.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" 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-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-preset-stage-0@6.16.0, babel-preset-stage-0@^6.16.0: version "6.16.0" @@ -941,7 +1002,7 @@ babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime@^6.22.0, babel-runtim core-js "^2.4.0" regenerator-runtime "^0.10.0" -babel-template@^6.22.0, babel-template@^6.23.0, babel-template@^6.24.1, babel-template@^6.3.0: +babel-template@^6.16.0, babel-template@^6.22.0, babel-template@^6.23.0, babel-template@^6.24.1, babel-template@^6.3.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333" dependencies: @@ -951,7 +1012,7 @@ babel-template@^6.22.0, babel-template@^6.23.0, babel-template@^6.24.1, babel-te babylon "^6.11.0" lodash "^4.2.0" -babel-traverse@^6.0.20, babel-traverse@^6.16.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1: +babel-traverse@^6.0.20, babel-traverse@^6.16.0, babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695" dependencies: @@ -965,7 +1026,7 @@ babel-traverse@^6.0.20, babel-traverse@^6.16.0, babel-traverse@^6.23.1, babel-tr invariant "^2.2.0" lodash "^4.2.0" -babel-types@^6.0.19, babel-types@^6.16.0, babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24.1: +babel-types@^6.0.19, babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975" dependencies: @@ -981,7 +1042,7 @@ babelify@^7.3.0: babel-core "^6.0.14" object-assign "^4.0.0" -babylon@^6.0.18, babylon@^6.11.0, babylon@^6.11.4, babylon@^6.15.0: +babylon@^6.0.18, babylon@^6.11.0, babylon@^6.11.4, babylon@^6.13.0, babylon@^6.15.0: version "6.16.1" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.16.1.tgz#30c5a22f481978a9e7f8cdfdf496b11d94b404d3" @@ -1067,7 +1128,7 @@ brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" -browser-resolve@^1.7.0: +browser-resolve@^1.11.2, browser-resolve@^1.7.0: version "1.11.2" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" dependencies: @@ -1131,6 +1192,18 @@ browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: 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" + +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-shims@^1.0.0, buffer-shims@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" @@ -1173,6 +1246,10 @@ 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" @@ -1257,6 +1334,10 @@ chokidar@^1.2.0, chokidar@^1.4.3, chokidar@^1.6.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" + cipher-base@^1.0.0, cipher-base@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6df0a07" @@ -1274,8 +1355,8 @@ clap@^1.0.9: chalk "^1.1.3" clean-css@4.0.x: - version "4.0.11" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.0.11.tgz#a6d88bffb399420b24298db49d99a1ed067534a8" + version "4.0.12" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.0.12.tgz#a02e61707f1840bd3338f54dbc9acbda4e772fa3" dependencies: source-map "0.5.x" @@ -1347,7 +1428,7 @@ collapse-white-space@^1.0.0, collapse-white-space@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.2.tgz#9c463fb9c6d190d2dcae21a356a01bcae9eeef6d" -color-convert@^1.3.0: +color-convert@^1.0.0, color-convert@^1.3.0: version "1.9.0" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" dependencies: @@ -1390,8 +1471,8 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: delayed-stream "~1.0.0" comma-separated-tokens@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.2.tgz#4b64717a2ee363af6dd39878336bd95e42d063e7" + version "1.0.3" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.3.tgz#6eb01f4730bde7a7fce5d5e2d943bdd637272801" dependencies: trim "0.0.1" @@ -1468,6 +1549,10 @@ 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" @@ -1556,7 +1641,7 @@ 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.28.0: +css-loader@0.28.0: version "0.28.0" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.0.tgz#417cfa9789f8cde59a30ccbf3e4da7a806889bad" dependencies: @@ -1650,6 +1735,16 @@ csso@~2.3.1: 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" + d3-array@1, d3-array@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.1.1.tgz#a01abe63a25ffb91d3423c3c6d051b4d36bc8a09" @@ -1916,6 +2011,12 @@ 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" @@ -1985,6 +2086,10 @@ diff@^1.3.2: version "1.4.0" resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" +diff@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + diffie-hellman@^5.0.0: version "5.0.2" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" @@ -2201,7 +2306,7 @@ entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" -errno@^0.1.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: @@ -2297,6 +2402,17 @@ 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" @@ -2503,7 +2619,7 @@ espree@^3.1.6, espree@^3.4.0: acorn "^5.0.1" acorn-jsx "^3.0.0" -esprima@^2.6.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" @@ -2524,6 +2640,10 @@ esrecurse@^4.1.0: 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" @@ -2579,6 +2699,12 @@ evp_bytestokey@^1.0.0: dependencies: create-hash "^1.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" + exit-hook@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" @@ -2668,7 +2794,19 @@ faye-websocket@~0.11.0: dependencies: websocket-driver ">=0.5.1" -fbjs@^0.8.1, fbjs@^0.8.4: +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.4, fbjs@^0.8.9: version "0.8.12" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.12.tgz#10b5d92f76d45575fd63a217d4ea02bea2f8ed04" dependencies: @@ -2705,6 +2843,13 @@ filename-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" +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" + fill-range@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" @@ -2742,6 +2887,12 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^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" + first-chunk-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" @@ -2967,7 +3118,7 @@ globby@^5.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -graceful-fs@^4.0.0, graceful-fs@^4.1.2: +graceful-fs@^4.0.0, graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -2975,6 +3126,10 @@ graceful-fs@^4.0.0, graceful-fs@^4.1.2: version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + gulp-sourcemaps@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz#b86ff349d801ceb56e1d9e7dc7bbcb4b7dee600c" @@ -2989,6 +3144,16 @@ handle-thing@^1.2.4: version "1.2.5" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" +handlebars@^4.0.3: + version "4.0.6" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + har-schema@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" @@ -3086,8 +3251,8 @@ history@^4.5.1, history@^4.6.0: warning "^3.0.0" hmac-drbg@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.0.tgz#3db471f45aae4a994a0688322171f51b8b91bee5" + 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" @@ -3097,6 +3262,10 @@ 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" + 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" @@ -3105,8 +3274,8 @@ home-or-tmp@^2.0.0: os-tmpdir "^1.0.1" hosted-git-info@^2.1.4: - version "2.4.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.1.tgz#4b0445e41c004a8bd1337773a4ff790ca40318c8" + 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" @@ -3121,6 +3290,12 @@ 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" @@ -3215,6 +3390,10 @@ iconv-lite@0.4, iconv-lite@~0.4.13: version "0.4.15" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" +iconv-lite@0.4.13: + version "0.4.13" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" + icss-replace-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.0.2.tgz#cb0b6054eb3af6edc9ab1d62d01933e2d4c8bfa5" @@ -3277,8 +3456,8 @@ inquirer@^0.12.0: through "^2.3.6" interpret@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.2.tgz#f4f623f0bb7122f15f5717c8e254b8161b5c5b2d" + version "1.0.3" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90" invariant@^2.2.0, invariant@^2.2.1, invariant@^2.2.2: version "2.2.2" @@ -3348,6 +3527,12 @@ is-callable@^1.1.1, is-callable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" +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" @@ -3554,6 +3739,270 @@ 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.7" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.7.tgz#f6f37f09f8002b130f891c646b70ee4a8e7345ae" + dependencies: + async "^2.1.4" + fileset "^2.0.2" + istanbul-lib-coverage "^1.0.2" + istanbul-lib-hook "^1.0.5" + istanbul-lib-instrument "^1.7.0" + istanbul-lib-report "^1.0.0" + istanbul-lib-source-maps "^1.1.1" + istanbul-reports "^1.0.2" + js-yaml "^3.7.0" + mkdirp "^0.5.1" + once "^1.4.0" + +istanbul-lib-coverage@^1.0.0, istanbul-lib-coverage@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.2.tgz#87a0c015b6910651cb3b184814dfb339337e25e1" + +istanbul-lib-hook@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.5.tgz#6ca3d16d60c5f4082da39f7c5cd38ea8a772b88e" + dependencies: + append-transform "^0.4.0" + +istanbul-lib-instrument@^1.1.1, istanbul-lib-instrument@^1.6.2, istanbul-lib-instrument@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.0.tgz#b8e0dc25709bb44e17336ab47b7bb5c97c23f659" + 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.0.2" + semver "^5.3.0" + +istanbul-lib-report@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.0.0.tgz#d83dac7f26566b521585569367fe84ccfc7aaecb" + dependencies: + istanbul-lib-coverage "^1.0.2" + mkdirp "^0.5.1" + path-parse "^1.0.5" + supports-color "^3.1.2" + +istanbul-lib-source-maps@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.1.1.tgz#f8c8c2e8f2160d1d91526d97e5bd63b2079af71c" + dependencies: + istanbul-lib-coverage "^1.0.2" + mkdirp "^0.5.1" + rimraf "^2.4.4" + source-map "^0.5.3" + +istanbul-reports@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.0.2.tgz#4e8366abe6fa746cc1cd6633f108de12cc6ac6fa" + dependencies: + handlebars "^4.0.3" + +jest-changed-files@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-19.0.2.tgz#16c54c84c3270be408e06d2e8af3f3e37a885824" + +jest-cli@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-19.0.2.tgz#cc3620b62acac5f2d93a548cb6ef697d4ec85443" + 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 "^19.0.2" + jest-config "^19.0.2" + jest-environment-jsdom "^19.0.2" + jest-haste-map "^19.0.0" + jest-jasmine2 "^19.0.2" + jest-message-util "^19.0.0" + jest-regex-util "^19.0.0" + jest-resolve-dependencies "^19.0.0" + jest-runtime "^19.0.2" + jest-snapshot "^19.0.2" + jest-util "^19.0.2" + micromatch "^2.3.11" + node-notifier "^5.0.1" + slash "^1.0.0" + string-length "^1.0.1" + throat "^3.0.0" + which "^1.1.1" + worker-farm "^1.3.1" + yargs "^6.3.0" + +jest-config@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-19.0.2.tgz#1b9bd2db0ddd16df61c2b10a54009e1768da6411" + dependencies: + chalk "^1.1.1" + jest-environment-jsdom "^19.0.2" + jest-environment-node "^19.0.2" + jest-jasmine2 "^19.0.2" + jest-regex-util "^19.0.0" + jest-resolve "^19.0.2" + jest-validate "^19.0.2" + pretty-format "^19.0.0" + +jest-diff@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-19.0.0.tgz#d1563cfc56c8b60232988fbc05d4d16ed90f063c" + dependencies: + chalk "^1.1.3" + diff "^3.0.0" + jest-matcher-utils "^19.0.0" + pretty-format "^19.0.0" + +jest-environment-jsdom@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-19.0.2.tgz#ceda859c4a4b94ab35e4de7dab54b926f293e4a3" + dependencies: + jest-mock "^19.0.0" + jest-util "^19.0.2" + jsdom "^9.11.0" + +jest-environment-node@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-19.0.2.tgz#6e84079db87ed21d0c05e1f9669f207b116fe99b" + dependencies: + jest-mock "^19.0.0" + jest-util "^19.0.2" + +jest-file-exists@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-file-exists/-/jest-file-exists-19.0.0.tgz#cca2e587a11ec92e24cfeab3f8a94d657f3fceb8" + +jest-haste-map@^19.0.0: + version "19.0.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-19.0.1.tgz#7616222491275050c7af39dbeab0a57c32ef9652" + dependencies: + fb-watchman "^2.0.0" + graceful-fs "^4.1.6" + micromatch "^2.3.11" + sane "~1.5.0" + worker-farm "^1.3.1" + +jest-jasmine2@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-19.0.2.tgz#167991ac825981fb1a800af126e83afcca832c73" + dependencies: + graceful-fs "^4.1.6" + jest-matcher-utils "^19.0.0" + jest-matchers "^19.0.0" + jest-message-util "^19.0.0" + jest-snapshot "^19.0.2" + +jest-matcher-utils@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-19.0.0.tgz#5ecd9b63565d2b001f61fbf7ec4c7f537964564d" + dependencies: + chalk "^1.1.3" + pretty-format "^19.0.0" + +jest-matchers@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-19.0.0.tgz#c74ecc6ebfec06f384767ba4d6fa4a42d6755754" + dependencies: + jest-diff "^19.0.0" + jest-matcher-utils "^19.0.0" + jest-message-util "^19.0.0" + jest-regex-util "^19.0.0" + +jest-message-util@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-19.0.0.tgz#721796b89c0e4d761606f9ba8cb828a3b6246416" + dependencies: + chalk "^1.1.1" + micromatch "^2.3.11" + +jest-mock@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-19.0.0.tgz#67038641e9607ab2ce08ec4a8cb83aabbc899d01" + +jest-regex-util@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-19.0.0.tgz#b7754587112aede1456510bb1f6afe74ef598691" + +jest-resolve-dependencies@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-19.0.0.tgz#a741ad1fa094140e64ecf2642a504f834ece22ee" + dependencies: + jest-file-exists "^19.0.0" + +jest-resolve@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-19.0.2.tgz#5793575de4f07aec32f7d7ff0c6c181963eefb3c" + dependencies: + browser-resolve "^1.11.2" + jest-haste-map "^19.0.0" + resolve "^1.2.0" + +jest-runtime@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-19.0.2.tgz#d9a43e72de416d27d196fd9c7940d98fe6685407" + dependencies: + babel-core "^6.0.0" + babel-jest "^19.0.0" + babel-plugin-istanbul "^4.0.0" + chalk "^1.1.3" + graceful-fs "^4.1.6" + jest-config "^19.0.2" + jest-file-exists "^19.0.0" + jest-haste-map "^19.0.0" + jest-regex-util "^19.0.0" + jest-resolve "^19.0.2" + jest-util "^19.0.2" + json-stable-stringify "^1.0.1" + micromatch "^2.3.11" + strip-bom "3.0.0" + yargs "^6.3.0" + +jest-snapshot@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-19.0.2.tgz#9c1b216214f7187c38bfd5c70b1efab16b0ff50b" + dependencies: + chalk "^1.1.3" + jest-diff "^19.0.0" + jest-file-exists "^19.0.0" + jest-matcher-utils "^19.0.0" + jest-util "^19.0.2" + natural-compare "^1.4.0" + pretty-format "^19.0.0" + +jest-util@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-19.0.2.tgz#e0a0232a2ab9e6b2b53668bdb3534c2b5977ed41" + dependencies: + chalk "^1.1.1" + graceful-fs "^4.1.6" + jest-file-exists "^19.0.0" + jest-message-util "^19.0.0" + jest-mock "^19.0.0" + jest-validate "^19.0.2" + leven "^2.0.0" + mkdirp "^0.5.1" + +jest-validate@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-19.0.2.tgz#dc534df5f1278d5b63df32b14241d4dbf7244c0c" + dependencies: + chalk "^1.1.1" + jest-matcher-utils "^19.0.0" + leven "^2.0.0" + pretty-format "^19.0.0" + +jest@19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest/-/jest-19.0.2.tgz#b794faaf8ff461e7388f28beef559a54f20b2c10" + dependencies: + jest-cli "^19.0.2" + jodid25519@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" @@ -3568,7 +4017,7 @@ 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.3.1, js-yaml@^3.5.1: +js-yaml@^3.3.1, js-yaml@^3.5.1, js-yaml@^3.7.0: version "3.8.3" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.3.tgz#33a05ec481c850c8875929166fe1beb61c728766" dependencies: @@ -3586,6 +4035,30 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" +jsdom@^9.11.0: + 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" @@ -3677,6 +4150,10 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" +leven@^2.0.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" @@ -3735,6 +4212,13 @@ loader-utils@^1.0.2: emojis-list "^2.0.0" json5 "^0.5.0" +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.assign@^4.0.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" @@ -3818,6 +4302,12 @@ macaddress@^0.2.8: version "0.2.8" resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" +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-cache@^0.2.0: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -3906,6 +4396,10 @@ merge-stream@^1.0.0: dependencies: readable-stream "^2.0.1" +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" @@ -3957,17 +4451,17 @@ 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@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, 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.8, minimist@~0.0.1: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -minimist@^1.1.0, minimist@^1.2.0: +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -4009,8 +4503,8 @@ mute-stream@0.0.5: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" nan@^2.3.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.1.tgz#8c84f7b14c96b89f57fbc838012180ec8ca39a01" + 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" @@ -4039,6 +4533,10 @@ node-fetch@^1.0.1: 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@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646" @@ -4067,6 +4565,15 @@ node-libs-browser@^2.0.0: util "^0.10.3" vm-browserify "0.0.4" +node-notifier@^5.0.1: + 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.34" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc18d9799f7" @@ -4163,6 +4670,10 @@ 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.3.9" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.3.9.tgz#8bab486ff7fa3dfd086656bbe8b17116d3692d2a" + oauth-sign@~0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" @@ -4196,7 +4707,7 @@ 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.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: @@ -4219,6 +4730,13 @@ opn@4.0.2: object-assign "^4.0.1" pinkie-promise "^2.0.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" @@ -4268,6 +4786,16 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +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" + pako@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" @@ -4341,6 +4869,10 @@ parse-url@^1.3.0: is-ssh "^1.3.0" protocols "^1.4.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" @@ -4359,6 +4891,10 @@ 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" @@ -4716,6 +5252,12 @@ pretty-error@^2.0.2: renderkid "^2.0.1" utila "~0.4" +pretty-format@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-19.0.0.tgz#56530d32acb98a3fa4851c4e2b9d37b420684c84" + dependencies: + ansi-styles "^3.0.0" + private@^0.1.6: version "0.1.7" resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" @@ -4738,6 +5280,12 @@ promise@^7.1.1: dependencies: asap "~2.0.3" +prop-types@^15.5.4, prop-types@^15.5.7, prop-types@~15.5.7: + version "15.5.8" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.8.tgz#6b7b2e141083be38c8595aa51fc55775c7199394" + dependencies: + fbjs "^0.8.9" + property-information@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/property-information/-/property-information-3.1.0.tgz#1581bf8a445dfbfef759775a86700e8dda18b4a1" @@ -4843,13 +5391,21 @@ rc@^1.1.0, rc@^1.1.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-dom@15.4.2: - version "15.4.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.4.2.tgz#015363f05b0a1fd52ae9efdd3a0060d90695208f" +react-addons-test-utils@^15.5.0: + version "15.5.1" + resolved "https://registry.yarnpkg.com/react-addons-test-utils/-/react-addons-test-utils-15.5.1.tgz#e0d258cda2a122ad0dff69f838260d0c3958f5f7" dependencies: - fbjs "^0.8.1" + fbjs "^0.8.4" + object-assign "^4.1.0" + +react-dom@^15.5.0: + version "15.5.4" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.5.4.tgz#ba0c28786fd52ed7e4f2135fe0288d462aef93da" + dependencies: + fbjs "^0.8.9" loose-envify "^1.1.0" object-assign "^4.1.0" + prop-types "~15.5.7" react-jsonschema-form@0.46.0: version "0.46.0" @@ -4867,22 +5423,32 @@ react-router-dom@4.0.0: react-router "^4.0.0" react-router@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-4.0.0.tgz#6532075231f0bb5077c2005c1d417ad6165b3997" + version "4.1.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-4.1.1.tgz#d448f3b7c1b429a6fbb03395099949c606b1fe95" dependencies: history "^4.6.0" + hoist-non-react-statics "^1.2.0" invariant "^2.2.2" loose-envify "^1.3.1" path-to-regexp "^1.5.3" + prop-types "^15.5.4" warning "^3.0.0" -react@15.4.2: - version "15.4.2" - resolved "https://registry.yarnpkg.com/react/-/react-15.4.2.tgz#41f7991b26185392ba9bae96c8889e7e018397ef" +react-test-renderer@^15.5.0: + version "15.5.4" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-15.5.4.tgz#d4ebb23f613d685ea8f5390109c2d20fbf7c83bc" dependencies: - fbjs "^0.8.4" + fbjs "^0.8.9" + object-assign "^4.1.0" + +react@^15.5.0: + version "15.5.4" + resolved "https://registry.yarnpkg.com/react/-/react-15.5.4.tgz#fa83eb01506ab237cdc1c8c3b1cea8de012bf047" + dependencies: + fbjs "^0.8.9" loose-envify "^1.1.0" object-assign "^4.1.0" + prop-types "^15.5.7" read-json-sync@^1.1.0: version "1.1.1" @@ -5162,7 +5728,7 @@ replace-ext@1.0.0, replace-ext@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" -request@^2.81.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: @@ -5224,7 +5790,7 @@ resolve@1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" -resolve@^1.1.3, resolve@^1.1.6: +resolve@^1.1.3, resolve@^1.1.6, resolve@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.2.tgz#1f0442c9e0cbb8136e87b9305f932f46c7f28235" dependencies: @@ -5243,7 +5809,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1: +rimraf@2, rimraf@^2.2.8, rimraf@^2.4.4, 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: @@ -5275,7 +5841,19 @@ safe-json-parse@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" -sax@~1.2.1: +sane@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-1.5.0.tgz#a4adeae764d048621ecb27d5f9ecf513101939f3" + dependencies: + anymatch "^1.3.0" + 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" @@ -5387,6 +5965,10 @@ shellsubstitute@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shellsubstitute/-/shellsubstitute-1.2.0.tgz#e4f702a50c518b0f6fe98451890d705af29b6b70" +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" @@ -5447,6 +6029,18 @@ source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, sourc version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" +source-map@^0.4.4: + 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" + space-separated-tokens@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.0.tgz#9e8c60407aa527742cd9eaee2541dec639f1269b" @@ -5498,8 +6092,8 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" sshpk@^1.7.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.11.0.tgz#2d8d5ebb4a6fab28ffba37fa62a90f4a3ea59d77" + version "1.13.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c" dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -5564,6 +6158,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-template@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" @@ -5628,16 +6228,16 @@ strip-bom-stream@^1.0.0: first-chunk-stream "^1.0.0" strip-bom "^2.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-json-comments@^2.0.0, 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" @@ -5646,7 +6246,7 @@ strip-json-comments@~1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" -style-loader@^0.16.1: +style-loader@0.16.1: version "0.16.1" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.16.1.tgz#50e325258d4e78421dd9680636b41e8661595d10" dependencies: @@ -5662,7 +6262,7 @@ 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.2.3: +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: @@ -5680,6 +6280,10 @@ svgo@^0.7.0: 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" @@ -5716,10 +6320,24 @@ tar@^2.2.1: fstream "^1.0.2" inherits "2" +test-exclude@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.0.3.tgz#86a13ce3effcc60e6c90403cf31a27a60ac6c4e7" + 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" + 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.0.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-3.0.0.tgz#e7c64c867cbb3845f10877642f7b60055b8ec0d6" + through2-filter@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" @@ -5762,6 +6380,10 @@ tiny-lr@^1.0.3: object-assign "^4.1.0" qs "^6.2.0" +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + to-absolute-glob@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f" @@ -5780,12 +6402,16 @@ toposort@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.3.tgz#f02cd8a74bd8be2fc0e98611c3bacb95a171869c" -tough-cookie@~2.3.0: +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-lines@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-1.1.0.tgz#9926d03ede13ba18f7d42222631fb04c79ff26fe" @@ -5845,7 +6471,7 @@ 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@^2.8.5, uglify-js@~2.8.22: +uglify-js@^2.6, uglify-js@^2.8.5, uglify-js@~2.8.22: version "2.8.22" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.22.tgz#d54934778a8da14903fa29a326fb24c0ab51a1a0" dependencies: @@ -6105,8 +6731,8 @@ vinyl@^1.0.0: replace-ext "0.0.1" vinyl@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.0.1.tgz#1c3b4931e7ac4c1efee743f3b91a74c094407bb6" + version "2.0.2" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.0.2.tgz#0a3713d8d4e9221c58f10ca16c0116c9e25eda7c" dependencies: clone "^1.0.0" clone-buffer "^1.0.0" @@ -6122,12 +6748,22 @@ vm-browserify@0.0.4: 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@^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@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.3.1.tgz#7d8693907b28ce6013e7f3610aa2a1acf07dad87" @@ -6142,6 +6778,14 @@ wbuf@^1.1.0, wbuf@^1.4.0: dependencies: minimalistic-assert "^1.0.0" +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-dev-middleware@^1.9.0: version "1.10.1" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.10.1.tgz#c6b4cf428139cf1aefbe06a0c00fdb4f8da2f893" @@ -6215,10 +6859,23 @@ 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@>=0.10.0: version "2.0.3" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" +whatwg-url@^4.3.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.7.0.tgz#202035ac1955b087cdd20fa8b58ded3ab1cd2af5" + 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" @@ -6227,7 +6884,7 @@ 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.2.9: +which@^1.1.1, which@^1.2.12, which@^1.2.9: version "1.2.14" resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" dependencies: @@ -6243,7 +6900,7 @@ 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: +wordwrap@0.0.2, wordwrap@~0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" @@ -6251,6 +6908,13 @@ 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" @@ -6276,6 +6940,10 @@ 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" + xmlhttprequest@1: version "1.8.0" resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" @@ -6298,7 +6966,7 @@ yargs-parser@^4.2.0: dependencies: camelcase "^3.0.0" -yargs@^6.0.0: +yargs@^6.0.0, yargs@^6.3.0: version "6.6.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" dependencies: