UNPKG

eslint-plugin-jest

Version:
97 lines (71 loc) 4.5 kB
'use strict'; function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } const _require = require('./util'), getDocsUrl = _require.getDocsUrl, expectCase = _require.expectCase, expectResolveCase = _require.expectResolveCase, expectRejectCase = _require.expectRejectCase, method = _require.method, argument = _require.argument; const isEqualityCheck = node => method(node) && (method(node).name === 'toBe' || method(node).name === 'toEqual'); const isArgumentValid = node => argument(node).value === true || argument(node).value === false; const hasOneArgument = node => node.arguments && node.arguments.length === 1; const isValidEqualityCheck = node => isEqualityCheck(node) && hasOneArgument(node.parent.parent) && isArgumentValid(node); const isEqualityNegation = node => method(node).name === 'not' && isValidEqualityCheck(node.parent); const hasIncludesMethod = node => node.arguments[0] && node.arguments[0].callee && node.arguments[0].callee.property && node.arguments[0].callee.property.name === 'includes'; const isValidIncludesMethod = node => hasIncludesMethod(node) && hasOneArgument(node.arguments[0]); const getNegationFixes = (node, sourceCode, fixer) => { const negationPropertyDot = sourceCode.getFirstTokenBetween(node.parent.object, node.parent.property, token => token.value === '.'); const toContainFunc = isEqualityNegation(node) && argument(node.parent).value ? 'not.toContain' : 'toContain'; //.includes function argument const _node$arguments$0$arg = _slicedToArray(node.arguments[0].arguments, 1), containArg = _node$arguments$0$arg[0]; return [fixer.remove(negationPropertyDot), fixer.remove(method(node)), fixer.replaceText(method(node.parent), toContainFunc), fixer.replaceText(argument(node.parent), sourceCode.getText(containArg))]; }; const getCommonFixes = (node, sourceCode, fixer) => { const _node$arguments$0$arg2 = _slicedToArray(node.arguments[0].arguments, 1), containArg = _node$arguments$0$arg2[0]; const includesCaller = node.arguments[0].callee; const propertyDot = sourceCode.getFirstTokenBetween(includesCaller.object, includesCaller.property, token => token.value === '.'); const closingParenthesis = sourceCode.getTokenAfter(containArg); const openParenthesis = sourceCode.getTokenBefore(containArg); return [fixer.remove(containArg), fixer.remove(includesCaller.property), fixer.remove(propertyDot), fixer.remove(closingParenthesis), fixer.remove(openParenthesis)]; }; module.exports = { meta: { docs: { url: getDocsUrl(__filename) }, messages: { useToContain: 'Use toContain() instead' }, fixable: 'code' }, create(context) { return { CallExpression(node) { if (!(expectResolveCase(node) || expectRejectCase(node)) && expectCase(node) && (isEqualityNegation(node) || isValidEqualityCheck(node)) && isValidIncludesMethod(node)) { context.report({ fix(fixer) { const sourceCode = context.getSourceCode(); let fixArr = getCommonFixes(node, sourceCode, fixer); if (isEqualityNegation(node)) { return getNegationFixes(node, sourceCode, fixer).concat(fixArr); } const toContainFunc = argument(node).value ? 'toContain' : 'not.toContain'; //.includes function argument const _node$arguments$0$arg3 = _slicedToArray(node.arguments[0].arguments, 1), containArg = _node$arguments$0$arg3[0]; fixArr.push(fixer.replaceText(method(node), toContainFunc)); fixArr.push(fixer.replaceText(argument(node), sourceCode.getText(containArg))); return fixArr; }, messageId: 'useToContain', node: method(node) }); } } }; } };