eslint-plugin-lodash
Version:
Lodash specific linting rules for ESLint
65 lines (51 loc) • 2.67 kB
JavaScript
/**
* @fileoverview Rule to check if a call to _.forEach should be a call to _.filter
*/
;
/**
* @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');
}
});
}
};