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.
- package/dist/index.d.ts +29 -4
- package/dist/rules/sort-array-includes.js +118 -60
- package/dist/rules/sort-array-includes.mjs +106 -58
- package/dist/rules/sort-astro-attributes.js +18 -44
- package/dist/rules/sort-astro-attributes.mjs +9 -31
- package/dist/rules/sort-classes.js +56 -35
- package/dist/rules/sort-classes.mjs +56 -35
- package/dist/rules/sort-enums.js +69 -39
- package/dist/rules/sort-enums.mjs +66 -37
- package/dist/rules/sort-exports.js +88 -12
- package/dist/rules/sort-exports.mjs +85 -12
- package/dist/rules/sort-interfaces.js +82 -106
- package/dist/rules/sort-interfaces.mjs +66 -89
- package/dist/rules/sort-intersection-types.js +151 -119
- package/dist/rules/sort-intersection-types.mjs +147 -113
- package/dist/rules/sort-jsx-props.js +18 -44
- package/dist/rules/sort-jsx-props.mjs +9 -31
- package/dist/rules/sort-maps.js +78 -22
- package/dist/rules/sort-maps.mjs +74 -22
- package/dist/rules/sort-named-exports.js +87 -31
- package/dist/rules/sort-named-exports.mjs +81 -28
- package/dist/rules/sort-named-imports.js +87 -31
- package/dist/rules/sort-named-imports.mjs +81 -28
- package/dist/rules/sort-object-types.js +80 -119
- package/dist/rules/sort-object-types.mjs +72 -104
- package/dist/rules/sort-objects.js +48 -50
- package/dist/rules/sort-objects.mjs +48 -43
- package/dist/rules/sort-svelte-attributes.js +18 -44
- package/dist/rules/sort-svelte-attributes.mjs +9 -31
- package/dist/rules/sort-union-types.js +151 -119
- package/dist/rules/sort-union-types.mjs +147 -113
- package/dist/rules/sort-variable-declarations.js +97 -24
- package/dist/rules/sort-variable-declarations.mjs +95 -25
- package/dist/rules/sort-vue-attributes.js +18 -45
- package/dist/rules/sort-vue-attributes.mjs +9 -32
- package/dist/utils/get-node-range.js +4 -6
- package/dist/utils/get-node-range.mjs +4 -8
- package/dist/utils/sort-nodes-by-dependencies.js +16 -0
- package/dist/utils/sort-nodes-by-dependencies.mjs +16 -1
- package/dist/utils/sort-nodes-by-groups.js +22 -0
- package/dist/utils/sort-nodes-by-groups.mjs +20 -0
- 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
|
|
157
|
-
let
|
|
158
|
-
if (
|
|
159
|
-
leftNum
|
|
160
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
537
|
+
let sortedNodes = []
|
|
538
|
+
for (let nodes2 of formattedNodes) {
|
|
536
539
|
let nodesByNonIgnoredGroupNumber = {}
|
|
537
540
|
let ignoredNodeIndices = []
|
|
538
|
-
for (let [index, sortingNode] of
|
|
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,
|
|
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 {
|
|
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
|
|
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
|
-
|
|
542
|
+
let sortedNodes = []
|
|
543
|
+
for (let nodes2 of formattedNodes) {
|
|
538
544
|
let nodesByNonIgnoredGroupNumber = {}
|
|
539
545
|
let ignoredNodeIndices = []
|
|
540
|
-
for (let [index, sortingNode] of
|
|
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,
|
|
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
|
}),
|
package/dist/rules/sort-enums.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
212
|
-
|
|
213
|
-
sortNodes.sortNodes(
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
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 {
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
208
|
-
|
|
209
|
-
sortNodes(
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
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
|
}),
|