From e1b428a173aae157d7939820dbe02d5db21d4f7e Mon Sep 17 00:00:00 2001 From: Omri Luzon Date: Sat, 12 Nov 2022 18:52:32 +0200 Subject: [PATCH 1/3] feat/issue5362-keyword-spacing---support-import-type-syntax --- .../src/rules/keyword-spacing.ts | 32 ++++++++++++++ .../tests/rules/keyword-spacing.test.ts | 42 ++++++++++++++++++- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/packages/eslint-plugin/src/rules/keyword-spacing.ts b/packages/eslint-plugin/src/rules/keyword-spacing.ts index bcb905738369..6af42e5c2fb7 100644 --- a/packages/eslint-plugin/src/rules/keyword-spacing.ts +++ b/packages/eslint-plugin/src/rules/keyword-spacing.ts @@ -1,3 +1,4 @@ +import type { TSESTree } from '@typescript-eslint/utils'; import { AST_TOKEN_TYPES } from '@typescript-eslint/utils'; import * as util from '../util'; @@ -50,6 +51,37 @@ export default util.createRule({ // make sure to reset the type afterward so we don't permanently mutate the AST asToken.type = oldTokenType; }, + 'ImportDeclaration[importKind=type]'( + node: TSESTree.ImportDeclaration, + ): void { + const typeToken = sourceCode.getFirstToken(node, { skip: 1 })!; + const punctuatorToken = sourceCode.getTokenAfter(typeToken)!; + const spacesBetweenTypeAndPunctuator = + punctuatorToken.range[0] - typeToken.range[1]; + if (context.options[0].after && spacesBetweenTypeAndPunctuator === 0) { + context.report({ + loc: punctuatorToken.loc, + messageId: 'expectedBefore', + data: { value: punctuatorToken.value }, + fix(fixer) { + return fixer.insertTextBefore(punctuatorToken, ' '); + }, + }); + } + if (!context.options[0].after && spacesBetweenTypeAndPunctuator > 0) { + context.report({ + loc: punctuatorToken.loc, + messageId: 'unexpectedBefore', + data: { value: punctuatorToken.value }, + fix(fixer) { + return fixer.removeRange([ + typeToken.range[1], + typeToken.range[1] + spacesBetweenTypeAndPunctuator, + ]); + }, + }); + } + }, }; }, }); diff --git a/packages/eslint-plugin/tests/rules/keyword-spacing.test.ts b/packages/eslint-plugin/tests/rules/keyword-spacing.test.ts index c2694829b357..3fb0ec68a55c 100644 --- a/packages/eslint-plugin/tests/rules/keyword-spacing.test.ts +++ b/packages/eslint-plugin/tests/rules/keyword-spacing.test.ts @@ -12,8 +12,8 @@ import { RuleTester } from '../RuleTester'; // Helpers //------------------------------------------------------------------------------ -const BOTH = { before: true, after: true }; -const NEITHER = { before: false, after: false }; +const BOTH: Options[0] = { before: true, after: true }; +const NEITHER: Options[0] = { before: false, after: false }; /** * Creates an option object to test an 'overrides' option. @@ -114,6 +114,16 @@ ruleTester.run('keyword-spacing', rule, { options: [{ overrides: { as: {} } }], parserOptions: { ecmaVersion: 6, sourceType: 'module' }, }, + // { + // code: 'import type { foo } from "foo";', + // options: [{ overrides: { as: {} } }], + // parserOptions: { ecmaVersion: 6, sourceType: 'module' }, + // }, + // { + // code: 'import type * as Foo from \'foo\'', + // options: [{ overrides: { as: {} } }], + // parserOptions: { ecmaVersion: 6, sourceType: 'module' }, + // }, ], invalid: [ //---------------------------------------------------------------------- @@ -152,5 +162,33 @@ ruleTester.run('keyword-spacing', rule, { parserOptions: { ecmaVersion: 6, sourceType: 'module' }, errors: expectedAfter('as'), }, + { + code: 'import type{ foo } from "foo";', + output: 'import type { foo } from "foo";', + options: [{ after: true, before: true }], + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, + errors: [{ messageId: 'expectedBefore', data: { value: '{' } }], + }, + { + code: 'import type { foo } from"foo";', + output: 'import type{ foo } from"foo";', + options: [{ after: false, before: true }], + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, + errors: [{ messageId: 'unexpectedBefore', data: { value: '{' } }], + }, + { + code: 'import type* as foo from "foo";', + output: 'import type * as foo from "foo";', + options: [{ after: true, before: true }], + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, + errors: [{ messageId: 'expectedBefore', data: { value: '*' } }], + }, + { + code: 'import type * as foo from"foo";', + output: 'import type* as foo from"foo";', + options: [{ after: false, before: true }], + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, + errors: [{ messageId: 'unexpectedBefore', data: { value: '*' } }], + }, ], }); From 7e292590a4b6f126036ee7903bbe1e46e98ebae3 Mon Sep 17 00:00:00 2001 From: Omri Luzon Date: Sat, 12 Nov 2022 18:56:27 +0200 Subject: [PATCH 2/3] uncomment --- .../tests/rules/keyword-spacing.test.ts | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/eslint-plugin/tests/rules/keyword-spacing.test.ts b/packages/eslint-plugin/tests/rules/keyword-spacing.test.ts index 3fb0ec68a55c..56f3511f9003 100644 --- a/packages/eslint-plugin/tests/rules/keyword-spacing.test.ts +++ b/packages/eslint-plugin/tests/rules/keyword-spacing.test.ts @@ -114,16 +114,16 @@ ruleTester.run('keyword-spacing', rule, { options: [{ overrides: { as: {} } }], parserOptions: { ecmaVersion: 6, sourceType: 'module' }, }, - // { - // code: 'import type { foo } from "foo";', - // options: [{ overrides: { as: {} } }], - // parserOptions: { ecmaVersion: 6, sourceType: 'module' }, - // }, - // { - // code: 'import type * as Foo from \'foo\'', - // options: [{ overrides: { as: {} } }], - // parserOptions: { ecmaVersion: 6, sourceType: 'module' }, - // }, + { + code: 'import type { foo } from "foo";', + options: [{ overrides: { as: {} } }], + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, + }, + { + code: "import type * as Foo from 'foo'", + options: [{ overrides: { as: {} } }], + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, + }, ], invalid: [ //---------------------------------------------------------------------- From 76d6d84b650427263025bb7c7d3207fd95706676 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Tue, 15 Nov 2022 11:11:23 -0500 Subject: [PATCH 3/3] Update packages/eslint-plugin/tests/rules/keyword-spacing.test.ts --- packages/eslint-plugin/tests/rules/keyword-spacing.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/eslint-plugin/tests/rules/keyword-spacing.test.ts b/packages/eslint-plugin/tests/rules/keyword-spacing.test.ts index 56f3511f9003..b8a1a72d2cac 100644 --- a/packages/eslint-plugin/tests/rules/keyword-spacing.test.ts +++ b/packages/eslint-plugin/tests/rules/keyword-spacing.test.ts @@ -12,8 +12,8 @@ import { RuleTester } from '../RuleTester'; // Helpers //------------------------------------------------------------------------------ -const BOTH: Options[0] = { before: true, after: true }; -const NEITHER: Options[0] = { before: false, after: false }; +const BOTH = { before: true, after: true }; +const NEITHER = { before: false, after: false }; /** * Creates an option object to test an 'overrides' option.