eslint-plugin-de-morgan
Version:
ESLint plugin for transforming negated boolean expressions via De Morgan’s laws
68 lines (67 loc) • 2.59 kB
JavaScript
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 isDisjunction = require('../utils/is-disjunction.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 noNegatedDisjunction = {
create: context => ({
UnaryExpression: node => {
let isNegatedDisjunction =
isNegated.isNegated(node) && isDisjunction.isDisjunction(node.argument)
let hasPureOuterGroup = isPureGroup.isPureGroup(node, context)
let isSafeToFix =
hasBooleanContext.hasBooleanContext(node) ||
!hasNegationInsideParentheses.hasNegationInsideParentheses(
node,
context,
)
if (isNegatedDisjunction && hasPureOuterGroup && isSafeToFix) {
let originalExpression = getNodeContent.getNodeContent(node, context)
let toggledOperands = flattenOperands.flattenOperands({
transformer: toggleNegation.toggleNegation,
expression: node.argument,
predicate: isDisjunction.isDisjunction,
context,
})
let shouldWrapInParens = false
let fixedExpression = joinOperands.joinOperands(
toggledOperands,
shouldWrapInParens,
'&&',
)
context.report({
data: {
original: toSingleLine.toSingleLine(originalExpression),
fixed: toSingleLine.toSingleLine(fixedExpression),
},
fix: fixer => fixer.replaceText(node, fixedExpression),
messageId: 'convertNegatedDisjunction',
node,
})
}
},
}),
meta: {
docs: {
description:
'Transforms the negation of a disjunction !(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-disjunction.md',
category: 'Best Practices',
recommended: true,
},
messages: {
convertNegatedDisjunction:
'Replace negated disjunction `{{ original }}` with `{{ fixed }}`',
},
type: 'suggestion',
fixable: 'code',
schema: [],
},
}
module.exports = noNegatedDisjunction