superset-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ccwilli...@apache.org
Subject [incubator-superset] branch master updated: Enable hot module replacement for React via react-hot-loader (#5841)
Date Mon, 10 Sep 2018 17:15:35 GMT
This is an automated email from the ASF dual-hosted git repository.

ccwilliams pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git


The following commit(s) were added to refs/heads/master by this push:
     new 6d57372  Enable hot module replacement for React via react-hot-loader (#5841)
6d57372 is described below

commit 6d573724aa51e3e9749d412a5ce6848002858740
Author: Krist Wongsuphasawat <krist.wongz@gmail.com>
AuthorDate: Mon Sep 10 10:15:32 2018 -0700

    Enable hot module replacement for React via react-hot-loader (#5841)
    
    * Install react-hot-loader
    
    * enable react-hot-reload for Explore, Dashboard, Profile and Sqllab
    
    * enable hmr for welcome page
    
    * enable hmr for welcome page
    
    * enable react hot module replacement for addSlice
    
    * fix lint
    
    * fix Welcome test
    
    * remove eslint comment
---
 superset/assets/.babelrc                           |  2 +-
 superset/assets/package.json                       |  1 +
 .../welcome/{App_spec.jsx => Welcome_spec.jsx}     |  8 +-
 superset/assets/src/SqlLab/{index.jsx => App.jsx}  |  9 ++-
 superset/assets/src/SqlLab/index.jsx               | 46 ++---------
 .../assets/src/addSlice/{index.jsx => App.jsx}     |  9 ++-
 superset/assets/src/addSlice/index.jsx             | 12 +--
 .../assets/src/dashboard/{index.jsx => App.jsx}    | 11 +--
 superset/assets/src/dashboard/index.jsx            | 34 +--------
 superset/assets/src/explore/{index.jsx => App.jsx} |  9 ++-
 superset/assets/src/explore/index.jsx              | 89 +---------------------
 superset/assets/src/profile/{index.jsx => App.jsx} | 12 ++-
 superset/assets/src/profile/index.jsx              | 17 +----
 .../src/visualizations/PairedTTest/PairedTTest.jsx |  2 -
 superset/assets/src/welcome/App.jsx                | 80 ++++---------------
 .../assets/src/welcome/{App.jsx => Welcome.jsx}    |  4 +-
 superset/assets/src/welcome/index.jsx              | 18 +----
 superset/assets/yarn.lock                          | 42 +++++++---
 18 files changed, 97 insertions(+), 308 deletions(-)

diff --git a/superset/assets/.babelrc b/superset/assets/.babelrc
index bb026bc..0c426be 100644
--- a/superset/assets/.babelrc
+++ b/superset/assets/.babelrc
@@ -1,4 +1,4 @@
 {
   "presets" : ["airbnb", "react", "env"],
-  "plugins": ["syntax-dynamic-import"],
+  "plugins": ["syntax-dynamic-import", "react-hot-loader/babel"]
 }
diff --git a/superset/assets/package.json b/superset/assets/package.json
index f36ffde..3bad881 100644
--- a/superset/assets/package.json
+++ b/superset/assets/package.json
@@ -102,6 +102,7 @@
     "react-dnd-html5-backend": "^2.5.4",
     "react-dom": "^15.6.2",
     "react-gravatar": "^2.6.1",
+    "react-hot-loader": "^4.3.6",
     "react-map-gl": "^3.0.4",
     "react-markdown": "^3.3.0",
     "react-redux": "^5.0.2",
diff --git a/superset/assets/spec/javascripts/welcome/App_spec.jsx b/superset/assets/spec/javascripts/welcome/Welcome_spec.jsx
similarity index 71%
rename from superset/assets/spec/javascripts/welcome/App_spec.jsx
rename to superset/assets/spec/javascripts/welcome/Welcome_spec.jsx
index 46c6fdb..a0a3982 100644
--- a/superset/assets/spec/javascripts/welcome/App_spec.jsx
+++ b/superset/assets/spec/javascripts/welcome/Welcome_spec.jsx
@@ -4,17 +4,17 @@ import { shallow } from 'enzyme';
 import { describe, it } from 'mocha';
 import { expect } from 'chai';
 
-import App from '../../../src/welcome/App';
+import Welcome from '../../../src/welcome/Welcome';
 
-describe('App', () => {
+describe('Welcome', () => {
   const mockedProps = {};
   it('is valid', () => {
     expect(
-      React.isValidElement(<App {...mockedProps} />),
+      React.isValidElement(<Welcome {...mockedProps} />),
     ).to.equal(true);
   });
   it('renders 4 Tab, Panel, and Row components', () => {
-    const wrapper = shallow(<App {...mockedProps} />);
+    const wrapper = shallow(<Welcome {...mockedProps} />);
     expect(wrapper.find(Tab)).to.have.length(3);
     expect(wrapper.find(Panel)).to.have.length(3);
     expect(wrapper.find(Row)).to.have.length(3);
diff --git a/superset/assets/src/SqlLab/index.jsx b/superset/assets/src/SqlLab/App.jsx
similarity index 89%
copy from superset/assets/src/SqlLab/index.jsx
copy to superset/assets/src/SqlLab/App.jsx
index 24983de..f86966a 100644
--- a/superset/assets/src/SqlLab/index.jsx
+++ b/superset/assets/src/SqlLab/App.jsx
@@ -1,8 +1,8 @@
 import React from 'react';
-import { render } from 'react-dom';
 import { createStore, compose, applyMiddleware } from 'redux';
 import { Provider } from 'react-redux';
 import thunkMiddleware from 'redux-thunk';
+import { hot } from 'react-hot-loader';
 
 import getInitialState from './getInitialState';
 import rootReducer from './reducers';
@@ -36,9 +36,10 @@ $('a:contains("SQL Lab")')
   .parent()
   .addClass('active');
 
-render(
+const Application = () => (
   <Provider store={store}>
     <App />
-  </Provider>,
-  appContainer,
+  </Provider>
 );
+
+export default hot(module)(Application);
diff --git a/superset/assets/src/SqlLab/index.jsx b/superset/assets/src/SqlLab/index.jsx
index 24983de..3088170 100644
--- a/superset/assets/src/SqlLab/index.jsx
+++ b/superset/assets/src/SqlLab/index.jsx
@@ -1,44 +1,8 @@
 import React from 'react';
-import { render } from 'react-dom';
-import { createStore, compose, applyMiddleware } from 'redux';
-import { Provider } from 'react-redux';
-import thunkMiddleware from 'redux-thunk';
+import ReactDOM from 'react-dom';
+import App from './App';
 
-import getInitialState from './getInitialState';
-import rootReducer from './reducers';
-import { initEnhancer } from '../reduxUtils';
-import { initJQueryAjax } from '../modules/utils';
-import App from './components/App';
-import { appSetup } from '../common';
-
-import './main.less';
-import '../../stylesheets/reactable-pagination.css';
-import '../components/FilterableTable/FilterableTableStyles.css';
-
-appSetup();
-initJQueryAjax();
-
-const appContainer = document.getElementById('app');
-const bootstrapData = JSON.parse(appContainer.getAttribute('data-bootstrap'));
-const state = getInitialState(bootstrapData);
-
-const store = createStore(
-  rootReducer,
-  state,
-  compose(
-    applyMiddleware(thunkMiddleware),
-    initEnhancer(),
-  ),
-);
-
-// jquery hack to highlight the navbar menu
-$('a:contains("SQL Lab")')
-  .parent()
-  .addClass('active');
-
-render(
-  <Provider store={store}>
-    <App />
-  </Provider>,
-  appContainer,
+ReactDOM.render(
+  <App />,
+  document.getElementById('app'),
 );
diff --git a/superset/assets/src/addSlice/index.jsx b/superset/assets/src/addSlice/App.jsx
similarity index 65%
copy from superset/assets/src/addSlice/index.jsx
copy to superset/assets/src/addSlice/App.jsx
index f83c2d5..56469cc 100644
--- a/superset/assets/src/addSlice/index.jsx
+++ b/superset/assets/src/addSlice/App.jsx
@@ -1,5 +1,5 @@
 import React from 'react';
-import ReactDOM from 'react-dom';
+import { hot } from 'react-hot-loader';
 import { appSetup } from '../common';
 import AddSliceContainer from './AddSliceContainer';
 
@@ -8,7 +8,8 @@ appSetup();
 const addSliceContainer = document.getElementById('js-add-slice-container');
 const bootstrapData = JSON.parse(addSliceContainer.getAttribute('data-bootstrap'));
 
-ReactDOM.render(
-  <AddSliceContainer datasources={bootstrapData.datasources} />,
-  addSliceContainer,
+const App = () => (
+  <AddSliceContainer datasources={bootstrapData.datasources} />
 );
+
+export default hot(module)(App);
diff --git a/superset/assets/src/addSlice/index.jsx b/superset/assets/src/addSlice/index.jsx
index f83c2d5..6bf2dec 100644
--- a/superset/assets/src/addSlice/index.jsx
+++ b/superset/assets/src/addSlice/index.jsx
@@ -1,14 +1,8 @@
 import React from 'react';
 import ReactDOM from 'react-dom';
-import { appSetup } from '../common';
-import AddSliceContainer from './AddSliceContainer';
-
-appSetup();
-
-const addSliceContainer = document.getElementById('js-add-slice-container');
-const bootstrapData = JSON.parse(addSliceContainer.getAttribute('data-bootstrap'));
+import App from './App';
 
 ReactDOM.render(
-  <AddSliceContainer datasources={bootstrapData.datasources} />,
-  addSliceContainer,
+  <App />,
+  document.getElementById('js-add-slice-container'),
 );
diff --git a/superset/assets/src/dashboard/index.jsx b/superset/assets/src/dashboard/App.jsx
similarity index 88%
copy from superset/assets/src/dashboard/index.jsx
copy to superset/assets/src/dashboard/App.jsx
index e0e9830..1167e9b 100644
--- a/superset/assets/src/dashboard/index.jsx
+++ b/superset/assets/src/dashboard/App.jsx
@@ -1,8 +1,8 @@
 import React from 'react';
-import ReactDOM from 'react-dom';
+import thunk from 'redux-thunk';
 import { createStore, applyMiddleware, compose } from 'redux';
 import { Provider } from 'react-redux';
-import thunk from 'redux-thunk';
+import { hot } from 'react-hot-loader';
 
 import { initEnhancer } from '../reduxUtils';
 import { appSetup } from '../common';
@@ -27,9 +27,10 @@ const store = createStore(
   ),
 );
 
-ReactDOM.render(
+const App = () => (
   <Provider store={store}>
     <DashboardContainer />
-  </Provider>,
-  appContainer,
+  </Provider>
 );
+
+export default hot(module)(App);
diff --git a/superset/assets/src/dashboard/index.jsx b/superset/assets/src/dashboard/index.jsx
index e0e9830..a22f175 100644
--- a/superset/assets/src/dashboard/index.jsx
+++ b/superset/assets/src/dashboard/index.jsx
@@ -1,35 +1,5 @@
 import React from 'react';
 import ReactDOM from 'react-dom';
-import { createStore, applyMiddleware, compose } from 'redux';
-import { Provider } from 'react-redux';
-import thunk from 'redux-thunk';
+import App from './App';
 
-import { initEnhancer } from '../reduxUtils';
-import { appSetup } from '../common';
-import { initJQueryAjax } from '../modules/utils';
-import DashboardContainer from './containers/Dashboard';
-import getInitialState from './reducers/getInitialState';
-import rootReducer from './reducers/index';
-
-appSetup();
-initJQueryAjax();
-
-const appContainer = document.getElementById('app');
-const bootstrapData = JSON.parse(appContainer.getAttribute('data-bootstrap'));
-const initState = getInitialState(bootstrapData);
-
-const store = createStore(
-  rootReducer,
-  initState,
-  compose(
-    applyMiddleware(thunk),
-    initEnhancer(false),
-  ),
-);
-
-ReactDOM.render(
-  <Provider store={store}>
-    <DashboardContainer />
-  </Provider>,
-  appContainer,
-);
+ReactDOM.render(<App />, document.getElementById('app'));
diff --git a/superset/assets/src/explore/index.jsx b/superset/assets/src/explore/App.jsx
similarity index 95%
copy from superset/assets/src/explore/index.jsx
copy to superset/assets/src/explore/App.jsx
index 283b5f5..2f27989 100644
--- a/superset/assets/src/explore/index.jsx
+++ b/superset/assets/src/explore/App.jsx
@@ -1,6 +1,6 @@
 /* eslint no-undef: 2 */
 import React from 'react';
-import ReactDOM from 'react-dom';
+import { hot } from 'react-hot-loader';
 import { createStore, applyMiddleware, compose } from 'redux';
 import { Provider } from 'react-redux';
 import thunk from 'redux-thunk';
@@ -80,12 +80,13 @@ const store = createStore(
   ),
 );
 
-ReactDOM.render(
+const App = () => (
   <Provider store={store}>
     <div>
       <ExploreViewContainer />
       <ToastPresenter />
     </div>
-  </Provider>,
-  exploreViewContainer,
+  </Provider>
 );
+
+export default hot(module)(App);
diff --git a/superset/assets/src/explore/index.jsx b/superset/assets/src/explore/index.jsx
index 283b5f5..3088170 100644
--- a/superset/assets/src/explore/index.jsx
+++ b/superset/assets/src/explore/index.jsx
@@ -1,91 +1,8 @@
-/* eslint no-undef: 2 */
 import React from 'react';
 import ReactDOM from 'react-dom';
-import { createStore, applyMiddleware, compose } from 'redux';
-import { Provider } from 'react-redux';
-import thunk from 'redux-thunk';
-
-import shortid from 'shortid';
-import { now } from '../modules/dates';
-import { initEnhancer } from '../reduxUtils';
-import { getChartKey } from './exploreUtils';
-import ToastPresenter from '../messageToasts/containers/ToastPresenter';
-import { getControlsState, getFormDataFromControls } from './store';
-import { initJQueryAjax } from '../modules/utils';
-import ExploreViewContainer from './components/ExploreViewContainer';
-import rootReducer from './reducers/index';
-import getToastsFromPyFlashMessages from '../messageToasts/utils/getToastsFromPyFlashMessages';
-
-import { appSetup } from '../common';
-import './main.css';
-import '../../stylesheets/reactable-pagination.css';
-
-appSetup();
-initJQueryAjax();
-
-const exploreViewContainer = document.getElementById('app');
-const bootstrapData = JSON.parse(exploreViewContainer.getAttribute('data-bootstrap'));
-const controls = getControlsState(bootstrapData, bootstrapData.form_data);
-const rawFormData = { ...bootstrapData.form_data };
-
-delete bootstrapData.form_data;
-delete bootstrapData.common.locale;
-delete bootstrapData.common.language_pack;
-
-// Initial state
-const bootstrappedState = {
-  ...bootstrapData,
-  rawFormData,
-  controls,
-  filterColumnOpts: [],
-  isDatasourceMetaLoading: false,
-  isStarred: false,
-};
-const slice = bootstrappedState.slice;
-const sliceFormData = slice
-  ? getFormDataFromControls(getControlsState(bootstrapData, slice.form_data))
-  : null;
-const chartKey = getChartKey(bootstrappedState);
-const initState = {
-  charts: {
-    [chartKey]: {
-      id: chartKey,
-      chartAlert: null,
-      chartStatus: 'loading',
-      chartUpdateEndTime: null,
-      chartUpdateStartTime: now(),
-      latestQueryFormData: getFormDataFromControls(controls),
-      sliceFormData,
-      queryRequest: null,
-      queryResponse: null,
-      triggerQuery: true,
-      lastRendered: 0,
-    },
-  },
-  saveModal: {
-    dashboards: [],
-    saveModalAlert: null,
-  },
-  explore: bootstrappedState,
-  impressionId: shortid.generate(),
-  messageToasts: getToastsFromPyFlashMessages((bootstrapData.common || {}).flash_messages
|| []),
-};
-
-const store = createStore(
-  rootReducer,
-  initState,
-  compose(
-    applyMiddleware(thunk),
-    initEnhancer(false),
-  ),
-);
+import App from './App';
 
 ReactDOM.render(
-  <Provider store={store}>
-    <div>
-      <ExploreViewContainer />
-      <ToastPresenter />
-    </div>
-  </Provider>,
-  exploreViewContainer,
+  <App />,
+  document.getElementById('app'),
 );
diff --git a/superset/assets/src/profile/index.jsx b/superset/assets/src/profile/App.jsx
similarity index 64%
copy from superset/assets/src/profile/index.jsx
copy to superset/assets/src/profile/App.jsx
index e9ed59b..13146ec 100644
--- a/superset/assets/src/profile/index.jsx
+++ b/superset/assets/src/profile/App.jsx
@@ -1,7 +1,5 @@
-/* eslint no-unused-vars: 0 */
 import React from 'react';
-import ReactDOM from 'react-dom';
-
+import { hot } from 'react-hot-loader';
 import App from './components/App';
 import { appSetup } from '../common';
 
@@ -12,8 +10,8 @@ appSetup();
 const profileViewContainer = document.getElementById('app');
 const bootstrap = JSON.parse(profileViewContainer.getAttribute('data-bootstrap'));
 
-const user = bootstrap.user;
-ReactDOM.render(
-  <App user={user} />,
-  profileViewContainer,
+const Application = () => (
+  <App user={bootstrap.user} />
 );
+
+export default hot(module)(Application);
diff --git a/superset/assets/src/profile/index.jsx b/superset/assets/src/profile/index.jsx
index e9ed59b..3088170 100644
--- a/superset/assets/src/profile/index.jsx
+++ b/superset/assets/src/profile/index.jsx
@@ -1,19 +1,8 @@
-/* eslint no-unused-vars: 0 */
 import React from 'react';
 import ReactDOM from 'react-dom';
+import App from './App';
 
-import App from './components/App';
-import { appSetup } from '../common';
-
-import './main.css';
-
-appSetup();
-
-const profileViewContainer = document.getElementById('app');
-const bootstrap = JSON.parse(profileViewContainer.getAttribute('data-bootstrap'));
-
-const user = bootstrap.user;
 ReactDOM.render(
-  <App user={user} />,
-  profileViewContainer,
+  <App />,
+  document.getElementById('app'),
 );
diff --git a/superset/assets/src/visualizations/PairedTTest/PairedTTest.jsx b/superset/assets/src/visualizations/PairedTTest/PairedTTest.jsx
index 3a26e9d..3fd9f61 100644
--- a/superset/assets/src/visualizations/PairedTTest/PairedTTest.jsx
+++ b/superset/assets/src/visualizations/PairedTTest/PairedTTest.jsx
@@ -67,8 +67,6 @@ function adaptor(slice, payload) {
     significance_level: alpha,
   } = formData;
 
-  console.log('groups', groups, payload.data);
-
   ReactDOM.render(
     <PairedTTest
       metrics={metrics}
diff --git a/superset/assets/src/welcome/App.jsx b/superset/assets/src/welcome/App.jsx
index 5c694de..1591b52 100644
--- a/superset/assets/src/welcome/App.jsx
+++ b/superset/assets/src/welcome/App.jsx
@@ -1,71 +1,17 @@
+/* eslint no-unused-vars: 0 */
 import React from 'react';
-import PropTypes from 'prop-types';
-import { Panel, Row, Col, Tabs, Tab, FormControl } from 'react-bootstrap';
-import RecentActivity from '../profile/components/RecentActivity';
-import Favorites from '../profile/components/Favorites';
-import DashboardTable from './DashboardTable';
-import { t } from '../locales';
+import { hot } from 'react-hot-loader';
+import { appSetup } from '../common';
+import Welcome from './Welcome';
 
-const propTypes = {
-  user: PropTypes.object.isRequired,
-};
+appSetup();
 
-export default class App extends React.PureComponent {
-  constructor(props) {
-    super(props);
-    this.state = {
-      search: '',
-    };
-    this.onSearchChange = this.onSearchChange.bind(this);
-  }
-  onSearchChange(event) {
-    this.setState({ search: event.target.value });
-  }
-  render() {
-    return (
-      <div className="container welcome">
-        <Tabs defaultActiveKey={1} id="uncontrolled-tab-example">
-          <Tab eventKey={1} title={t('Dashboards')}>
-            <Panel>
-              <Row>
-                <Col md={8}><h2>{t('Dashboards')}</h2></Col>
-                <Col md={4}>
-                  <FormControl
-                    type="text"
-                    bsSize="sm"
-                    style={{ marginTop: '25px' }}
-                    placeholder="Search"
-                    value={this.state.search}
-                    onChange={this.onSearchChange}
-                  />
-                </Col>
-              </Row>
-              <hr />
-              <DashboardTable search={this.state.search} />
-            </Panel>
-          </Tab>
-          <Tab eventKey={2} title={t('Recently Viewed')}>
-            <Panel>
-              <Row>
-                <Col md={8}><h2>{t('Recently Viewed')}</h2></Col>
-              </Row>
-              <hr />
-              <RecentActivity user={this.props.user} />
-            </Panel>
-          </Tab>
-          <Tab eventKey={3} title={t('Favorites')}>
-            <Panel>
-              <Row>
-                <Col md={8}><h2>{t('Favorites')}</h2></Col>
-              </Row>
-              <hr />
-              <Favorites user={this.props.user} />
-            </Panel>
-          </Tab>
-        </Tabs>
-      </div>
-    );
-  }
-}
+const container = document.getElementById('app');
+const bootstrap = JSON.parse(container.getAttribute('data-bootstrap'));
+const user = { ...bootstrap.user };
 
-App.propTypes = propTypes;
+const App = () => (
+  <Welcome user={user} />
+);
+
+export default hot(module)(App);
diff --git a/superset/assets/src/welcome/App.jsx b/superset/assets/src/welcome/Welcome.jsx
similarity index 95%
copy from superset/assets/src/welcome/App.jsx
copy to superset/assets/src/welcome/Welcome.jsx
index 5c694de..2f4de97 100644
--- a/superset/assets/src/welcome/App.jsx
+++ b/superset/assets/src/welcome/Welcome.jsx
@@ -10,7 +10,7 @@ const propTypes = {
   user: PropTypes.object.isRequired,
 };
 
-export default class App extends React.PureComponent {
+export default class Welcome extends React.PureComponent {
   constructor(props) {
     super(props);
     this.state = {
@@ -68,4 +68,4 @@ export default class App extends React.PureComponent {
   }
 }
 
-App.propTypes = propTypes;
+Welcome.propTypes = propTypes;
diff --git a/superset/assets/src/welcome/index.jsx b/superset/assets/src/welcome/index.jsx
index df0f774..3088170 100644
--- a/superset/assets/src/welcome/index.jsx
+++ b/superset/assets/src/welcome/index.jsx
@@ -1,22 +1,8 @@
-/* eslint no-unused-vars: 0 */
 import React from 'react';
 import ReactDOM from 'react-dom';
-import { Panel, Row, Col, FormControl } from 'react-bootstrap';
-
-import { appSetup } from '../common';
 import App from './App';
 
-appSetup();
-
-const container = document.getElementById('app');
-const bootstrap = JSON.parse(container.getAttribute('data-bootstrap'));
-const user = {
-  ...bootstrap.user,
-};
-
 ReactDOM.render(
-  <App
-    user={user}
-  />,
-  container,
+  <App />,
+  document.getElementById('app'),
 );
diff --git a/superset/assets/yarn.lock b/superset/assets/yarn.lock
index 2b330de..09c327e 100644
--- a/superset/assets/yarn.lock
+++ b/superset/assets/yarn.lock
@@ -1061,7 +1061,7 @@ ajv@^4.9.1:
     co "^4.6.0"
     json-stable-stringify "^1.0.1"
 
-ajv@^5.2.3, ajv@^5.3.0:
+ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0:
   version "5.5.2"
   resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
   dependencies:
@@ -1418,7 +1418,7 @@ aws-sign@~0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/aws-sign/-/aws-sign-0.3.0.tgz#3d81ca69b474b1e16518728b51c24ff0bbedc6e9"
 
-aws4@^1.2.1, aws4@^1.8.0:
+aws4@^1.2.1, aws4@^1.6.0, aws4@^1.8.0:
   version "1.8.0"
   resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
 
@@ -4872,7 +4872,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2:
     assign-symbols "^1.0.0"
     is-extendable "^1.0.1"
 
-extend@^3.0.0, extend@~3.0.0, extend@~3.0.2:
+extend@^3.0.0, extend@~3.0.0, extend@~3.0.1, extend@~3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
 
@@ -4968,7 +4968,7 @@ fast-json-stable-stringify@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
 
-fast-levenshtein@~2.0.4:
+fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.4:
   version "2.0.6"
   resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
 
@@ -5210,7 +5210,7 @@ form-data@~2.1.1:
     combined-stream "^1.0.5"
     mime-types "^2.1.12"
 
-form-data@~2.3.2:
+form-data@~2.3.1, form-data@~2.3.2:
   version "2.3.2"
   resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099"
   dependencies:
@@ -5642,7 +5642,7 @@ global-prefix@^1.0.1:
     is-windows "^1.0.1"
     which "^1.2.14"
 
-global@~4.3.0:
+global@^4.3.0, global@~4.3.0:
   version "4.3.2"
   resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
   dependencies:
@@ -5837,6 +5837,13 @@ har-validator@~4.2.1:
     ajv "^4.9.1"
     har-schema "^1.0.5"
 
+har-validator@~5.0.3:
+  version "5.0.3"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd"
+  dependencies:
+    ajv "^5.1.0"
+    har-schema "^2.0.0"
+
 har-validator@~5.1.0:
   version "5.1.0"
   resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29"
@@ -8617,7 +8624,7 @@ oauth-sign@~0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.3.0.tgz#cb540f93bb2b22a7d5941691a288d60e8ea9386e"
 
-oauth-sign@~0.8.1:
+oauth-sign@~0.8.1, oauth-sign@~0.8.2:
   version "0.8.2"
   resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
 
@@ -9864,7 +9871,7 @@ qs@~6.4.0:
   version "6.4.0"
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
 
-qs@~6.5.2:
+qs@~6.5.1, qs@~6.5.2:
   version "6.5.2"
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
 
@@ -10105,6 +10112,17 @@ react-gravatar@^2.6.1:
     md5 "^2.1.0"
     query-string "^4.2.2"
 
+react-hot-loader@^4.3.6:
+  version "4.3.6"
+  resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-4.3.6.tgz#26e1491f08daf2bad99d141b1927c9faadef2fb4"
+  dependencies:
+    fast-levenshtein "^2.0.6"
+    global "^4.3.0"
+    hoist-non-react-statics "^2.5.0"
+    prop-types "^15.6.1"
+    react-lifecycles-compat "^3.0.4"
+    shallowequal "^1.0.2"
+
 react-input-autosize@^2.1.2:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-2.2.1.tgz#ec428fa15b1592994fb5f9aa15bb1eb6baf420f8"
@@ -11229,6 +11247,10 @@ shallow-copy@~0.0.1:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170"
 
+shallowequal@^1.0.2:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8"
+
 shapefile@0.3:
   version "0.3.1"
   resolved "https://registry.yarnpkg.com/shapefile/-/shapefile-0.3.1.tgz#9bb9a429bd6086a0cfb03962d14cfdf420ffba12"
@@ -12030,7 +12052,7 @@ tough-cookie@^2.3.2, tough-cookie@~2.4.3:
     psl "^1.1.24"
     punycode "^1.4.1"
 
-tough-cookie@~2.3.0:
+tough-cookie@~2.3.0, tough-cookie@~2.3.3:
   version "2.3.4"
   resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655"
   dependencies:
@@ -12408,7 +12430,7 @@ utils-merge@1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
 
-uuid@^3.0.0, uuid@^3.0.1, uuid@^3.3.2:
+uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0, uuid@^3.3.2:
   version "3.3.2"
   resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
 


Mime
View raw message