Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 7cb78d1

Browse files
hendrikheilFloEdelmann
andauthored
fix: support multiple macro calls in vue/define-macros-order (#2386)
Co-authored-by: Flo Edelmann <git@flo-edelmann.de>
1 parent b7ccbbd commit 7cb78d1

File tree

2 files changed

+126
-7
lines changed

2 files changed

+126
-7
lines changed

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

Lines changed: 13 additions & 7 deletions
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
}

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

Lines changed: 113 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /