diff --git a/lib/rules/no-unused-emit-declarations.js b/lib/rules/no-unused-emit-declarations.js index f96004a36..ee43248cb 100644 --- a/lib/rules/no-unused-emit-declarations.js +++ b/lib/rules/no-unused-emit-declarations.js @@ -56,6 +56,17 @@ function hasReferenceId(value, setupContext) { ) } +/** + * Check if the given name matches emitReferenceIds variable name + * @param {string} name + * @param {Set} emitReferenceIds + * @returns {boolean} + */ +function isEmitVariableName(name, emitReferenceIds) { + const emitVariable = emitReferenceIds.values().next().value.name + return emitVariable === name +} + module.exports = { meta: { type: 'suggestion', @@ -191,6 +202,15 @@ module.exports = { } const { contextReferenceIds, emitReferenceIds } = setupContext + + // verify defineEmits variable in template + if ( + callee.type === 'Identifier' && + isEmitVariableName(callee.name, emitReferenceIds) + ) { + addEmitCall(node) + } + // verify setup(props,{emit}) {emit()} addEmitCallByReference(callee, emitReferenceIds, node) if (emit && emit.name === 'emit') { diff --git a/tests/lib/rules/no-unused-emit-declarations.js b/tests/lib/rules/no-unused-emit-declarations.js index 0667ad464..10bf3b33a 100644 --- a/tests/lib/rules/no-unused-emit-declarations.js +++ b/tests/lib/rules/no-unused-emit-declarations.js @@ -98,6 +98,17 @@ tester.run('no-unused-emit-declarations', rule, { } ` }, + { + filename: 'test.vue', + code: ` + + + ` + }, { filename: 'test.vue', code: ` @@ -237,7 +248,7 @@ tester.run('no-unused-emit-declarations', rule, { export default { emits: ['foo'], setup(_, context) { - useCustomComposable({ emit: context.emit }) + useCustomComposable({ emit: context.emit }) } } @@ -282,7 +293,7 @@ tester.run('no-unused-emit-declarations', rule, { export default { emits: ['foo'], setup(_, { emit }) { - useCustomComposable({ emit: emit }) + useCustomComposable({ emit: emit }) } } @@ -453,6 +464,25 @@ tester.run('no-unused-emit-declarations', rule, { } ] }, + { + filename: 'test.vue', + code: ` + + + `, + errors: [ + { + messageId: 'unused', + line: 6, + column: 35, + endColumn: 40 + } + ] + }, { filename: 'test.vue', code: `