Skip to content

Commit d99f37b

Browse files
waynzhFloEdelmann
andauthored
fix(require-explicit-emits): detect template emits (#2350)
Co-authored-by: Flo Edelmann <[email protected]>
1 parent cc0b0f0 commit d99f37b

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-1
lines changed

lib/rules/require-explicit-emits.js

+26-1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,22 @@ function getNameParamNode(node) {
7171
return null
7272
}
7373

74+
/**
75+
* Check if the given name matches defineEmitsNode variable name
76+
* @param {string} name
77+
* @param {CallExpression | undefined} defineEmitsNode
78+
* @returns {boolean}
79+
*/
80+
function isEmitVariableName(name, defineEmitsNode) {
81+
const node = defineEmitsNode?.parent
82+
83+
if (node?.type === 'VariableDeclarator' && node.id.type === 'Identifier') {
84+
return name === node.id.name
85+
}
86+
87+
return false
88+
}
89+
7490
module.exports = {
7591
meta: {
7692
type: 'suggestion',
@@ -251,7 +267,16 @@ module.exports = {
251267
if (!vueTemplateDefineData) {
252268
return
253269
}
254-
if (callee.type === 'Identifier' && callee.name === '$emit') {
270+
271+
// e.g. $emit() / emit() in template
272+
if (
273+
callee.type === 'Identifier' &&
274+
(callee.name === '$emit' ||
275+
isEmitVariableName(
276+
callee.name,
277+
vueTemplateDefineData.defineEmits
278+
))
279+
) {
255280
verifyEmit(
256281
vueTemplateDefineData.emits,
257282
vueTemplateDefineData.props,

tests/lib/rules/require-explicit-emits.js

+32
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,19 @@ tester.run('require-explicit-emits', rule, {
461461
`,
462462
parserOptions: { parser: require.resolve('@typescript-eslint/parser') }
463463
},
464+
{
465+
filename: 'test.vue',
466+
code: `
467+
<template>
468+
<div @click="emit('foo')"/>
469+
<div @click="emit('bar')"/>
470+
</template>
471+
<script setup lang="ts">
472+
const emit = defineEmits<(e: 'foo' | 'bar') => void>()
473+
</script>
474+
`,
475+
parserOptions: { parser: require.resolve('@typescript-eslint/parser') }
476+
},
464477

465478
// unknown emits definition
466479
{
@@ -1983,6 +1996,25 @@ emits: {'foo': null}
19831996
}
19841997
],
19851998
...getTypeScriptFixtureTestOptions()
1999+
},
2000+
{
2001+
filename: 'test.vue',
2002+
code: `
2003+
<template>
2004+
<div @click="emit('bar')"/>
2005+
</template>
2006+
<script setup lang="ts">
2007+
const emit = defineEmits<(e: 'foo') => void>()
2008+
</script>
2009+
`,
2010+
parserOptions: { parser: require.resolve('@typescript-eslint/parser') },
2011+
errors: [
2012+
{
2013+
message:
2014+
'The "bar" event has been triggered but not declared on `defineEmits`.',
2015+
line: 3
2016+
}
2017+
]
19862018
}
19872019
]
19882020
})

0 commit comments

Comments
 (0)