From c099be70bd547b15c2dd976b384b7b53c66b16d0 Mon Sep 17 00:00:00 2001 From: waynzh Date: Sun, 10 Dec 2023 15:39:36 +0800 Subject: [PATCH 1/6] fix(require-explicit-emits): detect template emits --- lib/rules/require-explicit-emits.js | 30 ++++++++++++++++++++++- tests/lib/rules/require-explicit-emits.js | 19 ++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/lib/rules/require-explicit-emits.js b/lib/rules/require-explicit-emits.js index 7e06bf478..78cf9e9e8 100644 --- a/lib/rules/require-explicit-emits.js +++ b/lib/rules/require-explicit-emits.js @@ -71,6 +71,25 @@ function getNameParamNode(node) { return null } +/** + * Check if the given name matches defineEmitsNode variable name + * @param {string} name + * @param {CallExpression | undefined} defineEmitsNode + * @returns {boolean} + */ +function verifyEmitVariableName(name, defineEmitsNode) { + const node = defineEmitsNode?.parent + if (!node) return false + + /** @type {string | undefined} */ + let defineEmitVariable + if (node.type === 'VariableDeclarator' && node.id.type === 'Identifier') { + defineEmitVariable = node.id?.name + } + + return name === defineEmitVariable +} + module.exports = { meta: { type: 'suggestion', @@ -251,7 +270,16 @@ module.exports = { if (!vueTemplateDefineData) { return } - if (callee.type === 'Identifier' && callee.name === '$emit') { + + // e.g. $emit() / emits() in template + if ( + callee.type === 'Identifier' && + (callee.name === '$emit' || + verifyEmitVariableName( + 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..10c5f9154 100644 --- a/tests/lib/rules/require-explicit-emits.js +++ b/tests/lib/rules/require-explicit-emits.js @@ -1983,6 +1983,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 + } + ] } ] }) From 01bc0c624c37157865bdda7dc8836b4e9c8285c9 Mon Sep 17 00:00:00 2001 From: Wayne Zhang Date: Sat, 16 Dec 2023 15:12:17 +0800 Subject: [PATCH 2/6] Update lib/rules/require-explicit-emits.js Co-authored-by: Flo Edelmann --- lib/rules/require-explicit-emits.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/rules/require-explicit-emits.js b/lib/rules/require-explicit-emits.js index 78cf9e9e8..71d67d9f3 100644 --- a/lib/rules/require-explicit-emits.js +++ b/lib/rules/require-explicit-emits.js @@ -79,15 +79,15 @@ function getNameParamNode(node) { */ function verifyEmitVariableName(name, defineEmitsNode) { const node = defineEmitsNode?.parent - if (!node) return false - /** @type {string | undefined} */ - let defineEmitVariable - if (node.type === 'VariableDeclarator' && node.id.type === 'Identifier') { - defineEmitVariable = node.id?.name + if ( + node?.type === 'VariableDeclarator' && + node.id.type === 'Identifier' + ) { + return name === node.id.name } - return name === defineEmitVariable + return false } module.exports = { From fcfa95f3f1f3f8b4b906f4e36d2534fa1dafa3ef Mon Sep 17 00:00:00 2001 From: Wayne Zhang Date: Sat, 16 Dec 2023 15:12:39 +0800 Subject: [PATCH 3/6] Update lib/rules/require-explicit-emits.js Co-authored-by: Flo Edelmann --- lib/rules/require-explicit-emits.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rules/require-explicit-emits.js b/lib/rules/require-explicit-emits.js index 71d67d9f3..2d772a664 100644 --- a/lib/rules/require-explicit-emits.js +++ b/lib/rules/require-explicit-emits.js @@ -271,7 +271,7 @@ module.exports = { return } - // e.g. $emit() / emits() in template + // e.g. $emit() / emit() in template if ( callee.type === 'Identifier' && (callee.name === '$emit' || From 62d04c01daa2bf5f315ae3f0171d671cd6f50954 Mon Sep 17 00:00:00 2001 From: Wayne Zhang Date: Sat, 16 Dec 2023 15:14:34 +0800 Subject: [PATCH 4/6] Update tests/lib/rules/require-explicit-emits.js Co-authored-by: Flo Edelmann --- tests/lib/rules/require-explicit-emits.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/lib/rules/require-explicit-emits.js b/tests/lib/rules/require-explicit-emits.js index 10c5f9154..98e2ff1e9 100644 --- a/tests/lib/rules/require-explicit-emits.js +++ b/tests/lib/rules/require-explicit-emits.js @@ -1988,10 +1988,10 @@ emits: {'foo': null} filename: 'test.vue', code: ` `, parserOptions: { parser: require.resolve('@typescript-eslint/parser') }, From 93eef38d385627e5da0480d47593d176fcc4c954 Mon Sep 17 00:00:00 2001 From: waynzh Date: Sat, 16 Dec 2023 15:21:04 +0800 Subject: [PATCH 5/6] refactor: rename variable and format --- lib/rules/require-explicit-emits.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/rules/require-explicit-emits.js b/lib/rules/require-explicit-emits.js index 2d772a664..ba5c406b1 100644 --- a/lib/rules/require-explicit-emits.js +++ b/lib/rules/require-explicit-emits.js @@ -77,13 +77,10 @@ function getNameParamNode(node) { * @param {CallExpression | undefined} defineEmitsNode * @returns {boolean} */ -function verifyEmitVariableName(name, defineEmitsNode) { +function isEmitVariableName(name, defineEmitsNode) { const node = defineEmitsNode?.parent - if ( - node?.type === 'VariableDeclarator' && - node.id.type === 'Identifier' - ) { + if (node?.type === 'VariableDeclarator' && node.id.type === 'Identifier') { return name === node.id.name } @@ -275,7 +272,7 @@ module.exports = { if ( callee.type === 'Identifier' && (callee.name === '$emit' || - verifyEmitVariableName( + isEmitVariableName( callee.name, vueTemplateDefineData.defineEmits )) From 41c52693409575257a173426e1e5495ff8830389 Mon Sep 17 00:00:00 2001 From: waynzh Date: Sat, 16 Dec 2023 15:21:42 +0800 Subject: [PATCH 6/6] test: add a valid test --- tests/lib/rules/require-explicit-emits.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/lib/rules/require-explicit-emits.js b/tests/lib/rules/require-explicit-emits.js index 98e2ff1e9..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 {