From 92abfffe84d2623b70d4341a1992dc6dba05644a Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 7 Feb 2022 12:18:20 +0100 Subject: [PATCH 1/3] cli: deduplicate no-extraneous-dependencies lint rule Signed-off-by: Patrik Oldsberg --- packages/cli/config/eslint.backend.js | 12 +----------- packages/cli/config/eslint.js | 22 ++++++---------------- 2 files changed, 7 insertions(+), 27 deletions(-) diff --git a/packages/cli/config/eslint.backend.js b/packages/cli/config/eslint.backend.js index a97f26f8da..0aec1c247f 100644 --- a/packages/cli/config/eslint.backend.js +++ b/packages/cli/config/eslint.backend.js @@ -58,7 +58,7 @@ module.exports = { 'import/no-extraneous-dependencies': [ 'error', { - devDependencies: false, + devDependencies: ['**/*.test.*', 'src/setupTests.*', 'dev/**'], optionalDependencies: true, peerDependencies: true, bundledDependencies: true, @@ -97,16 +97,6 @@ module.exports = { { files: ['*.test.*', 'src/setupTests.*', 'dev/**'], rules: { - // Tests are allowed to import dev dependencies - 'import/no-extraneous-dependencies': [ - 'error', - { - devDependencies: true, - optionalDependencies: true, - peerDependencies: true, - bundledDependencies: true, - }, - ], 'no-restricted-syntax': ['error', ...globalRestrictedSyntax], }, }, diff --git a/packages/cli/config/eslint.js b/packages/cli/config/eslint.js index 781af13577..e81e309f72 100644 --- a/packages/cli/config/eslint.js +++ b/packages/cli/config/eslint.js @@ -53,7 +53,12 @@ module.exports = { 'import/no-extraneous-dependencies': [ 'error', { - devDependencies: false, + devDependencies: [ + '**/*.test.*', + '**/*.stories.*', + 'src/setupTests.*', + 'dev/**', + ], optionalDependencies: true, peerDependencies: true, bundledDependencies: true, @@ -101,20 +106,5 @@ module.exports = { 'no-undef': 'off', }, }, - { - files: ['*.test.*', '*.stories.*', 'src/setupTests.*', 'dev/**'], - rules: { - // Tests are allowed to import dev dependencies - 'import/no-extraneous-dependencies': [ - 'error', - { - devDependencies: true, - optionalDependencies: true, - peerDependencies: true, - bundledDependencies: true, - }, - ], - }, - }, ], }; From fae2aee8785686f0d96bb486d2ea35190b1ba35d Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 7 Feb 2022 12:23:44 +0100 Subject: [PATCH 2/3] cli: remove no-duplicates lint rule Signed-off-by: Patrik Oldsberg --- .changeset/pretty-glasses-admire.md | 9 +++++++++ packages/cli/config/eslint.backend.js | 1 - packages/cli/config/eslint.js | 1 - 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 .changeset/pretty-glasses-admire.md diff --git a/.changeset/pretty-glasses-admire.md b/.changeset/pretty-glasses-admire.md new file mode 100644 index 0000000000..318271ddc9 --- /dev/null +++ b/.changeset/pretty-glasses-admire.md @@ -0,0 +1,9 @@ +--- +'@backstage/cli': patch +--- + +Removed the `import/no-duplicates` lint rule from the frontend and backend ESLint configurations. This rule is quite expensive to execute and only provides a purely cosmetic benefit, so we opted to remove it from the set of default rules. If you would like to keep this rule you can add it back in your local ESLint configuration: + +```js + 'import/no-duplicates': 'warn' +``` diff --git a/packages/cli/config/eslint.backend.js b/packages/cli/config/eslint.backend.js index 0aec1c247f..519b388b96 100644 --- a/packages/cli/config/eslint.backend.js +++ b/packages/cli/config/eslint.backend.js @@ -54,7 +54,6 @@ module.exports = { 'no-console': 0, // Permitted in console programs 'new-cap': ['error', { capIsNew: false }], // Because Express constructs things e.g. like 'const r = express.Router()' 'import/newline-after-import': 'error', - 'import/no-duplicates': 'warn', 'import/no-extraneous-dependencies': [ 'error', { diff --git a/packages/cli/config/eslint.js b/packages/cli/config/eslint.js index e81e309f72..06f22933e8 100644 --- a/packages/cli/config/eslint.js +++ b/packages/cli/config/eslint.js @@ -49,7 +49,6 @@ module.exports = { '@typescript-eslint/no-redeclare': 'error', 'no-undef': 'off', 'import/newline-after-import': 'error', - 'import/no-duplicates': 'warn', 'import/no-extraneous-dependencies': [ 'error', { From d0c71e2aa4f9482b8a210588353391fa2057ab9b Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 7 Feb 2022 12:36:36 +0100 Subject: [PATCH 3/3] cli: use node API from ESLint to invoke it rather than a subprocess Signed-off-by: Patrik Oldsberg --- .changeset/three-dolls-fly.md | 5 +++++ packages/cli/src/commands/lint.ts | 30 ++++++++++++++++++++---------- 2 files changed, 25 insertions(+), 10 deletions(-) create mode 100644 .changeset/three-dolls-fly.md diff --git a/.changeset/three-dolls-fly.md b/.changeset/three-dolls-fly.md new file mode 100644 index 0000000000..df711c547d --- /dev/null +++ b/.changeset/three-dolls-fly.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Switched the `lint` command to invoke ESLint directly through its Node.js API rather than spawning a new process. diff --git a/packages/cli/src/commands/lint.ts b/packages/cli/src/commands/lint.ts index 5c3e0a88e3..6db17dbfc4 100644 --- a/packages/cli/src/commands/lint.ts +++ b/packages/cli/src/commands/lint.ts @@ -15,19 +15,29 @@ */ import { Command } from 'commander'; -import { run } from '../lib/run'; import { paths } from '../lib/paths'; +import { ESLint } from 'eslint'; + +export default async (cmd: Command) => { + const eslint = new ESLint({ + cwd: paths.targetDir, + fix: cmd.fix, + extensions: ['js', 'jsx', 'ts', 'tsx', 'mjs', 'cjs'], + }); + + const results = await eslint.lintFiles(['.']); -export default async (cmd: Command, cmdArgs: string[]) => { - const args = [ - '--ext=js,jsx,ts,tsx,mjs,cjs', - '--max-warnings=0', - `--format=${cmd.format}`, - ...(cmdArgs ?? [paths.targetDir]), - ]; if (cmd.fix) { - args.push('--fix'); + await ESLint.outputFixes(results); } - await run('eslint', args); + const formatter = await eslint.loadFormatter(cmd.format); + const resultText = formatter.format(results); + + // If there is any feedback at all, we treat it as a lint failure. This should be + // consistent with our old behavior of passing `--max-warnings=0` when invoking eslint. + if (resultText) { + console.log(resultText); + process.exit(1); + } };