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.
Files changed (44) hide show
  1. package/dist/alphabet.d.ts +176 -0
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.js +9 -1
  4. package/dist/rules/sort-array-includes.js +6 -1
  5. package/dist/rules/sort-classes-utils.js +0 -23
  6. package/dist/rules/sort-classes.js +19 -43
  7. package/dist/rules/sort-classes.types.js +5 -37
  8. package/dist/rules/sort-decorators.js +9 -1
  9. package/dist/rules/sort-enums.js +11 -1
  10. package/dist/rules/sort-exports.js +8 -1
  11. package/dist/rules/sort-heritage-clauses.js +4 -0
  12. package/dist/rules/sort-imports.js +8 -3
  13. package/dist/rules/sort-interfaces.js +17 -260
  14. package/dist/rules/sort-intersection-types.js +9 -1
  15. package/dist/rules/sort-jsx-props.js +4 -0
  16. package/dist/rules/sort-maps.js +8 -1
  17. package/dist/rules/sort-modules-utils.js +0 -23
  18. package/dist/rules/sort-modules.js +20 -44
  19. package/dist/rules/sort-modules.types.js +5 -41
  20. package/dist/rules/sort-named-exports.js +8 -1
  21. package/dist/rules/sort-named-imports.js +8 -1
  22. package/dist/rules/sort-object-types-utils.js +37 -0
  23. package/dist/rules/sort-object-types.js +345 -223
  24. package/dist/rules/sort-object-types.types.js +20 -0
  25. package/dist/rules/sort-objects.js +36 -10
  26. package/dist/rules/sort-switch-case.js +4 -0
  27. package/dist/rules/sort-union-types.js +9 -1
  28. package/dist/rules/sort-variable-declarations.js +8 -1
  29. package/dist/utils/alphabet.js +385 -0
  30. package/dist/utils/common-json-schemas.js +94 -1
  31. package/dist/utils/compare.js +88 -39
  32. package/dist/utils/convert-boolean-to-sign.js +4 -0
  33. package/dist/utils/get-comments-before.js +4 -4
  34. package/dist/utils/get-custom-groups-compare-options.js +29 -0
  35. package/dist/utils/get-matching-context-options.js +18 -0
  36. package/dist/utils/get-node-range.js +18 -7
  37. package/dist/utils/get-settings.js +1 -0
  38. package/dist/utils/is-node-function-type.js +15 -0
  39. package/dist/utils/make-fixes.js +24 -3
  40. package/dist/utils/make-newlines-fixes.js +7 -4
  41. package/dist/utils/validate-custom-sort-configuration.js +11 -0
  42. package/dist/{rules → utils}/validate-generated-groups-configuration.js +4 -2
  43. package/package.json +9 -5
  44. 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 validateGroupsConfiguration = require('../utils/validate-groups-configuration.js')
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
- const sortObjectTypes = createEslintRule.createEslintRule({
39
- create: context => ({
40
- TSTypeLiteral: node => {
41
- if (!isSortable.isSortable(node.members)) {
42
- return
43
- }
44
- let settings = getSettings.getSettings(context.settings)
45
- let options = complete.complete(
46
- context.options.at(0),
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
- module.exports = sortObjectTypes
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