UNPKG

eslint-plugin-putout

Version:
87 lines (69 loc) 2.01 kB
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); };