eslint-plugin-perfectionist 3.6.0 → 3.7.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 (42) hide show
  1. package/dist/index.d.ts +29 -4
  2. package/dist/rules/sort-array-includes.js +118 -60
  3. package/dist/rules/sort-array-includes.mjs +106 -58
  4. package/dist/rules/sort-astro-attributes.js +18 -44
  5. package/dist/rules/sort-astro-attributes.mjs +9 -31
  6. package/dist/rules/sort-classes.js +56 -35
  7. package/dist/rules/sort-classes.mjs +56 -35
  8. package/dist/rules/sort-enums.js +69 -39
  9. package/dist/rules/sort-enums.mjs +66 -37
  10. package/dist/rules/sort-exports.js +88 -12
  11. package/dist/rules/sort-exports.mjs +85 -12
  12. package/dist/rules/sort-interfaces.js +82 -106
  13. package/dist/rules/sort-interfaces.mjs +66 -89
  14. package/dist/rules/sort-intersection-types.js +151 -119
  15. package/dist/rules/sort-intersection-types.mjs +147 -113
  16. package/dist/rules/sort-jsx-props.js +18 -44
  17. package/dist/rules/sort-jsx-props.mjs +9 -31
  18. package/dist/rules/sort-maps.js +78 -22
  19. package/dist/rules/sort-maps.mjs +74 -22
  20. package/dist/rules/sort-named-exports.js +87 -31
  21. package/dist/rules/sort-named-exports.mjs +81 -28
  22. package/dist/rules/sort-named-imports.js +87 -31
  23. package/dist/rules/sort-named-imports.mjs +81 -28
  24. package/dist/rules/sort-object-types.js +80 -119
  25. package/dist/rules/sort-object-types.mjs +72 -104
  26. package/dist/rules/sort-objects.js +48 -50
  27. package/dist/rules/sort-objects.mjs +48 -43
  28. package/dist/rules/sort-svelte-attributes.js +18 -44
  29. package/dist/rules/sort-svelte-attributes.mjs +9 -31
  30. package/dist/rules/sort-union-types.js +151 -119
  31. package/dist/rules/sort-union-types.mjs +147 -113
  32. package/dist/rules/sort-variable-declarations.js +97 -24
  33. package/dist/rules/sort-variable-declarations.mjs +95 -25
  34. package/dist/rules/sort-vue-attributes.js +18 -45
  35. package/dist/rules/sort-vue-attributes.mjs +9 -32
  36. package/dist/utils/get-node-range.js +4 -6
  37. package/dist/utils/get-node-range.mjs +4 -8
  38. package/dist/utils/sort-nodes-by-dependencies.js +16 -0
  39. package/dist/utils/sort-nodes-by-dependencies.mjs +16 -1
  40. package/dist/utils/sort-nodes-by-groups.js +22 -0
  41. package/dist/utils/sort-nodes-by-groups.mjs +20 -0
  42. package/package.json +3 -3
@@ -1,17 +1,15 @@
1
1
  import path from 'node:path'
2
2
  import { validateGroupsConfiguration } from '../utils/validate-groups-configuration.mjs'
3
+ import { sortNodesByGroups } from '../utils/sort-nodes-by-groups.mjs'
3
4
  import { createEslintRule } from '../utils/create-eslint-rule.mjs'
4
5
  import { getGroupNumber } from '../utils/get-group-number.mjs'
5
6
  import { getSourceCode } from '../utils/get-source-code.mjs'
6
7
  import { rangeToDiff } from '../utils/range-to-diff.mjs'
7
8
  import { getSettings } from '../utils/get-settings.mjs'
8
- import { isPositive } from '../utils/is-positive.mjs'
9
9
  import { useGroups } from '../utils/use-groups.mjs'
10
10
  import { makeFixes } from '../utils/make-fixes.mjs'
11
- import { sortNodes } from '../utils/sort-nodes.mjs'
12
11
  import { pairwise } from '../utils/pairwise.mjs'
13
12
  import { complete } from '../utils/complete.mjs'
