UNPKG

eslint-plugin-canonical

Version:
76 lines (75 loc) 2.94 kB
"use strict"; 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', });