UNPKG

eslint-plugin-perfectionist

Version:

ESLint plugin for sorting various data such as objects, imports, types, enums, JSX props, etc.

130 lines (129 loc) 4.49 kB
'use strict' const commonJsonSchemas = require('../utils/common-json-schemas.js') const validateCustomSortConfiguration = require('../utils/validate-custom-sort-configuration.js') const validateGroupsConfiguration = require('../utils/validate-groups-configuration.js') const getEslintDisabledLines = require('../utils/get-eslint-disabled-lines.js') const isNodeEslintDisabled = require('../utils/is-node-eslint-disabled.js') const reportErrors = require('../utils/report-errors.js') const sortNodesByGroups = require('../utils/sort-nodes-by-groups.js') const createEslintRule = require('../utils/create-eslint-rule.js') const reportAllErrors = require('../utils/report-all-errors.js') const rangeToDiff = require('../utils/range-to-diff.js') const getSettings = require('../utils/get-settings.js') const isSortable = require('../utils/is-sortable.js') const useGroups = require('../utils/use-groups.js') const complete = require('../utils/complete.js') let defaultOptions = { fallbackSort: { type: 'unsorted' }, specialCharacters: 'keep', type: 'alphabetical', ignoreCase: true, customGroups: {}, locales: 'en-US', alphabet: '', order: 'asc', groups: [], } const sortHeritageClauses = createEslintRule.createEslintRule({ meta: { schema: [ { properties: { ...commonJsonSchemas.commonJsonSchemas, customGroups: commonJsonSchemas.customGroupsJsonSchema, groups: commonJsonSchemas.groupsJsonSchema, }, additionalProperties: false, type: 'object', }, ], docs: { url: 'https://perfectionist.dev/rules/sort-heritage-clauses', description: 'Enforce sorted heritage clauses.', recommended: true, }, messages: { unexpectedHeritageClausesGroupOrder: reportErrors.GROUP_ORDER_ERROR, unexpectedHeritageClausesOrder: reportErrors.ORDER_ERROR, }, type: 'suggestion', fixable: 'code', }, create: context => { let settings = getSettings.getSettings(context.settings) let options = complete.complete( context.options.at(0), settings, defaultOptions, ) validateCustomSortConfiguration.validateCustomSortConfiguration(options) validateGroupsConfiguration.validateGroupsConfiguration({ allowedCustomGroups: Object.keys(options.customGroups), allowedPredefinedGroups: ['unknown'], options, }) return { TSInterfaceDeclaration: declaration => sortHeritageClauses$1(context, options, declaration.extends), ClassDeclaration: declaration => sortHeritageClauses$1(context, options, declaration.implements), } }, defaultOptions: [defaultOptions], name: 'sort-heritage-clauses', }) let sortHeritageClauses$1 = (context, options, heritageClauses) => { if (!isSortable.isSortable(heritageClauses)) { return } let { sourceCode, id } = context let eslintDisabledLines = getEslintDisabledLines.getEslintDisabledLines({ ruleName: id, sourceCode, }) let nodes = heritageClauses.map(heritageClause => { let name = getHeritageClauseExpressionName(heritageClause.expression) let { setCustomGroups, getGroup } = useGroups.useGroups(options) setCustomGroups(options.customGroups, name) return { isEslintDisabled: isNodeEslintDisabled.isNodeEslintDisabled( heritageClause, eslintDisabledLines, ), size: rangeToDiff.rangeToDiff(heritageClause, sourceCode), node: heritageClause, group: getGroup(), name, } }) let sortNodesExcludingEslintDisabled = ignoreEslintDisabledNodes => sortNodesByGroups.sortNodesByGroups({ getOptionsByGroupNumber: () => ({ options }), ignoreEslintDisabledNodes, groups: options.groups, nodes, }) reportAllErrors.reportAllErrors({ availableMessageIds: { unexpectedGroupOrder: 'unexpectedHeritageClausesGroupOrder', unexpectedOrder: 'unexpectedHeritageClausesOrder', }, sortNodesExcludingEslintDisabled, sourceCode, options, context, nodes, }) } let getHeritageClauseExpressionName = expression => { if (expression.type === 'Identifier') { return expression.name } if ('property' in expression) { return getHeritageClauseExpressionName(expression.property) } throw new Error( 'Unexpected heritage clause expression. Please report this issue here: https://github.com/azat-io/eslint-plugin-perfectionist/issues', ) } module.exports = sortHeritageClauses