diff --git a/tests/files/no-named-as-default/exports.js b/tests/files/no-named-as-default/exports.js new file mode 100644 index 000000000..62402634f --- /dev/null +++ b/tests/files/no-named-as-default/exports.js @@ -0,0 +1,4 @@ +const variable = 1; + +export { variable }; +export default variable; diff --git a/tests/files/no-named-as-default/re-exports.js b/tests/files/no-named-as-default/re-exports.js new file mode 100644 index 000000000..20306c182 --- /dev/null +++ b/tests/files/no-named-as-default/re-exports.js @@ -0,0 +1,2 @@ +export { something as default } from "./something"; +export { something } from "./something"; diff --git a/tests/files/no-named-as-default/something.js b/tests/files/no-named-as-default/something.js new file mode 100644 index 000000000..d8fd6851b --- /dev/null +++ b/tests/files/no-named-as-default/something.js @@ -0,0 +1 @@ +export const something = 42; diff --git a/tests/src/rules/no-named-as-default.js b/tests/src/rules/no-named-as-default.js index c6646a4f0..3f01414f1 100644 --- a/tests/src/rules/no-named-as-default.js +++ b/tests/src/rules/no-named-as-default.js @@ -12,14 +12,20 @@ ruleTester.run('no-named-as-default', rule, { test({ code: 'import bar, { foo } from "./empty-folder";' }), // es7 - test({ code: 'export bar, { foo } from "./bar";', - parser: parsers.BABEL_OLD }), - test({ code: 'export bar from "./bar";', - parser: parsers.BABEL_OLD }), + test({ + code: 'export bar, { foo } from "./bar";', + parser: parsers.BABEL_OLD, + }), + test({ + code: 'export bar from "./bar";', + parser: parsers.BABEL_OLD, + }), // #566: don't false-positive on `default` itself - test({ code: 'export default from "./bar";', - parser: parsers.BABEL_OLD }), + test({ + code: 'export default from "./bar";', + parser: parsers.BABEL_OLD, + }), // es2022: Arbitrary module namespae identifier names testVersion('>= 8.7', () => ({ @@ -27,6 +33,33 @@ ruleTester.run('no-named-as-default', rule, { parserOptions: { ecmaVersion: 2022 }, })), + // #1594: Allow importing as default if object is exported both as default and named + test({ code: 'import something from "./no-named-as-default/re-exports.js";' }), + test({ + code: 'import { something } from "./no-named-as-default/re-exports.js";', + }), + test({ + code: 'import myOwnNameForVariable from "./no-named-as-default/exports.js";', + }), + test({ + code: 'import { variable } from "./no-named-as-default/exports.js";', + }), + // same tests, but for exports + test({ + code: 'export something from "./no-named-as-default/re-exports.js";', + parser: parsers.BABEL_OLD, + }), + test({ + code: 'export { something } from "./no-named-as-default/re-exports.js";', + }), + test({ + code: 'export myOwnNameForVariable from "./no-named-as-default/exports.js";', + parser: parsers.BABEL_OLD, + }), + test({ + code: 'export { variable } from "./no-named-as-default/exports.js";', + }), + ...SYNTAX_CASES, ), @@ -35,12 +68,16 @@ ruleTester.run('no-named-as-default', rule, { code: 'import foo from "./bar";', errors: [{ message: 'Using exported name \'foo\' as identifier for default export.', - type: 'ImportDefaultSpecifier' }] }), + type: 'ImportDefaultSpecifier', + }], + }), test({ code: 'import foo, { foo as bar } from "./bar";', errors: [{ message: 'Using exported name \'foo\' as identifier for default export.', - type: 'ImportDefaultSpecifier' }] }), + type: 'ImportDefaultSpecifier', + }], + }), // es7 test({ @@ -48,13 +85,17 @@ ruleTester.run('no-named-as-default', rule, { parser: parsers.BABEL_OLD, errors: [{ message: 'Using exported name \'foo\' as identifier for default export.', - type: 'ExportDefaultSpecifier' }] }), + type: 'ExportDefaultSpecifier', + }], + }), test({ code: 'export foo, { foo as bar } from "./bar";', parser: parsers.BABEL_OLD, errors: [{ message: 'Using exported name \'foo\' as identifier for default export.', - type: 'ExportDefaultSpecifier' }] }), + type: 'ExportDefaultSpecifier', + }], + }), test({ code: 'import foo from "./malformed.js"', @@ -81,5 +122,23 @@ ruleTester.run('no-named-as-default', rule, { }], parserOptions: { ecmaVersion: 2022 }, })), + + // #1594: Allow importing as default if object is exported both as default and named + // The only cases that are not covered by the fix + test({ + code: 'import variable from "./no-named-as-default/exports.js";', + errors: [{ + message: 'Using exported name \'variable\' as identifier for default export.', + type: 'ImportDefaultSpecifier', + }], + }), + test({ + code: 'export variable from "./no-named-as-default/exports.js";', + parser: parsers.BABEL_OLD, + errors: [{ + message: 'Using exported name \'variable\' as identifier for default export.', + type: 'ExportDefaultSpecifier', + }], + }), ), });