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