From 3a0c7300d2a623a818afac2bc71fdb03b931fd3c Mon Sep 17 00:00:00 2001 From: Jack Bates Date: Sat, 23 Oct 2021 08:58:35 -0700 Subject: [PATCH] [Fix] `extensions`: ignore type-only imports --- src/rules/extensions.js | 7 ++++++- tests/src/rules/extensions.js | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/rules/extensions.js b/src/rules/extensions.js index e116d2f866..74f478b66d 100644 --- a/src/rules/extensions.js +++ b/src/rules/extensions.js @@ -135,7 +135,12 @@ module.exports = { return false; } - function checkFileExtension(source) { + function checkFileExtension(source, node) { + // ignore type-only imports + if (node.importKind === 'type') { + return; + } + // bail if the declaration doesn't have a source, e.g. "export { foo };", or if it's only partially typed like in an editor if (!source || !source.value) return; diff --git a/tests/src/rules/extensions.js b/tests/src/rules/extensions.js index 0134334558..50f690395f 100644 --- a/tests/src/rules/extensions.js +++ b/tests/src/rules/extensions.js @@ -1,6 +1,6 @@ import { RuleTester } from 'eslint'; import rule from 'rules/extensions'; -import { test, testFilePath } from '../utils'; +import { getTSParsers, test, testFilePath } from '../utils'; const ruleTester = new RuleTester(); @@ -597,3 +597,34 @@ ruleTester.run('extensions', rule, { }), ], }); + +describe('TypeScript', () => { + getTSParsers() + // Type-only imports were added in TypeScript ESTree 2.23.0 + .filter((parser) => parser !== require.resolve('typescript-eslint-parser')) + .forEach((parser) => { + ruleTester.run(`${parser}: extensions ignore type-only`, rule, { + valid: [ + test({ + code: 'import type { T } from "./typescript-declare";', + options: [ + 'always', + { ts: 'never', tsx: 'never', js: 'never', jsx: 'never' }, + ], + parser, + }), + ], + invalid: [ + test({ + code: 'import { T } from "./typescript-declare";', + errors: ['Missing file extension for "./typescript-declare"'], + options: [ + 'always', + { ts: 'never', tsx: 'never', js: 'never', jsx: 'never' }, + ], + parser, + }), + ], + }); + }); +});