You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by ru...@apache.org on 2022/01/06 00:16:32 UTC

[superset] branch tech-debt-metrics updated: adding tsx rule, moving stuff into the scripts folder, with its own eslintrc file

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

rusackas pushed a commit to branch tech-debt-metrics
in repository https://gitbox.apache.org/repos/asf/superset.git


The following commit(s) were added to refs/heads/tech-debt-metrics by this push:
     new c53e809  adding tsx rule, moving stuff into the scripts folder, with its own eslintrc file
c53e809 is described below

commit c53e8093a3eb5cf3294d84d7ea7d099da9e56d13
Author: Evan Rusackas <ev...@preset.io>
AuthorDate: Wed Jan 5 17:14:50 2022 -0700

    adding tsx rule, moving stuff into the scripts folder, with its own eslintrc file
---
 superset-frontend/.eslintrc.js                     |  85 +----
 superset-frontend/eslint-stats.json                |  99 ------
 superset-frontend/package.json                     |   2 +-
 .../scripts/eslint-metrics-report.json             | 392 +++++++++++++++++++++
 superset-frontend/{ => scripts}/eslint_metrics.js  |  16 +-
 superset-frontend/scripts/eslintrc_metrics.js      |  65 ++++
 6 files changed, 480 insertions(+), 179 deletions(-)

