diff --git a/docs/react-style-guide.md b/docs/react-style-guide.md index 280641a66..745b45d3f 100644 --- a/docs/react-style-guide.md +++ b/docs/react-style-guide.md @@ -6,21 +6,21 @@ ### Table of Contents -* [Separate folder per UI component](#separate-folder-per-ui-component) -* [Prefer using functional components](#prefer-using-functional-components) -* [Use CSS Modules](#use-css-modules) -* [Use higher-order components](#use-higher-order-components) +- [Separate folder per UI component](#separate-folder-per-ui-component) +- [Prefer using functional components](#prefer-using-functional-components) +- [Use CSS Modules](#use-css-modules) +- [Use higher-order components](#use-higher-order-components) ### Separate folder per UI component -* Place each major UI component along with its resources in a separate folder\ +- Place each major UI component along with its resources in a separate folder\ This will make it easier to find related resources for any particular UI element (CSS, images, unit tests, localization files etc.). Removing such components during refactorings should also be easy. -* Avoid having CSS, images and other resource files shared between multiple +- Avoid having CSS, images and other resource files shared between multiple components.\ This will make your code more maintainable, easy to refactor. -* Add `package.json` file into each component's folder.\ +- Add `package.json` file into each component's folder.\ This will allow to easily reference such components from other places in your code.\ Use `import Nav from '../Navigation'` instead of `import Nav from '../Navigation/Navigation.js'` @@ -46,7 +46,7 @@ For more information google for ### Prefer using functional components -* Prefer using stateless functional components whenever possible.\ +- Prefer using stateless functional components whenever possible.\ Components that don't use state are better to be written as simple pure functions. ```jsx @@ -69,16 +69,16 @@ Navigation.propTypes = { items: PropTypes.array.isRequired }; ### Use CSS Modules -* Use CSS Modules\ +- Use CSS Modules\ This will allow using short CSS class names and at the same time avoid conflicts. -* Keep CSS simple and declarative. Avoid loops, mixins etc. -* Feel free to use variables in CSS via +- Keep CSS simple and declarative. Avoid loops, mixins etc. +- Feel free to use variables in CSS via [precss](https://github.com/jonathantneal/precss) plugin for [PostCSS](https://github.com/postcss/postcss) -* Prefer CSS class selectors instead of element and `id` selectors (see +- Prefer CSS class selectors instead of element and `id` selectors (see [BEM](https://bem.info/)) -* Avoid nested CSS selectors (see [BEM](https://bem.info/)) -* When in doubt, use `.root { }` class name for the root elements of your +- Avoid nested CSS selectors (see [BEM](https://bem.info/)) +- When in doubt, use `.root { }` class name for the root elements of your components ```scss @@ -127,7 +127,7 @@ Navigation.propTypes = { items: PropTypes.array.isRequired }; // Navigation.js import React from 'react'; import PropTypes from 'prop-types'; -import withStyles from 'isomorphic-style-loader/lib/withStyles'; +import withStyles from 'isomorphic-style-loader/withStyles'; import s from './Navigation.scss'; function Navigation() { @@ -156,7 +156,7 @@ export default withStyles(Navigation, s); ### Use higher-order components -* Use higher-order components (HOC) to extend existing React components.\ +- Use higher-order components (HOC) to extend existing React components.\ Here is an example: ```js diff --git a/package.json b/package.json index 77ec4a440..e857691d5 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "express-jwt": "^5.3.1", "graphql": "^0.13.2", "history": "^4.7.2", - "isomorphic-style-loader": "^4.0.0", + "isomorphic-style-loader": "5.0.1", "jsonwebtoken": "^8.3.0", "node-fetch": "^2.1.2", "normalize.css": "^8.0.0", @@ -31,8 +31,8 @@ "pretty-error": "^2.1.1", "prop-types": "^15.6.1", "query-string": "^6.1.0", - "react": "^16.4.1", - "react-dom": "^16.4.1", + "react": "^16.8.2", + "react-dom": "^16.8.2", "sequelize": "^4.37.10", "serialize-javascript": "^1.5.0", "source-map-support": "^0.5.6", diff --git a/src/client.js b/src/client.js index e35a71b7b..ac14813a5 100644 --- a/src/client.js +++ b/src/client.js @@ -19,18 +19,19 @@ import history from './history'; import { updateMeta } from './DOMUtils'; import router from './router'; +// Enables critical path CSS rendering +// https://github.com/kriasoft/isomorphic-style-loader +const insertCss = (...styles) => { + // eslint-disable-next-line no-underscore-dangle + const removeCss = styles.map(x => x._insertCss()); + return () => { + removeCss.forEach(f => f()); + }; +}; + // Global (context) variables that can be easily accessed from any React component // https://facebook.github.io/react/docs/context.html const context = { - // Enables critical path CSS rendering - // https://github.com/kriasoft/isomorphic-style-loader - insertCss: (...styles) => { - // eslint-disable-next-line no-underscore-dangle - const removeCss = styles.map(x => x._insertCss()); - return () => { - removeCss.forEach(f => f()); - }; - }, // Universal HTTP client fetch: createFetch(fetch, { baseUrl: window.App.apiUrl, @@ -78,7 +79,9 @@ async function onLocationChange(location, action) { const renderReactApp = isInitialRender ? ReactDOM.hydrate : ReactDOM.render; appInstance = renderReactApp( - {route.component}, + + {route.component} + , container, () => { if (isInitialRender) { diff --git a/src/components/App.js b/src/components/App.js index f20711f26..651438ed7 100644 --- a/src/components/App.js +++ b/src/components/App.js @@ -10,10 +10,10 @@ import React from 'react'; import PropTypes from 'prop-types'; +import StyleContext from 'isomorphic-style-loader/StyleContext'; +import ApplicationContext from './ApplicationContext'; + const ContextType = { - // Enables critical path CSS rendering - // https://github.com/kriasoft/isomorphic-style-loader - insertCss: PropTypes.func.isRequired, // Universal HTTP client fetch: PropTypes.func.isRequired, pathname: PropTypes.string.isRequired, @@ -44,20 +44,25 @@ const ContextType = { */ class App extends React.PureComponent { static propTypes = { + // Enables critical path CSS rendering + // https://github.com/kriasoft/isomorphic-style-loader + insertCss: PropTypes.func.isRequired, context: PropTypes.shape(ContextType).isRequired, children: PropTypes.element.isRequired, }; - static childContextTypes = ContextType; - - getChildContext() { - return this.props.context; - } - render() { + const { context, insertCss } = this.props; + // NOTE: If you need to add or modify header, footer etc. of the app, // please do that inside the Layout component. - return React.Children.only(this.props.children); + return ( + + + {React.Children.only(this.props.children)} + + + ); } } diff --git a/src/components/ApplicationContext.js b/src/components/ApplicationContext.js new file mode 100644 index 000000000..beb4844f5 --- /dev/null +++ b/src/components/ApplicationContext.js @@ -0,0 +1,9 @@ +import React from 'react'; + +const ApplicationContext = React.createContext({ + fetch: () => { + throw new Error('Fetch method not initialized.'); + }, +}); + +export default ApplicationContext; diff --git a/src/components/Feedback/Feedback.js b/src/components/Feedback/Feedback.js index 6c9712493..c22042aac 100644 --- a/src/components/Feedback/Feedback.js +++ b/src/components/Feedback/Feedback.js @@ -8,7 +8,7 @@ */ import React from 'react'; -import withStyles from 'isomorphic-style-loader/lib/withStyles'; +import withStyles from 'isomorphic-style-loader/withStyles'; import s from './Feedback.css'; class Feedback extends React.Component { diff --git a/src/components/Footer/Footer.js b/src/components/Footer/Footer.js index 5b6cc5de9..b861410c7 100644 --- a/src/components/Footer/Footer.js +++ b/src/components/Footer/Footer.js @@ -8,7 +8,7 @@ */ import React from 'react'; -import withStyles from 'isomorphic-style-loader/lib/withStyles'; +import withStyles from 'isomorphic-style-loader/withStyles'; import s from './Footer.css'; import Link from '../Link'; diff --git a/src/components/Header/Header.js b/src/components/Header/Header.js index 13a48096d..cfcb83745 100644 --- a/src/components/Header/Header.js +++ b/src/components/Header/Header.js @@ -8,7 +8,7 @@ */ import React from 'react'; -import withStyles from 'isomorphic-style-loader/lib/withStyles'; +import withStyles from 'isomorphic-style-loader/withStyles'; import s from './Header.css'; import Link from '../Link'; import Navigation from '../Navigation'; diff --git a/src/components/Layout/Layout.js b/src/components/Layout/Layout.js index 6c88b352e..05b8d957e 100644 --- a/src/components/Layout/Layout.js +++ b/src/components/Layout/Layout.js @@ -9,7 +9,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -import withStyles from 'isomorphic-style-loader/lib/withStyles'; +import withStyles from 'isomorphic-style-loader/withStyles'; // external-global styles must be imported in your JS. import normalizeCss from 'normalize.css'; diff --git a/src/components/Navigation/Navigation.js b/src/components/Navigation/Navigation.js index 56a1a7825..97fd0f7d3 100644 --- a/src/components/Navigation/Navigation.js +++ b/src/components/Navigation/Navigation.js @@ -9,7 +9,7 @@ import React from 'react'; import cx from 'classnames'; -import withStyles from 'isomorphic-style-loader/lib/withStyles'; +import withStyles from 'isomorphic-style-loader/withStyles'; import s from './Navigation.css'; import Link from '../Link'; diff --git a/src/components/Page/Page.js b/src/components/Page/Page.js index 291cfbffd..55ab20c9a 100644 --- a/src/components/Page/Page.js +++ b/src/components/Page/Page.js @@ -9,7 +9,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -import withStyles from 'isomorphic-style-loader/lib/withStyles'; +import withStyles from 'isomorphic-style-loader/withStyles'; import s from './Page.css'; class Page extends React.Component { diff --git a/src/routes/admin/Admin.js b/src/routes/admin/Admin.js index c29775429..132883833 100644 --- a/src/routes/admin/Admin.js +++ b/src/routes/admin/Admin.js @@ -9,7 +9,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -import withStyles from 'isomorphic-style-loader/lib/withStyles'; +import withStyles from 'isomorphic-style-loader/withStyles'; import s from './Admin.css'; class Admin extends React.Component { diff --git a/src/routes/contact/Contact.js b/src/routes/contact/Contact.js index 5c8f398ab..923749a54 100644 --- a/src/routes/contact/Contact.js +++ b/src/routes/contact/Contact.js @@ -9,7 +9,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -import withStyles from 'isomorphic-style-loader/lib/withStyles'; +import withStyles from 'isomorphic-style-loader/withStyles'; import s from './Contact.css'; class Contact extends React.Component { diff --git a/src/routes/error/ErrorPage.js b/src/routes/error/ErrorPage.js index aff9d0794..59bca0f41 100644 --- a/src/routes/error/ErrorPage.js +++ b/src/routes/error/ErrorPage.js @@ -9,7 +9,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -import withStyles from 'isomorphic-style-loader/lib/withStyles'; +import withStyles from 'isomorphic-style-loader/withStyles'; import s from './ErrorPage.css'; class ErrorPage extends React.Component { diff --git a/src/routes/home/Home.js b/src/routes/home/Home.js index c4e4b8f60..7c89ffaa6 100644 --- a/src/routes/home/Home.js +++ b/src/routes/home/Home.js @@ -9,7 +9,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -import withStyles from 'isomorphic-style-loader/lib/withStyles'; +import withStyles from 'isomorphic-style-loader/withStyles'; import s from './Home.css'; class Home extends React.Component { diff --git a/src/routes/login/Login.js b/src/routes/login/Login.js index 852919ce4..5991f44ae 100644 --- a/src/routes/login/Login.js +++ b/src/routes/login/Login.js @@ -9,7 +9,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -import withStyles from 'isomorphic-style-loader/lib/withStyles'; +import withStyles from 'isomorphic-style-loader/withStyles'; import s from './Login.css'; class Login extends React.Component { diff --git a/src/routes/not-found/NotFound.js b/src/routes/not-found/NotFound.js index 437b2ba00..e6bbf2ec7 100644 --- a/src/routes/not-found/NotFound.js +++ b/src/routes/not-found/NotFound.js @@ -9,7 +9,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -import withStyles from 'isomorphic-style-loader/lib/withStyles'; +import withStyles from 'isomorphic-style-loader/withStyles'; import s from './NotFound.css'; class NotFound extends React.Component { diff --git a/src/routes/register/Register.js b/src/routes/register/Register.js index 3a5a61809..0a7fc257a 100644 --- a/src/routes/register/Register.js +++ b/src/routes/register/Register.js @@ -9,7 +9,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -import withStyles from 'isomorphic-style-loader/lib/withStyles'; +import withStyles from 'isomorphic-style-loader/withStyles'; import s from './Register.css'; class Register extends React.Component { diff --git a/src/server.js b/src/server.js index 2bad532b5..f8143028b 100644 --- a/src/server.js +++ b/src/server.js @@ -143,7 +143,6 @@ app.get('*', async (req, res, next) => { // Global (context) variables that can be easily accessed from any React component // https://facebook.github.io/react/docs/context.html const context = { - insertCss, fetch, // The twins below are wild, be careful! pathname: req.path, @@ -159,7 +158,9 @@ app.get('*', async (req, res, next) => { const data = { ...route }; data.children = ReactDOM.renderToString( - {route.component}, + + {route.component} + , ); data.styles = [{ id: 'css', cssText: [...css].join('') }]; diff --git a/yarn.lock b/yarn.lock index 4b04643bd..0205fa31a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1251,6 +1251,7 @@ arrify@^1.0.0, arrify@^1.0.1: asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= asn1.js@^4.0.0: version "4.10.1" @@ -1487,7 +1488,7 @@ babel-register@^6.26.0: mkdirp "^0.5.1" source-map-support "^0.4.15" -babel-runtime@^6.22.0, babel-runtime@^6.25.0, babel-runtime@^6.26.0: +babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" dependencies: @@ -1607,6 +1608,11 @@ big.js@^3.1.3: version "3.2.0" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + binary-extensions@^1.0.0: version "1.11.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" @@ -2374,6 +2380,7 @@ copy-descriptor@^0.1.0: core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= core-js@^2.4.0, core-js@^2.5.0, core-js@^2.5.7: version "2.5.7" @@ -2952,6 +2959,7 @@ encodeurl@~1.0.2: encoding@^0.1.11: version "0.1.12" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= dependencies: iconv-lite "~0.4.13" @@ -3569,6 +3577,7 @@ fb-watchman@^2.0.0: fbjs@^0.8.16: version "0.8.17" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" + integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= dependencies: core-js "^1.0.0" isomorphic-fetch "^2.1.1" @@ -4133,9 +4142,12 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^2.2.2: - version "2.5.5" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" +hoist-non-react-statics@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz#b09178f0122184fb95acf525daaecb4d8f45958b" + integrity sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA== + dependencies: + react-is "^16.7.0" home-or-tmp@^2.0.0: version "2.0.0" @@ -4257,12 +4269,19 @@ iconv-lite@0.4.19: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" -iconv-lite@0.4.23, iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13: +iconv-lite@0.4.23, iconv-lite@^0.4.17, iconv-lite@^0.4.4: version "0.4.23" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@~0.4.13: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + icss-replace-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" @@ -4670,6 +4689,7 @@ is-root@1.0.0: is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= is-string@^1.0.4: version "1.0.4" @@ -4746,18 +4766,19 @@ isobject@^3.0.0, isobject@^3.0.1: isomorphic-fetch@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= dependencies: node-fetch "^1.0.1" whatwg-fetch ">=0.10.0" -isomorphic-style-loader@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/isomorphic-style-loader/-/isomorphic-style-loader-4.0.0.tgz#0d8faa12885e2830918c54815042c0e3b55dc38d" +isomorphic-style-loader@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-style-loader/-/isomorphic-style-loader-5.0.1.tgz#904843486ade98f647c9d2421dcf5b9cd4613b37" + integrity sha512-USUsfZUaDyEwK/aJAO9tNsH4hcW6wcSFZYCn2LZsGYV68VOhCC0ocN8h+rBLvqwmLN8J9t4XbkxBGeHGdzNa6w== dependencies: - babel-runtime "^6.25.0" - hoist-non-react-statics "^2.2.2" - loader-utils "^1.1.0" - prop-types "^15.5.10" + hoist-non-react-statics "^3.0.0" + loader-utils "^1.2.3" + react "^16.3.0" isstream@~0.1.2: version "0.1.2" @@ -5128,6 +5149,12 @@ js-levenshtein@^1.1.3: js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.10.0, js-yaml@^3.4.3, js-yaml@^3.7.0, js-yaml@^3.9.0, js-yaml@^3.9.1: version "3.12.0" @@ -5222,6 +5249,13 @@ json5@^0.5.0, json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + jsonfile@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" @@ -5461,6 +5495,15 @@ loader-utils@1.1.0, loader-utils@^1.0.2, loader-utils@^1.1.0: emojis-list "^2.0.0" json5 "^0.5.0" +loader-utils@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + localtunnel@1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-1.9.0.tgz#8ffecdcf8c8a14f62df1056cf9d54acbb0bb9a8f" @@ -5591,7 +5634,14 @@ longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loose-envify@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" dependencies: @@ -6008,6 +6058,7 @@ next-tick@1: node-fetch@^1.0.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== dependencies: encoding "^0.1.11" is-stream "^1.0.1" @@ -6218,6 +6269,7 @@ oauth@0.9.x: object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object-component@0.0.3: version "0.0.3" @@ -7226,10 +7278,20 @@ promise-inflight@^1.0.1: promise@^7.1.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== dependencies: asap "~2.0.3" -prop-types@^15.5.10, prop-types@^15.6.0, prop-types@^15.6.1: +prop-types@^15.6.0, prop-types@^15.6.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +prop-types@^15.6.1: version "15.6.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" dependencies: @@ -7439,14 +7501,15 @@ react-dev-utils@^5.0.1: strip-ansi "3.0.1" text-table "0.2.0" -react-dom@^16.4.1: - version "16.4.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.4.1.tgz#7f8b0223b3a5fbe205116c56deb85de32685dad6" +react-dom@^16.8.2: + version "16.8.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.2.tgz#7c8a69545dd554d45d66442230ba04a6a0a3c3d3" + integrity sha512-cPGfgFfwi+VCZjk73buu14pYkYBR1b/SRMSYqkLDdhSEHnSwcuYTPu6/Bh6ZphJFIk80XLvbSe2azfcRzNF+Xg== dependencies: - fbjs "^0.8.16" loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.0" + prop-types "^15.6.2" + scheduler "^0.13.2" react-error-overlay@^4.0.0: version "4.0.0" @@ -7456,6 +7519,11 @@ react-is@^16.4.1: version "16.4.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.1.tgz#d624c4650d2c65dbd52c72622bbf389435d9776e" +react-is@^16.7.0, react-is@^16.8.1: + version "16.8.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.2.tgz#09891d324cad1cb0c1f2d91f70a71a4bee34df0f" + integrity sha512-D+NxhSR2HUCjYky1q1DwpNUD44cDpUXzSmmFyC3ug1bClcU/iDNy0YNn1iwme28fn+NFhpA13IndOd42CrFb+Q== + react-test-renderer@^16.4.1: version "16.4.1" resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.4.1.tgz#f2fb30c2c7b517db6e5b10ed20bb6b0a7ccd8d70" @@ -7465,14 +7533,15 @@ react-test-renderer@^16.4.1: prop-types "^15.6.0" react-is "^16.4.1" -react@^16.4.1: - version "16.4.1" - resolved "https://registry.yarnpkg.com/react/-/react-16.4.1.tgz#de51ba5764b5dbcd1f9079037b862bd26b82fe32" +react@^16.3.0, react@^16.8.2: + version "16.8.2" + resolved "https://registry.yarnpkg.com/react/-/react-16.8.2.tgz#83064596feaa98d9c2857c4deae1848b542c9c0c" + integrity sha512-aB2ctx9uQ9vo09HVknqv3DGRpI7OIGJhCx3Bt0QqoRluEjHSaObJl+nG12GDdYH6sTgE7YiPJ6ZUyMx9kICdXw== dependencies: - fbjs "^0.8.16" loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.0" + prop-types "^15.6.2" + scheduler "^0.13.2" read-cache@^1.0.0: version "1.0.0" @@ -7977,6 +8046,7 @@ safe-regex@^1.1.0: "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sane@^2.0.0: version "2.5.2" @@ -7997,6 +8067,14 @@ sax@^1.2.4, sax@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" +scheduler@^0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.2.tgz#969eaee2764a51d2e97b20a60963b2546beff8fa" + integrity sha512-qK5P8tHS7vdEMCW5IPyt8v9MJOHqTrOUgPXib7tqm9vh834ibBX5BNhwkplX/0iOzHW5sXyluehYfS9yrkz9+w== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + schema-utils@^0.4.0, schema-utils@^0.4.3, schema-utils@^0.4.4, schema-utils@^0.4.5: version "0.4.5" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" @@ -8110,6 +8188,7 @@ set-value@^2.0.0: setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= setprototypeof@1.0.2: version "1.0.2" @@ -8906,8 +8985,9 @@ ua-parser-js@0.7.17: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" ua-parser-js@^0.7.18: - version "0.7.18" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.18.tgz#a7bfd92f56edfb117083b69e31d2aa8882d4b1ed" + version "0.7.19" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.19.tgz#94151be4c0a7fb1d001af7022fdaca4642659e4b" + integrity sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ== uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.5" @@ -9389,7 +9469,12 @@ whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: dependencies: iconv-lite "0.4.19" -whatwg-fetch@>=0.10.0, whatwg-fetch@^2.0.4: +whatwg-fetch@>=0.10.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" + integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== + +whatwg-fetch@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f"