Skip to content

Commit 66d24c3

Browse files
committed
fix(define-macros-order): distinguish between macros placement and ordering errors (#2940)
Separate error messages for two distinct cases: - macrosNotAtTop: when a macro comes after non-macro statements - macrosUnordered: when macros are not in the correct order relative to each other This provides clearer feedback to users about what needs to be fixed.
1 parent 9581472 commit 66d24c3

File tree

3 files changed

+54
-32
lines changed

3 files changed

+54
-32
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'eslint-plugin-vue': patch
3+
---
4+
5+
Improved `vue/define-macros-order` error messages to distinguish between macro placement and ordering issues

lib/rules/define-macros-order.js

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -220,13 +220,25 @@ function create(context) {
220220
* @param {ASTNode} before
221221
*/
222222
function reportNotOnTop(macro, nodes, before) {
223+
// Determine if 'before' is a macro from the order list
224+
let beforeMacro = null
225+
for (const macroName of order) {
226+
const macroNodes = macrosNodes.get(macroName) ?? []
227+
if (macroNodes.includes(before)) {
228+
beforeMacro = macroName
229+
break
230+
}
231+
}
232+
233+
// Decide which message to use
234+
const messageId = beforeMacro ? 'macrosUnordered' : 'macrosNotAtTop'
235+
const data = beforeMacro ? { macro, before: beforeMacro } : { macro }
236+
223237
context.report({
224238
node: nodes[0],
225239
loc: nodes[0].loc,
226-
messageId: 'macrosNotOnTop',
227-
data: {
228-
macro
229-
},
240+
messageId,
241+
data,
230242
*fix(fixer) {
231243
for (const node of nodes) {
232244
yield* moveNodeBefore(fixer, node, before)
@@ -392,8 +404,9 @@ module.exports = {
392404
}
393405
],
394406
messages: {
395-
macrosNotOnTop:
396-
'{{macro}} should be the first statement in `<script setup>` (after any potential import statements or type definitions).',
407+
macrosNotAtTop:
408+
'{{macro}} should be placed at the top of `<script setup>` (after any potential import statements or type definitions).',
409+
macrosUnordered: '{{macro}} should be above {{before}}.',
397410
defineExposeNotTheLast:
398411
'`defineExpose` should be the last statement in `<script setup>`.',
399412
putExposeAtTheLast:

tests/lib/rules/define-macros-order.js

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,12 @@ const optionsExposeLast = [
3333
}
3434
]
3535

36-
function message(macro) {
37-
return `${macro} should be the first statement in \`<script setup>\` (after any potential import statements or type definitions).`
36+
function notAtTopMessage(macro) {
37+
return `${macro} should be placed at the top of \`<script setup>\` (after any potential import statements or type definitions).`
38+
}
39+
40+
function unorderedMessage(macro, before) {
41+
return `${macro} should be above ${before}.`
3842
}
3943

4044
const defineExposeNotTheLast =
@@ -355,7 +359,7 @@ tester.run('define-macros-order', rule, {
355359
options: optionsEmitsFirst,
356360
errors: [
357361
{
358-
message: message('defineEmits'),
362+
message: notAtTopMessage('defineEmits'),
359363
line: 5,
360364
column: 11,
361365
endLine: 5,
@@ -394,7 +398,7 @@ tester.run('define-macros-order', rule, {
394398
options: optionsPropsFirst,
395399
errors: [
396400
{
397-
message: message('defineProps'),
401+
message: notAtTopMessage('defineProps'),
398402
line: 8,
399403
column: 11,
400404
endLine: 10,
@@ -430,7 +434,7 @@ tester.run('define-macros-order', rule, {
430434
options: optionsPropsFirst,
431435
errors: [
432436
{
433-
message: message('defineProps'),
437+
message: unorderedMessage('defineProps', 'defineEmits'),
434438
line: 6,
435439
column: 11,
436440
endLine: 8,
@@ -465,7 +469,7 @@ tester.run('define-macros-order', rule, {
465469
options: optionsEmitsFirst,
466470
errors: [
467471
{
468-
message: message('defineEmits'),
472+
message: notAtTopMessage('defineEmits'),
469473
line: 8,
470474
column: 11,
471475
endLine: 8,
@@ -502,7 +506,7 @@ tester.run('define-macros-order', rule, {
502506
options: [{ order: ['definePage', 'defineProps'] }],
503507
errors: [
504508
{
505-
message: message('definePage'),
509+
message: notAtTopMessage('definePage'),
506510
line: 8,
507511
column: 11,
508512
endLine: 10,
@@ -548,7 +552,7 @@ tester.run('define-macros-order', rule, {
548552
},
549553
errors: [
550554
{
551-
message: message('defineEmits'),
555+
message: unorderedMessage('defineEmits', 'defineProps'),
552556
line: 12,
553557
column: 11,
554558
endLine: 12,
@@ -606,7 +610,7 @@ tester.run('define-macros-order', rule, {
606610
},
607611
errors: [
608612
{
609-
message: message('definePage'),
613+
message: unorderedMessage('definePage', 'defineProps'),
610614
line: 15,
611615
column: 11,
612616
endLine: 17,
@@ -647,7 +651,7 @@ tester.run('define-macros-order', rule, {
647651
},
648652
errors: [
649653
{
650-
message: message('defineProps'),
654+
message: notAtTopMessage('defineProps'),
651655
line: 10,
652656
column: 11,
653657
endLine: 10,
@@ -705,7 +709,7 @@ tester.run('define-macros-order', rule, {
705709
},
706710
errors: [
707711
{
708-
message: message('defineEmits'),
712+
message: notAtTopMessage('defineEmits'),
709713
line: 16,
710714
column: 11,
711715
endLine: 16,
@@ -727,7 +731,7 @@ tester.run('define-macros-order', rule, {
727731
options: optionsEmitsFirst,
728732
errors: [
729733
{
730-
message: message('defineEmits'),
734+
message: unorderedMessage('defineEmits', 'defineProps'),
731735
line: 3,
732736
column: 56,
733737
endLine: 3,
@@ -749,7 +753,7 @@ tester.run('define-macros-order', rule, {
749753
options: [{ order: ['definePage', 'defineProps'] }],
750754
errors: [
751755
{
752-
message: message('definePage'),
756+
message: unorderedMessage('definePage', 'defineProps'),
753757
line: 3,
754758
column: 56,
755759
endLine: 3,
@@ -787,7 +791,7 @@ tester.run('define-macros-order', rule, {
787791
`,
788792
errors: [
789793
{
790-
message: message('defineProps'),
794+
message: unorderedMessage('defineProps', 'defineEmits'),
791795
line: 11,
792796
column: 11,
793797
endLine: 11,
@@ -805,7 +809,7 @@ tester.run('define-macros-order', rule, {
805809
`,
806810
errors: [
807811
{
808-
message: message('defineProps'),
812+
message: unorderedMessage('defineProps', 'defineEmits'),
809813
line: 2,
810814
column: 52,
811815
endLine: 2,
@@ -830,7 +834,7 @@ tester.run('define-macros-order', rule, {
830834
options: optionsEmitsFirst,
831835
errors: [
832836
{
833-
message: message('defineProps'),
837+
message: notAtTopMessage('defineProps'),
834838
line: 4,
835839
column: 11,
836840
endLine: 4,
@@ -857,7 +861,7 @@ tester.run('define-macros-order', rule, {
857861
options: optionsEmitsFirst,
858862
errors: [
859863
{
860-
message: message('defineProps'),
864+
message: notAtTopMessage('defineProps'),
861865
line: 5,
862866
column: 11,
863867
endLine: 5,
@@ -884,7 +888,7 @@ tester.run('define-macros-order', rule, {
884888
options: [{ order: ['defineCustom', 'definePage'] }],
885889
errors: [
886890
{
887-
message: message('defineCustom'),
891+
message: unorderedMessage('defineCustom', 'definePage'),
888892
line: 5,
889893
column: 11,
890894
endLine: 5,
@@ -911,7 +915,7 @@ tester.run('define-macros-order', rule, {
911915
options: [{ order: ['defineCustom', 'definePage'] }],
912916
errors: [
913917
{
914-
message: message('defineCustom'),
918+
message: unorderedMessage('defineCustom', 'definePage'),
915919
line: 5,
916920
column: 11,
917921
endLine: 5,
@@ -966,7 +970,7 @@ tester.run('define-macros-order', rule, {
966970
],
967971
errors: [
968972
{
969-
message: message('defineOptions'),
973+
message: notAtTopMessage('defineOptions'),
970974
line: 12,
971975
column: 11,
972976
endLine: 12,
@@ -1017,7 +1021,7 @@ tester.run('define-macros-order', rule, {
10171021
],
10181022
errors: [
10191023
{
1020-
message: message('defineOptions'),
1024+
message: unorderedMessage('defineOptions', 'defineSlots'),
10211025
line: 6,
10221026
column: 11,
10231027
endLine: 6,
@@ -1128,7 +1132,7 @@ tester.run('define-macros-order', rule, {
11281132
]
11291133
},
11301134
{
1131-
message: message('defineOptions'),
1135+
message: unorderedMessage('defineOptions', 'defineEmits'),
11321136
line: 8,
11331137
column: 11,
11341138
endLine: 8,
@@ -1163,7 +1167,7 @@ tester.run('define-macros-order', rule, {
11631167
],
11641168
errors: [
11651169
{
1166-
message: message('defineModel'),
1170+
message: unorderedMessage('defineModel', 'defineOptions'),
11671171
line: 6,
11681172
column: 11,
11691173
endLine: 6,
@@ -1194,7 +1198,7 @@ tester.run('define-macros-order', rule, {
11941198
],
11951199
errors: [
11961200
{
1197-
message: message('defineModel'),
1201+
message: unorderedMessage('defineModel', 'defineOptions'),
11981202
line: 5,
11991203
column: 11,
12001204
endLine: 5,
@@ -1235,7 +1239,7 @@ tester.run('define-macros-order', rule, {
12351239
],
12361240
errors: [
12371241
{
1238-
message: message('defineSomething'),
1242+
message: unorderedMessage('defineSomething', 'defineOptions'),
12391243
line: 5,
12401244
column: 11,
12411245
endLine: 5,
@@ -1271,7 +1275,7 @@ tester.run('define-macros-order', rule, {
12711275
],
12721276
errors: [
12731277
{
1274-
message: message('defineModel'),
1278+
message: unorderedMessage('defineModel', 'defineOptions'),
12751279
line: 5,
12761280
column: 11,
12771281
endLine: 5,

0 commit comments

Comments
 (0)