Skip to content

Commit 50bf17a

Browse files
authored
Improved autofix of vue/order-in-components rule to understand "Nullish Coalescing". (#1183)
1 parent 083ea82 commit 50bf17a

File tree

2 files changed

+15
-11
lines changed

2 files changed

+15
-11
lines changed

Diff for: lib/rules/order-in-components.js

+11-9
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ function isComma (node) {
6464
return node.type === 'Punctuator' && node.value === ','
6565
}
6666

67-
const ARITHMETIC_OPERATORS = ['+', '-', '*', '/', '%', '**']
67+
const ARITHMETIC_OPERATORS = ['+', '-', '*', '/', '%', '**'/* es2016 */]
6868
const BITWISE_OPERATORS = ['&', '|', '^', '~', '<<', '>>', '>>>']
6969
const COMPARISON_OPERATORS = ['==', '!=', '===', '!==', '>', '>=', '<', '<=']
7070
const RELATIONAL_OPERATORS = ['in', 'instanceof']
@@ -74,7 +74,7 @@ const ALL_BINARY_OPERATORS = [].concat(
7474
COMPARISON_OPERATORS,
7575
RELATIONAL_OPERATORS
7676
)
77-
const LOGICAL_OPERATORS = ['&&', '||']
77+
const LOGICAL_OPERATORS = ['&&', '||', '??'/* es2020 */]
7878

7979
/*
8080
* Result `true` if the node is sure that there are no side effects
@@ -94,17 +94,15 @@ const LOGICAL_OPERATORS = ['&&', '||']
9494
*/
9595
function isNotSideEffectsNode (node, visitorKeys) {
9696
let result = true
97-
const noSideEffectsNodes = new Set()
97+
let skipNode = false
9898
traverseNodes(node, {
9999
visitorKeys,
100-
enterNode (node, parent) {
101-
if (!result) {
100+
enterNode (node) {
101+
if (!result || skipNode) {
102102
return
103103
}
104104

105105
if (
106-
// parent has no side effects
107-
noSideEffectsNodes.has(parent) ||
108106
// no side effects node
109107
node.type === 'FunctionExpression' ||
110108
node.type === 'Identifier' ||
@@ -113,7 +111,7 @@ function isNotSideEffectsNode (node, visitorKeys) {
113111
node.type === 'ArrowFunctionExpression' ||
114112
node.type === 'TemplateElement'
115113
) {
116-
noSideEffectsNodes.add(node)
114+
skipNode = node
117115
} else if (
118116
node.type !== 'Property' &&
119117
node.type !== 'ObjectExpression' &&
@@ -131,7 +129,11 @@ function isNotSideEffectsNode (node, visitorKeys) {
131129
result = false
132130
}
133131
},
134-
leaveNode () {}
132+
leaveNode (node) {
133+
if (skipNode === node) {
134+
skipNode = null
135+
}
136+
}
135137
})
136138

137139
return result

Diff for: tests/lib/rules/order-in-components.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const RuleTester = require('eslint').RuleTester
1010
const ruleTester = new RuleTester()
1111

1212
const parserOptions = {
13-
ecmaVersion: 2018,
13+
ecmaVersion: 2020,
1414
sourceType: 'module'
1515
}
1616

@@ -751,6 +751,7 @@ ruleTester.run('order-in-components', rule, {
751751
testConditional: a ? b : c,
752752
testYield: function* () {},
753753
testTemplate: \`a:\${a},b:\${b},c:\${c}.\`,
754+
testNullish: a ?? b,
754755
name: 'burger',
755756
};
756757
`,
@@ -768,11 +769,12 @@ ruleTester.run('order-in-components', rule, {
768769
testConditional: a ? b : c,
769770
testYield: function* () {},
770771
testTemplate: \`a:\${a},b:\${b},c:\${c}.\`,
772+
testNullish: a ?? b,
771773
};
772774
`,
773775
errors: [{
774776
message: 'The "name" property should be above the "data" property on line 3.',
775-
line: 13
777+
line: 14
776778
}]
777779
}
778780
]

0 commit comments

Comments
 (0)