From c92577af4613600f6fe52225d5a94e634e62733a Mon Sep 17 00:00:00 2001 From: yosuke ota Date: Sat, 17 Jul 2021 14:57:29 +0900 Subject: [PATCH] Update `vue/no-unused-properties` and `vue/script-setup-uses-vars` rule to support style CSS vars --- lib/rules/no-unused-properties.js | 10 ++++ lib/rules/script-setup-uses-vars.js | 12 ++++- lib/utils/style-variables/index.js | 58 +++++++++++++++++++++++ tests/lib/rules/no-unused-properties.js | 32 +++++++++++++ tests/lib/rules/script-setup-uses-vars.js | 40 ++++++++++++++++ 5 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 lib/utils/style-variables/index.js diff --git a/lib/rules/no-unused-properties.js b/lib/rules/no-unused-properties.js index 9a38c2a75..2334f26c6 100644 --- a/lib/rules/no-unused-properties.js +++ b/lib/rules/no-unused-properties.js @@ -10,6 +10,7 @@ const utils = require('../utils') const eslintUtils = require('eslint-utils') +const { getStyleVariablesContext } = require('../utils/style-variables') /** * @typedef {import('../utils').GroupName} GroupName @@ -1044,6 +1045,15 @@ module.exports = { { /** @param {Program} node */ 'Program:exit'(node) { + const styleVars = getStyleVariablesContext(context) + if (styleVars) { + for (const { id } of styleVars.references) { + templatePropertiesContainer.usedProperties.addUsed( + id.name, + (context) => extractPatternOrThisProperties(id, context, true) + ) + } + } if (!node.templateBody) { reportUnusedProperties() } diff --git a/lib/rules/script-setup-uses-vars.js b/lib/rules/script-setup-uses-vars.js index 68e0b3fc3..a73a33678 100644 --- a/lib/rules/script-setup-uses-vars.js +++ b/lib/rules/script-setup-uses-vars.js @@ -4,6 +4,7 @@ */ 'use strict' +const { getStyleVariablesContext } = require('../utils/style-variables') // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ @@ -112,7 +113,16 @@ module.exports = { } } }, - undefined, + { + Program() { + const styleVars = getStyleVariablesContext(context) + if (styleVars) { + for (const ref of styleVars.references) { + context.markVariableAsUsed(ref.id.name) + } + } + } + }, { templateBodyTriggerSelector: 'Program' } diff --git a/lib/utils/style-variables/index.js b/lib/utils/style-variables/index.js new file mode 100644 index 000000000..c5f8e1601 --- /dev/null +++ b/lib/utils/style-variables/index.js @@ -0,0 +1,58 @@ +const { isVElement } = require('..') + +module.exports = { + getStyleVariablesContext +} + +class StyleVariablesContext { + /** + * @param {RuleContext} context + * @param {VElement[]} styles + */ + constructor(context, styles) { + this.context = context + this.styles = styles + /** @type {VReference[]} */ + this.references = [] + for (const style of styles) { + for (const node of style.children) { + if (node.type === 'VExpressionContainer') { + for (const ref of node.references.filter( + (ref) => ref.variable == null + )) { + this.references.push(ref) + } + } + } + } + } +} + +/** @type {Map e.name === 'style') + if (!styles.length) { + return null + } + let ctx = cache.get(styles[0]) + if (ctx) { + return ctx + } + ctx = new StyleVariablesContext(context, styles) + cache.set(styles[0], ctx) + return ctx +} diff --git a/tests/lib/rules/no-unused-properties.js b/tests/lib/rules/no-unused-properties.js index f9d61e4b0..b712a6bc6 100644 --- a/tests/lib/rules/no-unused-properties.js +++ b/tests/lib/rules/no-unused-properties.js @@ -1535,6 +1535,38 @@ tester.run('no-unused-properties', rule, { ignorePublicMembers: true } ] + }, + + //style vars + { + filename: 'test.vue', + code: ` + + + + + + ` } ], diff --git a/tests/lib/rules/script-setup-uses-vars.js b/tests/lib/rules/script-setup-uses-vars.js index 5d3c80060..3ff893f86 100644 --- a/tests/lib/rules/script-setup-uses-vars.js +++ b/tests/lib/rules/script-setup-uses-vars.js @@ -179,6 +179,25 @@ describe('script-setup-uses-vars', () => {
` + }, + + //style vars + { + filename: 'test.vue', + code: ` + + + + ` } ], @@ -305,6 +324,27 @@ describe('script-setup-uses-vars', () => { line: 4 } ] + }, + + //style vars + { + filename: 'test.vue', + code: ` + + + + `, + errors: ["'color' is assigned a value but never used."] } ] })