File tree Expand file tree Collapse file tree 11 files changed +226
-67
lines changed Expand file tree Collapse file tree 11 files changed +226
-67
lines changed Original file line number Diff line number Diff line change @@ -85,7 +85,17 @@ module.exports = {
85
85
url : 'https://eslint.vuejs.org/rules/no-async-in-computed-properties.html'
86
86
} ,
87
87
fixable : null ,
88
- schema : [ ] ,
88
+ schema : [
89
+ {
90
+ type : 'object' ,
91
+ properties : {
92
+ detectAutoImport : {
93
+ type : 'boolean'
94
+ }
95
+ } ,
96
+ additionalProperties : false
97
+ }
98
+ ] ,
89
99
messages : {
90
100
unexpectedInFunction :
91
101
'Unexpected {{expressionName}} in computed function.' ,
@@ -263,14 +273,18 @@ module.exports = {
263
273
/** @param {Program } program */
264
274
Program ( program ) {
265
275
const tracker = new ReferenceTracker ( utils . getScope ( context , program ) )
266
- const traceMap = utils . createCompositionApiTraceMap ( {
267
- [ ReferenceTracker . ESM ] : true ,
268
- computed : {
269
- [ ReferenceTracker . CALL ] : true
270
- }
271
- } )
276
+ const detectAutoImport = ! ! context . options ?. [ 0 ] ?. detectAutoImport
272
277
273
- for ( const { node } of tracker . iterateEsmReferences ( traceMap ) ) {
278
+ for ( const { node } of utils . iterateReferencesTraceMap (
279
+ tracker ,
280
+ {
281
+ [ ReferenceTracker . ESM ] : true ,
282
+ computed : {
283
+ [ ReferenceTracker . CALL ] : true
284
+ }
285
+ } ,
286
+ detectAutoImport
287
+ ) ) {
274
288
if ( node . type !== 'CallExpression' ) {
275
289
continue
276
290
}
Original file line number Diff line number Diff line change @@ -63,19 +63,22 @@ module.exports = {
63
63
/** @param {Program } program */
64
64
Program ( program ) {
65
65
const tracker = new ReferenceTracker ( utils . getScope ( context , program ) )
66
+ const detectAutoImport = ! ! context . options ?. [ 0 ] ?. detectAutoImport
67
+ /** @type {TraceMap } */
66
68
const traceMap = {
67
- /** @type {TraceMap } */
68
- vue : {
69
- [ ReferenceTracker . ESM ] : true
70
- }
69
+ [ ReferenceTracker . ESM ] : true
71
70
}
72
71
for ( const lifecycleHook of LIFECYCLE_HOOKS ) {
73
- traceMap . vue [ lifecycleHook ] = {
72
+ traceMap [ lifecycleHook ] = {
74
73
[ ReferenceTracker . CALL ] : true
75
74
}
76
75
}
77
76
78
- for ( const { node } of tracker . iterateEsmReferences ( traceMap ) ) {
77
+ for ( const { node } of utils . iterateReferencesTraceMap (
78
+ tracker ,
79
+ traceMap ,
80
+ detectAutoImport
81
+ ) ) {
79
82
lifecycleHookCallNodes . add ( node )
80
83
}
81
84
}
Original file line number Diff line number Diff line change @@ -34,7 +34,17 @@ module.exports = {
34
34
url : 'https://eslint.vuejs.org/rules/no-ref-as-operand.html'
35
35
} ,
36
36
fixable : 'code' ,
37
- schema : [ ] ,
37
+ schema : [
38
+ {
39
+ type : 'object' ,
40
+ properties : {
41
+ detectAutoImport : {
42
+ type : 'boolean'
43
+ }
44
+ } ,
45
+ additionalProperties : false
46
+ }
47
+ ] ,
38
48
messages : {
39
49
requireDotValue :
40
50
'Must use `.value` to read or write the value wrapped by `{{method}}()`.'
@@ -66,7 +76,8 @@ module.exports = {
66
76
}
67
77
return {
68
78
Program ( ) {
69
- refReferences = extractRefObjectReferences ( context )
79
+ const autoImport = ! ! context . options ?. [ 0 ] ?. detectAutoImport
80
+ refReferences = extractRefObjectReferences ( context , autoImport )
70
81
} ,
71
82
// if (refValue)
72
83
/** @param {Identifier } node */
Original file line number Diff line number Diff line change @@ -54,7 +54,17 @@ module.exports = {
54
54
url : 'https://eslint.vuejs.org/rules/no-ref-object-reactivity-loss.html'
55
55
} ,
56
56
fixable : null ,
57
- schema : [ ] ,
57
+ schema : [
58
+ {
59
+ type : 'object' ,
60
+ properties : {
61
+ detectAutoImport : {
62
+ type : 'boolean'
63
+ }
64
+ } ,
65
+ additionalProperties : false
66
+ }
67
+ ] ,
58
68
messages : {
59
69
getValueInSameScope :
60
70
'Getting a value from the ref object in the same scope will cause the value to lose reactivity.' ,
@@ -76,8 +86,12 @@ module.exports = {
76
86
let scopeStack = { upper : null , node : context . getSourceCode ( ) . ast }
77
87
/** @type {Map<CallExpression, ScopeStack> } */
78
88
const scopes = new Map ( )
89
+ const detectAutoImport = ! ! context . options ?. [ 0 ] ?. detectAutoImport
79
90
80
- const refObjectReferences = extractRefObjectReferences ( context )
91
+ const refObjectReferences = extractRefObjectReferences (
92
+ context ,
93
+ detectAutoImport
94
+ )
81
95
const reactiveVariableReferences =
82
96
extractReactiveVariableReferences ( context )
83
97
Original file line number Diff line number Diff line change @@ -24,7 +24,17 @@ module.exports = {
24
24
url : 'https://eslint.vuejs.org/rules/no-side-effects-in-computed-properties.html'
25
25
} ,
26
26
fixable : null ,
27
- schema : [ ] ,
27
+ schema : [
28
+ {
29
+ type : 'object' ,
30
+ properties : {
31
+ detectAutoImport : {
32
+ type : 'boolean'
33
+ }
34
+ } ,
35
+ additionalProperties : false
36
+ }
37
+ ] ,
28
38
messages : {
29
39
unexpectedSideEffectInFunction :
30
40
'Unexpected side effect in computed function.' ,
@@ -183,14 +193,18 @@ module.exports = {
183
193
/** @param {Program } program */
184
194
Program ( program ) {
185
195
const tracker = new ReferenceTracker ( utils . getScope ( context , program ) )
186
- const traceMap = utils . createCompositionApiTraceMap ( {
187
- [ ReferenceTracker . ESM ] : true ,
188
- computed : {
189
- [ ReferenceTracker . CALL ] : true
190
- }
191
- } )
192
-
193
- for ( const { node } of tracker . iterateEsmReferences ( traceMap ) ) {
196
+ const detectAutoImport = ! ! context . options ?. [ 0 ] ?. detectAutoImport
197
+
198
+ for ( const { node } of utils . iterateReferencesTraceMap (
199
+ tracker ,
200
+ {
201
+ [ ReferenceTracker . ESM ] : true ,
202
+ computed : {
203
+ [ ReferenceTracker . CALL ] : true
204
+ }
205
+ } ,
206
+ detectAutoImport
207
+ ) ) {
194
208
if ( node . type !== 'CallExpression' ) {
195
209
continue
196
210
}
Original file line number Diff line number Diff line change @@ -49,7 +49,17 @@ module.exports = {
49
49
url : 'https://eslint.vuejs.org/rules/no-watch-after-await.html'
50
50
} ,
51
51
fixable : null ,
52
- schema : [ ] ,
52
+ schema : [
53
+ {
54
+ type : 'object' ,
55
+ properties : {
56
+ detectAutoImport : {
57
+ type : 'boolean'
58
+ }
59
+ } ,
60
+ additionalProperties : false
61
+ }
62
+ ] ,
53
63
messages : {
54
64
forbidden : '`watch` is forbidden after an `await` expression.'
55
65
}
@@ -78,19 +88,21 @@ module.exports = {
78
88
/** @param {Program } program */
79
89
Program ( program ) {
80
90
const tracker = new ReferenceTracker ( utils . getScope ( context , program ) )
81
- const traceMap = {
82
- vue : {
91
+ const detectAutoImport = ! ! context . options ?. [ 0 ] ?. detectAutoImport
92
+
93
+ for ( const { node } of utils . iterateReferencesTraceMap (
94
+ tracker ,
95
+ {
83
96
[ ReferenceTracker . ESM ] : true ,
84
97
watch : {
85
98
[ ReferenceTracker . CALL ] : true
86
99
} ,
87
100
watchEffect : {
88
101
[ ReferenceTracker . CALL ] : true
89
102
}
90
- }
91
- }
92
-
93
- for ( const { node } of tracker . iterateEsmReferences ( traceMap ) ) {
103
+ } ,
104
+ detectAutoImport
105
+ ) ) {
94
106
watchCallNodes . add ( node )
95
107
}
96
108
}
Original file line number Diff line number Diff line change @@ -26,6 +26,9 @@ module.exports = {
26
26
properties : {
27
27
treatUndefinedAsUnspecified : {
28
28
type : 'boolean'
29
+ } ,
30
+ detectAutoImport : {
31
+ type : 'boolean'
29
32
}
30
33
} ,
31
34
additionalProperties : false
@@ -57,14 +60,19 @@ module.exports = {
57
60
/** @param {Program } program */
58
61
Program ( program ) {
59
62
const tracker = new ReferenceTracker ( utils . getScope ( context , program ) )
60
- const traceMap = utils . createCompositionApiTraceMap ( {
63
+ const map = {
61
64
[ ReferenceTracker . ESM ] : true ,
62
65
computed : {
63
66
[ ReferenceTracker . CALL ] : true
64
67
}
65
- } )
68
+ }
66
69
67
- for ( const { node } of tracker . iterateEsmReferences ( traceMap ) ) {
70
+ const detectAutoImport = ! ! context . options ?. [ 0 ] ?. detectAutoImport
71
+ for ( const { node } of utils . iterateReferencesTraceMap (
72
+ tracker ,
73
+ map ,
74
+ detectAutoImport
75
+ ) ) {
68
76
if ( node . type !== 'CallExpression' ) {
69
77
continue
70
78
}
Original file line number Diff line number Diff line change @@ -2112,6 +2112,30 @@ module.exports = {
2112
2112
'@vue/composition-api' : map
2113
2113
} ) ,
2114
2114
2115
+ /**
2116
+ * Iterates all references in the given trace map.
2117
+ * Take the third argument option to detect auto-imported references.
2118
+ *
2119
+ * @param {import('@eslint-community/eslint-utils').ReferenceTracker } tracker
2120
+ * @param {import('@eslint-community/eslint-utils').TYPES.TraceMap } map
2121
+ * @param {boolean } detectAutoImport
2122
+ * @returns {ReturnType<import('@eslint-community/eslint-utils').ReferenceTracker['iterateEsmReferences']> }
2123
+ */
2124
+ * iterateReferencesTraceMap ( tracker , map , detectAutoImport ) {
2125
+ const traceMap = this . createCompositionApiTraceMap ( map )
2126
+
2127
+ if ( detectAutoImport ) {
2128
+ for ( const ref of tracker . iterateGlobalReferences ( traceMap ) ) {
2129
+ yield ref
2130
+ }
2131
+ for ( const ref of tracker . iterateEsmReferences ( map ) ) {
2132
+ yield ref
2133
+ }
2134
+ } else {
2135
+ return tracker . iterateEsmReferences ( traceMap )
2136
+ }
2137
+ } ,
2138
+
2115
2139
/**
2116
2140
* Checks whether or not the tokens of two given nodes are same.
2117
2141
* @param {ASTNode } left A node 1 to compare.
Original file line number Diff line number Diff line change @@ -119,24 +119,29 @@ function definePropertyReferenceExtractor(
119
119
context . getSourceCode ( ) . scopeManager . scopes [ 0 ]
120
120
)
121
121
const toRefNodes = new Set ( )
122
- for ( const { node } of tracker . iterateEsmReferences (
123
- utils . createCompositionApiTraceMap ( {
122
+ const detectAutoImport = ! ! context . options ?. [ 0 ] ?. detectAutoImport
123
+ for ( const { node } of utils . iterateReferencesTraceMap (
124
+ tracker ,
125
+ {
124
126
[ eslintUtils . ReferenceTracker . ESM ] : true ,
125
127
toRef : {
126
128
[ eslintUtils . ReferenceTracker . CALL ] : true
127
129
}
128
- } )
130
+ } ,
131
+ detectAutoImport
129
132
) ) {
130
133
toRefNodes . add ( node )
131
134
}
132
135
const toRefsNodes = new Set ( )
133
- for ( const { node } of tracker . iterateEsmReferences (
134
- utils . createCompositionApiTraceMap ( {
136
+ for ( const { node } of utils . iterateReferencesTraceMap (
137
+ tracker ,
138
+ {
135
139
[ eslintUtils . ReferenceTracker . ESM ] : true ,
136
140
toRefs : {
137
141
[ eslintUtils . ReferenceTracker . CALL ] : true
138
142
}
139
- } )
143
+ } ,
144
+ detectAutoImport
140
145
) ) {
141
146
toRefsNodes . add ( node )
142
147
}
You can’t perform that action at this time.
0 commit comments