UNPKG

eslint-plugin-lodash

Version:

Lodash specific linting rules for ESLint

65 lines (51 loc) 2.67 kB
/** * @fileoverview Rule to check if a call to _.forEach should be a call to _.filter */ 'use strict'; /** * @fileoverview Rule to check if a call to _.forEach should be a call to _.filter */ //------------------------------------------------------------------------------ // Rule Definition //------------------------------------------------------------------------------ module.exports = { meta: { schema: [{ type: 'integer' }] }, create: function create(context) { var _require = require('../util/lodashUtil'); var getLodashMethodVisitors = _require.getLodashMethodVisitors; var _require2 = require('../util/astUtil'); var isIdentifierWithName = _require2.isIdentifierWithName; var isMemberExpOf = _require2.isMemberExpOf; var isNegationOfMemberOf = _require2.isNegationOfMemberOf; var isEqEqEqToMemberOf = _require2.isEqEqEqToMemberOf; var isNotEqEqToMemberOf = _require2.isNotEqEqToMemberOf; var getFirstFunctionLine = _require2.getFirstFunctionLine; var hasOnlyOneStatement = _require2.hasOnlyOneStatement; var getFirstParamName = _require2.getFirstParamName; var _require3 = require('../util/methodDataUtil'); var isAliasOfMethod = _require3.isAliasOfMethod; var DEFAULT_MAX_PROPERTY_PATH_LENGTH = 3; var maxLength = parseInt(context.options[0], 10) || DEFAULT_MAX_PROPERTY_PATH_LENGTH; function isIfWithoutElse(statement) { return statement && statement.type === 'IfStatement' && !statement.alternate; } function canBeShorthand(exp, paramName) { return isIdentifierWithName(exp, paramName) || isMemberExpOf(exp, paramName, { maxLength: maxLength }) || isNegationOfMemberOf(exp, paramName, { maxLength: maxLength }) || isEqEqEqToMemberOf(exp, paramName, { maxLength: maxLength }) || isNotEqEqToMemberOf(exp, paramName, { maxLength: maxLength }); } function onlyHasSimplifiableIf(func) { var firstLine = getFirstFunctionLine(func); return func && hasOnlyOneStatement(func) && func.params.length === 1 && isIfWithoutElse(firstLine) && canBeShorthand(firstLine.test, getFirstParamName(func)); } return getLodashMethodVisitors(context, function (node, iteratee, _ref) { var method = _ref.method; var version = _ref.version; if (isAliasOfMethod(version, 'forEach', method) && onlyHasSimplifiableIf(iteratee)) { context.report(node, 'Prefer _.filter or _.some over an if statement inside a _.forEach'); } }); } };