46 lines
1.2 KiB
TypeScript
46 lines
1.2 KiB
TypeScript
import type { Rule } from 'eslint';
|
|
import type { Position } from 'estree';
|
|
|
|
const rule: Rule.RuleModule = {
|
|
meta: {
|
|
type: 'problem',
|
|
docs: {
|
|
description:
|
|
"Ban useless import aliasing like `import { abc as abc } from 'module'`",
|
|
category: 'Best Practices',
|
|
recommended: true,
|
|
},
|
|
fixable: 'code',
|
|
},
|
|
create(context) {
|
|
return {
|
|
ImportDeclaration(node) {
|
|
if (node.specifiers.length === 0) return;
|
|
|
|
for (const specifier of node.specifiers) {
|
|
if (specifier.type !== 'ImportSpecifier') continue;
|
|
|
|
const { imported, local } = specifier;
|
|
if (
|
|
imported.name === local.name &&
|
|
!arePositionsEqual(imported.loc!.start, local.loc!.start)
|
|
) {
|
|
context.report({
|
|
node: specifier,
|
|
message: `Useless aliasing of '${imported.name}'?`,
|
|
fix(fixer) {
|
|
return fixer.removeRange([imported.range![1], local.range![1]]);
|
|
},
|
|
});
|
|
}
|
|
}
|
|
},
|
|
};
|
|
},
|
|
};
|
|
|
|
const arePositionsEqual = (a: Position, b: Position) =>
|
|
a.line === b.line && a.column === b.column;
|
|
|
|
export default rule;
|