@@ -218,6 +218,7 @@ module.exports = {
218
218
url : 'https://eslint.vuejs.org/rules/order-in-components.html'
219
219
} ,
220
220
fixable : 'code' , // null or "code" or "whitespace"
221
+ hasSuggestions : true ,
221
222
schema : [
222
223
{
223
224
type : 'object' ,
@@ -231,7 +232,9 @@ module.exports = {
231
232
] ,
232
233
messages : {
233
234
order :
234
- 'The "{{name}}" property should be above the "{{firstUnorderedPropertyName}}" property on line {{line}}.'
235
+ 'The "{{name}}" property should be above the "{{firstUnorderedPropertyName}}" property on line {{line}}.' ,
236
+ reorderWithSideEffects :
237
+ 'Manually move "{{name}}" property above "{{firstUnorderedPropertyName}}" property on line {{line}} (might break side effects).'
235
238
}
236
239
} ,
237
240
/** @param {RuleContext } context */
@@ -255,6 +258,30 @@ module.exports = {
255
258
return num == null ? - 1 : num
256
259
}
257
260
261
+ /**
262
+ * @param {Property } propertyNode
263
+ * @param {Property } unorderedPropertyNode
264
+ */
265
+ function * handleFix ( fixer , propertyNode , unorderedPropertyNode ) {
266
+ const afterComma = sourceCode . getTokenAfter ( propertyNode )
267
+ const hasAfterComma = isComma ( afterComma )
268
+
269
+ const beforeComma = sourceCode . getTokenBefore ( propertyNode )
270
+ const codeStart = beforeComma . range [ 1 ] // to include comments
271
+ const codeEnd = hasAfterComma
272
+ ? afterComma . range [ 1 ]
273
+ : propertyNode . range [ 1 ]
274
+
275
+ const removeStart = hasAfterComma ? codeStart : beforeComma . range [ 0 ]
276
+ yield fixer . removeRange ( [ removeStart , codeEnd ] )
277
+
278
+ const propertyCode =
279
+ sourceCode . text . slice ( codeStart , codeEnd ) + ( hasAfterComma ? '' : ',' )
280
+ const insertTarget = sourceCode . getTokenBefore ( unorderedPropertyNode )
281
+
282
+ yield fixer . insertTextAfter ( insertTarget , propertyCode )
283
+ }
284
+
258
285
/**
259
286
* @param {(Property | SpreadElement)[] } propertiesNodes
260
287
*/
@@ -287,6 +314,18 @@ module.exports = {
287
314
288
315
if ( firstUnorderedProperty ) {
289
316
const line = firstUnorderedProperty . node . loc . start . line
317
+ const propertyNode = property . node
318
+ const firstUnorderedPropertyNode = firstUnorderedProperty . node
319
+ const hasSideEffectsPossibility = propertiesNodes
320
+ . slice (
321
+ propertiesNodes . indexOf ( firstUnorderedPropertyNode ) ,
322
+ propertiesNodes . indexOf ( propertyNode ) + 1
323
+ )
324
+ . some (
325
+ ( property ) =>
326
+ ! isNotSideEffectsNode ( property , sourceCode . visitorKeys )
327
+ )
328
+
290
329
context . report ( {
291
330
node : property . node ,
292
331
messageId : 'order' ,
@@ -295,44 +334,24 @@ module.exports = {
295
334
firstUnorderedPropertyName : firstUnorderedProperty . name ,
296
335
line
297
336
} ,
298
- * fix ( fixer ) {
299
- const propertyNode = property . node
300
- const firstUnorderedPropertyNode = firstUnorderedProperty . node
301
- const hasSideEffectsPossibility = propertiesNodes
302
- . slice (
303
- propertiesNodes . indexOf ( firstUnorderedPropertyNode ) ,
304
- propertiesNodes . indexOf ( propertyNode ) + 1
305
- )
306
- . some (
307
- ( property ) =>
308
- ! isNotSideEffectsNode ( property , sourceCode . visitorKeys )
309
- )
310
- if ( hasSideEffectsPossibility ) {
311
- return
312
- }
313
- const afterComma = sourceCode . getTokenAfter ( propertyNode )
314
- const hasAfterComma = isComma ( afterComma )
315
-
316
- const beforeComma = sourceCode . getTokenBefore ( propertyNode )
317
- const codeStart = beforeComma . range [ 1 ] // to include comments
318
- const codeEnd = hasAfterComma
319
- ? afterComma . range [ 1 ]
320
- : propertyNode . range [ 1 ]
321
-
322
- const removeStart = hasAfterComma
323
- ? codeStart
324
- : beforeComma . range [ 0 ]
325
- yield fixer . removeRange ( [ removeStart , codeEnd ] )
326
-
327
- const propertyCode =
328
- sourceCode . text . slice ( codeStart , codeEnd ) +
329
- ( hasAfterComma ? '' : ',' )
330
- const insertTarget = sourceCode . getTokenBefore (
331
- firstUnorderedPropertyNode
332
- )
333
-
334
- yield fixer . insertTextAfter ( insertTarget , propertyCode )
335
- }
337
+ fix : hasSideEffectsPossibility
338
+ ? undefined
339
+ : ( fixer ) =>
340
+ handleFix ( fixer , propertyNode , firstUnorderedPropertyNode ) ,
341
+ suggest : hasSideEffectsPossibility
342
+ ? [
343
+ {
344
+ messageId : 'reorderWithSideEffects' ,
345
+ data : {
346
+ name : property . name ,
347
+ firstUnorderedPropertyName : firstUnorderedProperty . name ,
348
+ line
349
+ } ,
350
+ fix : ( fixer ) =>
351
+ handleFix ( fixer , propertyNode , firstUnorderedPropertyNode )
352
+ }
353
+ ]
354
+ : undefined
336
355
} )
337
356
}
338
357
}
0 commit comments