Skip to content

Commit

Permalink
make rules dependant on major version and refactor settings to return…
Browse files Browse the repository at this point in the history
… whole settings object
  • Loading branch information
ganimomer committed Jan 25, 2016
1 parent c7f1013 commit 6f3e204
Show file tree
Hide file tree
Showing 28 changed files with 799 additions and 216 deletions.
9 changes: 3 additions & 6 deletions lib/rules/callback-binding.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,7 @@
module.exports = function (context) {
var lodashUtil = require('../util/lodashUtil');
var astUtil = require('../util/astUtil');
var settingsUtil = require('../util/settingsUtil');

var lodashPragma = settingsUtil.getLodashPragma(context);
var majorVersion = settingsUtil.getMajorVersion(context);
var settings = require('../util/settingsUtil').getSettings(context);
var transformerMethods = ['reduce', 'reduceRight', 'transform'];

function isBound(node) {
Expand All @@ -27,7 +24,7 @@ module.exports = function (context) {
}
},
4: function (node, iteratee) {
var isTransformerMethod = transformerMethods.some(lodashUtil.isCallToMethod.bind(null, node));
var isTransformerMethod = transformerMethods.some(lodashUtil.isCallToMethod.bind(null, node, settings.version));
var iterateeIndex = node.arguments.indexOf(iteratee);
if ((isTransformerMethod && node.arguments[iterateeIndex + 2]) || (!isTransformerMethod && node.arguments[iterateeIndex + 1])) {
context.report(iteratee, 'Do not use Lodash 3 thisArg, use binding instead');
Expand All @@ -36,6 +33,6 @@ module.exports = function (context) {
};

return {
CallExpression: lodashUtil.getLodashMethodVisitor(lodashPragma, callExpressionReporters[majorVersion])
CallExpression: lodashUtil.getLodashMethodVisitor(settings, callExpressionReporters[settings.version])
};
};
13 changes: 6 additions & 7 deletions lib/rules/chain-style.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,14 @@
module.exports = function (context) {
var lodashUtil = require('../util/lodashUtil');
var astUtil = require('../util/astUtil');
var lodashPragma = require('../util/settingsUtil').getLodashPragma(context);

var settings = require('../util/settingsUtil').getSettings(context);
var callExpressionVisitors = {
'as-needed': function (node) {
if (lodashUtil.isExplicitChainStart(node, lodashPragma)) {
if (lodashUtil.isExplicitChainStart(node, settings.pragma)) {
var curr = node.parent.parent;
var needed = false;
while (astUtil.isMethodCall(curr) && !lodashUtil.isChainBreaker(curr)) {
if (!lodashUtil.isChainable(curr) && !lodashUtil.isChainBreaker(curr.parent.parent)) {
while (astUtil.isMethodCall(curr) && !lodashUtil.isChainBreaker(curr, settings.version)) {
if (!lodashUtil.isChainable(curr, settings.version) && !lodashUtil.isChainBreaker(curr.parent.parent, settings.version)) {
needed = true;
}
curr = curr.parent.parent;
Expand All @@ -28,12 +27,12 @@ module.exports = function (context) {
}
},
implicit: function (node) {
if (lodashUtil.isExplicitChainStart(node, lodashPragma)) {
if (lodashUtil.isExplicitChainStart(node, settings.pragma)) {
context.report(node, 'Do not use explicit chaining');
}
},
explicit: function (node) {
if (lodashUtil.isImplicitChainStart(node, lodashPragma)) {
if (lodashUtil.isImplicitChainStart(node, settings.pragma)) {
context.report(node, 'Do not use implicit chaining');
}
}
Expand Down
5 changes: 2 additions & 3 deletions lib/rules/collection-return.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@ module.exports = function (context) {
var _ = require('lodash');
var astUtil = require('../util/astUtil');
var lodashUtil = require('../util/lodashUtil');
var lodashPragma = require('../util/settingsUtil').getLodashPragma(context);

var settings = require('../util/settingsUtil').getSettings(context);
var callStack = [];

function handleExitOfFunctionWithBlock(node) {
Expand All @@ -26,7 +25,7 @@ module.exports = function (context) {
}
}
function addToCallStackIfCollectionMethod(node) {
if (node.parent.type === 'CallExpression' && lodashUtil.isLodashCollectionMethod(node.parent, lodashPragma)) {
if (node.parent.type === 'CallExpression' && lodashUtil.isLodashCollectionMethod(node.parent, settings.pragma, settings.version)) {
callStack.push({node: node.parent});
}
}
Expand Down
5 changes: 2 additions & 3 deletions lib/rules/matches-prop-shorthand.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@
module.exports = function (context) {
var lodashUtil = require('../util/lodashUtil');
var astUtil = require('../util/astUtil');
var lodashPragma = require('../util/settingsUtil').getLodashPragma(context);

var settings = require('../util/settingsUtil').getSettings(context);
var SUPPORT_MATCHES_PROPERTY_STYLE_CB = ['find', 'detect', 'filter', 'select', 'reject', 'findIndex', 'findLastIndex', 'some', 'every'];

function shouldPreferMatches(func) {
Expand Down Expand Up @@ -39,7 +38,7 @@ module.exports = function (context) {
};

return {
CallExpression: lodashUtil.getLodashMethodVisitor(lodashPragma, callExpressionReporters[context.options[0] || 'always'])
CallExpression: lodashUtil.getLodashMethodVisitor(settings, callExpressionReporters[context.options[0] || 'always'])
};
};

Expand Down
5 changes: 2 additions & 3 deletions lib/rules/matches-shorthand.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@
module.exports = function (context) {
var lodashUtil = require('../util/lodashUtil');
var astUtil = require('../util/astUtil');
var lodashPragma = require('../util/settingsUtil').getLodashPragma(context);

var settings = require('../util/settingsUtil').getSettings(context);
var SUPPORT_MATCHES_STYLE_CB = ['find', 'detect', 'filter', 'select', 'reject', 'findIndex', 'findLastIndex', 'some', 'every'];
var DEFAULT_MAX_PROPERTY_PATH_LENGTH = 3;

Expand Down Expand Up @@ -61,7 +60,7 @@ module.exports = function (context) {
};

return {
CallExpression: lodashUtil.getLodashMethodVisitor(lodashPragma, callExpressionReporters[context.options[0] || 'always'])
CallExpression: lodashUtil.getLodashMethodVisitor(settings, callExpressionReporters[context.options[0] || 'always'])
};
};

Expand Down
10 changes: 4 additions & 6 deletions lib/rules/no-commit.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,14 @@
module.exports = function (context) {
var lodashUtil = require('../util/lodashUtil');
var astUtil = require('../util/astUtil');
var lodashPragma = require('../util/settingsUtil').getLodashPragma(context);


var settings = require('../util/settingsUtil').getSettings(context);
return {
CallExpression: function (node) {
if (lodashUtil.isLodashChainStart(node, lodashPragma)) {
if (lodashUtil.isLodashChainStart(node, settings.pragma)) {
do {
node = node.parent.parent;
} while (astUtil.isMethodCall(node) && !lodashUtil.isCallToMethod(node, 'commit'));
if (lodashUtil.isCallToMethod(node, 'commit') && !lodashUtil.isCallToMethod(astUtil.getCaller(node), 'forEach')) {
} while (astUtil.isMethodCall(node) && !lodashUtil.isCallToMethod(node, settings.version, 'commit'));
if (lodashUtil.isCallToMethod(node, settings.version, 'commit') && !lodashUtil.isCallToMethod(astUtil.getCaller(node), settings.version, 'forEach')) {
context.report(node, 'Do not end chain with commit, except for side effects.');
}
}
Expand Down
8 changes: 4 additions & 4 deletions lib/rules/no-double-unwrap.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@
module.exports = function (context) {
var lodashUtil = require('../util/lodashUtil');
var astUtil = require('../util/astUtil');
var lodashPragma = require('../util/settingsUtil').getLodashPragma(context);
var settings = require('../util/settingsUtil').getSettings(context);
return {
CallExpression: function (node) {
if (lodashUtil.isImplicitChainStart(node, lodashPragma)) {
if (lodashUtil.isImplicitChainStart(node, settings.pragma)) {
do {
node = node.parent.parent;
} while (astUtil.isMethodCall(node) && !lodashUtil.isChainBreaker(node));
} while (astUtil.isMethodCall(node) && !lodashUtil.isChainBreaker(node, settings.version));
var caller = astUtil.getCaller(node);
if (astUtil.isMethodCall(node) && !lodashUtil.isChainable(caller)) {
if (astUtil.isMethodCall(node) && !lodashUtil.isChainable(caller, settings.version)) {
context.report(node, 'Do not use .value() after chain-ending method {{method}}', {method: astUtil.getMethodName(caller)});
}
}
Expand Down
7 changes: 3 additions & 4 deletions lib/rules/no-single-chain.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,18 @@
module.exports = function (context) {
var lodashUtil = require('../util/lodashUtil');
var astUtil = require('../util/astUtil');
var lodashPragma = require('../util/settingsUtil').getLodashPragma(context);

var settings = require('../util/settingsUtil').getSettings(context);
function isEndOfChain(node) {
return !astUtil.isObjectOfMethodCall(node);
}

function isBeforeChainBreaker(node) {
return lodashUtil.isChainBreaker(node.parent.parent);
return lodashUtil.isChainBreaker(node.parent.parent, settings.version);
}

return {
CallExpression: function (node) {
if (lodashUtil.isLodashChainStart(node, lodashPragma)) {
if (lodashUtil.isLodashChainStart(node, settings.pragma)) {
var firstCall = node.parent.parent;
if (astUtil.isMethodCall(firstCall) && (isEndOfChain(firstCall) || isBeforeChainBreaker(firstCall))) {
context.report(firstCall, 'Do not use chain syntax for single method');
Expand Down
5 changes: 2 additions & 3 deletions lib/rules/prefer-chain.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,11 @@ module.exports = function (context) {
var lodashUtil = require('../util/lodashUtil');
var astUtil = require('../util/astUtil');
var DEFAULT_LENGTH = 3;
var lodashPragma = require('../util/settingsUtil').getLodashPragma(context);

var settings = require('../util/settingsUtil').getSettings(context);
var ruleDepth = parseInt(context.options[0], 10) || DEFAULT_LENGTH;

function isNestedNLevels(node, n) {
return n === 0 || lodashUtil.isLodashCall(node, lodashPragma) && isNestedNLevels(node.arguments[0], n - 1);
return n === 0 || lodashUtil.isLodashCall(node, settings.pragma) && isNestedNLevels(node.arguments[0], n - 1);
}

return {
Expand Down
8 changes: 3 additions & 5 deletions lib/rules/prefer-compact.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,7 @@
module.exports = function (context) {
var lodashUtil = require('../util/lodashUtil');
var astUtil = require('../util/astUtil');
var lodashPragma = require('../util/settingsUtil').getLodashPragma(context);


var settings = require('../util/settingsUtil').getSettings(context);
function isDoubleNegationOfParam(exp, paramName) {
return astUtil.isNegationExpression(exp) && astUtil.isNegationExpression(exp.argument) && astUtil.isIdentifierOfParam(exp.argument.argument, paramName);
}
Expand All @@ -30,8 +28,8 @@ module.exports = function (context) {
}

return {
CallExpression: lodashUtil.getLodashMethodVisitor(lodashPragma, function (node, iteratee) {
if (lodashUtil.isCallToMethod(node, 'filter') && isBooleanCastingFunction(iteratee)) {
CallExpression: lodashUtil.getLodashMethodVisitor(settings, function (node, iteratee) {
if (lodashUtil.isCallToMethod(node, settings.version, 'filter') && isBooleanCastingFunction(iteratee)) {
context.report(node, 'Prefer _.compact over filtering of Boolean casting');
}
})
Expand Down
7 changes: 3 additions & 4 deletions lib/rules/prefer-filter.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@
module.exports = function (context) {
var lodashUtil = require('../util/lodashUtil');
var astUtil = require('../util/astUtil');
var lodashPragma = require('../util/settingsUtil').getLodashPragma(context);

var settings = require('../util/settingsUtil').getSettings(context);
var DEFAULT_MAX_PROPERTY_PATH_LENGTH = 3;
var maxPropertyPathLength = parseInt(context.options[0], 10) || DEFAULT_MAX_PROPERTY_PATH_LENGTH;

Expand All @@ -31,8 +30,8 @@ module.exports = function (context) {
}

return {
CallExpression: lodashUtil.getLodashMethodVisitor(lodashPragma, function (node, iteratee) {
if (lodashUtil.isCallToMethod(node, 'forEach') && onlyHasSimplifiableIf(iteratee)) {
CallExpression: lodashUtil.getLodashMethodVisitor(settings, function (node, iteratee) {
if (lodashUtil.isCallToMethod(node, settings.version, 'forEach') && onlyHasSimplifiableIf(iteratee)) {
context.report(node, 'Prefer _.filter or _.some over an if statement inside a _.forEach');
}
})
Expand Down
8 changes: 3 additions & 5 deletions lib/rules/prefer-invoke.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,14 @@
module.exports = function (context) {
var lodashUtil = require('../util/lodashUtil');
var astUtil = require('../util/astUtil');
var lodashPragma = require('../util/settingsUtil').getLodashPragma(context);


var settings = require('../util/settingsUtil').getSettings(context);
function isFunctionMethodCallOfParam(func) {
return astUtil.isCallFromObject(astUtil.getValueReturnedInFirstLine(func), astUtil.getFirstParamName(func));
}

return {
CallExpression: lodashUtil.getLodashMethodVisitor(lodashPragma, function (node, iteratee) {
if (lodashUtil.isCallToMethod(node, 'map') && isFunctionMethodCallOfParam(iteratee)) {
CallExpression: lodashUtil.getLodashMethodVisitor(settings, function (node, iteratee) {
if (lodashUtil.isCallToMethod(node, settings.version, 'map') && isFunctionMethodCallOfParam(iteratee)) {
context.report(node, 'Prefer _.invoke over map to a method call.');
}
})
Expand Down
5 changes: 2 additions & 3 deletions lib/rules/prefer-is-nil.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@
module.exports = function (context) {
var astUtil = require('../util/astUtil');
var lodashUtil = require('../util/lodashUtil');
var lodashPragma = require('../util/settingsUtil').getLodashPragma(context);

var settings = require('../util/settingsUtil').getSettings(context);
var nilChecks = {
null: {
isValue: function isNullLiteral(node) {
Expand All @@ -28,7 +27,7 @@ module.exports = function (context) {
};

function getLodashTypeChecked(typecheck, node) {
return lodashUtil.isLodashCall(node, lodashPragma) && lodashUtil.isCallToMethod(node, typecheck) && node.arguments[0];
return lodashUtil.isLodashCall(node, settings.pragma) && lodashUtil.isCallToMethod(node, settings.version, typecheck) && node.arguments[0];
}

function getValueComparedToNil(nil, node, operator) {
Expand Down
14 changes: 6 additions & 8 deletions lib/rules/prefer-lodash-chain.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,24 +10,22 @@
module.exports = function (context) {
var lodashUtil = require('../util/lodashUtil');
var astUtil = require('../util/astUtil');
var lodashPragma = require('../util/settingsUtil').getLodashPragma(context);


var settings = require('../util/settingsUtil').getSettings(context);
var REPORT_MESSAGE = 'Prefer lodash chain';

return {
CallExpression: function (node) {
if (lodashUtil.isLodashChainStart(node, lodashPragma)) {
if (lodashUtil.isLodashChainStart(node, settings.pragma)) {
do {
node = node.parent.parent;
} while (astUtil.isMethodCall(node) && !lodashUtil.isChainBreaker(node));
if (lodashUtil.isChainBreaker(node) && astUtil.isObjectOfMethodCall(node)) {
} while (astUtil.isMethodCall(node) && !lodashUtil.isChainBreaker(node, settings.version));
if (lodashUtil.isChainBreaker(node, settings.version) && astUtil.isObjectOfMethodCall(node)) {
var callAfterChainBreak = node.parent.parent;
if (lodashUtil.isNativeCollectionMethodCall(callAfterChainBreak) || lodashUtil.isLodashWrapperMethod(callAfterChainBreak)) {
if (lodashUtil.isNativeCollectionMethodCall(callAfterChainBreak) || lodashUtil.isLodashWrapperMethod(callAfterChainBreak, settings.version)) {
context.report(callAfterChainBreak, REPORT_MESSAGE);
}
}
} else if (lodashUtil.isLodashCall(node, lodashPragma)) {
} else if (lodashUtil.isLodashCall(node, settings.pragma)) {
if (astUtil.isMethodCall(node.parent.parent) && (lodashUtil.isNativeCollectionMethodCall(node.parent.parent))) {
context.report(node.parent.parent, REPORT_MESSAGE);
}
Expand Down
5 changes: 2 additions & 3 deletions lib/rules/prefer-lodash-method.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@ module.exports = function (context) {
var _ = require('lodash');
var lodashUtil = require('../util/lodashUtil');
var astUtil = require('../util/astUtil');
var lodashPragma = require('../util/settingsUtil').getLodashPragma(context);

var settings = require('../util/settingsUtil').getSettings(context);
var REPORT_MESSAGE = 'Prefer \'_.{{method}}\' over the native function.';

function isStaticNativeMethodCall(node) {
Expand All @@ -26,7 +25,7 @@ module.exports = function (context) {

return {
CallExpression: function (node) {
if (!(lodashUtil.isLodashCall(node, lodashPragma) || lodashUtil.isLodashWrapper(astUtil.getCaller(node), lodashPragma)) && (lodashUtil.isNativeCollectionMethodCall(node) || isStaticNativeMethodCall(node))) {
if (!(lodashUtil.isLodashCall(node, settings.pragma) || lodashUtil.isLodashWrapper(astUtil.getCaller(node), settings.pragma, settings.version)) && (lodashUtil.isNativeCollectionMethodCall(node) || isStaticNativeMethodCall(node))) {
context.report(node, REPORT_MESSAGE, {method: astUtil.getMethodName(node)});
}
}
Expand Down
8 changes: 3 additions & 5 deletions lib/rules/prefer-map.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,16 @@
module.exports = function (context) {
var lodashUtil = require('../util/lodashUtil');
var astUtil = require('../util/astUtil');
var lodashPragma = require('../util/settingsUtil').getLodashPragma(context);


var settings = require('../util/settingsUtil').getSettings(context);
function onlyHasPush(func) {
var firstLine = astUtil.getFirstFunctionLine(func);
var exp = func && func.type === 'ArrowFunctionExpression' ? firstLine : firstLine && firstLine.expression;
return astUtil.hasOnlyOneStatement(func) && astUtil.getMethodName(exp) === 'push';
}

return {
CallExpression: lodashUtil.getLodashMethodVisitor(lodashPragma, function (node, iteratee) {
if (lodashUtil.isCallToMethod(node, 'forEach') && onlyHasPush(iteratee)) {
CallExpression: lodashUtil.getLodashMethodVisitor(settings, function (node, iteratee) {
if (lodashUtil.isCallToMethod(node, settings.version, 'forEach') && onlyHasPush(iteratee)) {
context.report(node, 'Prefer _.map over a _.forEach with a push to an array inside');
}
})
Expand Down
8 changes: 3 additions & 5 deletions lib/rules/prefer-reject.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,7 @@
module.exports = function (context) {
var lodashUtil = require('../util/lodashUtil');
var astUtil = require('../util/astUtil');
var lodashPragma = require('../util/settingsUtil').getLodashPragma(context);


var settings = require('../util/settingsUtil').getSettings(context);
var DEFAULT_MAX_PROPERTY_PATH_LENGTH = 3;
var maxPropertyPathLength = parseInt(context.options[0], 10) || DEFAULT_MAX_PROPERTY_PATH_LENGTH;

Expand All @@ -24,8 +22,8 @@ module.exports = function (context) {
}

return {
CallExpression: lodashUtil.getLodashMethodVisitor(lodashPragma, function (node, iteratee) {
if (lodashUtil.isCallToMethod(node, 'filter') && isNegativeExpressionFunction(iteratee)) {
CallExpression: lodashUtil.getLodashMethodVisitor(settings, function (node, iteratee) {
if (lodashUtil.isCallToMethod(node, settings.version, 'filter') && isNegativeExpressionFunction(iteratee)) {
context.report(node, 'Prefer _.reject over negative condition');
}
})
Expand Down

0 comments on commit 6f3e204

Please sign in to comment.