From 519f5948d2bdf5bcb8cd10c1534ecf3727425890 Mon Sep 17 00:00:00 2001 From: Josh Kelley Date: Tue, 29 Aug 2023 16:32:32 -0400 Subject: [PATCH 1/3] Disallow side effect imports when allowTypeImports is enabled Fixes #7559 --- .../src/rules/no-restricted-imports.ts | 14 ++++--- .../tests/rules/no-restricted-imports.test.ts | 37 +++++++++++++++++++ 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/packages/eslint-plugin/src/rules/no-restricted-imports.ts b/packages/eslint-plugin/src/rules/no-restricted-imports.ts index 71da6fe6c14d..35037b6c3ed1 100644 --- a/packages/eslint-plugin/src/rules/no-restricted-imports.ts +++ b/packages/eslint-plugin/src/rules/no-restricted-imports.ts @@ -273,11 +273,12 @@ export default createRule({ ImportDeclaration(node: TSESTree.ImportDeclaration): void { if ( node.importKind === 'type' || - node.specifiers.every( - specifier => - specifier.type === AST_NODE_TYPES.ImportSpecifier && - specifier.importKind === 'type', - ) + (node.specifiers.length && + node.specifiers.every( + specifier => + specifier.type === AST_NODE_TYPES.ImportSpecifier && + specifier.importKind === 'type', + )) ) { const importSource = node.source.value.trim(); if ( @@ -297,7 +298,8 @@ export default createRule({ ): void { if ( node.exportKind === 'type' || - node.specifiers.every(specifier => specifier.exportKind === 'type') + (node.specifiers.length && + node.specifiers.every(specifier => specifier.exportKind === 'type')) ) { const importSource = node.source.value.trim(); if ( diff --git a/packages/eslint-plugin/tests/rules/no-restricted-imports.test.ts b/packages/eslint-plugin/tests/rules/no-restricted-imports.test.ts index da3e78884914..53bae5c886f4 100644 --- a/packages/eslint-plugin/tests/rules/no-restricted-imports.test.ts +++ b/packages/eslint-plugin/tests/rules/no-restricted-imports.test.ts @@ -490,6 +490,43 @@ import type { foo } from 'import2/private/bar'; }, ], }, + { + code: "import 'import-foo';", + options: [ + { + paths: [ + { + name: 'import-foo', + }, + ], + }, + ], + errors: [ + { + messageId: 'path', + type: AST_NODE_TYPES.ImportDeclaration, + }, + ], + }, + { + code: "import 'import-foo';", + options: [ + { + paths: [ + { + name: 'import-foo', + allowTypeImports: true, + }, + ], + }, + ], + errors: [ + { + messageId: 'path', + type: AST_NODE_TYPES.ImportDeclaration, + }, + ], + }, { code: "import foo from 'import-foo';", options: [ From d159ceff75fd3811d87511165050a903486830a0 Mon Sep 17 00:00:00 2001 From: Josh Kelley Date: Thu, 7 Sep 2023 20:46:58 -0400 Subject: [PATCH 2/3] Apply suggestions from code review Co-authored-by: Brad Zacher --- packages/eslint-plugin/src/rules/no-restricted-imports.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/eslint-plugin/src/rules/no-restricted-imports.ts b/packages/eslint-plugin/src/rules/no-restricted-imports.ts index 35037b6c3ed1..c629a4095d13 100644 --- a/packages/eslint-plugin/src/rules/no-restricted-imports.ts +++ b/packages/eslint-plugin/src/rules/no-restricted-imports.ts @@ -273,7 +273,7 @@ export default createRule({ ImportDeclaration(node: TSESTree.ImportDeclaration): void { if ( node.importKind === 'type' || - (node.specifiers.length && + (node.specifiers.length > 0 && node.specifiers.every( specifier => specifier.type === AST_NODE_TYPES.ImportSpecifier && @@ -298,7 +298,7 @@ export default createRule({ ): void { if ( node.exportKind === 'type' || - (node.specifiers.length && + (node.specifiers.length > 0 && node.specifiers.every(specifier => specifier.exportKind === 'type')) ) { const importSource = node.source.value.trim(); From b61759b04d82c54a1b3fabb77bb26e89d87f54ec Mon Sep 17 00:00:00 2001 From: Josh Kelley Date: Thu, 7 Sep 2023 20:51:54 -0400 Subject: [PATCH 3/3] Add a passing test for "import 'foo'" --- .../eslint-plugin/tests/rules/no-restricted-imports.test.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/eslint-plugin/tests/rules/no-restricted-imports.test.ts b/packages/eslint-plugin/tests/rules/no-restricted-imports.test.ts index 53bae5c886f4..2113ad11601e 100644 --- a/packages/eslint-plugin/tests/rules/no-restricted-imports.test.ts +++ b/packages/eslint-plugin/tests/rules/no-restricted-imports.test.ts @@ -10,6 +10,7 @@ const ruleTester = new RuleTester({ ruleTester.run('no-restricted-imports', rule, { valid: [ "import foo from 'foo';", + "import 'foo';", { code: "import foo from 'foo';", options: ['import1', 'import2'], @@ -26,6 +27,10 @@ ruleTester.run('no-restricted-imports', rule, { code: "export { foo } from 'foo';", options: [{ paths: ['import1', 'import2'] }], }, + { + code: "import 'foo';", + options: ['import1', 'import2'], + }, { code: "import foo from 'foo';", options: [