/
no-useless-empty-export.ts
78 lines (70 loc) · 1.93 KB
/
no-useless-empty-export.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import { AST_NODE_TYPES, TSESTree } from '@typescript-eslint/utils';
import * as util from '../util';
function isEmptyExport(
node: TSESTree.Node,
): node is TSESTree.ExportNamedDeclaration {
return (
node.type === AST_NODE_TYPES.ExportNamedDeclaration &&
node.specifiers.length === 0 &&
!node.declaration
);
}
const exportOrImportNodeTypes = new Set([
AST_NODE_TYPES.ExportAllDeclaration,
AST_NODE_TYPES.ExportDefaultDeclaration,
AST_NODE_TYPES.ExportNamedDeclaration,
AST_NODE_TYPES.ExportSpecifier,
AST_NODE_TYPES.ImportDeclaration,
AST_NODE_TYPES.TSExportAssignment,
AST_NODE_TYPES.TSImportEqualsDeclaration,
]);
export default util.createRule({
name: 'no-useless-empty-export',
meta: {
docs: {
description:
"Disallow empty exports that don't change anything in a module file",
recommended: false,
},
fixable: 'code',
hasSuggestions: false,
messages: {
uselessExport: 'Empty export does nothing and can be removed.',
},
schema: [],
type: 'suggestion',
},
defaultOptions: [],
create(context) {
function checkNode(
node: TSESTree.Program | TSESTree.TSModuleDeclaration,
): void {
if (!Array.isArray(node.body)) {
return;
}
let emptyExport: TSESTree.ExportNamedDeclaration | undefined;
let foundOtherExport = false;
for (const statement of node.body) {
if (isEmptyExport(statement)) {
emptyExport = statement;
if (foundOtherExport) {
break;
}
} else if (exportOrImportNodeTypes.has(statement.type)) {
foundOtherExport = true;
}
}
if (emptyExport && foundOtherExport) {
context.report({
fix: fixer => fixer.remove(emptyExport!),
messageId: 'uselessExport',
node: emptyExport,
});
}
}
return {
Program: checkNode,
TSModuleDeclaration: checkNode,
};
},
});