ESLint Plugin De Morgan
Идея появилась на работе. В коде то и дело попадались условия с отрицанием перед скобками, и каждый раз их приходилось мысленно раскрывать. Мне показалось, что это вполне может делать линтер.
ESLint Plugin De Morgan переписывает такие условия по законам де Моргана. Это два закона булевой алгебры:
!(a && b)равно!a || !b;!(a || b)равно!a && !b.
Было:
if (!(user.role === 'admin' || user.isOwner)) {
throw new Error('Access denied')
}Стало:
if (user.role !== 'admin' && !user.isOwner) {
throw new Error('Access denied')
}В плагине два правила: no-negated-conjunction для !(a && b) и no-negated-disjunction для !(a || b).
Плагин не меняет поведение кода. Например, отрицание count >= 10 он запишет как !(count >= 10), а не count < 10. Если count равен NaN, оба сравнения вернут false, и такая замена сломала бы условие.
Как начать его использовать?
Установите ESLint и плагин:
npm install --save-dev eslint eslint-plugin-de-morganПодключите рекомендуемый конфиг в eslint.config.js:
import deMorgan from 'eslint-plugin-de-morgan'
export default [deMorgan.configs.recommended]Оба правила исправляют код автоматически. Запустите ESLint с флагом --fix, и плагин перепишет все выражения сам.