eslint-plugin-canonical
Version:
Canonical linting rules for ESLint.
76 lines (75 loc) • 2.94 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const types_1 = require("@typescript-eslint/types");
const natural_orderby_1 = require("natural-orderby");
const utilities_1 = require("../utilities");
const defaultOptions = {
order: 'asc',
};
const messages = {
sort: 'Dependencies should be sorted alphabetically.',
};
exports.default = (0, utilities_1.createRule)({
create: (context, [options]) => {
const { order = 'asc' } = options;
return {
CallExpression(node) {
var _a;
const isTargetedHook = node.callee.type === 'Identifier' &&
['useEffect', 'useCallback', 'useMemo'].includes(node.callee.name);
if (!isTargetedHook) {
return;
}
const lastArgument = node.arguments[node.arguments.length - 1];
if (lastArgument.type !== 'ArrayExpression') {
return;
}
const elements = lastArgument.elements;
if (!elements.every((element) => {
return (element === null || element === void 0 ? void 0 : element.type) === types_1.AST_NODE_TYPES.Identifier;
})) {
return;
}
const sortedElements = (0, natural_orderby_1.orderBy)(elements, [value => value.name], [order]);
for (const [index, element] of elements.entries()) {
if ((element === null || element === void 0 ? void 0 : element.name) !== ((_a = sortedElements[index]) === null || _a === void 0 ? void 0 : _a.name)) {
context.report({
fix(fixer) {
const sortedCode = sortedElements
.map((sortedElement) => sortedElement.name)
.join(', ');
return fixer.replaceText(lastArgument, `[${sortedCode}]`);
},
messageId: 'sort',
node: lastArgument,
});
break;
}
}
},
};
},
defaultOptions: [defaultOptions],
meta: {
docs: {
description: 'Requires that dependencies of React methods are sorted alphabetically.',
},
fixable: 'code',
messages,
schema: [
{
additionalProperties: false,
properties: {
order: {
type: 'string',
enum: ['asc', 'desc'],
default: 'asc',
},
},
type: 'object',
},
],
type: 'suggestion',
},
name: 'sort-react-dependencies',
});