1
1
import naturalCompare from "natural-compare" ;
2
2
import { createRule } from "../utils" ;
3
- import { isCommaToken } from "@eslint-community/eslint-utils" ;
4
3
import type { AST } from "jsonc-eslint-parser" ;
5
4
import { getStaticJSONValue } from "jsonc-eslint-parser" ;
6
- import type { SourceCode , AST as ESLintAST } from "eslint" ;
5
+ import type { SourceCode } from "eslint" ;
6
+ import type { AroundTarget } from "../utils/fix-sort-elements" ;
7
+ import { fixForSorting } from "../utils/fix-sort-elements" ;
7
8
8
9
type JSONValue = ReturnType < typeof getStaticJSONValue > ;
9
10
@@ -40,7 +41,6 @@ type ParsedOption = {
40
41
type Validator = ( a : JSONElementData , b : JSONElementData ) => boolean ;
41
42
42
43
type JSONElement = AST . JSONArrayExpression [ "elements" ] [ number ] ;
43
- type AroundTokens = { before : ESLintAST . Token ; after : ESLintAST . Token } ;
44
44
class JSONElementData {
45
45
public readonly array : JSONArrayData ;
46
46
@@ -50,52 +50,37 @@ class JSONElementData {
50
50
51
51
private cached : { value : JSONValue } | null = null ;
52
52
53
- private cachedRange : [ number , number ] | null = null ;
54
-
55
- private cachedAroundTokens : AroundTokens | null = null ;
53
+ private cachedAround : AroundTarget | null = null ;
56
54
57
55
public get reportLoc ( ) {
58
56
if ( this . node ) {
59
57
return this . node . loc ;
60
58
}
61
- const aroundTokens = this . aroundTokens ;
59
+ const around = this . around ;
62
60
return {
63
- start : aroundTokens . before . loc . end ,
64
- end : aroundTokens . after . loc . start ,
61
+ start : around . before . loc . end ,
62
+ end : around . after . loc . start ,
65
63
} ;
66
64
}
67
65
68
- public get range ( ) : [ number , number ] {
69
- if ( this . node ) {
70
- return this . node . range ;
71
- }
72
- if ( this . cachedRange ) {
73
- return this . cachedRange ;
74
- }
75
- const aroundTokens = this . aroundTokens ;
76
- return ( this . cachedRange = [
77
- aroundTokens . before . range [ 1 ] ,
78
- aroundTokens . after . range [ 0 ] ,
79
- ] ) ;
80
- }
81
-
82
- public get aroundTokens ( ) : AroundTokens {
83
- if ( this . cachedAroundTokens ) {
84
- return this . cachedAroundTokens ;
66
+ public get around ( ) : AroundTarget {
67
+ if ( this . cachedAround ) {
68
+ return this . cachedAround ;
85
69
}
86
70
const sourceCode = this . array . sourceCode ;
87
71
if ( this . node ) {
88
- return ( this . cachedAroundTokens = {
72
+ return ( this . cachedAround = {
73
+ node : this . node ,
89
74
before : sourceCode . getTokenBefore ( this . node as never ) ! ,
90
75
after : sourceCode . getTokenAfter ( this . node as never ) ! ,
91
76
} ) ;
92
77
}
93
78
const before =
94
79
this . index > 0
95
- ? this . array . elements [ this . index - 1 ] . aroundTokens . after
80
+ ? this . array . elements [ this . index - 1 ] . around . after
96
81
: sourceCode . getFirstToken ( this . array . node as never ) ! ;
97
82
const after = sourceCode . getTokenAfter ( before ) ! ;
98
- return ( this . cachedAroundTokens = { before, after } ) ;
83
+ return ( this . cachedAround = { before, after } ) ;
99
84
}
100
85
101
86
public constructor ( array : JSONArrayData , node : JSONElement , index : number ) {
@@ -426,7 +411,7 @@ export default createRule("sort-array-values", {
426
411
prevValue : toText ( prev ) ,
427
412
orderText : option . orderText ( data ) ,
428
413
} ,
429
- * fix ( fixer ) {
414
+ fix ( fixer ) {
430
415
let moveTarget = prevList [ 0 ] ;
431
416
for ( const prev of prevList ) {
432
417
if ( option . isValidOrder ( prev , data ) ) {
@@ -435,26 +420,12 @@ export default createRule("sort-array-values", {
435
420
moveTarget = prev ;
436
421
}
437
422
}
438
-
439
- const beforeToken = data . aroundTokens . before ;
440
- const afterToken = data . aroundTokens . after ;
441
- const hasAfterComma = isCommaToken ( afterToken ) ;
442
- const codeStart = beforeToken . range [ 1 ] ; // to include comments
443
- const codeEnd = hasAfterComma
444
- ? afterToken . range [ 1 ] // |/**/ value,|
445
- : data . range [ 1 ] ; // |/**/ value|
446
- const removeStart = hasAfterComma
447
- ? codeStart // |/**/ value,|
448
- : beforeToken . range [ 0 ] ; // |,/**/ value|
449
-
450
- const insertCode =
451
- sourceCode . text . slice ( codeStart , codeEnd ) +
452
- ( hasAfterComma ? "" : "," ) ;
453
-
454
- const insertTarget = moveTarget . aroundTokens . before ;
455
- yield fixer . insertTextAfterRange ( insertTarget . range , insertCode ) ;
456
-
457
- yield fixer . removeRange ( [ removeStart , codeEnd ] ) ;
423
+ return fixForSorting (
424
+ fixer ,
425
+ sourceCode ,
426
+ data . around ,
427
+ moveTarget . around ,
428
+ ) ;
458
429
} ,
459
430
} ) ;
460
431
}
0 commit comments