You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@superset.apache.org by GitBox <gi...@apache.org> on 2018/09/10 17:15:34 UTC

[GitHub] williaster closed pull request #5841: Enable hot module replacement for React via react-hot-loader

williaster closed pull request #5841: Enable hot module replacement for React via react-hot-loader
URL: https://github.com/apache/incubator-superset/pull/5841
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/superset/assets/.babelrc b/superset/assets/.babelrc
index bb026bc1b3..0c426be741 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 f36ffdeb5d..3bad8816cd 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 46c6fdb906..a0a3982608 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/App.jsx b/superset/assets/src/SqlLab/App.jsx
new file mode 100644
index 0000000000..f86966a1c3
--- /dev/null
+++ b/superset/assets/src/SqlLab/App.jsx
@@ -0,0 +1,45 @@
+import React from 'react';
+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';
+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');
+
+const Application = () => (
+  <Provider store={store}>
+    <App />
+  </Provider>
+);
+
+export default hot(module)(Application);
diff --git a/superset/assets/src/SqlLab/index.jsx b/superset/assets/src/SqlLab/index.jsx
index 24983de9bc..3088170f01 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/App.jsx b/superset/assets/src/addSlice/App.jsx
new file mode 100644
index 0000000000..56469cc1d9
--- /dev/null
+++ b/superset/assets/src/addSlice/App.jsx
@@ -0,0 +1,15 @@
+import React from 'react';
+import { hot } from 'react-hot-loader';
+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'));
+
+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 f83c2d5272..6bf2decfe6 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/App.jsx b/superset/assets/src/dashboard/App.jsx
new file mode 100644
index 0000000000..1167e9bfa6
--- /dev/null
+++ b/superset/assets/src/dashboard/App.jsx
@@ -0,0 +1,36 @@
+import React from 'react';
+import thunk from 'redux-thunk';
+import { createStore, applyMiddleware, compose } from 'redux';
+import { Provider } from 'react-redux';
+import { hot } from 'react-hot-loader';
+
+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),
+  ),
+);
+
+const App = () => (
+  <Provider store={store}>
+    <DashboardContainer />
+  </Provider>
+);
+
+export default hot(module)(App);
diff --git a/superset/assets/src/dashboard/index.jsx b/superset/assets/src/dashboard/index.jsx
index e0e98301a7..a22f17594a 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/App.jsx b/superset/assets/src/explore/App.jsx
new file mode 100644
index 0000000000..2f27989775
--- /dev/null
+++ b/superset/assets/src/explore/App.jsx
@@ -0,0 +1,92 @@
+/* eslint no-undef: 2 */
+import React from 'react';
+import { hot } from 'react-hot-loader';
+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),
+  ),
+);
+
+const App = () => (
+  <Provider store={store}>
+    <div>
+      <ExploreViewContainer />
+      <ToastPresenter />
+    </div>
+  </Provider>
+);
+
+export default hot(module)(App);
diff --git a/superset/assets/src/explore/index.jsx b/superset/assets/src/explore/index.jsx
index 283b5f5297..3088170f01 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/App.jsx b/superset/assets/src/profile/App.jsx
new file mode 100644
index 0000000000..13146ec225
--- /dev/null
+++ b/superset/assets/src/profile/App.jsx
@@ -0,0 +1,17 @@
+import React from 'react';
+import { hot } from 'react-hot-loader';
+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 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 e9ed59bd71..3088170f01 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 3a26e9d399..3fd9f61c25 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 5c694de928..1591b521dd 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/Welcome.jsx b/superset/assets/src/welcome/Welcome.jsx
new file mode 100644
index 0000000000..2f4de973ae
--- /dev/null
+++ b/superset/assets/src/welcome/Welcome.jsx
@@ -0,0 +1,71 @@
+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';
+
+const propTypes = {
+  user: PropTypes.object.isRequired,
+};
+
+export default class Welcome 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>
+    );
+  }
+}
+
+Welcome.propTypes = propTypes;
diff --git a/superset/assets/src/welcome/index.jsx b/superset/assets/src/welcome/index.jsx
index df0f774a81..3088170f01 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 2b330defcf..09c327e191 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"
 


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services

---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For additional commands, e-mail: notifications-help@superset.apache.org