canonical
Version:
Canonical code style linter and formatter for JavaScript, SCSS, CSS and JSON.
39 lines (33 loc) • 1.63 kB
JavaScript
/**
* @fileoverview Rule to disallow the use of a chain for a single method
*/
;
// ------------------------------------------------------------------------------
// Rule Definition
// ------------------------------------------------------------------------------
module.exports = function (context) {
var lodashUtil = require('../util/lodashUtil');
var astUtil = require('../util/astUtil');
var settings = require('../util/settingsUtil').getSettings(context);
var transformerMethods = ['reduce', 'reduceRight', 'transform'];
function isBound(node) {
return node && node.type === 'CallExpression' && astUtil.getMethodName(node) === 'bind' && node.arguments.length === 1;
}
var callExpressionReporters = {
3: function (node, iteratee) {
if (isBound(iteratee)) {
context.report(iteratee.callee.property, 'Unnecessary bind, pass `thisArg` to lodash method instead');
}
},
4: function (node, iteratee) {
var isTransformerMethod = transformerMethods.some(lodashUtil.isCallToMethod.bind(null, node, settings.version));
var iterateeIndex = node.arguments.indexOf(iteratee);
if (iterateeIndex !== -1 && (isTransformerMethod && node.arguments[iterateeIndex + 2] || (!isTransformerMethod && node.arguments[iterateeIndex + 1]))) {
context.report(iteratee, 'Do not use Lodash 3 thisArg, use binding instead');
}
}
};
return {
CallExpression: lodashUtil.getLodashMethodVisitor(settings, callExpressionReporters[settings.version])
};
};