Skip to content

Commit 181e857

Browse files
authored
Support template literals in vue/no-deprecated-model-definition (#2258)
1 parent 101cabf commit 181e857

File tree

2 files changed

+75
-7
lines changed

2 files changed

+75
-7
lines changed

lib/rules/no-deprecated-model-definition.js

+9-7
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const allowedEventNames = new Set(['update:modelValue', 'update:model-value'])
1212
/**
1313
* @param {ObjectExpression} node
1414
* @param {string} key
15-
* @returns {Literal | undefined}
15+
* @returns {Literal | TemplateLiteral | undefined}
1616
*/
1717
function findPropertyValue(node, key) {
1818
const property = node.properties.find(
@@ -24,7 +24,7 @@ function findPropertyValue(node, key) {
2424
if (
2525
!property ||
2626
property.type !== 'Property' ||
27-
property.value.type !== 'Literal'
27+
!utils.isStringLiteral(property.value)
2828
) {
2929
return undefined
3030
}
@@ -33,7 +33,7 @@ function findPropertyValue(node, key) {
3333

3434
/**
3535
* @param {RuleFixer} fixer
36-
* @param {Literal} node
36+
* @param {Literal | TemplateLiteral} node
3737
* @param {string} text
3838
*/
3939
function replaceLiteral(fixer, node, text) {
@@ -93,10 +93,12 @@ module.exports = {
9393
if (
9494
!propName ||
9595
!eventName ||
96-
typeof propName.value !== 'string' ||
97-
typeof eventName.value !== 'string' ||
98-
!allowedPropNames.has(propName.value) ||
99-
!allowedEventNames.has(eventName.value)
96+
!allowedPropNames.has(
97+
utils.getStringLiteralValue(propName, true) ?? ''
98+
) ||
99+
!allowedEventNames.has(
100+
utils.getStringLiteralValue(eventName, true) ?? ''
101+
)
100102
) {
101103
context.report({
102104
node: modelProperty,

tests/lib/rules/no-deprecated-model-definition.js

+66
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,20 @@ tester.run('no-deprecated-model-definition', rule, {
5252
</script>
5353
`,
5454
options: [{ allowVue3Compat: true }]
55+
},
56+
{
57+
filename: 'test.vue',
58+
code: `
59+
<script>
60+
export default defineComponent({
61+
model: {
62+
prop: \`model-value\`,
63+
event: \`update:model-value\`
64+
}
65+
})
66+
</script>
67+
`,
68+
options: [{ allowVue3Compat: true }]
5569
}
5670
],
5771
invalid: [
@@ -320,6 +334,58 @@ tester.run('no-deprecated-model-definition', rule, {
320334
]
321335
}
322336
]
337+
},
338+
{
339+
filename: 'test.vue',
340+
code: `
341+
<script>
342+
export default defineComponent({
343+
model: {
344+
prop: \`foo-bar\`,
345+
event: \`update:foo-bar\`
346+
}
347+
})
348+
</script>
349+
`,
350+
options: [{ allowVue3Compat: true }],
351+
errors: [
352+
{
353+
message:
354+
'`model` definition is deprecated. You may use the Vue 3-compatible `modelValue`/`update:modelValue` though.',
355+
line: 4,
356+
column: 11,
357+
endLine: 7,
358+
endColumn: 12,
359+
suggestions: [
360+
{
361+
desc: 'Change to `modelValue`/`update:modelValue`.',
362+
output: `
363+
<script>
364+
export default defineComponent({
365+
model: {
366+
prop: \`modelValue\`,
367+
event: \`update:modelValue\`
368+
}
369+
})
370+
</script>
371+
`
372+
},
373+
{
374+
desc: 'Change to `model-value`/`update:model-value`.',
375+
output: `
376+
<script>
377+
export default defineComponent({
378+
model: {
379+
prop: \`model-value\`,
380+
event: \`update:model-value\`
381+
}
382+
})
383+
</script>
384+
`
385+
}
386+
]
387+
}
388+
]
323389
}
324390
]
325391
})

0 commit comments

Comments
 (0)