eslint-plugin-ft-flow
Version:
Flowtype linting rules for ESLint by flow-typed
69 lines (58 loc) • 1.45 kB
Flow
const schema = [
{
enum: ['always', 'never'],
type: 'string',
},
];
const isSemicolon = (token) => token.type === 'Punctuator' && token.value === ';';
const create = (context) => {
const never = (context.options[0] || 'always') === 'never';
const sourceCode = context.getSourceCode();
const report = (node, missing) => {
const lastToken = sourceCode.getLastToken(node);
let fix;
let message;
let { loc } = lastToken;
if (missing) {
message = 'Missing semicolon.';
loc = loc.end;
fix = (fixer) => fixer.insertTextAfter(lastToken, ';');
} else {
message = 'Extra semicolon.';
loc = loc.start;
fix = (fixer) => fixer.remove(lastToken);
}
context.report({
fix,
loc,
message,
node,
});
};
const checkForSemicolon = (node) => {
const lastToken = sourceCode.getLastToken(node);
const isLastTokenSemicolon = isSemicolon(lastToken);
if (never && isLastTokenSemicolon) {
report(node, false);
}
if (!never && !isLastTokenSemicolon) {
report(node, true);
}
};
return {
OpaqueType: checkForSemicolon,
TypeAlias: checkForSemicolon,
TypeAnnotation: (node) => {
if (['PropertyDefinition', 'ClassProperty'].includes(node.parent.type)) {
checkForSemicolon(node.parent);
}
},
};
};
export default {
create,
meta: {
fixable: 'code',
schema,
},
};