diff --git a/superset-frontend/.eslintrc.js b/superset-frontend/.eslintrc.js
index 3bfb29b..98466ec 100644
--- a/superset-frontend/.eslintrc.js
+++ b/superset-frontend/.eslintrc.js
@@ -16,34 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
-const packageConfig = require('./package');
-
-const importCoreModules = [];
-Object.entries(packageConfig.dependencies).forEach(([pkg]) => {
-  if (/@superset-ui/.test(pkg)) {
-    importCoreModules.push(pkg);
-  }
-});
-
-// ignore files when running ForkTsCheckerWebpackPlugin
-let ignorePatterns = [];
-if (process.env.NODE_ENV === 'production') {
-  ignorePatterns = [
-    '*.test.{js,ts,jsx,tsx}',
-    'plugins/**/test/**/*',
-    'packages/**/test/**/*',
-    'packages/generator-superset/**/*',
-  ];
-}
-
 module.exports = {
   extends: [
     'airbnb',
     'prettier',
     'prettier/react',
     'plugin:react-hooks/recommended',
-    'plugin:react-prefer-function-component/recommended',
   ],
   parser: '@babel/eslint-parser',
   parserOptions: {
@@ -55,25 +33,12 @@ module.exports = {
     browser: true,
   },
   settings: {
-    'import/resolver': {
-      webpack: {},
-      node: {
-        extensions: ['.js', '.jsx', '.ts', '.tsx', '.json'],
-      },
-    },
-    // Allow only core/src and core/test, avoid import modules from lib
-    'import/internal-regex': /^@superset-ui\/core\/(src|test)\/.*/,
-    'import/core-modules': importCoreModules,
+    'import/resolver': 'webpack',
     react: {
       version: 'detect',
     },
   },
-  plugins: [
-    'prettier',
-    'react',
-    'file-progress',
-    'react-prefer-function-component',
-  ],
+  plugins: ['prettier', 'react', 'file-progress'],
   overrides: [
     {
       files: ['cypress-base/**/*'],
@@ -102,14 +67,8 @@ module.exports = {
         'prettier',
         'prettier/@typescript-eslint',
         'prettier/react',
-        'plugin:react-prefer-function-component/recommended',
-      ],
-      plugins: [
-        '@typescript-eslint/eslint-plugin',
-        'prettier',
-        'react',
-        'react-prefer-function-component',
       ],
+      plugins: ['@typescript-eslint/eslint-plugin', 'prettier', 'react'],
       rules: {
         '@typescript-eslint/ban-ts-ignore': 0,
         '@typescript-eslint/ban-ts-comment': 0, // disabled temporarily
@@ -117,11 +76,11 @@ module.exports = {
         '@typescript-eslint/no-empty-function': 0,
         '@typescript-eslint/no-explicit-any': 0,
         '@typescript-eslint/no-use-before-define': 1, // disabled temporarily
-        '@typescript-eslint/no-non-null-assertion': 0, // disabled temporarily
         '@typescript-eslint/explicit-function-return-type': 0,
         '@typescript-eslint/explicit-module-boundary-types': 0, // re-enable up for discussion
         camelcase: 0,
         'class-methods-use-this': 0,
+        curly: 1,
         'func-names': 0,
         'guard-for-in': 0,
         'import/no-cycle': 0, // re-enable up for discussion, might require some major refactors
@@ -171,7 +130,6 @@ module.exports = {
         'padded-blocks': 0,
         'prefer-arrow-callback': 0,
         'prefer-destructuring': ['error', { object: true, array: false }],
-        'react-prefer-function-component/react-prefer-function-component': 1,
         'react/destructuring-assignment': 0, // re-enable up for discussion
         'react/forbid-prop-types': 0,
         'react/jsx-filename-extension': [1, { extensions: ['.jsx', '.tsx'] }],
@@ -212,11 +170,11 @@ module.exports = {
     },
     {
       files: [
-        '*.test.ts',
-        '*.test.tsx',
-        '*.test.js',
-        '*.test.jsx',
-        'fixtures.*',
+        'src/**/*.test.ts',
+        'src/**/*.test.tsx',
+        'src/**/*.test.js',
+        'src/**/*.test.jsx',
+        'src/**/fixtures.*',
       ],
       plugins: ['jest', 'jest-dom', 'no-only-tests', 'testing-library'],
       env: {
@@ -237,28 +195,9 @@ module.exports = {
           'error',
           { devDependencies: true },
         ],
+        'jest/consistent-test-it': 'error',
         'no-only-tests/no-only-tests': 'error',
-        'max-classes-per-file': 0,
         '@typescript-eslint/no-non-null-assertion': 0,
-        // TODO: disabled temporarily, re-enable after monorepo
-        'jest/consistent-test-it': 'error',
-        'jest/expect-expect': 0,
-        'jest/no-test-prefixes': 0,
-        'jest/valid-expect-in-promise': 0,
-        'jest/valid-expect': 0,
-        'jest/valid-title': 0,
-        'jest-dom/prefer-to-have-attribute': 0,
-        'jest-dom/prefer-to-have-text-content': 0,
-        'jest-dom/prefer-to-have-style': 0,
-      },
-    },
-    {
-      files: './packages/generator-superset/**/*.test.*',
-      env: {
-        node: true,
-      },
-      rules: {
-        'jest/expect-expect': 0,
       },
     },
   ],
@@ -271,7 +210,7 @@ module.exports = {
       },
     ],
     'class-methods-use-this': 0,
-    curly: 2,
+    curly: 1,
     'func-names': 0,
     'guard-for-in': 0,
     'import/extensions': [
@@ -314,7 +253,6 @@ module.exports = {
     'no-shadow': 0, // re-enable up for discussion
     'padded-blocks': 0,
     'prefer-arrow-callback': 0,
-    'react-prefer-function-component/react-prefer-function-component': 1,
     'prefer-object-spread': 1,
     'prefer-destructuring': ['error', { object: true, array: false }],
     'react/destructuring-assignment': 0, // re-enable up for discussion
@@ -333,5 +271,4 @@ module.exports = {
     'react/static-property-placement': 0, // disabled temporarily
     'prettier/prettier': 'error',
   },
-  ignorePatterns,
 };
diff --git a/superset-frontend/eslint-stats.json b/superset-frontend/eslint-stats.json
deleted file mode 100644
index c148471..0000000
--- a/superset-frontend/eslint-stats.json
+++ /dev/null
@@ -1,99 +0,0 @@
-{
-	"metrics": [		
-    	{
-    		"rule": "react-prefer-function-component/react-prefer-function-component",
-    		"count": 89,
-    		"files": [
-    			"/Users/evan/GitHub/superset/superset-frontend/src/CRUD/CollectionTable.tsx:115:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/CRUD/Fieldset.jsx:38:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/AceEditorWrapper/index.tsx:67:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/App/index.jsx:37:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.jsx:38:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:43:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/QueryAutoRefresh/index.jsx:31:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/ResultSet/index.tsx:174:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:157:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.jsx:54:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:75:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/addSlice/AddSliceContainer.tsx:181:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/chart/Chart.jsx:110:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/chart/ChartRenderer.jsx:63:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/components/AlteredSliceTag/index.jsx:52:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/components/AnchorLink/index.jsx:42:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/components/AsyncSelect/index.jsx:45:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/components/CopyToClipboard/index.jsx:46:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/components/Datasource/DatasourceEditor.jsx:405:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/components/FilterableTable/FilterableTable.tsx:116:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/components/ModalTrigger/index.jsx:54:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/components/Select/OnPasteSelect.jsx:23:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/components/URLShortLinkButton/index.jsx:35:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/ColorSchemeControlWrapper.jsx:37:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/CssEditor/index.jsx:57:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/Dashboard.jsx:76:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/DashboardGrid.jsx:51:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/DeleteComponentButton.jsx:30:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:101:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/Header/index.jsx:140:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:110:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/PublishedStatus/index.jsx:47:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:64:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/SaveModal.tsx:68:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/SliceAdder.jsx:89:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:125:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/UndoRedoKeyListeners/index.jsx:27:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/dnd/DragDroppable.jsx:69:8",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/dnd/DragHandle.jsx:35:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/filterscope/FilterScopeModal.tsx:33:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:70:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/Chart.jsx:114:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.jsx:156:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/Column.jsx:61:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/Divider.jsx:39:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/Header.jsx:58:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/Row.jsx:59:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/Tab.jsx:87:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/Tabs.jsx:112:8",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/new/DraggableNewComponent.jsx:38:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/menu/BackgroundStyleDropdown.tsx:50:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/menu/HoverMenu.tsx:66:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/menu/MarkdownModeDropdown.tsx:43:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/menu/WithPopoverMenu.tsx:44:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/resizable/ResizableContainer.jsx:83:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/containers/DashboardComponent.jsx:119:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/ControlHeader.jsx:49:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/ControlPanelsContainer.tsx:197:8",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/EmbedCodeButton.jsx:36:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:111:8",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/SaveModal.tsx:66:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:98:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/AnnotationLayerControl/index.jsx:59:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/BoundsControl.jsx:50:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/CheckboxControl.jsx:37:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/CollectionControl/index.jsx:76:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/ColorPickerControl.jsx:67:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/ColorSchemeControl.jsx:51:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:111:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:71:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterControl/index.jsx:88:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:88:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/index.jsx:54:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterPopoverTrigger/index.tsx:45:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/FixedOrMetricControl/index.jsx:51:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:79:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopoverTitle.jsx:34:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricOption.jsx:43:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricPopoverTrigger.tsx:53:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/SelectControl.jsx:85:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/SpatialControl.jsx:50:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/TextAreaControl.jsx:60:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/TextControl/index.tsx:48:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:99:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/ViewportControl.jsx:58:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/profile/components/CreatedContent.tsx:31:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/profile/components/Favorites.tsx:31:16",
-				"/Users/evan/GitHub/superset/superset-frontend/src/visualizations/FilterBox/FilterBox.jsx:94:1",
-				"/Users/evan/GitHub/superset/superset-frontend/src/visualizations/TimeTable/SparklineCell.jsx:90:1"
-    		]
-    	}
-	]
-}
\ No newline at end of file
diff --git a/superset-frontend/package.json b/superset-frontend/package.json
index 280977d..1825d1f 100644
--- a/superset-frontend/package.json
+++ b/superset-frontend/package.json
@@ -47,7 +47,7 @@
     "format": "npm run _prettier -- --write",
     "lint": "npm run _lint && npm run type",
     "lint-fix": "npm run _lint -- --fix && npm run type",
-    "lint-stats": "eslint -f ./eslint_metrics.js -o eslint-stats.json --ignore-path=.eslintignore --ext .js,.jsx,.ts,.tsx .",
+    "lint-stats": "eslint -f ./scripts/eslint_metrics.js -o scripts/eslint-metrics-report.json -c scripts/eslintrc_metrics.js --no-eslintrc --ignore-path=.eslintignore --ext .js,.jsx,.ts,.tsx .",
     "plugins:build": "node ./scripts/build.js",
     "plugins:build-assets": "node ./scripts/copyAssets.js",
     "plugins:build-storybook": "cd packages/superset-ui-demo && npm run build-storybook",
diff --git a/superset-frontend/scripts/eslint-metrics-report.json b/superset-frontend/scripts/eslint-metrics-report.json
new file mode 100644
index 0000000..aadd0e2
--- /dev/null
+++ b/superset-frontend/scripts/eslint-metrics-report.json
@@ -0,0 +1,392 @@
+{
+	"metrics": [		
+    	{
+    		"issue": "We prefer function components to class-based components",
+    		"eslint rule": "react-prefer-function-component/react-prefer-function-component",
+    		"count": 128,
+    		"files": [
+    			"/Users/evan/GitHub/superset/superset-frontend/packages/superset-ui-core/src/chart-composition/ChartFrame.tsx:41:16",
+				"/Users/evan/GitHub/superset/superset-frontend/packages/superset-ui-core/src/chart-composition/legend/WithLegend.tsx:55:1",
+				"/Users/evan/GitHub/superset/superset-frontend/packages/superset-ui-core/src/chart-composition/tooltip/TooltipFrame.tsx:33:1",
+				"/Users/evan/GitHub/superset/superset-frontend/packages/superset-ui-core/src/chart-composition/tooltip/TooltipTable.tsx:42:16",
+				"/Users/evan/GitHub/superset/superset-frontend/packages/superset-ui-core/src/chart/components/ChartDataProvider.tsx:70:1",
+				"/Users/evan/GitHub/superset/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChart.tsx:84:16",
+				"/Users/evan/GitHub/superset/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChartCore.tsx:80:16",
+				"/Users/evan/GitHub/superset/superset-frontend/packages/superset-ui-core/src/chart/components/reactify.tsx:55:3",
+				"/Users/evan/GitHub/superset/superset-frontend/packages/superset-ui-core/test/chart/components/reactify.test.tsx:55:3",
+				"/Users/evan/GitHub/superset/superset-frontend/packages/superset-ui-core/test/chart/components/reactify.test.tsx:74:3",
+				"/Users/evan/GitHub/superset/superset-frontend/packages/superset-ui-demo/storybook/shared/components/Expandable.tsx:31:16",
+				"/Users/evan/GitHub/superset/superset-frontend/packages/superset-ui-demo/storybook/shared/components/VerifyCORS.tsx:55:16",
+				"/Users/evan/GitHub/superset/superset-frontend/packages/superset-ui-demo/storybook/stories/superset-ui-number-format/BigNumberStories.jsx:27:1",
+				"/Users/evan/GitHub/superset/superset-frontend/packages/superset-ui-demo/storybook/stories/superset-ui-time-format/TimeFormatStories.jsx:27:1",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-plugin-chart-histogram/src/Histogram.jsx:59:1",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-plugin-chart-histogram/src/WithLegend.jsx:57:1",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-plugin-chart-horizon/src/HorizonChart.jsx:61:1",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-plugin-chart-horizon/src/HorizonRow.jsx:69:1",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-plugin-chart-map-box/src/MapBox.jsx:58:1",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-plugin-chart-map-box/src/ScatterPlotGlowOverlay.jsx:76:1",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/PairedTTest.jsx:42:1",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/TTestTable.jsx:52:1",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/AnimatableDeckGLContainer.jsx:57:16",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/CategoricalDeckGLContainer.jsx:74:16",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/DeckGLContainer.jsx:53:8",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/Multi.jsx:44:1",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/TooltipRow.jsx:27:16",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/components/Legend.jsx:48:16",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/components/PlaySlider.jsx:57:16",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/factory.tsx:62:3",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Geojson/Geojson.jsx:143:1",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/Polygon.jsx:162:1",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/Screengrid.jsx:107:1",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberViz.tsx:67:1",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/PivotTable.jsx:24:1",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/TableRenderers.jsx:57:8",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/plugin-chart-word-cloud/src/chart/WordCloud.tsx:83:1",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/preset-chart-xy/src/components/BoxPlot/BoxPlot.tsx:70:16",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/preset-chart-xy/src/components/Line/Line.tsx:108:16",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/preset-chart-xy/src/components/ScatterPlot/ScatterPlot.tsx:69:16",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/preset-chart-xy/src/components/legend/DefaultLegend.tsx:37:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/CRUD/CollectionTable.tsx:115:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/CRUD/Fieldset.tsx:35:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/AceEditorWrapper/index.tsx:67:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/App/index.jsx:37:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.jsx:38:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:43:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/QueryAutoRefresh/index.jsx:31:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/ResultSet/index.tsx:174:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:170:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.jsx:54:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:75:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/addSlice/AddSliceContainer.tsx:181:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/chart/Chart.jsx:112:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/chart/ChartRenderer.jsx:63:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/AlteredSliceTag/index.jsx:52:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/AnchorLink/index.jsx:42:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/AsyncSelect/index.jsx:45:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/CopyToClipboard/index.jsx:46:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/Datasource/DatasourceEditor.jsx:453:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/FilterableTable/FilterableTable.tsx:117:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/ModalTrigger/index.jsx:54:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/Select/OnPasteSelect.jsx:23:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/URLShortLinkButton/index.jsx:35:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/ColorSchemeControlWrapper.jsx:39:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/CssEditor/index.jsx:57:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/Dashboard.jsx:76:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/DashboardGrid.jsx:51:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/DeleteComponentButton.jsx:30:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:101:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/Header/index.jsx:140:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/PublishedStatus/index.jsx:47:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:64:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/SaveModal.tsx:68:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/SliceAdder.jsx:89:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:125:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/UndoRedoKeyListeners/index.jsx:27:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/dnd/DragDroppable.jsx:69:8",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/filterscope/FilterScopeModal.tsx:33:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:70:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/Chart.jsx:114:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.jsx:156:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/Column.jsx:61:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/Divider.jsx:39:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/Header.jsx:58:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/Row.jsx:59:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/Tab.jsx:87:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/Tabs.jsx:112:8",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/new/DraggableNewComponent.jsx:38:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/menu/BackgroundStyleDropdown.tsx:50:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/menu/HoverMenu.tsx:66:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/menu/MarkdownModeDropdown.tsx:43:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/menu/WithPopoverMenu.tsx:44:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/resizable/ResizableContainer.jsx:83:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/containers/DashboardComponent.jsx:119:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/ControlHeader.jsx:49:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/ControlPanelsContainer.tsx:197:8",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/EmbedCodeButton.jsx:36:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:112:8",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/SaveModal.tsx:66:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:100:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/AnnotationLayerControl/index.jsx:59:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/BoundsControl.jsx:50:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/CheckboxControl.jsx:37:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/CollectionControl/index.jsx:76:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/ColorPickerControl.jsx:67:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx:60:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:111:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:71:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterControl/index.jsx:88:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:89:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/index.jsx:54:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterPopoverTrigger/index.tsx:45:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/FixedOrMetricControl/index.jsx:51:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:80:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopoverTitle.jsx:34:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricOption.jsx:43:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricPopoverTrigger.tsx:53:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/SelectControl.jsx:85:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/SpatialControl.jsx:50:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/TextAreaControl.jsx:60:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/TextControl/index.tsx:48:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:99:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/ViewportControl.jsx:58:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/profile/components/CreatedContent.tsx:31:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/profile/components/Favorites.tsx:31:16",
+				"/Users/evan/GitHub/superset/superset-frontend/src/visualizations/FilterBox/FilterBox.jsx:94:1",
+				"/Users/evan/GitHub/superset/superset-frontend/src/visualizations/TimeTable/SparklineCell.tsx:91:1"
+    		]
+    	},
+    	{
+    		"issue": "We prefer Typescript - all JSX files should be converted to TSX",
+    		"eslint rule": "react/jsx-filename-extension",
+    		"count": 246,
+    		"files": [
+    			"/Users/evan/GitHub/superset/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/legacy-plugin-chart-event-flow/Stories.jsx:40:3",
+				"/Users/evan/GitHub/superset/superset-frontend/packages/superset-ui-demo/storybook/stories/superset-ui-color/ColorPallettesStories.jsx:48:5",
+				"/Users/evan/GitHub/superset/superset-frontend/packages/superset-ui-demo/storybook/stories/superset-ui-color/RenderPalettes.jsx:26:5",
+				"/Users/evan/GitHub/superset/superset-frontend/packages/superset-ui-demo/storybook/stories/superset-ui-number-format/BigNumberStories.jsx:68:7",
+				"/Users/evan/GitHub/superset/superset-frontend/packages/superset-ui-demo/storybook/stories/superset-ui-style/ThemeStories.jsx:31:5",
+				"/Users/evan/GitHub/superset/superset-frontend/packages/superset-ui-demo/storybook/stories/superset-ui-time-format/TimeFormatStories.jsx:57:7",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-plugin-chart-calendar/src/ReactCalendar.jsx:27:3",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-plugin-chart-chord/src/ReactChord.jsx:27:3",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-plugin-chart-force-directed/src/ReactForceDirected.jsx:27:3",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-plugin-chart-histogram/src/Histogram.jsx:84:7",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-plugin-chart-histogram/src/WithLegend.jsx:127:7",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-plugin-chart-horizon/src/HorizonChart.jsx:86:7",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-plugin-chart-horizon/src/HorizonRow.jsx:194:7",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-plugin-chart-map-box/src/MapBox.jsx:123:7",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-plugin-chart-map-box/src/ScatterPlotGlowOverlay.jsx:273:12",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/PairedTTest.jsx:48:7",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/TTestTable.jsx:181:7",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/ReactParallelCoordinates.jsx:27:3",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-plugin-chart-partition/test/OptionDescription.test.jsx:38:23",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-plugin-chart-sankey/src/ReactSankey.jsx:27:3",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-plugin-chart-world-map/src/ReactWorldMap.jsx:27:3",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/AnimatableDeckGLContainer.jsx:88:7",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/CategoricalDeckGLContainer.jsx:263:7",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/DeckGLContainer.jsx:107:7",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/Multi.jsx:129:7",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/TooltipRow.jsx:32:7",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/components/BootstrapSliderWrapper.jsx:26:5",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/components/Legend.jsx:88:9",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/components/PlaySlider.jsx:170:7",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/Arc.jsx:38:5",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Geojson/Geojson.jsx:84:7",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/Grid.jsx:30:5",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/Hex.jsx:30:5",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Path/Path.jsx:30:7",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/Polygon.jsx:58:7",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/Scatter.jsx:37:7",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/Screengrid.jsx:41:5",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:39:3",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/legacy-preset-chart-nvd3/src/ReactNVD3.jsx:37:3",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/PivotTable.jsx:26:12",
+				"/Users/evan/GitHub/superset/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/TableRenderers.jsx:41:5",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/dashboard/components/DashboardBuilder_spec.jsx:78:7",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/dashboard/components/DashboardGrid_spec.jsx:47:29",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/dashboard/components/Dashboard_spec.jsx:68:29",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/dashboard/components/PropertiesModal_spec.jsx:77:7",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/dashboard/components/SliceAdder_spec.jsx:75:29",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/dashboard/components/dnd/DragDroppable_spec.jsx:44:28",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/dashboard/components/gridComponents/ChartHolder_spec.jsx:72:7",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Chart_spec.jsx:75:29",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Column_spec.jsx:73:7",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Divider_spec.jsx:52:7",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Header_spec.jsx:59:7",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Markdown_spec.jsx:67:7",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Row_spec.jsx:69:7",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Tab_spec.jsx:72:7",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Tabs_spec.jsx:79:7",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/DraggableNewComponent_spec.jsx:44:7",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewColumn_spec.jsx:30:20",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewDivider_spec.jsx:30:20",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewHeader_spec.jsx:30:20",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewRow_spec.jsx:30:20",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/dashboard/components/gridComponents/new/NewTabs_spec.jsx:30:20",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/dashboard/components/menu/WithPopoverMenu_spec.jsx:26:15",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/explore/components/AdhocMetricEditPopoverTitle_spec.jsx:39:27",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/explore/components/AdhocMetricEditPopover_spec.jsx:63:27",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/explore/components/AdhocMetricOption_spec.jsx:53:27",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/explore/components/BoundsControl_spec.jsx:31:10",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/explore/components/ColorScheme_spec.jsx:37:21",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/explore/components/DatasourceControl_spec.jsx:63:20",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/explore/components/EmbedCodeButton_spec.jsx:45:33",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/explore/components/ExploreActionButtons_spec.jsx:40:28",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/explore/components/ExploreAdditionalActionsMenu.jsx:42:28",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/explore/components/ExploreChartPanel_spec.jsx:37:33",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/explore/components/ExploreViewContainer_spec.jsx:70:23",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/explore/components/FilterBoxItemControl_spec.jsx:41:20",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/explore/components/FilterBox_spec.jsx:28:7",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/explore/components/FilterDefinitionOption_spec.jsx:39:7",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/explore/components/MetricDefinitionOption_spec.jsx:35:20",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/explore/components/MetricDefinitionValue_spec.jsx:36:7",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/explore/components/MetricsControl_spec.jsx:57:27",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/explore/components/QueryAndSaveBtns_spec.jsx:35:28",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/explore/components/RowCountLabel_spec.jsx:33:33",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/explore/components/RunQueryActionButton_spec.jsx:38:23",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/explore/components/SaveModal_spec.jsx:88:13",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/explore/components/SelectControl_spec.jsx:49:23",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/explore/components/TextArea_spec.jsx:37:23",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/explore/components/ViewportControl_spec.jsx:44:21",
+				"/Users/evan/GitHub/superset/superset-frontend/spec/javascripts/explore/components/VizTypeControl_spec.jsx:67:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/CRUD/CollectionTable.test.jsx:35:10",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/App.jsx:128:3",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/App/App.test.jsx:36:23",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/App/index.jsx:105:9",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.jsx:87:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/ExploreResultsButton/ExploreResultsButton.test.jsx:74:13",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:103:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/HighlightedSql/HighlightedSql.test.jsx:31:33",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/QueryAutoRefresh/QueryAutoRefresh.test.jsx:42:13",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/QuerySearch/QuerySearch.test.jsx:53:9",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/QueryStateLabel/QueryStateLabel.test.jsx:32:33",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/QueryTable/QueryTable.test.jsx:35:33",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/QueryTable/index.jsx:62:15",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/ResultSet/ResultSet.test.jsx:87:31",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/SaveQuery/SaveQuery.test.jsx:38:33",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/ShareSqlLabQuery/ShareSqlLabQuery.test.jsx:37:3",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/SouthPane/SouthPane.test.jsx:80:13",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/SqlEditor/SqlEditor.test.jsx:74:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:486:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/SqlEditorLeftBar/SqlEditorLeftBar.test.jsx:54:23",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.jsx:146:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/TabStatusIcon/TabStatusIcon.test.jsx:28:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/TabbedSqlEditors/TabbedSqlEditors.test.jsx:83:13",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:329:9",
+				"/Users/evan/GitHub/superset/superset-frontend/src/SqlLab/components/TableElement/TableElement.test.jsx:40:33",
+				"/Users/evan/GitHub/superset/superset-frontend/src/chart/Chart.jsx:206:9",
+				"/Users/evan/GitHub/superset/superset-frontend/src/chart/ChartRenderer.jsx:215:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/chart/ChartRenderer.test.jsx:35:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/AlteredSliceTag/AlteredSliceTag.test.jsx:50:21",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/AlteredSliceTag/index.jsx:166:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/AnchorLink/AnchorLink.test.jsx:50:13",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/AnchorLink/index.jsx:76:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/AsyncSelect/AsyncSelect.test.jsx:46:33",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/AsyncSelect/index.jsx:88:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/Checkbox/Checkbox.stories.jsx:35:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/ConfirmStatusChange/ConfirmStatusChange.test.jsx:34:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/CopyToClipboard/index.jsx:39:13",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/Datasource/ChangeDatasourceModal.test.jsx:62:25",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/Datasource/DatasourceEditor.jsx:132:3",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/Datasource/DatasourceEditor.test.jsx:42:10",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/Datasource/DatasourceModal.test.jsx:56:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/ErrorBoundary/index.jsx:50:9",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/Form/LabeledErrorBoundInput.test.jsx:39:12",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/FormRow/FormRow.test.jsx:30:12",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/FormRow/index.jsx:42:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/IconButton/IconButton.test.jsx:30:12",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/IconTooltip/IconTooltip.test.jsx:29:33",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/ListView/ListView.test.jsx:129:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/ListViewCard/ImageLoader.test.jsx:45:18",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/ListViewCard/ListViewCard.test.jsx:41:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/MessageToasts/Toast.test.jsx:32:9",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/MessageToasts/ToastPresenter.test.jsx:32:29",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/ModalTrigger/index.jsx:76:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/Select/OnPasteSelect.jsx:79:12",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/Select/OnPasteSelect.test.jsx:55:23",
+				"/Users/evan/GitHub/superset/superset-frontend/src/components/URLShortLinkButton/index.jsx:61:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/AddSliceCard.jsx:118:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/ColorSchemeControlWrapper.jsx:55:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/CssEditor/index.jsx:84:9",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/Dashboard.jsx:291:14",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/DashboardGrid.jsx:43:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/DeleteComponentButton.jsx:34:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:228:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/Header/index.jsx:417:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/MissingChart.jsx:29:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/PublishedStatus/index.jsx:62:11",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/SliceAdder.jsx:201:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/dnd/AddSliceDragPreview.jsx:69:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/dnd/DragDroppable.jsx:136:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/filterscope/FilterFieldItem.jsx:31:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/filterscope/FilterFieldTree.jsx:54:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:419:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/filterscope/FilterScopeTree.jsx:54:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/filterscope/renderFilterFieldTreeNodes.jsx:36:11",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/filterscope/renderFilterScopeTreeNodes.jsx:47:9",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/filterscope/treeIcons.jsx:30:10",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/Chart.jsx:310:14",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.jsx:119:14",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/Column.jsx:125:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/Divider.jsx:61:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/Header.jsx:122:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/Markdown.jsx:239:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/Row.jsx:124:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/Tab.jsx:79:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/Tabs.jsx:204:9",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/new/DraggableNewComponent.jsx:42:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/new/NewColumn.jsx:28:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/new/NewDivider.jsx:28:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/new/NewHeader.jsx:28:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/new/NewMarkdown.jsx:27:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/new/NewRow.jsx:28:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/gridComponents/new/NewTabs.jsx:28:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/resizable/ResizableContainer.jsx:189:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/components/resizable/ResizableHandle.jsx:22:10",
+				"/Users/evan/GitHub/superset/superset-frontend/src/dashboard/containers/DashboardComponent.jsx:123:24",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/App.jsx:38:3",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/ControlHeader.jsx:53:9",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/EmbedCodeButton.jsx:89:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/ExploreAdditionalActionsMenu/index.jsx:73:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:214:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/ExploreChartPanel.jsx:221:9",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/ExploreViewContainer.jsx:428:9",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/QueryAndSaveBtns.jsx:60:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/RowCountLabel.jsx:44:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:359:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/AnnotationLayerControl/index.jsx:34:9",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/BoundsControl.jsx:107:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/CheckboxControl.jsx:44:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/CollectionControl/index.jsx:68:3",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/ColorPickerControl.jsx:82:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx:89:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:189:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelectPopoverTitle.jsx:62:12",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:135:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterControl/AdhocFilterControl.test.jsx:77:27",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterControl/index.jsx:104:37",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/AdhocFilterEditPopover.test.jsx:86:27",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:183:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/AdhocFilterEditPopoverSqlTabContent.test.jsx:45:27",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/index.jsx:126:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterOption/index.jsx:61:3",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/FixedOrMetricControl/index.jsx:102:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:266:12",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopoverTitle.jsx:77:9",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricOption.jsx:70:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/MetricControl/AggregateOption.jsx:32:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/MetricControl/FilterDefinitionOption.jsx:37:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/MetricControl/MetricDefinitionOption.jsx:42:12",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/MetricControl/MetricDefinitionValue.jsx:83:12",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/MetricControl/MetricsControl.jsx:230:9",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/SelectControl.jsx:235:29",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/SliderControl.jsx:35:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/SpatialControl.jsx:136:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/TextAreaControl.jsx:74:9",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:179:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/components/controls/ViewportControl.jsx:73:7",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/controls.jsx:130:24",
+				"/Users/evan/GitHub/superset/superset-frontend/src/explore/index.jsx:42:17",
+				"/Users/evan/GitHub/superset/superset-frontend/src/showSavedQuery/index.jsx:39:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/views/CRUD/alert/AlertList.test.jsx:88:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/views/CRUD/alert/AlertReportModal.test.jsx:84:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/views/CRUD/alert/ExecutionLog.test.jsx:67:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/views/CRUD/annotation/AnnotationList.test.jsx:79:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/views/CRUD/annotation/AnnotationModal.test.jsx:57:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.test.jsx:48:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.test.jsx:83:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/views/CRUD/chart/ChartList.test.jsx:109:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.test.jsx:49:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.test.jsx:81:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/views/CRUD/dashboard/DashboardList.test.jsx:108:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/views/CRUD/data/database/DatabaseList.test.jsx:99:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.test.jsx:206:14",
+				"/Users/evan/GitHub/superset/superset-frontend/src/views/CRUD/data/dataset/DatasetList.test.jsx:83:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.test.jsx:139:5",
+				"/Users/evan/GitHub/superset/superset-frontend/src/views/CRUD/data/savedquery/SavedQueryPreviewModal.test.jsx:76:25",
+				"/Users/evan/GitHub/superset/superset-frontend/src/visualizations/FilterBox/FilterBox.jsx:265:9",
+				"/Users/evan/GitHub/superset/superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:73:10",
+				"/Users/evan/GitHub/superset/superset-frontend/src/visualizations/TimeTable/TimeTable.jsx:118:11"
+    		]
+    	}
+	]
+}
\ No newline at end of file
diff --git a/superset-frontend/eslint_metrics.js b/superset-frontend/scripts/eslint_metrics.js
similarity index 64%
rename from superset-frontend/eslint_metrics.js
rename to superset-frontend/scripts/eslint_metrics.js
index 9dc68bb..5755382 100644
--- a/superset-frontend/eslint_metrics.js
+++ b/superset-frontend/scripts/eslint_metrics.js
@@ -11,16 +11,22 @@ module.exports = results => {
     return map;
   }, {});
 
-  const enforcedRules = [
-    'react-prefer-function-component/react-prefer-function-component',
-  ];
+  const enforcedRules = {
+    'react-prefer-function-component/react-prefer-function-component' : {
+      description: "We prefer function components to class-based components",
+    },
+    'react/jsx-filename-extension' : {
+      description: "We prefer Typescript - all JSX files should be converted to TSX",
+    },
+  };
 
   const metricsByRule = Object.entries(byRuleId)
-    .filter(([ruleId, occurrences]) => enforcedRules.includes(ruleId))
+    .filter(([ruleId, occurrences]) => enforcedRules[ruleId] || false)
     .map(
       ([ruleId, occurrences]) => `
     \t{
-    \t\t"rule": "${ruleId}",
+    \t\t"issue": "${enforcedRules[ruleId].description}",
+    \t\t"eslint rule": "${ruleId}",
     \t\t"count": ${occurrences.length},
     \t\t"files": [
     \t\t\t"${occurrences.join('",\n\t\t\t\t"')}"
diff --git a/superset-frontend/scripts/eslintrc_metrics.js b/superset-frontend/scripts/eslintrc_metrics.js
new file mode 100644
index 0000000..d7efca8
--- /dev/null
+++ b/superset-frontend/scripts/eslintrc_metrics.js
@@ -0,0 +1,65 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+const packageConfig = require('../package');
+
+const importCoreModules = [];
+Object.entries(packageConfig.dependencies).forEach(([pkg]) => {
+  if (/@superset-ui/.test(pkg)) {
+    importCoreModules.push(pkg);
+  }
+});
+
+
+module.exports = {
+  extends: [
+    'plugin:react-prefer-function-component/recommended',
+  ],
+  parser: '@babel/eslint-parser',
+  parserOptions: {
+    ecmaFeatures: {
+      experimentalObjectRestSpread: true,
+    },
+  },
+  env: {
+    browser: true,
+  },
+  settings: {
+    'import/resolver': {
+      webpack: {},
+      node: {
+        extensions: ['.js', '.jsx', '.ts', '.tsx', '.json'],
+      },
+    },
+    // Allow only core/src and core/test, avoid import modules from lib
+    'import/internal-regex': /^@superset-ui\/core\/(src|test)\/.*/,
+    'import/core-modules': importCoreModules,
+    react: {
+      version: 'detect',
+    },
+  },
+  plugins: [
+    'react',
+    'react-prefer-function-component',
+  ],
+  rules: {
+    'react-prefer-function-component/react-prefer-function-component': 1,
+    'react/jsx-filename-extension': [1, { extensions: ['.tsx'] }],
+  },
+};