From d5236481a1aecc30da1bcefd9af66e525a3e8a7e Mon Sep 17 00:00:00 2001 From: 2586740555 <15972343+CYJ090915@user.noreply.gitee.com> Date: Fri, 29 Aug 2025 17:14:11 +0800 Subject: [PATCH 1/8] feat: Add allowVariableNamePattern to valid-define-options --- docs/rules/valid-define-options.md | 13 ++++++++++++- lib/rules/valid-define-options.js | 23 +++++++++++++++++++++-- tests/lib/rules/valid-define-options.js | 24 ++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 3 deletions(-) diff --git a/docs/rules/valid-define-options.md b/docs/rules/valid-define-options.md index a81d5ad96..5e4aa06e6 100644 --- a/docs/rules/valid-define-options.md +++ b/docs/rules/valid-define-options.md @@ -108,7 +108,18 @@ defineOptions({ props: { msg: String } }) ## :wrench: Options -Nothing. +```json +{ + "vue/valid-define-options": [ + "error", + { + "allowVariableNamePattern": "^[A-Z_]+$" + } + ] +} +``` + +- `allowVariableNamePattern` Allow reference to declared variables if variable name matches patterns, default `null`. ## :couple: Related Rules diff --git a/lib/rules/valid-define-options.js b/lib/rules/valid-define-options.js index 12771b8fe..f2dbc1a44 100644 --- a/lib/rules/valid-define-options.js +++ b/lib/rules/valid-define-options.js @@ -16,7 +16,17 @@ module.exports = { url: 'https://eslint.vuejs.org/rules/valid-define-options.html' }, fixable: null, - schema: [], + schema: [ + { + type: 'object', + properties: { + allowVariableNamePattern: { + type: 'string' + } + }, + additionalProperties: false + } + ], messages: { referencingLocally: '`defineOptions` is referencing locally declared variables.', @@ -29,6 +39,13 @@ module.exports = { }, /** @param {RuleContext} context */ create(context) { + const option = context.options[0] || {} + const allowVariableNamePattern = option.allowVariableNamePattern + /** @type {RegExp | null} */ + let allowVariableNamePatternRegEx = null + if (allowVariableNamePattern) { + allowVariableNamePatternRegEx = new RegExp(allowVariableNamePattern, 'u') + } const scriptSetup = utils.getScriptSetupElement(context) if (!scriptSetup) { return {} @@ -93,7 +110,9 @@ module.exports = { (def) => def.type !== 'ImportBinding' && utils.inRange(scriptSetup.range, def.name) && - !utils.inRange(defineOptions.range, def.name) + !utils.inRange(defineOptions.range, def.name) && + (allowVariableNamePatternRegEx === null || + !allowVariableNamePatternRegEx.test(variable.name)) ) ) { if (utils.withinTypeNode(node)) { diff --git a/tests/lib/rules/valid-define-options.js b/tests/lib/rules/valid-define-options.js index 867bcb569..91e0e09c4 100644 --- a/tests/lib/rules/valid-define-options.js +++ b/tests/lib/rules/valid-define-options.js @@ -74,6 +74,15 @@ tester.run('valid-define-options', rule, { defineOptions(def); ` + }, + { + filename: 'test.vue', + code: ` + `, + options: [{ allowVariableNamePattern: '^[A-Z_]+$' }] } ], invalid: [ @@ -205,6 +214,21 @@ tester.run('valid-define-options', rule, { line: 3 } ] + }, + { + filename: 'test.vue', + code: ` + `, + options: [{ allowVariableNamePattern: '^[A-Z_]+$' }], + errors: [ + { + message: '`defineOptions` is referencing locally declared variables.', + line: 4 + } + ] } ] }) From fef5b53949a67a68215d67865c0c03a11d79c49b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=80=E5=8F=AA=E5=89=8D=E7=AB=AF=E6=B1=AA?= <985313519@qq.com> Date: Tue, 2 Sep 2025 18:11:14 +0800 Subject: [PATCH 2/8] Revert "feat: Add allowVariableNamePattern to valid-define-options" This reverts commit d5236481a1aecc30da1bcefd9af66e525a3e8a7e. --- docs/rules/valid-define-options.md | 13 +------------ lib/rules/valid-define-options.js | 23 ++--------------------- tests/lib/rules/valid-define-options.js | 24 ------------------------ 3 files changed, 3 insertions(+), 57 deletions(-) diff --git a/docs/rules/valid-define-options.md b/docs/rules/valid-define-options.md index 5e4aa06e6..a81d5ad96 100644 --- a/docs/rules/valid-define-options.md +++ b/docs/rules/valid-define-options.md @@ -108,18 +108,7 @@ defineOptions({ props: { msg: String } }) ## :wrench: Options -```json -{ - "vue/valid-define-options": [ - "error", - { - "allowVariableNamePattern": "^[A-Z_]+$" - } - ] -} -``` - -- `allowVariableNamePattern` Allow reference to declared variables if variable name matches patterns, default `null`. +Nothing. ## :couple: Related Rules diff --git a/lib/rules/valid-define-options.js b/lib/rules/valid-define-options.js index f2dbc1a44..12771b8fe 100644 --- a/lib/rules/valid-define-options.js +++ b/lib/rules/valid-define-options.js @@ -16,17 +16,7 @@ module.exports = { url: 'https://eslint.vuejs.org/rules/valid-define-options.html' }, fixable: null, - schema: [ - { - type: 'object', - properties: { - allowVariableNamePattern: { - type: 'string' - } - }, - additionalProperties: false - } - ], + schema: [], messages: { referencingLocally: '`defineOptions` is referencing locally declared variables.', @@ -39,13 +29,6 @@ module.exports = { }, /** @param {RuleContext} context */ create(context) { - const option = context.options[0] || {} - const allowVariableNamePattern = option.allowVariableNamePattern - /** @type {RegExp | null} */ - let allowVariableNamePatternRegEx = null - if (allowVariableNamePattern) { - allowVariableNamePatternRegEx = new RegExp(allowVariableNamePattern, 'u') - } const scriptSetup = utils.getScriptSetupElement(context) if (!scriptSetup) { return {} @@ -110,9 +93,7 @@ module.exports = { (def) => def.type !== 'ImportBinding' && utils.inRange(scriptSetup.range, def.name) && - !utils.inRange(defineOptions.range, def.name) && - (allowVariableNamePatternRegEx === null || - !allowVariableNamePatternRegEx.test(variable.name)) + !utils.inRange(defineOptions.range, def.name) ) ) { if (utils.withinTypeNode(node)) { diff --git a/tests/lib/rules/valid-define-options.js b/tests/lib/rules/valid-define-options.js index 91e0e09c4..867bcb569 100644 --- a/tests/lib/rules/valid-define-options.js +++ b/tests/lib/rules/valid-define-options.js @@ -74,15 +74,6 @@ tester.run('valid-define-options', rule, { defineOptions(def); ` - }, - { - filename: 'test.vue', - code: ` - `, - options: [{ allowVariableNamePattern: '^[A-Z_]+$' }] } ], invalid: [ @@ -214,21 +205,6 @@ tester.run('valid-define-options', rule, { line: 3 } ] - }, - { - filename: 'test.vue', - code: ` - `, - options: [{ allowVariableNamePattern: '^[A-Z_]+$' }], - errors: [ - { - message: '`defineOptions` is referencing locally declared variables.', - line: 4 - } - ] } ] }) From e08fe2828f85e30713e6b9f0835db870affdb367 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=80=E5=8F=AA=E5=89=8D=E7=AB=AF=E6=B1=AA?= <985313519@qq.com> Date: Wed, 3 Sep 2025 11:51:57 +0800 Subject: [PATCH 3/8] fix(valid-define-options): Allow the use of simple constants --- lib/rules/valid-define-options.js | 21 +++++++++++++++------ tests/lib/rules/valid-define-options.js | 8 ++++++++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/lib/rules/valid-define-options.js b/lib/rules/valid-define-options.js index 12771b8fe..f786b15f3 100644 --- a/lib/rules/valid-define-options.js +++ b/lib/rules/valid-define-options.js @@ -89,12 +89,21 @@ module.exports = { variable && variable.references.some((ref) => ref.identifier === node) && variable.defs.length > 0 && - variable.defs.every( - (def) => - def.type !== 'ImportBinding' && - utils.inRange(scriptSetup.range, def.name) && - !utils.inRange(defineOptions.range, def.name) - ) + variable.defs.every((def) => { + if (def.type === 'ImportBinding') return false + if (!utils.inRange(scriptSetup.range, def.name)) return false + if (utils.inRange(defineOptions.range, def.name)) return false + if ( + def.parent && + def.parent.kind === 'const' && + def.node.init && + !['ArrayExpression', 'ObjectExpression'].includes( + def.node.init?.type + ) + ) + return false + return true + }) ) { if (utils.withinTypeNode(node)) { continue diff --git a/tests/lib/rules/valid-define-options.js b/tests/lib/rules/valid-define-options.js index 867bcb569..330bc819f 100644 --- a/tests/lib/rules/valid-define-options.js +++ b/tests/lib/rules/valid-define-options.js @@ -74,6 +74,14 @@ tester.run('valid-define-options', rule, { defineOptions(def); ` + }, + { + filename: 'test.vue', + code: ` + ` } ], invalid: [ From 480367b22676e088571fef35d6e47fde535fc91f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=80=E5=8F=AA=E5=89=8D=E7=AB=AF=E6=B1=AA?= <985313519@qq.com> Date: Wed, 3 Sep 2025 11:53:33 +0800 Subject: [PATCH 4/8] fix --- lib/rules/valid-define-options.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rules/valid-define-options.js b/lib/rules/valid-define-options.js index f786b15f3..d2b3f9c19 100644 --- a/lib/rules/valid-define-options.js +++ b/lib/rules/valid-define-options.js @@ -98,7 +98,7 @@ module.exports = { def.parent.kind === 'const' && def.node.init && !['ArrayExpression', 'ObjectExpression'].includes( - def.node.init?.type + def.node.init.type ) ) return false From ede7315e30927b682de0e3bb12780ff2936ddcab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=80=E5=8F=AA=E5=89=8D=E7=AB=AF=E6=B1=AA?= <985313519@qq.com> Date: Wed, 3 Sep 2025 15:24:54 +0800 Subject: [PATCH 5/8] optimize code --- lib/rules/valid-define-options.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/rules/valid-define-options.js b/lib/rules/valid-define-options.js index d2b3f9c19..a082352f5 100644 --- a/lib/rules/valid-define-options.js +++ b/lib/rules/valid-define-options.js @@ -94,12 +94,10 @@ module.exports = { if (!utils.inRange(scriptSetup.range, def.name)) return false if (utils.inRange(defineOptions.range, def.name)) return false if ( - def.parent && + def.type === 'Variable' && def.parent.kind === 'const' && def.node.init && - !['ArrayExpression', 'ObjectExpression'].includes( - def.node.init.type - ) + def.node.init.type === 'Literal' ) return false return true From a034a2332b558737b2d34b0c48f516d6a0c94ec4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=80=E5=8F=AA=E5=89=8D=E7=AB=AF=E6=B1=AA?= <985313519@qq.com> Date: Wed, 3 Sep 2025 15:48:00 +0800 Subject: [PATCH 6/8] optimize code --- lib/rules/valid-define-options.js | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/lib/rules/valid-define-options.js b/lib/rules/valid-define-options.js index a082352f5..712f1d8e7 100644 --- a/lib/rules/valid-define-options.js +++ b/lib/rules/valid-define-options.js @@ -89,19 +89,18 @@ module.exports = { variable && variable.references.some((ref) => ref.identifier === node) && variable.defs.length > 0 && - variable.defs.every((def) => { - if (def.type === 'ImportBinding') return false - if (!utils.inRange(scriptSetup.range, def.name)) return false - if (utils.inRange(defineOptions.range, def.name)) return false - if ( - def.type === 'Variable' && - def.parent.kind === 'const' && - def.node.init && - def.node.init.type === 'Literal' - ) - return false - return true - }) + variable.defs.every( + (def) => + def.type !== 'ImportBinding' && + utils.inRange(scriptSetup.range, def.name) && + !utils.inRange(defineOptions.range, def.name) && + !( + def.type === 'Variable' && + def.parent.kind === 'const' && + def.node.init && + def.node.init.type === 'Literal' + ) + ) ) { if (utils.withinTypeNode(node)) { continue From 760f41646c62b26eb387f5745834b6ac1cb7dbd6 Mon Sep 17 00:00:00 2001 From: waynzh Date: Wed, 3 Sep 2025 20:03:52 +0800 Subject: [PATCH 7/8] chore: add changeset --- .changeset/fresh-taxis-glow.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/fresh-taxis-glow.md diff --git a/.changeset/fresh-taxis-glow.md b/.changeset/fresh-taxis-glow.md new file mode 100644 index 000000000..3124e7665 --- /dev/null +++ b/.changeset/fresh-taxis-glow.md @@ -0,0 +1,5 @@ +--- +'eslint-plugin-vue': minor +--- + +vue/valid-define-options now supports local literal constant references From 9536f05c7a238da2a7e3ce4ad6a1a9f9670ad066 Mon Sep 17 00:00:00 2001 From: Flo Edelmann Date: Wed, 3 Sep 2025 14:16:31 +0200 Subject: [PATCH 8/8] Update changeset --- .changeset/fresh-taxis-glow.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/fresh-taxis-glow.md b/.changeset/fresh-taxis-glow.md index 3124e7665..580abbd3a 100644 --- a/.changeset/fresh-taxis-glow.md +++ b/.changeset/fresh-taxis-glow.md @@ -2,4 +2,4 @@ 'eslint-plugin-vue': minor --- -vue/valid-define-options now supports local literal constant references +Changed `vue/valid-define-options` to allow local literal constant references