@@ -40,11 +40,21 @@ function isReservedPropName(name, list) {
40
40
return list . indexOf ( name ) >= 0 ;
41
41
}
42
42
43
- function alphabeticalCompare ( a , b , ignoreCase ) {
44
- if ( ignoreCase ) {
43
+ function propNameCompare ( a , b , options ) {
44
+ if ( options . ignoreCase ) {
45
45
a = a . toLowerCase ( ) ;
46
46
b = b . toLowerCase ( ) ;
47
47
}
48
+ if ( options . reservedFirst ) {
49
+ const aIsReserved = isReservedPropName ( a , options . reservedList ) ;
50
+ const bIsReserved = isReservedPropName ( b , options . reservedList ) ;
51
+ if ( ( aIsReserved && bIsReserved ) || ( ! aIsReserved && ! bIsReserved ) ) {
52
+ return a . localeCompare ( b ) ;
53
+ } else if ( aIsReserved && ! bIsReserved ) {
54
+ return - 1 ;
55
+ }
56
+ return 1 ;
57
+ }
48
58
return a . localeCompare ( b ) ;
49
59
}
50
60
@@ -77,19 +87,20 @@ function getGroupsOfSortableAttributes(attributes) {
77
87
return sortableAttributeGroups ;
78
88
}
79
89
80
- const generateFixerFunction = ( node , context ) => {
90
+ const generateFixerFunction = ( node , context , reservedList ) => {
81
91
const sourceCode = context . getSourceCode ( ) ;
82
92
const attributes = node . attributes . slice ( 0 ) ;
83
93
const configuration = context . options [ 0 ] || { } ;
84
94
const ignoreCase = configuration . ignoreCase || false ;
95
+ const reservedFirst = configuration . reservedFirst || false ;
85
96
86
97
// Sort props according to the context. Only supports ignoreCase.
87
98
// Since we cannot safely move JSXSpreadAttribute (due to potential variable overrides),
88
99
// we only consider groups of sortable attributes.
89
100
const sortableAttributeGroups = getGroupsOfSortableAttributes ( attributes ) ;
90
101
const sortedAttributeGroups = sortableAttributeGroups . slice ( 0 ) . map ( group =>
91
102
group . slice ( 0 ) . sort ( ( a , b ) =>
92
- alphabeticalCompare ( propName ( a ) , propName ( b ) , ignoreCase )
103
+ propNameCompare ( propName ( a ) , propName ( b ) , { ignoreCase, reservedFirst , reservedList } )
93
104
)
94
105
) ;
95
106
@@ -235,23 +246,22 @@ module.exports = {
235
246
const previousIsReserved = isReservedPropName ( previousPropName , reservedList ) ;
236
247
const currentIsReserved = isReservedPropName ( currentPropName , reservedList ) ;
237
248
238
- if ( previousIsReserved && currentIsReserved ) {
249
+ if ( ( previousIsReserved && currentIsReserved ) || ( ! previousIsReserved && ! currentIsReserved ) ) {
239
250
if ( ! noSortAlphabetically && currentPropName < previousPropName ) {
240
251
context . report ( {
241
252
node : decl ,
242
253
message : 'Props should be sorted alphabetically' ,
243
- fix : generateFixerFunction ( node , context )
254
+ fix : generateFixerFunction ( node , context , reservedList )
244
255
} ) ;
245
256
return memo ;
246
257
}
247
- return decl ;
248
258
}
249
259
if ( ! previousIsReserved && currentIsReserved ) {
250
260
context . report ( {
251
261
node : decl ,
252
- message : 'Reserved props must be listed before all other props'
262
+ message : 'Reserved props must be listed before all other props' ,
263
+ fix : generateFixerFunction ( node , context , reservedList )
253
264
} ) ;
254
- return memo ;
255
265
}
256
266
return decl ;
257
267
}
0 commit comments