eslint-plugin-sort-requires-by-path
Version:
ESLint rule to enforce sorting of variable declarations in a group of require('path') calls by 'path' string
115 lines (98 loc) • 4.35 kB
JavaScript
;
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
module.exports = {
meta: {
fixable: 'code'
},
create: function create(context) {
var sourceCode = context.getSourceCode();
var hasRequire = /require\(/;
var groups = [];
var previousNode = void 0;
var changeOrder = function changeOrder(indices, indicesMap) {
return function (acc, value, originalIndex) {
var newIndex = indicesMap[originalIndex];
acc[newIndex] = value;
return acc;
};
};
var arrayMultisort = function arrayMultisort(sortFn) {
return function (refArray) {
for (var _len = arguments.length, others = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
others[_key - 1] = arguments[_key];
}
var indices = refArray.map(function (value, index) {
return index;
}) // create indices
.sort(function (a, b) {
return sortFn(refArray[a], refArray[b]);
}); // sort according to refArray
var indicesMap = indices.reduce(function (acc, newIndex, i) {
return acc[newIndex] = i, acc;
}, {}); // for fast index lookup
return [refArray.reduce(changeOrder(indices, indicesMap), [])].concat(_toConsumableArray(others.map(function (other) {
return other.reduce(changeOrder(indices, indicesMap), []);
})));
};
};
function isSorted(ary) {
return ary.every(function (value, idx) {
return idx === 0 || ary[idx - 1].toLowerCase() <= value.toLowerCase();
});
}
function check(group) {
var texts = group.map(function (decl) {
return sourceCode.getText(decl);
});
var requireArgs = group.map(function (decl) {
try {
return decl.declarations[0].init.arguments[0].raw || '';
} catch (e) {
return '';
}
});
if (!isSorted(requireArgs)) {
var _arrayMultisort = arrayMultisort(function (a, b) {
var aLower = a.toLowerCase();
var bLower = b.toLowerCase();
return aLower < bLower ? -1 : aLower > bLower ? 1 : 0;
})(requireArgs, texts),
_arrayMultisort2 = _slicedToArray(_arrayMultisort, 2),
requireArgsSorted = _arrayMultisort2[0],
textsSorted = _arrayMultisort2[1];
context.report({
loc: { start: group[0].loc.start, end: last(group).loc.end },
message: 'This group of requires is not sorted',
fix: function fix(fixer) {
return fixer.replaceTextRange([group[0].start, last(group).end], textsSorted.join('\n'));
}
});
}
}
function last(ary) {
return ary[ary.length - 1];
}
function shouldStartNewGroup(node, previousNode) {
if (!previousNode) return true;
if (node.parent !== previousNode.parent) return true;
var lineOfNode = sourceCode.getFirstToken(node).loc.start.line;
var lineOfPrev = sourceCode.getLastToken(previousNode).loc.start.line;
return lineOfNode - lineOfPrev !== 1;
}
return {
VariableDeclaration: function VariableDeclaration(node) {
if (!hasRequire.test(sourceCode.getText(node))) return;
if (shouldStartNewGroup(node, previousNode)) {
groups.push([node]);
} else {
last(groups).push(node);
}
previousNode = node;
},
'Program:exit': function ProgramExit(node) {
groups.forEach(check);
}
};
}
};