From 46a0f8ee4a2d0b9279f47e4a77798bbf7aa82244 Mon Sep 17 00:00:00 2001 From: Ivan Vlasenko Date: Sat, 15 Apr 2017 17:22:50 +0300 Subject: [PATCH 1/4] Update react, update to new react-side-effect api --- README.md | 2 +- index.js | 68 +++++++++++++++++++++---------------------------- package.json | 9 ++++--- test/browser.js | 59 ++++++++++++++++++++++-------------------- test/common.js | 37 +++++++++++++++------------ 5 files changed, 88 insertions(+), 87 deletions(-) diff --git a/README.md b/README.md index c6bddcd..c160f05 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Built with [React Side Effect](https://github.com/gaearon/react-side-effect). npm install --save react-redirect ``` -Dependencies: React >= 0.11.0 +Dependencies: React >= 15.5.0 ## Features diff --git a/index.js b/index.js index 7637333..dc37226 100644 --- a/index.js +++ b/index.js @@ -1,44 +1,34 @@ 'use strict'; var React = require('react'), - createSideEffect = require('react-side-effect'); - -var _serverRedirect = null; - -function getRedirectFromPropsList(propsList) { - var innermostProps = propsList[propsList.length - 1]; - if (innermostProps) { - return innermostProps.location; - } + PropTypes = require('prop-types'), + withSideEffect = require('react-side-effect'); + +function reducePropsToState(propsList) { + var innermostProps = propsList[propsList.length - 1]; + if (innermostProps) { + return innermostProps.location; + } } -var WindowRedirect = createSideEffect(function handleChange(propsList) { - var location = getRedirectFromPropsList(propsList); - - if (typeof document !== 'undefined') { - if (location) - window.location = location; - } else { - _serverRedirect = location || null; - } - }, { - displayName: 'WindowRedirect', - - propTypes: { - location: React.PropTypes.string.isRequired - }, - - statics: { - peek: function () { - return _serverRedirect; - }, - - rewind: function () { - var location = _serverRedirect; - this.dispose(); - return location; - } - } - }); - -module.exports = WindowRedirect; \ No newline at end of file +function handleStateChangeOnClient(location) { + if (location) { window.location = location }; +}; + +function ReactRedirect() {} +ReactRedirect.prototype = Object.create(React.Component.prototype); +ReactRedirect.displayName = 'ReactRedirect'; +ReactRedirect.propTypes = { location: PropTypes.string.isRequired }; + +ReactRedirect.prototype.render = function() { + if (this.props.children) { + return React.Children.only(this.props.children); + } else { + return null; + } +}; + +module.exports = withSideEffect( + reducePropsToState, + handleStateChangeOnClient +)(ReactRedirect); diff --git a/package.json b/package.json index a42a03e..89952f4 100644 --- a/package.json +++ b/package.json @@ -28,13 +28,16 @@ }, "homepage": "https://github.com/Driftt/react-redirect", "devDependencies": { + "create-react-class": "^15.5.0", "expect.js": "^0.3.1", "global": "^4.3.0", "jshint": "^2.5.6", - "mocha": "^2.0.1", - "react": "^0.13.0-beta.1" + "mocha": "^3.2.0", + "react": "^15.5.0", + "react-dom": "^15.5.0" }, "dependencies": { - "react-side-effect": "~0.3.0" + "prop-types": "^15.5.0", + "react-side-effect": "~1.1.0" } } diff --git a/test/browser.js b/test/browser.js index e7511a3..82e4997 100644 --- a/test/browser.js +++ b/test/browser.js @@ -1,32 +1,32 @@ /*jshint newcap: false */ -/*global global, describe, it, afterEach, before, after */ +/*global global, describe, it, afterEach, before, after, beforeEach */ 'use strict'; var expect = require('expect.js'), - React = require('react'), - ReactRedirect = require('../'); + React = require('react'), + ReactDOM = require('react-dom'), + createReactClass = require('create-react-class'), + ReactRedirect = require('../'); -describe('DocumentTitle (in a browser)', function () { - afterEach(function () { - React.unmountComponentAtNode(global.document.body); - delete global.document.title; - }); - before(function () { - // Prepare the globals React expects in a browser +describe('ReactRedirect (in a browser)', function () { + var container; + beforeEach(function () { + global.document = require('global/document') global.window = require('global/window'); - global.document = require('global/document'); - global.window.document = document; - global.window.location = {}; - global.window.navigator = {userAgent: 'Chrome'}; - console.debug = console.log; + global.window.location = {} + container = document.createElement('div'); }); - after(function () { + afterEach(function () { + ReactDOM.unmountComponentAtNode(container); delete global.window; delete global.document; - delete console.debug; }); - it('changes the document title on mount', function (done) { + before(function() { + ReactRedirect.canUseDOM = true; + }) + + it('changes the location on mount', function (done) { var location = 'www.driftt.com'; - var Component = React.createClass({ + var Component = createReactClass({ componentDidMount: function () { expect(global.window.location).to.equal(location); done(); @@ -35,33 +35,36 @@ describe('DocumentTitle (in a browser)', function () { return React.createElement(ReactRedirect, {location: location}); } }); - React.render(React.createElement(Component), global.document.body); + ReactDOM.render(React.createElement(Component), container); }); + it('supports nesting', function (done) { - var component2Called = false; + var called = false; var location = 'www.driftt.com'; - var Component1 = React.createClass({ + var Component1 = createReactClass({ componentDidMount: function () { setTimeout(function () { - expect(component2Called).to.be(true); - expect(global.window.location).to.equal(location); + expect(called).to.be(true); + expect(global.window.location).to.equal('location'); done(); }); }, render: function () { + console.log('render1') return React.createElement(ReactRedirect, {location: location}); } }); - var Component2 = React.createClass({ + var Component2 = createReactClass({ componentDidMount: function () { - component2Called = true; + called = true; }, render: function () { + console.log('render2') return React.createElement(ReactRedirect, {location: 'hell nah'}, React.DOM.div(null, React.createElement(Component1)) ); } }); - React.render(React.createElement(Component2), global.document.body); + ReactDOM.render(React.createElement(Component2), container); }); -}); \ No newline at end of file +}); diff --git a/test/common.js b/test/common.js index fffd853..5752e23 100644 --- a/test/common.js +++ b/test/common.js @@ -2,26 +2,31 @@ /*global describe, it */ 'use strict'; var expect = require('expect.js'), - React = require('react'), - ReactRedirect = require('../'); + React = require('react'), + ReactDOMServer = require('react-dom/server'), + createReactClass = require('create-react-class'), + ReactRedirect = require('../'); describe('ReactRedirect', function () { + before(function() { + ReactRedirect.canUseDOM = false; + }) it('has a displayName', function () { var el = React.createElement(ReactRedirect, {location: 'irrelevant'}); expect(el.type.displayName).to.be.a('string'); expect(el.type.displayName).not.to.be.empty(); }); it('hides itself from the DOM', function () { - var Component = React.createClass({ + var Component = createReactClass({ render: function () { return React.createElement(ReactRedirect, {location: 'irrelevant'}, React.createElement('div', null, 'hello')); } }); - var markup = React.renderToStaticMarkup(React.createElement(Component)); + var markup = ReactDOMServer.renderToStaticMarkup(React.createElement(Component)); expect(markup).to.equal('
hello
'); }); it('throws an error if it has multiple children', function (done) { - var Component = React.createClass({ + var Component = createReactClass({ render: function () { return React.createElement(ReactRedirect, {location: 'irrelevant'}, React.createElement('div', null, 'hello'), @@ -30,14 +35,14 @@ describe('ReactRedirect', function () { } }); expect(function () { - React.renderToStaticMarkup(React.createElement(Component)); + ReactDOMServer.renderToStaticMarkup(React.createElement(Component)); }).to.throwException(function (e) { - expect(e.message).to.match(/^Invariant Violation:/); + expect(e.message).to.match(/^React.Children.only expected to receive a single React element child/); done(); }); }); it('works with complex children', function () { - var Component1 = React.createClass({ + var Component1 = createReactClass({ render: function() { return React.createElement('p', null, React.createElement('span', null, 'c'), @@ -45,7 +50,7 @@ describe('ReactRedirect', function () { ); } }); - var Component2 = React.createClass({ + var Component2 = createReactClass({ render: function () { return React.createElement(ReactRedirect, {location: 'irrelevant'}, React.createElement('div', null, @@ -56,7 +61,7 @@ describe('ReactRedirect', function () { ); } }); - var markup = React.renderToStaticMarkup(React.createElement(Component2)); + var markup = ReactDOMServer.renderToStaticMarkup(React.createElement(Component2)); expect(markup).to.equal( '
' + '
a
' + @@ -74,18 +79,18 @@ describe('ReactRedirect', function () { describe('ReactRedirect.rewind', function () { it('clears the mounted instances', function () { - React.renderToStaticMarkup( + ReactDOMServer.renderToStaticMarkup( React.createElement(ReactRedirect, {location: 'a'}, React.createElement(ReactRedirect, {location: 'b'}, React.createElement(ReactRedirect, {location: 'c'})) ) ); expect(ReactRedirect.peek()).to.equal('c'); ReactRedirect.rewind(); - expect(ReactRedirect.peek()).to.equal(null); + expect(ReactRedirect.peek()).to.equal(undefined); }); it('returns the latest document title', function () { var location = 'www.driftt.com'; - React.renderToStaticMarkup( + ReactDOMServer.renderToStaticMarkup( React.createElement(ReactRedirect, {location: 'a'}, React.createElement(ReactRedirect, {location: 'b'}, React.createElement(ReactRedirect, {location: location})) ) @@ -93,12 +98,12 @@ describe('ReactRedirect.rewind', function () { expect(ReactRedirect.rewind()).to.equal(location); }); it('returns nothing if no mounted instances exist', function () { - React.renderToStaticMarkup( + ReactDOMServer.renderToStaticMarkup( React.createElement(ReactRedirect, {location: 'a'}, React.createElement(ReactRedirect, {location: 'b'}, React.createElement(ReactRedirect, {location: 'c'})) ) ); ReactRedirect.rewind(); - expect(ReactRedirect.peek()).to.equal(null); + expect(ReactRedirect.peek()).to.equal(undefined); }); -}); \ No newline at end of file +}); From c6cdbae6fbb4c88d9e967ccc2a6b4e53fdf6b752 Mon Sep 17 00:00:00 2001 From: Ivan Vlasenko Date: Thu, 27 Apr 2017 18:42:43 +0300 Subject: [PATCH 2/4] Publish package --- README.md | 4 +++- package.json | 12 ++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index c160f05..93ce607 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ -React Redirect +React Redirect Side Effect ==================== +Fork of react-redirect working with last React version. + Provides a declarative way to specify `window.location` in a single-page app. This component can be used on server side as well. diff --git a/package.json b/package.json index 89952f4..fdeacd8 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,10 @@ { - "name": "react-redirect", - "version": "1.0.0", + "name": "react-redirect-side-effect", + "version": "2.0.0", "description": "A declarative, nested, stateful window.location for React", "main": "index.js", "peerDependencies": { - "react": ">=0.11.0 || >=0.13.0-beta.1" + "react": ">=15.5.0" }, "scripts": { "test": "mocha", @@ -12,7 +12,7 @@ }, "repository": { "type": "git", - "url": "https://github.com/Driftt/react-redirect.git" + "url": "https://github.com/avanes/react-redirect-side-effect.git" }, "keywords": [ "react", @@ -24,9 +24,9 @@ "author": "Sitian Liu (http://github.com/goldensunliu)", "license": "MIT", "bugs": { - "url": "https://github.com/Driftt/react-redirect/issues" + "url": "https://github.com/avanes/react-redirect-side-effect/issues" }, - "homepage": "https://github.com/Driftt/react-redirect", + "homepage": "https://github.com/avanes/react-redirect-side-effect", "devDependencies": { "create-react-class": "^15.5.0", "expect.js": "^0.3.1", From 4c86311ba937112203adf6571feac1cfc58c8a2b Mon Sep 17 00:00:00 2001 From: Ivan Vlasenko Date: Thu, 27 Apr 2017 18:45:06 +0300 Subject: [PATCH 3/4] Update react peer version --- README.md | 2 +- package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 93ce607..7fc1e5f 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ React Redirect Side Effect ==================== -Fork of react-redirect working with last React version. +Fork of react-redirect working with last React version (>=15.4.0). Provides a declarative way to specify `window.location` in a single-page app. This component can be used on server side as well. diff --git a/package.json b/package.json index fdeacd8..dbb0470 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,10 @@ { "name": "react-redirect-side-effect", - "version": "2.0.0", + "version": "2.0.1", "description": "A declarative, nested, stateful window.location for React", "main": "index.js", "peerDependencies": { - "react": ">=15.5.0" + "react": ">=15.4.0" }, "scripts": { "test": "mocha", From 197bdd8f108abbfb7a192db2f3c39eac003818ea Mon Sep 17 00:00:00 2001 From: Ivan Vlasenko Date: Thu, 27 Apr 2017 18:48:07 +0300 Subject: [PATCH 4/4] Yarn --- package.json | 2 +- yarn.lock | 453 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 454 insertions(+), 1 deletion(-) create mode 100644 yarn.lock diff --git a/package.json b/package.json index dbb0470..3efb1aa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-redirect-side-effect", - "version": "2.0.1", + "version": "2.0.2", "description": "A declarative, nested, stateful window.location for React", "main": "index.js", "peerDependencies": { diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..bb5ad80 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,453 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +asap@~2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f" + +balanced-match@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +brace-expansion@^1.0.0: + version "1.1.7" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" + dependencies: + balanced-match "^0.4.1" + concat-map "0.0.1" + +browser-stdout@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + +cli@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cli/-/cli-1.0.1.tgz#22817534f24bfa4950c34d532d48ecbc621b8c14" + dependencies: + exit "0.1.2" + glob "^7.1.1" + +commander@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +console-browserify@1.1.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + dependencies: + date-now "^0.1.4" + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +create-react-class@^15.5.0: + version "15.5.2" + resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.5.2.tgz#6a8758348df660b88326a0e764d569f274aad681" + dependencies: + fbjs "^0.8.9" + object-assign "^4.1.1" + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + +debug@2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" + dependencies: + ms "0.7.2" + +diff@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + +dom-serializer@0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + dependencies: + domelementtype "~1.1.1" + entities "~1.1.1" + +dom-walk@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" + +domelementtype@1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" + +domelementtype@~1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" + +domhandler@2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" + dependencies: + domelementtype "1" + +domutils@1.5: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + dependencies: + dom-serializer "0" + domelementtype "1" + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + +entities@1.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" + +entities@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + +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" + +exenv@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" + +exit@0.1.2, exit@0.1.x: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + +expect.js@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/expect.js/-/expect.js-0.3.1.tgz#b0a59a0d2eff5437544ebf0ceaa6015841d09b5b" + +fbjs@^0.8.9: + version "0.8.12" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.12.tgz#10b5d92f76d45575fd63a217d4ea02bea2f8ed04" + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.9" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +glob@7.1.1, glob@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" + dependencies: + min-document "^2.19.0" + process "~0.5.1" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +growl@1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +htmlparser2@3.8.x: + version "3.8.3" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068" + dependencies: + domelementtype "1" + domhandler "2.3" + domutils "1.5" + entities "1.0" + readable-stream "1.1" + +iconv-lite@~0.4.13: + version "0.4.16" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.16.tgz#65de3beeb39e2960d67f049f1634ffcbcde9014b" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@~2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + +js-tokens@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" + +jshint@^2.5.6: + version "2.9.4" + resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.9.4.tgz#5e3ba97848d5290273db514aee47fe24cf592934" + dependencies: + cli "~1.0.0" + console-browserify "1.1.x" + exit "0.1.x" + htmlparser2 "3.8.x" + lodash "3.7.x" + minimatch "~3.0.2" + shelljs "0.3.x" + strip-json-comments "1.0.x" + +json3@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basecreate@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash.create@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" + dependencies: + lodash._baseassign "^3.0.0" + lodash._basecreate "^3.0.0" + lodash._isiterateecall "^3.0.0" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.keys@^3.0.0, lodash.keys@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash@3.7.x: + version "3.7.0" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.7.0.tgz#3678bd8ab995057c07ade836ed2ef087da811d45" + +loose-envify@^1.0.0, loose-envify@^1.1.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + dependencies: + dom-walk "^0.1.0" + +minimatch@^3.0.2, minimatch@~3.0.2: + 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: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +mkdirp@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +mocha@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.3.0.tgz#d29b7428d3f52c82e2e65df1ecb7064e1aabbfb5" + dependencies: + browser-stdout "1.3.0" + commander "2.9.0" + debug "2.6.0" + diff "3.2.0" + escape-string-regexp "1.0.5" + glob "7.1.1" + growl "1.9.2" + json3 "3.3.2" + lodash.create "3.1.1" + mkdirp "0.5.1" + supports-color "3.1.2" + +ms@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + +node-fetch@^1.0.1: + version "1.6.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +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" + +process@~0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" + +promise@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf" + dependencies: + asap "~2.0.3" + +prop-types@^15.5.0, 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" + +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-side-effect@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-1.1.0.tgz#57209f7ebc940d55e0fda82fe51422654175d609" + dependencies: + exenv "^1.2.1" + shallowequal "^0.2.2" + +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" + +readable-stream@1.1: + version "1.1.13" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + +shallowequal@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-0.2.2.tgz#1e32fd5bcab6ad688a4812cb0cc04efc75c7014e" + dependencies: + lodash.keys "^3.1.2" + +shelljs@0.3.x: + version "0.3.0" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +strip-json-comments@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" + +supports-color@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + dependencies: + has-flag "^1.0.0" + +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" + +whatwg-fetch@>=0.10.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"