UNPKG

eslint-plugin-unicorn

Version:
117 lines (102 loc) 2.38 kB
import {getStaticNumberValue} from '../utils/index.js'; import {isLengthMinusOneOf, isLengthOf} from '../utils/comparison.js'; const MESSAGE_ID_NO_OP = 'no-op'; const MESSAGE_ID_SHIFT = 'shift'; const MESSAGE_ID_UNSHIFT = 'unshift'; const MESSAGE_ID_POP = 'pop'; const MESSAGE_ID_PUSH = 'push'; const MESSAGE_ID_EMPTY = 'empty'; const emptyArrayReplacement = { messageId: MESSAGE_ID_EMPTY, }; const isZero = node => Object.is(getStaticNumberValue(node), 0); const isOne = node => getStaticNumberValue(node) === 1; const isZeroOrNegative = node => getStaticNumberValue(node) <= 0; function getNoOpOrEmptyReplacement(arguments_, object) { if (arguments_.length === 0) { return { messageId: MESSAGE_ID_NO_OP, }; } if ( arguments_.length === 1 && isZero(arguments_[0]) ) { return emptyArrayReplacement; } if ( arguments_.length === 2 && isZero(arguments_[0]) && isLengthOf(arguments_[1], object) ) { return emptyArrayReplacement; } if ( arguments_.length === 2 && isZeroOrNegative(arguments_[1]) ) { return { messageId: MESSAGE_ID_NO_OP, }; } } function getMethodReplacement(arguments_, object) { if ( arguments_.length === 2 && isZero(arguments_[0]) && isOne(arguments_[1]) ) { return { messageId: MESSAGE_ID_SHIFT, method: 'shift', argumentsToKeep: [], }; } if ( arguments_.length > 2 && isZero(arguments_[0]) && isZeroOrNegative(arguments_[1]) ) { return { messageId: MESSAGE_ID_UNSHIFT, method: 'unshift', argumentsToKeep: arguments_.slice(2), }; } if ( arguments_.length === 2 && isLengthMinusOneOf(arguments_[0], object) && isOne(arguments_[1]) ) { return { messageId: MESSAGE_ID_POP, method: 'pop', argumentsToKeep: [], }; } if ( arguments_.length > 2 && isLengthOf(arguments_[0], object) && isZeroOrNegative(arguments_[1]) ) { return { messageId: MESSAGE_ID_PUSH, method: 'push', argumentsToKeep: arguments_.slice(2), }; } } function getUnnecessarySpliceReplacement(callExpression) { const {arguments: arguments_, callee} = callExpression; const {object} = callee; return getNoOpOrEmptyReplacement(arguments_, object) ?? getMethodReplacement(arguments_, object); } export { MESSAGE_ID_NO_OP, MESSAGE_ID_SHIFT, MESSAGE_ID_UNSHIFT, MESSAGE_ID_POP, MESSAGE_ID_PUSH, MESSAGE_ID_EMPTY, getUnnecessarySpliceReplacement, };