From 628f4097a8a8023734eb3367be60196fe075752c Mon Sep 17 00:00:00 2001 From: Yosuke Ota Date: Tue, 10 Aug 2021 13:52:22 +0900 Subject: [PATCH] Fix false positives for namespace component in `vue/script-setup-uses-vars` rule (#1602) --- lib/rules/script-setup-uses-vars.js | 21 ++++++++++++++++----- lib/utils/index.js | 1 + tests/lib/rules/script-setup-uses-vars.js | 16 ++++++++++++++++ 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/lib/rules/script-setup-uses-vars.js b/lib/rules/script-setup-uses-vars.js index a73a33678..a714a70b8 100644 --- a/lib/rules/script-setup-uses-vars.js +++ b/lib/rules/script-setup-uses-vars.js @@ -53,28 +53,32 @@ module.exports = { /** * `casing.camelCase()` converts the beginning to lowercase, * but does not convert the case of the beginning character when converting with Vue3. - * @see https://github.com/vuejs/vue-next/blob/1ffd48a2f5fd3eead3ea29dae668b7ed1c6f6130/packages/shared/src/index.ts#L116 + * @see https://github.com/vuejs/vue-next/blob/2749c15170ad4913e6530a257db485d4e7ed2283/packages/shared/src/index.ts#L116 * @param {string} str */ function camelize(str) { return str.replace(/-(\w)/g, (_, c) => (c ? c.toUpperCase() : '')) } /** - * @see https://github.com/vuejs/vue-next/blob/1ffd48a2f5fd3eead3ea29dae668b7ed1c6f6130/packages/compiler-core/src/transforms/transformElement.ts#L321 + * @see https://github.com/vuejs/vue-next/blob/2749c15170ad4913e6530a257db485d4e7ed2283/packages/compiler-core/src/transforms/transformElement.ts#L333 * @param {string} name */ - function markElementVariableAsUsed(name) { + function markSetupReferenceVariableAsUsed(name) { if (scriptVariableNames.has(name)) { context.markVariableAsUsed(name) + return true } const camelName = camelize(name) if (scriptVariableNames.has(camelName)) { context.markVariableAsUsed(camelName) + return true } const pascalName = casing.capitalize(camelName) if (scriptVariableNames.has(pascalName)) { context.markVariableAsUsed(pascalName) + return true } + return false } return utils.defineTemplateBodyVisitor( @@ -97,14 +101,21 @@ module.exports = { ) { return } - markElementVariableAsUsed(node.rawName) + if (!markSetupReferenceVariableAsUsed(node.rawName)) { + // Check namespace + // https://github.com/vuejs/vue-next/blob/2749c15170ad4913e6530a257db485d4e7ed2283/packages/compiler-core/src/transforms/transformElement.ts#L304 + const dotIndex = node.rawName.indexOf('.') + if (dotIndex > 0) { + markSetupReferenceVariableAsUsed(node.rawName.slice(0, dotIndex)) + } + } }, /** @param {VDirective} node */ 'VAttribute[directive=true]'(node) { if (utils.isBuiltInDirectiveName(node.key.name.name)) { return } - markElementVariableAsUsed(`v-${node.key.name.rawName}`) + markSetupReferenceVariableAsUsed(`v-${node.key.name.rawName}`) }, /** @param {VAttribute} node */ 'VAttribute[directive=false]'(node) { diff --git a/lib/utils/index.js b/lib/utils/index.js index 68a5bbee9..e309dc579 100644 --- a/lib/utils/index.js +++ b/lib/utils/index.js @@ -704,6 +704,7 @@ module.exports = { name === 'pre' || name === 'cloak' || name === 'once' || + name === 'memo' || name === 'is' ) }, diff --git a/tests/lib/rules/script-setup-uses-vars.js b/tests/lib/rules/script-setup-uses-vars.js index dd49cf6a2..3cf9cde0c 100644 --- a/tests/lib/rules/script-setup-uses-vars.js +++ b/tests/lib/rules/script-setup-uses-vars.js @@ -198,6 +198,22 @@ describe('script-setup-uses-vars', () => { } ` + }, + // ns + { + filename: 'test.vue', + code: ` + + + + ` } ],