UNPKG

@morev/eslint-disable-autofix

Version:

Utility to disable autofix for specific ESLint rules

75 lines (72 loc) 2.57 kB
// src/index.ts import { isEmpty, tsObject } from "@morev/utils"; import riskyEslint from "eslint/use-at-your-own-risk"; // src/utils.ts import ruleComposer from "eslint-rule-composer"; var createNonFixableRule = (rule) => { if (!rule) return null; return ruleComposer.mapReports( Object.create(rule), (problem) => { problem.fix = null; return problem; } ); }; var omitMutable = (source, keys) => { keys.forEach((key) => delete source[key]); }; // src/index.ts var internalDisableAutofix = (options) => { const { configurations, prefix } = options; const allNoAutofixRules = configurations.reduce((acc, configuration) => { if (isEmpty(configuration.rules)) return acc; const rulesToDisableAutofix = tsObject.fromEntries( tsObject.entries(configuration.rules).filter(([ruleName, ruleValue]) => ruleName.startsWith(prefix)) ); if (isEmpty(rulesToDisableAutofix)) return acc; const cleanRules = tsObject.fromEntries( tsObject.entries(rulesToDisableAutofix).map(([ruleName, ruleValue]) => [ ruleName.replace(`${prefix}/`, ""), ruleValue ]) ); omitMutable(configuration.rules, tsObject.keys(rulesToDisableAutofix)); Object.assign(configuration.rules, cleanRules); acc.push(...tsObject.keys(cleanRules)); return acc; }, []); if (isEmpty(allNoAutofixRules)) return configurations; const allPlugins = configurations.reduce((acc, configuration) => { tsObject.entries(configuration.plugins ?? {}).forEach(([pluginMappingName, pluginObject]) => { acc[pluginMappingName] ??= pluginObject; }); return acc; }, {}); const eslintRules = riskyEslint.builtinRules; eslintRules._set = Map.prototype.set.bind(eslintRules); allNoAutofixRules.forEach((fullRuleName) => { const [_, pluginName, ruleName] = fullRuleName.match(/(?:(.*?)\/)?(.*)/); if (pluginName && allPlugins[pluginName]?.rules?.[ruleName]) { allPlugins[pluginName].rules[ruleName] = createNonFixableRule(allPlugins[pluginName].rules[ruleName]); return; } if (eslintRules.has(fullRuleName)) { const originalRule = eslintRules.get(fullRuleName); eslintRules._set(fullRuleName, () => createNonFixableRule(originalRule)); } }); return configurations; }; var createDisableAutofix = (options) => { const { prefix = "no-autofix" } = options ?? {}; return (configurations) => internalDisableAutofix({ configurations, prefix }); }; var disableAutofix = createDisableAutofix(); export { createDisableAutofix, disableAutofix };