14
- import { compare } from '../utils/compare.mjs'
15
13
  const sortAstroAttributes = createEslintRule({
16
14
  name: 'sort-astro-attributes',
17
15
  meta: {
@@ -152,14 +150,13 @@ const sortAstroAttributes = createEslintRule({
152
150
  [[]],
153
151
  )
154
152
  for (let nodes of parts) {
153
+ let sortedNodes = sortNodesByGroups(nodes, options)
155
154
  pairwise(nodes, (left, right) => {
156
- let leftNum = getGroupNumber(options.groups, left)
157
- let rightNum = getGroupNumber(options.groups, right)
158
- if (
159
- leftNum > rightNum ||
160
- (leftNum === rightNum &&
161
- isPositive(compare(left, right, options)))
162
- ) {
155
+ let indexOfLeft = sortedNodes.indexOf(left)
156
+ let indexOfRight = sortedNodes.indexOf(right)
157
+ if (indexOfLeft > indexOfRight) {
158
+ let leftNum = getGroupNumber(options.groups, left)
159
+ let rightNum = getGroupNumber(options.groups, right)
163
160
  context.report({
164
161
  messageId:
165
162
  leftNum !== rightNum
@@ -172,27 +169,8 @@ const sortAstroAttributes = createEslintRule({
172
169
  rightGroup: right.group,
173
170
  },
174
171
  node: right.node,
175
- fix: fixer => {
176
- let grouped = {}
177
- for (let currentNode of nodes) {
178
- let groupNum = getGroupNumber(options.groups, currentNode)
179
- if (!(groupNum in grouped)) {
180
- grouped[groupNum] = [currentNode]
181
- } else {
182
- grouped[groupNum] = sortNodes(
183
- [...grouped[groupNum], currentNode],
184
- options,
185
- )
186
- }
187
- }
188
- let sortedNodes = []
189
- for (let group of Object.keys(grouped).sort(
190
- (a, b) => Number(a) - Number(b),
191
- )) {
192
- sortedNodes.push(...sortNodes(grouped[group], options))
193
- }
194
- return makeFixes(fixer, nodes, sortedNodes, sourceCode)
195
- },
172
+ fix: fixer =>
173
+ makeFixes(fixer, nodes, sortedNodes, sourceCode),
196
174
  })
197
175
  }
198
176
  })
@@ -45,7 +45,7 @@ const sortClasses = createEslintRule.createEslintRule({
45
45
  },
46
46
  partitionByComment: {
47
47
  description:
48
- 'Allows to use comments to separate the nodes into logical groups.',
48
+ 'Allows to use comments to separate the class members into logical groups.',
49
49
  anyOf: [
50
50
  {
51
51
  type: 'array',
@@ -145,6 +145,8 @@ const sortClasses = createEslintRule.createEslintRule({
145
145
  unexpectedClassesGroupOrder:
146
146
  'Expected "{{right}}" ({{rightGroup}}) to come before "{{left}}" ({{leftGroup}}).',
147
147
  unexpectedClassesOrder: 'Expected "{{right}}" to come before "{{left}}".',
148
+ unexpectedClassesDependencyOrder:
149
+ 'Expected dependency "{{right}}" to come before "{{nodeDependentOnRight}}".',
148
150
  },
149
151
  },
150
152
  defaultOptions: [
@@ -532,10 +534,11 @@ const sortClasses = createEslintRule.createEslintRule({
532
534
  },
533
535
  [[]],
534
536
  )
535
- for (let nodes of formattedNodes) {
537
+ let sortedNodes = []
538
+ for (let nodes2 of formattedNodes) {
536
539
  let nodesByNonIgnoredGroupNumber = {}
537
540
  let ignoredNodeIndices = []
538
- for (let [index, sortingNode] of nodes.entries()) {
541
+ for (let [index, sortingNode] of nodes2.entries()) {
539
542
  let groupNum = getGroupNumber.getGroupNumber(
540
543
  options.groups,
541
544
  sortingNode,
@@ -548,7 +551,6 @@ const sortClasses = createEslintRule.createEslintRule({
548
551
  nodesByNonIgnoredGroupNumber[groupNum] ?? []
549
552
  nodesByNonIgnoredGroupNumber[groupNum].push(sortingNode)
550
553
  }
551
- let sortedNodes = []
552
554
  for (let groupNumber of Object.keys(
553
555
  nodesByNonIgnoredGroupNumber,
554
556
  ).sort((a, b) => Number(a) - Number(b))) {
@@ -570,39 +572,58 @@ const sortClasses = createEslintRule.createEslintRule({
570
572
  }
571
573
  }
572
574
  for (let ignoredIndex of ignoredNodeIndices) {
573
- sortedNodes.splice(ignoredIndex, 0, nodes[ignoredIndex])
575
+ sortedNodes.splice(ignoredIndex, 0, nodes2[ignoredIndex])
574
576
  }
575
- sortedNodes =
576
- sortNodesByDependencies.sortNodesByDependencies(sortedNodes)
577
- pairwise.pairwise(nodes, (left, right) => {
578
- let leftNum = getGroupNumber.getGroupNumber(options.groups, left)
579
- let rightNum = getGroupNumber.getGroupNumber(options.groups, right)
580
- let isLeftOrRightIgnored =
581
- leftNum === options.groups.length ||
582
- rightNum === options.groups.length
583
- let indexOfLeft = sortedNodes.indexOf(left)
584
- let indexOfRight = sortedNodes.indexOf(right)
585
- if (!isLeftOrRightIgnored && indexOfLeft > indexOfRight) {
586
- context.report({
587
- messageId:
588
- leftNum !== rightNum
589
- ? 'unexpectedClassesGroupOrder'
590
- : 'unexpectedClassesOrder',
591
- data: {
592
- left: toSingleLine.toSingleLine(left.name),
593
- leftGroup: left.group,
594
- right: toSingleLine.toSingleLine(right.name),
595
- rightGroup: right.group,
596
- },
597
- node: right.node,
598
- fix: fixer =>
599
- makeFixes.makeFixes(fixer, nodes, sortedNodes, sourceCode, {
600
- partitionComment: options.partitionByComment,
601
- }),
602
- })
603
- }
604
- })
605
577
  }
578
+ sortedNodes =
579
+ sortNodesByDependencies.sortNodesByDependencies(sortedNodes)
580
+ let nodes = formattedNodes.flat()
581
+ pairwise.pairwise(nodes, (left, right) => {
582
+ let leftNum = getGroupNumber.getGroupNumber(options.groups, left)
583
+ let rightNum = getGroupNumber.getGroupNumber(options.groups, right)
584
+ let isLeftOrRightIgnored =
585
+ leftNum === options.groups.length ||
586
+ rightNum === options.groups.length
587
+ let indexOfLeft = sortedNodes.indexOf(left)
588
+ let indexOfRight = sortedNodes.indexOf(right)
589
+ let firstUnorderedNodeDependentOnRight =
590
+ sortNodesByDependencies.getFirstUnorderedNodeDependentOn(
591
+ right,
592
+ nodes,
593
+ )
594
+ if (
595
+ firstUnorderedNodeDependentOnRight ||
596
+ (!isLeftOrRightIgnored && indexOfLeft > indexOfRight)
597
+ ) {
598
+ let messageId
599
+ if (firstUnorderedNodeDependentOnRight) {
600
+ messageId = 'unexpectedClassesDependencyOrder'
601
+ } else {
602
+ messageId =
603
+ leftNum !== rightNum
604
+ ? 'unexpectedClassesGroupOrder'
605
+ : 'unexpectedClassesOrder'
606
+ }
607
+ context.report({
608
+ messageId,
609
+ data: {
610
+ left: toSingleLine.toSingleLine(left.name),
611
+ leftGroup: left.group,
612
+ right: toSingleLine.toSingleLine(right.name),
613
+ rightGroup: right.group,
614
+ nodeDependentOnRight:
615
+ firstUnorderedNodeDependentOnRight == null
616
+ ? void 0
617
+ : firstUnorderedNodeDependentOnRight.name,
618
+ },
619
+ node: right.node,
620
+ fix: fixer =>
621
+ makeFixes.makeFixes(fixer, nodes, sortedNodes, sourceCode, {
622
+ partitionComment: options.partitionByComment,
623
+ }),
624
+ })
625
+ }
626
+ })
606
627
  }
607
628
  },
608
629
  }),
@@ -9,7 +9,10 @@ import {
9
9
  customGroupSortJsonSchema,
10
10
  singleCustomGroupJsonSchema,
11
11
  } from './sort-classes.types.mjs'
12
- import { sortNodesByDependencies } from '../utils/sort-nodes-by-dependencies.mjs'
12
+ import {
13
+ sortNodesByDependencies,
14
+ getFirstUnorderedNodeDependentOn,
15
+ } from '../utils/sort-nodes-by-dependencies.mjs'
13
16
  import { hasPartitionComment } from '../utils/is-partition-comment.mjs'
14
17
  import { getCommentsBefore } from '../utils/get-comments-before.mjs'
15
18
  import { createEslintRule } from '../utils/create-eslint-rule.mjs'
@@ -53,7 +56,7 @@ const sortClasses = createEslintRule({
53
56
  },
54
57
  partitionByComment: {
55
58
  description:
56
- 'Allows to use comments to separate the nodes into logical groups.',
59
+ 'Allows to use comments to separate the class members into logical groups.',
57
60
  anyOf: [
58
61
  {
59
62
  type: 'array',
@@ -153,6 +156,8 @@ const sortClasses = createEslintRule({
153
156
  unexpectedClassesGroupOrder:
154
157
  'Expected "{{right}}" ({{rightGroup}}) to come before "{{left}}" ({{leftGroup}}).',
155
158
  unexpectedClassesOrder: 'Expected "{{right}}" to come before "{{left}}".',
159
+ unexpectedClassesDependencyOrder:
160
+ 'Expected dependency "{{right}}" to come before "{{nodeDependentOnRight}}".',
156
161
  },
157
162
  },
158
163
  defaultOptions: [
@@ -534,10 +539,11 @@ const sortClasses = createEslintRule({
534
539
  },
535
540
  [[]],
536
541
  )
537
- for (let nodes of formattedNodes) {
542
+ let sortedNodes = []
543
+ for (let nodes2 of formattedNodes) {
538
544
  let nodesByNonIgnoredGroupNumber = {}
539
545
  let ignoredNodeIndices = []
540
- for (let [index, sortingNode] of nodes.entries()) {
546
+ for (let [index, sortingNode] of nodes2.entries()) {
541
547
  let groupNum = getGroupNumber(options.groups, sortingNode)
542
548
  if (groupNum === options.groups.length) {
543
549
  ignoredNodeIndices.push(index)
@@ -547,7 +553,6 @@ const sortClasses = createEslintRule({
547
553
  nodesByNonIgnoredGroupNumber[groupNum] ?? []
548
554
  nodesByNonIgnoredGroupNumber[groupNum].push(sortingNode)
549
555
  }
550
- let sortedNodes = []
551
556
  for (let groupNumber of Object.keys(
552
557
  nodesByNonIgnoredGroupNumber,
553
558
  ).sort((a, b) => Number(a) - Number(b))) {
@@ -566,38 +571,54 @@ const sortClasses = createEslintRule({
566
571
  }
567
572
  }
568
573
  for (let ignoredIndex of ignoredNodeIndices) {
569
- sortedNodes.splice(ignoredIndex, 0, nodes[ignoredIndex])
574
+ sortedNodes.splice(ignoredIndex, 0, nodes2[ignoredIndex])
570
575
  }
571
- sortedNodes = sortNodesByDependencies(sortedNodes)
572
- pairwise(nodes, (left, right) => {
573
- let leftNum = getGroupNumber(options.groups, left)
574
- let rightNum = getGroupNumber(options.groups, right)
575
- let isLeftOrRightIgnored =
576
- leftNum === options.groups.length ||
577
- rightNum === options.groups.length
578
- let indexOfLeft = sortedNodes.indexOf(left)
579
- let indexOfRight = sortedNodes.indexOf(right)
580
- if (!isLeftOrRightIgnored && indexOfLeft > indexOfRight) {
581
- context.report({
582
- messageId:
583
- leftNum !== rightNum
584
- ? 'unexpectedClassesGroupOrder'
585
- : 'unexpectedClassesOrder',
586
- data: {
587
- left: toSingleLine(left.name),
588
- leftGroup: left.group,
589
- right: toSingleLine(right.name),
590
- rightGroup: right.group,
591
- },
592
- node: right.node,
593
- fix: fixer =>
594
- makeFixes(fixer, nodes, sortedNodes, sourceCode, {
595
- partitionComment: options.partitionByComment,
596
- }),
597
- })
598
- }
599
- })
600
576
  }
577
+ sortedNodes = sortNodesByDependencies(sortedNodes)
578
+ let nodes = formattedNodes.flat()
579
+ pairwise(nodes, (left, right) => {
580
+ let leftNum = getGroupNumber(options.groups, left)
581
+ let rightNum = getGroupNumber(options.groups, right)
582
+ let isLeftOrRightIgnored =
583
+ leftNum === options.groups.length ||
584
+ rightNum === options.groups.length
585
+ let indexOfLeft = sortedNodes.indexOf(left)
586
+ let indexOfRight = sortedNodes.indexOf(right)
587
+ let firstUnorderedNodeDependentOnRight =
588
+ getFirstUnorderedNodeDependentOn(right, nodes)
589
+ if (
590
+ firstUnorderedNodeDependentOnRight ||
591
+ (!isLeftOrRightIgnored && indexOfLeft > indexOfRight)
592
+ ) {
593
+ let messageId
594
+ if (firstUnorderedNodeDependentOnRight) {
595
+ messageId = 'unexpectedClassesDependencyOrder'
596
+ } else {
597
+ messageId =
598
+ leftNum !== rightNum
599
+ ? 'unexpectedClassesGroupOrder'
600
+ : 'unexpectedClassesOrder'
601
+ }
602
+ context.report({
603
+ messageId,
604
+ data: {
605
+ left: toSingleLine(left.name),
606
+ leftGroup: left.group,
607
+ right: toSingleLine(right.name),
608
+ rightGroup: right.group,
609
+ nodeDependentOnRight:
610
+ firstUnorderedNodeDependentOnRight == null
611
+ ? void 0
612
+ : firstUnorderedNodeDependentOnRight.name,
613
+ },
614
+ node: right.node,
615
+ fix: fixer =>
616
+ makeFixes(fixer, nodes, sortedNodes, sourceCode, {
617
+ partitionComment: options.partitionByComment,
618
+ }),
619
+ })
620
+ }
621
+ })
601
622
  }
602
623
  },
603
624
  }),
@@ -3,6 +3,7 @@ const sortNodesByDependencies = require('../utils/sort-nodes-by-dependencies.js'
3
3
  const isPartitionComment = require('../utils/is-partition-comment.js')
4
4
  const getCommentsBefore = require('../utils/get-comments-before.js')
5
5
  const createEslintRule = require('../utils/create-eslint-rule.js')
6
+ const getLinesBetween = require('../utils/get-lines-between.js')
6
7
  const getSourceCode = require('../utils/get-source-code.js')
7
8
  const toSingleLine = require('../utils/to-single-line.js')
8
9
  const rangeToDiff = require('../utils/range-to-diff.js')
@@ -50,7 +51,7 @@ const sortEnums = createEslintRule.createEslintRule({
50
51
  },
51
52
  partitionByComment: {
52
53
  description:
53
- 'Allows you to use comments to separate the class members into logical groups.',
54
+ 'Allows you to use comments to separate the members of enums into logical groups.',
54
55
  anyOf: [
55
56
  {
56
57
  type: 'array',
@@ -66,12 +67,19 @@ const sortEnums = createEslintRule.createEslintRule({
66
67
  },
67
68
  ],
68
69
  },
70
+ partitionByNewLine: {
71
+ description:
72
+ 'Allows to use spaces to separate the nodes into logical groups.',
73
+ type: 'boolean',
74
+ },
69
75
  },
70
76
  additionalProperties: false,
71
77
  },
72
78
  ],
73
79
  messages: {
74
80
  unexpectedEnumsOrder: 'Expected "{{right}}" to come before "{{left}}".',
81
+ unexpectedEnumsDependencyOrder:
82
+ 'Expected dependency "{{right}}" to come before "{{nodeDependentOnRight}}".',
75
83
  },
76
84
  },
77
85
  defaultOptions: [
@@ -81,6 +89,7 @@ const sortEnums = createEslintRule.createEslintRule({
81
89
  ignoreCase: true,
82
90
  sortByValue: false,
83
91
  partitionByComment: false,
92
+ partitionByNewLine: false,
84
93
  forceNumericSort: false,
85
94
  },
86
95
  ],
@@ -104,6 +113,7 @@ const sortEnums = createEslintRule.createEslintRule({
104
113
  let settings = getSettings.getSettings(context.settings)
105
114
  let options = complete.complete(context.options.at(0), settings, {
106
115
  partitionByComment: false,
116
+ partitionByNewLine: false,
107
117
  type: 'alphabetical',
108
118
  ignoreCase: true,
109
119
  order: 'asc',
@@ -140,20 +150,7 @@ const sortEnums = createEslintRule.createEslintRule({
140
150
  }
141
151
  let formattedMembers = members.reduce(
142
152
  (accumulator, member) => {
143
- let comments = getCommentsBefore.getCommentsBefore(
144
- member,
145
- sourceCode,
146
- )
147
- if (
148
- partitionComment &&
149
- isPartitionComment.hasPartitionComment(partitionComment, comments)
150
- ) {
151
- accumulator.push([])
152
- }
153
- let name =
154
- member.id.type === 'Literal'
155
- ? `${member.id.value}`
156
- : `${sourceCode.text.slice(...member.id.range)}`
153
+ var _a
157
154
  let dependencies = []
158
155
  if (member.initializer) {
159
156
  dependencies = extractDependencies(
@@ -161,11 +158,32 @@ const sortEnums = createEslintRule.createEslintRule({
161
158
  node.id.name,
162
159
  )
163
160
  }
161
+ let lastSortingNode =
162
+ (_a = accumulator.at(-1)) == null ? void 0 : _a.at(-1)
164
163
  let sortingNode = {
165
164
  size: rangeToDiff.rangeToDiff(member.range),
166
165
  node: member,
167
166
  dependencies,
168
- name,
167
+ name:
168
+ member.id.type === 'Literal'
169
+ ? `${member.id.value}`
170
+ : `${sourceCode.text.slice(...member.id.range)}`,
171
+ }
172
+ if (
173
+ (partitionComment &&
174
+ isPartitionComment.hasPartitionComment(
175
+ partitionComment,
176
+ getCommentsBefore.getCommentsBefore(member, sourceCode),
177
+ )) ||
178
+ (options.partitionByNewLine &&
179
+ lastSortingNode &&
180
+ getLinesBetween.getLinesBetween(
181
+ sourceCode,
182
+ lastSortingNode,
183
+ sortingNode,
184
+ ))
185
+ ) {
186
+ accumulator.push([])
169
187
  }
170
188
  accumulator.at(-1).push(sortingNode)
171
189
  return accumulator
@@ -208,29 +226,41 @@ const sortEnums = createEslintRule.createEslintRule({
208
226
  }
209
227
  : void 0,
210
228
  }
211
- for (let nodes of formattedMembers) {
212
- let sortedNodes = sortNodesByDependencies.sortNodesByDependencies(
213
- sortNodes.sortNodes(nodes, compareOptions),
214
- )
215
- pairwise.pairwise(nodes, (left, right) => {
216
- let indexOfLeft = sortedNodes.indexOf(left)
217
- let indexOfRight = sortedNodes.indexOf(right)
218
- if (indexOfLeft > indexOfRight) {
219
- context.report({
220
- messageId: 'unexpectedEnumsOrder',
221
- data: {
222
- left: toSingleLine.toSingleLine(left.name),
223
- right: toSingleLine.toSingleLine(right.name),
224
- },
225
- node: right.node,
226
- fix: fixer =>
227
- makeFixes.makeFixes(fixer, nodes, sortedNodes, sourceCode, {
228
- partitionComment,
229
- }),
230
- })
231
- }
232
- })
233
- }
229
+ let sortedNodes = sortNodesByDependencies.sortNodesByDependencies(
230
+ formattedMembers
231
+ .map(nodes2 => sortNodes.sortNodes(nodes2, compareOptions))
232
+ .flat(),
233
+ )
234
+ let nodes = formattedMembers.flat()
235
+ pairwise.pairwise(nodes, (left, right) => {
236
+ let indexOfLeft = sortedNodes.indexOf(left)
237
+ let indexOfRight = sortedNodes.indexOf(right)
238
+ if (indexOfLeft > indexOfRight) {
239
+ let firstUnorderedNodeDependentOnRight =
240
+ sortNodesByDependencies.getFirstUnorderedNodeDependentOn(
241
+ right,
242
+ nodes,
243
+ )
244
+ context.report({
245
+ messageId: firstUnorderedNodeDependentOnRight
246
+ ? 'unexpectedEnumsDependencyOrder'
247
+ : 'unexpectedEnumsOrder',
248
+ data: {
249
+ left: toSingleLine.toSingleLine(left.name),
250
+ right: toSingleLine.toSingleLine(right.name),
251
+ nodeDependentOnRight:
252
+ firstUnorderedNodeDependentOnRight == null
253
+ ? void 0
254
+ : firstUnorderedNodeDependentOnRight.name,
255
+ },
256
+ node: right.node,
257
+ fix: fixer =>
258
+ makeFixes.makeFixes(fixer, nodes, sortedNodes, sourceCode, {
259
+ partitionComment,
260
+ }),
261
+ })
262
+ }
263
+ })
234
264
  }
235
265
  },
236
266
  }),
@@ -1,7 +1,11 @@
1
- import { sortNodesByDependencies } from '../utils/sort-nodes-by-dependencies.mjs'
1
+ import {
2
+ sortNodesByDependencies,
3
+ getFirstUnorderedNodeDependentOn,
4
+ } from '../utils/sort-nodes-by-dependencies.mjs'
2
5
  import { hasPartitionComment } from '../utils/is-partition-comment.mjs'
3
6
  import { getCommentsBefore } from '../utils/get-comments-before.mjs'
4
7
  import { createEslintRule } from '../utils/create-eslint-rule.mjs'
8
+ import { getLinesBetween } from '../utils/get-lines-between.mjs'
5
9
  import { getSourceCode } from '../utils/get-source-code.mjs'
6
10
  import { toSingleLine } from '../utils/to-single-line.mjs'
7
11
  import { rangeToDiff } from '../utils/range-to-diff.mjs'
@@ -49,7 +53,7 @@ const sortEnums = createEslintRule({
49
53
  },
50
54
  partitionByComment: {
51
55
  description:
52
- 'Allows you to use comments to separate the class members into logical groups.',
56
+ 'Allows you to use comments to separate the members of enums into logical groups.',
53
57
  anyOf: [
54
58
  {
55
59
  type: 'array',
@@ -65,12 +69,19 @@ const sortEnums = createEslintRule({
65
69
  },
66
70
  ],
67
71
  },
72
+ partitionByNewLine: {
73
+ description:
74
+ 'Allows to use spaces to separate the nodes into logical groups.',
75
+ type: 'boolean',
76
+ },
68
77
  },
69
78
  additionalProperties: false,
70
79
  },
71
80
  ],
72
81
  messages: {
73
82
  unexpectedEnumsOrder: 'Expected "{{right}}" to come before "{{left}}".',
83
+ unexpectedEnumsDependencyOrder:
84
+ 'Expected dependency "{{right}}" to come before "{{nodeDependentOnRight}}".',
74
85
  },
75
86
  },
76
87
  defaultOptions: [
@@ -80,6 +91,7 @@ const sortEnums = createEslintRule({
80
91
  ignoreCase: true,
81
92
  sortByValue: false,
82
93
  partitionByComment: false,
94
+ partitionByNewLine: false,
83
95
  forceNumericSort: false,
84
96
  },
85
97
  ],
@@ -103,6 +115,7 @@ const sortEnums = createEslintRule({
103
115
  let settings = getSettings(context.settings)
104
116
  let options = complete(context.options.at(0), settings, {
105
117
  partitionByComment: false,
118
+ partitionByNewLine: false,
106
119
  type: 'alphabetical',
107
120
  ignoreCase: true,
108
121
  order: 'asc',
@@ -139,17 +152,7 @@ const sortEnums = createEslintRule({
139
152
  }
140
153
  let formattedMembers = members.reduce(
141
154
  (accumulator, member) => {
142
- let comments = getCommentsBefore(member, sourceCode)
143
- if (
144
- partitionComment &&
145
- hasPartitionComment(partitionComment, comments)
146
- ) {
147
- accumulator.push([])
148
- }
149
- let name =
150
- member.id.type === 'Literal'
151
- ? `${member.id.value}`
152
- : `${sourceCode.text.slice(...member.id.range)}`
155
+ var _a
153
156
  let dependencies = []
154
157
  if (member.initializer) {
155
158
  dependencies = extractDependencies(
@@ -157,11 +160,28 @@ const sortEnums = createEslintRule({
157
160
  node.id.name,
158
161
  )
159
162
  }
163
+ let lastSortingNode =
164
+ (_a = accumulator.at(-1)) == null ? void 0 : _a.at(-1)
160
165
  let sortingNode = {
161
166
  size: rangeToDiff(member.range),
162
167
  node: member,
163
168
  dependencies,
164
- name,
169
+ name:
170
+ member.id.type === 'Literal'
171
+ ? `${member.id.value}`
172
+ : `${sourceCode.text.slice(...member.id.range)}`,
173
+ }
174
+ if (
175
+ (partitionComment &&
176
+ hasPartitionComment(
177
+ partitionComment,
178
+ getCommentsBefore(member, sourceCode),
179
+ )) ||
180
+ (options.partitionByNewLine &&
181
+ lastSortingNode &&
182
+ getLinesBetween(sourceCode, lastSortingNode, sortingNode))
183
+ ) {
184
+ accumulator.push([])
165
185
  }
166
186
  accumulator.at(-1).push(sortingNode)
167
187
  return accumulator
@@ -204,29 +224,38 @@ const sortEnums = createEslintRule({
204
224
  }
205
225
  : void 0,
206
226
  }
207
- for (let nodes of formattedMembers) {
208
- let sortedNodes = sortNodesByDependencies(
209
- sortNodes(nodes, compareOptions),
210
- )
211
- pairwise(nodes, (left, right) => {
212
- let indexOfLeft = sortedNodes.indexOf(left)
213
- let indexOfRight = sortedNodes.indexOf(right)
214
- if (indexOfLeft > indexOfRight) {
215
- context.report({
216
- messageId: 'unexpectedEnumsOrder',
217
- data: {
218
- left: toSingleLine(left.name),
219
- right: toSingleLine(right.name),
220
- },
221
- node: right.node,
222
- fix: fixer =>
223
- makeFixes(fixer, nodes, sortedNodes, sourceCode, {
224
- partitionComment,
225
- }),
226
- })
227
- }
228
- })
229
- }
227
+ let sortedNodes = sortNodesByDependencies(
228
+ formattedMembers
229
+ .map(nodes2 => sortNodes(nodes2, compareOptions))
230
+ .flat(),
231
+ )
232
+ let nodes = formattedMembers.flat()
233
+ pairwise(nodes, (left, right) => {
234
+ let indexOfLeft = sortedNodes.indexOf(left)
235
+ let indexOfRight = sortedNodes.indexOf(right)
236
+ if (indexOfLeft > indexOfRight) {
237
+ let firstUnorderedNodeDependentOnRight =
238
+ getFirstUnorderedNodeDependentOn(right, nodes)
239
+ context.report({
240
+ messageId: firstUnorderedNodeDependentOnRight
241
+ ? 'unexpectedEnumsDependencyOrder'
242
+ : 'unexpectedEnumsOrder',
243
+ data: {
244
+ left: toSingleLine(left.name),
245
+ right: toSingleLine(right.name),
246
+ nodeDependentOnRight:
247
+ firstUnorderedNodeDependentOnRight == null
248
+ ? void 0
249
+ : firstUnorderedNodeDependentOnRight.name,
250
+ },
251
+ node: right.node,
252
+ fix: fixer =>
253
+ makeFixes(fixer, nodes, sortedNodes, sourceCode, {
254
+ partitionComment,
255
+ }),
256
+ })
257
+ }
258
+ })
230
259
  }
231
260
  },
232
261
  }),