From 968a02af455f76446269afe07191c6aa37d44a88 Mon Sep 17 00:00:00 2001 From: Milos Djermanovic Date: Mon, 10 Jan 2022 21:33:54 +0100 Subject: [PATCH] feat: Support arbitrary module namespace names in no-useless-rename (#15493) * feat: Support arbitrary module namespace names in no-useless-rename Refs #15465 * remove extra blank line --- docs/rules/no-useless-rename.md | 6 +++ lib/rules/no-useless-rename.js | 12 +++-- tests/lib/rules/no-useless-rename.js | 74 ++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 4 deletions(-) diff --git a/docs/rules/no-useless-rename.md b/docs/rules/no-useless-rename.md index fba3123322d..1a827288c4b 100644 --- a/docs/rules/no-useless-rename.md +++ b/docs/rules/no-useless-rename.md @@ -52,8 +52,11 @@ Examples of **incorrect** code for this rule by default: /*eslint no-useless-rename: "error"*/ import { foo as foo } from "bar"; +import { "foo" as foo } from "bar"; export { foo as foo }; +export { foo as "foo" }; export { foo as foo } from "bar"; +export { "foo" as "foo" } from "bar"; let { foo: foo } = bar; let { 'foo': foo } = bar; function foo({ bar: bar }) {} @@ -68,10 +71,13 @@ Examples of **correct** code for this rule by default: import * as foo from "foo"; import { foo } from "bar"; import { foo as bar } from "baz"; +import { "foo" as bar } from "baz"; export { foo }; export { foo as bar }; +export { foo as "bar" }; export { foo as bar } from "foo"; +export { "foo" as "bar" } from "foo"; let { foo } = bar; let { foo: bar } = baz; diff --git a/lib/rules/no-useless-rename.js b/lib/rules/no-useless-rename.js index 616ec2a43cc..2489f57bcf5 100644 --- a/lib/rules/no-useless-rename.js +++ b/lib/rules/no-useless-rename.js @@ -132,8 +132,10 @@ module.exports = { return; } - if (node.imported.name === node.local.name && - node.imported.range[0] !== node.local.range[0]) { + if ( + node.imported.range[0] !== node.local.range[0] && + astUtils.getModuleExportName(node.imported) === node.local.name + ) { reportError(node, node.imported, "Import"); } } @@ -148,8 +150,10 @@ module.exports = { return; } - if (node.local.name === node.exported.name && - node.local.range[0] !== node.exported.range[0]) { + if ( + node.local.range[0] !== node.exported.range[0] && + astUtils.getModuleExportName(node.local) === astUtils.getModuleExportName(node.exported) + ) { reportError(node, node.local, "Export"); } diff --git a/tests/lib/rules/no-useless-rename.js b/tests/lib/rules/no-useless-rename.js index 66077f2b497..262cf2cc5ac 100644 --- a/tests/lib/rules/no-useless-rename.js +++ b/tests/lib/rules/no-useless-rename.js @@ -47,11 +47,43 @@ ruleTester.run("no-useless-rename", rule, { "import {foo} from 'foo';", "import {foo as bar} from 'foo';", "import {foo as bar, baz as qux} from 'foo';", + { + code: "import {'foo' as bar} from 'baz';", + parserOptions: { ecmaVersion: 2022 } + }, "export {foo} from 'foo';", "var foo = 0;export {foo as bar};", "var foo = 0; var baz = 0; export {foo as bar, baz as qux};", "export {foo as bar} from 'foo';", "export {foo as bar, baz as qux} from 'foo';", + { + code: "var foo = 0; export {foo as 'bar'};", + parserOptions: { ecmaVersion: 2022 } + }, + { + code: "export {foo as 'bar'} from 'baz';", + parserOptions: { ecmaVersion: 2022 } + }, + { + code: "export {'foo' as bar} from 'baz';", + parserOptions: { ecmaVersion: 2022 } + }, + { + code: "export {'foo' as 'bar'} from 'baz';", + parserOptions: { ecmaVersion: 2022 } + }, + { + code: "export {'' as ' '} from 'baz';", + parserOptions: { ecmaVersion: 2022 } + }, + { + code: "export {' ' as ''} from 'baz';", + parserOptions: { ecmaVersion: 2022 } + }, + { + code: "export {'foo'} from 'bar';", + parserOptions: { ecmaVersion: 2022 } + }, { code: "const {...stuff} = myObject;", parserOptions: { ecmaVersion: 2018 } @@ -380,6 +412,12 @@ ruleTester.run("no-useless-rename", rule, { output: "import {foo} from 'foo';", errors: [{ messageId: "unnecessarilyRenamed", data: { type: "Import", name: "foo" } }] }, + { + code: "import {'foo' as foo} from 'foo';", + output: "import {foo} from 'foo';", + parserOptions: { ecmaVersion: 2022 }, + errors: [{ messageId: "unnecessarilyRenamed", data: { type: "Import", name: "foo" } }] + }, { code: "import {\\u0061 as a} from 'foo';", output: "import {a} from 'foo';", @@ -418,6 +456,42 @@ ruleTester.run("no-useless-rename", rule, { output: "var foo = 0; export {foo};", errors: [{ messageId: "unnecessarilyRenamed", data: { type: "Export", name: "foo" } }] }, + { + code: "var foo = 0; export {foo as 'foo'};", + output: "var foo = 0; export {foo};", + parserOptions: { ecmaVersion: 2022 }, + errors: [{ messageId: "unnecessarilyRenamed", data: { type: "Export", name: "foo" } }] + }, + { + code: "export {foo as 'foo'} from 'bar';", + output: "export {foo} from 'bar';", + parserOptions: { ecmaVersion: 2022 }, + errors: [{ messageId: "unnecessarilyRenamed", data: { type: "Export", name: "foo" } }] + }, + { + code: "export {'foo' as foo} from 'bar';", + output: "export {'foo'} from 'bar';", + parserOptions: { ecmaVersion: 2022 }, + errors: [{ messageId: "unnecessarilyRenamed", data: { type: "Export", name: "foo" } }] + }, + { + code: "export {'foo' as 'foo'} from 'bar';", + output: "export {'foo'} from 'bar';", + parserOptions: { ecmaVersion: 2022 }, + errors: [{ messageId: "unnecessarilyRenamed", data: { type: "Export", name: "foo" } }] + }, + { + code: "export {' 👍 ' as ' 👍 '} from 'bar';", + output: "export {' 👍 '} from 'bar';", + parserOptions: { ecmaVersion: 2022 }, + errors: [{ messageId: "unnecessarilyRenamed", data: { type: "Export", name: " 👍 " } }] + }, + { + code: "export {'' as ''} from 'bar';", + output: "export {''} from 'bar';", + parserOptions: { ecmaVersion: 2022 }, + errors: [{ messageId: "unnecessarilyRenamed", data: { type: "Export", name: "" } }] + }, { code: "var a = 0; export {a as \\u0061};", output: "var a = 0; export {a};",