diff --git a/superset/assets/.babelrc b/superset/assets/.babelrc index bb026bc1b36c2..0c426be741d9a 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 f36ffdeb5db44..3bad8816cd381 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 46c6fdb90600f..a0a3982608237 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(), + React.isValidElement(), ).to.equal(true); }); it('renders 4 Tab, Panel, and Row components', () => { - const wrapper = shallow(); + const wrapper = shallow(); 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 0000000000000..f86966a1c3f69 --- /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 = () => ( + + + +); + +export default hot(module)(Application); diff --git a/superset/assets/src/SqlLab/index.jsx b/superset/assets/src/SqlLab/index.jsx index 24983de9bc47c..3088170f013dd 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( - - - , - appContainer, +ReactDOM.render( + , + document.getElementById('app'), ); diff --git a/superset/assets/src/addSlice/App.jsx b/superset/assets/src/addSlice/App.jsx new file mode 100644 index 0000000000000..56469cc1d95eb --- /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 = () => ( + +); + +export default hot(module)(App); diff --git a/superset/assets/src/addSlice/index.jsx b/superset/assets/src/addSlice/index.jsx index f83c2d5272a49..6bf2decfe6c34 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, + , + 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 0000000000000..1167e9bfa6b3b --- /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 = () => ( + + + +); + +export default hot(module)(App); diff --git a/superset/assets/src/dashboard/index.jsx b/superset/assets/src/dashboard/index.jsx index e0e98301a76a4..a22f17594a2b3 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( - - - , - appContainer, -); +ReactDOM.render(, document.getElementById('app')); diff --git a/superset/assets/src/explore/App.jsx b/superset/assets/src/explore/App.jsx new file mode 100644 index 0000000000000..2f279897754a1 --- /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 = () => ( + +
+ + +
+
+); + +export default hot(module)(App); diff --git a/superset/assets/src/explore/index.jsx b/superset/assets/src/explore/index.jsx index 283b5f5297e9b..3088170f013dd 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( - -
- - -
-
, - exploreViewContainer, + , + document.getElementById('app'), ); diff --git a/superset/assets/src/profile/App.jsx b/superset/assets/src/profile/App.jsx new file mode 100644 index 0000000000000..13146ec225306 --- /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 = () => ( + +); + +export default hot(module)(Application); diff --git a/superset/assets/src/profile/index.jsx b/superset/assets/src/profile/index.jsx index e9ed59bd719b2..3088170f013dd 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( - , - profileViewContainer, + , + document.getElementById('app'), ); diff --git a/superset/assets/src/visualizations/PairedTTest/PairedTTest.jsx b/superset/assets/src/visualizations/PairedTTest/PairedTTest.jsx index 3a26e9d399467..3fd9f61c25811 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( - - - - -

{t('Dashboards')}

- - - -
-
- -
-
- - - -

{t('Recently Viewed')}

-
-
- -
-
- - - -

{t('Favorites')}

-
-
- -
-
-
- - ); - } -} +const container = document.getElementById('app'); +const bootstrap = JSON.parse(container.getAttribute('data-bootstrap')); +const user = { ...bootstrap.user }; -App.propTypes = propTypes; +const App = () => ( + +); + +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 0000000000000..2f4de973ae34a --- /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 ( +
+ + + + +

{t('Dashboards')}

+ + + +
+
+ +
+
+ + + +

{t('Recently Viewed')}

+
+
+ +
+
+ + + +

{t('Favorites')}

+
+
+ +
+
+
+
+ ); + } +} + +Welcome.propTypes = propTypes; diff --git a/superset/assets/src/welcome/index.jsx b/superset/assets/src/welcome/index.jsx index df0f774a81bf5..3088170f013dd 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( - , - container, + , + document.getElementById('app'), ); diff --git a/superset/assets/yarn.lock b/superset/assets/yarn.lock index 2b330defcffd9..09c327e191b07 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"