Skip to content

Commit a5d2482

Browse files
authored
Fix false positives for watch handler methods in vue/no-unused-properties rule (#1255)
1 parent e1c87a1 commit a5d2482

File tree

3 files changed

+86
-5
lines changed

3 files changed

+86
-5
lines changed

Diff for: lib/rules/no-unused-properties.js

+31-3
Original file line numberDiff line numberDiff line change
@@ -583,19 +583,47 @@ module.exports = {
583583
utils.defineVueVisitor(context, {
584584
onVueObjectEnter(node) {
585585
const container = getVueComponentPropertiesContainer(node)
586-
const watcherNames = new Set()
586+
const watcherUsedProperties = new Set()
587587
for (const watcher of utils.iterateProperties(
588588
node,
589589
new Set([GROUP_WATCHER])
590590
)) {
591+
// Process `watch: { foo /* <- this */ () {} }`
591592
let path
592593
for (const seg of watcher.name.split('.')) {
593594
path = path ? `${path}.${seg}` : seg
594-
watcherNames.add(path)
595+
watcherUsedProperties.add(path)
596+
}
597+
598+
// Process `watch: { x: 'foo' /* <- this */ }`
599+
if (watcher.type === 'object') {
600+
const property = watcher.property
601+
if (property.kind === 'init') {
602+
/** @type {Expression | null} */
603+
let handlerValueNode = null
604+
if (property.value.type === 'ObjectExpression') {
605+
const handler = utils.findProperty(property.value, 'handler')
606+
if (handler) {
607+
handlerValueNode = handler.value
608+
}
609+
} else {
610+
handlerValueNode = property.value
611+
}
612+
if (
613+
handlerValueNode &&
614+
(handlerValueNode.type === 'Literal' ||
615+
handlerValueNode.type === 'TemplateLiteral')
616+
) {
617+
const name = utils.getStringLiteralValue(handlerValueNode)
618+
if (name != null) {
619+
watcherUsedProperties.add(name)
620+
}
621+
}
622+
}
595623
}
596624
}
597625
for (const prop of utils.iterateProperties(node, groups)) {
598-
if (watcherNames.has(prop.name)) {
626+
if (watcherUsedProperties.has(prop.name)) {
599627
continue
600628
}
601629
container.properties.push(prop)

Diff for: lib/utils/index.js

+8-2
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383
/**
8484
* @typedef { 'props' | 'data' | 'computed' | 'setup' | 'watch' | 'methods' } GroupName
8585
* @typedef { { type: 'array', name: string, groupName: GroupName, node: Literal | TemplateLiteral } } ComponentArrayPropertyData
86-
* @typedef { { type: 'object', name: string, groupName: GroupName, node: Identifier | Literal | TemplateLiteral } } ComponentObjectPropertyData
86+
* @typedef { { type: 'object', name: string, groupName: GroupName, node: Identifier | Literal | TemplateLiteral, property: Property } } ComponentObjectPropertyData
8787
* @typedef { ComponentArrayPropertyData | ComponentObjectPropertyData } ComponentPropertyData
8888
*/
8989
/**
@@ -1118,7 +1118,13 @@ module.exports = {
11181118
continue
11191119
}
11201120
}
1121-
yield { type: 'object', name, groupName, node: key }
1121+
yield {
1122+
type: 'object',
1123+
name,
1124+
groupName,
1125+
node: key,
1126+
property: item
1127+
}
11221128
}
11231129
}
11241130
}

Diff for: tests/lib/rules/no-unused-properties.js

+47
Original file line numberDiff line numberDiff line change
@@ -1031,6 +1031,53 @@ tester.run('no-unused-properties', rule, {
10311031
}
10321032
})
10331033
`
1034+
},
1035+
// handlers
1036+
{
1037+
filename: 'test.vue',
1038+
code: `
1039+
<script>
1040+
export default {
1041+
props: ['foo', 'bar'],
1042+
watch: {
1043+
foo: 'updateFoo',
1044+
bar: {
1045+
handler: 'updateBar',
1046+
immediate: true
1047+
}
1048+
},
1049+
methods: {
1050+
updateFoo() {},
1051+
updateBar() {}
1052+
}
1053+
};
1054+
</script>
1055+
`,
1056+
options: [{ groups: ['props', 'methods'] }]
1057+
},
1058+
{
1059+
filename: 'test.vue',
1060+
code: `
1061+
<script>
1062+
export default {
1063+
props: ['foo', 'bar'],
1064+
data () {
1065+
return {
1066+
updateFoo() {},
1067+
updateBar() {}
1068+
}
1069+
},
1070+
watch: {
1071+
foo: 'updateFoo',
1072+
bar: {
1073+
handler: 'updateBar',
1074+
immediate: true
1075+
}
1076+
}
1077+
};
1078+
</script>
1079+
`,
1080+
options: [{ groups: ['props', 'data'] }]
10341081
}
10351082
],
10361083

0 commit comments

Comments
 (0)