@masknet/eslint-plugin
Version:
eslint plugin for masknet
67 lines • 2.19 kB
JavaScript
import { createRule } from '../rule.js';
export default createRule({
name: 'no-top-level',
meta: {
type: 'problem',
docs: {
description: 'Disallow side-effect at module top-level',
},
schema: [
{
type: 'object',
properties: {
'variable': { type: 'boolean' },
'side-effect': { type: 'boolean' },
},
additionalProperties: false,
},
],
messages: {
'variable': 'Unexpected {{kind}} in top-level, use const.',
'side-effect': 'Side effects in top-level are not allowed.',
},
},
resolveOptions(options) {
return {
'variable': options?.variable ?? true,
'side-effect': options?.['side-effect'] ?? true,
};
},
create(context, options) {
const handleVariable = options.variable
? (node) => {
if (node.kind === 'const')
return;
if (!isTopLevel(node))
return;
context.report({ node, messageId: 'variable', data: { kind: node.kind } });
}
: undefined;
const handleSideEffect = options['side-effect']
? (node) => {
if (!isTopLevel(node))
return;
context.report({ node, messageId: 'side-effect' });
}
: undefined;
return {
IfStatement: handleSideEffect,
ForStatement: handleSideEffect,
ForInStatement: handleSideEffect,
ForOfStatement: handleSideEffect,
DoWhileStatement: handleSideEffect,
WhileStatement: handleSideEffect,
SwitchStatement: handleSideEffect,
ExpressionStatement: handleSideEffect,
VariableDeclaration: handleVariable,
};
},
});
function isTopLevel(node) {
let { parent } = node;
while (parent?.type === 'BlockStatement') {
parent = parent.parent;
}
return parent?.type === 'Program';
}
//# sourceMappingURL=no-top-level.js.map