Skip to content

Commit a849ab3

Browse files
committed
Merge branch 'master' into nhtnhan/master
2 parents 008b2a9 + ab88141 commit a849ab3

25 files changed

+202
-28
lines changed

lib/configs/flat/base.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
const globals = require('globals')
77
module.exports = [
88
{
9+
name: 'vue:base:setup',
910
plugins: {
1011
get vue() {
1112
return require('../../index')
@@ -17,6 +18,7 @@ module.exports = [
1718
}
1819
},
1920
{
21+
name: 'vue:base:setup-for-vue',
2022
files: ['*.vue', '**/*.vue'],
2123
plugins: {
2224
get vue() {

lib/configs/flat/vue2-essential.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const config = require('./base.js')
99
module.exports = [
1010
...config,
1111
{
12+
name: 'vue:vue2-essential:rules',
1213
rules: {
1314
'vue/multi-word-component-names': 'error',
1415
'vue/no-arrow-functions-in-watch': 'error',

lib/configs/flat/vue2-recommended.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const config = require('./vue2-strongly-recommended.js')
99
module.exports = [
1010
...config,
1111
{
12+
name: 'vue:vue2-recommended:rules',
1213
rules: {
1314
'vue/attributes-order': 'warn',
1415
'vue/component-tags-order': 'warn',

lib/configs/flat/vue2-strongly-recommended.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const config = require('./vue2-essential.js')
99
module.exports = [
1010
...config,
1111
{
12+
name: 'vue:vue2-strongly-recommended:rules',
1213
rules: {
1314
'vue/attribute-hyphenation': 'warn',
1415
'vue/component-definition-name-casing': 'warn',

lib/configs/flat/vue3-essential.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const config = require('./base.js')
99
module.exports = [
1010
...config,
1111
{
12+
name: 'vue:essential:rules',
1213
rules: {
1314
'vue/multi-word-component-names': 'error',
1415
'vue/no-arrow-functions-in-watch': 'error',

lib/configs/flat/vue3-recommended.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const config = require('./vue3-strongly-recommended.js')
99
module.exports = [
1010
...config,
1111
{
12+
name: 'vue:recommended:rules',
1213
rules: {
1314
'vue/attributes-order': 'warn',
1415
'vue/component-tags-order': 'warn',

lib/configs/flat/vue3-strongly-recommended.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const config = require('./vue3-essential.js')
99
module.exports = [
1010
...config,
1111
{
12+
name: 'vue:strongly-recommended:rules',
1213
rules: {
1314
'vue/attribute-hyphenation': 'warn',
1415
'vue/component-definition-name-casing': 'warn',

lib/rules/component-name-in-template-casing.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,12 @@ module.exports = {
122122
}
123123

124124
if (
125-
(!utils.isHtmlElementNode(node) && !utils.isSvgElementNode(node)) ||
125+
(!utils.isHtmlElementNode(node) &&
126+
!utils.isSvgElementNode(node) &&
127+
!utils.isMathElementNode(node)) ||
126128
utils.isHtmlWellKnownElementName(node.rawName) ||
127129
utils.isSvgWellKnownElementName(node.rawName) ||
130+
utils.isMathWellKnownElementName(node.rawName) ||
128131
utils.isVueBuiltInElementName(node.rawName)
129132
) {
130133
return false

lib/rules/html-self-closing.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ function getElementType(node) {
6363
if (utils.isSvgElementNode(node)) {
6464
return 'SVG'
6565
}
66-
if (utils.isMathMLElementNode(node)) {
66+
if (utils.isMathElementNode(node)) {
6767
return 'MATH'
6868
}
6969
return 'UNKNOWN'

lib/rules/no-deprecated-html-element-is.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ module.exports = {
2727
function isValidElement(node) {
2828
return (
2929
!utils.isHtmlWellKnownElementName(node.rawName) &&
30-
!utils.isSvgWellKnownElementName(node.rawName)
30+
!utils.isSvgWellKnownElementName(node.rawName) &&
31+
!utils.isMathWellKnownElementName(node.rawName)
3132
)
3233
}
3334
return utils.defineTemplateBodyVisitor(context, {

lib/rules/no-undef-components.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ module.exports = {
149149
if (
150150
utils.isHtmlWellKnownElementName(rawName) ||
151151
utils.isSvgWellKnownElementName(rawName) ||
152+
utils.isMathWellKnownElementName(rawName) ||
152153
utils.isBuiltInComponentName(kebabCaseName)
153154
) {
154155
return false
@@ -177,7 +178,11 @@ module.exports = {
177178
/** @type {TemplateListener} */
178179
const templateBodyVisitor = {
179180
VElement(node) {
180-
if (!utils.isHtmlElementNode(node) && !utils.isSvgElementNode(node)) {
181+
if (
182+
!utils.isHtmlElementNode(node) &&
183+
!utils.isSvgElementNode(node) &&
184+
!utils.isMathElementNode(node)
185+
) {
181186
return
182187
}
183188
verifyName(node.rawName, node.startTag)

lib/rules/no-unused-components.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,12 @@ module.exports = {
5252
/** @param {VElement} node */
5353
VElement(node) {
5454
if (
55-
(!utils.isHtmlElementNode(node) && !utils.isSvgElementNode(node)) ||
55+
(!utils.isHtmlElementNode(node) &&
56+
!utils.isSvgElementNode(node) &&
57+
!utils.isMathElementNode(node)) ||
5658
utils.isHtmlWellKnownElementName(node.rawName) ||
57-
utils.isSvgWellKnownElementName(node.rawName)
59+
utils.isSvgWellKnownElementName(node.rawName) ||
60+
utils.isMathWellKnownElementName(node.rawName)
5861
) {
5962
return
6063
}

lib/rules/require-typed-ref.js

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,23 @@ module.exports = {
4444
return {}
4545
}
4646

47-
const scriptSetup = utils.getScriptSetupElement(context)
48-
if (
49-
scriptSetup &&
50-
!utils.hasAttribute(scriptSetup, 'lang', 'ts') &&
51-
!utils.hasAttribute(scriptSetup, 'lang', 'typescript')
52-
) {
53-
return {}
47+
if (utils.isVueFile(filename)) {
48+
const sourceCode = context.getSourceCode()
49+
const documentFragment =
50+
sourceCode.parserServices.getDocumentFragment &&
51+
sourceCode.parserServices.getDocumentFragment()
52+
if (!documentFragment) {
53+
return {}
54+
}
55+
const scripts = documentFragment.children.filter(
56+
/** @returns {element is VElement} */
57+
(element) => utils.isVElement(element) && element.name === 'script'
58+
)
59+
if (
60+
scripts.every((script) => !utils.hasAttribute(script, 'lang', 'ts'))
61+
) {
62+
return {}
63+
}
5464
}
5565

5666
const defines = iterateDefineRefs(

lib/rules/script-setup-uses-vars.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,13 @@ module.exports = {
9494
},
9595
VElement(node) {
9696
if (
97-
(!utils.isHtmlElementNode(node) && !utils.isSvgElementNode(node)) ||
97+
(!utils.isHtmlElementNode(node) &&
98+
!utils.isSvgElementNode(node) &&
99+
!utils.isMathElementNode(node)) ||
98100
(node.rawName === node.name &&
99101
(utils.isHtmlWellKnownElementName(node.rawName) ||
100-
utils.isSvgWellKnownElementName(node.rawName))) ||
102+
utils.isSvgWellKnownElementName(node.rawName) ||
103+
utils.isMathWellKnownElementName(node.rawName))) ||
101104
utils.isBuiltInComponentName(node.rawName)
102105
) {
103106
return

lib/utils/index.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ const { getScope } = require('./scope')
5151

5252
const HTML_ELEMENT_NAMES = new Set(require('./html-elements.json'))
5353
const SVG_ELEMENT_NAMES = new Set(require('./svg-elements.json'))
54+
const MATH_ELEMENT_NAMES = new Set(require('./math-elements.json'))
5455
const VOID_ELEMENT_NAMES = new Set(require('./void-elements.json'))
5556
const VUE2_BUILTIN_COMPONENT_NAMES = new Set(
5657
require('./vue2-builtin-components')
@@ -948,6 +949,8 @@ module.exports = {
948949
!this.isHtmlWellKnownElementName(node.rawName)) ||
949950
(this.isSvgElementNode(node) &&
950951
!this.isSvgWellKnownElementName(node.rawName)) ||
952+
(this.isMathElementNode(node) &&
953+
!this.isMathWellKnownElementName(node.rawName)) ||
951954
hasAttribute(node, 'is') ||
952955
hasDirective(node, 'bind', 'is') ||
953956
hasDirective(node, 'is')
@@ -977,7 +980,7 @@ module.exports = {
977980
* @param {VElement} node The node to check.
978981
* @returns {boolean} `true` if the node is a MathML element.
979982
*/
980-
isMathMLElementNode(node) {
983+
isMathElementNode(node) {
981984
return node.namespace === NS.MathML
982985
},
983986

@@ -999,6 +1002,15 @@ module.exports = {
9991002
return SVG_ELEMENT_NAMES.has(name)
10001003
},
10011004

1005+
/**
1006+
* Check whether the given name is a well-known MathML element or not.
1007+
* @param {string} name The name to check.
1008+
* @returns {boolean} `true` if the name is a well-known MathML element name.
1009+
*/
1010+
isMathWellKnownElementName(name) {
1011+
return MATH_ELEMENT_NAMES.has(name)
1012+
},
1013+
10021014
/**
10031015
* Check whether the given name is a void element name or not.
10041016
* @param {string} name The name to check.
@@ -3121,7 +3133,7 @@ function getWithDefaultsProps(node) {
31213133

31223134
for (const prop of param.properties) {
31233135
if (prop.type !== 'Property') {
3124-
return {}
3136+
continue
31253137
}
31263138
const name = getStaticPropertyName(prop)
31273139
if (name != null) {

lib/utils/math-elements.json

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
[
2+
"math",
3+
"maction",
4+
"annotation",
5+
"annotation-xml",
6+
"menclose",
7+
"merror",
8+
"mfenced",
9+
"mfrac",
10+
"mi",
11+
"mmultiscripts",
12+
"mn",
13+
"mo",
14+
"mover",
15+
"mpadded",
16+
"mphantom",
17+
"mprescripts",
18+
"mroot",
19+
"mrow",
20+
"ms",
21+
"semantics",
22+
"mspace",
23+
"msqrt",
24+
"mstyle",
25+
"msub",
26+
"msup",
27+
"msubsup",
28+
"mtable",
29+
"mtd",
30+
"mtext",
31+
"mtr",
32+
"munder",
33+
"munderover"
34+
]

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "eslint-plugin-vue",
3-
"version": "9.25.0",
3+
"version": "9.26.0",
44
"description": "Official ESLint plugin for Vue.js",
55
"main": "lib/index.js",
66
"scripts": {
@@ -73,8 +73,8 @@
7373
"@types/node": "^14.18.63",
7474
"@types/semver": "^7.5.7",
7575
"@types/xml-name-validator": "^4.0.3",
76-
"@typescript-eslint/parser": "^7.0.1",
77-
"@typescript-eslint/types": "^7.0.1",
76+
"@typescript-eslint/parser": "^7.13.1",
77+
"@typescript-eslint/types": "^7.13.1",
7878
"assert": "^2.1.0",
7979
"env-cmd": "^10.1.0",
8080
"esbuild": "^0.20.0",
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<!--{"languageOptions": {"parserOptions": {"parser":"@typescript-eslint/parser"}}}-->
22
<script lang="ts">
3-
declare async function
3+
declare function
44
foo
55
(
66
arg1: string,
@@ -9,4 +9,6 @@ declare async function
99
:
1010
arg1 is
1111
string;
12+
async function
13+
bar() {}
1214
</script>

tests/fixtures/script-indent/ts-declare-function-04.vue

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
<!--{"languageOptions": {"parserOptions": {"parser":"@typescript-eslint/parser"}}}-->
22
<script lang="ts">
33
declare function
4-
*
54
foo
65
(
76
arg1: string,

tests/lib/rules/comment-directive.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const { ESLint } = require('../../eslint-compat')
1212
const eslint = new ESLint({
1313
overrideConfigFile: true,
1414
overrideConfig: {
15-
files: ['*'],
15+
files: ['*.*'],
1616
languageOptions: {
1717
parser: require('vue-eslint-parser'),
1818
ecmaVersion: 2015

tests/lib/rules/no-sparse-arrays.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
*/
44
'use strict'
55

6-
const RuleTester = require('../../eslint-compat').RuleTester
6+
const { RuleTester, ESLint } = require('../../eslint-compat')
7+
const semver = require('semver')
78
const rule = require('../../../lib/rules/no-sparse-arrays')
89

910
const tester = new RuleTester({
@@ -29,9 +30,10 @@ tester.run('no-sparse-arrays', rule, {
2930
{
3031
message: 'Unexpected comma in middle of array.',
3132
line: 3,
32-
column: 22,
3333
endLine: 3,
34-
endColumn: 38
34+
...(semver.gte(ESLint.version, '9.5.0')
35+
? { column: 23, endColumn: 24 }
36+
: { column: 22, endColumn: 38 })
3537
}
3638
]
3739
},
@@ -44,9 +46,10 @@ tester.run('no-sparse-arrays', rule, {
4446
{
4547
message: 'Unexpected comma in middle of array.',
4648
line: 3,
47-
column: 22,
4849
endLine: 3,
49-
endColumn: 30
50+
...(semver.gte(ESLint.version, '9.5.0')
51+
? { column: 23, endColumn: 24 }
52+
: { column: 22, endColumn: 30 })
5053
}
5154
]
5255
}

0 commit comments

Comments
 (0)