UNPKG

eslint-plugin-lodash

Version:

Lodash specific linting rules for ESLint

62 lines (50 loc) 2.4 kB
/** * @fileoverview Rule to ensure a lodash chain ends */ 'use strict'; // ------------------------------------------------------------------------------ // Rule Definition // ------------------------------------------------------------------------------ module.exports = { create: function create(context) { var _require = require('../util/lodashUtil'); var isImplicitChainStart = _require.isImplicitChainStart; var isExplicitChainStart = _require.isExplicitChainStart; var isChainable = _require.isChainable; var isCallToMethod = _require.isCallToMethod; var isChainBreaker = _require.isChainBreaker; var getLodashImportVisitors = _require.getLodashImportVisitors; var settings = require('../util/settingsUtil').getSettings(context); var _require2 = require('../util/astUtil'); var getCaller = _require2.getCaller; var negate = require('lodash/negate'); var _require3 = require('../util/ruleUtil'); var combineVisitorObjects = _require3.combineVisitorObjects; function isCommit(node) { return isCallToMethod(node, settings.version, 'commit'); } function getEndOfChain(node, isExplicit) { var stillInChain = isExplicit ? negate(isChainBreaker) : isChainable; var curr = node.parent.parent; while (curr === getCaller(curr.parent.parent) && stillInChain(curr, settings.version)) { curr = curr.parent.parent; } return curr; } return combineVisitorObjects({ CallExpression: function CallExpression(node) { if (isImplicitChainStart(node, settings.pragma, context)) { var end = getEndOfChain(node, false); if (!isCommit(end) && isChainable(end, settings.version)) { context.report(end, 'Missing unwrapping at end of chain'); } } else if (isExplicitChainStart(node, settings.pragma, context)) { var _end = getEndOfChain(node, true); if (!isCommit(_end) && !isChainBreaker(_end, settings.version)) { context.report(_end, 'Missing unwrapping at end of chain'); } } } }, getLodashImportVisitors(context)); } };