eslint-plugin-perfectionist 4.1.2 → 4.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/alphabet.d.ts +176 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +9 -1
- package/dist/rules/sort-array-includes.js +6 -1
- package/dist/rules/sort-classes-utils.js +0 -23
- package/dist/rules/sort-classes.js +19 -43
- package/dist/rules/sort-classes.types.js +5 -37
- package/dist/rules/sort-decorators.js +9 -1
- package/dist/rules/sort-enums.js +11 -1
- package/dist/rules/sort-exports.js +8 -1
- package/dist/rules/sort-heritage-clauses.js +4 -0
- package/dist/rules/sort-imports.js +8 -3
- package/dist/rules/sort-interfaces.js +17 -260
- package/dist/rules/sort-intersection-types.js +9 -1
- package/dist/rules/sort-jsx-props.js +4 -0
- package/dist/rules/sort-maps.js +8 -1
- package/dist/rules/sort-modules-utils.js +0 -23
- package/dist/rules/sort-modules.js +20 -44
- package/dist/rules/sort-modules.types.js +5 -41
- package/dist/rules/sort-named-exports.js +8 -1
- package/dist/rules/sort-named-imports.js +8 -1
- package/dist/rules/sort-object-types-utils.js +37 -0
- package/dist/rules/sort-object-types.js +345 -223
- package/dist/rules/sort-object-types.types.js +20 -0
- package/dist/rules/sort-objects.js +36 -10
- package/dist/rules/sort-switch-case.js +4 -0
- package/dist/rules/sort-union-types.js +9 -1
- package/dist/rules/sort-variable-declarations.js +8 -1
- package/dist/utils/alphabet.js +385 -0
- package/dist/utils/common-json-schemas.js +94 -1
- package/dist/utils/compare.js +88 -39
- package/dist/utils/convert-boolean-to-sign.js +4 -0
- package/dist/utils/get-comments-before.js +4 -4
- package/dist/utils/get-custom-groups-compare-options.js +29 -0
- package/dist/utils/get-matching-context-options.js +18 -0
- package/dist/utils/get-node-range.js +18 -7
- package/dist/utils/get-settings.js +1 -0
- package/dist/utils/is-node-function-type.js +15 -0
- package/dist/utils/make-fixes.js +24 -3
- package/dist/utils/make-newlines-fixes.js +7 -4
- package/dist/utils/validate-custom-sort-configuration.js +11 -0
- package/dist/{rules → utils}/validate-generated-groups-configuration.js +4 -2
- package/package.json +9 -5
- package/readme.md +4 -3
|
@@ -1,16 +1,26 @@
|
|
|
1
1
|
'use strict'
|
|
2
|
+
Object.defineProperties(exports, {
|
|
3
|
+
__esModule: { value: true },
|
|
4
|
+
[Symbol.toStringTag]: { value: 'Module' },
|
|
5
|
+
})
|
|
2
6
|
const commonJsonSchemas = require('../utils/common-json-schemas.js')
|
|
3
7
|
const validateNewlinesAndPartitionConfiguration = require('../utils/validate-newlines-and-partition-configuration.js')
|
|
4
|
-
const
|
|
8
|
+
const validateGeneratedGroupsConfiguration = require('../utils/validate-generated-groups-configuration.js')
|
|
9
|
+
const validateCustomSortConfiguration = require('../utils/validate-custom-sort-configuration.js')
|
|
10
|
+
const getCustomGroupsCompareOptions = require('../utils/get-custom-groups-compare-options.js')
|
|
11
|
+
const generatePredefinedGroups = require('../utils/generate-predefined-groups.js')
|
|
5
12
|
const getEslintDisabledLines = require('../utils/get-eslint-disabled-lines.js')
|
|
13
|
+
const sortObjectTypes_types = require('./sort-object-types.types.js')
|
|
6
14
|
const isNodeEslintDisabled = require('../utils/is-node-eslint-disabled.js')
|
|
7
15
|
const isPartitionComment = require('../utils/is-partition-comment.js')
|
|
16
|
+
const isNodeFunctionType = require('../utils/is-node-function-type.js')
|
|
8
17
|
const sortNodesByGroups = require('../utils/sort-nodes-by-groups.js')
|
|
9
18
|
const getCommentsBefore = require('../utils/get-comments-before.js')
|
|
10
19
|
const makeNewlinesFixes = require('../utils/make-newlines-fixes.js')
|
|
11
20
|
const getNewlinesErrors = require('../utils/get-newlines-errors.js')
|
|
12
21
|
const createEslintRule = require('../utils/create-eslint-rule.js')
|
|
13
22
|
const isMemberOptional = require('../utils/is-member-optional.js')
|
|
23
|
+
const sortObjectTypesUtils = require('./sort-object-types-utils.js')
|
|
14
24
|
const getLinesBetween = require('../utils/get-lines-between.js')
|
|
15
25
|
const getGroupNumber = require('../utils/get-group-number.js')
|
|
16
26
|
const getSourceCode = require('../utils/get-source-code.js')
|
|
@@ -22,6 +32,8 @@ const makeFixes = require('../utils/make-fixes.js')
|
|
|
22
32
|
const useGroups = require('../utils/use-groups.js')
|
|
23
33
|
const complete = require('../utils/complete.js')
|
|
24
34
|
const pairwise = require('../utils/pairwise.js')
|
|
35
|
+
const matches = require('../utils/matches.js')
|
|
36
|
+
let cachedGroupsByModifiersAndSelectors = /* @__PURE__ */ new Map()
|
|
25
37
|
let defaultOptions = {
|
|
26
38
|
partitionByComment: false,
|
|
27
39
|
partitionByNewLine: false,
|
|
@@ -29,235 +41,58 @@ let defaultOptions = {
|
|
|
29
41
|
specialCharacters: 'keep',
|
|
30
42
|
type: 'alphabetical',
|
|
31
43
|
groupKind: 'mixed',
|
|
44
|
+
ignorePattern: [],
|
|
32
45
|
ignoreCase: true,
|
|
33
46
|
customGroups: {},
|
|
34
47
|
locales: 'en-US',
|
|
48
|
+
alphabet: '',
|
|
35
49
|
order: 'asc',
|
|
36
50
|
groups: [],
|
|
37
51
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
settings,
|
|
48
|
-
defaultOptions,
|
|
49
|
-
)
|
|
50
|
-
validateGroupsConfiguration.validateGroupsConfiguration(
|
|
51
|
-
options.groups,
|
|
52
|
-
['multiline', 'method', 'unknown'],
|
|
53
|
-
Object.keys(options.customGroups),
|
|
54
|
-
)
|
|
55
|
-
validateNewlinesAndPartitionConfiguration.validateNewlinesAndPartitionConfiguration(
|
|
56
|
-
options,
|
|
57
|
-
)
|
|
58
|
-
let sourceCode = getSourceCode.getSourceCode(context)
|
|
59
|
-
let eslintDisabledLines = getEslintDisabledLines.getEslintDisabledLines({
|
|
60
|
-
ruleName: context.id,
|
|
61
|
-
sourceCode,
|
|
62
|
-
})
|
|
63
|
-
let formattedMembers = node.members.reduce(
|
|
64
|
-
(accumulator, member) => {
|
|
65
|
-
var _a, _b, _c, _d, _e
|
|
66
|
-
let name
|
|
67
|
-
let lastSortingNode =
|
|
68
|
-
(_a = accumulator.at(-1)) == null ? void 0 : _a.at(-1)
|
|
69
|
-
let { setCustomGroups, defineGroup, getGroup } =
|
|
70
|
-
useGroups.useGroups(options)
|
|
71
|
-
let formatName = value => value.replace(/[,;]$/u, '')
|
|
72
|
-
if (member.type === 'TSPropertySignature') {
|
|
73
|
-
if (member.key.type === 'Identifier') {
|
|
74
|
-
;({ name } = member.key)
|
|
75
|
-
} else if (member.key.type === 'Literal') {
|
|
76
|
-
name = `${member.key.value}`
|
|
77
|
-
} else {
|
|
78
|
-
name = sourceCode.text.slice(
|
|
79
|
-
member.range.at(0),
|
|
80
|
-
((_b = member.typeAnnotation) == null
|
|
81
|
-
? void 0
|
|
82
|
-
: _b.range.at(0)) ?? member.range.at(1),
|
|
83
|
-
)
|
|
84
|
-
}
|
|
85
|
-
} else if (member.type === 'TSIndexSignature') {
|
|
86
|
-
let endIndex =
|
|
87
|
-
((_c = member.typeAnnotation) == null
|
|
88
|
-
? void 0
|
|
89
|
-
: _c.range.at(0)) ?? member.range.at(1)
|
|
90
|
-
name = formatName(
|
|
91
|
-
sourceCode.text.slice(member.range.at(0), endIndex),
|
|
92
|
-
)
|
|
93
|
-
} else {
|
|
94
|
-
name = formatName(
|
|
95
|
-
sourceCode.text.slice(member.range.at(0), member.range.at(1)),
|
|
96
|
-
)
|
|
97
|
-
}
|
|
98
|
-
setCustomGroups(options.customGroups, name)
|
|
99
|
-
if (
|
|
100
|
-
member.type === 'TSMethodSignature' ||
|
|
101
|
-
(member.type === 'TSPropertySignature' &&
|
|
102
|
-
((_d = member.typeAnnotation) == null
|
|
103
|
-
? void 0
|
|
104
|
-
: _d.typeAnnotation.type) === 'TSFunctionType')
|
|
105
|
-
) {
|
|
106
|
-
defineGroup('method')
|
|
107
|
-
}
|
|
108
|
-
if (member.loc.start.line !== member.loc.end.line) {
|
|
109
|
-
defineGroup('multiline')
|
|
110
|
-
}
|
|
111
|
-
let sortingNode = {
|
|
112
|
-
isEslintDisabled: isNodeEslintDisabled.isNodeEslintDisabled(
|
|
113
|
-
member,
|
|
114
|
-
eslintDisabledLines,
|
|
115
|
-
),
|
|
116
|
-
groupKind: isMemberOptional.isMemberOptional(member)
|
|
117
|
-
? 'optional'
|
|
118
|
-
: 'required',
|
|
119
|
-
size: rangeToDiff.rangeToDiff(member, sourceCode),
|
|
120
|
-
addSafetySemicolonWhenInline: true,
|
|
121
|
-
group: getGroup(),
|
|
122
|
-
node: member,
|
|
123
|
-
name,
|
|
124
|
-
}
|
|
125
|
-
if (
|
|
126
|
-
(options.partitionByComment &&
|
|
127
|
-
isPartitionComment.hasPartitionComment(
|
|
128
|
-
options.partitionByComment,
|
|
129
|
-
getCommentsBefore.getCommentsBefore(member, sourceCode),
|
|
130
|
-
)) ||
|
|
131
|
-
(options.partitionByNewLine &&
|
|
132
|
-
lastSortingNode &&
|
|
133
|
-
getLinesBetween.getLinesBetween(
|
|
134
|
-
sourceCode,
|
|
135
|
-
lastSortingNode,
|
|
136
|
-
sortingNode,
|
|
137
|
-
))
|
|
138
|
-
) {
|
|
139
|
-
accumulator.push([])
|
|
140
|
-
}
|
|
141
|
-
;(_e = accumulator.at(-1)) == null ? void 0 : _e.push(sortingNode)
|
|
142
|
-
return accumulator
|
|
143
|
-
},
|
|
144
|
-
[[]],
|
|
145
|
-
)
|
|
146
|
-
let groupKindOrder
|
|
147
|
-
if (options.groupKind === 'required-first') {
|
|
148
|
-
groupKindOrder = ['required', 'optional']
|
|
149
|
-
} else if (options.groupKind === 'optional-first') {
|
|
150
|
-
groupKindOrder = ['optional', 'required']
|
|
151
|
-
} else {
|
|
152
|
-
groupKindOrder = ['any']
|
|
153
|
-
}
|
|
154
|
-
for (let nodes of formattedMembers) {
|
|
155
|
-
let filteredGroupKindNodes = groupKindOrder.map(groupKind =>
|
|
156
|
-
nodes.filter(
|
|
157
|
-
currentNode =>
|
|
158
|
-
groupKind === 'any' || currentNode.groupKind === groupKind,
|
|
159
|
-
),
|
|
160
|
-
)
|
|
161
|
-
let sortNodesExcludingEslintDisabled = ignoreEslintDisabledNodes =>
|
|
162
|
-
filteredGroupKindNodes.flatMap(groupedNodes =>
|
|
163
|
-
sortNodesByGroups.sortNodesByGroups(groupedNodes, options, {
|
|
164
|
-
ignoreEslintDisabledNodes,
|
|
165
|
-
}),
|
|
166
|
-
)
|
|
167
|
-
let sortedNodes = sortNodesExcludingEslintDisabled(false)
|
|
168
|
-
let sortedNodesExcludingEslintDisabled =
|
|
169
|
-
sortNodesExcludingEslintDisabled(true)
|
|
170
|
-
pairwise.pairwise(nodes, (left, right) => {
|
|
171
|
-
let leftNumber = getGroupNumber.getGroupNumber(options.groups, left)
|
|
172
|
-
let rightNumber = getGroupNumber.getGroupNumber(options.groups, right)
|
|
173
|
-
let indexOfLeft = sortedNodes.indexOf(left)
|
|
174
|
-
let indexOfRight = sortedNodes.indexOf(right)
|
|
175
|
-
let indexOfRightExcludingEslintDisabled =
|
|
176
|
-
sortedNodesExcludingEslintDisabled.indexOf(right)
|
|
177
|
-
let messageIds = []
|
|
178
|
-
if (
|
|
179
|
-
indexOfLeft > indexOfRight ||
|
|
180
|
-
indexOfLeft >= indexOfRightExcludingEslintDisabled
|
|
181
|
-
) {
|
|
182
|
-
messageIds.push(
|
|
183
|
-
leftNumber === rightNumber
|
|
184
|
-
? 'unexpectedObjectTypesOrder'
|
|
185
|
-
: 'unexpectedObjectTypesGroupOrder',
|
|
186
|
-
)
|
|
187
|
-
}
|
|
188
|
-
messageIds = [
|
|
189
|
-
...messageIds,
|
|
190
|
-
...getNewlinesErrors.getNewlinesErrors({
|
|
191
|
-
missedSpacingError: 'missedSpacingBetweenObjectTypeMembers',
|
|
192
|
-
extraSpacingError: 'extraSpacingBetweenObjectTypeMembers',
|
|
193
|
-
rightNum: rightNumber,
|
|
194
|
-
leftNum: leftNumber,
|
|
195
|
-
sourceCode,
|
|
196
|
-
options,
|
|
197
|
-
right,
|
|
198
|
-
left,
|
|
199
|
-
}),
|
|
200
|
-
]
|
|
201
|
-
for (let messageId of messageIds) {
|
|
202
|
-
context.report({
|
|
203
|
-
fix: fixer => [
|
|
204
|
-
...makeFixes.makeFixes({
|
|
205
|
-
sortedNodes: sortedNodesExcludingEslintDisabled,
|
|
206
|
-
sourceCode,
|
|
207
|
-
options,
|
|
208
|
-
fixer,
|
|
209
|
-
nodes,
|
|
210
|
-
}),
|
|
211
|
-
...makeNewlinesFixes.makeNewlinesFixes({
|
|
212
|
-
sortedNodes: sortedNodesExcludingEslintDisabled,
|
|
213
|
-
sourceCode,
|
|
214
|
-
options,
|
|
215
|
-
fixer,
|
|
216
|
-
nodes,
|
|
217
|
-
}),
|
|
218
|
-
],
|
|
219
|
-
data: {
|
|
220
|
-
right: toSingleLine.toSingleLine(right.name),
|
|
221
|
-
left: toSingleLine.toSingleLine(left.name),
|
|
222
|
-
rightGroup: right.group,
|
|
223
|
-
leftGroup: left.group,
|
|
224
|
-
},
|
|
225
|
-
node: right.node,
|
|
226
|
-
messageId,
|
|
227
|
-
})
|
|
228
|
-
}
|
|
229
|
-
})
|
|
230
|
-
}
|
|
52
|
+
let jsonSchema = {
|
|
53
|
+
properties: {
|
|
54
|
+
ignorePattern: {
|
|
55
|
+
description:
|
|
56
|
+
'Specifies names or patterns for nodes that should be ignored by rule.',
|
|
57
|
+
items: {
|
|
58
|
+
type: 'string',
|
|
59
|
+
},
|
|
60
|
+
type: 'array',
|
|
231
61
|
},
|
|
232
|
-
|
|
62
|
+
partitionByComment: {
|
|
63
|
+
...commonJsonSchemas.partitionByCommentJsonSchema,
|
|
64
|
+
description:
|
|
65
|
+
'Allows you to use comments to separate members into logical groups.',
|
|
66
|
+
},
|
|
67
|
+
customGroups: {
|
|
68
|
+
oneOf: [
|
|
69
|
+
commonJsonSchemas.customGroupsJsonSchema,
|
|
70
|
+
commonJsonSchemas.buildCustomGroupsArrayJsonSchema({
|
|
71
|
+
singleCustomGroupJsonSchema:
|
|
72
|
+
sortObjectTypes_types.singleCustomGroupJsonSchema,
|
|
73
|
+
}),
|
|
74
|
+
],
|
|
75
|
+
},
|
|
76
|
+
groupKind: {
|
|
77
|
+
enum: ['mixed', 'required-first', 'optional-first'],
|
|
78
|
+
description: 'Specifies top-level groups.',
|
|
79
|
+
type: 'string',
|
|
80
|
+
},
|
|
81
|
+
partitionByNewLine: commonJsonSchemas.partitionByNewLineJsonSchema,
|
|
82
|
+
specialCharacters: commonJsonSchemas.specialCharactersJsonSchema,
|
|
83
|
+
newlinesBetween: commonJsonSchemas.newlinesBetweenJsonSchema,
|
|
84
|
+
ignoreCase: commonJsonSchemas.ignoreCaseJsonSchema,
|
|
85
|
+
alphabet: commonJsonSchemas.alphabetJsonSchema,
|
|
86
|
+
locales: commonJsonSchemas.localesJsonSchema,
|
|
87
|
+
groups: commonJsonSchemas.groupsJsonSchema,
|
|
88
|
+
order: commonJsonSchemas.orderJsonSchema,
|
|
89
|
+
type: commonJsonSchemas.typeJsonSchema,
|
|
90
|
+
},
|
|
91
|
+
additionalProperties: false,
|
|
92
|
+
type: 'object',
|
|
93
|
+
}
|
|
94
|
+
const sortObjectTypes = createEslintRule.createEslintRule({
|
|
233
95
|
meta: {
|
|
234
|
-
schema: [
|
|
235
|
-
{
|
|
236
|
-
properties: {
|
|
237
|
-
partitionByComment: {
|
|
238
|
-
...commonJsonSchemas.partitionByCommentJsonSchema,
|
|
239
|
-
description:
|
|
240
|
-
'Allows you to use comments to separate the type members into logical groups.',
|
|
241
|
-
},
|
|
242
|
-
groupKind: {
|
|
243
|
-
enum: ['mixed', 'required-first', 'optional-first'],
|
|
244
|
-
description: 'Specifies top-level groups.',
|
|
245
|
-
type: 'string',
|
|
246
|
-
},
|
|
247
|
-
partitionByNewLine: commonJsonSchemas.partitionByNewLineJsonSchema,
|
|
248
|
-
specialCharacters: commonJsonSchemas.specialCharactersJsonSchema,
|
|
249
|
-
newlinesBetween: commonJsonSchemas.newlinesBetweenJsonSchema,
|
|
250
|
-
customGroups: commonJsonSchemas.customGroupsJsonSchema,
|
|
251
|
-
ignoreCase: commonJsonSchemas.ignoreCaseJsonSchema,
|
|
252
|
-
locales: commonJsonSchemas.localesJsonSchema,
|
|
253
|
-
groups: commonJsonSchemas.groupsJsonSchema,
|
|
254
|
-
order: commonJsonSchemas.orderJsonSchema,
|
|
255
|
-
type: commonJsonSchemas.typeJsonSchema,
|
|
256
|
-
},
|
|
257
|
-
additionalProperties: false,
|
|
258
|
-
type: 'object',
|
|
259
|
-
},
|
|
260
|
-
],
|
|
261
96
|
messages: {
|
|
262
97
|
unexpectedObjectTypesGroupOrder:
|
|
263
98
|
'Expected "{{right}}" ({{rightGroup}}) to come before "{{left}}" ({{leftGroup}}).',
|
|
@@ -273,10 +108,297 @@ const sortObjectTypes = createEslintRule.createEslintRule({
|
|
|
273
108
|
description: 'Enforce sorted object types.',
|
|
274
109
|
recommended: true,
|
|
275
110
|
},
|
|
111
|
+
schema: [jsonSchema],
|
|
276
112
|
type: 'suggestion',
|
|
277
113
|
fixable: 'code',
|
|
278
114
|
},
|
|
115
|
+
create: context => ({
|
|
116
|
+
TSTypeLiteral: node =>
|
|
117
|
+
sortObjectTypeElements({
|
|
118
|
+
availableMessageIds: {
|
|
119
|
+
missedSpacingBetweenMembers: 'missedSpacingBetweenObjectTypeMembers',
|
|
120
|
+
extraSpacingBetweenMembers: 'extraSpacingBetweenObjectTypeMembers',
|
|
121
|
+
unexpectedGroupOrder: 'unexpectedObjectTypesGroupOrder',
|
|
122
|
+
unexpectedOrder: 'unexpectedObjectTypesOrder',
|
|
123
|
+
},
|
|
124
|
+
parentNodeName:
|
|
125
|
+
node.parent.type === 'TSTypeAliasDeclaration'
|
|
126
|
+
? node.parent.id.name
|
|
127
|
+
: null,
|
|
128
|
+
elements: node.members,
|
|
129
|
+
context,
|
|
130
|
+
}),
|
|
131
|
+
}),
|
|
279
132
|
defaultOptions: [defaultOptions],
|
|
280
133
|
name: 'sort-object-types',
|
|
281
134
|
})
|
|
282
|
-
|
|
135
|
+
let sortObjectTypeElements = ({
|
|
136
|
+
availableMessageIds,
|
|
137
|
+
parentNodeName,
|
|
138
|
+
elements,
|
|
139
|
+
context,
|
|
140
|
+
}) => {
|
|
141
|
+
if (!isSortable.isSortable(elements)) {
|
|
142
|
+
return
|
|
143
|
+
}
|
|
144
|
+
let settings = getSettings.getSettings(context.settings)
|
|
145
|
+
let options = complete.complete(
|
|
146
|
+
context.options.at(0),
|
|
147
|
+
settings,
|
|
148
|
+
defaultOptions,
|
|
149
|
+
)
|
|
150
|
+
validateCustomSortConfiguration.validateCustomSortConfiguration(options)
|
|
151
|
+
validateGeneratedGroupsConfiguration.validateGeneratedGroupsConfiguration({
|
|
152
|
+
customGroups: options.customGroups,
|
|
153
|
+
selectors: sortObjectTypes_types.allSelectors,
|
|
154
|
+
modifiers: sortObjectTypes_types.allModifiers,
|
|
155
|
+
groups: options.groups,
|
|
156
|
+
})
|
|
157
|
+
validateNewlinesAndPartitionConfiguration.validateNewlinesAndPartitionConfiguration(
|
|
158
|
+
options,
|
|
159
|
+
)
|
|
160
|
+
if (
|
|
161
|
+
options.ignorePattern.some(
|
|
162
|
+
pattern => parentNodeName && matches.matches(parentNodeName, pattern),
|
|
163
|
+
)
|
|
164
|
+
) {
|
|
165
|
+
return
|
|
166
|
+
}
|
|
167
|
+
let sourceCode = getSourceCode.getSourceCode(context)
|
|
168
|
+
let eslintDisabledLines = getEslintDisabledLines.getEslintDisabledLines({
|
|
169
|
+
ruleName: context.id,
|
|
170
|
+
sourceCode,
|
|
171
|
+
})
|
|
172
|
+
let formattedMembers = elements.reduce(
|
|
173
|
+
(accumulator, typeElement) => {
|
|
174
|
+
var _a, _b, _c, _d
|
|
175
|
+
if (typeElement.type === 'TSCallSignatureDeclaration') {
|
|
176
|
+
accumulator.push([])
|
|
177
|
+
return accumulator
|
|
178
|
+
}
|
|
179
|
+
let name
|
|
180
|
+
let lastSortingNode =
|
|
181
|
+
(_a = accumulator.at(-1)) == null ? void 0 : _a.at(-1)
|
|
182
|
+
let { setCustomGroups, defineGroup, getGroup } =
|
|
183
|
+
useGroups.useGroups(options)
|
|
184
|
+
let formatName = value => value.replace(/[,;]$/u, '')
|
|
185
|
+
if (typeElement.type === 'TSPropertySignature') {
|
|
186
|
+
if (typeElement.key.type === 'Identifier') {
|
|
187
|
+
;({ name } = typeElement.key)
|
|
188
|
+
} else if (typeElement.key.type === 'Literal') {
|
|
189
|
+
name = `${typeElement.key.value}`
|
|
190
|
+
} else {
|
|
191
|
+
let end =
|
|
192
|
+
((_b = typeElement.typeAnnotation) == null
|
|
193
|
+
? void 0
|
|
194
|
+
: _b.range.at(0)) ??
|
|
195
|
+
typeElement.range.at(1) - (typeElement.optional ? '?'.length : 0)
|
|
196
|
+
name = sourceCode.text.slice(typeElement.range.at(0), end)
|
|
197
|
+
}
|
|
198
|
+
} else if (typeElement.type === 'TSIndexSignature') {
|
|
199
|
+
let endIndex =
|
|
200
|
+
((_c = typeElement.typeAnnotation) == null
|
|
201
|
+
? void 0
|
|
202
|
+
: _c.range.at(0)) ?? typeElement.range.at(1)
|
|
203
|
+
name = formatName(
|
|
204
|
+
sourceCode.text.slice(typeElement.range.at(0), endIndex),
|
|
205
|
+
)
|
|
206
|
+
} else if (
|
|
207
|
+
typeElement.type === 'TSMethodSignature' &&
|
|
208
|
+
'name' in typeElement.key
|
|
209
|
+
) {
|
|
210
|
+
;({ name } = typeElement.key)
|
|
211
|
+
} else {
|
|
212
|
+
name = formatName(
|
|
213
|
+
sourceCode.text.slice(
|
|
214
|
+
typeElement.range.at(0),
|
|
215
|
+
typeElement.range.at(1),
|
|
216
|
+
),
|
|
217
|
+
)
|
|
218
|
+
}
|
|
219
|
+
let selectors = []
|
|
220
|
+
let modifiers = []
|
|
221
|
+
if (typeElement.type === 'TSIndexSignature') {
|
|
222
|
+
selectors.push('index-signature')
|
|
223
|
+
}
|
|
224
|
+
if (isNodeFunctionType.isNodeFunctionType(typeElement)) {
|
|
225
|
+
selectors.push('method')
|
|
226
|
+
}
|
|
227
|
+
if (typeElement.loc.start.line !== typeElement.loc.end.line) {
|
|
228
|
+
modifiers.push('multiline')
|
|
229
|
+
selectors.push('multiline')
|
|
230
|
+
}
|
|
231
|
+
if (
|
|
232
|
+
!selectors.includes('index-signature') &&
|
|
233
|
+
!selectors.includes('method')
|
|
234
|
+
) {
|
|
235
|
+
selectors.push('property')
|
|
236
|
+
}
|
|
237
|
+
selectors.push('member')
|
|
238
|
+
if (isMemberOptional.isMemberOptional(typeElement)) {
|
|
239
|
+
modifiers.push('optional')
|
|
240
|
+
} else {
|
|
241
|
+
modifiers.push('required')
|
|
242
|
+
}
|
|
243
|
+
for (let predefinedGroup of generatePredefinedGroups.generatePredefinedGroups(
|
|
244
|
+
{
|
|
245
|
+
cache: cachedGroupsByModifiersAndSelectors,
|
|
246
|
+
selectors,
|
|
247
|
+
modifiers,
|
|
248
|
+
},
|
|
249
|
+
)) {
|
|
250
|
+
defineGroup(predefinedGroup)
|
|
251
|
+
}
|
|
252
|
+
if (Array.isArray(options.customGroups)) {
|
|
253
|
+
for (let customGroup of options.customGroups) {
|
|
254
|
+
if (
|
|
255
|
+
sortObjectTypesUtils.customGroupMatches({
|
|
256
|
+
elementName: name,
|
|
257
|
+
customGroup,
|
|
258
|
+
selectors,
|
|
259
|
+
modifiers,
|
|
260
|
+
})
|
|
261
|
+
) {
|
|
262
|
+
defineGroup(customGroup.groupName, true)
|
|
263
|
+
if (getGroup() === customGroup.groupName) {
|
|
264
|
+
break
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
} else {
|
|
269
|
+
setCustomGroups(options.customGroups, name, {
|
|
270
|
+
override: true,
|
|
271
|
+
})
|
|
272
|
+
}
|
|
273
|
+
let sortingNode = {
|
|
274
|
+
isEslintDisabled: isNodeEslintDisabled.isNodeEslintDisabled(
|
|
275
|
+
typeElement,
|
|
276
|
+
eslintDisabledLines,
|
|
277
|
+
),
|
|
278
|
+
groupKind: isMemberOptional.isMemberOptional(typeElement)
|
|
279
|
+
? 'optional'
|
|
280
|
+
: 'required',
|
|
281
|
+
size: rangeToDiff.rangeToDiff(typeElement, sourceCode),
|
|
282
|
+
addSafetySemicolonWhenInline: true,
|
|
283
|
+
group: getGroup(),
|
|
284
|
+
node: typeElement,
|
|
285
|
+
name,
|
|
286
|
+
}
|
|
287
|
+
if (
|
|
288
|
+
(options.partitionByComment &&
|
|
289
|
+
isPartitionComment.hasPartitionComment(
|
|
290
|
+
options.partitionByComment,
|
|
291
|
+
getCommentsBefore.getCommentsBefore({
|
|
292
|
+
node: typeElement,
|
|
293
|
+
sourceCode,
|
|
294
|
+
}),
|
|
295
|
+
)) ||
|
|
296
|
+
(options.partitionByNewLine &&
|
|
297
|
+
lastSortingNode &&
|
|
298
|
+
getLinesBetween.getLinesBetween(
|
|
299
|
+
sourceCode,
|
|
300
|
+
lastSortingNode,
|
|
301
|
+
sortingNode,
|
|
302
|
+
))
|
|
303
|
+
) {
|
|
304
|
+
accumulator.push([])
|
|
305
|
+
}
|
|
306
|
+
;(_d = accumulator.at(-1)) == null ? void 0 : _d.push(sortingNode)
|
|
307
|
+
return accumulator
|
|
308
|
+
},
|
|
309
|
+
[[]],
|
|
310
|
+
)
|
|
311
|
+
let groupKindOrder
|
|
312
|
+
if (options.groupKind === 'required-first') {
|
|
313
|
+
groupKindOrder = ['required', 'optional']
|
|
314
|
+
} else if (options.groupKind === 'optional-first') {
|
|
315
|
+
groupKindOrder = ['optional', 'required']
|
|
316
|
+
} else {
|
|
317
|
+
groupKindOrder = ['any']
|
|
318
|
+
}
|
|
319
|
+
for (let nodes of formattedMembers) {
|
|
320
|
+
let filteredGroupKindNodes = groupKindOrder.map(groupKind =>
|
|
321
|
+
nodes.filter(
|
|
322
|
+
currentNode =>
|
|
323
|
+
groupKind === 'any' || currentNode.groupKind === groupKind,
|
|
324
|
+
),
|
|
325
|
+
)
|
|
326
|
+
let sortNodesExcludingEslintDisabled = ignoreEslintDisabledNodes =>
|
|
327
|
+
filteredGroupKindNodes.flatMap(groupedNodes =>
|
|
328
|
+
sortNodesByGroups.sortNodesByGroups(groupedNodes, options, {
|
|
329
|
+
getGroupCompareOptions: groupNumber =>
|
|
330
|
+
getCustomGroupsCompareOptions.getCustomGroupsCompareOptions(
|
|
331
|
+
options,
|
|
332
|
+
groupNumber,
|
|
333
|
+
),
|
|
334
|
+
ignoreEslintDisabledNodes,
|
|
335
|
+
}),
|
|
336
|
+
)
|
|
337
|
+
let sortedNodes = sortNodesExcludingEslintDisabled(false)
|
|
338
|
+
let sortedNodesExcludingEslintDisabled =
|
|
339
|
+
sortNodesExcludingEslintDisabled(true)
|
|
340
|
+
pairwise.pairwise(nodes, (left, right) => {
|
|
341
|
+
let leftNumber = getGroupNumber.getGroupNumber(options.groups, left)
|
|
342
|
+
let rightNumber = getGroupNumber.getGroupNumber(options.groups, right)
|
|
343
|
+
let indexOfLeft = sortedNodes.indexOf(left)
|
|
344
|
+
let indexOfRight = sortedNodes.indexOf(right)
|
|
345
|
+
let indexOfRightExcludingEslintDisabled =
|
|
346
|
+
sortedNodesExcludingEslintDisabled.indexOf(right)
|
|
347
|
+
let messageIds = []
|
|
348
|
+
if (
|
|
349
|
+
indexOfLeft > indexOfRight ||
|
|
350
|
+
indexOfLeft >= indexOfRightExcludingEslintDisabled
|
|
351
|
+
) {
|
|
352
|
+
messageIds.push(
|
|
353
|
+
leftNumber === rightNumber
|
|
354
|
+
? availableMessageIds.unexpectedOrder
|
|
355
|
+
: availableMessageIds.unexpectedGroupOrder,
|
|
356
|
+
)
|
|
357
|
+
}
|
|
358
|
+
messageIds = [
|
|
359
|
+
...messageIds,
|
|
360
|
+
...getNewlinesErrors.getNewlinesErrors({
|
|
361
|
+
missedSpacingError: availableMessageIds.missedSpacingBetweenMembers,
|
|
362
|
+
extraSpacingError: availableMessageIds.extraSpacingBetweenMembers,
|
|
363
|
+
rightNum: rightNumber,
|
|
364
|
+
leftNum: leftNumber,
|
|
365
|
+
sourceCode,
|
|
366
|
+
options,
|
|
367
|
+
right,
|
|
368
|
+
left,
|
|
369
|
+
}),
|
|
370
|
+
]
|
|
371
|
+
for (let messageId of messageIds) {
|
|
372
|
+
context.report({
|
|
373
|
+
fix: fixer => [
|
|
374
|
+
...makeFixes.makeFixes({
|
|
375
|
+
sortedNodes: sortedNodesExcludingEslintDisabled,
|
|
376
|
+
sourceCode,
|
|
377
|
+
options,
|
|
378
|
+
fixer,
|
|
379
|
+
nodes,
|
|
380
|
+
}),
|
|
381
|
+
...makeNewlinesFixes.makeNewlinesFixes({
|
|
382
|
+
sortedNodes: sortedNodesExcludingEslintDisabled,
|
|
383
|
+
sourceCode,
|
|
384
|
+
options,
|
|
385
|
+
fixer,
|
|
386
|
+
nodes,
|
|
387
|
+
}),
|
|
388
|
+
],
|
|
389
|
+
data: {
|
|
390
|
+
right: toSingleLine.toSingleLine(right.name),
|
|
391
|
+
left: toSingleLine.toSingleLine(left.name),
|
|
392
|
+
rightGroup: right.group,
|
|
393
|
+
leftGroup: left.group,
|
|
394
|
+
},
|
|
395
|
+
node: right.node,
|
|
396
|
+
messageId,
|
|
397
|
+
})
|
|
398
|
+
}
|
|
399
|
+
})
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
exports.default = sortObjectTypes
|
|
403
|
+
exports.jsonSchema = jsonSchema
|
|
404
|
+
exports.sortObjectTypeElements = sortObjectTypeElements
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })
|
|
3
|
+
const commonJsonSchemas = require('../utils/common-json-schemas.js')
|
|
4
|
+
let allSelectors = [
|
|
5
|
+
'index-signature',
|
|
6
|
+
'member',
|
|
7
|
+
'method',
|
|
8
|
+
'multiline',
|
|
9
|
+
'property',
|
|
10
|
+
]
|
|
11
|
+
let allModifiers = ['optional', 'required', 'multiline']
|
|
12
|
+
let singleCustomGroupJsonSchema = {
|
|
13
|
+
modifiers:
|
|
14
|
+
commonJsonSchemas.buildCustomGroupModifiersJsonSchema(allModifiers),
|
|
15
|
+
selector: commonJsonSchemas.buildCustomGroupSelectorJsonSchema(allSelectors),
|
|
16
|
+
elementNamePattern: commonJsonSchemas.elementNamePatternJsonSchema,
|
|
17
|
+
}
|
|
18
|
+
exports.allModifiers = allModifiers
|
|
19
|
+
exports.allSelectors = allSelectors
|
|
20
|
+
exports.singleCustomGroupJsonSchema = singleCustomGroupJsonSchema
|