1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- 'use strict';
- const isLogicalExpression = require('./is-logical-expression.js');
- const isLogicNot = node => node?.type === 'UnaryExpression' && node.operator === '!';
- const isLogicNotArgument = node => isLogicNot(node.parent) && node.parent.argument === node;
- const isBooleanCallArgument = node => isBooleanCall(node.parent) && node.parent.arguments[0] === node;
- const isBooleanCall = node =>
- node?.type === 'CallExpression'
- && node.callee.type === 'Identifier'
- && node.callee.name === 'Boolean'
- && node.arguments.length === 1;
- const isVueBooleanAttributeValue = node =>
- node?.type === 'VExpressionContainer'
- && node.parent.type === 'VAttribute'
- && node.parent.directive
- && node.parent.value === node
- && node.parent.key.type === 'VDirectiveKey'
- && node.parent.key.name.type === 'VIdentifier'
- && (
- node.parent.key.name.rawName === 'if'
- || node.parent.key.name.rawName === 'else-if'
- || node.parent.key.name.rawName === 'show'
- );
- /**
- Check if the value of node is a `boolean`.
- @param {Node} node
- @returns {boolean}
- */
- function isBooleanNode(node) {
- if (
- isLogicNot(node)
- || isLogicNotArgument(node)
- || isBooleanCall(node)
- || isBooleanCallArgument(node)
- ) {
- return true;
- }
- const {parent} = node;
- if (isVueBooleanAttributeValue(parent)) {
- return true;
- }
- if (
- (
- parent.type === 'IfStatement'
- || parent.type === 'ConditionalExpression'
- || parent.type === 'WhileStatement'
- || parent.type === 'DoWhileStatement'
- || parent.type === 'ForStatement'
- )
- && parent.test === node
- ) {
- return true;
- }
- if (isLogicalExpression(parent)) {
- return isBooleanNode(parent);
- }
- return false;
- }
- /**
- Get the boolean type-casting ancestor.
- @typedef {{ node: Node, isNegative: boolean }} Result
- @param {Node} node
- @returns {Result}
- */
- function getBooleanAncestor(node) {
- let isNegative = false;
- // eslint-disable-next-line no-constant-condition
- while (true) {
- if (isLogicNotArgument(node)) {
- isNegative = !isNegative;
- node = node.parent;
- } else if (isBooleanCallArgument(node)) {
- node = node.parent;
- } else {
- break;
- }
- }
- return {node, isNegative};
- }
- module.exports = {isBooleanNode, getBooleanAncestor};
|