You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by kr...@apache.org on 2020/05/07 21:18:32 UTC

[incubator-superset] branch master updated: test(frontend): use absolute path for src imports (#9761)

This is an automated email from the ASF dual-hosted git repository.

kristw 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 13c5b13  test(frontend): use absolute path for src imports (#9761)
13c5b13 is described below

commit 13c5b133a9d054b07dff5bbcff987551e3c4c42e
Author: Jesse Yang <je...@airbnb.com>
AuthorDate: Thu May 7 14:18:10 2020 -0700

    test(frontend): use absolute path for src imports (#9761)
    
    * test(frontend): use absolute path for src imports
    
    * Upgrade prettier, fix eslint
---
 superset-frontend/.prettierrc                      |    3 +-
 .../cypress/integration/dashboard/edit_mode.js     |   16 +-
 .../cypress/integration/dashboard/fav_star.js      |    4 +-
 .../cypress/integration/dashboard/save.js          |    4 +-
 .../cypress/integration/dashboard/tabs.js          |    8 +-
 .../cypress/integration/explore/control.test.js    |   48 +-
 .../cypress/integration/explore/link.test.js       |    9 +-
 .../cypress/integration/sqllab/query.js            |    4 +-
 .../cypress/integration/sqllab/tabs.js             |    8 +-
 superset-frontend/cypress-base/package-lock.json   | 1019 ++++----------------
 superset-frontend/cypress-base/package.json        |    4 +-
 superset-frontend/jsconfig.json                    |    8 +
 superset-frontend/package-lock.json                |   18 +-
 superset-frontend/package.json                     |    6 +-
 .../spec/javascripts/CRUD/CollectionTable_spec.jsx |    2 +-
 .../addSlice/AddSliceContainer_spec.jsx            |   14 +-
 .../spec/javascripts/chart/ChartRenderer_spec.jsx  |    2 +-
 .../spec/javascripts/chart/chartActions_spec.js    |    6 +-
 .../spec/javascripts/chart/chartReducers_spec.js   |    4 +-
 .../components/AlteredSliceTag_spec.jsx            |    6 +-
 .../javascripts/components/AnchorLink_spec.jsx     |    4 +-
 .../javascripts/components/AsyncSelect_spec.jsx    |    2 +-
 .../javascripts/components/CachedLabel_spec.jsx    |    2 +-
 .../spec/javascripts/components/Checkbox_spec.jsx  |    7 +-
 .../javascripts/components/ColumnOption_spec.jsx   |   13 +-
 .../components/ColumnTypeLabel_spec.jsx            |    2 +-
 .../components/ConfirmStatusChange_spec.jsx        |   11 +-
 .../components/CopyToClipboard_spec.jsx            |    2 +-
 .../getErrorMessageComponentRegistry_spec.tsx      |    2 +
 .../FilterableTable/FilterableTable_spec.jsx       |    2 +-
 .../spec/javascripts/components/FormRow_spec.jsx   |    6 +-
 .../components/ListView/ListView_spec.jsx          |   26 +-
 .../spec/javascripts/components/Menu_spec.jsx      |    2 +-
 .../javascripts/components/MetricOption_spec.jsx   |   13 +-
 .../javascripts/components/ModalTrigger_spec.jsx   |    2 +-
 .../javascripts/components/OnPasteSelect_spec.jsx  |    2 +-
 .../components/OptionDescription_spec.jsx          |    4 +-
 .../javascripts/components/PopoverSection_spec.jsx |    2 +-
 .../javascripts/components/SearchInput_spec.jsx    |   10 +-
 .../javascripts/components/TableSelector_spec.jsx  |    2 +-
 .../components/URLShortLinkButton_spec.jsx         |    2 +-
 .../components/URLShortLinkModal_spec.jsx          |    4 +-
 .../components/VirtualizedRendererWrap_spec.jsx    |    2 +-
 .../dashboard/actions/dashboardLayout_spec.js      |   15 +-
 .../dashboard/actions/dashboardState_spec.js       |    8 +-
 .../dashboard/components/CodeModal_spec.jsx        |    2 +-
 .../dashboard/components/CssEditor_spec.jsx        |    2 +-
 .../dashboard/components/DashboardBuilder_spec.jsx |   20 +-
 .../dashboard/components/DashboardGrid_spec.jsx    |   12 +-
 .../dashboard/components/Dashboard_spec.jsx        |    9 +-
 .../components/FilterIndicatorGroup_spec.jsx       |    4 +-
 .../components/FilterIndicatorTooltip_spec.jsx     |    2 +-
 .../dashboard/components/FilterIndicator_spec.jsx  |    4 +-
 .../components/FilterIndicatorsContainer_spec.jsx  |   18 +-
 .../components/FilterTooltipWrapper_spec.jsx       |    4 +-
 .../components/HeaderActionsDropdown_spec.jsx      |   10 +-
 .../dashboard/components/Header_spec.jsx           |   16 +-
 .../dashboard/components/MissingChart_spec.jsx     |    2 +-
 .../components/RefreshIntervalModal_spec.jsx       |    2 +-
 .../dashboard/components/SliceAdder_spec.jsx       |    2 +-
 .../components/dnd/DragDroppable_spec.jsx          |    9 +-
 .../components/gridComponents/ChartHolder_spec.jsx |   12 +-
 .../components/gridComponents/Chart_spec.jsx       |    6 +-
 .../components/gridComponents/Column_spec.jsx      |   18 +-
 .../components/gridComponents/Divider_spec.jsx     |   12 +-
 .../components/gridComponents/Header_spec.jsx      |   16 +-
 .../components/gridComponents/Markdown_spec.jsx    |   12 +-
 .../components/gridComponents/Row_spec.jsx         |   18 +-
 .../components/gridComponents/Tab_spec.jsx         |   12 +-
 .../components/gridComponents/Tabs_spec.jsx        |   12 +-
 .../new/DraggableNewComponent_spec.jsx             |   11 +-
 .../gridComponents/new/NewColumn_spec.jsx          |    8 +-
 .../gridComponents/new/NewDivider_spec.jsx         |    8 +-
 .../gridComponents/new/NewHeader_spec.jsx          |    8 +-
 .../components/gridComponents/new/NewRow_spec.jsx  |    8 +-
 .../components/gridComponents/new/NewTabs_spec.jsx |    8 +-
 .../dashboard/components/menu/HoverMenu_spec.jsx   |    2 +-
 .../components/menu/WithPopoverMenu_spec.jsx       |    2 +-
 .../resizable/ResizableContainer_spec.jsx          |    2 +-
 .../components/resizable/ResizableHandle_spec.jsx  |    2 +-
 .../dashboard/fixtures/mockDashboardFilters.js     |    2 +-
 .../dashboard/fixtures/mockDashboardLayout.js      |    6 +-
 .../dashboard/fixtures/mockDashboardState.js       |    2 +-
 .../javascripts/dashboard/fixtures/mockStore.js    |    2 +-
 .../dashboard/helpers/WithDragDropContext.jsx      |    2 +-
 .../dashboard/reducers/dashboardFilters_spec.js    |    6 +-
 .../dashboard/reducers/dashboardLayout_spec.js     |    8 +-
 .../dashboard/reducers/dashboardState_spec.js      |    6 +-
 .../dashboard/reducers/sliceEntities_spec.js       |    4 +-
 .../dashboard/util/componentIsResizable_spec.js    |    4 +-
 .../javascripts/dashboard/util/dnd-reorder_spec.js |    2 +-
 .../dashboard/util/dropOverflowsParent_spec.js     |    6 +-
 .../util/findFirstParentContainer_spec.js          |    4 +-
 .../dashboard/util/findParentId_spec.js            |    2 +-
 .../util/findTabIndexByComponentId_spec.js         |    2 +-
 .../getChartAndLabelComponentIdFromPath_spec.js    |    2 +-
 .../dashboard/util/getChartIdsFromLayout_spec.js   |    7 +-
 .../dashboard/util/getDashboardUrl_spec.js         |    4 +-
 .../util/getDetailedComponentWidth_spec.js         |    6 +-
 .../dashboard/util/getDropPosition_spec.js         |    4 +-
 .../util/getFilterConfigsFromFormdata_spec.js      |    2 +-
 .../util/getFilterScopeFromNodesTree_spec.js       |    2 +-
 .../util/getFormDataWithExtraFilters_spec.js       |    2 +-
 .../util/getLeafComponentIdFromPath_spec.js        |    2 +-
 .../dashboard/util/isDashboardEmpty_spec.ts        |    4 +-
 .../dashboard/util/isValidChild_spec.js            |    4 +-
 .../dashboard/util/newComponentFactory_spec.js     |    4 +-
 .../dashboard/util/newEntitiesFromDrop_spec.js     |    4 +-
 .../util/updateComponentParentsList_spec.js        |    4 +-
 .../datasource/ChangeDatasourceModal_spec.jsx      |    2 +-
 .../datasource/DatasourceEditor_spec.jsx           |    9 +-
 .../datasource/DatasourceModal_spec.jsx            |    4 +-
 .../spec/javascripts/explore/AdhocFilter_spec.js   |    2 +-
 .../spec/javascripts/explore/AdhocMetric_spec.js   |    6 +-
 .../explore/components/AdhocFilterControl_spec.jsx |   10 +-
 ...AdhocFilterEditPopoverSimpleTabContent_spec.jsx |    8 +-
 .../AdhocFilterEditPopoverSqlTabContent_spec.jsx   |    4 +-
 .../components/AdhocFilterEditPopover_spec.jsx     |   12 +-
 .../explore/components/AdhocFilterOption_spec.jsx  |    4 +-
 .../AdhocMetricEditPopoverTitle_spec.jsx           |   15 +-
 .../components/AdhocMetricEditPopover_spec.jsx     |    8 +-
 .../explore/components/AdhocMetricOption_spec.jsx  |    6 +-
 .../components/AdhocMetricStaticOption_spec.jsx    |    8 +-
 .../explore/components/AggregateOption_spec.jsx    |    2 +-
 .../explore/components/BoundsControl_spec.jsx      |    2 +-
 .../explore/components/CheckboxControl_spec.jsx    |   11 +-
 .../explore/components/ColorPickerControl_spec.jsx |    4 +-
 .../explore/components/ColorScheme_spec.jsx        |    2 +-
 .../components/ControlPanelSection_spec.jsx        |   16 +-
 .../explore/components/ControlRow_spec.jsx         |    2 +-
 .../explore/components/DatasourceControl_spec.jsx  |   24 +-
 .../explore/components/DateFilterControl_spec.jsx  |    8 +-
 .../explore/components/DisplayQueryButton_spec.jsx |    5 +-
 .../explore/components/EmbedCodeButton_spec.jsx    |    4 +-
 .../components/ExploreActionButtons_spec.jsx       |    2 +-
 .../explore/components/ExploreChartHeader_spec.jsx |    6 +-
 .../explore/components/ExploreChartPanel_spec.jsx  |    2 +-
 .../components/FilterBoxItemControl_spec.jsx       |    4 +-
 .../components/FilterDefinitionOption_spec.jsx     |   12 +-
 .../components/FixedOrMetricControl_spec.jsx       |    6 +-
 .../components/MetricDefinitionOption_spec.jsx     |    8 +-
 .../components/MetricDefinitionValue_spec.jsx      |   10 +-
 .../explore/components/MetricsControl_spec.jsx     |   10 +-
 .../explore/components/QueryAndSaveBtns_spec.jsx   |    4 +-
 .../explore/components/RowCountLabel_spec.jsx      |   12 +-
 .../components/RunQueryActionButton_spec.jsx       |    4 +-
 .../explore/components/SaveModal_spec.jsx          |    6 +-
 .../explore/components/SelectControl_spec.jsx      |    6 +-
 .../explore/components/TextArea_spec.jsx           |    2 +-
 .../components/TimeSeriesColumnControl_spec.jsx    |    2 +-
 .../explore/components/ViewportControl_spec.jsx    |   16 +-
 .../explore/components/VizTypeControl_spec.jsx     |    2 +-
 .../explore/components/withVerification_spec.jsx   |    4 +-
 .../spec/javascripts/explore/controlUtils_spec.jsx |    4 +-
 .../javascripts/explore/exploreActions_spec.js     |    6 +-
 .../spec/javascripts/explore/store_spec.jsx        |    2 +-
 .../spec/javascripts/explore/utils_spec.jsx        |    4 +-
 .../components/ToastPresenter_spec.jsx             |   11 +-
 .../messageToasts/components/Toast_spec.jsx        |    9 +-
 .../javascripts/messageToasts/mockMessageToasts.js |    2 +-
 .../messageToasts/reducers/messageToasts_spec.js   |    4 +-
 .../utils/getToastsFromPyFlashMessages_spec.js     |    4 +-
 .../spec/javascripts/middleware/logger_spec.js     |    6 +-
 .../spec/javascripts/modules/dates_spec.js         |    2 +-
 .../spec/javascripts/modules/utils_spec.jsx        |    5 +-
 .../spec/javascripts/profile/App_spec.jsx          |    2 +-
 .../javascripts/profile/CreatedContent_spec.jsx    |    4 +-
 .../javascripts/profile/EditableTitle_spec.jsx     |    2 +-
 .../spec/javascripts/profile/Favorites_spec.jsx    |    4 +-
 .../javascripts/profile/RecentActivity_spec.jsx    |    4 +-
 .../spec/javascripts/profile/Security_spec.jsx     |    2 +-
 .../spec/javascripts/profile/UserInfo_spec.jsx     |    2 +-
 .../spec/javascripts/showSavedQuery/utils_spec.jsx |    2 +-
 .../spec/javascripts/sqllab/ColumnElement_spec.jsx |   23 +-
 .../sqllab/ExploreResultsButton_spec.jsx           |   13 +-
 .../javascripts/sqllab/HighlightedSql_spec.jsx     |    4 +-
 .../spec/javascripts/sqllab/LimitControl_spec.jsx  |   39 +-
 .../spec/javascripts/sqllab/Link_spec.jsx          |    2 +-
 .../javascripts/sqllab/QueryAutoRefresh_spec.jsx   |    2 +-
 .../spec/javascripts/sqllab/QuerySearch_spec.jsx   |    2 +-
 .../javascripts/sqllab/QueryStateLabel_spec.jsx    |    2 +-
 .../spec/javascripts/sqllab/QueryTable_spec.jsx    |   19 +-
 .../spec/javascripts/sqllab/ResultSet_spec.jsx     |   15 +-
 .../spec/javascripts/sqllab/SaveQuery_spec.jsx     |   16 +-
 .../javascripts/sqllab/ShareSqlLabQuery_spec.jsx   |    6 +-
 .../spec/javascripts/sqllab/SouthPane_spec.jsx     |   17 +-
 .../javascripts/sqllab/SqlEditorLeftBar_spec.jsx   |    4 +-
 .../spec/javascripts/sqllab/SqlEditor_spec.jsx     |   21 +-
 .../spec/javascripts/sqllab/TabStatusIcon_spec.jsx |    2 +-
 .../javascripts/sqllab/TabbedSqlEditors_spec.jsx   |   19 +-
 .../spec/javascripts/sqllab/TableElement_spec.jsx  |   22 +-
 .../spec/javascripts/sqllab/Timer_spec.jsx         |    4 +-
 .../spec/javascripts/sqllab/actions/sqlLab_spec.js |    2 +-
 .../spec/javascripts/sqllab/fixtures.js            |    2 +-
 .../javascripts/sqllab/reducers/sqlLab_spec.js     |    7 +-
 .../sqllab/utils/emptyQueryResults_spec.js         |    4 +-
 .../spec/javascripts/utils/common_spec.jsx         |    2 +-
 .../javascripts/utils/getClientErrorObject_spec.ts |    2 +-
 .../spec/javascripts/utils/safeStringify_spec.ts   |    2 +-
 .../views/dashboardList/DashboardList_spec.jsx     |    5 +-
 .../spec/javascripts/welcome/Welcome_spec.jsx      |    2 +-
 superset-frontend/src/SqlLab/actions/sqlLab.js     |   56 +-
 superset-frontend/src/SqlLab/components/App.jsx    |    6 +-
 .../src/SqlLab/components/QueryAutoRefresh.jsx     |    5 +-
 .../src/SqlLab/components/QuerySearch.jsx          |    2 +-
 .../src/SqlLab/components/QueryTable.jsx           |    4 +-
 .../src/SqlLab/components/SqlEditor.jsx            |    5 +-
 superset-frontend/src/chart/chartAction.js         |    2 +-
 .../src/dashboard/reducers/getInitialState.js      |    2 +-
 .../src/dashboard/util/findFirstParentContainer.js |    2 +-
 .../src/dashboard/util/getEmptyLayout.js           |    2 +-
 superset-frontend/src/explore/AdhocFilter.js       |    4 +-
 superset-frontend/src/explore/AdhocMetric.js       |   10 +-
 .../src/explore/actions/exploreActions.js          |    4 +-
 .../components/controls/AnnotationLayer.jsx        |    5 +-
 .../components/controls/DateFilterControl.jsx      |   25 +-
 superset-frontend/src/explore/exploreUtils.js      |    5 +-
 superset-frontend/src/modules/dates.js             |   29 +-
 .../src/profile/components/RecentActivity.jsx      |    2 +-
 superset-frontend/src/setup/setupApp.ts            |    6 +-
 220 files changed, 827 insertions(+), 1730 deletions(-)

diff --git a/superset-frontend/.prettierrc b/superset-frontend/.prettierrc
index a20502b..5393aaf 100644
--- a/superset-frontend/.prettierrc
+++ b/superset-frontend/.prettierrc
@@ -1,4 +1,5 @@
 {
   "singleQuote": true,
-  "trailingComma": "all"
+  "trailingComma": "all",
+  "arrowParens": "avoid"
 }
diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard/edit_mode.js b/superset-frontend/cypress-base/cypress/integration/dashboard/edit_mode.js
index 028b392..821c94f 100644
--- a/superset-frontend/cypress-base/cypress/integration/dashboard/edit_mode.js
+++ b/superset-frontend/cypress-base/cypress/integration/dashboard/edit_mode.js
@@ -24,9 +24,7 @@ export default () =>
       cy.server();
       cy.login();
       cy.visit(WORLD_HEALTH_DASHBOARD);
-      cy.get('.dashboard-header')
-        .contains('Edit dashboard')
-        .click();
+      cy.get('.dashboard-header').contains('Edit dashboard').click();
     });
 
     it('remove, and add chart flow', () => {
@@ -36,17 +34,13 @@ export default () =>
       cy.get('.fa.fa-trash')
         .last()
         .then($el => {
-          cy.wrap($el)
-            .invoke('show')
-            .click();
+          cy.wrap($el).invoke('show').click();
           // box plot should be gone
           cy.get('.grid-container .box_plot').should('not.exist');
         });
 
       // open charts list
-      cy.get('.component-layer')
-        .contains('Your charts & filters')
-        .click();
+      cy.get('.component-layer').contains('Your charts & filters').click();
 
       // find box plot is available from list
       cy.get('.slices-layer')
@@ -74,9 +68,7 @@ export default () =>
       cy.get('.dashboard-header .button-container').contains('Save changes');
 
       // undo 2 steps
-      cy.get('.dashboard-header .undo-action')
-        .click()
-        .click();
+      cy.get('.dashboard-header .undo-action').click().click();
 
       // no changes, can switch to view mode
       cy.get('.dashboard-header .button-container')
diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard/fav_star.js b/superset-frontend/cypress-base/cypress/integration/dashboard/fav_star.js
index 2a007f4..00dc19c 100644
--- a/superset-frontend/cypress-base/cypress/integration/dashboard/fav_star.js
+++ b/superset-frontend/cypress-base/cypress/integration/dashboard/fav_star.js
@@ -39,9 +39,7 @@ export default () =>
 
     it('should allow favor/unfavor', () => {
       if (!isFavoriteDashboard) {
-        cy.get('.favstar')
-          .find('i')
-          .should('have.class', 'fa-star-o');
+        cy.get('.favstar').find('i').should('have.class', 'fa-star-o');
         cy.get('.favstar').trigger('click');
         cy.get('.favstar')
           .find('i')
diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard/save.js b/superset-frontend/cypress-base/cypress/integration/dashboard/save.js
index 73b5431..a4611c7 100644
--- a/superset-frontend/cypress-base/cypress/integration/dashboard/save.js
+++ b/superset-frontend/cypress-base/cypress/integration/dashboard/save.js
@@ -66,9 +66,7 @@ export default () =>
       cy.get('.dashboard-header')
         .contains('Edit dashboard')
         .trigger('click', { force: true });
-      cy.get('.fa.fa-trash')
-        .last()
-        .trigger('click', { force: true });
+      cy.get('.fa.fa-trash').last().trigger('click', { force: true });
       cy.get('.grid-container .box_plot').should('not.exist');
 
       cy.route('POST', '/superset/save_dash/**/').as('saveRequest');
diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard/tabs.js b/superset-frontend/cypress-base/cypress/integration/dashboard/tabs.js
index e5e0538..c62bc2d 100644
--- a/superset-frontend/cypress-base/cypress/integration/dashboard/tabs.js
+++ b/superset-frontend/cypress-base/cypress/integration/dashboard/tabs.js
@@ -146,9 +146,7 @@ export default () =>
       });
 
       // click row level tab, send 1 more query
-      cy.get('.tab-content ul.nav.nav-tabs li')
-        .last()
-        .click();
+      cy.get('.tab-content ul.nav.nav-tabs li').last().click();
       cy.wait('@linechartRequest').then(xhr => {
         const requestFormData = xhr.request.body;
         const requestParams = JSON.parse(requestFormData.get('form_data'));
@@ -184,9 +182,7 @@ export default () =>
         .find('ul.nav.nav-tabs li')
         .first()
         .click();
-      cy.get('.tab-content ul.nav.nav-tabs li')
-        .first()
-        .click();
+      cy.get('.tab-content ul.nav.nav-tabs li').first().click();
       cy.get('span.Select-clear').click();
 
       // trigger 1 new query
diff --git a/superset-frontend/cypress-base/cypress/integration/explore/control.test.js b/superset-frontend/cypress-base/cypress/integration/explore/control.test.js
index 24092d1..a4faaaa 100644
--- a/superset-frontend/cypress-base/cypress/integration/explore/control.test.js
+++ b/superset-frontend/cypress-base/cypress/integration/explore/control.test.js
@@ -59,9 +59,7 @@ describe('AdhocMetrics', () => {
       cy.get('.select-clear').click();
       cy.get('.Select-control').click({ force: true });
       cy.get('input').type('sum_girls', { force: true });
-      cy.get('.VirtualizedSelectFocusedOption')
-        .trigger('mousedown')
-        .click();
+      cy.get('.VirtualizedSelectFocusedOption').trigger('mousedown').click();
     });
 
     cy.get('#metrics-edit-popover').within(() => {
@@ -69,9 +67,7 @@ describe('AdhocMetrics', () => {
         cy.get('span').click();
         cy.get('input').type(metricName);
       });
-      cy.get('button')
-        .contains('Save')
-        .click();
+      cy.get('button').contains('Save').click();
     });
 
     cy.get('button.query').click();
@@ -101,9 +97,7 @@ describe('AdhocMetrics', () => {
       cy.get('#adhoc-metric-edit-tabs-tab-SQL').click();
       cy.get('.ace_content').click();
       cy.get('.ace_text-input').type('/COUNT(DISTINCT name)', { force: true });
-      cy.get('button')
-        .contains('Save')
-        .click();
+      cy.get('button').contains('Save').click();
     });
 
     cy.get('button.query').click();
@@ -122,9 +116,7 @@ describe('AdhocMetrics', () => {
       cy.get('.select-clear').click();
       cy.get('.Select-control').click({ force: true });
       cy.get('input').type('sum_girls', { force: true });
-      cy.get('.VirtualizedSelectFocusedOption')
-        .trigger('mousedown')
-        .click();
+      cy.get('.VirtualizedSelectFocusedOption').trigger('mousedown').click();
     });
 
     cy.get('#metrics-edit-popover').within(() => {
@@ -136,9 +128,7 @@ describe('AdhocMetrics', () => {
       });
       cy.get('#adhoc-metric-edit-tabs-tab-SIMPLE').click();
       cy.get('.select-value-label').contains('num');
-      cy.get('button')
-        .contains('Save')
-        .click();
+      cy.get('button').contains('Save').click();
     });
 
     cy.get('button.query').click();
@@ -164,22 +154,16 @@ describe('AdhocFilters', () => {
     cy.get('[data-test=adhoc_filters]').within(() => {
       cy.get('.Select-control').click({ force: true });
       cy.get('input').type('name', { force: true });
-      cy.get('.VirtualizedSelectFocusedOption')
-        .trigger('mousedown')
-        .click();
+      cy.get('.VirtualizedSelectFocusedOption').trigger('mousedown').click();
     });
     cy.get('.adhoc-filter-option').click({ force: true });
     cy.get('#filter-edit-popover').within(() => {
       cy.get('[data-test=adhoc-filter-simple-value]').within(() => {
         cy.get('div.select-input').click({ force: true });
         cy.get('input.select-input').type('Amy', { force: true });
-        cy.get('.VirtualizedSelectFocusedOption')
-          .trigger('mousedown')
-          .click();
+        cy.get('.VirtualizedSelectFocusedOption').trigger('mousedown').click();
       });
-      cy.get('button')
-        .contains('Save')
-        .click();
+      cy.get('button').contains('Save').click();
     });
 
     cy.get('button.query').click();
@@ -196,9 +180,7 @@ describe('AdhocFilters', () => {
     cy.get('[data-test=adhoc_filters]').within(() => {
       cy.get('.Select-control').click({ force: true });
       cy.get('input').type('name', { force: true });
-      cy.get('.VirtualizedSelectFocusedOption')
-        .trigger('mousedown')
-        .click();
+      cy.get('.VirtualizedSelectFocusedOption').trigger('mousedown').click();
     });
 
     cy.get('.adhoc-filter-option').click({ force: true });
@@ -206,9 +188,7 @@ describe('AdhocFilters', () => {
       cy.get('#adhoc-filter-edit-tabs-tab-SQL').click();
       cy.get('.ace_content').click();
       cy.get('.ace_text-input').type("'Amy' OR name = 'Bob'", { force: true });
-      cy.get('button')
-        .contains('Save')
-        .click();
+      cy.get('button').contains('Save').click();
     });
 
     cy.get('button.query').click();
@@ -241,9 +221,7 @@ describe('Advanced analytics', () => {
     cy.get('[data-test=time_compare]').within(() => {
       cy.get('.Select-control').click({ force: true });
       cy.get('input').type('364 days', { force: true });
-      cy.get('.VirtualizedSelectOption')
-        .trigger('mousedown')
-        .click();
+      cy.get('.VirtualizedSelectOption').trigger('mousedown').click();
     });
 
     cy.get('button.query').click();
@@ -289,9 +267,7 @@ describe('Annotations', () => {
         .within(() => {
           cy.get('input').type('y=1400000');
         });
-      cy.get('button')
-        .contains('OK')
-        .click();
+      cy.get('button').contains('OK').click();
     });
 
     cy.get('button.query').click();
diff --git a/superset-frontend/cypress-base/cypress/integration/explore/link.test.js b/superset-frontend/cypress-base/cypress/integration/explore/link.test.js
index 2206749..4ba56b5 100644
--- a/superset-frontend/cypress-base/cypress/integration/explore/link.test.js
+++ b/superset-frontend/cypress-base/cypress/integration/explore/link.test.js
@@ -35,17 +35,12 @@ describe('Test explore links', () => {
     cy.verifySliceSuccess({ waitAlias: '@postJson' });
 
     cy.get('button#query').click();
-    cy.get('span')
-      .contains('View query')
-      .parent()
-      .click();
+    cy.get('span').contains('View query').parent().click();
     cy.wait('@postJson').then(() => {
       cy.get('code');
     });
     cy.get('.modal-header').within(() => {
-      cy.get('button.close')
-        .first()
-        .click({ force: true });
+      cy.get('button.close').first().click({ force: true });
     });
   });
 
diff --git a/superset-frontend/cypress-base/cypress/integration/sqllab/query.js b/superset-frontend/cypress-base/cypress/integration/sqllab/query.js
index df34631..71dfe14 100644
--- a/superset-frontend/cypress-base/cypress/integration/sqllab/query.js
+++ b/superset-frontend/cypress-base/cypress/integration/sqllab/query.js
@@ -40,9 +40,7 @@ export default () => {
           `{selectall}{backspace}SELECT ds, gender, name, num FROM main.birth_names LIMIT ${rowLimit}`,
           { force: true },
         );
-      cy.get('#js-sql-toolbar button')
-        .eq(0)
-        .click();
+      cy.get('#js-sql-toolbar button').eq(0).click();
 
       cy.wait('@sqlLabQuery');
 
diff --git a/superset-frontend/cypress-base/cypress/integration/sqllab/tabs.js b/superset-frontend/cypress-base/cypress/integration/sqllab/tabs.js
index 2fc102e..8dd5493 100644
--- a/superset-frontend/cypress-base/cypress/integration/sqllab/tabs.js
+++ b/superset-frontend/cypress-base/cypress/integration/sqllab/tabs.js
@@ -29,9 +29,7 @@ export default () => {
         const initialTabCount = tabList.length;
 
         // add tab
-        cy.get('#a11y-query-editor-tabs > ul > li')
-          .last()
-          .click();
+        cy.get('#a11y-query-editor-tabs > ul > li').last().click();
 
         cy.get('#a11y-query-editor-tabs > ul > li').should(
           'have.length',
@@ -50,9 +48,7 @@ export default () => {
         ).click();
 
         // first item is close
-        cy.get('#a11y-query-editor-tabs > ul > li:first ul li a')
-          .eq(0)
-          .click();
+        cy.get('#a11y-query-editor-tabs > ul > li:first ul li a').eq(0).click();
 
         cy.get('#a11y-query-editor-tabs > ul > li').should(
           'have.length',
diff --git a/superset-frontend/cypress-base/package-lock.json b/superset-frontend/cypress-base/package-lock.json
index a0ca3b0..793db40 100644
--- a/superset-frontend/cypress-base/package-lock.json
+++ b/superset-frontend/cypress-base/package-lock.json
@@ -8,7 +8,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
       "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
-      "dev": true,
       "requires": {
         "@babel/highlight": "^7.8.3"
       }
@@ -17,7 +16,6 @@
       "version": "7.4.5",
       "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.5.tgz",
       "integrity": "sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA==",
-      "dev": true,
       "requires": {
         "@babel/code-frame": "^7.0.0",
         "@babel/generator": "^7.4.4",
@@ -39,7 +37,6 @@
       "version": "7.9.5",
       "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz",
       "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==",
-      "dev": true,
       "requires": {
         "@babel/types": "^7.9.5",
         "jsesc": "^2.5.1",
@@ -51,7 +48,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz",
       "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==",
-      "dev": true,
       "requires": {
         "@babel/types": "^7.8.3"
       }
@@ -60,7 +56,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz",
       "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==",
-      "dev": true,
       "requires": {
         "@babel/helper-explode-assignable-expression": "^7.8.3",
         "@babel/types": "^7.8.3"
@@ -70,7 +65,6 @@
       "version": "7.9.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz",
       "integrity": "sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw==",
-      "dev": true,
       "requires": {
         "@babel/helper-annotate-as-pure": "^7.8.3",
         "@babel/types": "^7.9.0"
@@ -80,7 +74,6 @@
       "version": "7.9.5",
       "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.5.tgz",
       "integrity": "sha512-HAagjAC93tk748jcXpZ7oYRZH485RCq/+yEv9SIWezHRPv9moZArTnkUNciUNzvwHUABmiWKlcxJvMcu59UwTg==",
-      "dev": true,
       "requires": {
         "@babel/helper-annotate-as-pure": "^7.8.3",
         "@babel/helper-module-imports": "^7.8.3",
@@ -91,7 +84,6 @@
       "version": "7.9.5",
       "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.9.5.tgz",
       "integrity": "sha512-IipaxGaQmW4TfWoXdqjY0TzoXQ1HRS0kPpEgvjosb3u7Uedcq297xFqDQiCcQtRRwzIMif+N1MLVI8C5a4/PAA==",
-      "dev": true,
       "requires": {
         "@babel/helper-function-name": "^7.9.5",
         "@babel/helper-member-expression-to-functions": "^7.8.3",
@@ -105,7 +97,6 @@
       "version": "7.8.8",
       "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz",
       "integrity": "sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==",
-      "dev": true,
       "requires": {
         "@babel/helper-annotate-as-pure": "^7.8.3",
         "@babel/helper-regex": "^7.8.3",
@@ -116,7 +107,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz",
       "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==",
-      "dev": true,
       "requires": {
         "@babel/helper-function-name": "^7.8.3",
         "@babel/types": "^7.8.3",
@@ -127,7 +117,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz",
       "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==",
-      "dev": true,
       "requires": {
         "@babel/traverse": "^7.8.3",
         "@babel/types": "^7.8.3"
@@ -137,7 +126,6 @@
       "version": "7.9.5",
       "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz",
       "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==",
-      "dev": true,
       "requires": {
         "@babel/helper-get-function-arity": "^7.8.3",
         "@babel/template": "^7.8.3",
@@ -148,7 +136,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
       "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
-      "dev": true,
       "requires": {
         "@babel/types": "^7.8.3"
       }
@@ -157,7 +144,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz",
       "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==",
-      "dev": true,
       "requires": {
         "@babel/types": "^7.8.3"
       }
@@ -166,7 +152,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz",
       "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==",
-      "dev": true,
       "requires": {
         "@babel/types": "^7.8.3"
       }
@@ -175,7 +160,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz",
       "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==",
-      "dev": true,
       "requires": {
         "@babel/types": "^7.8.3"
       }
@@ -184,7 +168,6 @@
       "version": "7.9.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz",
       "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==",
-      "dev": true,
       "requires": {
         "@babel/helper-module-imports": "^7.8.3",
         "@babel/helper-replace-supers": "^7.8.6",
@@ -199,7 +182,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz",
       "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==",
-      "dev": true,
       "requires": {
         "@babel/types": "^7.8.3"
       }
@@ -207,14 +189,12 @@
     "@babel/helper-plugin-utils": {
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz",
-      "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==",
-      "dev": true
+      "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ=="
     },
     "@babel/helper-regex": {
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz",
       "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==",
-      "dev": true,
       "requires": {
         "lodash": "^4.17.13"
       }
@@ -223,7 +203,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz",
       "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==",
-      "dev": true,
       "requires": {
         "@babel/helper-annotate-as-pure": "^7.8.3",
         "@babel/helper-wrap-function": "^7.8.3",
@@ -236,7 +215,6 @@
       "version": "7.8.6",
       "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz",
       "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==",
-      "dev": true,
       "requires": {
         "@babel/helper-member-expression-to-functions": "^7.8.3",
         "@babel/helper-optimise-call-expression": "^7.8.3",
@@ -248,7 +226,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz",
       "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==",
-      "dev": true,
       "requires": {
         "@babel/template": "^7.8.3",
         "@babel/types": "^7.8.3"
@@ -258,7 +235,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
       "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
-      "dev": true,
       "requires": {
         "@babel/types": "^7.8.3"
       }
@@ -266,14 +242,12 @@
     "@babel/helper-validator-identifier": {
       "version": "7.9.5",
       "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz",
-      "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==",
-      "dev": true
+      "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g=="
     },
     "@babel/helper-wrap-function": {
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz",
       "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==",
-      "dev": true,
       "requires": {
         "@babel/helper-function-name": "^7.8.3",
         "@babel/template": "^7.8.3",
@@ -285,7 +259,6 @@
       "version": "7.9.2",
       "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz",
       "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==",
-      "dev": true,
       "requires": {
         "@babel/template": "^7.8.3",
         "@babel/traverse": "^7.9.0",
@@ -296,7 +269,6 @@
       "version": "7.9.0",
       "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz",
       "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==",
-      "dev": true,
       "requires": {
         "@babel/helper-validator-identifier": "^7.9.0",
         "chalk": "^2.0.0",
@@ -306,14 +278,12 @@
     "@babel/parser": {
       "version": "7.9.4",
       "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz",
-      "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==",
-      "dev": true
+      "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA=="
     },
     "@babel/plugin-proposal-async-generator-functions": {
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz",
       "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.3",
         "@babel/helper-remap-async-to-generator": "^7.8.3",
@@ -324,7 +294,6 @@
       "version": "7.3.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.3.0.tgz",
       "integrity": "sha512-wNHxLkEKTQ2ay0tnsam2z7fGZUi+05ziDJflEt3AZTP3oXLKHJp9HqhfroB/vdMvt3sda9fAbq7FsG8QPDrZBg==",
-      "dev": true,
       "requires": {
         "@babel/helper-create-class-features-plugin": "^7.3.0",
         "@babel/helper-plugin-utils": "^7.0.0"
@@ -334,7 +303,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz",
       "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.3",
         "@babel/plugin-syntax-json-strings": "^7.8.0"
@@ -344,7 +312,6 @@
       "version": "7.3.2",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.2.tgz",
       "integrity": "sha512-DjeMS+J2+lpANkYLLO+m6GjoTMygYglKmRe6cDTbFv3L9i6mmiE8fe6B8MtCSLZpVXscD5kn7s6SgtHrDoBWoA==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
         "@babel/plugin-syntax-object-rest-spread": "^7.2.0"
@@ -354,7 +321,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz",
       "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.3",
         "@babel/plugin-syntax-optional-catch-binding": "^7.8.0"
@@ -364,7 +330,6 @@
       "version": "7.8.8",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz",
       "integrity": "sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==",
-      "dev": true,
       "requires": {
         "@babel/helper-create-regexp-features-plugin": "^7.8.8",
         "@babel/helper-plugin-utils": "^7.8.3"
@@ -374,7 +339,6 @@
       "version": "7.8.4",
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
       "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.0"
       }
@@ -383,7 +347,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
       "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.0"
       }
@@ -392,7 +355,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz",
       "integrity": "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.3"
       }
@@ -401,7 +363,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
       "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.0"
       }
@@ -410,7 +371,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
       "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.0"
       }
@@ -419,7 +379,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz",
       "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.3"
       }
@@ -428,7 +387,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz",
       "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==",
-      "dev": true,
       "requires": {
         "@babel/helper-module-imports": "^7.8.3",
         "@babel/helper-plugin-utils": "^7.8.3",
@@ -439,7 +397,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz",
       "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.3"
       }
@@ -448,7 +405,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz",
       "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.3",
         "lodash": "^4.17.13"
@@ -458,7 +414,6 @@
       "version": "7.9.5",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz",
       "integrity": "sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg==",
-      "dev": true,
       "requires": {
         "@babel/helper-annotate-as-pure": "^7.8.3",
         "@babel/helper-define-map": "^7.8.3",
@@ -474,7 +429,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz",
       "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.3"
       }
@@ -483,7 +437,6 @@
       "version": "7.9.5",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz",
       "integrity": "sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.3"
       }
@@ -492,7 +445,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz",
       "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==",
-      "dev": true,
       "requires": {
         "@babel/helper-create-regexp-features-plugin": "^7.8.3",
         "@babel/helper-plugin-utils": "^7.8.3"
@@ -502,7 +454,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz",
       "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.3"
       }
@@ -511,7 +462,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz",
       "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==",
-      "dev": true,
       "requires": {
         "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3",
         "@babel/helper-plugin-utils": "^7.8.3"
@@ -521,7 +471,6 @@
       "version": "7.9.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz",
       "integrity": "sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.3"
       }
@@ -530,7 +479,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz",
       "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==",
-      "dev": true,
       "requires": {
         "@babel/helper-function-name": "^7.8.3",
         "@babel/helper-plugin-utils": "^7.8.3"
@@ -540,7 +488,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz",
       "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.3"
       }
@@ -549,7 +496,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz",
       "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.3"
       }
@@ -558,7 +504,6 @@
       "version": "7.9.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz",
       "integrity": "sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q==",
-      "dev": true,
       "requires": {
         "@babel/helper-module-transforms": "^7.9.0",
         "@babel/helper-plugin-utils": "^7.8.3",
@@ -569,7 +514,6 @@
       "version": "7.9.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz",
       "integrity": "sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g==",
-      "dev": true,
       "requires": {
         "@babel/helper-module-transforms": "^7.9.0",
         "@babel/helper-plugin-utils": "^7.8.3",
@@ -581,7 +525,6 @@
       "version": "7.9.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz",
       "integrity": "sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ==",
-      "dev": true,
       "requires": {
         "@babel/helper-hoist-variables": "^7.8.3",
         "@babel/helper-module-transforms": "^7.9.0",
@@ -593,7 +536,6 @@
       "version": "7.9.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz",
       "integrity": "sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==",
-      "dev": true,
       "requires": {
         "@babel/helper-module-transforms": "^7.9.0",
         "@babel/helper-plugin-utils": "^7.8.3"
@@ -603,7 +545,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz",
       "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==",
-      "dev": true,
       "requires": {
         "@babel/helper-create-regexp-features-plugin": "^7.8.3"
       }
@@ -612,7 +553,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz",
       "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.3"
       }
@@ -621,7 +561,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz",
       "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.3",
         "@babel/helper-replace-supers": "^7.8.3"
@@ -631,7 +570,6 @@
       "version": "7.9.5",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz",
       "integrity": "sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA==",
-      "dev": true,
       "requires": {
         "@babel/helper-get-function-arity": "^7.8.3",
         "@babel/helper-plugin-utils": "^7.8.3"
@@ -641,7 +579,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz",
       "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.3"
       }
@@ -650,7 +587,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz",
       "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.3"
       }
@@ -659,7 +595,6 @@
       "version": "7.9.4",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz",
       "integrity": "sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw==",
-      "dev": true,
       "requires": {
         "@babel/helper-builder-react-jsx": "^7.9.0",
         "@babel/helper-builder-react-jsx-experimental": "^7.9.0",
@@ -671,7 +606,6 @@
       "version": "7.9.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz",
       "integrity": "sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.3",
         "@babel/plugin-syntax-jsx": "^7.8.3"
@@ -681,7 +615,6 @@
       "version": "7.9.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz",
       "integrity": "sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.3",
         "@babel/plugin-syntax-jsx": "^7.8.3"
@@ -691,7 +624,6 @@
       "version": "7.8.7",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz",
       "integrity": "sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==",
-      "dev": true,
       "requires": {
         "regenerator-transform": "^0.14.2"
       }
@@ -700,7 +632,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz",
       "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.3"
       }
@@ -709,7 +640,6 @@
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.2.0.tgz",
       "integrity": "sha512-jIgkljDdq4RYDnJyQsiWbdvGeei/0MOTtSHKO/rfbd/mXBxNpdlulMx49L0HQ4pug1fXannxoqCI+fYSle9eSw==",
-      "dev": true,
       "requires": {
         "@babel/helper-module-imports": "^7.0.0",
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -721,7 +651,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz",
       "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.3"
       }
@@ -730,7 +659,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz",
       "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.3"
       }
@@ -739,7 +667,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz",
       "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.3",
         "@babel/helper-regex": "^7.8.3"
@@ -749,7 +676,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz",
       "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==",
-      "dev": true,
       "requires": {
         "@babel/helper-annotate-as-pure": "^7.8.3",
         "@babel/helper-plugin-utils": "^7.8.3"
@@ -759,7 +685,6 @@
       "version": "7.8.4",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz",
       "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.8.3"
       }
@@ -768,7 +693,6 @@
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz",
       "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==",
-      "dev": true,
       "requires": {
         "@babel/helper-create-regexp-features-plugin": "^7.8.3",
         "@babel/helper-plugin-utils": "^7.8.3"
@@ -778,7 +702,6 @@
       "version": "7.4.5",
       "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.5.tgz",
       "integrity": "sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w==",
-      "dev": true,
       "requires": {
         "@babel/helper-module-imports": "^7.0.0",
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -834,7 +757,6 @@
           "version": "7.9.5",
           "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.5.tgz",
           "integrity": "sha512-VP2oXvAf7KCYTthbUHwBlewbl1Iq059f6seJGsxMizaCdgHIeczOr7FBqELhSqfkIl04Fi8okzWzl63UKbQmmg==",
-          "dev": true,
           "requires": {
             "@babel/helper-plugin-utils": "^7.8.3",
             "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
@@ -847,7 +769,6 @@
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0.tgz",
       "integrity": "sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
         "@babel/plugin-transform-react-display-name": "^7.0.0",
@@ -860,7 +781,6 @@
       "version": "7.3.1",
       "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.1.tgz",
       "integrity": "sha512-7jGW8ppV0ant637pIqAcFfQDDH1orEPGJb8aXfUozuCU3QqX7rX4DA8iwrbPrR1hcH0FTTHz47yQnk+bl5xHQA==",
-      "dev": true,
       "requires": {
         "regenerator-runtime": "^0.12.0"
       },
@@ -868,8 +788,7 @@
         "regenerator-runtime": {
           "version": "0.12.1",
           "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz",
-          "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==",
-          "dev": true
+          "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg=="
         }
       }
     },
@@ -877,7 +796,6 @@
       "version": "7.8.6",
       "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
       "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
-      "dev": true,
       "requires": {
         "@babel/code-frame": "^7.8.3",
         "@babel/parser": "^7.8.6",
@@ -888,7 +806,6 @@
       "version": "7.9.5",
       "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz",
       "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==",
-      "dev": true,
       "requires": {
         "@babel/code-frame": "^7.8.3",
         "@babel/generator": "^7.9.5",
@@ -905,7 +822,6 @@
       "version": "7.9.5",
       "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
       "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
-      "dev": true,
       "requires": {
         "@babel/helper-validator-identifier": "^7.9.5",
         "lodash": "^4.17.13",
@@ -916,7 +832,6 @@
       "version": "2.2.1",
       "resolved": "https://registry.npmjs.org/@cypress/browserify-preprocessor/-/browserify-preprocessor-2.2.1.tgz",
       "integrity": "sha512-97vJ1ulp6sIBJ00FJHAP8JDrJmBXV1UudNNs5r2LmXl5ESiVrPc/5wv5zfJuW2toOSOHa9IbJpwJj/4RbvRYXg==",
-      "dev": true,
       "requires": {
         "@babel/core": "7.4.5",
         "@babel/plugin-proposal-class-properties": "7.3.0",
@@ -941,14 +856,12 @@
         "bluebird": {
           "version": "3.5.3",
           "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz",
-          "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==",
-          "dev": true
+          "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw=="
         },
         "fs-extra": {
           "version": "7.0.1",
           "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
           "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
-          "dev": true,
           "requires": {
             "graceful-fs": "^4.1.2",
             "jsonfile": "^4.0.0",
@@ -961,7 +874,6 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/@cypress/code-coverage/-/code-coverage-3.1.0.tgz",
       "integrity": "sha512-LeAEA8iyAubn6BhFP24QH6ogOPKBqkuzn0+wZRlY+MG7tFUKqVmt8pWbBGzVn7hIF7YnjBFleQ24VnIiA3CscQ==",
-      "dev": true,
       "requires": {
         "@cypress/browserify-preprocessor": "2.2.1",
         "debug": "4.1.1",
@@ -974,7 +886,6 @@
           "version": "7.0.2",
           "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz",
           "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==",
-          "dev": true,
           "requires": {
             "path-key": "^3.1.0",
             "shebang-command": "^2.0.0",
@@ -985,7 +896,6 @@
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.0.tgz",
           "integrity": "sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA==",
-          "dev": true,
           "requires": {
             "cross-spawn": "^7.0.0",
             "get-stream": "^5.0.0",
@@ -1002,7 +912,6 @@
           "version": "5.1.0",
           "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz",
           "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==",
-          "dev": true,
           "requires": {
             "pump": "^3.0.0"
           }
@@ -1010,20 +919,17 @@
         "is-stream": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
-          "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
-          "dev": true
+          "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw=="
         },
         "mimic-fn": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
-          "dev": true
+          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
         },
         "npm-run-path": {
           "version": "4.0.1",
           "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
           "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
-          "dev": true,
           "requires": {
             "path-key": "^3.0.0"
           }
@@ -1032,7 +938,6 @@
           "version": "5.1.0",
           "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
           "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
-          "dev": true,
           "requires": {
             "mimic-fn": "^2.1.0"
           }
@@ -1040,14 +945,12 @@
         "path-key": {
           "version": "3.1.1",
           "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-          "dev": true
+          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
         },
         "shebang-command": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
           "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-          "dev": true,
           "requires": {
             "shebang-regex": "^3.0.0"
           }
@@ -1055,14 +958,12 @@
         "shebang-regex": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-          "dev": true
+          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
         },
         "which": {
           "version": "2.0.2",
           "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
           "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-          "dev": true,
           "requires": {
             "isexe": "^2.0.0"
           }
@@ -1155,7 +1056,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz",
       "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==",
-      "dev": true,
       "requires": {
         "camelcase": "^5.3.1",
         "find-up": "^4.1.0",
@@ -1167,7 +1067,6 @@
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
           "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-          "dev": true,
           "requires": {
             "locate-path": "^5.0.0",
             "path-exists": "^4.0.0"
@@ -1177,7 +1076,6 @@
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
           "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-          "dev": true,
           "requires": {
             "p-locate": "^4.1.0"
           }
@@ -1186,7 +1084,6 @@
           "version": "2.3.0",
           "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
           "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-          "dev": true,
           "requires": {
             "p-try": "^2.0.0"
           }
@@ -1195,7 +1092,6 @@
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
           "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-          "dev": true,
           "requires": {
             "p-limit": "^2.2.0"
           }
@@ -1203,22 +1099,19 @@
         "p-try": {
           "version": "2.2.0",
           "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-          "dev": true
+          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
         },
         "path-exists": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-          "dev": true
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
         }
       }
     },
     "@istanbuljs/schema": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz",
-      "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==",
-      "dev": true
+      "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw=="
     },
     "@samverschueren/stream-to-observable": {
       "version": "0.3.0",
@@ -1260,8 +1153,7 @@
     "@types/color-name": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
-      "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
-      "dev": true
+      "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
     },
     "@types/jquery": {
       "version": "3.3.31",
@@ -1316,7 +1208,6 @@
       "version": "1.3.5",
       "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
       "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
-      "dev": true,
       "requires": {
         "jsonparse": "^1.2.0",
         "through": ">=2.2.7 <3"
@@ -1325,14 +1216,12 @@
     "acorn": {
       "version": "7.1.1",
       "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz",
-      "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==",
-      "dev": true
+      "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg=="
     },
     "acorn-node": {
       "version": "1.8.2",
       "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
       "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
-      "dev": true,
       "requires": {
         "acorn": "^7.0.0",
         "acorn-walk": "^7.0.0",
@@ -1342,14 +1231,12 @@
     "acorn-walk": {
       "version": "7.1.1",
       "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz",
-      "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==",
-      "dev": true
+      "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ=="
     },
     "aggregate-error": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz",
       "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==",
-      "dev": true,
       "requires": {
         "clean-stack": "^2.0.0",
         "indent-string": "^4.0.0"
@@ -1358,8 +1245,7 @@
         "indent-string": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
-          "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
-          "dev": true
+          "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="
         }
       }
     },
@@ -1403,7 +1289,6 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
       "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
-      "dev": true,
       "requires": {
         "micromatch": "^3.1.4",
         "normalize-path": "^2.1.1"
@@ -1413,7 +1298,6 @@
           "version": "2.1.1",
           "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
           "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
-          "dev": true,
           "requires": {
             "remove-trailing-separator": "^1.0.1"
           }
@@ -1424,7 +1308,6 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz",
       "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==",
-      "dev": true,
       "requires": {
         "default-require-extensions": "^3.0.0"
       }
@@ -1438,14 +1321,12 @@
     "archy": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
-      "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
-      "dev": true
+      "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA="
     },
     "argparse": {
       "version": "1.0.10",
       "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
       "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-      "dev": true,
       "requires": {
         "sprintf-js": "~1.0.2"
       }
@@ -1453,26 +1334,22 @@
     "arr-diff": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
-      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
-      "dev": true
+      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
     },
     "arr-flatten": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
-      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
-      "dev": true
+      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
     },
     "arr-union": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
-      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
-      "dev": true
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
     },
     "array-unique": {
       "version": "0.3.2",
       "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
-      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
-      "dev": true
+      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
     },
     "asn1": {
       "version": "0.2.4",
@@ -1487,7 +1364,6 @@
       "version": "4.10.1",
       "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
       "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
-      "dev": true,
       "requires": {
         "bn.js": "^4.0.0",
         "inherits": "^2.0.1",
@@ -1498,7 +1374,6 @@
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
       "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
-      "dev": true,
       "requires": {
         "object-assign": "^4.1.1",
         "util": "0.10.3"
@@ -1507,14 +1382,12 @@
         "inherits": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
-          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
-          "dev": true
+          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
         },
         "util": {
           "version": "0.10.3",
           "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
           "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
-          "dev": true,
           "requires": {
             "inherits": "2.0.1"
           }
@@ -1530,8 +1403,7 @@
     "assign-symbols": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
-      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
-      "dev": true
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
     },
     "async": {
       "version": "3.2.0",
@@ -1542,8 +1414,7 @@
     "async-each": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
-      "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
-      "dev": true
+      "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ=="
     },
     "asynckit": {
       "version": "0.4.0",
@@ -1554,8 +1425,7 @@
     "atob": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
-      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
-      "dev": true
+      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
     },
     "aws-sign2": {
       "version": "0.7.0",
@@ -1573,7 +1443,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.2.tgz",
       "integrity": "sha512-4paN7RivvU3Rzju1vGSHWPjO8Y0rI6droWvSFKI6dvEQ4mvoV0zGojnlzVRfI6N8zISo6VERXt3coIuVmzuvNg==",
-      "dev": true,
       "requires": {
         "chokidar": "^2.0.4"
       }
@@ -1582,7 +1451,6 @@
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz",
       "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==",
-      "dev": true,
       "requires": {
         "object.assign": "^4.1.0"
       }
@@ -1590,20 +1458,17 @@
     "babelify": {
       "version": "10.0.0",
       "resolved": "https://registry.npmjs.org/babelify/-/babelify-10.0.0.tgz",
-      "integrity": "sha512-X40FaxyH7t3X+JFAKvb1H9wooWKLRCi8pg3m8poqtdZaIng+bjzp9RvKQCvRjF9isHiPkXspbbXT/zwXLtwgwg==",
-      "dev": true
+      "integrity": "sha512-X40FaxyH7t3X+JFAKvb1H9wooWKLRCi8pg3m8poqtdZaIng+bjzp9RvKQCvRjF9isHiPkXspbbXT/zwXLtwgwg=="
     },
     "balanced-match": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
-      "dev": true
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
     },
     "base": {
       "version": "0.11.2",
       "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
       "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
-      "dev": true,
       "requires": {
         "cache-base": "^1.0.1",
         "class-utils": "^0.3.5",
@@ -1618,7 +1483,6 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
           "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
           "requires": {
             "is-descriptor": "^1.0.0"
           }
@@ -1627,7 +1491,6 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
           "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
           "requires": {
             "kind-of": "^6.0.0"
           }
@@ -1636,7 +1499,6 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
           "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
           "requires": {
             "kind-of": "^6.0.0"
           }
@@ -1645,7 +1507,6 @@
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
           "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
           "requires": {
             "is-accessor-descriptor": "^1.0.0",
             "is-data-descriptor": "^1.0.0",
@@ -1657,8 +1518,7 @@
     "base64-js": {
       "version": "1.3.1",
       "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
-      "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==",
-      "dev": true
+      "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g=="
     },
     "bcrypt-pbkdf": {
       "version": "1.0.2",
@@ -1672,14 +1532,12 @@
     "binary-extensions": {
       "version": "1.13.1",
       "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
-      "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
-      "dev": true
+      "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw=="
     },
     "bindings": {
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
       "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
-      "dev": true,
       "optional": true,
       "requires": {
         "file-uri-to-path": "1.0.0"
@@ -1694,14 +1552,12 @@
     "bn.js": {
       "version": "4.11.8",
       "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
-      "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
-      "dev": true
+      "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
     },
     "brace-expansion": {
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
       "requires": {
         "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
@@ -1711,7 +1567,6 @@
       "version": "2.3.2",
       "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
       "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-      "dev": true,
       "requires": {
         "arr-flatten": "^1.1.0",
         "array-unique": "^0.3.2",
@@ -1729,7 +1584,6 @@
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
           "requires": {
             "is-extendable": "^0.1.0"
           }
@@ -1739,14 +1593,12 @@
     "brorand": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
-      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
-      "dev": true
+      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
     },
     "browser-pack": {
       "version": "6.1.0",
       "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz",
       "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==",
-      "dev": true,
       "requires": {
         "JSONStream": "^1.0.3",
         "combine-source-map": "~0.8.0",
@@ -1760,7 +1612,6 @@
       "version": "1.11.3",
       "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz",
       "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==",
-      "dev": true,
       "requires": {
         "resolve": "1.1.7"
       },
@@ -1768,8 +1619,7 @@
         "resolve": {
           "version": "1.1.7",
           "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
-          "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
-          "dev": true
+          "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs="
         }
       }
     },
@@ -1777,7 +1627,6 @@
       "version": "16.2.3",
       "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz",
       "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==",
-      "dev": true,
       "requires": {
         "JSONStream": "^1.0.3",
         "assert": "^1.4.0",
@@ -1832,8 +1681,7 @@
         "punycode": {
           "version": "1.4.1",
           "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
-          "dev": true
+          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
         }
       }
     },
@@ -1841,7 +1689,6 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
       "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
-      "dev": true,
       "requires": {
         "buffer-xor": "^1.0.3",
         "cipher-base": "^1.0.0",
@@ -1855,7 +1702,6 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
       "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
-      "dev": true,
       "requires": {
         "browserify-aes": "^1.0.4",
         "browserify-des": "^1.0.0",
@@ -1866,7 +1712,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
       "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
-      "dev": true,
       "requires": {
         "cipher-base": "^1.0.1",
         "des.js": "^1.0.0",
@@ -1878,7 +1723,6 @@
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
       "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
-      "dev": true,
       "requires": {
         "bn.js": "^4.1.0",
         "randombytes": "^2.0.1"
@@ -1888,7 +1732,6 @@
       "version": "4.0.4",
       "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
       "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
-      "dev": true,
       "requires": {
         "bn.js": "^4.1.1",
         "browserify-rsa": "^4.0.0",
@@ -1903,7 +1746,6 @@
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
       "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
-      "dev": true,
       "requires": {
         "pako": "~1.0.5"
       }
@@ -1912,7 +1754,6 @@
       "version": "4.11.1",
       "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.1.tgz",
       "integrity": "sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==",
-      "dev": true,
       "requires": {
         "caniuse-lite": "^1.0.30001038",
         "electron-to-chromium": "^1.3.390",
@@ -1924,7 +1765,6 @@
       "version": "5.5.0",
       "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.5.0.tgz",
       "integrity": "sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==",
-      "dev": true,
       "requires": {
         "base64-js": "^1.0.2",
         "ieee754": "^1.1.4"
@@ -1939,26 +1779,22 @@
     "buffer-from": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
-      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
-      "dev": true
+      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
     },
     "buffer-xor": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
-      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
-      "dev": true
+      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
     },
     "builtin-status-codes": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
-      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
-      "dev": true
+      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug="
     },
     "cache-base": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
       "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
-      "dev": true,
       "requires": {
         "collection-visit": "^1.0.0",
         "component-emitter": "^1.2.1",
@@ -1974,8 +1810,7 @@
     "cached-path-relative": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz",
-      "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==",
-      "dev": true
+      "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg=="
     },
     "cachedir": {
       "version": "2.3.0",
@@ -1987,7 +1822,6 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz",
       "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==",
-      "dev": true,
       "requires": {
         "hasha": "^5.0.0",
         "make-dir": "^3.0.0",
@@ -1998,14 +1832,12 @@
     "camelcase": {
       "version": "5.3.1",
       "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-      "dev": true
+      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
     },
     "caniuse-lite": {
       "version": "1.0.30001041",
       "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001041.tgz",
-      "integrity": "sha512-fqDtRCApddNrQuBxBS7kEiSGdBsgO4wiVw4G/IClfqzfhW45MbTumfN4cuUJGTM0YGFNn97DCXPJ683PS6zwvA==",
-      "dev": true
+      "integrity": "sha512-fqDtRCApddNrQuBxBS7kEiSGdBsgO4wiVw4G/IClfqzfhW45MbTumfN4cuUJGTM0YGFNn97DCXPJ683PS6zwvA=="
     },
     "caseless": {
       "version": "0.12.0",
@@ -2017,7 +1849,6 @@
       "version": "2.4.2",
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
       "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-      "dev": true,
       "requires": {
         "ansi-styles": "^3.2.1",
         "escape-string-regexp": "^1.0.5",
@@ -2028,7 +1859,6 @@
           "version": "3.2.1",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
           "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "dev": true,
           "requires": {
             "color-convert": "^1.9.0"
           }
@@ -2037,7 +1867,6 @@
           "version": "5.5.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
           "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-          "dev": true,
           "requires": {
             "has-flag": "^3.0.0"
           }
@@ -2054,7 +1883,6 @@
       "version": "2.1.8",
       "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
       "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
-      "dev": true,
       "requires": {
         "anymatch": "^2.0.0",
         "async-each": "^1.0.1",
@@ -2080,7 +1908,6 @@
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
       "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
-      "dev": true,
       "requires": {
         "inherits": "^2.0.1",
         "safe-buffer": "^5.0.1"
@@ -2090,7 +1917,6 @@
       "version": "0.3.6",
       "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
       "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
-      "dev": true,
       "requires": {
         "arr-union": "^3.1.0",
         "define-property": "^0.2.5",
@@ -2102,7 +1928,6 @@
           "version": "0.2.5",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
           "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
           "requires": {
             "is-descriptor": "^0.1.0"
           }
@@ -2112,8 +1937,7 @@
     "clean-stack": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
-      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
-      "dev": true
+      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="
     },
     "cli-cursor": {
       "version": "1.0.2",
@@ -2171,7 +1995,6 @@
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
       "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
-      "dev": true,
       "requires": {
         "string-width": "^4.2.0",
         "strip-ansi": "^6.0.0",
@@ -2181,14 +2004,12 @@
         "ansi-regex": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
-          "dev": true
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
         },
         "ansi-styles": {
           "version": "4.2.1",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
           "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
-          "dev": true,
           "requires": {
             "@types/color-name": "^1.1.1",
             "color-convert": "^2.0.1"
@@ -2198,7 +2019,6 @@
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
           "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
           "requires": {
             "color-name": "~1.1.4"
           }
@@ -2206,20 +2026,17 @@
         "color-name": {
           "version": "1.1.4",
           "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
         },
         "is-fullwidth-code-point": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-          "dev": true
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
         },
         "string-width": {
           "version": "4.2.0",
           "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
           "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
-          "dev": true,
           "requires": {
             "emoji-regex": "^8.0.0",
             "is-fullwidth-code-point": "^3.0.0",
@@ -2230,7 +2047,6 @@
           "version": "6.0.0",
           "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
           "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
-          "dev": true,
           "requires": {
             "ansi-regex": "^5.0.0"
           }
@@ -2239,7 +2055,6 @@
           "version": "6.2.0",
           "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
           "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
-          "dev": true,
           "requires": {
             "ansi-styles": "^4.0.0",
             "string-width": "^4.1.0",
@@ -2258,7 +2073,6 @@
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/coffeeify/-/coffeeify-3.0.1.tgz",
       "integrity": "sha512-Qjnr7UX6ldK1PHV7wCnv7AuCd4q19KTUtwJnu/6JRJB4rfm12zvcXtKdacUoePOKr1I4ka/ydKiwWpNAdsQb0g==",
-      "dev": true,
       "requires": {
         "convert-source-map": "^1.3.0",
         "through2": "^2.0.0"
@@ -2267,14 +2081,12 @@
     "coffeescript": {
       "version": "1.12.7",
       "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz",
-      "integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==",
-      "dev": true
+      "integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA=="
     },
     "collection-visit": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
       "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
-      "dev": true,
       "requires": {
         "map-visit": "^1.0.0",
         "object-visit": "^1.0.0"
@@ -2284,7 +2096,6 @@
       "version": "1.9.3",
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
       "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-      "dev": true,
       "requires": {
         "color-name": "1.1.3"
       }
@@ -2292,8 +2103,7 @@
     "color-name": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-      "dev": true
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
     },
     "colors": {
       "version": "1.4.0",
@@ -2306,7 +2116,6 @@
       "version": "0.8.0",
       "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz",
       "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=",
-      "dev": true,
       "requires": {
         "convert-source-map": "~1.1.0",
         "inline-source-map": "~0.6.0",
@@ -2317,8 +2126,7 @@
         "convert-source-map": {
           "version": "1.1.3",
           "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz",
-          "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=",
-          "dev": true
+          "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA="
         }
       }
     },
@@ -2346,26 +2154,22 @@
     "commondir": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
-      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
-      "dev": true
+      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
     },
     "component-emitter": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
-      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
-      "dev": true
+      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
     },
     "concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-      "dev": true
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
     },
     "concat-stream": {
       "version": "1.6.2",
       "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
       "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
-      "dev": true,
       "requires": {
         "buffer-from": "^1.0.0",
         "inherits": "^2.0.3",
@@ -2376,20 +2180,17 @@
     "console-browserify": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
-      "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
-      "dev": true
+      "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA=="
     },
     "constants-browserify": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
-      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
-      "dev": true
+      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U="
     },
     "convert-source-map": {
       "version": "1.7.0",
       "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
       "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
-      "dev": true,
       "requires": {
         "safe-buffer": "~5.1.1"
       },
@@ -2397,22 +2198,19 @@
         "safe-buffer": {
           "version": "5.1.2",
           "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-          "dev": true
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
         }
       }
     },
     "copy-descriptor": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
-      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
-      "dev": true
+      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
     },
     "core-js-compat": {
       "version": "3.6.5",
       "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz",
       "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==",
-      "dev": true,
       "requires": {
         "browserslist": "^4.8.5",
         "semver": "7.0.0"
@@ -2421,22 +2219,19 @@
         "semver": {
           "version": "7.0.0",
           "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
-          "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
-          "dev": true
+          "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A=="
         }
       }
     },
     "core-util-is": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
-      "dev": true
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
     },
     "create-ecdh": {
       "version": "4.0.3",
       "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
       "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
-      "dev": true,
       "requires": {
         "bn.js": "^4.1.0",
         "elliptic": "^6.0.0"
@@ -2446,7 +2241,6 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
       "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
-      "dev": true,
       "requires": {
         "cipher-base": "^1.0.1",
         "inherits": "^2.0.1",
@@ -2459,7 +2253,6 @@
       "version": "1.1.7",
       "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
       "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
-      "dev": true,
       "requires": {
         "cipher-base": "^1.0.3",
         "create-hash": "^1.1.0",
@@ -2486,7 +2279,6 @@
       "version": "3.12.0",
       "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
       "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
-      "dev": true,
       "requires": {
         "browserify-cipher": "^1.0.0",
         "browserify-sign": "^4.0.0",
@@ -2558,8 +2350,7 @@
     "dash-ast": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz",
-      "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==",
-      "dev": true
+      "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA=="
     },
     "dashdash": {
       "version": "1.14.1",
@@ -2580,7 +2371,6 @@
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
       "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
-      "dev": true,
       "requires": {
         "ms": "^2.1.1"
       }
@@ -2588,20 +2378,17 @@
     "decamelize": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
-      "dev": true
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
     },
     "decode-uri-component": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
-      "dev": true
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
     },
     "default-require-extensions": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz",
       "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==",
-      "dev": true,
       "requires": {
         "strip-bom": "^4.0.0"
       }
@@ -2610,7 +2397,6 @@
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
       "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
-      "dev": true,
       "requires": {
         "object-keys": "^1.0.12"
       }
@@ -2619,7 +2405,6 @@
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
       "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
-      "dev": true,
       "requires": {
         "is-descriptor": "^1.0.2",
         "isobject": "^3.0.1"
@@ -2629,7 +2414,6 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
           "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
           "requires": {
             "kind-of": "^6.0.0"
           }
@@ -2638,7 +2422,6 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
           "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
           "requires": {
             "kind-of": "^6.0.0"
           }
@@ -2647,7 +2430,6 @@
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
           "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
           "requires": {
             "is-accessor-descriptor": "^1.0.0",
             "is-data-descriptor": "^1.0.0",
@@ -2659,8 +2441,7 @@
     "defined": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
-      "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
-      "dev": true
+      "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM="
     },
     "delayed-stream": {
       "version": "1.0.0",
@@ -2672,7 +2453,6 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz",
       "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==",
-      "dev": true,
       "requires": {
         "JSONStream": "^1.0.3",
         "shasum-object": "^1.0.0",
@@ -2684,7 +2464,6 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
       "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
-      "dev": true,
       "requires": {
         "inherits": "^2.0.1",
         "minimalistic-assert": "^1.0.0"
@@ -2694,7 +2473,6 @@
       "version": "5.2.0",
       "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz",
       "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==",
-      "dev": true,
       "requires": {
         "acorn-node": "^1.6.1",
         "defined": "^1.0.0",
@@ -2705,7 +2483,6 @@
       "version": "5.0.3",
       "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
       "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
-      "dev": true,
       "requires": {
         "bn.js": "^4.1.0",
         "miller-rabin": "^4.0.0",
@@ -2715,14 +2492,12 @@
     "domain-browser": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
-      "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
-      "dev": true
+      "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA=="
     },
     "duplexer2": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
       "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
-      "dev": true,
       "requires": {
         "readable-stream": "^2.0.2"
       }
@@ -2740,8 +2515,7 @@
     "electron-to-chromium": {
       "version": "1.3.406",
       "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.406.tgz",
-      "integrity": "sha512-bx8vBZoEbhsMmwEZIj2twzfhFoKKZlSLQiENhqgc5/FdAj4/UHEzAri42OTSFA5+0agLR03ReTvIms2dfZ7/Ew==",
-      "dev": true
+      "integrity": "sha512-bx8vBZoEbhsMmwEZIj2twzfhFoKKZlSLQiENhqgc5/FdAj4/UHEzAri42OTSFA5+0agLR03ReTvIms2dfZ7/Ew=="
     },
     "elegant-spinner": {
       "version": "1.0.1",
@@ -2753,7 +2527,6 @@
       "version": "6.5.2",
       "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz",
       "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==",
-      "dev": true,
       "requires": {
         "bn.js": "^4.4.0",
         "brorand": "^1.0.1",
@@ -2767,14 +2540,12 @@
     "emoji-regex": {
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
     },
     "end-of-stream": {
       "version": "1.4.4",
       "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
       "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
-      "dev": true,
       "requires": {
         "once": "^1.4.0"
       }
@@ -2782,14 +2553,12 @@
     "es6-error": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
-      "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
-      "dev": true
+      "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg=="
     },
     "escape-string-regexp": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
-      "dev": true
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
     },
     "eslint-plugin-cypress": {
       "version": "2.10.3",
@@ -2803,8 +2572,7 @@
     "esprima": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
-      "dev": true
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
     },
     "eventemitter2": {
       "version": "4.1.2",
@@ -2815,14 +2583,12 @@
     "events": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz",
-      "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==",
-      "dev": true
+      "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg=="
     },
     "evp_bytestokey": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
       "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
-      "dev": true,
       "requires": {
         "md5.js": "^1.3.4",
         "safe-buffer": "^5.1.1"
@@ -2862,7 +2628,6 @@
       "version": "2.1.4",
       "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
       "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
-      "dev": true,
       "requires": {
         "debug": "^2.3.3",
         "define-property": "^0.2.5",
@@ -2877,7 +2642,6 @@
           "version": "2.6.9",
           "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
           "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
           "requires": {
             "ms": "2.0.0"
           }
@@ -2886,7 +2650,6 @@
           "version": "0.2.5",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
           "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
           "requires": {
             "is-descriptor": "^0.1.0"
           }
@@ -2895,7 +2658,6 @@
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
           "requires": {
             "is-extendable": "^0.1.0"
           }
@@ -2903,8 +2665,7 @@
         "ms": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
         }
       }
     },
@@ -2918,7 +2679,6 @@
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
       "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
-      "dev": true,
       "requires": {
         "assign-symbols": "^1.0.0",
         "is-extendable": "^1.0.1"
@@ -2928,7 +2688,6 @@
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
           "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-          "dev": true,
           "requires": {
             "is-plain-object": "^2.0.4"
           }
@@ -2939,7 +2698,6 @@
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
       "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
-      "dev": true,
       "requires": {
         "array-unique": "^0.3.2",
         "define-property": "^1.0.0",
@@ -2955,7 +2713,6 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
           "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
           "requires": {
             "is-descriptor": "^1.0.0"
           }
@@ -2964,7 +2721,6 @@
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
           "requires": {
             "is-extendable": "^0.1.0"
           }
@@ -2973,7 +2729,6 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
           "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
           "requires": {
             "kind-of": "^6.0.0"
           }
@@ -2982,7 +2737,6 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
           "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
           "requires": {
             "kind-of": "^6.0.0"
           }
@@ -2991,7 +2745,6 @@
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
           "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
           "requires": {
             "is-accessor-descriptor": "^1.0.0",
             "is-data-descriptor": "^1.0.0",
@@ -3050,8 +2803,7 @@
     "fast-safe-stringify": {
       "version": "2.0.7",
       "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz",
-      "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==",
-      "dev": true
+      "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA=="
     },
     "fd-slicer": {
       "version": "1.1.0",
@@ -3076,14 +2828,12 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
       "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
-      "dev": true,
       "optional": true
     },
     "fill-range": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
       "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
-      "dev": true,
       "requires": {
         "extend-shallow": "^2.0.1",
         "is-number": "^3.0.0",
@@ -3095,7 +2845,6 @@
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
           "requires": {
             "is-extendable": "^0.1.0"
           }
@@ -3106,7 +2855,6 @@
       "version": "3.3.1",
       "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
       "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==",
-      "dev": true,
       "requires": {
         "commondir": "^1.0.1",
         "make-dir": "^3.0.2",
@@ -3117,7 +2865,6 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
       "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
-      "dev": true,
       "requires": {
         "locate-path": "^2.0.0"
       }
@@ -3125,14 +2872,12 @@
     "for-in": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
-      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
-      "dev": true
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
     },
     "foreground-child": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
       "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==",
-      "dev": true,
       "requires": {
         "cross-spawn": "^7.0.0",
         "signal-exit": "^3.0.2"
@@ -3142,7 +2887,6 @@
           "version": "7.0.2",
           "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz",
           "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==",
-          "dev": true,
           "requires": {
             "path-key": "^3.1.0",
             "shebang-command": "^2.0.0",
@@ -3152,14 +2896,12 @@
         "path-key": {
           "version": "3.1.1",
           "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-          "dev": true
+          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
         },
         "shebang-command": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
           "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-          "dev": true,
           "requires": {
             "shebang-regex": "^3.0.0"
           }
@@ -3167,14 +2909,12 @@
         "shebang-regex": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-          "dev": true
+          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
         },
         "which": {
           "version": "2.0.2",
           "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
           "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-          "dev": true,
           "requires": {
             "isexe": "^2.0.0"
           }
@@ -3202,7 +2942,6 @@
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
       "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
-      "dev": true,
       "requires": {
         "map-cache": "^0.2.2"
       }
@@ -3210,8 +2949,7 @@
     "fromentries": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.0.tgz",
-      "integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==",
-      "dev": true
+      "integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ=="
     },
     "fs-extra": {
       "version": "8.1.0",
@@ -3227,14 +2965,12 @@
     "fs.realpath": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
-      "dev": true
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
     },
     "fsevents": {
       "version": "1.2.12",
       "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz",
       "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==",
-      "dev": true,
       "optional": true,
       "requires": {
         "bindings": "^1.5.0",
@@ -3245,25 +2981,21 @@
         "abbrev": {
           "version": "1.1.1",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "ansi-regex": {
           "version": "2.1.1",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "aproba": {
           "version": "1.2.0",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "are-we-there-yet": {
           "version": "1.1.5",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "delegates": "^1.0.0",
@@ -3273,13 +3005,11 @@
         "balanced-match": {
           "version": "1.0.0",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "brace-expansion": {
           "version": "1.1.11",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "balanced-match": "^1.0.0",
@@ -3289,37 +3019,31 @@
         "chownr": {
           "version": "1.1.4",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "code-point-at": {
           "version": "1.1.0",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "concat-map": {
           "version": "0.0.1",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "console-control-strings": {
           "version": "1.1.0",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "core-util-is": {
           "version": "1.0.2",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "debug": {
           "version": "3.2.6",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "ms": "^2.1.1"
@@ -3328,25 +3052,21 @@
         "deep-extend": {
           "version": "0.6.0",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "delegates": {
           "version": "1.0.0",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "detect-libc": {
           "version": "1.0.3",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "fs-minipass": {
           "version": "1.2.7",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "minipass": "^2.6.0"
@@ -3355,13 +3075,11 @@
         "fs.realpath": {
           "version": "1.0.0",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "gauge": {
           "version": "2.7.4",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "aproba": "^1.0.3",
@@ -3377,7 +3095,6 @@
         "glob": {
           "version": "7.1.6",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "fs.realpath": "^1.0.0",
@@ -3391,13 +3108,11 @@
         "has-unicode": {
           "version": "2.0.1",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "iconv-lite": {
           "version": "0.4.24",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "safer-buffer": ">= 2.1.2 < 3"
@@ -3406,7 +3121,6 @@
         "ignore-walk": {
           "version": "3.0.3",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "minimatch": "^3.0.4"
@@ -3415,7 +3129,6 @@
         "inflight": {
           "version": "1.0.6",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "once": "^1.3.0",
@@ -3425,19 +3138,16 @@
         "inherits": {
           "version": "2.0.4",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "ini": {
           "version": "1.3.5",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "is-fullwidth-code-point": {
           "version": "1.0.0",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "number-is-nan": "^1.0.0"
@@ -3446,13 +3156,11 @@
         "isarray": {
           "version": "1.0.0",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "minimatch": {
           "version": "3.0.4",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "brace-expansion": "^1.1.7"
@@ -3461,13 +3169,11 @@
         "minimist": {
           "version": "1.2.5",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "minipass": {
           "version": "2.9.0",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "safe-buffer": "^5.1.2",
@@ -3477,7 +3183,6 @@
         "minizlib": {
           "version": "1.3.3",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "minipass": "^2.9.0"
@@ -3486,7 +3191,6 @@
         "mkdirp": {
           "version": "0.5.3",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "minimist": "^1.2.5"
@@ -3495,13 +3199,11 @@
         "ms": {
           "version": "2.1.2",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "needle": {
           "version": "2.3.3",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "debug": "^3.2.6",
@@ -3512,7 +3214,6 @@
         "node-pre-gyp": {
           "version": "0.14.0",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "detect-libc": "^1.0.2",
@@ -3530,7 +3231,6 @@
         "nopt": {
           "version": "4.0.3",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "abbrev": "1",
@@ -3540,7 +3240,6 @@
         "npm-bundled": {
           "version": "1.1.1",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "npm-normalize-package-bin": "^1.0.1"
@@ -3549,13 +3248,11 @@
         "npm-normalize-package-bin": {
           "version": "1.0.1",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "npm-packlist": {
           "version": "1.4.8",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "ignore-walk": "^3.0.1",
@@ -3566,7 +3263,6 @@
         "npmlog": {
           "version": "4.1.2",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "are-we-there-yet": "~1.1.2",
@@ -3578,19 +3274,16 @@
         "number-is-nan": {
           "version": "1.0.1",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "object-assign": {
           "version": "4.1.1",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "once": {
           "version": "1.4.0",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "wrappy": "1"
@@ -3599,19 +3292,16 @@
         "os-homedir": {
           "version": "1.0.2",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "os-tmpdir": {
           "version": "1.0.2",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "osenv": {
           "version": "0.1.5",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "os-homedir": "^1.0.0",
@@ -3621,19 +3311,16 @@
         "path-is-absolute": {
           "version": "1.0.1",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "process-nextick-args": {
           "version": "2.0.1",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "rc": {
           "version": "1.2.8",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "deep-extend": "^0.6.0",
@@ -3645,7 +3332,6 @@
         "readable-stream": {
           "version": "2.3.7",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "core-util-is": "~1.0.0",
@@ -3660,7 +3346,6 @@
         "rimraf": {
           "version": "2.7.1",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "glob": "^7.1.3"
@@ -3669,43 +3354,36 @@
         "safe-buffer": {
           "version": "5.1.2",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "safer-buffer": {
           "version": "2.1.2",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "sax": {
           "version": "1.2.4",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "semver": {
           "version": "5.7.1",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "set-blocking": {
           "version": "2.0.0",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "signal-exit": {
           "version": "3.0.2",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "string-width": {
           "version": "1.0.2",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "code-point-at": "^1.0.0",
@@ -3716,7 +3394,6 @@
         "string_decoder": {
           "version": "1.1.1",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "safe-buffer": "~5.1.0"
@@ -3725,7 +3402,6 @@
         "strip-ansi": {
           "version": "3.0.1",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "ansi-regex": "^2.0.0"
@@ -3734,13 +3410,11 @@
         "strip-json-comments": {
           "version": "2.0.1",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "tar": {
           "version": "4.4.13",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "chownr": "^1.1.1",
@@ -3755,13 +3429,11 @@
         "util-deprecate": {
           "version": "1.0.2",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "wide-align": {
           "version": "1.1.3",
           "bundled": true,
-          "dev": true,
           "optional": true,
           "requires": {
             "string-width": "^1.0.2 || 2"
@@ -3770,13 +3442,11 @@
         "wrappy": {
           "version": "1.0.2",
           "bundled": true,
-          "dev": true,
           "optional": true
         },
         "yallist": {
           "version": "3.1.1",
           "bundled": true,
-          "dev": true,
           "optional": true
         }
       }
@@ -3784,26 +3454,22 @@
     "function-bind": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-      "dev": true
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
     },
     "gensync": {
       "version": "1.0.0-beta.1",
       "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
-      "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==",
-      "dev": true
+      "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg=="
     },
     "get-assigned-identifiers": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz",
-      "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==",
-      "dev": true
+      "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ=="
     },
     "get-caller-file": {
       "version": "2.0.5",
       "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-      "dev": true
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
     },
     "get-stream": {
       "version": "4.1.0",
@@ -3817,8 +3483,7 @@
     "get-value": {
       "version": "2.0.6",
       "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
-      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
-      "dev": true
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
     },
     "getos": {
       "version": "3.1.4",
@@ -3842,7 +3507,6 @@
       "version": "7.1.6",
       "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
       "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
-      "dev": true,
       "requires": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -3856,7 +3520,6 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
       "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
-      "dev": true,
       "requires": {
         "is-glob": "^3.1.0",
         "path-dirname": "^1.0.0"
@@ -3866,7 +3529,6 @@
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
           "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
-          "dev": true,
           "requires": {
             "is-extglob": "^2.1.0"
           }
@@ -3885,14 +3547,12 @@
     "globals": {
       "version": "11.12.0",
       "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
-      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-      "dev": true
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
     },
     "graceful-fs": {
       "version": "4.2.3",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
-      "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
-      "dev": true
+      "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ=="
     },
     "har-schema": {
       "version": "2.0.0",
@@ -3914,7 +3574,6 @@
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
       "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-      "dev": true,
       "requires": {
         "function-bind": "^1.1.1"
       }
@@ -3931,20 +3590,17 @@
     "has-flag": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
     },
     "has-symbols": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
-      "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
-      "dev": true
+      "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg=="
     },
     "has-value": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
       "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
-      "dev": true,
       "requires": {
         "get-value": "^2.0.6",
         "has-values": "^1.0.0",
@@ -3955,7 +3611,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
       "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
-      "dev": true,
       "requires": {
         "is-number": "^3.0.0",
         "kind-of": "^4.0.0"
@@ -3965,7 +3620,6 @@
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
           "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
-          "dev": true,
           "requires": {
             "is-buffer": "^1.1.5"
           }
@@ -3976,7 +3630,6 @@
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
       "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
-      "dev": true,
       "requires": {
         "inherits": "^2.0.1",
         "safe-buffer": "^5.0.1"
@@ -3986,7 +3639,6 @@
       "version": "1.1.7",
       "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
       "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
-      "dev": true,
       "requires": {
         "inherits": "^2.0.3",
         "minimalistic-assert": "^1.0.1"
@@ -3996,7 +3648,6 @@
       "version": "5.2.0",
       "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz",
       "integrity": "sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==",
-      "dev": true,
       "requires": {
         "is-stream": "^2.0.0",
         "type-fest": "^0.8.0"
@@ -4005,8 +3656,7 @@
         "is-stream": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
-          "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
-          "dev": true
+          "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw=="
         }
       }
     },
@@ -4014,7 +3664,6 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
       "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
-      "dev": true,
       "requires": {
         "hash.js": "^1.0.3",
         "minimalistic-assert": "^1.0.0",
@@ -4024,14 +3673,12 @@
     "html-escaper": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
-      "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
-      "dev": true
+      "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="
     },
     "htmlescape": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz",
-      "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=",
-      "dev": true
+      "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E="
     },
     "http-signature": {
       "version": "1.2.0",
@@ -4047,26 +3694,22 @@
     "https-browserify": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
-      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
-      "dev": true
+      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
     },
     "human-signals": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
-      "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
-      "dev": true
+      "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw=="
     },
     "ieee754": {
       "version": "1.1.13",
       "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
-      "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
-      "dev": true
+      "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
     },
     "imurmurhash": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
-      "dev": true
+      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
     },
     "indent-string": {
       "version": "3.2.0",
@@ -4078,7 +3721,6 @@
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
       "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "dev": true,
       "requires": {
         "once": "^1.3.0",
         "wrappy": "1"
@@ -4087,8 +3729,7 @@
     "inherits": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
-      "dev": true
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
     },
     "ini": {
       "version": "1.3.5",
@@ -4100,7 +3741,6 @@
       "version": "0.6.2",
       "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz",
       "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=",
-      "dev": true,
       "requires": {
         "source-map": "~0.5.3"
       }
@@ -4109,7 +3749,6 @@
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz",
       "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==",
-      "dev": true,
       "requires": {
         "JSONStream": "^1.0.3",
         "acorn-node": "^1.5.2",
@@ -4127,7 +3766,6 @@
       "version": "2.2.4",
       "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
       "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
-      "dev": true,
       "requires": {
         "loose-envify": "^1.0.0"
       }
@@ -4136,7 +3774,6 @@
       "version": "0.1.6",
       "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
       "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-      "dev": true,
       "requires": {
         "kind-of": "^3.0.2"
       },
@@ -4145,7 +3782,6 @@
           "version": "3.2.2",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
           "requires": {
             "is-buffer": "^1.1.5"
           }
@@ -4156,7 +3792,6 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
       "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
-      "dev": true,
       "requires": {
         "binary-extensions": "^1.0.0"
       }
@@ -4164,8 +3799,7 @@
     "is-buffer": {
       "version": "1.1.6",
       "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-      "dev": true
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
     },
     "is-ci": {
       "version": "2.0.0",
@@ -4180,7 +3814,6 @@
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
       "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-      "dev": true,
       "requires": {
         "kind-of": "^3.0.2"
       },
@@ -4189,7 +3822,6 @@
           "version": "3.2.2",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
           "requires": {
             "is-buffer": "^1.1.5"
           }
@@ -4200,7 +3832,6 @@
       "version": "0.1.6",
       "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
       "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-      "dev": true,
       "requires": {
         "is-accessor-descriptor": "^0.1.6",
         "is-data-descriptor": "^0.1.4",
@@ -4210,22 +3841,19 @@
         "kind-of": {
           "version": "5.1.0",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
         }
       }
     },
     "is-extendable": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-      "dev": true
+      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
     },
     "is-extglob": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
-      "dev": true
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
     },
     "is-fullwidth-code-point": {
       "version": "2.0.0",
@@ -4237,7 +3865,6 @@
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
       "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
-      "dev": true,
       "requires": {
         "is-extglob": "^2.1.1"
       }
@@ -4256,7 +3883,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
       "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-      "dev": true,
       "requires": {
         "kind-of": "^3.0.2"
       },
@@ -4265,7 +3891,6 @@
           "version": "3.2.2",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
           "requires": {
             "is-buffer": "^1.1.5"
           }
@@ -4294,7 +3919,6 @@
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
       "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
-      "dev": true,
       "requires": {
         "isobject": "^3.0.1"
       }
@@ -4314,32 +3938,27 @@
     "is-typedarray": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
-      "dev": true
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
     },
     "is-windows": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
-      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
-      "dev": true
+      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
     },
     "isarray": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-      "dev": true
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
     },
     "isexe": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
-      "dev": true
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
     },
     "isobject": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-      "dev": true
+      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
     },
     "isstream": {
       "version": "0.1.2",
@@ -4350,14 +3969,12 @@
     "istanbul-lib-coverage": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz",
-      "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==",
-      "dev": true
+      "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg=="
     },
     "istanbul-lib-hook": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz",
       "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==",
-      "dev": true,
       "requires": {
         "append-transform": "^2.0.0"
       }
@@ -4366,7 +3983,6 @@
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz",
       "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==",
-      "dev": true,
       "requires": {
         "@babel/core": "^7.7.5",
         "@babel/parser": "^7.7.5",
@@ -4381,7 +3997,6 @@
           "version": "7.9.0",
           "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz",
           "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==",
-          "dev": true,
           "requires": {
             "@babel/code-frame": "^7.8.3",
             "@babel/generator": "^7.9.0",
@@ -4404,16 +4019,14 @@
             "semver": {
               "version": "5.7.1",
               "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-              "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-              "dev": true
+              "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
             }
           }
         },
         "semver": {
           "version": "6.3.0",
           "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
         }
       }
     },
@@ -4421,7 +4034,6 @@
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz",
       "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==",
-      "dev": true,
       "requires": {
         "archy": "^1.0.0",
         "cross-spawn": "^7.0.0",
@@ -4436,7 +4048,6 @@
           "version": "7.0.2",
           "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz",
           "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==",
-          "dev": true,
           "requires": {
             "path-key": "^3.1.0",
             "shebang-command": "^2.0.0",
@@ -4447,7 +4058,6 @@
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
           "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
-          "dev": true,
           "requires": {
             "aggregate-error": "^3.0.0"
           }
@@ -4455,14 +4065,12 @@
         "path-key": {
           "version": "3.1.1",
           "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-          "dev": true
+          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
         },
         "rimraf": {
           "version": "3.0.2",
           "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
           "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-          "dev": true,
           "requires": {
             "glob": "^7.1.3"
           }
@@ -4471,7 +4079,6 @@
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
           "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-          "dev": true,
           "requires": {
             "shebang-regex": "^3.0.0"
           }
@@ -4479,14 +4086,12 @@
         "shebang-regex": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-          "dev": true
+          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
         },
         "which": {
           "version": "2.0.2",
           "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
           "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-          "dev": true,
           "requires": {
             "isexe": "^2.0.0"
           }
@@ -4497,7 +4102,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
       "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
-      "dev": true,
       "requires": {
         "istanbul-lib-coverage": "^3.0.0",
         "make-dir": "^3.0.0",
@@ -4508,7 +4112,6 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz",
       "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==",
-      "dev": true,
       "requires": {
         "debug": "^4.1.1",
         "istanbul-lib-coverage": "^3.0.0",
@@ -4518,8 +4121,7 @@
         "source-map": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
         }
       }
     },
@@ -4527,7 +4129,6 @@
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz",
       "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==",
-      "dev": true,
       "requires": {
         "html-escaper": "^2.0.0",
         "istanbul-lib-report": "^3.0.0"
@@ -4536,20 +4137,17 @@
     "js-levenshtein": {
       "version": "1.1.6",
       "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
-      "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==",
-      "dev": true
+      "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g=="
     },
     "js-tokens": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
-      "dev": true
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
     },
     "js-yaml": {
       "version": "3.13.1",
       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
       "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
-      "dev": true,
       "requires": {
         "argparse": "^1.0.7",
         "esprima": "^4.0.0"
@@ -4564,8 +4162,7 @@
     "jsesc": {
       "version": "2.5.2",
       "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
-      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
-      "dev": true
+      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
     },
     "json-schema": {
       "version": "0.2.3",
@@ -4583,7 +4180,6 @@
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz",
       "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=",
-      "dev": true,
       "requires": {
         "jsonify": "~0.0.0"
       }
@@ -4598,7 +4194,6 @@
       "version": "2.1.3",
       "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
       "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
-      "dev": true,
       "requires": {
         "minimist": "^1.2.5"
       }
@@ -4607,7 +4202,6 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
       "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
-      "dev": true,
       "requires": {
         "graceful-fs": "^4.1.6"
       }
@@ -4615,14 +4209,12 @@
     "jsonify": {
       "version": "0.0.0",
       "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
-      "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
-      "dev": true
+      "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
     },
     "jsonparse": {
       "version": "1.3.1",
       "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
-      "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
-      "dev": true
+      "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA="
     },
     "jsprim": {
       "version": "1.4.1",
@@ -4639,14 +4231,12 @@
     "kind-of": {
       "version": "6.0.3",
       "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
-      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
-      "dev": true
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
     },
     "labeled-stream-splicer": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz",
       "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==",
-      "dev": true,
       "requires": {
         "inherits": "^2.0.1",
         "stream-splicer": "^2.0.0"
@@ -4782,7 +4372,6 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
       "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
-      "dev": true,
       "requires": {
         "p-locate": "^2.0.0",
         "path-exists": "^3.0.0"
@@ -4791,26 +4380,22 @@
     "lodash": {
       "version": "4.17.15",
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
-      "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
-      "dev": true
+      "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
     },
     "lodash.clonedeep": {
       "version": "4.5.0",
       "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
-      "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
-      "dev": true
+      "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8="
     },
     "lodash.flattendeep": {
       "version": "4.4.0",
       "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
-      "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=",
-      "dev": true
+      "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI="
     },
     "lodash.memoize": {
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz",
-      "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=",
-      "dev": true
+      "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8="
     },
     "lodash.once": {
       "version": "4.1.1",
@@ -4872,7 +4457,6 @@
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
       "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
-      "dev": true,
       "requires": {
         "js-tokens": "^3.0.0 || ^4.0.0"
       }
@@ -4881,7 +4465,6 @@
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz",
       "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==",
-      "dev": true,
       "requires": {
         "semver": "^6.0.0"
       },
@@ -4889,22 +4472,19 @@
         "semver": {
           "version": "6.3.0",
           "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
         }
       }
     },
     "map-cache": {
       "version": "0.2.2",
       "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
-      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
-      "dev": true
+      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
     },
     "map-visit": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
       "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
-      "dev": true,
       "requires": {
         "object-visit": "^1.0.0"
       }
@@ -4913,7 +4493,6 @@
       "version": "1.3.5",
       "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
       "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
-      "dev": true,
       "requires": {
         "hash-base": "^3.0.0",
         "inherits": "^2.0.1",
@@ -4923,14 +4502,12 @@
     "merge-stream": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
-      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
-      "dev": true
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
     },
     "micromatch": {
       "version": "3.1.10",
       "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
       "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
-      "dev": true,
       "requires": {
         "arr-diff": "^4.0.0",
         "array-unique": "^0.3.2",
@@ -4951,7 +4528,6 @@
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
       "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
-      "dev": true,
       "requires": {
         "bn.js": "^4.0.0",
         "brorand": "^1.0.1"
@@ -4981,20 +4557,17 @@
     "minimalistic-assert": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
-      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
-      "dev": true
+      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
     },
     "minimalistic-crypto-utils": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
-      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
-      "dev": true
+      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
     },
     "minimatch": {
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
       "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "dev": true,
       "requires": {
         "brace-expansion": "^1.1.7"
       }
@@ -5002,14 +4575,12 @@
     "minimist": {
       "version": "1.2.5",
       "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
-      "dev": true
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
     },
     "mixin-deep": {
       "version": "1.3.2",
       "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
       "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
-      "dev": true,
       "requires": {
         "for-in": "^1.0.2",
         "is-extendable": "^1.0.1"
@@ -5019,7 +4590,6 @@
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
           "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-          "dev": true,
           "requires": {
             "is-plain-object": "^2.0.4"
           }
@@ -5030,7 +4600,6 @@
       "version": "0.5.5",
       "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
       "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
-      "dev": true,
       "requires": {
         "minimist": "^1.2.5"
       }
@@ -5039,7 +4608,6 @@
       "version": "6.2.2",
       "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.2.tgz",
       "integrity": "sha512-a9y6yDv5u5I4A+IPHTnqFxcaKr4p50/zxTjcQJaX2ws9tN/W6J6YXnEKhqRyPhl494dkcxx951onSKVezmI+3w==",
-      "dev": true,
       "requires": {
         "JSONStream": "^1.0.3",
         "browser-resolve": "^1.7.0",
@@ -5067,14 +4635,12 @@
     "ms": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
     },
     "nan": {
       "version": "2.14.0",
       "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
       "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
-      "dev": true,
       "optional": true
     },
     "nanoid": {
@@ -5086,7 +4652,6 @@
       "version": "1.2.13",
       "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
       "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
-      "dev": true,
       "requires": {
         "arr-diff": "^4.0.0",
         "array-unique": "^0.3.2",
@@ -5111,7 +4676,6 @@
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz",
       "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==",
-      "dev": true,
       "requires": {
         "process-on-spawn": "^1.0.0"
       }
@@ -5119,14 +4683,12 @@
     "node-releases": {
       "version": "1.1.53",
       "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz",
-      "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==",
-      "dev": true
+      "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ=="
     },
     "normalize-path": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-      "dev": true
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
     },
     "npm-run-path": {
       "version": "2.0.2",
@@ -5147,7 +4709,6 @@
       "version": "15.0.1",
       "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.1.tgz",
       "integrity": "sha512-n0MBXYBYRqa67IVt62qW1r/d9UH/Qtr7SF1w/nQLJ9KxvWF6b2xCHImRAixHN9tnMMYHC2P14uo6KddNGwMgGg==",
-      "dev": true,
       "requires": {
         "@istanbuljs/load-nyc-config": "^1.0.0",
         "@istanbuljs/schema": "^0.1.2",
@@ -5181,7 +4742,6 @@
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
           "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-          "dev": true,
           "requires": {
             "locate-path": "^5.0.0",
             "path-exists": "^4.0.0"
@@ -5191,7 +4751,6 @@
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
           "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-          "dev": true,
           "requires": {
             "p-locate": "^4.1.0"
           }
@@ -5200,7 +4759,6 @@
           "version": "2.3.0",
           "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
           "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-          "dev": true,
           "requires": {
             "p-try": "^2.0.0"
           }
@@ -5209,7 +4767,6 @@
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
           "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-          "dev": true,
           "requires": {
             "p-limit": "^2.2.0"
           }
@@ -5218,7 +4775,6 @@
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
           "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
-          "dev": true,
           "requires": {
             "aggregate-error": "^3.0.0"
           }
@@ -5226,20 +4782,17 @@
         "p-try": {
           "version": "2.2.0",
           "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-          "dev": true
+          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
         },
         "path-exists": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-          "dev": true
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
         },
         "rimraf": {
           "version": "3.0.2",
           "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
           "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-          "dev": true,
           "requires": {
             "glob": "^7.1.3"
           }
@@ -5255,14 +4808,12 @@
     "object-assign": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
-      "dev": true
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
     },
     "object-copy": {
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
       "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
-      "dev": true,
       "requires": {
         "copy-descriptor": "^0.1.0",
         "define-property": "^0.2.5",
@@ -5273,7 +4824,6 @@
           "version": "0.2.5",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
           "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
           "requires": {
             "is-descriptor": "^0.1.0"
           }
@@ -5282,7 +4832,6 @@
           "version": "3.2.2",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
           "requires": {
             "is-buffer": "^1.1.5"
           }
@@ -5292,14 +4841,12 @@
     "object-keys": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-      "dev": true
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
     },
     "object-visit": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
       "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
-      "dev": true,
       "requires": {
         "isobject": "^3.0.0"
       }
@@ -5308,7 +4855,6 @@
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
       "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
-      "dev": true,
       "requires": {
         "define-properties": "^1.1.2",
         "function-bind": "^1.1.1",
@@ -5320,7 +4866,6 @@
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
       "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
-      "dev": true,
       "requires": {
         "isobject": "^3.0.1"
       }
@@ -5329,7 +4874,6 @@
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
       "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dev": true,
       "requires": {
         "wrappy": "1"
       }
@@ -5343,8 +4887,7 @@
     "os-browserify": {
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
-      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
-      "dev": true
+      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc="
     },
     "ospath": {
       "version": "1.2.2",
@@ -5356,7 +4899,6 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz",
       "integrity": "sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I=",
-      "dev": true,
       "requires": {
         "shell-quote": "^1.4.2"
       }
@@ -5371,7 +4913,6 @@
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
       "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
-      "dev": true,
       "requires": {
         "p-try": "^1.0.0"
       }
@@ -5380,7 +4921,6 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
       "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
-      "dev": true,
       "requires": {
         "p-limit": "^1.1.0"
       }
@@ -5394,14 +4934,12 @@
     "p-try": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
-      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
-      "dev": true
+      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
     },
     "package-hash": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz",
       "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==",
-      "dev": true,
       "requires": {
         "graceful-fs": "^4.1.15",
         "hasha": "^5.0.0",
@@ -5412,14 +4950,12 @@
     "pako": {
       "version": "1.0.11",
       "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
-      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
-      "dev": true
+      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
     },
     "parents": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
       "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=",
-      "dev": true,
       "requires": {
         "path-platform": "~0.11.15"
       }
@@ -5428,7 +4964,6 @@
       "version": "5.1.5",
       "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz",
       "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==",
-      "dev": true,
       "requires": {
         "asn1.js": "^4.0.0",
         "browserify-aes": "^1.0.0",
@@ -5441,32 +4976,27 @@
     "pascalcase": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
-      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
-      "dev": true
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
     },
     "path-browserify": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
-      "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
-      "dev": true
+      "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ=="
     },
     "path-dirname": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
-      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
-      "dev": true
+      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA="
     },
     "path-exists": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
-      "dev": true
+      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
     },
     "path-is-absolute": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-      "dev": true
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
     },
     "path-is-inside": {
       "version": "1.0.2",
@@ -5483,20 +5013,17 @@
     "path-parse": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
-      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
-      "dev": true
+      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
     },
     "path-platform": {
       "version": "0.11.15",
       "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
-      "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=",
-      "dev": true
+      "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I="
     },
     "pbkdf2": {
       "version": "3.0.17",
       "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
       "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==",
-      "dev": true,
       "requires": {
         "create-hash": "^1.1.2",
         "create-hmac": "^1.1.4",
@@ -5527,7 +5054,6 @@
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
       "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
-      "dev": true,
       "requires": {
         "find-up": "^4.0.0"
       },
@@ -5536,7 +5062,6 @@
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
           "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-          "dev": true,
           "requires": {
             "locate-path": "^5.0.0",
             "path-exists": "^4.0.0"
@@ -5546,7 +5071,6 @@
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
           "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-          "dev": true,
           "requires": {
             "p-locate": "^4.1.0"
           }
@@ -5555,7 +5079,6 @@
           "version": "2.3.0",
           "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
           "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-          "dev": true,
           "requires": {
             "p-try": "^2.0.0"
           }
@@ -5564,7 +5087,6 @@
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
           "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-          "dev": true,
           "requires": {
             "p-limit": "^2.2.0"
           }
@@ -5572,14 +5094,12 @@
         "p-try": {
           "version": "2.2.0",
           "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-          "dev": true
+          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
         },
         "path-exists": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-          "dev": true
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
         }
       }
     },
@@ -5587,7 +5107,6 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz",
       "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=",
-      "dev": true,
       "requires": {
         "find-up": "^2.1.0"
       }
@@ -5595,8 +5114,7 @@
     "posix-character-classes": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
-      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
-      "dev": true
+      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
     },
     "pretty-bytes": {
       "version": "5.3.0",
@@ -5607,26 +5125,22 @@
     "private": {
       "version": "0.1.8",
       "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
-      "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
-      "dev": true
+      "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg=="
     },
     "process": {
       "version": "0.11.10",
       "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
-      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
-      "dev": true
+      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
     },
     "process-nextick-args": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
-      "dev": true
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
     },
     "process-on-spawn": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz",
       "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==",
-      "dev": true,
       "requires": {
         "fromentries": "^1.2.0"
       }
@@ -5641,7 +5155,6 @@
       "version": "4.0.3",
       "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
       "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
-      "dev": true,
       "requires": {
         "bn.js": "^4.1.0",
         "browserify-rsa": "^4.0.0",
@@ -5655,7 +5168,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
       "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
-      "dev": true,
       "requires": {
         "end-of-stream": "^1.1.0",
         "once": "^1.3.1"
@@ -5676,14 +5188,12 @@
     "querystring": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
-      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
-      "dev": true
+      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
     },
     "querystring-es3": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
-      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
-      "dev": true
+      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM="
     },
     "ramda": {
       "version": "0.26.1",
@@ -5695,7 +5205,6 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
       "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
-      "dev": true,
       "requires": {
         "safe-buffer": "^5.1.0"
       }
@@ -5704,7 +5213,6 @@
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
       "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
-      "dev": true,
       "requires": {
         "randombytes": "^2.0.5",
         "safe-buffer": "^5.1.0"
@@ -5714,7 +5222,6 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz",
       "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=",
-      "dev": true,
       "requires": {
         "readable-stream": "^2.0.2"
       }
@@ -5723,7 +5230,6 @@
       "version": "2.3.7",
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
       "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-      "dev": true,
       "requires": {
         "core-util-is": "~1.0.0",
         "inherits": "~2.0.3",
@@ -5737,8 +5243,7 @@
         "safe-buffer": {
           "version": "5.1.2",
           "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-          "dev": true
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
         }
       }
     },
@@ -5746,7 +5251,6 @@
       "version": "2.2.1",
       "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
       "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
-      "dev": true,
       "requires": {
         "graceful-fs": "^4.1.11",
         "micromatch": "^3.1.10",
@@ -5756,14 +5260,12 @@
     "regenerate": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
-      "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
-      "dev": true
+      "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg=="
     },
     "regenerate-unicode-properties": {
       "version": "8.2.0",
       "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
       "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
-      "dev": true,
       "requires": {
         "regenerate": "^1.4.0"
       }
@@ -5771,14 +5273,12 @@
     "regenerator-runtime": {
       "version": "0.13.5",
       "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
-      "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==",
-      "dev": true
+      "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
     },
     "regenerator-transform": {
       "version": "0.14.4",
       "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz",
       "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==",
-      "dev": true,
       "requires": {
         "@babel/runtime": "^7.8.4",
         "private": "^0.1.8"
@@ -5788,7 +5288,6 @@
           "version": "7.9.2",
           "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
           "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
-          "dev": true,
           "requires": {
             "regenerator-runtime": "^0.13.4"
           }
@@ -5799,7 +5298,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
       "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
-      "dev": true,
       "requires": {
         "extend-shallow": "^3.0.2",
         "safe-regex": "^1.1.0"
@@ -5809,7 +5307,6 @@
       "version": "4.7.0",
       "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz",
       "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==",
-      "dev": true,
       "requires": {
         "regenerate": "^1.4.0",
         "regenerate-unicode-properties": "^8.2.0",
@@ -5822,14 +5319,12 @@
     "regjsgen": {
       "version": "0.5.1",
       "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz",
-      "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==",
-      "dev": true
+      "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg=="
     },
     "regjsparser": {
       "version": "0.6.4",
       "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz",
       "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==",
-      "dev": true,
       "requires": {
         "jsesc": "~0.5.0"
       },
@@ -5837,8 +5332,7 @@
         "jsesc": {
           "version": "0.5.0",
           "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
-          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
-          "dev": true
+          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0="
         }
       }
     },
@@ -5846,7 +5340,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz",
       "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=",
-      "dev": true,
       "requires": {
         "es6-error": "^4.0.1"
       }
@@ -5854,20 +5347,17 @@
     "remove-trailing-separator": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
-      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
-      "dev": true
+      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
     },
     "repeat-element": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
-      "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
-      "dev": true
+      "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g=="
     },
     "repeat-string": {
       "version": "1.6.1",
       "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
-      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
-      "dev": true
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
     },
     "request-progress": {
       "version": "3.0.0",
@@ -5881,20 +5371,17 @@
     "require-directory": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
-      "dev": true
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
     },
     "require-main-filename": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
-      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
-      "dev": true
+      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
     },
     "resolve": {
       "version": "1.15.1",
       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
       "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
-      "dev": true,
       "requires": {
         "path-parse": "^1.0.6"
       }
@@ -5902,14 +5389,12 @@
     "resolve-from": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
-      "dev": true
+      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="
     },
     "resolve-url": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
-      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
-      "dev": true
+      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
     },
     "restore-cursor": {
       "version": "1.0.1",
@@ -5924,8 +5409,7 @@
     "ret": {
       "version": "0.1.15",
       "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
-      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
-      "dev": true
+      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
     },
     "rimraf": {
       "version": "2.7.1",
@@ -5940,7 +5424,6 @@
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
       "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
-      "dev": true,
       "requires": {
         "hash-base": "^3.0.0",
         "inherits": "^2.0.1"
@@ -5958,14 +5441,12 @@
     "safe-buffer": {
       "version": "5.2.0",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
-      "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
-      "dev": true
+      "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
     },
     "safe-regex": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
       "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
-      "dev": true,
       "requires": {
         "ret": "~0.1.10"
       }
@@ -5979,20 +5460,17 @@
     "semver": {
       "version": "5.7.1",
       "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-      "dev": true
+      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
     },
     "set-blocking": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
-      "dev": true
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
     },
     "set-value": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
       "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
-      "dev": true,
       "requires": {
         "extend-shallow": "^2.0.1",
         "is-extendable": "^0.1.1",
@@ -6004,7 +5482,6 @@
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
           "requires": {
             "is-extendable": "^0.1.0"
           }
@@ -6015,7 +5492,6 @@
       "version": "2.4.11",
       "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
       "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
-      "dev": true,
       "requires": {
         "inherits": "^2.0.1",
         "safe-buffer": "^5.0.1"
@@ -6025,7 +5501,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz",
       "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=",
-      "dev": true,
       "requires": {
         "json-stable-stringify": "~0.0.0",
         "sha.js": "~2.4.4"
@@ -6035,7 +5510,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz",
       "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==",
-      "dev": true,
       "requires": {
         "fast-safe-stringify": "^2.0.7"
       }
@@ -6058,8 +5532,7 @@
     "shell-quote": {
       "version": "1.7.2",
       "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz",
-      "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==",
-      "dev": true
+      "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg=="
     },
     "shortid": {
       "version": "2.2.15",
@@ -6072,14 +5545,12 @@
     "signal-exit": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
-      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
-      "dev": true
+      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
     },
     "simple-concat": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz",
-      "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=",
-      "dev": true
+      "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY="
     },
     "slice-ansi": {
       "version": "0.0.4",
@@ -6091,7 +5562,6 @@
       "version": "0.8.2",
       "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
       "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
-      "dev": true,
       "requires": {
         "base": "^0.11.1",
         "debug": "^2.2.0",
@@ -6107,7 +5577,6 @@
           "version": "2.6.9",
           "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
           "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
           "requires": {
             "ms": "2.0.0"
           }
@@ -6116,7 +5585,6 @@
           "version": "0.2.5",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
           "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
           "requires": {
             "is-descriptor": "^0.1.0"
           }
@@ -6125,7 +5593,6 @@
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
           "requires": {
             "is-extendable": "^0.1.0"
           }
@@ -6133,8 +5600,7 @@
         "ms": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
         }
       }
     },
@@ -6142,7 +5608,6 @@
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
       "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
-      "dev": true,
       "requires": {
         "define-property": "^1.0.0",
         "isobject": "^3.0.0",
@@ -6153,7 +5618,6 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
           "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
           "requires": {
             "is-descriptor": "^1.0.0"
           }
@@ -6162,7 +5626,6 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
           "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
           "requires": {
             "kind-of": "^6.0.0"
           }
@@ -6171,7 +5634,6 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
           "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
           "requires": {
             "kind-of": "^6.0.0"
           }
@@ -6180,7 +5642,6 @@
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
           "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
           "requires": {
             "is-accessor-descriptor": "^1.0.0",
             "is-data-descriptor": "^1.0.0",
@@ -6193,7 +5654,6 @@
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
       "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
-      "dev": true,
       "requires": {
         "kind-of": "^3.2.0"
       },
@@ -6202,7 +5662,6 @@
           "version": "3.2.2",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
           "requires": {
             "is-buffer": "^1.1.5"
           }
@@ -6212,14 +5671,12 @@
     "source-map": {
       "version": "0.5.7",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-      "dev": true
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
     },
     "source-map-resolve": {
       "version": "0.5.3",
       "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
       "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
-      "dev": true,
       "requires": {
         "atob": "^2.1.2",
         "decode-uri-component": "^0.2.0",
@@ -6231,14 +5688,12 @@
     "source-map-url": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
-      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
-      "dev": true
+      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
     },
     "spawn-wrap": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz",
       "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==",
-      "dev": true,
       "requires": {
         "foreground-child": "^2.0.0",
         "is-windows": "^1.0.2",
@@ -6252,7 +5707,6 @@
           "version": "3.0.2",
           "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
           "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-          "dev": true,
           "requires": {
             "glob": "^7.1.3"
           }
@@ -6261,7 +5715,6 @@
           "version": "2.0.2",
           "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
           "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-          "dev": true,
           "requires": {
             "isexe": "^2.0.0"
           }
@@ -6272,7 +5725,6 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
       "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
-      "dev": true,
       "requires": {
         "extend-shallow": "^3.0.0"
       }
@@ -6280,8 +5732,7 @@
     "sprintf-js": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
-      "dev": true
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
     },
     "sshpk": {
       "version": "1.16.1",
@@ -6304,7 +5755,6 @@
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
       "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
-      "dev": true,
       "requires": {
         "define-property": "^0.2.5",
         "object-copy": "^0.1.0"
@@ -6314,7 +5764,6 @@
           "version": "0.2.5",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
           "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
           "requires": {
             "is-descriptor": "^0.1.0"
           }
@@ -6325,7 +5774,6 @@
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
       "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
-      "dev": true,
       "requires": {
         "inherits": "~2.0.1",
         "readable-stream": "^2.0.2"
@@ -6335,7 +5783,6 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
       "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=",
-      "dev": true,
       "requires": {
         "duplexer2": "~0.1.0",
         "readable-stream": "^2.0.2"
@@ -6345,7 +5792,6 @@
       "version": "2.8.3",
       "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
       "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
-      "dev": true,
       "requires": {
         "builtin-status-codes": "^3.0.0",
         "inherits": "^2.0.1",
@@ -6358,7 +5804,6 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz",
       "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==",
-      "dev": true,
       "requires": {
         "inherits": "^2.0.1",
         "readable-stream": "^2.0.2"
@@ -6395,7 +5840,6 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
       "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "dev": true,
       "requires": {
         "safe-buffer": "~5.1.0"
       },
@@ -6403,8 +5847,7 @@
         "safe-buffer": {
           "version": "5.1.2",
           "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-          "dev": true
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
         }
       }
     },
@@ -6420,8 +5863,7 @@
     "strip-bom": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
-      "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
-      "dev": true
+      "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="
     },
     "strip-eof": {
       "version": "1.0.0",
@@ -6432,14 +5874,12 @@
     "strip-final-newline": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
-      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
-      "dev": true
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="
     },
     "subarg": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
       "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=",
-      "dev": true,
       "requires": {
         "minimist": "^1.1.0"
       }
@@ -6448,7 +5888,6 @@
       "version": "7.1.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
       "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
-      "dev": true,
       "requires": {
         "has-flag": "^4.0.0"
       },
@@ -6456,8 +5895,7 @@
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
         }
       }
     },
@@ -6471,7 +5909,6 @@
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz",
       "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==",
-      "dev": true,
       "requires": {
         "acorn-node": "^1.2.0"
       }
@@ -6480,7 +5917,6 @@
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
       "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
-      "dev": true,
       "requires": {
         "@istanbuljs/schema": "^0.1.2",
         "glob": "^7.1.4",
@@ -6496,14 +5932,12 @@
     "through": {
       "version": "2.3.8",
       "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
-      "dev": true
+      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
     },
     "through2": {
       "version": "2.0.5",
       "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
       "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
-      "dev": true,
       "requires": {
         "readable-stream": "~2.3.6",
         "xtend": "~4.0.1"
@@ -6513,7 +5947,6 @@
       "version": "1.4.2",
       "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz",
       "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=",
-      "dev": true,
       "requires": {
         "process": "~0.11.0"
       }
@@ -6530,20 +5963,17 @@
     "to-arraybuffer": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
-      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
-      "dev": true
+      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M="
     },
     "to-fast-properties": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
-      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
-      "dev": true
+      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
     },
     "to-object-path": {
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
       "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
-      "dev": true,
       "requires": {
         "kind-of": "^3.0.2"
       },
@@ -6552,7 +5982,6 @@
           "version": "3.2.2",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
           "requires": {
             "is-buffer": "^1.1.5"
           }
@@ -6563,7 +5992,6 @@
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
       "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
-      "dev": true,
       "requires": {
         "define-property": "^2.0.2",
         "extend-shallow": "^3.0.2",
@@ -6575,7 +6003,6 @@
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
       "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
-      "dev": true,
       "requires": {
         "is-number": "^3.0.0",
         "repeat-string": "^1.6.1"
@@ -6600,8 +6027,7 @@
     "tty-browserify": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
-      "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==",
-      "dev": true
+      "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw=="
     },
     "tunnel-agent": {
       "version": "0.6.0",
@@ -6621,20 +6047,17 @@
     "type-fest": {
       "version": "0.8.1",
       "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
-      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
-      "dev": true
+      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
     },
     "typedarray": {
       "version": "0.0.6",
       "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
-      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
-      "dev": true
+      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
     },
     "typedarray-to-buffer": {
       "version": "3.1.5",
       "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
       "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
-      "dev": true,
       "requires": {
         "is-typedarray": "^1.0.0"
       }
@@ -6642,14 +6065,12 @@
     "umd": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz",
-      "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==",
-      "dev": true
+      "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow=="
     },
     "undeclared-identifiers": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz",
       "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==",
-      "dev": true,
       "requires": {
         "acorn-node": "^1.3.0",
         "dash-ast": "^1.0.0",
@@ -6661,14 +6082,12 @@
     "unicode-canonical-property-names-ecmascript": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
-      "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
-      "dev": true
+      "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ=="
     },
     "unicode-match-property-ecmascript": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
       "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
-      "dev": true,
       "requires": {
         "unicode-canonical-property-names-ecmascript": "^1.0.4",
         "unicode-property-aliases-ecmascript": "^1.0.4"
@@ -6677,20 +6096,17 @@
     "unicode-match-property-value-ecmascript": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz",
-      "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==",
-      "dev": true
+      "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ=="
     },
     "unicode-property-aliases-ecmascript": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz",
-      "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==",
-      "dev": true
+      "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg=="
     },
     "union-value": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
       "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
-      "dev": true,
       "requires": {
         "arr-union": "^3.1.0",
         "get-value": "^2.0.6",
@@ -6701,14 +6117,12 @@
     "universalify": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
-      "dev": true
+      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
     },
     "unset-value": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
       "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
-      "dev": true,
       "requires": {
         "has-value": "^0.3.1",
         "isobject": "^3.0.0"
@@ -6718,7 +6132,6 @@
           "version": "0.3.1",
           "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
           "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
-          "dev": true,
           "requires": {
             "get-value": "^2.0.3",
             "has-values": "^0.1.4",
@@ -6729,7 +6142,6 @@
               "version": "2.1.0",
               "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
               "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
-              "dev": true,
               "requires": {
                 "isarray": "1.0.0"
               }
@@ -6739,8 +6151,7 @@
         "has-values": {
           "version": "0.1.4",
           "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
-          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
-          "dev": true
+          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
         }
       }
     },
@@ -6753,8 +6164,7 @@
     "upath": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
-      "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
-      "dev": true
+      "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg=="
     },
     "uri-js": {
       "version": "4.2.2",
@@ -6768,14 +6178,12 @@
     "urix": {
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
-      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
-      "dev": true
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
     },
     "url": {
       "version": "0.11.0",
       "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
       "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
-      "dev": true,
       "requires": {
         "punycode": "1.3.2",
         "querystring": "0.2.0"
@@ -6784,22 +6192,19 @@
         "punycode": {
           "version": "1.3.2",
           "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
-          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
-          "dev": true
+          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
         }
       }
     },
     "use": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
-      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
-      "dev": true
+      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
     },
     "util": {
       "version": "0.10.4",
       "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
       "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
-      "dev": true,
       "requires": {
         "inherits": "2.0.3"
       },
@@ -6807,22 +6212,19 @@
         "inherits": {
           "version": "2.0.3",
           "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
-          "dev": true
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
         }
       }
     },
     "util-deprecate": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
-      "dev": true
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
     },
     "uuid": {
       "version": "3.4.0",
       "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
-      "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
-      "dev": true
+      "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
     },
     "verror": {
       "version": "1.10.0",
@@ -6838,14 +6240,12 @@
     "vm-browserify": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
-      "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
-      "dev": true
+      "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ=="
     },
     "watchify": {
       "version": "3.11.1",
       "resolved": "https://registry.npmjs.org/watchify/-/watchify-3.11.1.tgz",
       "integrity": "sha512-WwnUClyFNRMB2NIiHgJU9RQPQNqVeFk7OmZaWf5dC5EnNa0Mgr7imBydbaJ7tGTuPM2hz1Cb4uiBvK9NVxMfog==",
-      "dev": true,
       "requires": {
         "anymatch": "^2.0.0",
         "browserify": "^16.1.0",
@@ -6868,8 +6268,7 @@
     "which-module": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
-      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
-      "dev": true
+      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
     },
     "wrap-ansi": {
       "version": "3.0.1",
@@ -6901,14 +6300,12 @@
     "wrappy": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
-      "dev": true
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
     },
     "write-file-atomic": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
       "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
-      "dev": true,
       "requires": {
         "imurmurhash": "^0.1.4",
         "is-typedarray": "^1.0.0",
@@ -6919,20 +6316,17 @@
     "xtend": {
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
-      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
-      "dev": true
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
     },
     "y18n": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
-      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
-      "dev": true
+      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w=="
     },
     "yargs": {
       "version": "15.3.1",
       "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz",
       "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==",
-      "dev": true,
       "requires": {
         "cliui": "^6.0.0",
         "decamelize": "^1.2.0",
@@ -6950,14 +6344,12 @@
         "ansi-regex": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
-          "dev": true
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
         },
         "find-up": {
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
           "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-          "dev": true,
           "requires": {
             "locate-path": "^5.0.0",
             "path-exists": "^4.0.0"
@@ -6966,14 +6358,12 @@
         "is-fullwidth-code-point": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-          "dev": true
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
         },
         "locate-path": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
           "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-          "dev": true,
           "requires": {
             "p-locate": "^4.1.0"
           }
@@ -6982,7 +6372,6 @@
           "version": "2.3.0",
           "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
           "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-          "dev": true,
           "requires": {
             "p-try": "^2.0.0"
           }
@@ -6991,7 +6380,6 @@
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
           "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-          "dev": true,
           "requires": {
             "p-limit": "^2.2.0"
           }
@@ -6999,20 +6387,17 @@
         "p-try": {
           "version": "2.2.0",
           "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-          "dev": true
+          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
         },
         "path-exists": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-          "dev": true
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
         },
         "string-width": {
           "version": "4.2.0",
           "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
           "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
-          "dev": true,
           "requires": {
             "emoji-regex": "^8.0.0",
             "is-fullwidth-code-point": "^3.0.0",
@@ -7023,7 +6408,6 @@
           "version": "6.0.0",
           "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
           "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
-          "dev": true,
           "requires": {
             "ansi-regex": "^5.0.0"
           }
@@ -7034,7 +6418,6 @@
       "version": "18.1.2",
       "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz",
       "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==",
-      "dev": true,
       "requires": {
         "camelcase": "^5.0.0",
         "decamelize": "^1.2.0"
diff --git a/superset-frontend/cypress-base/package.json b/superset-frontend/cypress-base/package.json
index ea8cc34..f7ba0e2 100644
--- a/superset-frontend/cypress-base/package.json
+++ b/superset-frontend/cypress-base/package.json
@@ -9,10 +9,10 @@
   "author": "Apcahe",
   "license": "Apache-2.0",
   "dependencies": {
-    "shortid": "^2.2.15"
+    "shortid": "^2.2.15",
+    "@cypress/code-coverage": "^3.1.0"
   },
   "devDependencies": {
-    "@cypress/code-coverage": "^3.1.0",
     "cypress": "4.3.0",
     "eslint-plugin-cypress": "^2.10.3"
   }
diff --git a/superset-frontend/jsconfig.json b/superset-frontend/jsconfig.json
new file mode 100644
index 0000000..af4aef6
--- /dev/null
+++ b/superset-frontend/jsconfig.json
@@ -0,0 +1,8 @@
+{
+  "compilerOptions": {
+    "baseUrl": ".",
+    "paths": {
+      "src/*": ["./src/*"]
+    }
+  }
+}
diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json
index e578449..ee0b820 100644
--- a/superset-frontend/package-lock.json
+++ b/superset-frontend/package-lock.json
@@ -13606,9 +13606,9 @@
       }
     },
     "eslint-config-prettier": {
-      "version": "6.10.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.10.0.tgz",
-      "integrity": "sha512-AtndijGte1rPILInUdHjvKEGbIV06NuvPrqlIEaEaWtbtvJh464mDeyGMdZEQMsGvC0ZVkiex1fSNcC4HAbRGg==",
+      "version": "6.11.0",
+      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz",
+      "integrity": "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==",
       "dev": true,
       "requires": {
         "get-stdin": "^6.0.0"
@@ -13805,9 +13805,9 @@
       "dev": true
     },
     "eslint-plugin-prettier": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz",
-      "integrity": "sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA==",
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.3.tgz",
+      "integrity": "sha512-+HG5jmu/dN3ZV3T6eCD7a4BlAySdN7mLIbJYo0z1cFQuI+r2DiTJEFeF68ots93PsnrMxbzIZ2S/ieX+mkrBeQ==",
       "dev": true,
       "requires": {
         "prettier-linter-helpers": "^1.0.0"
@@ -23997,9 +23997,9 @@
       "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
     },
     "prettier": {
-      "version": "1.19.1",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz",
-      "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==",
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz",
+      "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==",
       "dev": true
     },
     "prettier-linter-helpers": {
diff --git a/superset-frontend/package.json b/superset-frontend/package.json
index 67cbc90..08b998f 100644
--- a/superset-frontend/package.json
+++ b/superset-frontend/package.json
@@ -213,14 +213,14 @@
     "enzyme-adapter-react-16": "^1.14.0",
     "eslint": "^6.2.2",
     "eslint-config-airbnb": "^15.0.1",
-    "eslint-config-prettier": "^6.10.0",
+    "eslint-config-prettier": "^6.11.0",
     "eslint-import-resolver-webpack": "^0.10.1",
     "eslint-plugin-cypress": "^2.0.1",
     "eslint-plugin-import": "^2.2.0",
     "eslint-plugin-jest": "^21.24.1",
     "eslint-plugin-jsx-a11y": "^5.1.1",
     "eslint-plugin-no-only-tests": "^2.0.1",
-    "eslint-plugin-prettier": "^3.1.2",
+    "eslint-plugin-prettier": "^3.1.3",
     "eslint-plugin-react": "^7.16.0",
     "exports-loader": "^0.7.0",
     "fetch-mock": "^7.0.0-alpha.6",
@@ -235,7 +235,7 @@
     "mini-css-extract-plugin": "^0.4.0",
     "optimize-css-assets-webpack-plugin": "^5.0.1",
     "po2json": "^0.4.5",
-    "prettier": "^1.19.1",
+    "prettier": "^2.0.5",
     "react-test-renderer": "^16.9.0",
     "redux-mock-store": "^1.2.3",
     "sinon": "^4.5.0",
diff --git a/superset-frontend/spec/javascripts/CRUD/CollectionTable_spec.jsx b/superset-frontend/spec/javascripts/CRUD/CollectionTable_spec.jsx
index 119947a..be09aab 100644
--- a/superset-frontend/spec/javascripts/CRUD/CollectionTable_spec.jsx
+++ b/superset-frontend/spec/javascripts/CRUD/CollectionTable_spec.jsx
@@ -19,7 +19,7 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import CollectionTable from '../../../src/CRUD/CollectionTable';
+import CollectionTable from 'src/CRUD/CollectionTable';
 import mockDatasource from '../../fixtures/mockDatasource';
 
 const props = {
diff --git a/superset-frontend/spec/javascripts/addSlice/AddSliceContainer_spec.jsx b/superset-frontend/spec/javascripts/addSlice/AddSliceContainer_spec.jsx
index a399d22..9ca11cb 100644
--- a/superset-frontend/spec/javascripts/addSlice/AddSliceContainer_spec.jsx
+++ b/superset-frontend/spec/javascripts/addSlice/AddSliceContainer_spec.jsx
@@ -21,8 +21,8 @@ import { shallow } from 'enzyme';
 import { Button } from 'react-bootstrap';
 import Select from 'react-virtualized-select';
 
-import AddSliceContainer from '../../../src/addSlice/AddSliceContainer';
-import VizTypeControl from '../../../src/explore/components/controls/VizTypeControl';
+import AddSliceContainer from 'src/addSlice/AddSliceContainer';
+import VizTypeControl from 'src/explore/components/controls/VizTypeControl';
 
 const defaultProps = {
   datasources: [
@@ -53,10 +53,7 @@ describe('AddSliceContainer', () => {
 
   it('renders a disabled button if no datasource is selected', () => {
     expect(
-      wrapper
-        .find(Button)
-        .dive()
-        .find('.btn[disabled=true]'),
+      wrapper.find(Button).dive().find('.btn[disabled=true]'),
     ).toHaveLength(1);
   });
 
@@ -68,10 +65,7 @@ describe('AddSliceContainer', () => {
       datasourceType: datasourceValue.split('__')[1],
     });
     expect(
-      wrapper
-        .find(Button)
-        .dive()
-        .find('.btn[disabled=false]'),
+      wrapper.find(Button).dive().find('.btn[disabled=false]'),
     ).toHaveLength(1);
   });
 
diff --git a/superset-frontend/spec/javascripts/chart/ChartRenderer_spec.jsx b/superset-frontend/spec/javascripts/chart/ChartRenderer_spec.jsx
index e270df9..1a383fc 100644
--- a/superset-frontend/spec/javascripts/chart/ChartRenderer_spec.jsx
+++ b/superset-frontend/spec/javascripts/chart/ChartRenderer_spec.jsx
@@ -20,7 +20,7 @@ import React from 'react';
 import { shallow } from 'enzyme';
 import { SuperChart } from '@superset-ui/chart';
 
-import ChartRenderer from '../../../src/chart/ChartRenderer';
+import ChartRenderer from 'src/chart/ChartRenderer';
 
 describe('ChartRenderer', () => {
   it('should render SuperChart', () => {
diff --git a/superset-frontend/spec/javascripts/chart/chartActions_spec.js b/superset-frontend/spec/javascripts/chart/chartActions_spec.js
index a4621dd..c33c4b9 100644
--- a/superset-frontend/spec/javascripts/chart/chartActions_spec.js
+++ b/superset-frontend/spec/javascripts/chart/chartActions_spec.js
@@ -20,9 +20,9 @@ import fetchMock from 'fetch-mock';
 import sinon from 'sinon';
 
 import * as chartlib from '@superset-ui/chart';
-import { LOG_EVENT } from '../../../src/logger/actions';
-import * as exploreUtils from '../../../src/explore/exploreUtils';
-import * as actions from '../../../src/chart/chartAction';
+import { LOG_EVENT } from 'src/logger/actions';
+import * as exploreUtils from 'src/explore/exploreUtils';
+import * as actions from 'src/chart/chartAction';
 
 describe('chart actions', () => {
   const V1_URL = '/http//localhost/api/v1/chart/data';
diff --git a/superset-frontend/spec/javascripts/chart/chartReducers_spec.js b/superset-frontend/spec/javascripts/chart/chartReducers_spec.js
index f2f83c8..0ecd7ab 100644
--- a/superset-frontend/spec/javascripts/chart/chartReducers_spec.js
+++ b/superset-frontend/spec/javascripts/chart/chartReducers_spec.js
@@ -16,8 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import chartReducer, { chart } from '../../../src/chart/chartReducer';
-import * as actions from '../../../src/chart/chartAction';
+import chartReducer, { chart } from 'src/chart/chartReducer';
+import * as actions from 'src/chart/chartAction';
 
 describe('chart reducers', () => {
   const chartKey = 1;
diff --git a/superset-frontend/spec/javascripts/components/AlteredSliceTag_spec.jsx b/superset-frontend/spec/javascripts/components/AlteredSliceTag_spec.jsx
index 6adf397..5ff79ff 100644
--- a/superset-frontend/spec/javascripts/components/AlteredSliceTag_spec.jsx
+++ b/superset-frontend/spec/javascripts/components/AlteredSliceTag_spec.jsx
@@ -21,9 +21,9 @@ import { shallow } from 'enzyme';
 import { Table, Thead, Td, Th, Tr } from 'reactable-arc';
 import { getChartControlPanelRegistry } from '@superset-ui/chart';
 
-import AlteredSliceTag from '../../../src/components/AlteredSliceTag';
-import ModalTrigger from '../../../src/components/ModalTrigger';
-import TooltipWrapper from '../../../src/components/TooltipWrapper';
+import AlteredSliceTag from 'src/components/AlteredSliceTag';
+import ModalTrigger from 'src/components/ModalTrigger';
+import TooltipWrapper from 'src/components/TooltipWrapper';
 
 const defaultProps = {
   origFormData: {
diff --git a/superset-frontend/spec/javascripts/components/AnchorLink_spec.jsx b/superset-frontend/spec/javascripts/components/AnchorLink_spec.jsx
index 93dd0a4..6b9dc4b 100644
--- a/superset-frontend/spec/javascripts/components/AnchorLink_spec.jsx
+++ b/superset-frontend/spec/javascripts/components/AnchorLink_spec.jsx
@@ -19,8 +19,8 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import AnchorLink from '../../../src/components/AnchorLink';
-import URLShortLinkButton from '../../../src/components/URLShortLinkButton';
+import AnchorLink from 'src/components/AnchorLink';
+import URLShortLinkButton from 'src/components/URLShortLinkButton';
 
 describe('AnchorLink', () => {
   const props = {
diff --git a/superset-frontend/spec/javascripts/components/AsyncSelect_spec.jsx b/superset-frontend/spec/javascripts/components/AsyncSelect_spec.jsx
index 30faddd..6721a04 100644
--- a/superset-frontend/spec/javascripts/components/AsyncSelect_spec.jsx
+++ b/superset-frontend/spec/javascripts/components/AsyncSelect_spec.jsx
@@ -21,7 +21,7 @@ import Select from 'react-select';
 import { shallow } from 'enzyme';
 import fetchMock from 'fetch-mock';
 
-import AsyncSelect from '../../../src/components/AsyncSelect';
+import AsyncSelect from 'src/components/AsyncSelect';
 
 describe('AsyncSelect', () => {
   afterAll(fetchMock.reset);
diff --git a/superset-frontend/spec/javascripts/components/CachedLabel_spec.jsx b/superset-frontend/spec/javascripts/components/CachedLabel_spec.jsx
index 1e9cbb0..d714e91 100644
--- a/superset-frontend/spec/javascripts/components/CachedLabel_spec.jsx
+++ b/superset-frontend/spec/javascripts/components/CachedLabel_spec.jsx
@@ -20,7 +20,7 @@ import React from 'react';
 import { shallow } from 'enzyme';
 import { Label } from 'react-bootstrap';
 
-import CachedLabel from '../../../src/components/CachedLabel';
+import CachedLabel from 'src/components/CachedLabel';
 
 describe('CachedLabel', () => {
   const defaultProps = {
diff --git a/superset-frontend/spec/javascripts/components/Checkbox_spec.jsx b/superset-frontend/spec/javascripts/components/Checkbox_spec.jsx
index 5f6fb69..3ac4863 100644
--- a/superset-frontend/spec/javascripts/components/Checkbox_spec.jsx
+++ b/superset-frontend/spec/javascripts/components/Checkbox_spec.jsx
@@ -20,7 +20,7 @@ import React from 'react';
 import sinon from 'sinon';
 import { shallow } from 'enzyme';
 
-import Checkbox from '../../../src/components/Checkbox';
+import Checkbox from 'src/components/Checkbox';
 
 describe('Checkbox', () => {
   const defaultProps = {
@@ -49,10 +49,7 @@ describe('Checkbox', () => {
   });
   it('unchecks when clicked', () => {
     expect(wrapper.find('i.fa-check.text-transparent')).toHaveLength(0);
-    wrapper
-      .find('i')
-      .first()
-      .simulate('click');
+    wrapper.find('i').first().simulate('click');
     expect(defaultProps.onChange.calledOnce).toBe(true);
   });
 });
diff --git a/superset-frontend/spec/javascripts/components/ColumnOption_spec.jsx b/superset-frontend/spec/javascripts/components/ColumnOption_spec.jsx
index cbca4f7..6e780b3 100644
--- a/superset-frontend/spec/javascripts/components/ColumnOption_spec.jsx
+++ b/superset-frontend/spec/javascripts/components/ColumnOption_spec.jsx
@@ -19,9 +19,9 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import ColumnOption from '../../../src/components/ColumnOption';
-import ColumnTypeLabel from '../../../src/components/ColumnTypeLabel';
-import InfoTooltipWithTrigger from '../../../src/components/InfoTooltipWithTrigger';
+import ColumnOption from 'src/components/ColumnOption';
+import ColumnTypeLabel from 'src/components/ColumnTypeLabel';
+import InfoTooltipWithTrigger from 'src/components/InfoTooltipWithTrigger';
 
 describe('ColumnOption', () => {
   const defaultProps = {
@@ -60,12 +60,7 @@ describe('ColumnOption', () => {
   it('shows a label with column_name when no verbose_name', () => {
     props.column.verbose_name = null;
     wrapper = shallow(factory(props));
-    expect(
-      wrapper
-        .find('.option-label')
-        .first()
-        .text(),
-    ).toBe('foo');
+    expect(wrapper.find('.option-label').first().text()).toBe('foo');
   });
   it('shows a column type label when showType is true', () => {
     wrapper = shallow(
diff --git a/superset-frontend/spec/javascripts/components/ColumnTypeLabel_spec.jsx b/superset-frontend/spec/javascripts/components/ColumnTypeLabel_spec.jsx
index 8c5f9ea..2bf7a20 100644
--- a/superset-frontend/spec/javascripts/components/ColumnTypeLabel_spec.jsx
+++ b/superset-frontend/spec/javascripts/components/ColumnTypeLabel_spec.jsx
@@ -19,7 +19,7 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import ColumnTypeLabel from '../../../src/components/ColumnTypeLabel';
+import ColumnTypeLabel from 'src/components/ColumnTypeLabel';
 
 describe('ColumnOption', () => {
   const defaultProps = {
diff --git a/superset-frontend/spec/javascripts/components/ConfirmStatusChange_spec.jsx b/superset-frontend/spec/javascripts/components/ConfirmStatusChange_spec.jsx
index ec3c7b8..d678dd8 100644
--- a/superset-frontend/spec/javascripts/components/ConfirmStatusChange_spec.jsx
+++ b/superset-frontend/spec/javascripts/components/ConfirmStatusChange_spec.jsx
@@ -38,10 +38,7 @@ describe('ConfirmStatusChange', () => {
   );
 
   it('opens a confirm modal', () => {
-    wrapper
-      .find('#btn1')
-      .props()
-      .onClick('foo');
+    wrapper.find('#btn1').props().onClick('foo');
 
     wrapper.update();
 
@@ -49,11 +46,7 @@ describe('ConfirmStatusChange', () => {
   });
 
   it('calls the function on confirm', () => {
-    wrapper
-      .find(Button)
-      .last()
-      .props()
-      .onClick();
+    wrapper.find(Button).last().props().onClick();
 
     expect(mockedProps.onConfirm).toHaveBeenCalledWith('foo');
   });
diff --git a/superset-frontend/spec/javascripts/components/CopyToClipboard_spec.jsx b/superset-frontend/spec/javascripts/components/CopyToClipboard_spec.jsx
index 4b81ac9..9f27ac6 100644
--- a/superset-frontend/spec/javascripts/components/CopyToClipboard_spec.jsx
+++ b/superset-frontend/spec/javascripts/components/CopyToClipboard_spec.jsx
@@ -18,7 +18,7 @@
  */
 import React from 'react';
 
-import CopyToClipboard from '../../../src/components/CopyToClipboard';
+import CopyToClipboard from 'src/components/CopyToClipboard';
 
 describe('CopyToClipboard', () => {
   const defaultProps = {
diff --git a/superset-frontend/spec/javascripts/components/ErrorMessage/getErrorMessageComponentRegistry_spec.tsx b/superset-frontend/spec/javascripts/components/ErrorMessage/getErrorMessageComponentRegistry_spec.tsx
index b4a88f6..ebc278b 100644
--- a/superset-frontend/spec/javascripts/components/ErrorMessage/getErrorMessageComponentRegistry_spec.tsx
+++ b/superset-frontend/spec/javascripts/components/ErrorMessage/getErrorMessageComponentRegistry_spec.tsx
@@ -20,10 +20,12 @@ import React from 'react';
 import getErrorMessageComponentRegistry from 'src/components/ErrorMessage/getErrorMessageComponentRegistry';
 import { ErrorMessageComponentProps } from 'src/components/ErrorMessage/types';
 
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
 const ERROR_MESSAGE_COMPONENT = (_: ErrorMessageComponentProps) => (
   <div>Test error</div>
 );
 
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
 const OVERRIDE_ERROR_MESSAGE_COMPONENT = (_: ErrorMessageComponentProps) => (
   <div>Custom error</div>
 );
diff --git a/superset-frontend/spec/javascripts/components/FilterableTable/FilterableTable_spec.jsx b/superset-frontend/spec/javascripts/components/FilterableTable/FilterableTable_spec.jsx
index 32bd431..74cbf92 100644
--- a/superset-frontend/spec/javascripts/components/FilterableTable/FilterableTable_spec.jsx
+++ b/superset-frontend/spec/javascripts/components/FilterableTable/FilterableTable_spec.jsx
@@ -20,7 +20,7 @@ import React from 'react';
 import { mount } from 'enzyme';
 import FilterableTable, {
   MAX_COLUMNS_FOR_TABLE,
-} from '../../../../src/components/FilterableTable/FilterableTable';
+} from 'src/components/FilterableTable/FilterableTable';
 
 describe('FilterableTable', () => {
   const mockedProps = {
diff --git a/superset-frontend/spec/javascripts/components/FormRow_spec.jsx b/superset-frontend/spec/javascripts/components/FormRow_spec.jsx
index 9b2db4e..cd53bd6 100644
--- a/superset-frontend/spec/javascripts/components/FormRow_spec.jsx
+++ b/superset-frontend/spec/javascripts/components/FormRow_spec.jsx
@@ -20,9 +20,9 @@ import React from 'react';
 import { shallow } from 'enzyme';
 
 import { Col, Row } from 'react-bootstrap';
-import TextControl from '../../../src/explore/components/controls/TextControl';
-import InfoTooltipWithTrigger from '../../../src/components/InfoTooltipWithTrigger';
-import FormRow from '../../../src/components/FormRow';
+import TextControl from 'src/explore/components/controls/TextControl';
+import InfoTooltipWithTrigger from 'src/components/InfoTooltipWithTrigger';
+import FormRow from 'src/components/FormRow';
 
 const defaultProps = {
   label: 'Hello',
diff --git a/superset-frontend/spec/javascripts/components/ListView/ListView_spec.jsx b/superset-frontend/spec/javascripts/components/ListView/ListView_spec.jsx
index 54b29c0..6004e14 100644
--- a/superset-frontend/spec/javascripts/components/ListView/ListView_spec.jsx
+++ b/superset-frontend/spec/javascripts/components/ListView/ListView_spec.jsx
@@ -111,10 +111,7 @@ describe('ListView', () => {
   });
 
   it('calls fetchData on sort', () => {
-    wrapper
-      .find('[data-test="sort-header"]')
-      .at(1)
-      .simulate('click');
+    wrapper.find('[data-test="sort-header"]').at(1).simulate('click');
 
     expect(mockedProps.fetchData).toHaveBeenCalled();
     expect(mockedProps.fetchData.mock.calls[0]).toMatchInlineSnapshot(`
@@ -160,10 +157,7 @@ describe('ListView', () => {
     wrapper.update();
 
     act(() => {
-      wrapper
-        .find('[data-test="apply-filters"]')
-        .last()
-        .prop('onClick')();
+      wrapper.find('[data-test="apply-filters"]').last().prop('onClick')();
     });
     wrapper.update();
 
@@ -241,10 +235,7 @@ Array [
         .onClick();
     });
     wrapper.update();
-    const bulkActionsProps = wrapper
-      .find(MenuItem)
-      .last()
-      .props();
+    const bulkActionsProps = wrapper.find(MenuItem).last().props();
 
     bulkActionsProps.onSelect(bulkActionsProps.eventKey);
     expect(mockedProps.bulkActions[0].onSelect.mock.calls[0])
@@ -275,10 +266,7 @@ Array [
         .onClick();
     });
     wrapper.update();
-    const bulkActionsProps = wrapper
-      .find(MenuItem)
-      .last()
-      .props();
+    const bulkActionsProps = wrapper.find(MenuItem).last().props();
 
     bulkActionsProps.onSelect(bulkActionsProps.eventKey);
     expect(mockedProps.bulkActions[0].onSelect.mock.calls[0])
@@ -383,11 +371,7 @@ describe('ListView with new UI filters', () => {
     wrapper.update();
 
     act(() => {
-      wrapper
-        .find('[data-test="search-input"]')
-        .last()
-        .props()
-        .onBlur();
+      wrapper.find('[data-test="search-input"]').last().props().onBlur();
     });
 
     expect(newFiltersProps.fetchData.mock.calls[0]).toMatchInlineSnapshot(`
diff --git a/superset-frontend/spec/javascripts/components/Menu_spec.jsx b/superset-frontend/spec/javascripts/components/Menu_spec.jsx
index 173a004..11386f4 100644
--- a/superset-frontend/spec/javascripts/components/Menu_spec.jsx
+++ b/superset-frontend/spec/javascripts/components/Menu_spec.jsx
@@ -20,7 +20,7 @@ import React from 'react';
 import { shallow, mount } from 'enzyme';
 import { Nav } from 'react-bootstrap';
 
-import Menu from '../../../src/components/Menu/Menu';
+import Menu from 'src/components/Menu/Menu';
 
 const defaultProps = {
   data: {
diff --git a/superset-frontend/spec/javascripts/components/MetricOption_spec.jsx b/superset-frontend/spec/javascripts/components/MetricOption_spec.jsx
index 1583f7e..c78af99 100644
--- a/superset-frontend/spec/javascripts/components/MetricOption_spec.jsx
+++ b/superset-frontend/spec/javascripts/components/MetricOption_spec.jsx
@@ -19,9 +19,9 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import MetricOption from '../../../src/components/MetricOption';
-import ColumnTypeLabel from '../../../src/components/ColumnTypeLabel';
-import InfoTooltipWithTrigger from '../../../src/components/InfoTooltipWithTrigger';
+import MetricOption from 'src/components/MetricOption';
+import ColumnTypeLabel from 'src/components/ColumnTypeLabel';
+import InfoTooltipWithTrigger from 'src/components/InfoTooltipWithTrigger';
 
 describe('MetricOption', () => {
   const defaultProps = {
@@ -61,12 +61,7 @@ describe('MetricOption', () => {
   it('shows a label with metric_name when no verbose_name', () => {
     props.metric.verbose_name = null;
     wrapper = shallow(factory(props));
-    expect(
-      wrapper
-        .find('.option-label')
-        .first()
-        .text(),
-    ).toBe('foo');
+    expect(wrapper.find('.option-label').first().text()).toBe('foo');
   });
   it('shows only 1 InfoTooltipWithTrigger when no descr and no warning', () => {
     props.metric.warning_text = null;
diff --git a/superset-frontend/spec/javascripts/components/ModalTrigger_spec.jsx b/superset-frontend/spec/javascripts/components/ModalTrigger_spec.jsx
index 1b3066b..ca8981b 100644
--- a/superset-frontend/spec/javascripts/components/ModalTrigger_spec.jsx
+++ b/superset-frontend/spec/javascripts/components/ModalTrigger_spec.jsx
@@ -18,7 +18,7 @@
  */
 import React from 'react';
 
-import ModalTrigger from '../../../src/components/ModalTrigger';
+import ModalTrigger from 'src/components/ModalTrigger';
 
 describe('ModalTrigger', () => {
   const defaultProps = {
diff --git a/superset-frontend/spec/javascripts/components/OnPasteSelect_spec.jsx b/superset-frontend/spec/javascripts/components/OnPasteSelect_spec.jsx
index 5bc6cb4..0c3c6cb 100644
--- a/superset-frontend/spec/javascripts/components/OnPasteSelect_spec.jsx
+++ b/superset-frontend/spec/javascripts/components/OnPasteSelect_spec.jsx
@@ -23,7 +23,7 @@ import { shallow } from 'enzyme';
 import VirtualizedSelect from 'react-virtualized-select';
 import Select, { Creatable } from 'react-select';
 
-import OnPasteSelect from '../../../src/components/OnPasteSelect';
+import OnPasteSelect from 'src/components/OnPasteSelect';
 
 const defaultProps = {
   onChange: sinon.spy(),
diff --git a/superset-frontend/spec/javascripts/components/OptionDescription_spec.jsx b/superset-frontend/spec/javascripts/components/OptionDescription_spec.jsx
index d3584cd..3b847d4 100644
--- a/superset-frontend/spec/javascripts/components/OptionDescription_spec.jsx
+++ b/superset-frontend/spec/javascripts/components/OptionDescription_spec.jsx
@@ -19,8 +19,8 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import InfoTooltipWithTrigger from '../../../src/components/InfoTooltipWithTrigger';
-import OptionDescription from '../../../src/components/OptionDescription';
+import InfoTooltipWithTrigger from 'src/components/InfoTooltipWithTrigger';
+import OptionDescription from 'src/components/OptionDescription';
 
 const defaultProps = {
   option: {
diff --git a/superset-frontend/spec/javascripts/components/PopoverSection_spec.jsx b/superset-frontend/spec/javascripts/components/PopoverSection_spec.jsx
index dce656e..9f1fd7e 100644
--- a/superset-frontend/spec/javascripts/components/PopoverSection_spec.jsx
+++ b/superset-frontend/spec/javascripts/components/PopoverSection_spec.jsx
@@ -19,7 +19,7 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import PopoverSection from '../../../src/components/PopoverSection';
+import PopoverSection from 'src/components/PopoverSection';
 
 describe('PopoverSection', () => {
   const defaultProps = {
diff --git a/superset-frontend/spec/javascripts/components/SearchInput_spec.jsx b/superset-frontend/spec/javascripts/components/SearchInput_spec.jsx
index da31a32..a5d324d 100644
--- a/superset-frontend/spec/javascripts/components/SearchInput_spec.jsx
+++ b/superset-frontend/spec/javascripts/components/SearchInput_spec.jsx
@@ -72,20 +72,14 @@ describe('SearchInput', () => {
   it('submits on search icon click', () => {
     typeSearchInput('bar');
 
-    wrapper
-      .find('[data-test="search-submit"]')
-      .props()
-      .onClick();
+    wrapper.find('[data-test="search-submit"]').props().onClick();
 
     expect(defaultProps.onSubmit).toHaveBeenCalled();
   });
 
   it('clears on clear icon click', () => {
     const wrapper2 = factory({ value: 'fizz' });
-    wrapper2
-      .find('[data-test="search-clear"]')
-      .props()
-      .onClick();
+    wrapper2.find('[data-test="search-clear"]').props().onClick();
 
     expect(defaultProps.onClear).toHaveBeenCalled();
   });
diff --git a/superset-frontend/spec/javascripts/components/TableSelector_spec.jsx b/superset-frontend/spec/javascripts/components/TableSelector_spec.jsx
index 638afc7..670f4c3 100644
--- a/superset-frontend/spec/javascripts/components/TableSelector_spec.jsx
+++ b/superset-frontend/spec/javascripts/components/TableSelector_spec.jsx
@@ -23,8 +23,8 @@ import sinon from 'sinon';
 import fetchMock from 'fetch-mock';
 import thunk from 'redux-thunk';
 
+import TableSelector from 'src/components/TableSelector';
 import { initialState, tables } from '../sqllab/fixtures';
-import TableSelector from '../../../src/components/TableSelector';
 
 describe('TableSelector', () => {
   let mockedProps;
diff --git a/superset-frontend/spec/javascripts/components/URLShortLinkButton_spec.jsx b/superset-frontend/spec/javascripts/components/URLShortLinkButton_spec.jsx
index c61e916..a13331c 100644
--- a/superset-frontend/spec/javascripts/components/URLShortLinkButton_spec.jsx
+++ b/superset-frontend/spec/javascripts/components/URLShortLinkButton_spec.jsx
@@ -21,7 +21,7 @@ import configureStore from 'redux-mock-store';
 import { shallow } from 'enzyme';
 
 import { OverlayTrigger } from 'react-bootstrap';
-import URLShortLinkButton from '../../../src/components/URLShortLinkButton';
+import URLShortLinkButton from 'src/components/URLShortLinkButton';
 
 describe('URLShortLinkButton', () => {
   const defaultProps = {
diff --git a/superset-frontend/spec/javascripts/components/URLShortLinkModal_spec.jsx b/superset-frontend/spec/javascripts/components/URLShortLinkModal_spec.jsx
index a1bc940..312cfa3 100644
--- a/superset-frontend/spec/javascripts/components/URLShortLinkModal_spec.jsx
+++ b/superset-frontend/spec/javascripts/components/URLShortLinkModal_spec.jsx
@@ -20,8 +20,8 @@ import React from 'react';
 import configureStore from 'redux-mock-store';
 import { shallow } from 'enzyme';
 
-import URLShortLinkModal from '../../../src/components/URLShortLinkModal';
-import ModalTrigger from '../../../src/components/ModalTrigger';
+import URLShortLinkModal from 'src/components/URLShortLinkModal';
+import ModalTrigger from 'src/components/ModalTrigger';
 
 describe('URLShortLinkModal', () => {
   const defaultProps = {
diff --git a/superset-frontend/spec/javascripts/components/VirtualizedRendererWrap_spec.jsx b/superset-frontend/spec/javascripts/components/VirtualizedRendererWrap_spec.jsx
index 2e467aa..d93343a 100644
--- a/superset-frontend/spec/javascripts/components/VirtualizedRendererWrap_spec.jsx
+++ b/superset-frontend/spec/javascripts/components/VirtualizedRendererWrap_spec.jsx
@@ -22,7 +22,7 @@ import sinon from 'sinon';
 import PropTypes from 'prop-types';
 import { shallow } from 'enzyme';
 
-import VirtualizedRendererWrap from '../../../src/components/VirtualizedRendererWrap';
+import VirtualizedRendererWrap from 'src/components/VirtualizedRendererWrap';
 
 const defaultProps = {
   focusedOption: { label: 'focusedOn', value: 'focusedOn' },
diff --git a/superset-frontend/spec/javascripts/dashboard/actions/dashboardLayout_spec.js b/superset-frontend/spec/javascripts/dashboard/actions/dashboardLayout_spec.js
index 1da0568..6f072fe 100644
--- a/superset-frontend/spec/javascripts/dashboard/actions/dashboardLayout_spec.js
+++ b/superset-frontend/spec/javascripts/dashboard/actions/dashboardLayout_spec.js
@@ -36,14 +36,11 @@ import {
   updateDashboardTitle,
   undoLayoutAction,
   redoLayoutAction,
-} from '../../../../src/dashboard/actions/dashboardLayout';
+} from 'src/dashboard/actions/dashboardLayout';
 
-import { setUnsavedChanges } from '../../../../src/dashboard/actions/dashboardState';
-import * as dashboardFilters from '../../../../src/dashboard/actions/dashboardFilters';
-import {
-  addWarningToast,
-  ADD_TOAST,
-} from '../../../../src/messageToasts/actions';
+import { setUnsavedChanges } from 'src/dashboard/actions/dashboardState';
+import * as dashboardFilters from 'src/dashboard/actions/dashboardFilters';
+import { addWarningToast, ADD_TOAST } from 'src/messageToasts/actions';
 
 import {
   DASHBOARD_GRID_TYPE,
@@ -51,7 +48,7 @@ import {
   CHART_TYPE,
   TABS_TYPE,
   TAB_TYPE,
-} from '../../../../src/dashboard/util/componentTypes';
+} from 'src/dashboard/util/componentTypes';
 
 import {
   DASHBOARD_HEADER_ID,
@@ -59,7 +56,7 @@ import {
   DASHBOARD_ROOT_ID,
   NEW_COMPONENTS_SOURCE_ID,
   NEW_ROW_ID,
-} from '../../../../src/dashboard/util/constants';
+} from 'src/dashboard/util/constants';
 
 describe('dashboardLayout actions', () => {
   const mockState = {
diff --git a/superset-frontend/spec/javascripts/dashboard/actions/dashboardState_spec.js b/superset-frontend/spec/javascripts/dashboard/actions/dashboardState_spec.js
index c2263c2..3d1913b 100644
--- a/superset-frontend/spec/javascripts/dashboard/actions/dashboardState_spec.js
+++ b/superset-frontend/spec/javascripts/dashboard/actions/dashboardState_spec.js
@@ -22,16 +22,16 @@ import { SupersetClient } from '@superset-ui/connection';
 import {
   removeSliceFromDashboard,
   saveDashboardRequest,
-} from '../../../../src/dashboard/actions/dashboardState';
-import { REMOVE_FILTER } from '../../../../src/dashboard/actions/dashboardFilters';
-import { UPDATE_COMPONENTS_PARENTS_LIST } from '../../../../src/dashboard/actions/dashboardLayout';
+} from 'src/dashboard/actions/dashboardState';
+import { REMOVE_FILTER } from 'src/dashboard/actions/dashboardFilters';
+import { UPDATE_COMPONENTS_PARENTS_LIST } from 'src/dashboard/actions/dashboardLayout';
+import { DASHBOARD_GRID_ID } from 'src/dashboard/util/constants';
 import {
   filterId,
   sliceEntitiesForDashboard as sliceEntities,
 } from '../fixtures/mockSliceEntities';
 import { emptyFilters } from '../fixtures/mockDashboardFilters';
 import mockDashboardData from '../fixtures/mockDashboardData';
-import { DASHBOARD_GRID_ID } from '../../../../src/dashboard/util/constants';
 
 describe('dashboardState actions', () => {
   const mockState = {
diff --git a/superset-frontend/spec/javascripts/dashboard/components/CodeModal_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/CodeModal_spec.jsx
index 752f8b3..297492e 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/CodeModal_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/CodeModal_spec.jsx
@@ -19,7 +19,7 @@
 import React from 'react';
 import { mount } from 'enzyme';
 
-import CodeModal from '../../../../src/dashboard/components/CodeModal';
+import CodeModal from 'src/dashboard/components/CodeModal';
 
 describe('CodeModal', () => {
   const mockedProps = {
diff --git a/superset-frontend/spec/javascripts/dashboard/components/CssEditor_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/CssEditor_spec.jsx
index a9e83fd..c027f5a 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/CssEditor_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/CssEditor_spec.jsx
@@ -19,7 +19,7 @@
 import React from 'react';
 import { mount } from 'enzyme';
 
-import CssEditor from '../../../../src/dashboard/components/CssEditor';
+import CssEditor from 'src/dashboard/components/CssEditor';
 
 describe('CssEditor', () => {
   const mockedProps = {
diff --git a/superset-frontend/spec/javascripts/dashboard/components/DashboardBuilder_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/DashboardBuilder_spec.jsx
index ef81bd4..dbdee6a 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/DashboardBuilder_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/DashboardBuilder_spec.jsx
@@ -25,13 +25,13 @@ import { ParentSize } from '@vx/responsive';
 import { Sticky, StickyContainer } from 'react-sticky';
 import { TabContainer, TabContent, TabPane } from 'react-bootstrap';
 
-import BuilderComponentPane from '../../../../src/dashboard/components/BuilderComponentPane';
-import DashboardBuilder from '../../../../src/dashboard/components/DashboardBuilder';
-import DashboardComponent from '../../../../src/dashboard/containers/DashboardComponent';
-import DashboardHeader from '../../../../src/dashboard/containers/DashboardHeader';
-import DashboardGrid from '../../../../src/dashboard/containers/DashboardGrid';
-import * as dashboardStateActions from '../../../../src/dashboard/actions/dashboardState';
-import { BUILDER_PANE_TYPE } from '../../../../src/dashboard/util/constants';
+import BuilderComponentPane from 'src/dashboard/components/BuilderComponentPane';
+import DashboardBuilder from 'src/dashboard/components/DashboardBuilder';
+import DashboardComponent from 'src/dashboard/containers/DashboardComponent';
+import DashboardHeader from 'src/dashboard/containers/DashboardHeader';
+import DashboardGrid from 'src/dashboard/containers/DashboardGrid';
+import * as dashboardStateActions from 'src/dashboard/actions/dashboardState';
+import { BUILDER_PANE_TYPE } from 'src/dashboard/util/constants';
 
 import WithDragDropContext from '../helpers/WithDragDropContext';
 import {
@@ -128,11 +128,7 @@ describe('DashboardBuilder', () => {
 
   it('should set animation=true, mountOnEnter=true, and unmounOnExit=false on TabContainer for perf', () => {
     const wrapper = setup({ dashboardLayout: layoutWithTabs });
-    const tabProps = wrapper
-      .find(ParentSize)
-      .dive()
-      .find(TabContainer)
-      .props();
+    const tabProps = wrapper.find(ParentSize).dive().find(TabContainer).props();
     expect(tabProps.animation).toBe(true);
     expect(tabProps.mountOnEnter).toBe(true);
     expect(tabProps.unmountOnExit).toBe(false);
diff --git a/superset-frontend/spec/javascripts/dashboard/components/DashboardGrid_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/DashboardGrid_spec.jsx
index c7acac2..1b7ffc8 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/DashboardGrid_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/DashboardGrid_spec.jsx
@@ -20,13 +20,13 @@ import React from 'react';
 import { shallow } from 'enzyme';
 import sinon from 'sinon';
 
-import DashboardComponent from '../../../../src/dashboard/containers/DashboardComponent';
-import DashboardGrid from '../../../../src/dashboard/components/DashboardGrid';
-import DragDroppable from '../../../../src/dashboard/components/dnd/DragDroppable';
-import newComponentFactory from '../../../../src/dashboard/util/newComponentFactory';
+import DashboardComponent from 'src/dashboard/containers/DashboardComponent';
+import DashboardGrid from 'src/dashboard/components/DashboardGrid';
+import DragDroppable from 'src/dashboard/components/dnd/DragDroppable';
+import newComponentFactory from 'src/dashboard/util/newComponentFactory';
 
-import { DASHBOARD_GRID_TYPE } from '../../../../src/dashboard/util/componentTypes';
-import { GRID_COLUMN_COUNT } from '../../../../src/dashboard/util/constants';
+import { DASHBOARD_GRID_TYPE } from 'src/dashboard/util/componentTypes';
+import { GRID_COLUMN_COUNT } from 'src/dashboard/util/constants';
 
 describe('DashboardGrid', () => {
   const props = {
diff --git a/superset-frontend/spec/javascripts/dashboard/components/Dashboard_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/Dashboard_spec.jsx
index fbf44fa..afbf578 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/Dashboard_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/Dashboard_spec.jsx
@@ -20,8 +20,10 @@ import React from 'react';
 import { shallow } from 'enzyme';
 import sinon from 'sinon';
 
-import Dashboard from '../../../../src/dashboard/components/Dashboard';
-import DashboardBuilder from '../../../../src/dashboard/containers/DashboardBuilder';
+import Dashboard from 'src/dashboard/components/Dashboard';
+import DashboardBuilder from 'src/dashboard/containers/DashboardBuilder';
+import { CHART_TYPE } from 'src/dashboard/util/componentTypes';
+import newComponentFactory from 'src/dashboard/util/newComponentFactory';
 
 // mock data
 import chartQueries from '../fixtures/mockChartQueries';
@@ -31,9 +33,6 @@ import { dashboardLayout } from '../fixtures/mockDashboardLayout';
 import dashboardState from '../fixtures/mockDashboardState';
 import { sliceEntitiesForChart as sliceEntities } from '../fixtures/mockSliceEntities';
 
-import { CHART_TYPE } from '../../../../src/dashboard/util/componentTypes';
-import newComponentFactory from '../../../../src/dashboard/util/newComponentFactory';
-
 describe('Dashboard', () => {
   const props = {
     actions: {
diff --git a/superset-frontend/spec/javascripts/dashboard/components/FilterIndicatorGroup_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/FilterIndicatorGroup_spec.jsx
index e54a698..dfc4431 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/FilterIndicatorGroup_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/FilterIndicatorGroup_spec.jsx
@@ -18,11 +18,11 @@
  */
 import React from 'react';
 import { shallow } from 'enzyme';
+import FilterIndicatorGroup from 'src/dashboard/components/FilterIndicatorGroup';
+import FilterBadgeIcon from 'src/components/FilterBadgeIcon';
 
 import { dashboardFilters } from '../fixtures/mockDashboardFilters';
 import { filterId, column } from '../fixtures/mockSliceEntities';
-import FilterIndicatorGroup from '../../../../src/dashboard/components/FilterIndicatorGroup';
-import FilterBadgeIcon from '../../../../src/components/FilterBadgeIcon';
 
 describe('FilterIndicatorGroup', () => {
   const mockedProps = {
diff --git a/superset-frontend/spec/javascripts/dashboard/components/FilterIndicatorTooltip_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/FilterIndicatorTooltip_spec.jsx
index 546a324..52960e7 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/FilterIndicatorTooltip_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/FilterIndicatorTooltip_spec.jsx
@@ -19,7 +19,7 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import FilterIndicatorTooltip from '../../../../src/dashboard/components/FilterIndicatorTooltip';
+import FilterIndicatorTooltip from 'src/dashboard/components/FilterIndicatorTooltip';
 
 describe('FilterIndicatorTooltip', () => {
   const label = 'region';
diff --git a/superset-frontend/spec/javascripts/dashboard/components/FilterIndicator_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/FilterIndicator_spec.jsx
index 6298283..4d7cd6b 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/FilterIndicator_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/FilterIndicator_spec.jsx
@@ -18,11 +18,11 @@
  */
 import React from 'react';
 import { shallow } from 'enzyme';
+import FilterIndicator from 'src/dashboard/components/FilterIndicator';
+import FilterBadgeIcon from 'src/components/FilterBadgeIcon';
 
 import { dashboardFilters } from '../fixtures/mockDashboardFilters';
 import { filterId, column } from '../fixtures/mockSliceEntities';
-import FilterIndicator from '../../../../src/dashboard/components/FilterIndicator';
-import FilterBadgeIcon from '../../../../src/components/FilterBadgeIcon';
 
 describe('FilterIndicator', () => {
   const mockedProps = {
diff --git a/superset-frontend/spec/javascripts/dashboard/components/FilterIndicatorsContainer_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/FilterIndicatorsContainer_spec.jsx
index a256a9e..69d37ac 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/FilterIndicatorsContainer_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/FilterIndicatorsContainer_spec.jsx
@@ -19,15 +19,15 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
+import FilterIndicatorsContainer from 'src/dashboard/components/FilterIndicatorsContainer';
+import FilterIndicator from 'src/dashboard/components/FilterIndicator';
+import * as colorMap from 'src/dashboard/util/dashboardFiltersColorMap';
+import { buildActiveFilters } from 'src/dashboard/util/activeDashboardFilters';
+import { getDashboardFilterKey } from 'src/dashboard/util/getDashboardFilterKey';
+import { DASHBOARD_ROOT_ID } from 'src/dashboard/util/constants';
 import { dashboardFilters } from '../fixtures/mockDashboardFilters';
 import { sliceId as chartId } from '../fixtures/mockChartQueries';
 import { filterId, column } from '../fixtures/mockSliceEntities';
-import FilterIndicatorsContainer from '../../../../src/dashboard/components/FilterIndicatorsContainer';
-import FilterIndicator from '../../../../src/dashboard/components/FilterIndicator';
-import * as colorMap from '../../../../src/dashboard/util/dashboardFiltersColorMap';
-import { buildActiveFilters } from '../../../../src/dashboard/util/activeDashboardFilters';
-import { getDashboardFilterKey } from '../../../../src/dashboard/util/getDashboardFilterKey';
-import { DASHBOARD_ROOT_ID } from '../../../../src/dashboard/util/constants';
 import { dashboardWithFilter } from '../fixtures/mockDashboardLayout';
 
 describe('FilterIndicatorsContainer', () => {
@@ -99,10 +99,8 @@ describe('FilterIndicatorsContainer', () => {
     const wrapper = setup({ dashboardFilters: overwriteDashboardFilters });
     expect(wrapper.find(FilterIndicator)).toHaveLength(1);
 
-    const indicatorProps = wrapper
-      .find(FilterIndicator)
-      .first()
-      .props().indicator;
+    const indicatorProps = wrapper.find(FilterIndicator).first().props()
+      .indicator;
     expect(indicatorProps.label).toEqual('testField');
     expect(indicatorProps.values).toEqual([0]);
   });
diff --git a/superset-frontend/spec/javascripts/dashboard/components/FilterTooltipWrapper_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/FilterTooltipWrapper_spec.jsx
index 0150134..4f59a02 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/FilterTooltipWrapper_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/FilterTooltipWrapper_spec.jsx
@@ -20,8 +20,8 @@ import React from 'react';
 import { shallow } from 'enzyme';
 import { Overlay, Tooltip } from 'react-bootstrap';
 
-import FilterTooltipWrapper from '../../../../src/dashboard/components/FilterTooltipWrapper';
-import FilterIndicatorTooltip from '../../../../src/dashboard/components/FilterIndicatorTooltip';
+import FilterTooltipWrapper from 'src/dashboard/components/FilterTooltipWrapper';
+import FilterIndicatorTooltip from 'src/dashboard/components/FilterIndicatorTooltip';
 
 describe('FilterTooltipWrapper', () => {
   const mockedProps = {
diff --git a/superset-frontend/spec/javascripts/dashboard/components/HeaderActionsDropdown_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/HeaderActionsDropdown_spec.jsx
index 6d2beb1..02a5844 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/HeaderActionsDropdown_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/HeaderActionsDropdown_spec.jsx
@@ -19,11 +19,11 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 import { DropdownButton, MenuItem } from 'react-bootstrap';
-import RefreshIntervalModal from '../../../../src/dashboard/components/RefreshIntervalModal';
-import URLShortLinkModal from '../../../../src/components/URLShortLinkModal';
-import HeaderActionsDropdown from '../../../../src/dashboard/components/HeaderActionsDropdown';
-import SaveModal from '../../../../src/dashboard/components/SaveModal';
-import CssEditor from '../../../../src/dashboard/components/CssEditor';
+import RefreshIntervalModal from 'src/dashboard/components/RefreshIntervalModal';
+import URLShortLinkModal from 'src/components/URLShortLinkModal';
+import HeaderActionsDropdown from 'src/dashboard/components/HeaderActionsDropdown';
+import SaveModal from 'src/dashboard/components/SaveModal';
+import CssEditor from 'src/dashboard/components/CssEditor';
 
 describe('HeaderActionsDropdown', () => {
   const props = {
diff --git a/superset-frontend/spec/javascripts/dashboard/components/Header_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/Header_spec.jsx
index 22e2d19..336a100 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/Header_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/Header_spec.jsx
@@ -18,14 +18,14 @@
  */
 import React from 'react';
 import { shallow } from 'enzyme';
-import Header from '../../../../src/dashboard/components/Header';
-import EditableTitle from '../../../../src/components/EditableTitle';
-import FaveStar from '../../../../src/components/FaveStar';
-import PublishedStatus from '../../../../src/dashboard/components/PublishedStatus';
-import HeaderActionsDropdown from '../../../../src/dashboard/components/HeaderActionsDropdown';
-import Button from '../../../../src/components/Button';
-import UndoRedoKeylisteners from '../../../../src/dashboard/components/UndoRedoKeylisteners';
-import { BUILDER_PANE_TYPE } from '../../../../src/dashboard/util/constants';
+import Header from 'src/dashboard/components/Header';
+import EditableTitle from 'src/components/EditableTitle';
+import FaveStar from 'src/components/FaveStar';
+import PublishedStatus from 'src/dashboard/components/PublishedStatus';
+import HeaderActionsDropdown from 'src/dashboard/components/HeaderActionsDropdown';
+import Button from 'src/components/Button';
+import UndoRedoKeylisteners from 'src/dashboard/components/UndoRedoKeylisteners';
+import { BUILDER_PANE_TYPE } from 'src/dashboard/util/constants';
 
 describe('Header', () => {
   const props = {
diff --git a/superset-frontend/spec/javascripts/dashboard/components/MissingChart_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/MissingChart_spec.jsx
index 5a1eeae..bda772b 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/MissingChart_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/MissingChart_spec.jsx
@@ -19,7 +19,7 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import MissingChart from '../../../../src/dashboard/components/MissingChart';
+import MissingChart from 'src/dashboard/components/MissingChart';
 
 describe('MissingChart', () => {
   function setup(overrideProps) {
diff --git a/superset-frontend/spec/javascripts/dashboard/components/RefreshIntervalModal_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/RefreshIntervalModal_spec.jsx
index 9e0c398..09cb78f 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/RefreshIntervalModal_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/RefreshIntervalModal_spec.jsx
@@ -19,7 +19,7 @@
 import React from 'react';
 import { mount } from 'enzyme';
 
-import RefreshIntervalModal from '../../../../src/dashboard/components/RefreshIntervalModal';
+import RefreshIntervalModal from 'src/dashboard/components/RefreshIntervalModal';
 
 describe('RefreshIntervalModal', () => {
   const mockedProps = {
diff --git a/superset-frontend/spec/javascripts/dashboard/components/SliceAdder_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/SliceAdder_spec.jsx
index 945abc4..97beb03 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/SliceAdder_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/SliceAdder_spec.jsx
@@ -22,7 +22,7 @@ import sinon from 'sinon';
 
 import { List } from 'react-virtualized';
 
-import SliceAdder from '../../../../src/dashboard/components/SliceAdder';
+import SliceAdder from 'src/dashboard/components/SliceAdder';
 import { sliceEntitiesForDashboard as mockSliceEntities } from '../fixtures/mockSliceEntities';
 
 describe('SliceAdder', () => {
diff --git a/superset-frontend/spec/javascripts/dashboard/components/dnd/DragDroppable_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/dnd/DragDroppable_spec.jsx
index fecf7b2..c674321 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/dnd/DragDroppable_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/dnd/DragDroppable_spec.jsx
@@ -20,12 +20,9 @@ import React from 'react';
 import { shallow, mount } from 'enzyme';
 import sinon from 'sinon';
 
-import newComponentFactory from '../../../../../src/dashboard/util/newComponentFactory';
-import {
-  CHART_TYPE,
-  ROW_TYPE,
-} from '../../../../../src/dashboard/util/componentTypes';
-import { UnwrappedDragDroppable as DragDroppable } from '../../../../../src/dashboard/components/dnd/DragDroppable';
+import newComponentFactory from 'src/dashboard/util/newComponentFactory';
+import { CHART_TYPE, ROW_TYPE } from 'src/dashboard/util/componentTypes';
+import { UnwrappedDragDroppable as DragDroppable } from 'src/dashboard/components/dnd/DragDroppable';
 
 describe('DragDroppable', () => {
   const props = {
diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/ChartHolder_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/ChartHolder_spec.jsx
index 380c571..eaefed2 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/ChartHolder_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/ChartHolder_spec.jsx
@@ -21,12 +21,12 @@ import React from 'react';
 import { mount } from 'enzyme';
 import sinon from 'sinon';
 
-import Chart from '../../../../../src/dashboard/containers/Chart';
-import ChartHolder from '../../../../../src/dashboard/components/gridComponents/ChartHolder';
-import DeleteComponentButton from '../../../../../src/dashboard/components/DeleteComponentButton';
-import DragDroppable from '../../../../../src/dashboard/components/dnd/DragDroppable';
-import HoverMenu from '../../../../../src/dashboard/components/menu/HoverMenu';
-import ResizableContainer from '../../../../../src/dashboard/components/resizable/ResizableContainer';
+import Chart from 'src/dashboard/containers/Chart';
+import ChartHolder from 'src/dashboard/components/gridComponents/ChartHolder';
+import DeleteComponentButton from 'src/dashboard/components/DeleteComponentButton';
+import DragDroppable from 'src/dashboard/components/dnd/DragDroppable';
+import HoverMenu from 'src/dashboard/components/menu/HoverMenu';
+import ResizableContainer from 'src/dashboard/components/resizable/ResizableContainer';
 
 import { mockStore } from '../../fixtures/mockStore';
 import { sliceId } from '../../fixtures/mockSliceEntities';
diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Chart_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Chart_spec.jsx
index f097c2d..d75b5fa 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Chart_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Chart_spec.jsx
@@ -20,9 +20,9 @@ import React from 'react';
 import { shallow } from 'enzyme';
 import sinon from 'sinon';
 
-import Chart from '../../../../../src/dashboard/components/gridComponents/Chart';
-import SliceHeader from '../../../../../src/dashboard/components/SliceHeader';
-import ChartContainer from '../../../../../src/chart/ChartContainer';
+import Chart from 'src/dashboard/components/gridComponents/Chart';
+import SliceHeader from 'src/dashboard/components/SliceHeader';
+import ChartContainer from 'src/chart/ChartContainer';
 
 import mockDatasource from '../../../../fixtures/mockDatasource';
 import { sliceEntitiesForChart as sliceEntities } from '../../fixtures/mockSliceEntities';
diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Column_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Column_spec.jsx
index ad0c818..d9df860 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Column_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Column_spec.jsx
@@ -21,15 +21,15 @@ import React from 'react';
 import { mount } from 'enzyme';
 import sinon from 'sinon';
 
-import BackgroundStyleDropdown from '../../../../../src/dashboard/components/menu/BackgroundStyleDropdown';
-import Column from '../../../../../src/dashboard/components/gridComponents/Column';
-import DashboardComponent from '../../../../../src/dashboard/containers/DashboardComponent';
-import DeleteComponentButton from '../../../../../src/dashboard/components/DeleteComponentButton';
-import DragDroppable from '../../../../../src/dashboard/components/dnd/DragDroppable';
-import HoverMenu from '../../../../../src/dashboard/components/menu/HoverMenu';
-import IconButton from '../../../../../src/dashboard/components/IconButton';
-import ResizableContainer from '../../../../../src/dashboard/components/resizable/ResizableContainer';
-import WithPopoverMenu from '../../../../../src/dashboard/components/menu/WithPopoverMenu';
+import BackgroundStyleDropdown from 'src/dashboard/components/menu/BackgroundStyleDropdown';
+import Column from 'src/dashboard/components/gridComponents/Column';
+import DashboardComponent from 'src/dashboard/containers/DashboardComponent';
+import DeleteComponentButton from 'src/dashboard/components/DeleteComponentButton';
+import DragDroppable from 'src/dashboard/components/dnd/DragDroppable';
+import HoverMenu from 'src/dashboard/components/menu/HoverMenu';
+import IconButton from 'src/dashboard/components/IconButton';
+import ResizableContainer from 'src/dashboard/components/resizable/ResizableContainer';
+import WithPopoverMenu from 'src/dashboard/components/menu/WithPopoverMenu';
 
 import { mockStore } from '../../fixtures/mockStore';
 import { dashboardLayout as mockLayout } from '../../fixtures/mockDashboardLayout';
diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Divider_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Divider_spec.jsx
index 91e05b9..f304f5f 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Divider_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Divider_spec.jsx
@@ -20,15 +20,15 @@ import React from 'react';
 import { mount } from 'enzyme';
 import sinon from 'sinon';
 
-import DeleteComponentButton from '../../../../../src/dashboard/components/DeleteComponentButton';
-import HoverMenu from '../../../../../src/dashboard/components/menu/HoverMenu';
-import DragDroppable from '../../../../../src/dashboard/components/dnd/DragDroppable';
-import Divider from '../../../../../src/dashboard/components/gridComponents/Divider';
-import newComponentFactory from '../../../../../src/dashboard/util/newComponentFactory';
+import DeleteComponentButton from 'src/dashboard/components/DeleteComponentButton';
+import HoverMenu from 'src/dashboard/components/menu/HoverMenu';
+import DragDroppable from 'src/dashboard/components/dnd/DragDroppable';
+import Divider from 'src/dashboard/components/gridComponents/Divider';
+import newComponentFactory from 'src/dashboard/util/newComponentFactory';
 import {
   DIVIDER_TYPE,
   DASHBOARD_GRID_TYPE,
-} from '../../../../../src/dashboard/util/componentTypes';
+} from 'src/dashboard/util/componentTypes';
 
 import WithDragDropContext from '../../helpers/WithDragDropContext';
 
diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Header_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Header_spec.jsx
index 30121f2..82e83d1 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Header_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Header_spec.jsx
@@ -21,17 +21,17 @@ import { Provider } from 'react-redux';
 import { mount } from 'enzyme';
 import sinon from 'sinon';
 
-import DeleteComponentButton from '../../../../../src/dashboard/components/DeleteComponentButton';
-import EditableTitle from '../../../../../src/components/EditableTitle';
-import HoverMenu from '../../../../../src/dashboard/components/menu/HoverMenu';
-import WithPopoverMenu from '../../../../../src/dashboard/components/menu/WithPopoverMenu';
-import DragDroppable from '../../../../../src/dashboard/components/dnd/DragDroppable';
-import Header from '../../../../../src/dashboard/components/gridComponents/Header';
-import newComponentFactory from '../../../../../src/dashboard/util/newComponentFactory';
+import DeleteComponentButton from 'src/dashboard/components/DeleteComponentButton';
+import EditableTitle from 'src/components/EditableTitle';
+import HoverMenu from 'src/dashboard/components/menu/HoverMenu';
+import WithPopoverMenu from 'src/dashboard/components/menu/WithPopoverMenu';
+import DragDroppable from 'src/dashboard/components/dnd/DragDroppable';
+import Header from 'src/dashboard/components/gridComponents/Header';
+import newComponentFactory from 'src/dashboard/util/newComponentFactory';
 import {
   HEADER_TYPE,
   DASHBOARD_GRID_TYPE,
-} from '../../../../../src/dashboard/util/componentTypes';
+} from 'src/dashboard/util/componentTypes';
 
 import WithDragDropContext from '../../helpers/WithDragDropContext';
 import { mockStoreWithTabs } from '../../fixtures/mockStore';
diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Markdown_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Markdown_spec.jsx
index f320492..9b38286 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Markdown_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Markdown_spec.jsx
@@ -23,12 +23,12 @@ import sinon from 'sinon';
 import AceEditor from 'react-ace';
 import ReactMarkdown from 'react-markdown';
 
-import Markdown from '../../../../../src/dashboard/components/gridComponents/Markdown';
-import MarkdownModeDropdown from '../../../../../src/dashboard/components/menu/MarkdownModeDropdown';
-import DeleteComponentButton from '../../../../../src/dashboard/components/DeleteComponentButton';
-import DragDroppable from '../../../../../src/dashboard/components/dnd/DragDroppable';
-import WithPopoverMenu from '../../../../../src/dashboard/components/menu/WithPopoverMenu';
-import ResizableContainer from '../../../../../src/dashboard/components/resizable/ResizableContainer';
+import Markdown from 'src/dashboard/components/gridComponents/Markdown';
+import MarkdownModeDropdown from 'src/dashboard/components/menu/MarkdownModeDropdown';
+import DeleteComponentButton from 'src/dashboard/components/DeleteComponentButton';
+import DragDroppable from 'src/dashboard/components/dnd/DragDroppable';
+import WithPopoverMenu from 'src/dashboard/components/menu/WithPopoverMenu';
+import ResizableContainer from 'src/dashboard/components/resizable/ResizableContainer';
 
 import { mockStore } from '../../fixtures/mockStore';
 import { dashboardLayout as mockLayout } from '../../fixtures/mockDashboardLayout';
diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Row_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Row_spec.jsx
index 2fb21cf..28fc9dc 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Row_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Row_spec.jsx
@@ -21,17 +21,17 @@ import React from 'react';
 import { mount } from 'enzyme';
 import sinon from 'sinon';
 
-import BackgroundStyleDropdown from '../../../../../src/dashboard/components/menu/BackgroundStyleDropdown';
-import DashboardComponent from '../../../../../src/dashboard/containers/DashboardComponent';
-import DeleteComponentButton from '../../../../../src/dashboard/components/DeleteComponentButton';
-import DragDroppable from '../../../../../src/dashboard/components/dnd/DragDroppable';
-import HoverMenu from '../../../../../src/dashboard/components/menu/HoverMenu';
-import IconButton from '../../../../../src/dashboard/components/IconButton';
-import Row from '../../../../../src/dashboard/components/gridComponents/Row';
-import WithPopoverMenu from '../../../../../src/dashboard/components/menu/WithPopoverMenu';
+import BackgroundStyleDropdown from 'src/dashboard/components/menu/BackgroundStyleDropdown';
+import DashboardComponent from 'src/dashboard/containers/DashboardComponent';
+import DeleteComponentButton from 'src/dashboard/components/DeleteComponentButton';
+import DragDroppable from 'src/dashboard/components/dnd/DragDroppable';
+import HoverMenu from 'src/dashboard/components/menu/HoverMenu';
+import IconButton from 'src/dashboard/components/IconButton';
+import Row from 'src/dashboard/components/gridComponents/Row';
+import WithPopoverMenu from 'src/dashboard/components/menu/WithPopoverMenu';
+import { DASHBOARD_GRID_ID } from 'src/dashboard/util/constants';
 
 import { mockStore } from '../../fixtures/mockStore';
-import { DASHBOARD_GRID_ID } from '../../../../../src/dashboard/util/constants';
 import { dashboardLayout as mockLayout } from '../../fixtures/mockDashboardLayout';
 import WithDragDropContext from '../../helpers/WithDragDropContext';
 
diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Tab_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Tab_spec.jsx
index 5a73d24..9f785e5 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Tab_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Tab_spec.jsx
@@ -21,15 +21,15 @@ import React from 'react';
 import { mount } from 'enzyme';
 import sinon from 'sinon';
 
-import DashboardComponent from '../../../../../src/dashboard/containers/DashboardComponent';
-import DeleteComponentModal from '../../../../../src/dashboard/components/DeleteComponentModal';
-import DragDroppable from '../../../../../src/dashboard/components/dnd/DragDroppable';
-import EditableTitle from '../../../../../src/components/EditableTitle';
-import WithPopoverMenu from '../../../../../src/dashboard/components/menu/WithPopoverMenu';
+import DashboardComponent from 'src/dashboard/containers/DashboardComponent';
+import DeleteComponentModal from 'src/dashboard/components/DeleteComponentModal';
+import DragDroppable from 'src/dashboard/components/dnd/DragDroppable';
+import EditableTitle from 'src/components/EditableTitle';
+import WithPopoverMenu from 'src/dashboard/components/menu/WithPopoverMenu';
 import Tab, {
   RENDER_TAB,
   RENDER_TAB_CONTENT,
-} from '../../../../../src/dashboard/components/gridComponents/Tab';
+} from 'src/dashboard/components/gridComponents/Tab';
 import WithDragDropContext from '../../helpers/WithDragDropContext';
 import { dashboardLayoutWithTabs } from '../../fixtures/mockDashboardLayout';
 import { mockStoreWithTabs } from '../../fixtures/mockStore';
diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Tabs_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Tabs_spec.jsx
index 9cb81e6..a987687 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Tabs_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Tabs_spec.jsx
@@ -22,15 +22,15 @@ import { mount, shallow } from 'enzyme';
 import sinon from 'sinon';
 import { Tabs as BootstrapTabs, Tab as BootstrapTab } from 'react-bootstrap';
 
-import DashboardComponent from '../../../../../src/dashboard/containers/DashboardComponent';
-import DeleteComponentButton from '../../../../../src/dashboard/components/DeleteComponentButton';
-import HoverMenu from '../../../../../src/dashboard/components/menu/HoverMenu';
-import DragDroppable from '../../../../../src/dashboard/components/dnd/DragDroppable';
-import Tabs from '../../../../../src/dashboard/components/gridComponents/Tabs';
+import DashboardComponent from 'src/dashboard/containers/DashboardComponent';
+import DeleteComponentButton from 'src/dashboard/components/DeleteComponentButton';
+import HoverMenu from 'src/dashboard/components/menu/HoverMenu';
+import DragDroppable from 'src/dashboard/components/dnd/DragDroppable';
+import Tabs from 'src/dashboard/components/gridComponents/Tabs';
+import { DASHBOARD_ROOT_ID } from 'src/dashboard/util/constants';
 import WithDragDropContext from '../../helpers/WithDragDropContext';
 import { dashboardLayoutWithTabs } from '../../fixtures/mockDashboardLayout';
 import { mockStoreWithTabs } from '../../fixtures/mockStore';
-import { DASHBOARD_ROOT_ID } from '../../../../../src/dashboard/util/constants';
 
 describe('Tabs', () => {
   const props = {
diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/DraggableNewComponent_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/DraggableNewComponent_spec.jsx
index 7ba0711..9a33a55 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/DraggableNewComponent_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/DraggableNewComponent_spec.jsx
@@ -19,15 +19,14 @@
 import React from 'react';
 import { mount } from 'enzyme';
 
-import DragDroppable from '../../../../../../src/dashboard/components/dnd/DragDroppable';
-import DraggableNewComponent from '../../../../../../src/dashboard/components/gridComponents/new/DraggableNewComponent';
-import WithDragDropContext from '../../../helpers/WithDragDropContext';
-
-import { NEW_COMPONENTS_SOURCE_ID } from '../../../../../../src/dashboard/util/constants';
+import DragDroppable from 'src/dashboard/components/dnd/DragDroppable';
+import DraggableNewComponent from 'src/dashboard/components/gridComponents/new/DraggableNewComponent';
+import { NEW_COMPONENTS_SOURCE_ID } from 'src/dashboard/util/constants';
 import {
   NEW_COMPONENT_SOURCE_TYPE,
   CHART_TYPE,
-} from '../../../../../../src/dashboard/util/componentTypes';
+} from 'src/dashboard/util/componentTypes';
+import WithDragDropContext from '../../../helpers/WithDragDropContext';
 
 describe('DraggableNewComponent', () => {
   const props = {
diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewColumn_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewColumn_spec.jsx
index 5641d46..d26cda3 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewColumn_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewColumn_spec.jsx
@@ -19,11 +19,11 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import DraggableNewComponent from '../../../../../../src/dashboard/components/gridComponents/new/DraggableNewComponent';
-import NewColumn from '../../../../../../src/dashboard/components/gridComponents/new/NewColumn';
+import DraggableNewComponent from 'src/dashboard/components/gridComponents/new/DraggableNewComponent';
+import NewColumn from 'src/dashboard/components/gridComponents/new/NewColumn';
 
-import { NEW_COLUMN_ID } from '../../../../../../src/dashboard/util/constants';
-import { COLUMN_TYPE } from '../../../../../../src/dashboard/util/componentTypes';
+import { NEW_COLUMN_ID } from 'src/dashboard/util/constants';
+import { COLUMN_TYPE } from 'src/dashboard/util/componentTypes';
 
 describe('NewColumn', () => {
   function setup() {
diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewDivider_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewDivider_spec.jsx
index c3ab1f7..f956748 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewDivider_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewDivider_spec.jsx
@@ -19,11 +19,11 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import DraggableNewComponent from '../../../../../../src/dashboard/components/gridComponents/new/DraggableNewComponent';
-import NewDivider from '../../../../../../src/dashboard/components/gridComponents/new/NewDivider';
+import DraggableNewComponent from 'src/dashboard/components/gridComponents/new/DraggableNewComponent';
+import NewDivider from 'src/dashboard/components/gridComponents/new/NewDivider';
 
-import { NEW_DIVIDER_ID } from '../../../../../../src/dashboard/util/constants';
-import { DIVIDER_TYPE } from '../../../../../../src/dashboard/util/componentTypes';
+import { NEW_DIVIDER_ID } from 'src/dashboard/util/constants';
+import { DIVIDER_TYPE } from 'src/dashboard/util/componentTypes';
 
 describe('NewDivider', () => {
   function setup() {
diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewHeader_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewHeader_spec.jsx
index 3c23b04..07e5777 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewHeader_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewHeader_spec.jsx
@@ -19,11 +19,11 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import DraggableNewComponent from '../../../../../../src/dashboard/components/gridComponents/new/DraggableNewComponent';
-import NewHeader from '../../../../../../src/dashboard/components/gridComponents/new/NewHeader';
+import DraggableNewComponent from 'src/dashboard/components/gridComponents/new/DraggableNewComponent';
+import NewHeader from 'src/dashboard/components/gridComponents/new/NewHeader';
 
-import { NEW_HEADER_ID } from '../../../../../../src/dashboard/util/constants';
-import { HEADER_TYPE } from '../../../../../../src/dashboard/util/componentTypes';
+import { NEW_HEADER_ID } from 'src/dashboard/util/constants';
+import { HEADER_TYPE } from 'src/dashboard/util/componentTypes';
 
 describe('NewHeader', () => {
   function setup() {
diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewRow_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewRow_spec.jsx
index df97a06..0517db1 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewRow_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewRow_spec.jsx
@@ -19,11 +19,11 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import DraggableNewComponent from '../../../../../../src/dashboard/components/gridComponents/new/DraggableNewComponent';
-import NewRow from '../../../../../../src/dashboard/components/gridComponents/new/NewRow';
+import DraggableNewComponent from 'src/dashboard/components/gridComponents/new/DraggableNewComponent';
+import NewRow from 'src/dashboard/components/gridComponents/new/NewRow';
 
-import { NEW_ROW_ID } from '../../../../../../src/dashboard/util/constants';
-import { ROW_TYPE } from '../../../../../../src/dashboard/util/componentTypes';
+import { NEW_ROW_ID } from 'src/dashboard/util/constants';
+import { ROW_TYPE } from 'src/dashboard/util/componentTypes';
 
 describe('NewRow', () => {
   function setup() {
diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewTabs_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewTabs_spec.jsx
index 26e5a7f..0875fd2 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewTabs_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewTabs_spec.jsx
@@ -19,11 +19,11 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import DraggableNewComponent from '../../../../../../src/dashboard/components/gridComponents/new/DraggableNewComponent';
-import NewTabs from '../../../../../../src/dashboard/components/gridComponents/new/NewTabs';
+import DraggableNewComponent from 'src/dashboard/components/gridComponents/new/DraggableNewComponent';
+import NewTabs from 'src/dashboard/components/gridComponents/new/NewTabs';
 
-import { NEW_TABS_ID } from '../../../../../../src/dashboard/util/constants';
-import { TABS_TYPE } from '../../../../../../src/dashboard/util/componentTypes';
+import { NEW_TABS_ID } from 'src/dashboard/util/constants';
+import { TABS_TYPE } from 'src/dashboard/util/componentTypes';
 
 describe('NewTabs', () => {
   function setup() {
diff --git a/superset-frontend/spec/javascripts/dashboard/components/menu/HoverMenu_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/menu/HoverMenu_spec.jsx
index 1c36ac1..cc1f684 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/menu/HoverMenu_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/menu/HoverMenu_spec.jsx
@@ -19,7 +19,7 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import HoverMenu from '../../../../../src/dashboard/components/menu/HoverMenu';
+import HoverMenu from 'src/dashboard/components/menu/HoverMenu';
 
 describe('HoverMenu', () => {
   it('should render a div.hover-menu', () => {
diff --git a/superset-frontend/spec/javascripts/dashboard/components/menu/WithPopoverMenu_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/menu/WithPopoverMenu_spec.jsx
index fe8a66c..ce5fab7 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/menu/WithPopoverMenu_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/menu/WithPopoverMenu_spec.jsx
@@ -19,7 +19,7 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import WithPopoverMenu from '../../../../../src/dashboard/components/menu/WithPopoverMenu';
+import WithPopoverMenu from 'src/dashboard/components/menu/WithPopoverMenu';
 
 describe('WithPopoverMenu', () => {
   const props = {
diff --git a/superset-frontend/spec/javascripts/dashboard/components/resizable/ResizableContainer_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/resizable/ResizableContainer_spec.jsx
index 66f138d..8bfcd2c 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/resizable/ResizableContainer_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/resizable/ResizableContainer_spec.jsx
@@ -20,7 +20,7 @@ import React from 'react';
 import Resizable from 're-resizable';
 import { shallow } from 'enzyme';
 
-import ResizableContainer from '../../../../../src/dashboard/components/resizable/ResizableContainer';
+import ResizableContainer from 'src/dashboard/components/resizable/ResizableContainer';
 
 describe('ResizableContainer', () => {
   const props = { editMode: false, id: 'id' };
diff --git a/superset-frontend/spec/javascripts/dashboard/components/resizable/ResizableHandle_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/resizable/ResizableHandle_spec.jsx
index d354e58..6e8389f 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/resizable/ResizableHandle_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/resizable/ResizableHandle_spec.jsx
@@ -19,7 +19,7 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import ResizableHandle from '../../../../../src/dashboard/components/resizable/ResizableHandle';
+import ResizableHandle from 'src/dashboard/components/resizable/ResizableHandle';
 
 describe('ResizableHandle', () => {
   it('should render a right resize handle', () => {
diff --git a/superset-frontend/spec/javascripts/dashboard/fixtures/mockDashboardFilters.js b/superset-frontend/spec/javascripts/dashboard/fixtures/mockDashboardFilters.js
index c5640c5..3fd74a0 100644
--- a/superset-frontend/spec/javascripts/dashboard/fixtures/mockDashboardFilters.js
+++ b/superset-frontend/spec/javascripts/dashboard/fixtures/mockDashboardFilters.js
@@ -16,8 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+import { DASHBOARD_FILTER_SCOPE_GLOBAL } from 'src/dashboard/reducers/dashboardFilters';
 import { filterId } from './mockSliceEntities';
-import { DASHBOARD_FILTER_SCOPE_GLOBAL } from '../../../../src/dashboard/reducers/dashboardFilters';
 
 export const emptyFilters = {};
 
diff --git a/superset-frontend/spec/javascripts/dashboard/fixtures/mockDashboardLayout.js b/superset-frontend/spec/javascripts/dashboard/fixtures/mockDashboardLayout.js
index ee1dc4f..32d4fe6 100644
--- a/superset-frontend/spec/javascripts/dashboard/fixtures/mockDashboardLayout.js
+++ b/superset-frontend/spec/javascripts/dashboard/fixtures/mockDashboardLayout.js
@@ -26,15 +26,15 @@ import {
   ROW_TYPE,
   COLUMN_TYPE,
   MARKDOWN_TYPE,
-} from '../../../../src/dashboard/util/componentTypes';
+} from 'src/dashboard/util/componentTypes';
 
 import {
   DASHBOARD_ROOT_ID,
   DASHBOARD_HEADER_ID,
   DASHBOARD_GRID_ID,
-} from '../../../../src/dashboard/util/constants';
+} from 'src/dashboard/util/constants';
 
-import newComponentFactory from '../../../../src/dashboard/util/newComponentFactory';
+import newComponentFactory from 'src/dashboard/util/newComponentFactory';
 
 import { sliceId as chartId } from './mockChartQueries';
 import { filterId } from './mockDashboardFilters';
diff --git a/superset-frontend/spec/javascripts/dashboard/fixtures/mockDashboardState.js b/superset-frontend/spec/javascripts/dashboard/fixtures/mockDashboardState.js
index 5b748f8..1727422 100644
--- a/superset-frontend/spec/javascripts/dashboard/fixtures/mockDashboardState.js
+++ b/superset-frontend/spec/javascripts/dashboard/fixtures/mockDashboardState.js
@@ -16,8 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+import { BUILDER_PANE_TYPE } from 'src/dashboard/util/constants';
 import { sliceId } from './mockChartQueries';
-import { BUILDER_PANE_TYPE } from '../../../../src/dashboard/util/constants';
 
 export default {
   sliceIds: [sliceId],
diff --git a/superset-frontend/spec/javascripts/dashboard/fixtures/mockStore.js b/superset-frontend/spec/javascripts/dashboard/fixtures/mockStore.js
index 5d87710..52c5c7f 100644
--- a/superset-frontend/spec/javascripts/dashboard/fixtures/mockStore.js
+++ b/superset-frontend/spec/javascripts/dashboard/fixtures/mockStore.js
@@ -19,7 +19,7 @@
 import { createStore, applyMiddleware, compose } from 'redux';
 import thunk from 'redux-thunk';
 
-import rootReducer from '../../../../src/dashboard/reducers/index';
+import rootReducer from 'src/dashboard/reducers/index';
 
 import mockState from './mockState';
 import { dashboardLayoutWithTabs } from './mockDashboardLayout';
diff --git a/superset-frontend/spec/javascripts/dashboard/helpers/WithDragDropContext.jsx b/superset-frontend/spec/javascripts/dashboard/helpers/WithDragDropContext.jsx
index 8b276d0..70a1fd3 100644
--- a/superset-frontend/spec/javascripts/dashboard/helpers/WithDragDropContext.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/helpers/WithDragDropContext.jsx
@@ -19,7 +19,7 @@
 import React from 'react';
 import PropTypes from 'prop-types';
 
-import getDragDropManager from '../../../../src/dashboard/util/getDragDropManager';
+import getDragDropManager from 'src/dashboard/util/getDragDropManager';
 
 // A helper component that provides a DragDropContext for components that require it
 class WithDragDropContext extends React.Component {
diff --git a/superset-frontend/spec/javascripts/dashboard/reducers/dashboardFilters_spec.js b/superset-frontend/spec/javascripts/dashboard/reducers/dashboardFilters_spec.js
index b759610..80e4ccf 100644
--- a/superset-frontend/spec/javascripts/dashboard/reducers/dashboardFilters_spec.js
+++ b/superset-frontend/spec/javascripts/dashboard/reducers/dashboardFilters_spec.js
@@ -22,10 +22,11 @@ import {
   REMOVE_FILTER,
   CHANGE_FILTER,
   UPDATE_DASHBOARD_FILTERS_SCOPE,
-} from '../../../../src/dashboard/actions/dashboardFilters';
+} from 'src/dashboard/actions/dashboardFilters';
 import dashboardFiltersReducer, {
   DASHBOARD_FILTER_SCOPE_GLOBAL,
-} from '../../../../src/dashboard/reducers/dashboardFilters';
+} from 'src/dashboard/reducers/dashboardFilters';
+import * as activeDashboardFilters from 'src/dashboard/util/activeDashboardFilters';
 import {
   emptyFilters,
   dashboardFilters,
@@ -36,7 +37,6 @@ import {
   column,
 } from '../fixtures/mockSliceEntities';
 import { filterComponent } from '../fixtures/mockDashboardLayout';
-import * as activeDashboardFilters from '../../../../src/dashboard/util/activeDashboardFilters';
 
 describe('dashboardFilters reducer', () => {
   const form_data = sliceEntitiesForDashboard.slices[filterId].form_data;
diff --git a/superset-frontend/spec/javascripts/dashboard/reducers/dashboardLayout_spec.js b/superset-frontend/spec/javascripts/dashboard/reducers/dashboardLayout_spec.js
index 479176b..f9b504a 100644
--- a/superset-frontend/spec/javascripts/dashboard/reducers/dashboardLayout_spec.js
+++ b/superset-frontend/spec/javascripts/dashboard/reducers/dashboardLayout_spec.js
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import layoutReducer from '../../../../src/dashboard/reducers/dashboardLayout';
+import layoutReducer from 'src/dashboard/reducers/dashboardLayout';
 
 import {
   UPDATE_COMPONENTS,
@@ -25,7 +25,7 @@ import {
   MOVE_COMPONENT,
   CREATE_TOP_LEVEL_TABS,
   DELETE_TOP_LEVEL_TABS,
-} from '../../../../src/dashboard/actions/dashboardLayout';
+} from 'src/dashboard/actions/dashboardLayout';
 
 import {
   CHART_TYPE,
@@ -34,7 +34,7 @@ import {
   ROW_TYPE,
   TAB_TYPE,
   TABS_TYPE,
-} from '../../../../src/dashboard/util/componentTypes';
+} from 'src/dashboard/util/componentTypes';
 
 import {
   DASHBOARD_ROOT_ID,
@@ -42,7 +42,7 @@ import {
   NEW_COMPONENTS_SOURCE_ID,
   NEW_TABS_ID,
   NEW_ROW_ID,
-} from '../../../../src/dashboard/util/constants';
+} from 'src/dashboard/util/constants';
 
 describe('dashboardLayout reducer', () => {
   it('should return initial state for unrecognized actions', () => {
diff --git a/superset-frontend/spec/javascripts/dashboard/reducers/dashboardState_spec.js b/superset-frontend/spec/javascripts/dashboard/reducers/dashboardState_spec.js
index cb5befc..fe5d098 100644
--- a/superset-frontend/spec/javascripts/dashboard/reducers/dashboardState_spec.js
+++ b/superset-frontend/spec/javascripts/dashboard/reducers/dashboardState_spec.js
@@ -27,10 +27,10 @@ import {
   SET_UNSAVED_CHANGES,
   TOGGLE_EXPAND_SLICE,
   TOGGLE_FAVE_STAR,
-} from '../../../../src/dashboard/actions/dashboardState';
+} from 'src/dashboard/actions/dashboardState';
 
-import dashboardStateReducer from '../../../../src/dashboard/reducers/dashboardState';
-import { BUILDER_PANE_TYPE } from '../../../../src/dashboard/util/constants';
+import dashboardStateReducer from 'src/dashboard/reducers/dashboardState';
+import { BUILDER_PANE_TYPE } from 'src/dashboard/util/constants';
 
 describe('dashboardState reducer', () => {
   it('should return initial state', () => {
diff --git a/superset-frontend/spec/javascripts/dashboard/reducers/sliceEntities_spec.js b/superset-frontend/spec/javascripts/dashboard/reducers/sliceEntities_spec.js
index 7f690d5..73b5aeb 100644
--- a/superset-frontend/spec/javascripts/dashboard/reducers/sliceEntities_spec.js
+++ b/superset-frontend/spec/javascripts/dashboard/reducers/sliceEntities_spec.js
@@ -20,9 +20,9 @@ import {
   FETCH_ALL_SLICES_FAILED,
   FETCH_ALL_SLICES_STARTED,
   SET_ALL_SLICES,
-} from '../../../../src/dashboard/actions/sliceEntities';
+} from 'src/dashboard/actions/sliceEntities';
 
-import sliceEntitiesReducer from '../../../../src/dashboard/reducers/sliceEntities';
+import sliceEntitiesReducer from 'src/dashboard/reducers/sliceEntities';
 
 describe('sliceEntities reducer', () => {
   it('should return initial state', () => {
diff --git a/superset-frontend/spec/javascripts/dashboard/util/componentIsResizable_spec.js b/superset-frontend/spec/javascripts/dashboard/util/componentIsResizable_spec.js
index 60ee081..81633ae 100644
--- a/superset-frontend/spec/javascripts/dashboard/util/componentIsResizable_spec.js
+++ b/superset-frontend/spec/javascripts/dashboard/util/componentIsResizable_spec.js
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import componentIsResizable from '../../../../src/dashboard/util/componentIsResizable';
+import componentIsResizable from 'src/dashboard/util/componentIsResizable';
 import {
   CHART_TYPE,
   COLUMN_TYPE,
@@ -28,7 +28,7 @@ import {
   ROW_TYPE,
   TABS_TYPE,
   TAB_TYPE,
-} from '../../../../src/dashboard/util/componentTypes';
+} from 'src/dashboard/util/componentTypes';
 
 const notResizable = [
   DASHBOARD_GRID_TYPE,
diff --git a/superset-frontend/spec/javascripts/dashboard/util/dnd-reorder_spec.js b/superset-frontend/spec/javascripts/dashboard/util/dnd-reorder_spec.js
index 2d83e09..056a0b4 100644
--- a/superset-frontend/spec/javascripts/dashboard/util/dnd-reorder_spec.js
+++ b/superset-frontend/spec/javascripts/dashboard/util/dnd-reorder_spec.js
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import reorderItem from '../../../../src/dashboard/util/dnd-reorder';
+import reorderItem from 'src/dashboard/util/dnd-reorder';
 
 describe('dnd-reorderItem', () => {
   it('should remove the item from its source entity and add it to its destination entity', () => {
diff --git a/superset-frontend/spec/javascripts/dashboard/util/dropOverflowsParent_spec.js b/superset-frontend/spec/javascripts/dashboard/util/dropOverflowsParent_spec.js
index dcfacf4..a790ee0 100644
--- a/superset-frontend/spec/javascripts/dashboard/util/dropOverflowsParent_spec.js
+++ b/superset-frontend/spec/javascripts/dashboard/util/dropOverflowsParent_spec.js
@@ -16,15 +16,15 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import dropOverflowsParent from '../../../../src/dashboard/util/dropOverflowsParent';
-import { NEW_COMPONENTS_SOURCE_ID } from '../../../../src/dashboard/util/constants';
+import dropOverflowsParent from 'src/dashboard/util/dropOverflowsParent';
+import { NEW_COMPONENTS_SOURCE_ID } from 'src/dashboard/util/constants';
 import {
   CHART_TYPE,
   COLUMN_TYPE,
   ROW_TYPE,
   HEADER_TYPE,
   TAB_TYPE,
-} from '../../../../src/dashboard/util/componentTypes';
+} from 'src/dashboard/util/componentTypes';
 
 describe('dropOverflowsParent', () => {
   it('returns true if a parent does NOT have adequate width for child', () => {
diff --git a/superset-frontend/spec/javascripts/dashboard/util/findFirstParentContainer_spec.js b/superset-frontend/spec/javascripts/dashboard/util/findFirstParentContainer_spec.js
index bb4d8af..a74a50b 100644
--- a/superset-frontend/spec/javascripts/dashboard/util/findFirstParentContainer_spec.js
+++ b/superset-frontend/spec/javascripts/dashboard/util/findFirstParentContainer_spec.js
@@ -16,11 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import findFirstParentContainerId from '../../../../src/dashboard/util/findFirstParentContainer';
+import findFirstParentContainerId from 'src/dashboard/util/findFirstParentContainer';
 import {
   DASHBOARD_GRID_ID,
   DASHBOARD_ROOT_ID,
-} from '../../../../src/dashboard/util/constants';
+} from 'src/dashboard/util/constants';
 
 describe('findFirstParentContainer', () => {
   const mockGridLayout = {
diff --git a/superset-frontend/spec/javascripts/dashboard/util/findParentId_spec.js b/superset-frontend/spec/javascripts/dashboard/util/findParentId_spec.js
index 527d540..d63be40 100644
--- a/superset-frontend/spec/javascripts/dashboard/util/findParentId_spec.js
+++ b/superset-frontend/spec/javascripts/dashboard/util/findParentId_spec.js
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import findParentId from '../../../../src/dashboard/util/findParentId';
+import findParentId from 'src/dashboard/util/findParentId';
 
 describe('findParentId', () => {
   const layout = {
diff --git a/superset-frontend/spec/javascripts/dashboard/util/findTabIndexByComponentId_spec.js b/superset-frontend/spec/javascripts/dashboard/util/findTabIndexByComponentId_spec.js
index fcaec01..3a3672c 100644
--- a/superset-frontend/spec/javascripts/dashboard/util/findTabIndexByComponentId_spec.js
+++ b/superset-frontend/spec/javascripts/dashboard/util/findTabIndexByComponentId_spec.js
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import findTabIndexByComponentId from '../../../../src/dashboard/util/findTabIndexByComponentId';
+import findTabIndexByComponentId from 'src/dashboard/util/findTabIndexByComponentId';
 
 describe('findTabIndexByComponentId', () => {
   const topLevelTabsComponent = {
diff --git a/superset-frontend/spec/javascripts/dashboard/util/getChartAndLabelComponentIdFromPath_spec.js b/superset-frontend/spec/javascripts/dashboard/util/getChartAndLabelComponentIdFromPath_spec.js
index 4216935..427e689 100644
--- a/superset-frontend/spec/javascripts/dashboard/util/getChartAndLabelComponentIdFromPath_spec.js
+++ b/superset-frontend/spec/javascripts/dashboard/util/getChartAndLabelComponentIdFromPath_spec.js
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import getChartAndLabelComponentIdFromPath from '../../../../src/dashboard/util/getChartAndLabelComponentIdFromPath';
+import getChartAndLabelComponentIdFromPath from 'src/dashboard/util/getChartAndLabelComponentIdFromPath';
 
 describe('getChartAndLabelComponentIdFromPath', () => {
   it('should return label and component id', () => {
diff --git a/superset-frontend/spec/javascripts/dashboard/util/getChartIdsFromLayout_spec.js b/superset-frontend/spec/javascripts/dashboard/util/getChartIdsFromLayout_spec.js
index 33fb449..a008b5a 100644
--- a/superset-frontend/spec/javascripts/dashboard/util/getChartIdsFromLayout_spec.js
+++ b/superset-frontend/spec/javascripts/dashboard/util/getChartIdsFromLayout_spec.js
@@ -16,11 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import getChartIdsFromLayout from '../../../../src/dashboard/util/getChartIdsFromLayout';
-import {
-  ROW_TYPE,
-  CHART_TYPE,
-} from '../../../../src/dashboard/util/componentTypes';
+import getChartIdsFromLayout from 'src/dashboard/util/getChartIdsFromLayout';
+import { ROW_TYPE, CHART_TYPE } from 'src/dashboard/util/componentTypes';
 
 describe('getChartIdsFromLayout', () => {
   const mockLayout = {
diff --git a/superset-frontend/spec/javascripts/dashboard/util/getDashboardUrl_spec.js b/superset-frontend/spec/javascripts/dashboard/util/getDashboardUrl_spec.js
index 8b6b7fc..43a33ad 100644
--- a/superset-frontend/spec/javascripts/dashboard/util/getDashboardUrl_spec.js
+++ b/superset-frontend/spec/javascripts/dashboard/util/getDashboardUrl_spec.js
@@ -16,8 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import getDashboardUrl from '../../../../src/dashboard/util/getDashboardUrl';
-import { DASHBOARD_FILTER_SCOPE_GLOBAL } from '../../../../src/dashboard/reducers/dashboardFilters';
+import getDashboardUrl from 'src/dashboard/util/getDashboardUrl';
+import { DASHBOARD_FILTER_SCOPE_GLOBAL } from 'src/dashboard/reducers/dashboardFilters';
 
 describe('getChartIdsFromLayout', () => {
   it('should encode filters', () => {
diff --git a/superset-frontend/spec/javascripts/dashboard/util/getDetailedComponentWidth_spec.js b/superset-frontend/spec/javascripts/dashboard/util/getDetailedComponentWidth_spec.js
index f033b63..a99f69f 100644
--- a/superset-frontend/spec/javascripts/dashboard/util/getDetailedComponentWidth_spec.js
+++ b/superset-frontend/spec/javascripts/dashboard/util/getDetailedComponentWidth_spec.js
@@ -16,12 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import getDetailedComponentWidth from '../../../../src/dashboard/util/getDetailedComponentWidth';
-import * as types from '../../../../src/dashboard/util/componentTypes';
+import getDetailedComponentWidth from 'src/dashboard/util/getDetailedComponentWidth';
+import * as types from 'src/dashboard/util/componentTypes';
 import {
   GRID_COLUMN_COUNT,
   GRID_MIN_COLUMN_COUNT,
-} from '../../../../src/dashboard/util/constants';
+} from 'src/dashboard/util/constants';
 
 describe('getDetailedComponentWidth', () => {
   it('should return an object with width, minimumWidth, and occupiedWidth', () => {
diff --git a/superset-frontend/spec/javascripts/dashboard/util/getDropPosition_spec.js b/superset-frontend/spec/javascripts/dashboard/util/getDropPosition_spec.js
index fb813a7..71f506b 100644
--- a/superset-frontend/spec/javascripts/dashboard/util/getDropPosition_spec.js
+++ b/superset-frontend/spec/javascripts/dashboard/util/getDropPosition_spec.js
@@ -21,7 +21,7 @@ import getDropPosition, {
   DROP_RIGHT,
   DROP_BOTTOM,
   DROP_LEFT,
-} from '../../../../src/dashboard/util/getDropPosition';
+} from 'src/dashboard/util/getDropPosition';
 
 import {
   CHART_TYPE,
@@ -30,7 +30,7 @@ import {
   HEADER_TYPE,
   ROW_TYPE,
   TAB_TYPE,
-} from '../../../../src/dashboard/util/componentTypes';
+} from 'src/dashboard/util/componentTypes';
 
 describe('getDropPosition', () => {
   // helper to easily configure test
diff --git a/superset-frontend/spec/javascripts/dashboard/util/getFilterConfigsFromFormdata_spec.js b/superset-frontend/spec/javascripts/dashboard/util/getFilterConfigsFromFormdata_spec.js
index 8dae4d3..4122966 100644
--- a/superset-frontend/spec/javascripts/dashboard/util/getFilterConfigsFromFormdata_spec.js
+++ b/superset-frontend/spec/javascripts/dashboard/util/getFilterConfigsFromFormdata_spec.js
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import getFilterConfigsFromFormdata from '../../../../src/dashboard/util/getFilterConfigsFromFormdata';
+import getFilterConfigsFromFormdata from 'src/dashboard/util/getFilterConfigsFromFormdata';
 
 describe('getFilterConfigsFromFormdata', () => {
   const testFormdata = {
diff --git a/superset-frontend/spec/javascripts/dashboard/util/getFilterScopeFromNodesTree_spec.js b/superset-frontend/spec/javascripts/dashboard/util/getFilterScopeFromNodesTree_spec.js
index a2c94f3..6399ac4 100644
--- a/superset-frontend/spec/javascripts/dashboard/util/getFilterScopeFromNodesTree_spec.js
+++ b/superset-frontend/spec/javascripts/dashboard/util/getFilterScopeFromNodesTree_spec.js
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import getFilterScopeFromNodesTree from '../../../../src/dashboard/util/getFilterScopeFromNodesTree';
+import getFilterScopeFromNodesTree from 'src/dashboard/util/getFilterScopeFromNodesTree';
 
 describe('getFilterScopeFromNodesTree', () => {
   it('should return empty scope', () => {
diff --git a/superset-frontend/spec/javascripts/dashboard/util/getFormDataWithExtraFilters_spec.js b/superset-frontend/spec/javascripts/dashboard/util/getFormDataWithExtraFilters_spec.js
index 95cb141..104b323 100644
--- a/superset-frontend/spec/javascripts/dashboard/util/getFormDataWithExtraFilters_spec.js
+++ b/superset-frontend/spec/javascripts/dashboard/util/getFormDataWithExtraFilters_spec.js
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import getFormDataWithExtraFilters from '../../../../src/dashboard/util/charts/getFormDataWithExtraFilters';
+import getFormDataWithExtraFilters from 'src/dashboard/util/charts/getFormDataWithExtraFilters';
 
 describe('getFormDataWithExtraFilters', () => {
   const chartId = 'chartId';
diff --git a/superset-frontend/spec/javascripts/dashboard/util/getLeafComponentIdFromPath_spec.js b/superset-frontend/spec/javascripts/dashboard/util/getLeafComponentIdFromPath_spec.js
index cb6331f..95192f7 100644
--- a/superset-frontend/spec/javascripts/dashboard/util/getLeafComponentIdFromPath_spec.js
+++ b/superset-frontend/spec/javascripts/dashboard/util/getLeafComponentIdFromPath_spec.js
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import getLeafComponentIdFromPath from '../../../../src/dashboard/util/getLeafComponentIdFromPath';
+import getLeafComponentIdFromPath from 'src/dashboard/util/getLeafComponentIdFromPath';
 import { filterId } from '../fixtures/mockSliceEntities';
 import { dashboardFilters } from '../fixtures/mockDashboardFilters';
 
diff --git a/superset-frontend/spec/javascripts/dashboard/util/isDashboardEmpty_spec.ts b/superset-frontend/spec/javascripts/dashboard/util/isDashboardEmpty_spec.ts
index 70bab02..411f0a3 100644
--- a/superset-frontend/spec/javascripts/dashboard/util/isDashboardEmpty_spec.ts
+++ b/superset-frontend/spec/javascripts/dashboard/util/isDashboardEmpty_spec.ts
@@ -16,8 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import isDashboardEmpty from '../../../../src/dashboard/util/isDashboardEmpty';
-import getEmptyLayout from '../../../../src/dashboard/util/getEmptyLayout';
+import isDashboardEmpty from 'src/dashboard/util/isDashboardEmpty';
+import getEmptyLayout from 'src/dashboard/util/getEmptyLayout';
 
 describe('isDashboardEmpty', () => {
   const emptyLayout: object = getEmptyLayout();
diff --git a/superset-frontend/spec/javascripts/dashboard/util/isValidChild_spec.js b/superset-frontend/spec/javascripts/dashboard/util/isValidChild_spec.js
index 172a97c..f8abb5a 100644
--- a/superset-frontend/spec/javascripts/dashboard/util/isValidChild_spec.js
+++ b/superset-frontend/spec/javascripts/dashboard/util/isValidChild_spec.js
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import isValidChild from '../../../../src/dashboard/util/isValidChild';
+import isValidChild from 'src/dashboard/util/isValidChild';
 
 import {
   CHART_TYPE as CHART,
@@ -29,7 +29,7 @@ import {
   ROW_TYPE as ROW,
   TABS_TYPE as TABS,
   TAB_TYPE as TAB,
-} from '../../../../src/dashboard/util/componentTypes';
+} from 'src/dashboard/util/componentTypes';
 
 const getIndentation = depth =>
   Array(depth * 3)
diff --git a/superset-frontend/spec/javascripts/dashboard/util/newComponentFactory_spec.js b/superset-frontend/spec/javascripts/dashboard/util/newComponentFactory_spec.js
index a06b178..069af58 100644
--- a/superset-frontend/spec/javascripts/dashboard/util/newComponentFactory_spec.js
+++ b/superset-frontend/spec/javascripts/dashboard/util/newComponentFactory_spec.js
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import newComponentFactory from '../../../../src/dashboard/util/newComponentFactory';
+import newComponentFactory from 'src/dashboard/util/newComponentFactory';
 
 import {
   CHART_TYPE,
@@ -30,7 +30,7 @@ import {
   ROW_TYPE,
   TABS_TYPE,
   TAB_TYPE,
-} from '../../../../src/dashboard/util/componentTypes';
+} from 'src/dashboard/util/componentTypes';
 
 const types = [
   CHART_TYPE,
diff --git a/superset-frontend/spec/javascripts/dashboard/util/newEntitiesFromDrop_spec.js b/superset-frontend/spec/javascripts/dashboard/util/newEntitiesFromDrop_spec.js
index b240b68..339ab1e 100644
--- a/superset-frontend/spec/javascripts/dashboard/util/newEntitiesFromDrop_spec.js
+++ b/superset-frontend/spec/javascripts/dashboard/util/newEntitiesFromDrop_spec.js
@@ -16,14 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import newEntitiesFromDrop from '../../../../src/dashboard/util/newEntitiesFromDrop';
+import newEntitiesFromDrop from 'src/dashboard/util/newEntitiesFromDrop';
 import {
   CHART_TYPE,
   DASHBOARD_GRID_TYPE,
   ROW_TYPE,
   TABS_TYPE,
   TAB_TYPE,
-} from '../../../../src/dashboard/util/componentTypes';
+} from 'src/dashboard/util/componentTypes';
 
 describe('newEntitiesFromDrop', () => {
   it('should return a new Entity of appropriate type, and add it to the drop target children', () => {
diff --git a/superset-frontend/spec/javascripts/dashboard/util/updateComponentParentsList_spec.js b/superset-frontend/spec/javascripts/dashboard/util/updateComponentParentsList_spec.js
index d435f0d..83ece59 100644
--- a/superset-frontend/spec/javascripts/dashboard/util/updateComponentParentsList_spec.js
+++ b/superset-frontend/spec/javascripts/dashboard/util/updateComponentParentsList_spec.js
@@ -16,8 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import updateComponentParentsList from '../../../../src/dashboard/util/updateComponentParentsList';
-import { DASHBOARD_ROOT_ID } from '../../../../src/dashboard/util/constants';
+import updateComponentParentsList from 'src/dashboard/util/updateComponentParentsList';
+import { DASHBOARD_ROOT_ID } from 'src/dashboard/util/constants';
 import {
   dashboardLayout,
   dashboardLayoutWithTabs,
diff --git a/superset-frontend/spec/javascripts/datasource/ChangeDatasourceModal_spec.jsx b/superset-frontend/spec/javascripts/datasource/ChangeDatasourceModal_spec.jsx
index c1da270..50ba634 100644
--- a/superset-frontend/spec/javascripts/datasource/ChangeDatasourceModal_spec.jsx
+++ b/superset-frontend/spec/javascripts/datasource/ChangeDatasourceModal_spec.jsx
@@ -24,7 +24,7 @@ import fetchMock from 'fetch-mock';
 import thunk from 'redux-thunk';
 import sinon from 'sinon';
 
-import ChangeDatasourceModal from '../../../src/datasource/ChangeDatasourceModal';
+import ChangeDatasourceModal from 'src/datasource/ChangeDatasourceModal';
 import mockDatasource from '../../fixtures/mockDatasource';
 
 const props = {
diff --git a/superset-frontend/spec/javascripts/datasource/DatasourceEditor_spec.jsx b/superset-frontend/spec/javascripts/datasource/DatasourceEditor_spec.jsx
index 898d768..b3b1269 100644
--- a/superset-frontend/spec/javascripts/datasource/DatasourceEditor_spec.jsx
+++ b/superset-frontend/spec/javascripts/datasource/DatasourceEditor_spec.jsx
@@ -23,8 +23,8 @@ import configureStore from 'redux-mock-store';
 import fetchMock from 'fetch-mock';
 import thunk from 'redux-thunk';
 
-import DatasourceEditor from '../../../src/datasource/DatasourceEditor';
-import Field from '../../../src/CRUD/Field';
+import DatasourceEditor from 'src/datasource/DatasourceEditor';
+import Field from 'src/CRUD/Field';
 import mockDatasource from '../../fixtures/mockDatasource';
 
 const props = {
@@ -94,10 +94,7 @@ describe('DatasourceEditor', () => {
     wrapper.setState({ activeTabKey: 4 });
     expect(wrapper.state('isSqla')).toBe(true);
     expect(
-      wrapper
-        .find(Field)
-        .find({ fieldKey: 'fetch_values_predicate' })
-        .exists(),
+      wrapper.find(Field).find({ fieldKey: 'fetch_values_predicate' }).exists(),
     ).toBe(true);
   });
 });
diff --git a/superset-frontend/spec/javascripts/datasource/DatasourceModal_spec.jsx b/superset-frontend/spec/javascripts/datasource/DatasourceModal_spec.jsx
index 720ef98..3dba20f 100644
--- a/superset-frontend/spec/javascripts/datasource/DatasourceModal_spec.jsx
+++ b/superset-frontend/spec/javascripts/datasource/DatasourceModal_spec.jsx
@@ -24,8 +24,8 @@ import fetchMock from 'fetch-mock';
 import thunk from 'redux-thunk';
 import sinon from 'sinon';
 
-import DatasourceModal from '../../../src/datasource/DatasourceModal';
-import DatasourceEditor from '../../../src/datasource/DatasourceEditor';
+import DatasourceModal from 'src/datasource/DatasourceModal';
+import DatasourceEditor from 'src/datasource/DatasourceEditor';
 import mockDatasource from '../../fixtures/mockDatasource';
 
 const props = {
diff --git a/superset-frontend/spec/javascripts/explore/AdhocFilter_spec.js b/superset-frontend/spec/javascripts/explore/AdhocFilter_spec.js
index b699ad9..3e56d3e 100644
--- a/superset-frontend/spec/javascripts/explore/AdhocFilter_spec.js
+++ b/superset-frontend/spec/javascripts/explore/AdhocFilter_spec.js
@@ -19,7 +19,7 @@
 import AdhocFilter, {
   EXPRESSION_TYPES,
   CLAUSES,
-} from '../../../src/explore/AdhocFilter';
+} from 'src/explore/AdhocFilter';
 
 describe('AdhocFilter', () => {
   it('sets filterOptionName in constructor', () => {
diff --git a/superset-frontend/spec/javascripts/explore/AdhocMetric_spec.js b/superset-frontend/spec/javascripts/explore/AdhocMetric_spec.js
index a564412..696495d 100644
--- a/superset-frontend/spec/javascripts/explore/AdhocMetric_spec.js
+++ b/superset-frontend/spec/javascripts/explore/AdhocMetric_spec.js
@@ -16,10 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import AdhocMetric, {
-  EXPRESSION_TYPES,
-} from '../../../src/explore/AdhocMetric';
-import { AGGREGATES } from '../../../src/explore/constants';
+import AdhocMetric, { EXPRESSION_TYPES } from 'src/explore/AdhocMetric';
+import { AGGREGATES } from 'src/explore/constants';
 
 const valueColumn = { type: 'DOUBLE', column_name: 'value' };
 
diff --git a/superset-frontend/spec/javascripts/explore/components/AdhocFilterControl_spec.jsx b/superset-frontend/spec/javascripts/explore/components/AdhocFilterControl_spec.jsx
index 25859c3..0fe614e 100644
--- a/superset-frontend/spec/javascripts/explore/components/AdhocFilterControl_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/AdhocFilterControl_spec.jsx
@@ -24,11 +24,11 @@ import { shallow } from 'enzyme';
 import AdhocFilter, {
   EXPRESSION_TYPES,
   CLAUSES,
-} from '../../../../src/explore/AdhocFilter';
-import AdhocFilterControl from '../../../../src/explore/components/controls/AdhocFilterControl';
-import AdhocMetric from '../../../../src/explore/AdhocMetric';
-import { AGGREGATES, OPERATORS } from '../../../../src/explore/constants';
-import OnPasteSelect from '../../../../src/components/OnPasteSelect';
+} from 'src/explore/AdhocFilter';
+import AdhocFilterControl from 'src/explore/components/controls/AdhocFilterControl';
+import AdhocMetric from 'src/explore/AdhocMetric';
+import { AGGREGATES, OPERATORS } from 'src/explore/constants';
+import OnPasteSelect from 'src/components/OnPasteSelect';
 
 const simpleAdhocFilter = new AdhocFilter({
   expressionType: EXPRESSION_TYPES.SIMPLE,
diff --git a/superset-frontend/spec/javascripts/explore/components/AdhocFilterEditPopoverSimpleTabContent_spec.jsx b/superset-frontend/spec/javascripts/explore/components/AdhocFilterEditPopoverSimpleTabContent_spec.jsx
index 1d1f376..ea0295a 100644
--- a/superset-frontend/spec/javascripts/explore/components/AdhocFilterEditPopoverSimpleTabContent_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/AdhocFilterEditPopoverSimpleTabContent_spec.jsx
@@ -25,10 +25,10 @@ import { FormGroup } from 'react-bootstrap';
 import AdhocFilter, {
   EXPRESSION_TYPES,
   CLAUSES,
-} from '../../../../src/explore/AdhocFilter';
-import AdhocMetric from '../../../../src/explore/AdhocMetric';
-import AdhocFilterEditPopoverSimpleTabContent from '../../../../src/explore/components/AdhocFilterEditPopoverSimpleTabContent';
-import { AGGREGATES } from '../../../../src/explore/constants';
+} from 'src/explore/AdhocFilter';
+import AdhocMetric from 'src/explore/AdhocMetric';
+import AdhocFilterEditPopoverSimpleTabContent from 'src/explore/components/AdhocFilterEditPopoverSimpleTabContent';
+import { AGGREGATES } from 'src/explore/constants';
 
 const simpleAdhocFilter = new AdhocFilter({
   expressionType: EXPRESSION_TYPES.SIMPLE,
diff --git a/superset-frontend/spec/javascripts/explore/components/AdhocFilterEditPopoverSqlTabContent_spec.jsx b/superset-frontend/spec/javascripts/explore/components/AdhocFilterEditPopoverSqlTabContent_spec.jsx
index eef9027..57f0a8b 100644
--- a/superset-frontend/spec/javascripts/explore/components/AdhocFilterEditPopoverSqlTabContent_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/AdhocFilterEditPopoverSqlTabContent_spec.jsx
@@ -25,8 +25,8 @@ import { FormGroup } from 'react-bootstrap';
 import AdhocFilter, {
   EXPRESSION_TYPES,
   CLAUSES,
-} from '../../../../src/explore/AdhocFilter';
-import AdhocFilterEditPopoverSqlTabContent from '../../../../src/explore/components/AdhocFilterEditPopoverSqlTabContent';
+} from 'src/explore/AdhocFilter';
+import AdhocFilterEditPopoverSqlTabContent from 'src/explore/components/AdhocFilterEditPopoverSqlTabContent';
 
 const sqlAdhocFilter = new AdhocFilter({
   expressionType: EXPRESSION_TYPES.SQL,
diff --git a/superset-frontend/spec/javascripts/explore/components/AdhocFilterEditPopover_spec.jsx b/superset-frontend/spec/javascripts/explore/components/AdhocFilterEditPopover_spec.jsx
index 0f917ab..8b446a2 100644
--- a/superset-frontend/spec/javascripts/explore/components/AdhocFilterEditPopover_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/AdhocFilterEditPopover_spec.jsx
@@ -25,12 +25,12 @@ import { Button, Popover, Tab, Tabs } from 'react-bootstrap';
 import AdhocFilter, {
   EXPRESSION_TYPES,
   CLAUSES,
-} from '../../../../src/explore/AdhocFilter';
-import AdhocMetric from '../../../../src/explore/AdhocMetric';
-import AdhocFilterEditPopover from '../../../../src/explore/components/AdhocFilterEditPopover';
-import AdhocFilterEditPopoverSimpleTabContent from '../../../../src/explore/components/AdhocFilterEditPopoverSimpleTabContent';
-import AdhocFilterEditPopoverSqlTabContent from '../../../../src/explore/components/AdhocFilterEditPopoverSqlTabContent';
-import { AGGREGATES } from '../../../../src/explore/constants';
+} from 'src/explore/AdhocFilter';
+import AdhocMetric from 'src/explore/AdhocMetric';
+import AdhocFilterEditPopover from 'src/explore/components/AdhocFilterEditPopover';
+import AdhocFilterEditPopoverSimpleTabContent from 'src/explore/components/AdhocFilterEditPopoverSimpleTabContent';
+import AdhocFilterEditPopoverSqlTabContent from 'src/explore/components/AdhocFilterEditPopoverSqlTabContent';
+import { AGGREGATES } from 'src/explore/constants';
 
 const simpleAdhocFilter = new AdhocFilter({
   expressionType: EXPRESSION_TYPES.SIMPLE,
diff --git a/superset-frontend/spec/javascripts/explore/components/AdhocFilterOption_spec.jsx b/superset-frontend/spec/javascripts/explore/components/AdhocFilterOption_spec.jsx
index c24a3cf..eb5452b 100644
--- a/superset-frontend/spec/javascripts/explore/components/AdhocFilterOption_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/AdhocFilterOption_spec.jsx
@@ -25,8 +25,8 @@ import { Label, OverlayTrigger } from 'react-bootstrap';
 import AdhocFilter, {
   EXPRESSION_TYPES,
   CLAUSES,
-} from '../../../../src/explore/AdhocFilter';
-import AdhocFilterOption from '../../../../src/explore/components/AdhocFilterOption';
+} from 'src/explore/AdhocFilter';
+import AdhocFilterOption from 'src/explore/components/AdhocFilterOption';
 
 const simpleAdhocFilter = new AdhocFilter({
   expressionType: EXPRESSION_TYPES.SIMPLE,
diff --git a/superset-frontend/spec/javascripts/explore/components/AdhocMetricEditPopoverTitle_spec.jsx b/superset-frontend/spec/javascripts/explore/components/AdhocMetricEditPopoverTitle_spec.jsx
index 15416a1..15b48ad 100644
--- a/superset-frontend/spec/javascripts/explore/components/AdhocMetricEditPopoverTitle_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/AdhocMetricEditPopoverTitle_spec.jsx
@@ -22,9 +22,9 @@ import sinon from 'sinon';
 import { shallow } from 'enzyme';
 import { OverlayTrigger } from 'react-bootstrap';
 
-import AdhocMetric from '../../../../src/explore/AdhocMetric';
-import AdhocMetricEditPopoverTitle from '../../../../src/explore/components/AdhocMetricEditPopoverTitle';
-import { AGGREGATES } from '../../../../src/explore/constants';
+import AdhocMetric from 'src/explore/AdhocMetric';
+import AdhocMetricEditPopoverTitle from 'src/explore/components/AdhocMetricEditPopoverTitle';
+import { AGGREGATES } from 'src/explore/constants';
 
 const columns = [
   { type: 'VARCHAR(255)', column_name: 'source' },
@@ -52,12 +52,9 @@ describe('AdhocMetricEditPopoverTitle', () => {
   it('renders an OverlayTrigger wrapper with the title', () => {
     const { wrapper } = setup();
     expect(wrapper.find(OverlayTrigger)).toHaveLength(1);
-    expect(
-      wrapper
-        .find(OverlayTrigger)
-        .find('span')
-        .text(),
-    ).toBe('My Metric\xa0');
+    expect(wrapper.find(OverlayTrigger).find('span').text()).toBe(
+      'My Metric\xa0',
+    );
   });
 
   it('transfers to edit mode when clicked', () => {
diff --git a/superset-frontend/spec/javascripts/explore/components/AdhocMetricEditPopover_spec.jsx b/superset-frontend/spec/javascripts/explore/components/AdhocMetricEditPopover_spec.jsx
index 3673374..250e5d0 100644
--- a/superset-frontend/spec/javascripts/explore/components/AdhocMetricEditPopover_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/AdhocMetricEditPopover_spec.jsx
@@ -22,11 +22,9 @@ import sinon from 'sinon';
 import { shallow } from 'enzyme';
 import { Button, FormGroup, Popover } from 'react-bootstrap';
 
-import AdhocMetric, {
-  EXPRESSION_TYPES,
-} from '../../../../src/explore/AdhocMetric';
-import AdhocMetricEditPopover from '../../../../src/explore/components/AdhocMetricEditPopover';
-import { AGGREGATES } from '../../../../src/explore/constants';
+import AdhocMetric, { EXPRESSION_TYPES } from 'src/explore/AdhocMetric';
+import AdhocMetricEditPopover from 'src/explore/components/AdhocMetricEditPopover';
+import { AGGREGATES } from 'src/explore/constants';
 
 const columns = [
   { type: 'VARCHAR(255)', column_name: 'source' },
diff --git a/superset-frontend/spec/javascripts/explore/components/AdhocMetricOption_spec.jsx b/superset-frontend/spec/javascripts/explore/components/AdhocMetricOption_spec.jsx
index df52f16..7ba120b 100644
--- a/superset-frontend/spec/javascripts/explore/components/AdhocMetricOption_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/AdhocMetricOption_spec.jsx
@@ -22,9 +22,9 @@ import sinon from 'sinon';
 import { shallow } from 'enzyme';
 import { Label, OverlayTrigger } from 'react-bootstrap';
 
-import AdhocMetric from '../../../../src/explore/AdhocMetric';
-import AdhocMetricOption from '../../../../src/explore/components/AdhocMetricOption';
-import { AGGREGATES } from '../../../../src/explore/constants';
+import AdhocMetric from 'src/explore/AdhocMetric';
+import AdhocMetricOption from 'src/explore/components/AdhocMetricOption';
+import { AGGREGATES } from 'src/explore/constants';
 
 const columns = [
   { type: 'VARCHAR(255)', column_name: 'source' },
diff --git a/superset-frontend/spec/javascripts/explore/components/AdhocMetricStaticOption_spec.jsx b/superset-frontend/spec/javascripts/explore/components/AdhocMetricStaticOption_spec.jsx
index 248468a..7d3b926 100644
--- a/superset-frontend/spec/javascripts/explore/components/AdhocMetricStaticOption_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/AdhocMetricStaticOption_spec.jsx
@@ -20,11 +20,9 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import AdhocMetricStaticOption from '../../../../src/explore/components/AdhocMetricStaticOption';
-import AdhocMetric, {
-  EXPRESSION_TYPES,
-} from '../../../../src/explore/AdhocMetric';
-import { AGGREGATES } from '../../../../src/explore/constants';
+import AdhocMetricStaticOption from 'src/explore/components/AdhocMetricStaticOption';
+import AdhocMetric, { EXPRESSION_TYPES } from 'src/explore/AdhocMetric';
+import { AGGREGATES } from 'src/explore/constants';
 
 const sumValueAdhocMetric = new AdhocMetric({
   expressionType: EXPRESSION_TYPES.SIMPLE,
diff --git a/superset-frontend/spec/javascripts/explore/components/AggregateOption_spec.jsx b/superset-frontend/spec/javascripts/explore/components/AggregateOption_spec.jsx
index 61a1912..371cb1b 100644
--- a/superset-frontend/spec/javascripts/explore/components/AggregateOption_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/AggregateOption_spec.jsx
@@ -20,7 +20,7 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import AggregateOption from '../../../../src/explore/components/AggregateOption';
+import AggregateOption from 'src/explore/components/AggregateOption';
 
 describe('AggregateOption', () => {
   it('renders the aggregate', () => {
diff --git a/superset-frontend/spec/javascripts/explore/components/BoundsControl_spec.jsx b/superset-frontend/spec/javascripts/explore/components/BoundsControl_spec.jsx
index cc05a7f..0af3b5e 100644
--- a/superset-frontend/spec/javascripts/explore/components/BoundsControl_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/BoundsControl_spec.jsx
@@ -22,7 +22,7 @@ import { FormControl } from 'react-bootstrap';
 import sinon from 'sinon';
 import { mount } from 'enzyme';
 
-import BoundsControl from '../../../../src/explore/components/controls/BoundsControl';
+import BoundsControl from 'src/explore/components/controls/BoundsControl';
 
 const defaultProps = {
   name: 'y_axis_bounds',
diff --git a/superset-frontend/spec/javascripts/explore/components/CheckboxControl_spec.jsx b/superset-frontend/spec/javascripts/explore/components/CheckboxControl_spec.jsx
index aafcc97..9a0740c 100644
--- a/superset-frontend/spec/javascripts/explore/components/CheckboxControl_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/CheckboxControl_spec.jsx
@@ -21,9 +21,9 @@ import React from 'react';
 import sinon from 'sinon';
 import { shallow, mount } from 'enzyme';
 
-import CheckboxControl from '../../../../src/explore/components/controls/CheckboxControl';
-import ControlHeader from '../../../../src/explore/components/ControlHeader';
-import Checkbox from '../../../../src/components/Checkbox';
+import CheckboxControl from 'src/explore/components/controls/CheckboxControl';
+import ControlHeader from 'src/explore/components/ControlHeader';
+import Checkbox from 'src/components/Checkbox';
 
 const defaultProps = {
   name: 'show_legend',
@@ -54,10 +54,7 @@ describe('CheckboxControl', () => {
 
     fullComponent.instance().forceUpdate();
 
-    fullComponent
-      .find('label span')
-      .last()
-      .simulate('click');
+    fullComponent.find('label span').last().simulate('click');
 
     expect(spy.calledOnce).toBe(true);
   });
diff --git a/superset-frontend/spec/javascripts/explore/components/ColorPickerControl_spec.jsx b/superset-frontend/spec/javascripts/explore/components/ColorPickerControl_spec.jsx
index c01975e..b07ecfe 100644
--- a/superset-frontend/spec/javascripts/explore/components/ColorPickerControl_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/ColorPickerControl_spec.jsx
@@ -26,8 +26,8 @@ import {
   getCategoricalSchemeRegistry,
 } from '@superset-ui/color';
 
-import ColorPickerControl from '../../../../src/explore/components/controls/ColorPickerControl';
-import ControlHeader from '../../../../src/explore/components/ControlHeader';
+import ColorPickerControl from 'src/explore/components/controls/ColorPickerControl';
+import ControlHeader from 'src/explore/components/ControlHeader';
 
 const defaultProps = {
   value: {},
diff --git a/superset-frontend/spec/javascripts/explore/components/ColorScheme_spec.jsx b/superset-frontend/spec/javascripts/explore/components/ColorScheme_spec.jsx
index a1187a7..2913775 100644
--- a/superset-frontend/spec/javascripts/explore/components/ColorScheme_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/ColorScheme_spec.jsx
@@ -22,7 +22,7 @@ import { mount } from 'enzyme';
 import { Creatable } from 'react-select';
 import { getCategoricalSchemeRegistry } from '@superset-ui/color';
 
-import ColorSchemeControl from '../../../../src/explore/components/controls/ColorSchemeControl';
+import ColorSchemeControl from 'src/explore/components/controls/ColorSchemeControl';
 
 const defaultProps = {
   options: getCategoricalSchemeRegistry()
diff --git a/superset-frontend/spec/javascripts/explore/components/ControlPanelSection_spec.jsx b/superset-frontend/spec/javascripts/explore/components/ControlPanelSection_spec.jsx
index ab554ca..e2839fd 100644
--- a/superset-frontend/spec/javascripts/explore/components/ControlPanelSection_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/ControlPanelSection_spec.jsx
@@ -20,9 +20,9 @@ import React from 'react';
 import { shallow } from 'enzyme';
 import { Panel } from 'react-bootstrap';
 
-import InfoTooltipWithTrigger from '../../../../src/components/InfoTooltipWithTrigger';
+import InfoTooltipWithTrigger from 'src/components/InfoTooltipWithTrigger';
 
-import ControlPanelSection from '../../../../src/explore/components/ControlPanelSection';
+import ControlPanelSection from 'src/explore/components/ControlPanelSection';
 
 const defaultProps = {
   children: <div>a child element</div>,
@@ -55,20 +55,12 @@ describe('ControlPanelSection', () => {
     });
 
     it('renders a label if present', () => {
-      expect(
-        wrapper
-          .find(Panel.Title)
-          .dive()
-          .text(),
-      ).toContain('my label');
+      expect(wrapper.find(Panel.Title).dive().text()).toContain('my label');
     });
 
     it('renders a InfoTooltipWithTrigger if label and tooltip is present', () => {
       expect(
-        wrapper
-          .find(Panel)
-          .dive()
-          .find(InfoTooltipWithTrigger),
+        wrapper.find(Panel).dive().find(InfoTooltipWithTrigger),
       ).toHaveLength(1);
     });
   });
diff --git a/superset-frontend/spec/javascripts/explore/components/ControlRow_spec.jsx b/superset-frontend/spec/javascripts/explore/components/ControlRow_spec.jsx
index e5a245d..61ddee4 100644
--- a/superset-frontend/spec/javascripts/explore/components/ControlRow_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/ControlRow_spec.jsx
@@ -18,7 +18,7 @@
  */
 import React from 'react';
 import { shallow } from 'enzyme';
-import ControlSetRow from '../../../../src/explore/components/ControlRow';
+import ControlSetRow from 'src/explore/components/ControlRow';
 
 describe('ControlSetRow', () => {
   it('renders a single row with one element', () => {
diff --git a/superset-frontend/spec/javascripts/explore/components/DatasourceControl_spec.jsx b/superset-frontend/spec/javascripts/explore/components/DatasourceControl_spec.jsx
index d9633dd..60a2308 100644
--- a/superset-frontend/spec/javascripts/explore/components/DatasourceControl_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/DatasourceControl_spec.jsx
@@ -21,9 +21,9 @@ import sinon from 'sinon';
 import configureStore from 'redux-mock-store';
 import { shallow } from 'enzyme';
 import { MenuItem } from 'react-bootstrap';
-import DatasourceModal from '../../../../src/datasource/DatasourceModal';
-import ChangeDatasourceModal from '../../../../src/datasource/ChangeDatasourceModal';
-import DatasourceControl from '../../../../src/explore/components/controls/DatasourceControl';
+import DatasourceModal from 'src/datasource/DatasourceModal';
+import ChangeDatasourceModal from 'src/datasource/ChangeDatasourceModal';
+import DatasourceControl from 'src/explore/components/controls/DatasourceControl';
 
 const defaultProps = {
   name: 'datasource',
@@ -70,22 +70,16 @@ describe('DatasourceControl', () => {
   it('show or hide Edit Datasource option', () => {
     let wrapper = setup();
     expect(wrapper.find('#datasource_menu')).toHaveLength(1);
-    expect(
-      wrapper
-        .find('#datasource_menu')
-        .dive()
-        .find(MenuItem),
-    ).toHaveLength(2);
+    expect(wrapper.find('#datasource_menu').dive().find(MenuItem)).toHaveLength(
+      2,
+    );
 
     wrapper = setup({
       onDatasourceSave: () => {},
     });
     expect(wrapper.find('#datasource_menu')).toHaveLength(1);
-    expect(
-      wrapper
-        .find('#datasource_menu')
-        .dive()
-        .find(MenuItem),
-    ).toHaveLength(3);
+    expect(wrapper.find('#datasource_menu').dive().find(MenuItem)).toHaveLength(
+      3,
+    );
   });
 });
diff --git a/superset-frontend/spec/javascripts/explore/components/DateFilterControl_spec.jsx b/superset-frontend/spec/javascripts/explore/components/DateFilterControl_spec.jsx
index 09c7d7f..193c650 100644
--- a/superset-frontend/spec/javascripts/explore/components/DateFilterControl_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/DateFilterControl_spec.jsx
@@ -22,8 +22,8 @@ import sinon from 'sinon';
 import { shallow } from 'enzyme';
 import { Button, Label } from 'react-bootstrap';
 
-import DateFilterControl from '../../../../src/explore/components/controls/DateFilterControl';
-import ControlHeader from '../../../../src/explore/components/ControlHeader';
+import DateFilterControl from 'src/explore/components/controls/DateFilterControl';
+import ControlHeader from 'src/explore/components/ControlHeader';
 
 const defaultProps = {
   animation: false,
@@ -70,9 +70,7 @@ describe('DateFilterControl', () => {
     label.simulate('click');
     setTimeout(() => {
       expect(wrapper.find('.popover')).toHaveLength(1);
-      expect(wrapper.find('.ok'))
-        .first()
-        .simulate('click');
+      expect(wrapper.find('.ok')).first().simulate('click');
       setTimeout(() => {
         expect(wrapper.find('.popover')).toHaveLength(0);
       }, 10);
diff --git a/superset-frontend/spec/javascripts/explore/components/DisplayQueryButton_spec.jsx b/superset-frontend/spec/javascripts/explore/components/DisplayQueryButton_spec.jsx
index da36961..66a1751 100644
--- a/superset-frontend/spec/javascripts/explore/components/DisplayQueryButton_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/DisplayQueryButton_spec.jsx
@@ -18,9 +18,8 @@
  */
 import React from 'react';
 import { mount } from 'enzyme';
-import ModalTrigger from './../../../../src/components/ModalTrigger';
-
-import { DisplayQueryButton } from '../../../../src/explore/components/DisplayQueryButton';
+import { DisplayQueryButton } from 'src/explore/components/DisplayQueryButton';
+import ModalTrigger from 'src/components/ModalTrigger';
 
 describe('DisplayQueryButton', () => {
   const defaultProps = {
diff --git a/superset-frontend/spec/javascripts/explore/components/EmbedCodeButton_spec.jsx b/superset-frontend/spec/javascripts/explore/components/EmbedCodeButton_spec.jsx
index e235363..081b590 100644
--- a/superset-frontend/spec/javascripts/explore/components/EmbedCodeButton_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/EmbedCodeButton_spec.jsx
@@ -21,8 +21,8 @@ import { shallow, mount } from 'enzyme';
 import { OverlayTrigger } from 'react-bootstrap';
 import sinon from 'sinon';
 
-import EmbedCodeButton from '../../../../src/explore/components/EmbedCodeButton';
-import * as exploreUtils from '../../../../src/explore/exploreUtils';
+import EmbedCodeButton from 'src/explore/components/EmbedCodeButton';
+import * as exploreUtils from 'src/explore/exploreUtils';
 
 describe('EmbedCodeButton', () => {
   const defaultProps = {
diff --git a/superset-frontend/spec/javascripts/explore/components/ExploreActionButtons_spec.jsx b/superset-frontend/spec/javascripts/explore/components/ExploreActionButtons_spec.jsx
index bc66505..6a8b6e0 100644
--- a/superset-frontend/spec/javascripts/explore/components/ExploreActionButtons_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/ExploreActionButtons_spec.jsx
@@ -18,7 +18,7 @@
  */
 import React from 'react';
 import { shallow } from 'enzyme';
-import ExploreActionButtons from '../../../../src/explore/components/ExploreActionButtons';
+import ExploreActionButtons from 'src/explore/components/ExploreActionButtons';
 
 describe('ExploreActionButtons', () => {
   const defaultProps = {
diff --git a/superset-frontend/spec/javascripts/explore/components/ExploreChartHeader_spec.jsx b/superset-frontend/spec/javascripts/explore/components/ExploreChartHeader_spec.jsx
index 8ee9273..24bfdc4 100644
--- a/superset-frontend/spec/javascripts/explore/components/ExploreChartHeader_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/ExploreChartHeader_spec.jsx
@@ -19,9 +19,9 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import { ExploreChartHeader } from '../../../../src/explore/components/ExploreChartHeader';
-import ExploreActionButtons from '../../../../src/explore/components/ExploreActionButtons';
-import EditableTitle from '../../../../src/components/EditableTitle';
+import { ExploreChartHeader } from 'src/explore/components/ExploreChartHeader';
+import ExploreActionButtons from 'src/explore/components/ExploreActionButtons';
+import EditableTitle from 'src/components/EditableTitle';
 
 const stub = jest.fn(() => ({
   then: () => {},
diff --git a/superset-frontend/spec/javascripts/explore/components/ExploreChartPanel_spec.jsx b/superset-frontend/spec/javascripts/explore/components/ExploreChartPanel_spec.jsx
index 2b1ad85..f05c304 100644
--- a/superset-frontend/spec/javascripts/explore/components/ExploreChartPanel_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/ExploreChartPanel_spec.jsx
@@ -18,7 +18,7 @@
  */
 import React from 'react';
 
-import ChartContainer from '../../../../src/explore/components/ExploreChartPanel';
+import ChartContainer from 'src/explore/components/ExploreChartPanel';
 
 describe('ChartContainer', () => {
   const mockProps = {
diff --git a/superset-frontend/spec/javascripts/explore/components/FilterBoxItemControl_spec.jsx b/superset-frontend/spec/javascripts/explore/components/FilterBoxItemControl_spec.jsx
index 77a4e83..162ab47 100644
--- a/superset-frontend/spec/javascripts/explore/components/FilterBoxItemControl_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/FilterBoxItemControl_spec.jsx
@@ -22,8 +22,8 @@ import sinon from 'sinon';
 import { shallow } from 'enzyme';
 import { OverlayTrigger } from 'react-bootstrap';
 
-import FilterBoxItemControl from '../../../../src/explore/components/controls/FilterBoxItemControl';
-import FormRow from '../../../../src/components/FormRow';
+import FilterBoxItemControl from 'src/explore/components/controls/FilterBoxItemControl';
+import FormRow from 'src/components/FormRow';
 import datasources from '../../../fixtures/mockDatasource';
 
 const defaultProps = {
diff --git a/superset-frontend/spec/javascripts/explore/components/FilterDefinitionOption_spec.jsx b/superset-frontend/spec/javascripts/explore/components/FilterDefinitionOption_spec.jsx
index 7ab7f5b..9dd0892 100644
--- a/superset-frontend/spec/javascripts/explore/components/FilterDefinitionOption_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/FilterDefinitionOption_spec.jsx
@@ -20,13 +20,11 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import FilterDefinitionOption from '../../../../src/explore/components/FilterDefinitionOption';
-import ColumnOption from '../../../../src/components/ColumnOption';
-import AdhocMetricStaticOption from '../../../../src/explore/components/AdhocMetricStaticOption';
-import AdhocMetric, {
-  EXPRESSION_TYPES,
-} from '../../../../src/explore/AdhocMetric';
-import { AGGREGATES } from '../../../../src/explore/constants';
+import FilterDefinitionOption from 'src/explore/components/FilterDefinitionOption';
+import ColumnOption from 'src/components/ColumnOption';
+import AdhocMetricStaticOption from 'src/explore/components/AdhocMetricStaticOption';
+import AdhocMetric, { EXPRESSION_TYPES } from 'src/explore/AdhocMetric';
+import { AGGREGATES } from 'src/explore/constants';
 
 const sumValueAdhocMetric = new AdhocMetric({
   expressionType: EXPRESSION_TYPES.SIMPLE,
diff --git a/superset-frontend/spec/javascripts/explore/components/FixedOrMetricControl_spec.jsx b/superset-frontend/spec/javascripts/explore/components/FixedOrMetricControl_spec.jsx
index 1ab4243..a88784b 100644
--- a/superset-frontend/spec/javascripts/explore/components/FixedOrMetricControl_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/FixedOrMetricControl_spec.jsx
@@ -20,9 +20,9 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import FixedOrMetricControl from '../../../../src/explore/components/controls/FixedOrMetricControl';
-import TextControl from '../../../../src/explore/components/controls/TextControl';
-import MetricsControl from '../../../../src/explore/components/controls/MetricsControl';
+import FixedOrMetricControl from 'src/explore/components/controls/FixedOrMetricControl';
+import TextControl from 'src/explore/components/controls/TextControl';
+import MetricsControl from 'src/explore/components/controls/MetricsControl';
 
 const defaultProps = {
   value: {},
diff --git a/superset-frontend/spec/javascripts/explore/components/MetricDefinitionOption_spec.jsx b/superset-frontend/spec/javascripts/explore/components/MetricDefinitionOption_spec.jsx
index f1b55c8..5a3a2e6 100644
--- a/superset-frontend/spec/javascripts/explore/components/MetricDefinitionOption_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/MetricDefinitionOption_spec.jsx
@@ -20,10 +20,10 @@ import React from 'react';
 import configureStore from 'redux-mock-store';
 import { shallow } from 'enzyme';
 
-import MetricDefinitionOption from '../../../../src/explore/components/MetricDefinitionOption';
-import MetricOption from '../../../../src/components/MetricOption';
-import ColumnOption from '../../../../src/components/ColumnOption';
-import AggregateOption from '../../../../src/explore/components/AggregateOption';
+import MetricDefinitionOption from 'src/explore/components/MetricDefinitionOption';
+import MetricOption from 'src/components/MetricOption';
+import ColumnOption from 'src/components/ColumnOption';
+import AggregateOption from 'src/explore/components/AggregateOption';
 
 describe('MetricDefinitionOption', () => {
   const mockStore = configureStore([]);
diff --git a/superset-frontend/spec/javascripts/explore/components/MetricDefinitionValue_spec.jsx b/superset-frontend/spec/javascripts/explore/components/MetricDefinitionValue_spec.jsx
index 2a326be..84f7548 100644
--- a/superset-frontend/spec/javascripts/explore/components/MetricDefinitionValue_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/MetricDefinitionValue_spec.jsx
@@ -20,11 +20,11 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import MetricDefinitionValue from '../../../../src/explore/components/MetricDefinitionValue';
-import MetricOption from '../../../../src/components/MetricOption';
-import AdhocMetricOption from '../../../../src/explore/components/AdhocMetricOption';
-import AdhocMetric from '../../../../src/explore/AdhocMetric';
-import { AGGREGATES } from '../../../../src/explore/constants';
+import MetricDefinitionValue from 'src/explore/components/MetricDefinitionValue';
+import MetricOption from 'src/components/MetricOption';
+import AdhocMetricOption from 'src/explore/components/AdhocMetricOption';
+import AdhocMetric from 'src/explore/AdhocMetric';
+import { AGGREGATES } from 'src/explore/constants';
 
 const sumValueAdhocMetric = new AdhocMetric({
   column: { type: 'DOUBLE', column_name: 'value' },
diff --git a/superset-frontend/spec/javascripts/explore/components/MetricsControl_spec.jsx b/superset-frontend/spec/javascripts/explore/components/MetricsControl_spec.jsx
index a27b524..6742877 100644
--- a/superset-frontend/spec/javascripts/explore/components/MetricsControl_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/MetricsControl_spec.jsx
@@ -21,12 +21,10 @@ import React from 'react';
 import sinon from 'sinon';
 import { shallow } from 'enzyme';
 
-import MetricsControl from '../../../../src/explore/components/controls/MetricsControl';
-import { AGGREGATES } from '../../../../src/explore/constants';
-import OnPasteSelect from '../../../../src/components/OnPasteSelect';
-import AdhocMetric, {
-  EXPRESSION_TYPES,
-} from '../../../../src/explore/AdhocMetric';
+import MetricsControl from 'src/explore/components/controls/MetricsControl';
+import { AGGREGATES } from 'src/explore/constants';
+import OnPasteSelect from 'src/components/OnPasteSelect';
+import AdhocMetric, { EXPRESSION_TYPES } from 'src/explore/AdhocMetric';
 
 const defaultProps = {
   name: 'metrics',
diff --git a/superset-frontend/spec/javascripts/explore/components/QueryAndSaveBtns_spec.jsx b/superset-frontend/spec/javascripts/explore/components/QueryAndSaveBtns_spec.jsx
index 7ddfb99..ec9bfe9 100644
--- a/superset-frontend/spec/javascripts/explore/components/QueryAndSaveBtns_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/QueryAndSaveBtns_spec.jsx
@@ -20,8 +20,8 @@ import React from 'react';
 import { shallow } from 'enzyme';
 import sinon from 'sinon';
 
-import QueryAndSaveButtons from '../../../../src/explore/components/QueryAndSaveBtns';
-import Button from '../../../../src/components/Button';
+import QueryAndSaveButtons from 'src/explore/components/QueryAndSaveBtns';
+import Button from 'src/components/Button';
 
 describe('QueryAndSaveButtons', () => {
   const defaultProps = {
diff --git a/superset-frontend/spec/javascripts/explore/components/RowCountLabel_spec.jsx b/superset-frontend/spec/javascripts/explore/components/RowCountLabel_spec.jsx
index 3d4cff8..13679bf 100644
--- a/superset-frontend/spec/javascripts/explore/components/RowCountLabel_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/RowCountLabel_spec.jsx
@@ -20,9 +20,8 @@ import React from 'react';
 import { shallow } from 'enzyme';
 import { Label } from 'react-bootstrap';
 
-import TooltipWrapper from './../../../../src/components/TooltipWrapper';
-
-import RowCountLabel from '../../../../src/explore/components/RowCountLabel';
+import TooltipWrapper from 'src/components/TooltipWrapper';
+import RowCountLabel from 'src/explore/components/RowCountLabel';
 
 describe('RowCountLabel', () => {
   const defaultProps = {
@@ -46,11 +45,6 @@ describe('RowCountLabel', () => {
       limit: 100,
     };
     const wrapper = shallow(<RowCountLabel {...props} />);
-    expect(
-      wrapper
-        .find(Label)
-        .first()
-        .props().bsStyle,
-    ).toBe('danger');
+    expect(wrapper.find(Label).first().props().bsStyle).toBe('danger');
   });
 });
diff --git a/superset-frontend/spec/javascripts/explore/components/RunQueryActionButton_spec.jsx b/superset-frontend/spec/javascripts/explore/components/RunQueryActionButton_spec.jsx
index 7322197..cd7c07b 100644
--- a/superset-frontend/spec/javascripts/explore/components/RunQueryActionButton_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/RunQueryActionButton_spec.jsx
@@ -19,8 +19,8 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import RunQueryActionButton from '../../../../src/SqlLab/components/RunQueryActionButton';
-import Button from '../../../../src/components/Button';
+import RunQueryActionButton from 'src/SqlLab/components/RunQueryActionButton';
+import Button from 'src/components/Button';
 
 describe('RunQueryActionButton', () => {
   let wrapper;
diff --git a/superset-frontend/spec/javascripts/explore/components/SaveModal_spec.jsx b/superset-frontend/spec/javascripts/explore/components/SaveModal_spec.jsx
index 2ee039c..0d1c4a6 100644
--- a/superset-frontend/spec/javascripts/explore/components/SaveModal_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/SaveModal_spec.jsx
@@ -26,9 +26,9 @@ import { Modal, Button, Radio } from 'react-bootstrap';
 import sinon from 'sinon';
 import fetchMock from 'fetch-mock';
 
-import * as exploreUtils from '../../../../src/explore/exploreUtils';
-import * as saveModalActions from '../../../../src/explore/actions/saveModalActions';
-import SaveModal from '../../../../src/explore/components/SaveModal';
+import * as exploreUtils from 'src/explore/exploreUtils';
+import * as saveModalActions from 'src/explore/actions/saveModalActions';
+import SaveModal from 'src/explore/components/SaveModal';
 
 describe('SaveModal', () => {
   const middlewares = [thunk];
diff --git a/superset-frontend/spec/javascripts/explore/components/SelectControl_spec.jsx b/superset-frontend/spec/javascripts/explore/components/SelectControl_spec.jsx
index 05e47d5..bc7ffa7 100644
--- a/superset-frontend/spec/javascripts/explore/components/SelectControl_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/SelectControl_spec.jsx
@@ -22,9 +22,9 @@ import Select, { Creatable } from 'react-select';
 import VirtualizedSelect from 'react-virtualized-select';
 import sinon from 'sinon';
 import { shallow } from 'enzyme';
-import OnPasteSelect from '../../../../src/components/OnPasteSelect';
-import VirtualizedRendererWrap from '../../../../src/components/VirtualizedRendererWrap';
-import SelectControl from '../../../../src/explore/components/controls/SelectControl';
+import OnPasteSelect from 'src/components/OnPasteSelect';
+import VirtualizedRendererWrap from 'src/components/VirtualizedRendererWrap';
+import SelectControl from 'src/explore/components/controls/SelectControl';
 
 const defaultProps = {
   choices: [
diff --git a/superset-frontend/spec/javascripts/explore/components/TextArea_spec.jsx b/superset-frontend/spec/javascripts/explore/components/TextArea_spec.jsx
index 1a18691..56cb000 100644
--- a/superset-frontend/spec/javascripts/explore/components/TextArea_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/TextArea_spec.jsx
@@ -23,7 +23,7 @@ import sinon from 'sinon';
 import { shallow } from 'enzyme';
 import AceEditor from 'react-ace';
 
-import TextAreaControl from '../../../../src/explore/components/controls/TextAreaControl';
+import TextAreaControl from 'src/explore/components/controls/TextAreaControl';
 
 const defaultProps = {
   name: 'x_axis_label',
diff --git a/superset-frontend/spec/javascripts/explore/components/TimeSeriesColumnControl_spec.jsx b/superset-frontend/spec/javascripts/explore/components/TimeSeriesColumnControl_spec.jsx
index bb8b235..71c7966 100644
--- a/superset-frontend/spec/javascripts/explore/components/TimeSeriesColumnControl_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/TimeSeriesColumnControl_spec.jsx
@@ -22,7 +22,7 @@ import { FormControl, OverlayTrigger } from 'react-bootstrap';
 import sinon from 'sinon';
 import { shallow } from 'enzyme';
 
-import TimeSeriesColumnControl from '../../../../src/explore/components/controls/TimeSeriesColumnControl';
+import TimeSeriesColumnControl from 'src/explore/components/controls/TimeSeriesColumnControl';
 
 const defaultProps = {
   name: 'x_axis_label',
diff --git a/superset-frontend/spec/javascripts/explore/components/ViewportControl_spec.jsx b/superset-frontend/spec/javascripts/explore/components/ViewportControl_spec.jsx
index 768a05e..2f66de7 100644
--- a/superset-frontend/spec/javascripts/explore/components/ViewportControl_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/ViewportControl_spec.jsx
@@ -21,9 +21,9 @@ import React from 'react';
 import { shallow } from 'enzyme';
 import { OverlayTrigger, Label } from 'react-bootstrap';
 
-import ViewportControl from '../../../../src/explore/components/controls/ViewportControl';
-import TextControl from '../../../../src/explore/components/controls/TextControl';
-import ControlHeader from '../../../../src/explore/components/ControlHeader';
+import ViewportControl from 'src/explore/components/controls/ViewportControl';
+import TextControl from 'src/explore/components/controls/TextControl';
+import ControlHeader from 'src/explore/components/ControlHeader';
 
 const defaultProps = {
   value: {
@@ -55,12 +55,8 @@ describe('ViewportControl', () => {
   });
 
   it('renders a summary in the label', () => {
-    expect(
-      wrapper
-        .find(Label)
-        .first()
-        .render()
-        .text(),
-    ).toBe('6° 51\' 8.50" | 31° 13\' 21.56"');
+    expect(wrapper.find(Label).first().render().text()).toBe(
+      '6° 51\' 8.50" | 31° 13\' 21.56"',
+    );
   });
 });
diff --git a/superset-frontend/spec/javascripts/explore/components/VizTypeControl_spec.jsx b/superset-frontend/spec/javascripts/explore/components/VizTypeControl_spec.jsx
index e266e9f..493db22 100644
--- a/superset-frontend/spec/javascripts/explore/components/VizTypeControl_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/VizTypeControl_spec.jsx
@@ -21,7 +21,7 @@ import sinon from 'sinon';
 import { shallow } from 'enzyme';
 import { Modal } from 'react-bootstrap';
 import { getChartMetadataRegistry, ChartMetadata } from '@superset-ui/chart';
-import VizTypeControl from '../../../../src/explore/components/controls/VizTypeControl';
+import VizTypeControl from 'src/explore/components/controls/VizTypeControl';
 
 const defaultProps = {
   name: 'viz_type',
diff --git a/superset-frontend/spec/javascripts/explore/components/withVerification_spec.jsx b/superset-frontend/spec/javascripts/explore/components/withVerification_spec.jsx
index f7cd157..ed94572 100644
--- a/superset-frontend/spec/javascripts/explore/components/withVerification_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/withVerification_spec.jsx
@@ -21,8 +21,8 @@ import sinon from 'sinon';
 import { shallow } from 'enzyme';
 import fetchMock from 'fetch-mock';
 
-import MetricsControl from '../../../../src/explore/components/controls/MetricsControl';
-import withVerification from '../../../../src/explore/components/controls/withVerification';
+import MetricsControl from 'src/explore/components/controls/MetricsControl';
+import withVerification from 'src/explore/components/controls/withVerification';
 
 const defaultProps = {
   name: 'metrics',
diff --git a/superset-frontend/spec/javascripts/explore/controlUtils_spec.jsx b/superset-frontend/spec/javascripts/explore/controlUtils_spec.jsx
index aaac681..67f658f 100644
--- a/superset-frontend/spec/javascripts/explore/controlUtils_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/controlUtils_spec.jsx
@@ -26,8 +26,8 @@ import {
   getFormDataFromControls,
   applyMapStateToPropsToControl,
   getAllControlsState,
-} from '../../../src/explore/controlUtils';
-import ColumnOption from '../../../src/components/ColumnOption';
+} from 'src/explore/controlUtils';
+import ColumnOption from 'src/components/ColumnOption';
 
 describe('controlUtils', () => {
   const state = {
diff --git a/superset-frontend/spec/javascripts/explore/exploreActions_spec.js b/superset-frontend/spec/javascripts/explore/exploreActions_spec.js
index 54c39b0..b0ab99d 100644
--- a/superset-frontend/spec/javascripts/explore/exploreActions_spec.js
+++ b/superset-frontend/spec/javascripts/explore/exploreActions_spec.js
@@ -17,9 +17,9 @@
  * under the License.
  */
 /* eslint-disable no-unused-expressions */
-import { defaultState } from '../../../src/explore/store';
-import exploreReducer from '../../../src/explore/reducers/exploreReducer';
-import * as actions from '../../../src/explore/actions/exploreActions';
+import { defaultState } from 'src/explore/store';
+import exploreReducer from 'src/explore/reducers/exploreReducer';
+import * as actions from 'src/explore/actions/exploreActions';
 
 describe('reducers', () => {
   it('sets correct control value given a key and value', () => {
diff --git a/superset-frontend/spec/javascripts/explore/store_spec.jsx b/superset-frontend/spec/javascripts/explore/store_spec.jsx
index 80e3d10..5468ab5 100644
--- a/superset-frontend/spec/javascripts/explore/store_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/store_spec.jsx
@@ -17,7 +17,7 @@
  * under the License.
  */
 import { getChartControlPanelRegistry } from '@superset-ui/chart';
-import { applyDefaultFormData } from '../../../src/explore/store';
+import { applyDefaultFormData } from 'src/explore/store';
 
 describe('store', () => {
   beforeAll(() => {
diff --git a/superset-frontend/spec/javascripts/explore/utils_spec.jsx b/superset-frontend/spec/javascripts/explore/utils_spec.jsx
index 399d761..f8bf7fa 100644
--- a/superset-frontend/spec/javascripts/explore/utils_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/utils_spec.jsx
@@ -22,8 +22,8 @@ import URI from 'urijs';
 import {
   getExploreUrlAndPayload,
   getExploreLongUrl,
-} from '../../../src/explore/exploreUtils';
-import * as hostNamesConfig from '../../../src/utils/hostNamesConfig';
+} from 'src/explore/exploreUtils';
+import * as hostNamesConfig from 'src/utils/hostNamesConfig';
 
 describe('exploreUtils', () => {
   const location = window.location;
diff --git a/superset-frontend/spec/javascripts/messageToasts/components/ToastPresenter_spec.jsx b/superset-frontend/spec/javascripts/messageToasts/components/ToastPresenter_spec.jsx
index 6b349b5..d888dad 100644
--- a/superset-frontend/spec/javascripts/messageToasts/components/ToastPresenter_spec.jsx
+++ b/superset-frontend/spec/javascripts/messageToasts/components/ToastPresenter_spec.jsx
@@ -18,10 +18,10 @@
  */
 import React from 'react';
 import { shallow } from 'enzyme';
+import Toast from 'src/messageToasts/components/Toast';
+import ToastPresenter from 'src/messageToasts/components/ToastPresenter';
 
 import mockMessageToasts from '../mockMessageToasts';
-import Toast from '../../../../src/messageToasts/components/Toast';
-import ToastPresenter from '../../../../src/messageToasts/components/ToastPresenter';
 
 describe('ToastPresenter', () => {
   const props = {
@@ -47,11 +47,6 @@ describe('ToastPresenter', () => {
   it('should pass removeToast to the Toast component', () => {
     const removeToast = () => {};
     const wrapper = setup({ removeToast });
-    expect(
-      wrapper
-        .find(Toast)
-        .first()
-        .prop('onCloseToast'),
-    ).toBe(removeToast);
+    expect(wrapper.find(Toast).first().prop('onCloseToast')).toBe(removeToast);
   });
 });
diff --git a/superset-frontend/spec/javascripts/messageToasts/components/Toast_spec.jsx b/superset-frontend/spec/javascripts/messageToasts/components/Toast_spec.jsx
index 901dee8..2ab6b0e 100644
--- a/superset-frontend/spec/javascripts/messageToasts/components/Toast_spec.jsx
+++ b/superset-frontend/spec/javascripts/messageToasts/components/Toast_spec.jsx
@@ -19,9 +19,9 @@
 import { Alert } from 'react-bootstrap';
 import React from 'react';
 import { mount } from 'enzyme';
+import Toast from 'src/messageToasts/components/Toast';
 
 import mockMessageToasts from '../mockMessageToasts';
-import Toast from '../../../../src/messageToasts/components/Toast';
 
 describe('Toast', () => {
   const props = {
@@ -43,12 +43,7 @@ describe('Toast', () => {
     const wrapper = setup();
     const alert = wrapper.find(Alert);
 
-    expect(
-      alert
-        .childAt(0)
-        .childAt(1)
-        .text(),
-    ).toBe(props.toast.text);
+    expect(alert.childAt(0).childAt(1).text()).toBe(props.toast.text);
   });
 
   it('should call onCloseToast upon alert dismissal', done => {
diff --git a/superset-frontend/spec/javascripts/messageToasts/mockMessageToasts.js b/superset-frontend/spec/javascripts/messageToasts/mockMessageToasts.js
index 9c2938d..e009ba5 100644
--- a/superset-frontend/spec/javascripts/messageToasts/mockMessageToasts.js
+++ b/superset-frontend/spec/javascripts/messageToasts/mockMessageToasts.js
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { INFO_TOAST, DANGER_TOAST } from '../../../src/messageToasts/constants';
+import { INFO_TOAST, DANGER_TOAST } from 'src/messageToasts/constants';
 
 export default [
   { id: 'info_id', toastType: INFO_TOAST, text: 'info toast' },
diff --git a/superset-frontend/spec/javascripts/messageToasts/reducers/messageToasts_spec.js b/superset-frontend/spec/javascripts/messageToasts/reducers/messageToasts_spec.js
index e523167..11a509e 100644
--- a/superset-frontend/spec/javascripts/messageToasts/reducers/messageToasts_spec.js
+++ b/superset-frontend/spec/javascripts/messageToasts/reducers/messageToasts_spec.js
@@ -16,8 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { ADD_TOAST, REMOVE_TOAST } from '../../../../src/messageToasts/actions';
-import messageToastsReducer from '../../../../src/messageToasts/reducers';
+import { ADD_TOAST, REMOVE_TOAST } from 'src/messageToasts/actions';
+import messageToastsReducer from 'src/messageToasts/reducers';
 
 describe('messageToasts reducer', () => {
   it('should return initial state', () => {
diff --git a/superset-frontend/spec/javascripts/messageToasts/utils/getToastsFromPyFlashMessages_spec.js b/superset-frontend/spec/javascripts/messageToasts/utils/getToastsFromPyFlashMessages_spec.js
index 12113d5..edabc0a 100644
--- a/superset-frontend/spec/javascripts/messageToasts/utils/getToastsFromPyFlashMessages_spec.js
+++ b/superset-frontend/spec/javascripts/messageToasts/utils/getToastsFromPyFlashMessages_spec.js
@@ -20,9 +20,9 @@ import {
   DANGER_TOAST,
   INFO_TOAST,
   SUCCESS_TOAST,
-} from '../../../../src/messageToasts/constants';
+} from 'src/messageToasts/constants';
 
-import getToastsFromPyFlashMessages from '../../../../src/messageToasts/utils/getToastsFromPyFlashMessages';
+import getToastsFromPyFlashMessages from 'src/messageToasts/utils/getToastsFromPyFlashMessages';
 
 describe('getToastsFromPyFlashMessages', () => {
   it('should return an info toast', () => {
diff --git a/superset-frontend/spec/javascripts/middleware/logger_spec.js b/superset-frontend/spec/javascripts/middleware/logger_spec.js
index e2b7b9a..c10a860 100644
--- a/superset-frontend/spec/javascripts/middleware/logger_spec.js
+++ b/superset-frontend/spec/javascripts/middleware/logger_spec.js
@@ -18,9 +18,9 @@
  */
 import sinon from 'sinon';
 import { SupersetClient } from '@superset-ui/connection';
-import logger from '../../../src/middleware/loggerMiddleware';
-import { LOG_EVENT } from '../../../src/logger/actions';
-import { LOG_ACTIONS_LOAD_CHART } from '../../../src/logger/LogUtils';
+import logger from 'src/middleware/loggerMiddleware';
+import { LOG_EVENT } from 'src/logger/actions';
+import { LOG_ACTIONS_LOAD_CHART } from 'src/logger/LogUtils';
 
 describe('logger middleware', () => {
   const next = sinon.spy();
diff --git a/superset-frontend/spec/javascripts/modules/dates_spec.js b/superset-frontend/spec/javascripts/modules/dates_spec.js
index be734bf..49325f6 100644
--- a/superset-frontend/spec/javascripts/modules/dates_spec.js
+++ b/superset-frontend/spec/javascripts/modules/dates_spec.js
@@ -22,7 +22,7 @@ import {
   epochTimeXHoursAgo,
   epochTimeXDaysAgo,
   epochTimeXYearsAgo,
-} from '../../../src/modules/dates';
+} from 'src/modules/dates';
 
 describe('fDuration', () => {
   it('is a function', () => {
diff --git a/superset-frontend/spec/javascripts/modules/utils_spec.jsx b/superset-frontend/spec/javascripts/modules/utils_spec.jsx
index 4db2f0d..3da8848 100644
--- a/superset-frontend/spec/javascripts/modules/utils_spec.jsx
+++ b/superset-frontend/spec/javascripts/modules/utils_spec.jsx
@@ -16,10 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import {
-  formatSelectOptionsForRange,
-  mainMetric,
-} from '../../../src/modules/utils';
+import { formatSelectOptionsForRange, mainMetric } from 'src/modules/utils';
 
 describe('utils', () => {
   describe('formatSelectOptionsForRange', () => {
diff --git a/superset-frontend/spec/javascripts/profile/App_spec.jsx b/superset-frontend/spec/javascripts/profile/App_spec.jsx
index 7a72249..023d9bb 100644
--- a/superset-frontend/spec/javascripts/profile/App_spec.jsx
+++ b/superset-frontend/spec/javascripts/profile/App_spec.jsx
@@ -19,9 +19,9 @@
 import React from 'react';
 import { Col, Row, Tab } from 'react-bootstrap';
 import { shallow } from 'enzyme';
+import App from 'src/profile/components/App';
 
 import { user } from './fixtures';
-import App from '../../../src/profile/components/App';
 
 describe('App', () => {
   const mockedProps = {
diff --git a/superset-frontend/spec/javascripts/profile/CreatedContent_spec.jsx b/superset-frontend/spec/javascripts/profile/CreatedContent_spec.jsx
index f2deca0..817448c 100644
--- a/superset-frontend/spec/javascripts/profile/CreatedContent_spec.jsx
+++ b/superset-frontend/spec/javascripts/profile/CreatedContent_spec.jsx
@@ -20,10 +20,10 @@ import React from 'react';
 import { shallow } from 'enzyme';
 import thunk from 'redux-thunk';
 import configureStore from 'redux-mock-store';
+import CreatedContent from 'src/profile/components/CreatedContent';
+import TableLoader from 'src/components/TableLoader';
 
 import { user } from './fixtures';
-import CreatedContent from '../../../src/profile/components/CreatedContent';
-import TableLoader from '../../../src/components/TableLoader';
 
 // store needed for withToasts(TableLoader)
 const mockStore = configureStore([thunk]);
diff --git a/superset-frontend/spec/javascripts/profile/EditableTitle_spec.jsx b/superset-frontend/spec/javascripts/profile/EditableTitle_spec.jsx
index 270dfa0..9705f24 100644
--- a/superset-frontend/spec/javascripts/profile/EditableTitle_spec.jsx
+++ b/superset-frontend/spec/javascripts/profile/EditableTitle_spec.jsx
@@ -20,7 +20,7 @@ import React from 'react';
 import { shallow } from 'enzyme';
 import sinon from 'sinon';
 
-import EditableTable from '../../../src/components/EditableTitle';
+import EditableTable from 'src/components/EditableTitle';
 
 describe('EditableTitle', () => {
   const callback = sinon.spy();
diff --git a/superset-frontend/spec/javascripts/profile/Favorites_spec.jsx b/superset-frontend/spec/javascripts/profile/Favorites_spec.jsx
index 75482da..8b5eaf4 100644
--- a/superset-frontend/spec/javascripts/profile/Favorites_spec.jsx
+++ b/superset-frontend/spec/javascripts/profile/Favorites_spec.jsx
@@ -20,10 +20,10 @@ import React from 'react';
 import { shallow } from 'enzyme';
 import thunk from 'redux-thunk';
 import configureStore from 'redux-mock-store';
+import Favorites from 'src/profile/components/Favorites';
+import TableLoader from 'src/components/TableLoader';
 
 import { user } from './fixtures';
-import Favorites from '../../../src/profile/components/Favorites';
-import TableLoader from '../../../src/components/TableLoader';
 
 // store needed for withToasts(TableLoader)
 const mockStore = configureStore([thunk]);
diff --git a/superset-frontend/spec/javascripts/profile/RecentActivity_spec.jsx b/superset-frontend/spec/javascripts/profile/RecentActivity_spec.jsx
index 08d6b6f..3399436 100644
--- a/superset-frontend/spec/javascripts/profile/RecentActivity_spec.jsx
+++ b/superset-frontend/spec/javascripts/profile/RecentActivity_spec.jsx
@@ -18,10 +18,10 @@
  */
 import React from 'react';
 import { shallow } from 'enzyme';
+import RecentActivity from 'src/profile/components/RecentActivity';
+import TableLoader from 'src/components/TableLoader';
 
 import { user } from './fixtures';
-import RecentActivity from '../../../src/profile/components/RecentActivity';
-import TableLoader from '../../../src/components/TableLoader';
 
 describe('RecentActivity', () => {
   const mockedProps = {
diff --git a/superset-frontend/spec/javascripts/profile/Security_spec.jsx b/superset-frontend/spec/javascripts/profile/Security_spec.jsx
index 50dd541..f023169 100644
--- a/superset-frontend/spec/javascripts/profile/Security_spec.jsx
+++ b/superset-frontend/spec/javascripts/profile/Security_spec.jsx
@@ -18,9 +18,9 @@
  */
 import React from 'react';
 import { mount } from 'enzyme';
+import Security from 'src/profile/components/Security';
 
 import { user, userNoPerms } from './fixtures';
-import Security from '../../../src/profile/components/Security';
 
 describe('Security', () => {
   const mockedProps = {
diff --git a/superset-frontend/spec/javascripts/profile/UserInfo_spec.jsx b/superset-frontend/spec/javascripts/profile/UserInfo_spec.jsx
index 0f9c110..2d55df5 100644
--- a/superset-frontend/spec/javascripts/profile/UserInfo_spec.jsx
+++ b/superset-frontend/spec/javascripts/profile/UserInfo_spec.jsx
@@ -20,9 +20,9 @@ import React from 'react';
 import Gravatar from 'react-gravatar';
 import { Panel } from 'react-bootstrap';
 import { mount } from 'enzyme';
+import UserInfo from 'src/profile/components/UserInfo';
 
 import { user } from './fixtures';
-import UserInfo from '../../../src/profile/components/UserInfo';
 
 describe('UserInfo', () => {
   const mockedProps = {
diff --git a/superset-frontend/spec/javascripts/showSavedQuery/utils_spec.jsx b/superset-frontend/spec/javascripts/showSavedQuery/utils_spec.jsx
index fd0e913..8d99982 100644
--- a/superset-frontend/spec/javascripts/showSavedQuery/utils_spec.jsx
+++ b/superset-frontend/spec/javascripts/showSavedQuery/utils_spec.jsx
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { getNestedValue, interpolate } from '../../../src/showSavedQuery/utils';
+import { getNestedValue, interpolate } from 'src/showSavedQuery/utils';
 
 describe('getNestedValue', () => {
   it('is a function', () => {
diff --git a/superset-frontend/spec/javascripts/sqllab/ColumnElement_spec.jsx b/superset-frontend/spec/javascripts/sqllab/ColumnElement_spec.jsx
index 47d0ffd..0e96186 100644
--- a/superset-frontend/spec/javascripts/sqllab/ColumnElement_spec.jsx
+++ b/superset-frontend/spec/javascripts/sqllab/ColumnElement_spec.jsx
@@ -18,9 +18,9 @@
  */
 import React from 'react';
 import { mount } from 'enzyme';
+import ColumnElement from 'src/SqlLab/components/ColumnElement';
 
 import { mockedActions, table } from './fixtures';
-import ColumnElement from '../../../src/SqlLab/components/ColumnElement';
 
 describe('ColumnElement', () => {
   const mockedProps = {
@@ -33,32 +33,17 @@ describe('ColumnElement', () => {
   it('renders a proper primary key', () => {
     const wrapper = mount(<ColumnElement column={table.columns[0]} />);
     expect(wrapper.find('i.fa-key')).toHaveLength(1);
-    expect(
-      wrapper
-        .find('.col-name')
-        .first()
-        .text(),
-    ).toBe('id');
+    expect(wrapper.find('.col-name').first().text()).toBe('id');
   });
   it('renders a multi-key column', () => {
     const wrapper = mount(<ColumnElement column={table.columns[1]} />);
     expect(wrapper.find('i.fa-link')).toHaveLength(1);
     expect(wrapper.find('i.fa-bookmark')).toHaveLength(1);
-    expect(
-      wrapper
-        .find('.col-name')
-        .first()
-        .text(),
-    ).toBe('first_name');
+    expect(wrapper.find('.col-name').first().text()).toBe('first_name');
   });
   it('renders a column with no keys', () => {
     const wrapper = mount(<ColumnElement column={table.columns[2]} />);
     expect(wrapper.find('i')).toHaveLength(0);
-    expect(
-      wrapper
-        .find('.col-name')
-        .first()
-        .text(),
-    ).toBe('last_name');
+    expect(wrapper.find('.col-name').first().text()).toBe('last_name');
   });
 });
diff --git a/superset-frontend/spec/javascripts/sqllab/ExploreResultsButton_spec.jsx b/superset-frontend/spec/javascripts/sqllab/ExploreResultsButton_spec.jsx
index 9f3f28b..6bd0165 100644
--- a/superset-frontend/spec/javascripts/sqllab/ExploreResultsButton_spec.jsx
+++ b/superset-frontend/spec/javascripts/sqllab/ExploreResultsButton_spec.jsx
@@ -19,18 +19,17 @@
 import React from 'react';
 import configureStore from 'redux-mock-store';
 import thunk from 'redux-thunk';
-
 import { shallow } from 'enzyme';
 import sinon from 'sinon';
 import fetchMock from 'fetch-mock';
-
 import shortid from 'shortid';
+import sqlLabReducer from 'src/SqlLab/reducers/index';
+import * as actions from 'src/SqlLab/actions/sqlLab';
+import ExploreResultsButton from 'src/SqlLab/components/ExploreResultsButton';
+import * as exploreUtils from 'src/explore/exploreUtils';
+import Button from 'src/components/Button';
+
 import { queries, queryWithBadColumns } from './fixtures';
-import sqlLabReducer from '../../../src/SqlLab/reducers/index';
-import * as actions from '../../../src/SqlLab/actions/sqlLab';
-import ExploreResultsButton from '../../../src/SqlLab/components/ExploreResultsButton';
-import * as exploreUtils from '../../../src/explore/exploreUtils';
-import Button from '../../../src/components/Button';
 
 describe('ExploreResultsButton', () => {
   const middlewares = [thunk];
diff --git a/superset-frontend/spec/javascripts/sqllab/HighlightedSql_spec.jsx b/superset-frontend/spec/javascripts/sqllab/HighlightedSql_spec.jsx
index db8794a..2f4d471 100644
--- a/superset-frontend/spec/javascripts/sqllab/HighlightedSql_spec.jsx
+++ b/superset-frontend/spec/javascripts/sqllab/HighlightedSql_spec.jsx
@@ -20,8 +20,8 @@ import React from 'react';
 import SyntaxHighlighter from 'react-syntax-highlighter';
 import { mount, shallow } from 'enzyme';
 
-import HighlightedSql from '../../../src/SqlLab/components/HighlightedSql';
-import ModalTrigger from '../../../src/components/ModalTrigger';
+import HighlightedSql from 'src/SqlLab/components/HighlightedSql';
+import ModalTrigger from 'src/components/ModalTrigger';
 
 describe('HighlightedSql', () => {
   const sql =
diff --git a/superset-frontend/spec/javascripts/sqllab/LimitControl_spec.jsx b/superset-frontend/spec/javascripts/sqllab/LimitControl_spec.jsx
index c42126b..060d53f 100644
--- a/superset-frontend/spec/javascripts/sqllab/LimitControl_spec.jsx
+++ b/superset-frontend/spec/javascripts/sqllab/LimitControl_spec.jsx
@@ -20,8 +20,8 @@ import React from 'react';
 import { shallow } from 'enzyme';
 
 import { Label } from 'react-bootstrap';
-import LimitControl from '../../../src/SqlLab/components/LimitControl';
-import ControlHeader from '../../../src/explore/components/ControlHeader';
+import LimitControl from 'src/SqlLab/components/LimitControl';
+import ControlHeader from 'src/explore/components/ControlHeader';
 
 describe('LimitControl', () => {
   const defaultProps = {
@@ -47,64 +47,43 @@ describe('LimitControl', () => {
     const value = 100;
     wrapper = shallow(factory({ ...defaultProps, value }));
     expect(wrapper.state().textValue).toEqual(value.toString());
-    wrapper
-      .find(Label)
-      .first()
-      .simulate('click');
+    wrapper.find(Label).first().simulate('click');
     expect(wrapper.state().showOverlay).toBe(true);
     expect(wrapper.find(ControlHeader).props().validationErrors).toHaveLength(
       0,
     );
   });
   it('handles invalid value', () => {
-    wrapper
-      .find(Label)
-      .first()
-      .simulate('click');
+    wrapper.find(Label).first().simulate('click');
     wrapper.setState({ textValue: 'invalid' });
     expect(wrapper.find(ControlHeader).props().validationErrors).toHaveLength(
       1,
     );
   });
   it('handles negative value', () => {
-    wrapper
-      .find(Label)
-      .first()
-      .simulate('click');
+    wrapper.find(Label).first().simulate('click');
     wrapper.setState({ textValue: '-1' });
     expect(wrapper.find(ControlHeader).props().validationErrors).toHaveLength(
       1,
     );
   });
   it('handles value above max row', () => {
-    wrapper
-      .find(Label)
-      .first()
-      .simulate('click');
+    wrapper.find(Label).first().simulate('click');
     wrapper.setState({ textValue: (defaultProps.maxRow + 1).toString() });
     expect(wrapper.find(ControlHeader).props().validationErrors).toHaveLength(
       1,
     );
   });
   it('opens and closes', () => {
-    wrapper
-      .find(Label)
-      .first()
-      .simulate('click');
+    wrapper.find(Label).first().simulate('click');
     expect(wrapper.state().showOverlay).toBe(true);
-    wrapper
-      .find('.ok')
-      .first()
-      .simulate('click');
+    wrapper.find('.ok').first().simulate('click');
     expect(wrapper.state().showOverlay).toBe(false);
   });
   it('resets and closes', () => {
     const value = 100;
     wrapper = shallow(factory({ ...defaultProps, value }));
-    wrapper
-      .find(Label)
-      .first()
-      .simulate('click');
+    wrapper.find(Label).first().simulate('click');
     expect(wrapper.state().textValue).toEqual(value.toString());
     wrapper.find('.reset').simulate('click');
     expect(wrapper.state().textValue).toEqual(
diff --git a/superset-frontend/spec/javascripts/sqllab/Link_spec.jsx b/superset-frontend/spec/javascripts/sqllab/Link_spec.jsx
index 6b20c15..ae58f04 100644
--- a/superset-frontend/spec/javascripts/sqllab/Link_spec.jsx
+++ b/superset-frontend/spec/javascripts/sqllab/Link_spec.jsx
@@ -19,7 +19,7 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import Link from '../../../src/components/Link';
+import Link from 'src/components/Link';
 
 describe('Link', () => {
   const mockedProps = {
diff --git a/superset-frontend/spec/javascripts/sqllab/QueryAutoRefresh_spec.jsx b/superset-frontend/spec/javascripts/sqllab/QueryAutoRefresh_spec.jsx
index 77ac0a2..4295a2a 100644
--- a/superset-frontend/spec/javascripts/sqllab/QueryAutoRefresh_spec.jsx
+++ b/superset-frontend/spec/javascripts/sqllab/QueryAutoRefresh_spec.jsx
@@ -22,7 +22,7 @@ import sinon from 'sinon';
 import thunk from 'redux-thunk';
 import configureStore from 'redux-mock-store';
 
-import QueryAutoRefresh from '../../../src/SqlLab/components/QueryAutoRefresh';
+import QueryAutoRefresh from 'src/SqlLab/components/QueryAutoRefresh';
 import { initialState, runningQuery } from './fixtures';
 
 describe('QueryAutoRefresh', () => {
diff --git a/superset-frontend/spec/javascripts/sqllab/QuerySearch_spec.jsx b/superset-frontend/spec/javascripts/sqllab/QuerySearch_spec.jsx
index b04a47e..f2c71f1 100644
--- a/superset-frontend/spec/javascripts/sqllab/QuerySearch_spec.jsx
+++ b/superset-frontend/spec/javascripts/sqllab/QuerySearch_spec.jsx
@@ -22,7 +22,7 @@ import { Button } from 'react-bootstrap';
 import { shallow } from 'enzyme';
 import sinon from 'sinon';
 
-import QuerySearch from '../../../src/SqlLab/components/QuerySearch';
+import QuerySearch from 'src/SqlLab/components/QuerySearch';
 
 describe('QuerySearch', () => {
   const search = sinon.spy(QuerySearch.prototype, 'refreshQueries');
diff --git a/superset-frontend/spec/javascripts/sqllab/QueryStateLabel_spec.jsx b/superset-frontend/spec/javascripts/sqllab/QueryStateLabel_spec.jsx
index 4c5e157..4d0d43e 100644
--- a/superset-frontend/spec/javascripts/sqllab/QueryStateLabel_spec.jsx
+++ b/superset-frontend/spec/javascripts/sqllab/QueryStateLabel_spec.jsx
@@ -20,7 +20,7 @@ import React from 'react';
 import { Label } from 'react-bootstrap';
 import { shallow } from 'enzyme';
 
-import QueryStateLabel from '../../../src/SqlLab/components/QueryStateLabel';
+import QueryStateLabel from 'src/SqlLab/components/QueryStateLabel';
 
 describe('SavedQuery', () => {
   const mockedProps = {
diff --git a/superset-frontend/spec/javascripts/sqllab/QueryTable_spec.jsx b/superset-frontend/spec/javascripts/sqllab/QueryTable_spec.jsx
index 7f38ceb..78fc1cb 100644
--- a/superset-frontend/spec/javascripts/sqllab/QueryTable_spec.jsx
+++ b/superset-frontend/spec/javascripts/sqllab/QueryTable_spec.jsx
@@ -19,9 +19,9 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 import { Table } from 'reactable-arc';
+import QueryTable from 'src/SqlLab/components/QueryTable';
 
 import { queries } from './fixtures';
-import QueryTable from '../../../src/SqlLab/components/QueryTable';
 
 describe('QueryTable', () => {
   const mockedProps = {
@@ -36,18 +36,9 @@ describe('QueryTable', () => {
   it('renders a proper table', () => {
     const wrapper = shallow(<QueryTable {...mockedProps} />);
     expect(wrapper.find(Table)).toHaveLength(1);
-    expect(
-      wrapper
-        .find(Table)
-        .shallow()
-        .find('table'),
-    ).toHaveLength(1);
-    expect(
-      wrapper
-        .find(Table)
-        .shallow()
-        .find('table')
-        .find('Tr'),
-    ).toHaveLength(2);
+    expect(wrapper.find(Table).shallow().find('table')).toHaveLength(1);
+    expect(wrapper.find(Table).shallow().find('table').find('Tr')).toHaveLength(
+      2,
+    );
   });
 });
diff --git a/superset-frontend/spec/javascripts/sqllab/ResultSet_spec.jsx b/superset-frontend/spec/javascripts/sqllab/ResultSet_spec.jsx
index 886459a..05fd7fa 100644
--- a/superset-frontend/spec/javascripts/sqllab/ResultSet_spec.jsx
+++ b/superset-frontend/spec/javascripts/sqllab/ResultSet_spec.jsx
@@ -21,9 +21,9 @@ import { shallow } from 'enzyme';
 import sinon from 'sinon';
 
 import { Alert, ProgressBar } from 'react-bootstrap';
-import FilterableTable from '../../../src/components/FilterableTable/FilterableTable';
-import ExploreResultsButton from '../../../src/SqlLab/components/ExploreResultsButton';
-import ResultSet from '../../../src/SqlLab/components/ResultSet';
+import FilterableTable from 'src/components/FilterableTable/FilterableTable';
+import ExploreResultsButton from 'src/SqlLab/components/ExploreResultsButton';
+import ResultSet from 'src/SqlLab/components/ResultSet';
 import { queries, stoppedQuery, runningQuery, cachedQuery } from './fixtures';
 
 describe('ResultSet', () => {
@@ -97,12 +97,9 @@ describe('ResultSet', () => {
       wrapper.setProps({ query: emptyResults });
       expect(wrapper.find(FilterableTable)).toHaveLength(0);
       expect(wrapper.find(Alert)).toHaveLength(1);
-      expect(
-        wrapper
-          .find(Alert)
-          .shallow()
-          .text(),
-      ).toBe('The query returned no data');
+      expect(wrapper.find(Alert).shallow().text()).toBe(
+        'The query returned no data',
+      );
     });
     it('should render cached query', () => {
       const wrapper = shallow(<ResultSet {...cachedQueryProps} />);
diff --git a/superset-frontend/spec/javascripts/sqllab/SaveQuery_spec.jsx b/superset-frontend/spec/javascripts/sqllab/SaveQuery_spec.jsx
index 508558f..5d817aa 100644
--- a/superset-frontend/spec/javascripts/sqllab/SaveQuery_spec.jsx
+++ b/superset-frontend/spec/javascripts/sqllab/SaveQuery_spec.jsx
@@ -20,9 +20,9 @@ import React from 'react';
 import { FormControl } from 'react-bootstrap';
 import { shallow } from 'enzyme';
 import * as sinon from 'sinon';
-import SaveQuery from '../../../src/SqlLab/components/SaveQuery';
-import ModalTrigger from '../../../src/components/ModalTrigger';
-import Button from '../../../src/components/Button';
+import SaveQuery from 'src/SqlLab/components/SaveQuery';
+import ModalTrigger from 'src/components/ModalTrigger';
+import Button from 'src/components/Button';
 
 describe('SavedQuery', () => {
   const mockedProps = {
@@ -59,10 +59,7 @@ describe('SavedQuery', () => {
     const wrapper = shallow(<SaveQuery {...mockedProps} onSave={saveSpy} />);
     const modal = shallow(wrapper.instance().renderModalBody());
     expect(modal.find(Button)).toHaveLength(2);
-    modal
-      .find(Button)
-      .at(0)
-      .simulate('click');
+    modal.find(Button).at(0).simulate('click');
     expect(saveSpy.calledOnce).toBe(true);
   });
   it('has an update button if this is an existing query', () => {
@@ -77,10 +74,7 @@ describe('SavedQuery', () => {
     const wrapper = shallow(<SaveQuery {...props} onUpdate={updateSpy} />);
     const modal = shallow(wrapper.instance().renderModalBody());
     expect(modal.find(Button)).toHaveLength(3);
-    modal
-      .find(Button)
-      .at(0)
-      .simulate('click');
+    modal.find(Button).at(0).simulate('click');
     expect(updateSpy.calledOnce).toBe(true);
   });
 });
diff --git a/superset-frontend/spec/javascripts/sqllab/ShareSqlLabQuery_spec.jsx b/superset-frontend/spec/javascripts/sqllab/ShareSqlLabQuery_spec.jsx
index 4670a94..bde316d 100644
--- a/superset-frontend/spec/javascripts/sqllab/ShareSqlLabQuery_spec.jsx
+++ b/superset-frontend/spec/javascripts/sqllab/ShareSqlLabQuery_spec.jsx
@@ -24,9 +24,9 @@ import fetchMock from 'fetch-mock';
 import * as featureFlags from 'src/featureFlags';
 import { shallow } from 'enzyme';
 
-import * as utils from '../../../src/utils/common';
-import Button from '../../../src/components/Button';
-import ShareSqlLabQuery from '../../../src/SqlLab/components/ShareSqlLabQuery';
+import * as utils from 'src/utils/common';
+import Button from 'src/components/Button';
+import ShareSqlLabQuery from 'src/SqlLab/components/ShareSqlLabQuery';
 
 const mockStore = configureStore([thunk]);
 const store = mockStore();
diff --git a/superset-frontend/spec/javascripts/sqllab/SouthPane_spec.jsx b/superset-frontend/spec/javascripts/sqllab/SouthPane_spec.jsx
index 914ce8f..694426d 100644
--- a/superset-frontend/spec/javascripts/sqllab/SouthPane_spec.jsx
+++ b/superset-frontend/spec/javascripts/sqllab/SouthPane_spec.jsx
@@ -19,15 +19,11 @@
 import React from 'react';
 import configureStore from 'redux-mock-store';
 import thunk from 'redux-thunk';
-
 import { shallow } from 'enzyme';
-
-import { STATUS_OPTIONS } from '../../../src/SqlLab/constants';
+import SouthPaneContainer, { SouthPane } from 'src/SqlLab/components/SouthPane';
+import ResultSet from 'src/SqlLab/components/ResultSet';
+import { STATUS_OPTIONS } from 'src/SqlLab/constants';
 import { initialState } from './fixtures';
-import SouthPaneContainer, {
-  SouthPane,
-} from '../../../src/SqlLab/components/SouthPane';
-import ResultSet from '../../../src/SqlLab/components/ResultSet';
 
 describe('SouthPane', () => {
   const middlewares = [thunk];
@@ -94,12 +90,7 @@ describe('SouthPane', () => {
   it('should render offline when the state is offline', () => {
     wrapper = getWrapper();
     wrapper.setProps({ offline: true });
-    expect(
-      wrapper
-        .find('.m-r-3')
-        .render()
-        .text(),
-    ).toBe(STATUS_OPTIONS.offline);
+    expect(wrapper.find('.m-r-3').render().text()).toBe(STATUS_OPTIONS.offline);
   });
   it('should pass latest query down to ResultSet component', () => {
     wrapper = getWrapper();
diff --git a/superset-frontend/spec/javascripts/sqllab/SqlEditorLeftBar_spec.jsx b/superset-frontend/spec/javascripts/sqllab/SqlEditorLeftBar_spec.jsx
index 4f420a0..c524e9b 100644
--- a/superset-frontend/spec/javascripts/sqllab/SqlEditorLeftBar_spec.jsx
+++ b/superset-frontend/spec/javascripts/sqllab/SqlEditorLeftBar_spec.jsx
@@ -21,10 +21,10 @@ import configureStore from 'redux-mock-store';
 import { shallow } from 'enzyme';
 import sinon from 'sinon';
 import thunk from 'redux-thunk';
+import SqlEditorLeftBar from 'src/SqlLab/components/SqlEditorLeftBar';
+import TableElement from 'src/SqlLab/components/TableElement';
 
 import { table, defaultQueryEditor, initialState } from './fixtures';
-import SqlEditorLeftBar from '../../../src/SqlLab/components/SqlEditorLeftBar';
-import TableElement from '../../../src/SqlLab/components/TableElement';
 
 describe('SqlEditorLeftBar', () => {
   const mockedProps = {
diff --git a/superset-frontend/spec/javascripts/sqllab/SqlEditor_spec.jsx b/superset-frontend/spec/javascripts/sqllab/SqlEditor_spec.jsx
index a97cebd..2c7b1e3 100644
--- a/superset-frontend/spec/javascripts/sqllab/SqlEditor_spec.jsx
+++ b/superset-frontend/spec/javascripts/sqllab/SqlEditor_spec.jsx
@@ -19,18 +19,18 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 import { Checkbox } from 'react-bootstrap';
-
-import { defaultQueryEditor, initialState, queries, table } from './fixtures';
 import {
   SQL_EDITOR_GUTTER_HEIGHT,
   SQL_EDITOR_GUTTER_MARGIN,
   SQL_TOOLBAR_HEIGHT,
-} from '../../../src/SqlLab/constants';
-import AceEditorWrapper from '../../../src/SqlLab/components/AceEditorWrapper';
-import LimitControl from '../../../src/SqlLab/components/LimitControl';
-import SouthPane from '../../../src/SqlLab/components/SouthPane';
-import SqlEditor from '../../../src/SqlLab/components/SqlEditor';
-import SqlEditorLeftBar from '../../../src/SqlLab/components/SqlEditorLeftBar';
+} from 'src/SqlLab/constants';
+import AceEditorWrapper from 'src/SqlLab/components/AceEditorWrapper';
+import LimitControl from 'src/SqlLab/components/LimitControl';
+import SouthPane from 'src/SqlLab/components/SouthPane';
+import SqlEditor from 'src/SqlLab/components/SqlEditor';
+import SqlEditorLeftBar from 'src/SqlLab/components/SqlEditorLeftBar';
+
+import { defaultQueryEditor, initialState, queries, table } from './fixtures';
 
 const MOCKED_SQL_EDITOR_HEIGHT = 500;
 
@@ -109,10 +109,7 @@ describe('SqlEditor', () => {
   it('allows toggling autocomplete', () => {
     const wrapper = shallow(<SqlEditor {...mockedProps} />);
     expect(wrapper.find(AceEditorWrapper).props().autocomplete).toBe(true);
-    wrapper
-      .find(Checkbox)
-      .props()
-      .onChange();
+    wrapper.find(Checkbox).props().onChange();
     expect(wrapper.find(AceEditorWrapper).props().autocomplete).toBe(false);
   });
 });
diff --git a/superset-frontend/spec/javascripts/sqllab/TabStatusIcon_spec.jsx b/superset-frontend/spec/javascripts/sqllab/TabStatusIcon_spec.jsx
index 990143e..4db08f8 100644
--- a/superset-frontend/spec/javascripts/sqllab/TabStatusIcon_spec.jsx
+++ b/superset-frontend/spec/javascripts/sqllab/TabStatusIcon_spec.jsx
@@ -20,7 +20,7 @@ import React from 'react';
 import sinon from 'sinon';
 import { shallow } from 'enzyme';
 
-import TabStatusIcon from '../../../src/SqlLab/components/TabStatusIcon';
+import TabStatusIcon from 'src/SqlLab/components/TabStatusIcon';
 
 function setup() {
   const onClose = sinon.spy();
diff --git a/superset-frontend/spec/javascripts/sqllab/TabbedSqlEditors_spec.jsx b/superset-frontend/spec/javascripts/sqllab/TabbedSqlEditors_spec.jsx
index cac5bdb..2d09f36 100644
--- a/superset-frontend/spec/javascripts/sqllab/TabbedSqlEditors_spec.jsx
+++ b/superset-frontend/spec/javascripts/sqllab/TabbedSqlEditors_spec.jsx
@@ -20,14 +20,13 @@ import React from 'react';
 import configureStore from 'redux-mock-store';
 import thunk from 'redux-thunk';
 import URI from 'urijs';
-
 import { Tab } from 'react-bootstrap';
 import { shallow, mount } from 'enzyme';
 import sinon from 'sinon';
+import TabbedSqlEditors from 'src/SqlLab/components/TabbedSqlEditors';
+import SqlEditor from 'src/SqlLab/components/SqlEditor';
 
 import { table, initialState } from './fixtures';
-import TabbedSqlEditors from '../../../src/SqlLab/components/TabbedSqlEditors';
-import SqlEditor from '../../../src/SqlLab/components/SqlEditor';
 
 describe('TabbedSqlEditors', () => {
   const middlewares = [thunk];
@@ -225,18 +224,8 @@ describe('TabbedSqlEditors', () => {
   });
   it('should disable new tab when offline', () => {
     wrapper = getWrapper();
-    expect(
-      wrapper
-        .find(Tab)
-        .last()
-        .props().disabled,
-    ).toBe(false);
+    expect(wrapper.find(Tab).last().props().disabled).toBe(false);
     wrapper.setProps({ offline: true });
-    expect(
-      wrapper
-        .find(Tab)
-        .last()
-        .props().disabled,
-    ).toBe(true);
+    expect(wrapper.find(Tab).last().props().disabled).toBe(true);
   });
 });
diff --git a/superset-frontend/spec/javascripts/sqllab/TableElement_spec.jsx b/superset-frontend/spec/javascripts/sqllab/TableElement_spec.jsx
index 98bae0a..598c2de 100644
--- a/superset-frontend/spec/javascripts/sqllab/TableElement_spec.jsx
+++ b/superset-frontend/spec/javascripts/sqllab/TableElement_spec.jsx
@@ -19,9 +19,9 @@
 import React from 'react';
 import { mount, shallow } from 'enzyme';
 
-import Link from '../../../src/components/Link';
-import TableElement from '../../../src/SqlLab/components/TableElement';
-import ColumnElement from '../../../src/SqlLab/components/ColumnElement';
+import Link from 'src/components/Link';
+import TableElement from 'src/SqlLab/components/TableElement';
+import ColumnElement from 'src/SqlLab/components/ColumnElement';
 import { mockedActions, table } from './fixtures';
 
 describe('TableElement', () => {
@@ -50,20 +50,12 @@ describe('TableElement', () => {
   it('sorts columns', () => {
     const wrapper = shallow(<TableElement {...mockedProps} />);
     expect(wrapper.state().sortColumns).toBe(false);
-    expect(
-      wrapper
-        .find(ColumnElement)
-        .first()
-        .props().column.name,
-    ).toBe('id');
+    expect(wrapper.find(ColumnElement).first().props().column.name).toBe('id');
     wrapper.find('.sort-cols').simulate('click');
     expect(wrapper.state().sortColumns).toBe(true);
-    expect(
-      wrapper
-        .find(ColumnElement)
-        .first()
-        .props().column.name,
-    ).toBe('active');
+    expect(wrapper.find(ColumnElement).first().props().column.name).toBe(
+      'active',
+    );
   });
   it('calls the collapseTable action', () => {
     const wrapper = mount(<TableElement {...mockedProps} />);
diff --git a/superset-frontend/spec/javascripts/sqllab/Timer_spec.jsx b/superset-frontend/spec/javascripts/sqllab/Timer_spec.jsx
index 91ae6fc..ecd6193 100644
--- a/superset-frontend/spec/javascripts/sqllab/Timer_spec.jsx
+++ b/superset-frontend/spec/javascripts/sqllab/Timer_spec.jsx
@@ -20,8 +20,8 @@ import React from 'react';
 import { mount } from 'enzyme';
 import sinon from 'sinon';
 
-import Timer from '../../../src/components/Timer';
-import { now } from '../../../src/modules/dates';
+import Timer from 'src/components/Timer';
+import { now } from 'src/modules/dates';
 
 describe('Timer', () => {
   let wrapper;
diff --git a/superset-frontend/spec/javascripts/sqllab/actions/sqlLab_spec.js b/superset-frontend/spec/javascripts/sqllab/actions/sqlLab_spec.js
index 36eb1fe..b8e2e89 100644
--- a/superset-frontend/spec/javascripts/sqllab/actions/sqlLab_spec.js
+++ b/superset-frontend/spec/javascripts/sqllab/actions/sqlLab_spec.js
@@ -24,7 +24,7 @@ import thunk from 'redux-thunk';
 import shortid from 'shortid';
 import * as featureFlags from 'src/featureFlags';
 
-import * as actions from '../../../../src/SqlLab/actions/sqlLab';
+import * as actions from 'src/SqlLab/actions/sqlLab';
 import { defaultQueryEditor, query } from '../fixtures';
 
 const middlewares = [thunk];
diff --git a/superset-frontend/spec/javascripts/sqllab/fixtures.js b/superset-frontend/spec/javascripts/sqllab/fixtures.js
index c6de528..98bd202 100644
--- a/superset-frontend/spec/javascripts/sqllab/fixtures.js
+++ b/superset-frontend/spec/javascripts/sqllab/fixtures.js
@@ -17,7 +17,7 @@
  * under the License.
  */
 import sinon from 'sinon';
-import * as actions from '../../../src/SqlLab/actions/sqlLab';
+import * as actions from 'src/SqlLab/actions/sqlLab';
 
 export const mockedActions = sinon.stub({ ...actions });
 
diff --git a/superset-frontend/spec/javascripts/sqllab/reducers/sqlLab_spec.js b/superset-frontend/spec/javascripts/sqllab/reducers/sqlLab_spec.js
index 8a821bb..fc3a665 100644
--- a/superset-frontend/spec/javascripts/sqllab/reducers/sqlLab_spec.js
+++ b/superset-frontend/spec/javascripts/sqllab/reducers/sqlLab_spec.js
@@ -16,10 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import sqlLabReducer from '../../../../src/SqlLab/reducers/sqlLab';
-import * as actions from '../../../../src/SqlLab/actions/sqlLab';
+import sqlLabReducer from 'src/SqlLab/reducers/sqlLab';
+import * as actions from 'src/SqlLab/actions/sqlLab';
+import { now } from 'src/modules/dates';
+
 import { table, initialState as mockState } from '../fixtures';
-import { now } from '../../../../src/modules/dates';
 
 const initialState = mockState.sqlLab;
 
diff --git a/superset-frontend/spec/javascripts/sqllab/utils/emptyQueryResults_spec.js b/superset-frontend/spec/javascripts/sqllab/utils/emptyQueryResults_spec.js
index b380607..6a44106 100644
--- a/superset-frontend/spec/javascripts/sqllab/utils/emptyQueryResults_spec.js
+++ b/superset-frontend/spec/javascripts/sqllab/utils/emptyQueryResults_spec.js
@@ -19,8 +19,8 @@
 import {
   emptyQueryResults,
   clearQueryEditors,
-} from '../../../../src/SqlLab/utils/reduxStateToLocalStorageHelper';
-import { LOCALSTORAGE_MAX_QUERY_AGE_MS } from '../../../../src/SqlLab/constants';
+} from 'src/SqlLab/utils/reduxStateToLocalStorageHelper';
+import { LOCALSTORAGE_MAX_QUERY_AGE_MS } from 'src/SqlLab/constants';
 import { queries, defaultQueryEditor } from '../fixtures';
 
 describe('reduxStateToLocalStorageHelper', () => {
diff --git a/superset-frontend/spec/javascripts/utils/common_spec.jsx b/superset-frontend/spec/javascripts/utils/common_spec.jsx
index 1b2e0c1..80f4fbc 100644
--- a/superset-frontend/spec/javascripts/utils/common_spec.jsx
+++ b/superset-frontend/spec/javascripts/utils/common_spec.jsx
@@ -20,7 +20,7 @@ import {
   optionFromValue,
   prepareCopyToClipboardTabularData,
   NULL_STRING,
-} from '../../../src/utils/common';
+} from 'src/utils/common';
 
 describe('utils/common', () => {
   describe('optionFromValue', () => {
diff --git a/superset-frontend/spec/javascripts/utils/getClientErrorObject_spec.ts b/superset-frontend/spec/javascripts/utils/getClientErrorObject_spec.ts
index eca7361..8e46d11 100644
--- a/superset-frontend/spec/javascripts/utils/getClientErrorObject_spec.ts
+++ b/superset-frontend/spec/javascripts/utils/getClientErrorObject_spec.ts
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import getClientErrorObject from '../../../src/utils/getClientErrorObject';
+import getClientErrorObject from 'src/utils/getClientErrorObject';
 
 describe('getClientErrorObject()', () => {
   it('Returns a Promise', () => {
diff --git a/superset-frontend/spec/javascripts/utils/safeStringify_spec.ts b/superset-frontend/spec/javascripts/utils/safeStringify_spec.ts
index 21ea647..1422c0d 100644
--- a/superset-frontend/spec/javascripts/utils/safeStringify_spec.ts
+++ b/superset-frontend/spec/javascripts/utils/safeStringify_spec.ts
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { safeStringify } from '../../../src/utils/safeStringify';
+import { safeStringify } from 'src/utils/safeStringify';
 
 class Noise {
   public next?: Noise;
diff --git a/superset-frontend/spec/javascripts/views/dashboardList/DashboardList_spec.jsx b/superset-frontend/spec/javascripts/views/dashboardList/DashboardList_spec.jsx
index 25e597a..5dbcb81 100644
--- a/superset-frontend/spec/javascripts/views/dashboardList/DashboardList_spec.jsx
+++ b/superset-frontend/spec/javascripts/views/dashboardList/DashboardList_spec.jsx
@@ -98,10 +98,7 @@ describe('DashboardList', () => {
   it('edits', () => {
     expect(wrapper.find(PropertiesModal)).toHaveLength(0);
 
-    wrapper
-      .find('.fa-pencil')
-      .first()
-      .simulate('click');
+    wrapper.find('.fa-pencil').first().simulate('click');
     expect(wrapper.find(PropertiesModal)).toHaveLength(1);
   });
 });
diff --git a/superset-frontend/spec/javascripts/welcome/Welcome_spec.jsx b/superset-frontend/spec/javascripts/welcome/Welcome_spec.jsx
index 67eb413..763ff3e 100644
--- a/superset-frontend/spec/javascripts/welcome/Welcome_spec.jsx
+++ b/superset-frontend/spec/javascripts/welcome/Welcome_spec.jsx
@@ -20,7 +20,7 @@ import React from 'react';
 import { Panel, Row, Tab } from 'react-bootstrap';
 import { shallow } from 'enzyme';
 
-import Welcome from '../../../src/welcome/Welcome';
+import Welcome from 'src/welcome/Welcome';
 
 describe('Welcome', () => {
   const mockedProps = {};
diff --git a/superset-frontend/src/SqlLab/actions/sqlLab.js b/superset-frontend/src/SqlLab/actions/sqlLab.js
index eb514b2..778dcb3 100644
--- a/superset-frontend/src/SqlLab/actions/sqlLab.js
+++ b/superset-frontend/src/SqlLab/actions/sqlLab.js
@@ -240,7 +240,7 @@ export function startQuery(query) {
 }
 
 export function querySuccess(query, results) {
-  return function(dispatch) {
+  return function (dispatch) {
     const sync =
       !query.isDataPreview &&
       isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE)
@@ -266,7 +266,7 @@ export function querySuccess(query, results) {
 }
 
 export function queryFailed(query, msg, link) {
-  return function(dispatch) {
+  return function (dispatch) {
     const sync =
       !query.isDataPreview &&
       isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE)
@@ -308,7 +308,7 @@ export function requestQueryResults(query) {
 }
 
 export function fetchQueryResults(query, displayLimit) {
-  return function(dispatch) {
+  return function (dispatch) {
     dispatch(requestQueryResults(query));
 
     return SupersetClient.get({
@@ -333,7 +333,7 @@ export function fetchQueryResults(query, displayLimit) {
 }
 
 export function runQuery(query) {
-  return function(dispatch) {
+  return function (dispatch) {
     dispatch(startQuery(query));
     const postPayload = {
       client_id: query.id,
@@ -376,7 +376,7 @@ export function runQuery(query) {
 }
 
 export function validateQuery(query) {
-  return function(dispatch) {
+  return function (dispatch) {
     dispatch(startQueryValidation(query));
 
     const postPayload = {
@@ -409,7 +409,7 @@ export function validateQuery(query) {
 }
 
 export function postStopQuery(query) {
-  return function(dispatch) {
+  return function (dispatch) {
     return SupersetClient.post({
       endpoint: '/superset/stop_query/',
       postPayload: { client_id: query.id },
@@ -477,7 +477,7 @@ export function migrateQueryEditorFromLocalStorage(
   tables,
   queries,
 ) {
-  return function(dispatch) {
+  return function (dispatch) {
     return SupersetClient.post({
       endpoint: '/tabstateview/',
       postPayload: { queryEditor },
@@ -520,7 +520,7 @@ export function migrateQueryEditorFromLocalStorage(
 }
 
 export function addQueryEditor(queryEditor) {
-  return function(dispatch) {
+  return function (dispatch) {
     const sync = isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE)
       ? SupersetClient.post({
           endpoint: '/tabstateview/',
@@ -552,7 +552,7 @@ export function addQueryEditor(queryEditor) {
 }
 
 export function cloneQueryToNewTab(query, autorun) {
-  return function(dispatch, getState) {
+  return function (dispatch, getState) {
     const state = getState();
     const { queryEditors, tabHistory } = state.sqlLab;
     const sourceQueryEditor = queryEditors.find(
@@ -573,7 +573,7 @@ export function cloneQueryToNewTab(query, autorun) {
 }
 
 export function setActiveQueryEditor(queryEditor) {
-  return function(dispatch) {
+  return function (dispatch) {
     const sync = isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE)
       ? SupersetClient.post({
           endpoint: encodeURI(`/tabstateview/${queryEditor.id}/activate`),
@@ -635,7 +635,7 @@ export function setTables(tableSchemas) {
 }
 
 export function switchQueryEditor(queryEditor, displayLimit) {
-  return function(dispatch) {
+  return function (dispatch) {
     if (
       isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE) &&
       !queryEditor.loaded
@@ -688,7 +688,7 @@ export function setActiveSouthPaneTab(tabId) {
 }
 
 export function removeQueryEditor(queryEditor) {
-  return function(dispatch) {
+  return function (dispatch) {
     const sync = isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE)
       ? SupersetClient.delete({
           endpoint: encodeURI(`/tabstateview/${queryEditor.id}`),
@@ -710,7 +710,7 @@ export function removeQueryEditor(queryEditor) {
 }
 
 export function removeQuery(query) {
-  return function(dispatch) {
+  return function (dispatch) {
     const sync = isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE)
       ? SupersetClient.delete({
           endpoint: encodeURI(
@@ -734,7 +734,7 @@ export function removeQuery(query) {
 }
 
 export function queryEditorSetDb(queryEditor, dbId) {
-  return function(dispatch) {
+  return function (dispatch) {
     const sync = isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE)
       ? SupersetClient.put({
           endpoint: encodeURI(`/tabstateview/${queryEditor.id}`),
@@ -757,7 +757,7 @@ export function queryEditorSetDb(queryEditor, dbId) {
 }
 
 export function queryEditorSetSchema(queryEditor, schema) {
-  return function(dispatch) {
+  return function (dispatch) {
     const sync = isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE)
       ? SupersetClient.put({
           endpoint: encodeURI(`/tabstateview/${queryEditor.id}`),
@@ -790,7 +790,7 @@ export function queryEditorSetTableOptions(queryEditor, options) {
 }
 
 export function queryEditorSetAutorun(queryEditor, autorun) {
-  return function(dispatch) {
+  return function (dispatch) {
     const sync = isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE)
       ? SupersetClient.put({
           endpoint: encodeURI(`/tabstateview/${queryEditor.id}`),
@@ -815,7 +815,7 @@ export function queryEditorSetAutorun(queryEditor, autorun) {
 }
 
 export function queryEditorSetTitle(queryEditor, title) {
-  return function(dispatch) {
+  return function (dispatch) {
     const sync = isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE)
       ? SupersetClient.put({
           endpoint: encodeURI(`/tabstateview/${queryEditor.id}`),
@@ -840,7 +840,7 @@ export function queryEditorSetTitle(queryEditor, title) {
 }
 
 export function queryEditorSetSql(queryEditor, sql) {
-  return function(dispatch) {
+  return function (dispatch) {
     const sync = isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE)
       ? SupersetClient.put({
           endpoint: encodeURI(`/tabstateview/${queryEditor.id}`),
@@ -865,7 +865,7 @@ export function queryEditorSetSql(queryEditor, sql) {
 }
 
 export function queryEditorSetQueryLimit(queryEditor, queryLimit) {
-  return function(dispatch) {
+  return function (dispatch) {
     const sync = isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE)
       ? SupersetClient.put({
           endpoint: encodeURI(`/tabstateview/${queryEditor.id}`),
@@ -894,7 +894,7 @@ export function queryEditorSetQueryLimit(queryEditor, queryLimit) {
 }
 
 export function queryEditorSetTemplateParams(queryEditor, templateParams) {
-  return function(dispatch) {
+  return function (dispatch) {
     const sync = isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE)
       ? SupersetClient.put({
           endpoint: encodeURI(`/tabstateview/${queryEditor.id}`),
@@ -1006,7 +1006,7 @@ function getTableExtendedMetadata(table, query, dispatch) {
 }
 
 export function addTable(query, tableName, schemaName) {
-  return function(dispatch) {
+  return function (dispatch) {
     const table = {
       dbId: query.dbId,
       queryEditorId: query.id,
@@ -1056,7 +1056,7 @@ export function changeDataPreviewId(oldQueryId, newQuery) {
 }
 
 export function reFetchQueryResults(query) {
-  return function(dispatch) {
+  return function (dispatch) {
     const newQuery = {
       id: shortid.generate(),
       dbId: query.dbId,
@@ -1075,7 +1075,7 @@ export function reFetchQueryResults(query) {
 }
 
 export function expandTable(table) {
-  return function(dispatch) {
+  return function (dispatch) {
     const sync = isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE)
       ? SupersetClient.post({
           endpoint: encodeURI(`/tableschemaview/${table.id}/expanded`),
@@ -1099,7 +1099,7 @@ export function expandTable(table) {
 }
 
 export function collapseTable(table) {
-  return function(dispatch) {
+  return function (dispatch) {
     const sync = isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE)
       ? SupersetClient.post({
           endpoint: encodeURI(`/tableschemaview/${table.id}/expanded`),
@@ -1123,7 +1123,7 @@ export function collapseTable(table) {
 }
 
 export function removeTable(table) {
-  return function(dispatch) {
+  return function (dispatch) {
     const sync = isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE)
       ? SupersetClient.delete({
           endpoint: encodeURI(`/tableschemaview/${table.id}`),
@@ -1163,7 +1163,7 @@ export function persistEditorHeight(queryEditor, northPercent, southPercent) {
 }
 
 export function popStoredQuery(urlId) {
-  return function(dispatch) {
+  return function (dispatch) {
     return SupersetClient.get({ endpoint: `/kv/${urlId}` })
       .then(({ json }) =>
         dispatch(
@@ -1180,7 +1180,7 @@ export function popStoredQuery(urlId) {
   };
 }
 export function popSavedQuery(saveQueryId) {
-  return function(dispatch) {
+  return function (dispatch) {
     return SupersetClient.get({
       endpoint: `/savedqueryviewapi/api/get/${saveQueryId}`,
     })
@@ -1195,7 +1195,7 @@ export function popSavedQuery(saveQueryId) {
   };
 }
 export function popDatasourceQuery(datasourceKey, sql) {
-  return function(dispatch) {
+  return function (dispatch) {
     return SupersetClient.get({
       endpoint: `/superset/fetch_datasource_metadata?datasourceKey=${datasourceKey}`,
     })
diff --git a/superset-frontend/src/SqlLab/components/App.jsx b/superset-frontend/src/SqlLab/components/App.jsx
index f1c21be..9cbf1d3 100644
--- a/superset-frontend/src/SqlLab/components/App.jsx
+++ b/superset-frontend/src/SqlLab/components/App.jsx
@@ -89,11 +89,13 @@ class App extends React.PureComponent {
       tabsEl.length > 0 ? tabsEl.outerHeight() : searchHeaderHeight;
     const warningHeight = warningEl.length > 0 ? warningEl.outerHeight() : 0;
     const alertHeight = alertEl.length > 0 ? alertEl.outerHeight() : 0;
-    return `${window.innerHeight -
+    return `${
+      window.innerHeight -
       headerHeight -
       tabsHeight -
       warningHeight -
-      alertHeight}px`;
+      alertHeight
+    }px`;
   }
   showLocalStorageUsageWarning(currentUsage) {
     this.props.actions.addDangerToast(
diff --git a/superset-frontend/src/SqlLab/components/QueryAutoRefresh.jsx b/superset-frontend/src/SqlLab/components/QueryAutoRefresh.jsx
index 17389ad..cbbcb6c 100644
--- a/superset-frontend/src/SqlLab/components/QueryAutoRefresh.jsx
+++ b/superset-frontend/src/SqlLab/components/QueryAutoRefresh.jsx
@@ -71,8 +71,9 @@ class QueryAutoRefresh extends React.PureComponent {
     // only poll /superset/queries/ if there are started or running queries
     if (this.shouldCheckForQueries()) {
       SupersetClient.get({
-        endpoint: `/superset/queries/${this.props.queriesLastUpdate -
-          QUERY_UPDATE_BUFFER_MS}`,
+        endpoint: `/superset/queries/${
+          this.props.queriesLastUpdate - QUERY_UPDATE_BUFFER_MS
+        }`,
         timeout: QUERY_TIMEOUT_LIMIT,
       })
         .then(({ json }) => {
diff --git a/superset-frontend/src/SqlLab/components/QuerySearch.jsx b/superset-frontend/src/SqlLab/components/QuerySearch.jsx
index c22622d..d895d54 100644
--- a/superset-frontend/src/SqlLab/components/QuerySearch.jsx
+++ b/superset-frontend/src/SqlLab/components/QuerySearch.jsx
@@ -133,7 +133,7 @@ class QuerySearch extends React.PureComponent {
   }
 
   insertParams(baseUrl, params) {
-    const validParams = params.filter(function(p) {
+    const validParams = params.filter(function (p) {
       return p !== '';
     });
     return baseUrl + '?' + validParams.join('&');
diff --git a/superset-frontend/src/SqlLab/components/QueryTable.jsx b/superset-frontend/src/SqlLab/components/QueryTable.jsx
index 1115671..b16aad4 100644
--- a/superset-frontend/src/SqlLab/components/QueryTable.jsx
+++ b/superset-frontend/src/SqlLab/components/QueryTable.jsx
@@ -98,9 +98,7 @@ class QueryTable extends React.PureComponent {
         if (q.endDttm) {
           q.duration = fDuration(q.startDttm, q.endDttm);
         }
-        const time = moment(q.startDttm)
-          .format()
-          .split('T');
+        const time = moment(q.startDttm).format().split('T');
         q.time = (
           <div>
             <span>
diff --git a/superset-frontend/src/SqlLab/components/SqlEditor.jsx b/superset-frontend/src/SqlLab/components/SqlEditor.jsx
index 11edbf7..4903abc 100644
--- a/superset-frontend/src/SqlLab/components/SqlEditor.jsx
+++ b/superset-frontend/src/SqlLab/components/SqlEditor.jsx
@@ -252,8 +252,9 @@ class SqlEditor extends React.PureComponent {
   };
   elementStyle(dimension, elementSize, gutterSize) {
     return {
-      [dimension]: `calc(${elementSize}% - ${gutterSize +
-        SQL_EDITOR_GUTTER_MARGIN}px)`,
+      [dimension]: `calc(${elementSize}% - ${
+        gutterSize + SQL_EDITOR_GUTTER_MARGIN
+      }px)`,
     };
   }
   requestValidation() {
diff --git a/superset-frontend/src/chart/chartAction.js b/superset-frontend/src/chart/chartAction.js
index 81bfb1f..a26d670 100644
--- a/superset-frontend/src/chart/chartAction.js
+++ b/superset-frontend/src/chart/chartAction.js
@@ -107,7 +107,7 @@ export function runAnnotationQuery(
   formData = null,
   key,
 ) {
-  return function(dispatch, getState) {
+  return function (dispatch, getState) {
     const sliceKey = key || Object.keys(getState().charts)[0];
     // make a copy of formData, not modifying original formData
     const fd = {
diff --git a/superset-frontend/src/dashboard/reducers/getInitialState.js b/superset-frontend/src/dashboard/reducers/getInitialState.js
index 9bf9344..bd27618 100644
--- a/superset-frontend/src/dashboard/reducers/getInitialState.js
+++ b/superset-frontend/src/dashboard/reducers/getInitialState.js
@@ -49,7 +49,7 @@ import getLocationHash from '../util/getLocationHash';
 import newComponentFactory from '../util/newComponentFactory';
 import { TIME_RANGE } from '../../visualizations/FilterBox/FilterBox';
 
-export default function(bootstrapData) {
+export default function (bootstrapData) {
   const { user_id, datasources, common, editMode, urlParams } = bootstrapData;
 
   const dashboard = { ...bootstrapData.dashboard_data };
diff --git a/superset-frontend/src/dashboard/util/findFirstParentContainer.js b/superset-frontend/src/dashboard/util/findFirstParentContainer.js
index 216a01d..ca4047a 100644
--- a/superset-frontend/src/dashboard/util/findFirstParentContainer.js
+++ b/superset-frontend/src/dashboard/util/findFirstParentContainer.js
@@ -19,7 +19,7 @@
 import { TABS_TYPE } from './componentTypes';
 import { DASHBOARD_ROOT_ID } from './constants';
 
-export default function(layout = {}) {
+export default function (layout = {}) {
   // DASHBOARD_GRID_TYPE or TABS_TYPE?
   let parent = layout[DASHBOARD_ROOT_ID];
   if (
diff --git a/superset-frontend/src/dashboard/util/getEmptyLayout.js b/superset-frontend/src/dashboard/util/getEmptyLayout.js
index a58866c..b7459ba 100644
--- a/superset-frontend/src/dashboard/util/getEmptyLayout.js
+++ b/superset-frontend/src/dashboard/util/getEmptyLayout.js
@@ -24,7 +24,7 @@ import {
   DASHBOARD_VERSION_KEY,
 } from './constants';
 
-export default function() {
+export default function () {
   return {
     [DASHBOARD_VERSION_KEY]: 'v2',
     [DASHBOARD_ROOT_ID]: {
diff --git a/superset-frontend/src/explore/AdhocFilter.js b/superset-frontend/src/explore/AdhocFilter.js
index 74542bb..0f3865c 100644
--- a/superset-frontend/src/explore/AdhocFilter.js
+++ b/superset-frontend/src/explore/AdhocFilter.js
@@ -100,9 +100,7 @@ export default class AdhocFilter {
       adhocFilter.filterOptionName ||
       `filter_${Math.random()
         .toString(36)
-        .substring(2, 15)}_${Math.random()
-        .toString(36)
-        .substring(2, 15)}`;
+        .substring(2, 15)}_${Math.random().toString(36).substring(2, 15)}`;
   }
 
   duplicateWith(nextFields) {
diff --git a/superset-frontend/src/explore/AdhocMetric.js b/superset-frontend/src/explore/AdhocMetric.js
index 87de4ec..5930522 100644
--- a/superset-frontend/src/explore/AdhocMetric.js
+++ b/superset-frontend/src/explore/AdhocMetric.js
@@ -82,9 +82,7 @@ export default class AdhocMetric {
       adhocMetric.optionName ||
       `metric_${Math.random()
         .toString(36)
-        .substring(2, 15)}_${Math.random()
-        .toString(36)
-        .substring(2, 15)}`;
+        .substring(2, 15)}_${Math.random().toString(36).substring(2, 15)}`;
   }
 
   getDefaultLabel() {
@@ -94,9 +92,9 @@ export default class AdhocMetric {
 
   translateToSql() {
     if (this.expressionType === EXPRESSION_TYPES.SIMPLE) {
-      return `${this.aggregate || ''}(${(this.column &&
-        this.column.column_name) ||
-        ''})`;
+      return `${this.aggregate || ''}(${
+        (this.column && this.column.column_name) || ''
+      })`;
     } else if (this.expressionType === EXPRESSION_TYPES.SQL) {
       return this.sqlExpression;
     }
diff --git a/superset-frontend/src/explore/actions/exploreActions.js b/superset-frontend/src/explore/actions/exploreActions.js
index 3c019de..cb21eb0 100644
--- a/superset-frontend/src/explore/actions/exploreActions.js
+++ b/superset-frontend/src/explore/actions/exploreActions.js
@@ -76,7 +76,7 @@ export function toggleFaveStar(isStarred) {
 
 export const FETCH_FAVE_STAR = 'FETCH_FAVE_STAR';
 export function fetchFaveStar(sliceId) {
-  return function(dispatch) {
+  return function (dispatch) {
     SupersetClient.get({
       endpoint: `${FAVESTAR_BASE_URL}/${sliceId}/count`,
     }).then(({ json }) => {
@@ -89,7 +89,7 @@ export function fetchFaveStar(sliceId) {
 
 export const SAVE_FAVE_STAR = 'SAVE_FAVE_STAR';
 export function saveFaveStar(sliceId, isStarred) {
-  return function(dispatch) {
+  return function (dispatch) {
     const urlSuffix = isStarred ? 'unselect' : 'select';
     SupersetClient.get({
       endpoint: `${FAVESTAR_BASE_URL}/${sliceId}/${urlSuffix}/`,
diff --git a/superset-frontend/src/explore/components/controls/AnnotationLayer.jsx b/superset-frontend/src/explore/components/controls/AnnotationLayer.jsx
index 4c68cec..20fdaec 100644
--- a/superset-frontend/src/explore/components/controls/AnnotationLayer.jsx
+++ b/superset-frontend/src/explore/components/controls/AnnotationLayer.jsx
@@ -195,10 +195,7 @@ export default class AnnotationLayer extends React.PureComponent {
   isValidFormula(value, annotationType) {
     if (annotationType === ANNOTATION_TYPES.FORMULA) {
       try {
-        mathjs
-          .parse(value)
-          .compile()
-          .eval({ x: 0 });
+        mathjs.parse(value).compile().eval({ x: 0 });
       } catch (err) {
         return true;
       }
diff --git a/superset-frontend/src/explore/components/controls/DateFilterControl.jsx b/superset-frontend/src/explore/components/controls/DateFilterControl.jsx
index 93e0637..669fdb6 100644
--- a/superset-frontend/src/explore/components/controls/DateFilterControl.jsx
+++ b/superset-frontend/src/explore/components/controls/DateFilterControl.jsx
@@ -80,10 +80,7 @@ const DEFAULT_SINCE = moment()
   .startOf('day')
   .subtract(7, 'days')
   .format(MOMENT_FORMAT);
-const DEFAULT_UNTIL = moment()
-  .utc()
-  .startOf('day')
-  .format(MOMENT_FORMAT);
+const DEFAULT_UNTIL = moment().utc().startOf('day').format(MOMENT_FORMAT);
 const SEPARATOR = ' : ';
 const FREEFORM_TOOLTIP = t(
   'Superset supports smart date parsing. Strings like `last sunday` or ' +
@@ -137,10 +134,7 @@ function getStateFromCommonTimeFrame(value) {
       .startOf('day')
       .subtract(1, units)
       .format(MOMENT_FORMAT),
-    until: moment()
-      .utc()
-      .startOf('day')
-      .format(MOMENT_FORMAT),
+    until: moment().utc().startOf('day').format(MOMENT_FORMAT),
   };
 }
 
@@ -149,24 +143,15 @@ function getStateFromCustomRange(value) {
   let since;
   let until;
   if (rel === RELATIVE_TIME_OPTIONS.LAST) {
-    until = moment()
-      .utc()
-      .startOf('day')
-      .format(MOMENT_FORMAT);
+    until = moment().utc().startOf('day').format(MOMENT_FORMAT);
     since = moment()
       .utc()
       .startOf('day')
       .subtract(num, grain)
       .format(MOMENT_FORMAT);
   } else {
-    until = moment()
-      .utc()
-      .startOf('day')
-      .add(num, grain)
-      .format(MOMENT_FORMAT);
-    since = moment()
-      .startOf('day')
-      .format(MOMENT_FORMAT);
+    until = moment().utc().startOf('day').add(num, grain).format(MOMENT_FORMAT);
+    since = moment().startOf('day').format(MOMENT_FORMAT);
   }
   return {
     tab: TABS.CUSTOM,
diff --git a/superset-frontend/src/explore/exploreUtils.js b/superset-frontend/src/explore/exploreUtils.js
index 2269896..42261f6 100644
--- a/superset-frontend/src/explore/exploreUtils.js
+++ b/superset-frontend/src/explore/exploreUtils.js
@@ -94,10 +94,7 @@ export function getExploreLongUrl(
   if (endpointType === 'standalone') {
     search.standalone = 'true';
   }
-  const url = uri
-    .directory(directory)
-    .search(search)
-    .toString();
+  const url = uri.directory(directory).search(search).toString();
   if (!allowOverflow && url.length > MAX_URL_LENGTH) {
     const minimalFormData = {
       datasource: formData.datasource,
diff --git a/superset-frontend/src/modules/dates.js b/superset-frontend/src/modules/dates.js
index 1518961..3e9d12b 100644
--- a/superset-frontend/src/modules/dates.js
+++ b/superset-frontend/src/modules/dates.js
@@ -18,36 +18,25 @@
  */
 import moment from 'moment';
 
-export const fDuration = function(t1, t2, format = 'HH:mm:ss.SS') {
+export const fDuration = function (t1, t2, format = 'HH:mm:ss.SS') {
   const diffSec = t2 - t1;
   const duration = moment(new Date(diffSec));
   return duration.utc().format(format);
 };
 
-export const now = function() {
+export const now = function () {
   // seconds from EPOCH as a float
-  return moment()
-    .utc()
-    .valueOf();
+  return moment().utc().valueOf();
 };
 
-export const epochTimeXHoursAgo = function(h) {
-  return moment()
-    .subtract(h, 'hours')
-    .utc()
-    .valueOf();
+export const epochTimeXHoursAgo = function (h) {
+  return moment().subtract(h, 'hours').utc().valueOf();
 };
 
-export const epochTimeXDaysAgo = function(d) {
-  return moment()
-    .subtract(d, 'days')
-    .utc()
-    .valueOf();
+export const epochTimeXDaysAgo = function (d) {
+  return moment().subtract(d, 'days').utc().valueOf();
 };
 
-export const epochTimeXYearsAgo = function(y) {
-  return moment()
-    .subtract(y, 'years')
-    .utc()
-    .valueOf();
+export const epochTimeXYearsAgo = function (y) {
+  return moment().subtract(y, 'years').utc().valueOf();
 };
diff --git a/superset-frontend/src/profile/components/RecentActivity.jsx b/superset-frontend/src/profile/components/RecentActivity.jsx
index 37487e9..e58fb13 100644
--- a/superset-frontend/src/profile/components/RecentActivity.jsx
+++ b/superset-frontend/src/profile/components/RecentActivity.jsx
@@ -29,7 +29,7 @@ const propTypes = {
 export default class RecentActivity extends React.PureComponent {
   render() {
     const rowLimit = 50;
-    const mutator = function(data) {
+    const mutator = function (data) {
       return data
         .filter(row => row.action === 'dashboard' || row.action === 'explore')
         .map(row => ({
diff --git a/superset-frontend/src/setup/setupApp.ts b/superset-frontend/src/setup/setupApp.ts
index b4a9ca7..5d9e8e1 100644
--- a/superset-frontend/src/setup/setupApp.ts
+++ b/superset-frontend/src/setup/setupApp.ts
@@ -51,8 +51,8 @@ function toggleCheckbox(apiUrlPrefix: string, selector: string) {
 }
 
 export default function setupApp() {
-  $(document).ready(function() {
-    $(':checkbox[data-checkbox-api-prefix]').change(function(
+  $(document).ready(function () {
+    $(':checkbox[data-checkbox-api-prefix]').change(function (
       this: HTMLElement,
     ) {
       const $this = $(this);
@@ -62,7 +62,7 @@ export default function setupApp() {
     });
 
     // for language picker dropdown
-    $('#language-picker a').click(function(
+    $('#language-picker a').click(function (
       ev: JQuery.ClickEvent<
         HTMLLinkElement,
         null,