From 9a93d9ef389c49a133c4df4f9843927f5f806423 Mon Sep 17 00:00:00 2001 From: Milos Djermanovic Date: Fri, 17 Jan 2020 16:51:16 +0100 Subject: [PATCH] Update: fix no-restricted-imports export * false negative (fixes #12737) (#12798) --- lib/rules/no-restricted-imports.js | 49 ++++++++++++++---------- tests/lib/rules/no-restricted-imports.js | 42 ++++++++++++++++++++ 2 files changed, 70 insertions(+), 21 deletions(-) diff --git a/lib/rules/no-restricted-imports.js b/lib/rules/no-restricted-imports.js index 5514b979c84..c205dad8bdb 100644 --- a/lib/rules/no-restricted-imports.js +++ b/lib/rules/no-restricted-imports.js @@ -91,6 +91,7 @@ module.exports = { }, create(context) { + const sourceCode = context.getSourceCode(); const options = Array.isArray(context.options) ? context.options : []; const isPathAndPatternsObject = typeof options[0] === "object" && @@ -216,30 +217,36 @@ module.exports = { */ function checkNode(node) { const importSource = node.source.value.trim(); - const importNames = node.specifiers ? node.specifiers.reduce((map, specifier) => { - let name; - const specifierData = { loc: specifier.loc }; - - if (specifier.type === "ImportDefaultSpecifier") { - name = "default"; - } else if (specifier.type === "ImportNamespaceSpecifier") { - name = "*"; - } else if (specifier.imported) { - name = specifier.imported.name; - } else if (specifier.local) { - name = specifier.local.name; - } + const importNames = new Map(); + + if (node.type === "ExportAllDeclaration") { + const starToken = sourceCode.getFirstToken(node, 1); + + importNames.set("*", [{ loc: starToken.loc }]); + } else if (node.specifiers) { + for (const specifier of node.specifiers) { + let name; + const specifierData = { loc: specifier.loc }; + + if (specifier.type === "ImportDefaultSpecifier") { + name = "default"; + } else if (specifier.type === "ImportNamespaceSpecifier") { + name = "*"; + } else if (specifier.imported) { + name = specifier.imported.name; + } else if (specifier.local) { + name = specifier.local.name; + } - if (name) { - if (map.has(name)) { - map.get(name).push(specifierData); - } else { - map.set(name, [specifierData]); + if (name) { + if (importNames.has(name)) { + importNames.get(name).push(specifierData); + } else { + importNames.set(name, [specifierData]); + } } } - - return map; - }, new Map()) : new Map(); + } checkRestrictedPathAndReport(importSource, importNames, node); diff --git a/tests/lib/rules/no-restricted-imports.js b/tests/lib/rules/no-restricted-imports.js index 958395f453a..680bc1352e3 100644 --- a/tests/lib/rules/no-restricted-imports.js +++ b/tests/lib/rules/no-restricted-imports.js @@ -168,6 +168,17 @@ ruleTester.run("no-restricted-imports", rule, { { code: "import {\nAllowedObject,\nDisallowedObject, // eslint-disable-line\n} from \"foo\";", options: [{ paths: [{ name: "foo", importNames: ["DisallowedObject"] }] }] + }, + { + code: "export * from \"foo\";", + options: ["bar"] + }, + { + code: "export * from \"foo\";", + options: [{ + name: "bar", + importNames: ["DisallowedObject"] + }] } ], invalid: [{ @@ -356,6 +367,37 @@ ruleTester.run("no-restricted-imports", rule, { endColumn: 16 }] }, + { + code: "export * from \"foo\";", + options: [{ + paths: [{ + name: "foo", + importNames: ["DisallowedObject"], + message: "Please import 'DisallowedObject' from /bar/ instead." + }] + }], + errors: [{ + message: "* import is invalid because 'DisallowedObject' from 'foo' is restricted. Please import 'DisallowedObject' from /bar/ instead.", + type: "ExportAllDeclaration", + line: 1, + column: 8, + endColumn: 9 + }] + }, + { + code: "export * from \"foo\";", + options: [{ + name: "foo", + importNames: ["DisallowedObject1, DisallowedObject2"] + }], + errors: [{ + message: "* import is invalid because 'DisallowedObject1, DisallowedObject2' from 'foo' is restricted.", + type: "ExportAllDeclaration", + line: 1, + column: 8, + endColumn: 9 + }] + }, { code: "import { DisallowedObject } from \"foo\";", options: [{