Skip to content

Commit 53b98fe

Browse files
committed
fix: Attach error to first unsorted node
1 parent 0529b77 commit 53b98fe

8 files changed

+29
-22
lines changed

src/rules/destructuring-properties.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import {
1212

1313
export default {
1414
create(context) {
15+
const source = context.getSourceCode()
16+
1517
return {
1618
ObjectPattern(pattern) {
1719
const nodes = filterNodes(pattern.properties, ["Property"])
@@ -25,11 +27,10 @@ export default {
2527
.slice()
2628
.sort(alphaSorter((node) => getName(node.key).toLowerCase()))
2729

28-
if (isUnsorted(nodes, sorted)) {
29-
const source = context.getSourceCode()
30-
30+
const firstUnsortedNode = isUnsorted(nodes, sorted)
31+
if (firstUnsortedNode) {
3132
context.report({
32-
node: nodes[0],
33+
node: firstUnsortedNode,
3334
messageId: "unsorted",
3435
*fix(fixer) {
3536
for (const [node, complement] of enumerate(nodes, sorted)) {

src/rules/export-members.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ export default {
2323
.slice()
2424
.sort(alphaSorter((node) => node.local.name.toLowerCase()))
2525

26-
if (isUnsorted(nodes, sorted)) {
26+
const firstUnsortedNode = isUnsorted(nodes, sorted)
27+
if (firstUnsortedNode) {
2728
context.report({
28-
node: nodes[0],
29+
node: firstUnsortedNode,
2930
messageId: "unsorted",
3031
*fix(fixer) {
3132
for (const [node, complement] of enumerate(nodes, sorted)) {

src/rules/exports.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,10 @@ export default {
5151
getSortValue(a).localeCompare(getSortValue(b))
5252
)
5353

54-
if (isUnsorted(nodes, sorted)) {
54+
const firstUnsortedNode = isUnsorted(nodes, sorted)
55+
if (firstUnsortedNode) {
5556
context.report({
56-
node: nodes[0],
57+
node: firstUnsortedNode,
5758
messageId: "unsorted",
5859
*fix(fixer) {
5960
for (const [node, complement] of enumerate(nodes, sorted)) {

src/rules/import-members.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import {
1111

1212
export default {
1313
create(context) {
14+
const source = context.getSourceCode()
15+
1416
return {
1517
ImportDeclaration(decl) {
1618
const nodes = filterNodes(decl.specifiers, ["ImportSpecifier"])
@@ -24,11 +26,10 @@ export default {
2426
.slice()
2527
.sort(alphaSorter((node) => node.imported.name.toLowerCase()))
2628

27-
if (isUnsorted(nodes, sorted)) {
28-
const source = context.getSourceCode()
29-
29+
const firstUnsortedNode = isUnsorted(nodes, sorted)
30+
if (firstUnsortedNode) {
3031
context.report({
31-
node: nodes[0],
32+
node: firstUnsortedNode,
3233
messageId: "unsorted",
3334
*fix(fixer) {
3435
for (const [node, complement] of enumerate(nodes, sorted)) {

src/rules/imports.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,15 @@ export default {
7272
getSortValue(a).localeCompare(getSortValue(b))
7373
)
7474

75-
if (isUnsorted(nodes, sorted)) {
75+
const firstUnsortedNode = isUnsorted(nodes, sorted)
76+
if (firstUnsortedNode) {
7677
// When sorting, the comments for the first node are not copied as
7778
// we cannot determine if they are comments for the entire file or
7879
// just the first import.
7980
const isFirst = (node: ImportDeclaration) => node === nodes[0]
8081

8182
context.report({
82-
node: nodes[0],
83+
node: firstUnsortedNode,
8384
messageId: "unsorted",
8485
*fix(fixer) {
8586
for (const [node, complement] of enumerate(nodes, sorted)) {

src/rules/object-properties.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,19 @@ function groupNodes(properties: (Property | SpreadElement)[]) {
3333

3434
export default {
3535
create(context) {
36+
const source = context.getSourceCode()
37+
3638
return {
3739
ObjectExpression(expression) {
3840
for (const nodes of groupNodes(expression.properties)) {
3941
const sorted = nodes
4042
.slice()
4143
.sort(alphaSorter((node) => getName(node.key).toLowerCase()))
4244

43-
if (isUnsorted(nodes, sorted)) {
44-
const source = context.getSourceCode()
45-
45+
const firstUnsortedNode = isUnsorted(nodes, sorted)
46+
if (firstUnsortedNode) {
4647
context.report({
47-
node: nodes[0],
48+
node: firstUnsortedNode,
4849
messageId: "unsorted",
4950
*fix(fixer) {
5051
for (const [node, complement] of enumerate(nodes, sorted)) {

src/rules/type-properties.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,10 @@ export default ESLintUtils.RuleCreator.withoutDocs({
6161
getSortValue(a).localeCompare(getSortValue(b))
6262
)
6363

64-
if (isUnsorted(nodes, sorted)) {
64+
const firstUnsortedNode = isUnsorted(nodes, sorted)
65+
if (firstUnsortedNode) {
6566
context.report({
66-
node: nodes[0],
67+
node: firstUnsortedNode,
6768
messageId: "unsorted",
6869
*fix(fixer) {
6970
for (const [node, complement] of enumerate(nodes, sorted)) {

src/utils.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ import { AST, SourceCode } from "eslint"
22
import { Expression, Node } from "estree"
33

44
/**
5-
* Returns true if any node in the source array is different from the same
5+
* Returns the first node in the source array that is different from the same
66
* positioned node in the sorted array.
77
*/
88
export function isUnsorted<T>(nodes: T[], sorted: T[]) {
9-
return nodes.some((node, i) => node !== sorted[i])
9+
return nodes.find((node, i) => node !== sorted[i])
1010
}
1111

1212
/**

0 commit comments

Comments
 (0)