diff --git a/packages/eslint-plugin/src/rules/no-useless-empty-export.ts b/packages/eslint-plugin/src/rules/no-useless-empty-export.ts index 7c2b8ca3ea22..2c32769c10b6 100644 --- a/packages/eslint-plugin/src/rules/no-useless-empty-export.ts +++ b/packages/eslint-plugin/src/rules/no-useless-empty-export.ts @@ -40,6 +40,12 @@ export default util.createRule({ }, defaultOptions: [], create(context) { + // In a definition file, export {} is necessary to make the module properly + // encapsulated, even when there are other exports + // https://github.com/typescript-eslint/typescript-eslint/issues/4975 + if (util.isDefinitionFile(context.getFilename())) { + return {}; + } function checkNode( node: TSESTree.Program | TSESTree.TSModuleDeclaration, ): void { @@ -47,27 +53,25 @@ export default util.createRule({ return; } - let emptyExport: TSESTree.ExportNamedDeclaration | undefined; + const emptyExports: TSESTree.ExportNamedDeclaration[] = []; let foundOtherExport = false; for (const statement of node.body) { if (isEmptyExport(statement)) { - emptyExport = statement; - - if (foundOtherExport) { - break; - } + emptyExports.push(statement); } else if (exportOrImportNodeTypes.has(statement.type)) { foundOtherExport = true; } } - if (emptyExport && foundOtherExport) { - context.report({ - fix: fixer => fixer.remove(emptyExport!), - messageId: 'uselessExport', - node: emptyExport, - }); + if (foundOtherExport) { + for (const emptyExport of emptyExports) { + context.report({ + fix: fixer => fixer.remove(emptyExport), + messageId: 'uselessExport', + node: emptyExport, + }); + } } } diff --git a/packages/eslint-plugin/tests/rules/no-useless-empty-export.test.ts b/packages/eslint-plugin/tests/rules/no-useless-empty-export.test.ts index 6ed201033bb4..caef56622cbc 100644 --- a/packages/eslint-plugin/tests/rules/no-useless-empty-export.test.ts +++ b/packages/eslint-plugin/tests/rules/no-useless-empty-export.test.ts @@ -37,6 +37,35 @@ ruleTester.run('no-useless-empty-export', rule, { ` export {}; `, + // https://github.com/microsoft/TypeScript/issues/38592 + { + code: ` + export type A = 1; + export {}; + `, + filename: 'foo.d.ts', + }, + { + code: ` + export declare const a = 2; + export {}; + `, + filename: 'foo.d.ts', + }, + { + code: ` + import type { A } from '_'; + export {}; + `, + filename: 'foo.d.ts', + }, + { + code: ` + import { A } from '_'; + export {}; + `, + filename: 'foo.d.ts', + }, ], invalid: [ { @@ -120,6 +149,19 @@ export {}; output: ` import _ = require('_'); + `, + }, + { + code: ` +import _ = require('_'); +export {}; +export {}; + `, + errors: [error, error], + output: ` +import _ = require('_'); + + `, }, ],
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: