From 2563e8b226621326d242fb1ef15acafe608047e6 Mon Sep 17 00:00:00 2001 From: Andreu Botella Date: Thu, 20 Aug 2020 20:56:52 +0200 Subject: [PATCH] [Fix] `export`/TypeScript: properly detect export specifiers as children of a TS module block Fixes #1773 --- CHANGELOG.md | 1 + src/rules/export.js | 6 ++++- tests/src/rules/export.js | 48 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bca4603c38..f8ec9dbf6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ This change log adheres to standards from [Keep a CHANGELOG](http://keepachangel - [`default`]/TypeScript: avoid crash on `export =` with a MemberExpression ([#1841], thanks [@ljharb]) - [`extensions`]/importType: Fix @/abc being treated as scoped module ([#1854], thanks [@3nuc]) - allow using rest operator in named export ([#1878], thanks [@foray1010]) +- [`export`]/TypeScript: properly detect export specifiers as children of a TS module block ### Changed - [`export`]: add tests for a name collision with `export * from` ([#1704], thanks @tomprats) diff --git a/src/rules/export.js b/src/rules/export.js index 340972eda0..212a60f6e6 100644 --- a/src/rules/export.js +++ b/src/rules/export.js @@ -87,7 +87,11 @@ module.exports = { return { 'ExportDefaultDeclaration': (node) => addNamed('default', node, getParent(node)), - 'ExportSpecifier': (node) => addNamed(node.exported.name, node.exported, getParent(node)), + 'ExportSpecifier': (node) => addNamed( + node.exported.name, + node.exported, + getParent(node.parent) + ), 'ExportNamedDeclaration': function (node) { if (node.declaration == null) return diff --git a/tests/src/rules/export.js b/tests/src/rules/export.js index 5ecfcae20e..12341c7da9 100644 --- a/tests/src/rules/export.js +++ b/tests/src/rules/export.js @@ -221,6 +221,30 @@ context('TypeScript', function () { parser: parser, }), ]), + + // Exports in ambient modules + test(Object.assign({ + code: ` + declare module "a" { + const Foo = 1; + export {Foo as default}; + } + declare module "b" { + const Bar = 2; + export {Bar as default}; + } + `, + }, parserConfig)), + test(Object.assign({ + code: ` + declare module "a" { + const Foo = 1; + export {Foo as default}; + } + const Bar = 2; + export {Bar as default}; + `, + }, parserConfig)), ], invalid: [ // type/value name clash @@ -312,6 +336,30 @@ context('TypeScript', function () { }, ], }, parserConfig)), + + // Exports in ambient modules + test(Object.assign({ + code: ` + declare module "a" { + const Foo = 1; + export {Foo as default}; + } + const Bar = 2; + export {Bar as default}; + const Baz = 3; + export {Baz as default}; + `, + errors: [ + { + message: 'Multiple default exports.', + line: 7, + }, + { + message: 'Multiple default exports.', + line: 9, + }, + ], + }, parserConfig)), ], }) })