diff --git a/lib/rules/require-explicit-emits.js b/lib/rules/require-explicit-emits.js index 7e06bf478..ba5c406b1 100644 --- a/lib/rules/require-explicit-emits.js +++ b/lib/rules/require-explicit-emits.js @@ -71,6 +71,22 @@ function getNameParamNode(node) { return null } +/** + * Check if the given name matches defineEmitsNode variable name + * @param {string} name + * @param {CallExpression | undefined} defineEmitsNode + * @returns {boolean} + */ +function isEmitVariableName(name, defineEmitsNode) { + const node = defineEmitsNode?.parent + + if (node?.type === 'VariableDeclarator' && node.id.type === 'Identifier') { + return name === node.id.name + } + + return false +} + module.exports = { meta: { type: 'suggestion', @@ -251,7 +267,16 @@ module.exports = { if (!vueTemplateDefineData) { return } - if (callee.type === 'Identifier' && callee.name === '$emit') { + + // e.g. $emit() / emit() in template + if ( + callee.type === 'Identifier' && + (callee.name === '$emit' || + isEmitVariableName( + callee.name, + vueTemplateDefineData.defineEmits + )) + ) { verifyEmit( vueTemplateDefineData.emits, vueTemplateDefineData.props, diff --git a/tests/lib/rules/require-explicit-emits.js b/tests/lib/rules/require-explicit-emits.js index af90569dd..89ae47627 100644 --- a/tests/lib/rules/require-explicit-emits.js +++ b/tests/lib/rules/require-explicit-emits.js @@ -461,6 +461,19 @@ tester.run('require-explicit-emits', rule, { `, parserOptions: { parser: require.resolve('@typescript-eslint/parser') } }, + { + filename: 'test.vue', + code: ` + + + `, + parserOptions: { parser: require.resolve('@typescript-eslint/parser') } + }, // unknown emits definition { @@ -1983,6 +1996,25 @@ emits: {'foo': null} } ], ...getTypeScriptFixtureTestOptions() + }, + { + filename: 'test.vue', + code: ` + + + `, + parserOptions: { parser: require.resolve('@typescript-eslint/parser') }, + errors: [ + { + message: + 'The "bar" event has been triggered but not declared on `defineEmits`.', + line: 3 + } + ] } ] })