eslint-plugin-putout
Version:
ESLint plugin for 🐊Putout
87 lines (69 loc) • 2.01 kB
JavaScript
import process from 'node:process';
import {tryCatch} from 'try-catch';
import {ignores} from 'putout/ignores';
import {parseOptions} from 'putout/parse-options';
import {
findPlaces,
transform,
print,
parse,
} from 'putout';
import {parseError} from './parse-error.js';
const cwd = process.cwd();
const EMPTY_VISITORS = {};
export const putoutSync = ({context, options}) => {
const name = context.filename;
const resultOptions = parseOptions({
name,
options,
});
if (ignores(cwd, name, resultOptions))
return EMPTY_VISITORS;
const source = context.sourceCode;
const {text} = source;
const node = source.ast;
const [errorParser, ast] = tryCatch(parse, text, {
isTS: true,
});
if (errorParser) {
context.report({
message: `${parseError(errorParser)} (parser)`,
node,
});
return EMPTY_VISITORS;
}
const [error, places = []] = tryCatch(findPlaces, ast, resultOptions);
if (error) {
context.report({
message: `${parseError(error)} (putout)`,
node,
});
return EMPTY_VISITORS;
}
for (const {rule, message, position} of places) {
context.report({
message: `${message} (${rule})`,
fix: fix({
ast,
node,
source,
resultOptions,
}),
loc: {
start: position,
end: position,
},
});
}
return EMPTY_VISITORS;
};
const fix = ({ast, node, source, resultOptions}) => (fixer) => {
const includeComments = true;
const lastToken = source.getLastToken(node, {
includeComments,
});
transform(ast, resultOptions);
const [, last] = lastToken.range;
const code = print(ast);
return fixer.replaceTextRange([0, last], code);
};