@masknet/eslint-plugin
Version:
eslint plugin for masknet
52 lines • 1.82 kB
JavaScript
import { createRule } from "../rule.js";
import { findLastIndex } from "../utils.js";
export default createRule({
name: 'prefer-default-export',
meta: {
type: 'suggestion',
docs: {
description: 'Enforce default export location at top or bottom',
recommended: 'stylistic',
},
schema: [{ type: 'string', enum: ['at-top', 'at-bottom'] }],
messages: {
'at-top': 'Move default export to top',
'at-bottom': 'Move default export to bottom',
},
},
defaultOptions: ['at-bottom'],
create(context, [location]) {
function onProgram(program) {
const index = program.body.findIndex(isDefaultExport);
if (index === -1)
return;
const node = program.body[index];
if (location === 'at-top' && !isTop(program, index)) {
context.report({ node, messageId: 'at-top' });
}
else if (location === 'at-bottom' && !isBottom(program, index)) {
context.report({ node, messageId: 'at-bottom' });
}
}
return { Program: onProgram };
},
});
function isTop(program, index) {
const firstIndex = program.body.findIndex(isNonDefaultExport);
if (firstIndex === -1)
return true;
return index < firstIndex;
}
function isBottom(program, index) {
const lastIndex = findLastIndex(program.body, isNonDefaultExport);
if (lastIndex === -1)
return true;
return index > lastIndex;
}
function isDefaultExport(node) {
return node.type === 'ExportDefaultDeclaration';
}
function isNonDefaultExport(node) {
return node.type === 'ExportAllDeclaration' || node.type === 'ExportNamedDeclaration';
}
//# sourceMappingURL=prefer-default-export.js.map