From c741b59dd9d051f7db0ab3475b5c85d46263b2ab Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Thu, 27 Nov 2025 23:09:38 +0800 Subject: [PATCH 1/5] refactor(prefer-use-template-ref): optimize array processing with flatMap --- lib/rules/prefer-use-template-ref.js | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/lib/rules/prefer-use-template-ref.js b/lib/rules/prefer-use-template-ref.js index eb8b8c06d..ae3347150 100644 --- a/lib/rules/prefer-use-template-ref.js +++ b/lib/rules/prefer-use-template-ref.js @@ -29,19 +29,20 @@ function convertDeclaratorToScriptRef(declarator) { * @returns {ScriptRef[]} * */ function getScriptRefsFromSetupFunction(body) { - /** @type {VariableDeclaration[]} */ - const variableDeclarations = body.filter( - (child) => child.type === 'VariableDeclaration' - ) - const variableDeclarators = variableDeclarations.map( - (declaration) => declaration.declarations[0] - ) - const refDeclarators = variableDeclarators.filter((declarator) => - // @ts-ignore - ['ref', 'shallowRef'].includes(declarator.init?.callee?.name) - ) + return body.flatMap((child) => { + if (child.type === 'VariableDeclaration') { + const declarator = child.declarations[0] + + if ( + declarator.init?.type === 'CallExpression' && + declarator.init.callee?.type === 'Identifier' && + ['ref', 'shallowRef'].includes(declarator.init?.callee?.name) + ) + return [convertDeclaratorToScriptRef(declarator)] + } - return refDeclarators.map(convertDeclaratorToScriptRef) + return [] + }) } /** @type {import("eslint").Rule.RuleModule} */ From 3f4795c6a6d97bf4de0f0a03ac02e993a2160bd6 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Thu, 27 Nov 2025 23:20:45 +0800 Subject: [PATCH 2/5] refactor: restrict type check --- lib/rules/prefer-use-template-ref.js | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/lib/rules/prefer-use-template-ref.js b/lib/rules/prefer-use-template-ref.js index ae3347150..db4736885 100644 --- a/lib/rules/prefer-use-template-ref.js +++ b/lib/rules/prefer-use-template-ref.js @@ -11,19 +11,6 @@ const utils = require('../utils') * @type {{node: Expression, ref: string}} */ -/** - * @param declarator {VariableDeclarator} - * @returns {ScriptRef} - * */ -function convertDeclaratorToScriptRef(declarator) { - return { - // @ts-ignore - node: declarator.init, - // @ts-ignore - ref: declarator.id.name - } -} - /** * @param body {(Statement | ModuleDeclaration)[]} * @returns {ScriptRef[]} @@ -36,9 +23,13 @@ function getScriptRefsFromSetupFunction(body) { if ( declarator.init?.type === 'CallExpression' && declarator.init.callee?.type === 'Identifier' && - ['ref', 'shallowRef'].includes(declarator.init?.callee?.name) + declarator.id.type === 'Identifier' && + ['ref', 'shallowRef'].includes(declarator.init.callee.name) ) - return [convertDeclaratorToScriptRef(declarator)] + return { + node: declarator.init, + ref: declarator.id.name + } } return [] From ebff8d9780d6a43e4ee52550a6bbe10de928e3c3 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Thu, 27 Nov 2025 23:37:56 +0800 Subject: [PATCH 3/5] refactor: generate Map --- lib/rules/prefer-use-template-ref.js | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/lib/rules/prefer-use-template-ref.js b/lib/rules/prefer-use-template-ref.js index db4736885..37bfec2d1 100644 --- a/lib/rules/prefer-use-template-ref.js +++ b/lib/rules/prefer-use-template-ref.js @@ -8,7 +8,7 @@ const utils = require('../utils') /** * @typedef ScriptRef - * @type {{node: Expression, ref: string}} + * @type {[string, CallExpression]} */ /** @@ -26,10 +26,7 @@ function getScriptRefsFromSetupFunction(body) { declarator.id.type === 'Identifier' && ['ref', 'shallowRef'].includes(declarator.init.callee.name) ) - return { - node: declarator.init, - ref: declarator.id.name - } + return [[declarator.id.name, declarator.init]] } return [] @@ -86,21 +83,21 @@ module.exports = { }), { 'Program:exit'() { + const scriptRefsMap = new Map(scriptRefs) + for (const templateRef of templateRefs) { - const scriptRef = scriptRefs.find( - (scriptRef) => scriptRef.ref === templateRef - ) + const scriptRef = scriptRefsMap.get(templateRef) if (!scriptRef) { continue } context.report({ - node: scriptRef.node, + node: scriptRef, messageId: 'preferUseTemplateRef', data: { - // @ts-ignore - name: scriptRef.node?.callee?.name + // @ts-expect-error `scriptRef.callee` is `Identifier` + name: scriptRef.callee.name } }) } From 00f190008363f4d0eabc366874958d28ddc97916 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Fri, 28 Nov 2025 00:15:15 +0800 Subject: [PATCH 4/5] chore: update --- lib/rules/prefer-use-template-ref.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/rules/prefer-use-template-ref.js b/lib/rules/prefer-use-template-ref.js index 37bfec2d1..14323b2e2 100644 --- a/lib/rules/prefer-use-template-ref.js +++ b/lib/rules/prefer-use-template-ref.js @@ -96,8 +96,7 @@ module.exports = { node: scriptRef, messageId: 'preferUseTemplateRef', data: { - // @ts-expect-error `scriptRef.callee` is `Identifier` - name: scriptRef.callee.name + name: /** @type {Identifier} */ (scriptRef.callee).name } }) } From fa2bf560f926268a72abcff161ad4d1535d9f0dc Mon Sep 17 00:00:00 2001 From: Flo Edelmann Date: Thu, 27 Nov 2025 17:35:55 +0100 Subject: [PATCH 5/5] Add changeset --- .changeset/nine-zebras-rule.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/nine-zebras-rule.md diff --git a/.changeset/nine-zebras-rule.md b/.changeset/nine-zebras-rule.md new file mode 100644 index 000000000..8621702eb --- /dev/null +++ b/.changeset/nine-zebras-rule.md @@ -0,0 +1,5 @@ +--- +"eslint-plugin-vue": patch +--- + +Improved performance and type safety in `vue/prefer-use-template-ref`