From 84cc0239677e62442a3395a8fe7c43884647dbfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Zeutzheim?= Date: Sat, 5 Dec 2020 14:11:09 +0100 Subject: [PATCH] feat(eslint-plugin): [consistent-type-imports] Add mixed mode option This ads a new mode called "type-imports-mixed" for consistent-type-imports rule which will only trigger, if all imports of an import declaration are type only imports. References #2769 --- .../src/rules/consistent-type-imports.ts | 11 ++++-- .../rules/consistent-type-imports.test.ts | 37 +++++++++++++++++++ 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/packages/eslint-plugin/src/rules/consistent-type-imports.ts b/packages/eslint-plugin/src/rules/consistent-type-imports.ts index c4cb6586a00..eb687642ed3 100644 --- a/packages/eslint-plugin/src/rules/consistent-type-imports.ts +++ b/packages/eslint-plugin/src/rules/consistent-type-imports.ts @@ -6,7 +6,7 @@ import { } from '@typescript-eslint/experimental-utils'; import * as util from '../util'; -type Prefer = 'type-imports' | 'no-type-imports'; +type Prefer = 'type-imports' | 'no-type-imports' | 'type-imports-mixed'; type Options = [ { @@ -67,7 +67,7 @@ export default util.createRule({ type: 'object', properties: { prefer: { - enum: ['type-imports', 'no-type-imports'], + enum: ['type-imports', 'no-type-imports', 'type-imports-mixed'], }, disallowTypeAnnotations: { type: 'boolean', @@ -94,7 +94,7 @@ export default util.createRule({ const sourceImportsMap: { [key: string]: SourceImports } = {}; return { - ...(prefer === 'type-imports' + ...(prefer !== 'no-type-imports' ? { // prefer type imports ImportDeclaration(node: TSESTree.ImportDeclaration): void { @@ -157,7 +157,10 @@ export default util.createRule({ } } - if (typeSpecifiers.length) { + if ( + typeSpecifiers.length && + (prefer === 'type-imports' || valueSpecifiers.length === 0) + ) { sourceImports.reportValueImports.push({ node, typeSpecifiers, diff --git a/packages/eslint-plugin/tests/rules/consistent-type-imports.test.ts b/packages/eslint-plugin/tests/rules/consistent-type-imports.test.ts index 8818225a024..4b2543c4cb1 100644 --- a/packages/eslint-plugin/tests/rules/consistent-type-imports.test.ts +++ b/packages/eslint-plugin/tests/rules/consistent-type-imports.test.ts @@ -109,6 +109,23 @@ ruleTester.run('consistent-type-imports', rule, { `, options: [{ prefer: 'no-type-imports' }], }, + // type-imports-mixed + { + code: ` + import { A, B } from 'foo'; + const foo: A = B(); + `, + options: [{ prefer: 'type-imports-mixed' }], + }, + { + code: ` + import type A from 'foo'; + import B from 'foo'; + let foo: A; + let bar = B; + `, + options: [{ prefer: 'type-imports-mixed' }], + }, // exports ` import Type from 'foo'; @@ -1215,5 +1232,25 @@ const a: Default = ''; }, ], }, + { + code: ` +import { A, B } from 'foo'; +let foo: A; +let bar: B; + `, + output: ` +import type { A, B } from 'foo'; +let foo: A; +let bar: B; + `, + options: [{ prefer: 'type-imports-mixed' }], + errors: [ + { + messageId: 'typeOverValue', + line: 2, + column: 1, + }, + ], + }, ], });