eslint-plugin-perfectionist
Version:
ESLint plugin for sorting various data such as objects, imports, types, enums, JSX props, etc.
113 lines (112 loc) • 4 kB
JavaScript
import {
buildCommonJsonSchemas,
buildUseConfigurationIfJsonSchema,
matchesAstSelectorJsonSchema,
useExperimentalDependencyDetectionJsonSchema,
} from '../utils/json-schemas/common-json-schemas.js'
import { buildCommonGroupsJsonSchemas } from '../utils/json-schemas/common-groups-json-schemas.js'
import {
DEPENDENCY_ORDER_ERROR,
EXTRA_SPACING_ERROR,
GROUP_ORDER_ERROR,
MISSED_SPACING_ERROR,
ORDER_ERROR,
} from '../utils/report-errors.js'
import {
partitionByCommentJsonSchema,
partitionByNewLineJsonSchema,
} from '../utils/json-schemas/common-partition-json-schemas.js'
import { buildAstListeners } from '../utils/build-ast-listeners.js'
import { createEslintRule } from '../utils/create-eslint-rule.js'
import { scopedRegexJsonSchema } from '../utils/json-schemas/scoped-regex-json-schema.js'
import {
DEPENDENCY_ORDER_ERROR_ID,
EXTRA_SPACING_ERROR_ID,
GROUP_ORDER_ERROR_ID,
MISSED_SPACING_ERROR_ID,
ORDER_ERROR_ID,
additionalCustomGroupMatchOptionsJsonSchema,
additionalSortOptionsJsonSchema,
} from './sort-objects/types.js'
import { defaultOptions, sortObject } from './sort-objects/sort-object.js'
import { AST_NODE_TYPES } from '@typescript-eslint/utils'
var sort_objects_default = createEslintRule({
meta: {
schema: {
items: {
properties: {
...buildCommonJsonSchemas({
additionalSortProperties: additionalSortOptionsJsonSchema,
}),
...buildCommonGroupsJsonSchemas({
additionalCustomGroupMatchProperties:
additionalCustomGroupMatchOptionsJsonSchema,
additionalSortProperties: additionalSortOptionsJsonSchema,
}),
useConfigurationIf: buildUseConfigurationIfJsonSchema({
additionalProperties: {
objectType: {
description:
'Specifies whether to only match destructured objects or regular objects.',
enum: ['destructured', 'non-destructured'],
type: 'string',
},
hasNumericKeysOnly: {
description:
'Specifies whether to only match objects that have exclusively numeric keys.',
type: 'boolean',
},
declarationCommentMatchesPattern: scopedRegexJsonSchema,
callingFunctionNamePattern: scopedRegexJsonSchema,
matchesAstSelector: matchesAstSelectorJsonSchema,
declarationMatchesPattern: scopedRegexJsonSchema,
},
}),
partitionByComputedKey: {
description:
'Controls whether to partition objects by computed keys.',
type: 'boolean',
},
styledComponents: {
description: 'Controls whether to sort styled components.',
type: 'boolean',
},
useExperimentalDependencyDetection:
useExperimentalDependencyDetectionJsonSchema,
partitionByComment: partitionByCommentJsonSchema,
partitionByNewLine: partitionByNewLineJsonSchema,
},
additionalProperties: false,
type: 'object',
},
uniqueItems: true,
type: 'array',
},
messages: {
[DEPENDENCY_ORDER_ERROR_ID]: DEPENDENCY_ORDER_ERROR,
[MISSED_SPACING_ERROR_ID]: MISSED_SPACING_ERROR,
[EXTRA_SPACING_ERROR_ID]: EXTRA_SPACING_ERROR,
[GROUP_ORDER_ERROR_ID]: GROUP_ORDER_ERROR,
[ORDER_ERROR_ID]: ORDER_ERROR,
},
docs: {
url: 'https://perfectionist.dev/rules/sort-objects',
description: 'Enforce sorted objects.',
recommended: true,
},
type: 'suggestion',
fixable: 'code',
},
create: context =>
buildAstListeners({
nodeTypes: [
AST_NODE_TYPES.ObjectPattern,
AST_NODE_TYPES.ObjectExpression,
],
sorter: sortObject,
context,
}),
defaultOptions: [defaultOptions],
name: 'sort-objects',
})
export { sort_objects_default as default }