Skip to content

Commit 7cb78d1

Browse files
fix: support multiple macro calls in vue/define-macros-order (#2386)
Co-authored-by: Flo Edelmann <[email protected]>
1 parent b7ccbbd commit 7cb78d1

File tree

2 files changed

+126
-7
lines changed

2 files changed

+126
-7
lines changed

Diff for: lib/rules/define-macros-order.js

+13-7
Original file line numberDiff line numberDiff line change
@@ -104,27 +104,29 @@ function create(context) {
104104
const order = (options[0] && options[0].order) || DEFAULT_ORDER
105105
/** @type {boolean} */
106106
const defineExposeLast = (options[0] && options[0].defineExposeLast) || false
107-
/** @type {Map<string, ASTNode>} */
107+
/** @type {Map<string, ASTNode[]>} */
108108
const macrosNodes = new Map()
109109
/** @type {ASTNode} */
110110
let defineExposeNode
111111

112112
return utils.compositingVisitors(
113113
utils.defineScriptSetupVisitor(context, {
114114
onDefinePropsExit(node) {
115-
macrosNodes.set(MACROS_PROPS, getDefineMacrosStatement(node))
115+
macrosNodes.set(MACROS_PROPS, [getDefineMacrosStatement(node)])
116116
},
117117
onDefineEmitsExit(node) {
118-
macrosNodes.set(MACROS_EMITS, getDefineMacrosStatement(node))
118+
macrosNodes.set(MACROS_EMITS, [getDefineMacrosStatement(node)])
119119
},
120120
onDefineOptionsExit(node) {
121-
macrosNodes.set(MACROS_OPTIONS, getDefineMacrosStatement(node))
121+
macrosNodes.set(MACROS_OPTIONS, [getDefineMacrosStatement(node)])
122122
},
123123
onDefineSlotsExit(node) {
124-
macrosNodes.set(MACROS_SLOTS, getDefineMacrosStatement(node))
124+
macrosNodes.set(MACROS_SLOTS, [getDefineMacrosStatement(node)])
125125
},
126126
onDefineModelExit(node) {
127-
macrosNodes.set(MACROS_MODEL, getDefineMacrosStatement(node))
127+
const currentModelMacros = macrosNodes.get(MACROS_MODEL) ?? []
128+
currentModelMacros.push(getDefineMacrosStatement(node))
129+
macrosNodes.set(MACROS_MODEL, currentModelMacros)
128130
},
129131
onDefineExposeExit(node) {
130132
defineExposeNode = getDefineMacrosStatement(node)
@@ -142,7 +144,10 @@ function create(context) {
142144
program
143145
)
144146
const orderedList = order
145-
.map((name) => ({ name, node: macrosNodes.get(name) }))
147+
.flatMap((name) => {
148+
const nodes = macrosNodes.get(name) ?? []
149+
return nodes.map((node) => ({ name, node }))
150+
})
146151
.filter(
147152
/** @returns {data is OrderedData} */
148153
(data) => utils.isDef(data.node)
@@ -165,6 +170,7 @@ function create(context) {
165170
.map(({ node }) => node)
166171
const targetStatementIndex =
167172
moveTargetNodes.indexOf(targetStatement)
173+
168174
if (targetStatementIndex >= 0) {
169175
moveTargetNodes = moveTargetNodes.slice(0, targetStatementIndex)
170176
}

Diff for: tests/lib/rules/define-macros-order.js

+113
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,22 @@ tester.run('define-macros-order', rule, {
238238
parser: require.resolve('@typescript-eslint/parser')
239239
}
240240
}
241+
},
242+
{
243+
filename: 'test.vue',
244+
code: `
245+
<script setup>
246+
const first = defineModel('first')
247+
const second = defineModel('second')
248+
249+
const slots = defineSlots()
250+
</script>
251+
`,
252+
options: [
253+
{
254+
order: ['defineModel', 'defineSlots']
255+
}
256+
]
241257
}
242258
],
243259
invalid: [
@@ -818,6 +834,103 @@ tester.run('define-macros-order', rule, {
818834
line: 8
819835
}
820836
]
837+
},
838+
{
839+
filename: 'test.vue',
840+
code: `
841+
<script setup>
842+
/** options */
843+
defineOptions({})
844+
/** model */
845+
const first = defineModel('first')
846+
const second = defineModel('second')
847+
</script>
848+
`,
849+
output: `
850+
<script setup>
851+
/** model */
852+
const first = defineModel('first')
853+
const second = defineModel('second')
854+
/** options */
855+
defineOptions({})
856+
</script>
857+
`,
858+
options: [
859+
{
860+
order: ['defineModel', 'defineOptions']
861+
}
862+
],
863+
errors: [
864+
{
865+
message: message('defineModel'),
866+
line: 6
867+
}
868+
]
869+
},
870+
{
871+
filename: 'test.vue',
872+
code: `
873+
<script setup>
874+
const first = defineModel('first')
875+
defineOptions({})
876+
const second = defineModel('second')
877+
</script>
878+
`,
879+
output: `
880+
<script setup>
881+
const first = defineModel('first')
882+
const second = defineModel('second')
883+
defineOptions({})
884+
</script>
885+
`,
886+
options: [
887+
{
888+
order: ['defineModel', 'defineOptions']
889+
}
890+
],
891+
errors: [
892+
{
893+
message: message('defineModel'),
894+
line: 5
895+
}
896+
]
897+
},
898+
{
899+
filename: 'test.vue',
900+
code: `
901+
<script setup>
902+
const a = defineModel('a')
903+
defineOptions({})
904+
const c = defineModel('c')
905+
defineExpose({})
906+
const b = defineModel('b')
907+
</script>
908+
`,
909+
output: `
910+
<script setup>
911+
const a = defineModel('a')
912+
const c = defineModel('c')
913+
const b = defineModel('b')
914+
defineOptions({})
915+
defineExpose({})
916+
</script>
917+
`,
918+
options: [
919+
{
920+
order: ['defineModel', 'defineOptions'],
921+
defineExposeLast: true
922+
}
923+
],
924+
errors: [
925+
{
926+
message: message('defineModel'),
927+
line: 5
928+
},
929+
{
930+
message: defineExposeNotTheLast,
931+
line: 6
932+
}
933+
]
821934
}
822935
]
823936
})

0 commit comments

Comments
 (0)