UNPKG

eslint-plugin-de-morgan

Version:

ESLint plugin for transforming negated boolean expressions via De Morgan’s laws

68 lines (67 loc) 2.63 kB
'use strict' const hasNegationInsideParentheses = require('../utils/has-negation-inside-parentheses.js') const hasBooleanContext = require('../utils/has-boolean-context.js') const flattenOperands = require('../utils/flatten-operands.js') const getNodeContent = require('../utils/get-node-content.js') const toggleNegation = require('../utils/toggle-negation.js') const isConjunction = require('../utils/is-conjunction.js') const toSingleLine = require('../utils/to-single-line.js') const joinOperands = require('../utils/join-operands.js') const isPureGroup = require('../utils/is-pure-group.js') const isNegated = require('../utils/is-negated.js') const noNegatedConjunction = { create: context => ({ UnaryExpression: node => { let isNegatedConjunction = isNegated.isNegated(node) && isConjunction.isConjunction(node.argument) let hasPureOuterGroup = isPureGroup.isPureGroup(node, context) let isSafeToFix = hasBooleanContext.hasBooleanContext(node) || !hasNegationInsideParentheses.hasNegationInsideParentheses( node, context, ) if (isNegatedConjunction && hasPureOuterGroup && isSafeToFix) { let originalExpression = getNodeContent.getNodeContent(node, context) let toggledOperands = flattenOperands.flattenOperands({ transformer: toggleNegation.toggleNegation, expression: node.argument, predicate: isConjunction.isConjunction, context, }) let shouldWrapInParens = isConjunction.isConjunction(node.parent) let fixedExpression = joinOperands.joinOperands( toggledOperands, shouldWrapInParens, '||', ) context.report({ data: { original: toSingleLine.toSingleLine(originalExpression), fixed: toSingleLine.toSingleLine(fixedExpression), }, fix: fixer => fixer.replaceText(node, fixedExpression), messageId: 'convertNegatedConjunction', node, }) } }, }), meta: { docs: { description: 'Transforms the negation of a conjunction !(A && B) into the equivalent !A || !B according to De Morgan’s law', url: 'https://github.com/azat-io/eslint-plugin-de-morgan/blob/main/docs/no-negated-conjunction.md', category: 'Best Practices', recommended: true, }, messages: { convertNegatedConjunction: 'Replace negated conjunction `{{ original }}` with `{{ fixed }}`', }, type: 'suggestion', fixable: 'code', schema: [], }, } module.exports = noNegatedConjunction