eslint-plugin-perfectionist 3.5.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 +41 -12
- 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 +26 -45
- package/dist/rules/sort-astro-attributes.mjs +17 -32
- package/dist/rules/sort-classes.js +63 -40
- package/dist/rules/sort-classes.mjs +60 -40
- package/dist/rules/sort-enums.js +73 -41
- package/dist/rules/sort-enums.mjs +71 -40
- package/dist/rules/sort-exports.js +88 -12
- package/dist/rules/sort-exports.mjs +85 -12
- package/dist/rules/sort-imports.js +14 -10
- package/dist/rules/sort-imports.mjs +13 -9
- package/dist/rules/sort-interfaces.js +98 -107
- package/dist/rules/sort-interfaces.mjs +76 -90
- package/dist/rules/sort-intersection-types.js +153 -114
- package/dist/rules/sort-intersection-types.mjs +149 -108
- package/dist/rules/sort-jsx-props.js +26 -45
- package/dist/rules/sort-jsx-props.mjs +17 -32
- 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 +88 -120
- package/dist/rules/sort-object-types.mjs +80 -105
- package/dist/rules/sort-objects.js +121 -89
- package/dist/rules/sort-objects.mjs +118 -85
- package/dist/rules/sort-svelte-attributes.js +26 -45
- package/dist/rules/sort-svelte-attributes.mjs +17 -32
- package/dist/rules/sort-union-types.js +153 -114
- package/dist/rules/sort-union-types.mjs +149 -108
- 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 +26 -46
- package/dist/rules/sort-vue-attributes.mjs +17 -33
- package/dist/utils/get-comments-before.js +12 -0
- package/dist/utils/get-comments-before.mjs +10 -0
- package/dist/utils/get-node-range.js +24 -12
- package/dist/utils/get-node-range.mjs +22 -12
- package/dist/utils/is-partition-comment.js +3 -0
- package/dist/utils/is-partition-comment.mjs +3 -1
- 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 +4 -4
- package/dist/utils/get-comment-before.js +0 -23
- package/dist/utils/get-comment-before.mjs +0 -21
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
const path = require('node:path')
|
|
3
3
|
const validateGroupsConfiguration = require('../utils/validate-groups-configuration.js')
|
|
4
|
+
const sortNodesByGroups = require('../utils/sort-nodes-by-groups.js')
|
|
4
5
|
const createEslintRule = require('../utils/create-eslint-rule.js')
|
|
5
6
|
const getGroupNumber = require('../utils/get-group-number.js')
|
|
6
7
|
const getSourceCode = require('../utils/get-source-code.js')
|
|
7
8
|
const rangeToDiff = require('../utils/range-to-diff.js')
|
|
8
9
|
const getSettings = require('../utils/get-settings.js')
|
|
9
|
-
const isPositive = require('../utils/is-positive.js')
|
|
10
10
|
const useGroups = require('../utils/use-groups.js')
|
|
11
11
|
const makeFixes = require('../utils/make-fixes.js')
|
|
12
|
-
const sortNodes = require('../utils/sort-nodes.js')
|
|
13
12
|
const pairwise = require('../utils/pairwise.js')
|
|
14
13
|
const complete = require('../utils/complete.js')
|
|
15
|
-
const compare = require('../utils/compare.js')
|
|
16
14
|
const sortAstroAttributes = createEslintRule.createEslintRule({
|
|
17
15
|
name: 'sort-astro-attributes',
|
|
18
16
|
meta: {
|
|
@@ -80,6 +78,8 @@ const sortAstroAttributes = createEslintRule.createEslintRule({
|
|
|
80
78
|
},
|
|
81
79
|
],
|
|
82
80
|
messages: {
|
|
81
|
+
unexpectedAstroAttributesGroupOrder:
|
|
82
|
+
'Expected "{{right}}" ({{rightGroup}}) to come before "{{left}}" ({{leftGroup}}).',
|
|
83
83
|
unexpectedAstroAttributesOrder:
|
|
84
84
|
'Expected "{{right}}" to come before "{{left}}".',
|
|
85
85
|
},
|
|
@@ -150,55 +150,36 @@ const sortAstroAttributes = createEslintRule.createEslintRule({
|
|
|
150
150
|
[[]],
|
|
151
151
|
)
|
|
152
152
|
for (let nodes of parts) {
|
|
153
|
+
let sortedNodes = sortNodesByGroups.sortNodesByGroups(
|
|
154
|
+
nodes,
|
|
155
|
+
options,
|
|
156
|
+
)
|
|
153
157
|
pairwise.pairwise(nodes, (left, right) => {
|
|
154
|
-
let
|
|
155
|
-
let
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
158
|
+
let indexOfLeft = sortedNodes.indexOf(left)
|
|
159
|
+
let indexOfRight = sortedNodes.indexOf(right)
|
|
160
|
+
if (indexOfLeft > indexOfRight) {
|
|
161
|
+
let leftNum = getGroupNumber.getGroupNumber(
|
|
162
|
+
options.groups,
|
|
163
|
+
left,
|
|
164
|
+
)
|
|
165
|
+
let rightNum = getGroupNumber.getGroupNumber(
|
|
166
|
+
options.groups,
|
|
167
|
+
right,
|
|
168
|
+
)
|
|
164
169
|
context.report({
|
|
165
|
-
messageId:
|
|
170
|
+
messageId:
|
|
171
|
+
leftNum !== rightNum
|
|
172
|
+
? 'unexpectedAstroAttributesGroupOrder'
|
|
173
|
+
: 'unexpectedAstroAttributesOrder',
|
|
166
174
|
data: {
|
|
167
175
|
left: left.name,
|
|
168
176
|
right: right.name,
|
|
177
|
+
leftGroup: left.group,
|
|
178
|
+
rightGroup: right.group,
|
|
169
179
|
},
|
|
170
180
|
node: right.node,
|
|
171
|
-
fix: fixer =>
|
|
172
|
-
|
|
173
|
-
for (let currentNode of nodes) {
|
|
174
|
-
let groupNum = getGroupNumber.getGroupNumber(
|
|
175
|
-
options.groups,
|
|
176
|
-
currentNode,
|
|
177
|
-
)
|
|
178
|
-
if (!(groupNum in grouped)) {
|
|
179
|
-
grouped[groupNum] = [currentNode]
|
|
180
|
-
} else {
|
|
181
|
-
grouped[groupNum] = sortNodes.sortNodes(
|
|
182
|
-
[...grouped[groupNum], currentNode],
|
|
183
|
-
options,
|
|
184
|
-
)
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
let sortedNodes = []
|
|
188
|
-
for (let group of Object.keys(grouped).sort(
|
|
189
|
-
(a, b) => Number(a) - Number(b),
|
|
190
|
-
)) {
|
|
191
|
-
sortedNodes.push(
|
|
192
|
-
...sortNodes.sortNodes(grouped[group], options),
|
|
193
|
-
)
|
|
194
|
-
}
|
|
195
|
-
return makeFixes.makeFixes(
|
|
196
|
-
fixer,
|
|
197
|
-
nodes,
|
|
198
|
-
sortedNodes,
|
|
199
|
-
sourceCode,
|
|
200
|
-
)
|
|
201
|
-
},
|
|
181
|
+
fix: fixer =>
|
|
182
|
+
makeFixes.makeFixes(fixer, nodes, sortedNodes, sourceCode),
|
|
202
183
|
})
|
|
203
184
|
}
|
|
204
185
|
})
|
|
@@ -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: {
|
|
@@ -79,6 +77,8 @@ const sortAstroAttributes = createEslintRule({
|
|
|
79
77
|
},
|
|
80
78
|
],
|
|
81
79
|
messages: {
|
|
80
|
+
unexpectedAstroAttributesGroupOrder:
|
|
81
|
+
'Expected "{{right}}" ({{rightGroup}}) to come before "{{left}}" ({{leftGroup}}).',
|
|
82
82
|
unexpectedAstroAttributesOrder:
|
|
83
83
|
'Expected "{{right}}" to come before "{{left}}".',
|
|
84
84
|
},
|
|
@@ -150,42 +150,27 @@ const sortAstroAttributes = createEslintRule({
|
|
|
150
150
|
[[]],
|
|
151
151
|
)
|
|
152
152
|
for (let nodes of parts) {
|
|
153
|
+
let sortedNodes = sortNodesByGroups(nodes, options)
|
|
153
154
|
pairwise(nodes, (left, right) => {
|
|
154
|
-
let
|
|
155
|
-
let
|
|
156
|
-
if (
|
|
157
|
-
leftNum
|
|
158
|
-
|
|
159
|
-
isPositive(compare(left, right, options)))
|
|
160
|
-
) {
|
|
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)
|
|
161
160
|
context.report({
|
|
162
|
-
messageId:
|
|
161
|
+
messageId:
|
|
162
|
+
leftNum !== rightNum
|
|
163
|
+
? 'unexpectedAstroAttributesGroupOrder'
|
|
164
|
+
: 'unexpectedAstroAttributesOrder',
|
|
163
165
|
data: {
|
|
164
166
|
left: left.name,
|
|
165
167
|
right: right.name,
|
|
168
|
+
leftGroup: left.group,
|
|
169
|
+
rightGroup: right.group,
|
|
166
170
|
},
|
|
167
171
|
node: right.node,
|
|
168
|
-
fix: fixer =>
|
|
169
|
-
|
|
170
|
-
for (let currentNode of nodes) {
|
|
171
|
-
let groupNum = getGroupNumber(options.groups, currentNode)
|
|
172
|
-
if (!(groupNum in grouped)) {
|
|
173
|
-
grouped[groupNum] = [currentNode]
|
|
174
|
-
} else {
|
|
175
|
-
grouped[groupNum] = sortNodes(
|
|
176
|
-
[...grouped[groupNum], currentNode],
|
|
177
|
-
options,
|
|
178
|
-
)
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
let sortedNodes = []
|
|
182
|
-
for (let group of Object.keys(grouped).sort(
|
|
183
|
-
(a, b) => Number(a) - Number(b),
|
|
184
|
-
)) {
|
|
185
|
-
sortedNodes.push(...sortNodes(grouped[group], options))
|
|
186
|
-
}
|
|
187
|
-
return makeFixes(fixer, nodes, sortedNodes, sourceCode)
|
|
188
|
-
},
|
|
172
|
+
fix: fixer =>
|
|
173
|
+
makeFixes(fixer, nodes, sortedNodes, sourceCode),
|
|
189
174
|
})
|
|
190
175
|
}
|
|
191
176
|
})
|
|
@@ -3,7 +3,7 @@ const sortClassesUtils = require('./sort-classes-utils.js')
|
|
|
3
3
|
const sortClasses_types = require('./sort-classes.types.js')
|
|
4
4
|
const sortNodesByDependencies = require('../utils/sort-nodes-by-dependencies.js')
|
|
5
5
|
const isPartitionComment = require('../utils/is-partition-comment.js')
|
|
6
|
-
const
|
|
6
|
+
const getCommentsBefore = require('../utils/get-comments-before.js')
|
|
7
7
|
const createEslintRule = require('../utils/create-eslint-rule.js')
|
|
8
8
|
const getGroupNumber = require('../utils/get-group-number.js')
|
|
9
9
|
const getSourceCode = require('../utils/get-source-code.js')
|
|
@@ -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: [
|
|
@@ -311,13 +313,15 @@ const sortClasses = createEslintRule.createEslintRule({
|
|
|
311
313
|
let formattedNodes = node.body.reduce(
|
|
312
314
|
(accumulator, member) => {
|
|
313
315
|
var _a2, _b, _c, _d
|
|
314
|
-
let
|
|
316
|
+
let comments = getCommentsBefore.getCommentsBefore(
|
|
317
|
+
member,
|
|
318
|
+
sourceCode,
|
|
319
|
+
)
|
|
315
320
|
if (
|
|
316
321
|
options.partitionByComment &&
|
|
317
|
-
|
|
318
|
-
isPartitionComment.isPartitionComment(
|
|
322
|
+
isPartitionComment.hasPartitionComment(
|
|
319
323
|
options.partitionByComment,
|
|
320
|
-
|
|
324
|
+
comments,
|
|
321
325
|
)
|
|
322
326
|
) {
|
|
323
327
|
accumulator.push([])
|
|
@@ -530,10 +534,11 @@ const sortClasses = createEslintRule.createEslintRule({
|
|
|
530
534
|
},
|
|
531
535
|
[[]],
|
|
532
536
|
)
|
|
533
|
-
|
|
537
|
+
let sortedNodes = []
|
|
538
|
+
for (let nodes2 of formattedNodes) {
|
|
534
539
|
let nodesByNonIgnoredGroupNumber = {}
|
|
535
540
|
let ignoredNodeIndices = []
|
|
536
|
-
for (let [index, sortingNode] of
|
|
541
|
+
for (let [index, sortingNode] of nodes2.entries()) {
|
|
537
542
|
let groupNum = getGroupNumber.getGroupNumber(
|
|
538
543
|
options.groups,
|
|
539
544
|
sortingNode,
|
|
@@ -546,7 +551,6 @@ const sortClasses = createEslintRule.createEslintRule({
|
|
|
546
551
|
nodesByNonIgnoredGroupNumber[groupNum] ?? []
|
|
547
552
|
nodesByNonIgnoredGroupNumber[groupNum].push(sortingNode)
|
|
548
553
|
}
|
|
549
|
-
let sortedNodes = []
|
|
550
554
|
for (let groupNumber of Object.keys(
|
|
551
555
|
nodesByNonIgnoredGroupNumber,
|
|
552
556
|
).sort((a, b) => Number(a) - Number(b))) {
|
|
@@ -568,39 +572,58 @@ const sortClasses = createEslintRule.createEslintRule({
|
|
|
568
572
|
}
|
|
569
573
|
}
|
|
570
574
|
for (let ignoredIndex of ignoredNodeIndices) {
|
|
571
|
-
sortedNodes.splice(ignoredIndex, 0,
|
|
575
|
+
sortedNodes.splice(ignoredIndex, 0, nodes2[ignoredIndex])
|
|
572
576
|
}
|
|
573
|
-
sortedNodes =
|
|
574
|
-
sortNodesByDependencies.sortNodesByDependencies(sortedNodes)
|
|
575
|
-
pairwise.pairwise(nodes, (left, right) => {
|
|
576
|
-
let leftNum = getGroupNumber.getGroupNumber(options.groups, left)
|
|
577
|
-
let rightNum = getGroupNumber.getGroupNumber(options.groups, right)
|
|
578
|
-
let isLeftOrRightIgnored =
|
|
579
|
-
leftNum === options.groups.length ||
|
|
580
|
-
rightNum === options.groups.length
|
|
581
|
-
let indexOfLeft = sortedNodes.indexOf(left)
|
|
582
|
-
let indexOfRight = sortedNodes.indexOf(right)
|
|
583
|
-
if (!isLeftOrRightIgnored && indexOfLeft > indexOfRight) {
|
|
584
|
-
context.report({
|
|
585
|
-
messageId:
|
|
586
|
-
leftNum !== rightNum
|
|
587
|
-
? 'unexpectedClassesGroupOrder'
|
|
588
|
-
: 'unexpectedClassesOrder',
|
|
589
|
-
data: {
|
|
590
|
-
left: toSingleLine.toSingleLine(left.name),
|
|
591
|
-
leftGroup: left.group,
|
|
592
|
-
right: toSingleLine.toSingleLine(right.name),
|
|
593
|
-
rightGroup: right.group,
|
|
594
|
-
},
|
|
595
|
-
node: right.node,
|
|
596
|
-
fix: fixer =>
|
|
597
|
-
makeFixes.makeFixes(fixer, nodes, sortedNodes, sourceCode, {
|
|
598
|
-
partitionComment: options.partitionByComment,
|
|
599
|
-
}),
|
|
600
|
-
})
|
|
601
|
-
}
|
|
602
|
-
})
|
|
603
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
|
+
})
|
|
604
627
|
}
|
|
605
628
|
},
|
|
606
629
|
}),
|
|
@@ -9,9 +9,12 @@ import {
|
|
|
9
9
|
customGroupSortJsonSchema,
|
|
10
10
|
singleCustomGroupJsonSchema,
|
|
11
11
|
} from './sort-classes.types.mjs'
|
|
12
|
-
import {
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
import {
|
|
13
|
+
sortNodesByDependencies,
|
|
14
|
+
getFirstUnorderedNodeDependentOn,
|
|
15
|
+
} from '../utils/sort-nodes-by-dependencies.mjs'
|
|
16
|
+
import { hasPartitionComment } from '../utils/is-partition-comment.mjs'
|
|
17
|
+
import { getCommentsBefore } from '../utils/get-comments-before.mjs'
|
|
15
18
|
import { createEslintRule } from '../utils/create-eslint-rule.mjs'
|
|
16
19
|
import { getGroupNumber } from '../utils/get-group-number.mjs'
|
|
17
20
|
import { getSourceCode } from '../utils/get-source-code.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: [
|
|
@@ -318,11 +323,10 @@ const sortClasses = createEslintRule({
|
|
|
318
323
|
let formattedNodes = node.body.reduce(
|
|
319
324
|
(accumulator, member) => {
|
|
320
325
|
var _a2, _b, _c, _d
|
|
321
|
-
let
|
|
326
|
+
let comments = getCommentsBefore(member, sourceCode)
|
|
322
327
|
if (
|
|
323
328
|
options.partitionByComment &&
|
|
324
|
-
|
|
325
|
-
isPartitionComment(options.partitionByComment, comment.value)
|
|
329
|
+
hasPartitionComment(options.partitionByComment, comments)
|
|
326
330
|
) {
|
|
327
331
|
accumulator.push([])
|
|
328
332
|
}
|
|
@@ -535,10 +539,11 @@ const sortClasses = createEslintRule({
|
|
|
535
539
|
},
|
|
536
540
|
[[]],
|
|
537
541
|
)
|
|
538
|
-
|
|
542
|
+
let sortedNodes = []
|
|
543
|
+
for (let nodes2 of formattedNodes) {
|
|
539
544
|
let nodesByNonIgnoredGroupNumber = {}
|
|
540
545
|
let ignoredNodeIndices = []
|
|
541
|
-
for (let [index, sortingNode] of
|
|
546
|
+
for (let [index, sortingNode] of nodes2.entries()) {
|
|
542
547
|
let groupNum = getGroupNumber(options.groups, sortingNode)
|
|
543
548
|
if (groupNum === options.groups.length) {
|
|
544
549
|
ignoredNodeIndices.push(index)
|
|
@@ -548,7 +553,6 @@ const sortClasses = createEslintRule({
|
|
|
548
553
|
nodesByNonIgnoredGroupNumber[groupNum] ?? []
|
|
549
554
|
nodesByNonIgnoredGroupNumber[groupNum].push(sortingNode)
|
|
550
555
|
}
|
|
551
|
-
let sortedNodes = []
|
|
552
556
|
for (let groupNumber of Object.keys(
|
|
553
557
|
nodesByNonIgnoredGroupNumber,
|
|
554
558
|
).sort((a, b) => Number(a) - Number(b))) {
|
|
@@ -567,38 +571,54 @@ const sortClasses = createEslintRule({
|
|
|
567
571
|
}
|
|
568
572
|
}
|
|
569
573
|
for (let ignoredIndex of ignoredNodeIndices) {
|
|
570
|
-
sortedNodes.splice(ignoredIndex, 0,
|
|
574
|
+
sortedNodes.splice(ignoredIndex, 0, nodes2[ignoredIndex])
|
|
571
575
|
}
|
|
572
|
-
sortedNodes = sortNodesByDependencies(sortedNodes)
|
|
573
|
-
pairwise(nodes, (left, right) => {
|
|
574
|
-
let leftNum = getGroupNumber(options.groups, left)
|
|
575
|
-
let rightNum = getGroupNumber(options.groups, right)
|
|
576
|
-
let isLeftOrRightIgnored =
|
|
577
|
-
leftNum === options.groups.length ||
|
|
578
|
-
rightNum === options.groups.length
|
|
579
|
-
let indexOfLeft = sortedNodes.indexOf(left)
|
|
580
|
-
let indexOfRight = sortedNodes.indexOf(right)
|
|
581
|
-
if (!isLeftOrRightIgnored && indexOfLeft > indexOfRight) {
|
|
582
|
-
context.report({
|
|
583
|
-
messageId:
|
|
584
|
-
leftNum !== rightNum
|
|
585
|
-
? 'unexpectedClassesGroupOrder'
|
|
586
|
-
: 'unexpectedClassesOrder',
|
|
587
|
-
data: {
|
|
588
|
-
left: toSingleLine(left.name),
|
|
589
|
-
leftGroup: left.group,
|
|
590
|
-
right: toSingleLine(right.name),
|
|
591
|
-
rightGroup: right.group,
|
|
592
|
-
},
|
|
593
|
-
node: right.node,
|
|
594
|
-
fix: fixer =>
|
|
595
|
-
makeFixes(fixer, nodes, sortedNodes, sourceCode, {
|
|
596
|
-
partitionComment: options.partitionByComment,
|
|
597
|
-
}),
|
|
598
|
-
})
|
|
599
|
-
}
|
|
600
|
-
})
|
|
601
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
|
+
})
|
|
602
622
|
}
|
|
603
623
|
},
|
|
604
624
|
}),
|