Skip to content

Commit 6f34b25

Browse files
committed
wip: support detectAutoImport option
1 parent 7c71c48 commit 6f34b25

11 files changed

+226
-67
lines changed

lib/rules/no-async-in-computed-properties.js

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,17 @@ module.exports = {
8585
url: 'https://eslint.vuejs.org/rules/no-async-in-computed-properties.html'
8686
},
8787
fixable: null,
88-
schema: [],
88+
schema: [
89+
{
90+
type: 'object',
91+
properties: {
92+
detectAutoImport: {
93+
type: 'boolean'
94+
}
95+
},
96+
additionalProperties: false
97+
}
98+
],
8999
messages: {
90100
unexpectedInFunction:
91101
'Unexpected {{expressionName}} in computed function.',
@@ -263,14 +273,18 @@ module.exports = {
263273
/** @param {Program} program */
264274
Program(program) {
265275
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
272277

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+
)) {
274288
if (node.type !== 'CallExpression') {
275289
continue
276290
}

lib/rules/no-lifecycle-after-await.js

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,19 +63,22 @@ module.exports = {
6363
/** @param {Program} program */
6464
Program(program) {
6565
const tracker = new ReferenceTracker(utils.getScope(context, program))
66+
const detectAutoImport = !!context.options?.[0]?.detectAutoImport
67+
/** @type {TraceMap} */
6668
const traceMap = {
67-
/** @type {TraceMap} */
68-
vue: {
69-
[ReferenceTracker.ESM]: true
70-
}
69+
[ReferenceTracker.ESM]: true
7170
}
7271
for (const lifecycleHook of LIFECYCLE_HOOKS) {
73-
traceMap.vue[lifecycleHook] = {
72+
traceMap[lifecycleHook] = {
7473
[ReferenceTracker.CALL]: true
7574
}
7675
}
7776

78-
for (const { node } of tracker.iterateEsmReferences(traceMap)) {
77+
for (const { node } of utils.iterateReferencesTraceMap(
78+
tracker,
79+
traceMap,
80+
detectAutoImport
81+
)) {
7982
lifecycleHookCallNodes.add(node)
8083
}
8184
}

lib/rules/no-ref-as-operand.js

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,17 @@ module.exports = {
3434
url: 'https://eslint.vuejs.org/rules/no-ref-as-operand.html'
3535
},
3636
fixable: 'code',
37-
schema: [],
37+
schema: [
38+
{
39+
type: 'object',
40+
properties: {
41+
detectAutoImport: {
42+
type: 'boolean'
43+
}
44+
},
45+
additionalProperties: false
46+
}
47+
],
3848
messages: {
3949
requireDotValue:
4050
'Must use `.value` to read or write the value wrapped by `{{method}}()`.'
@@ -66,7 +76,8 @@ module.exports = {
6676
}
6777
return {
6878
Program() {
69-
refReferences = extractRefObjectReferences(context)
79+
const autoImport = !!context.options?.[0]?.detectAutoImport
80+
refReferences = extractRefObjectReferences(context, autoImport)
7081
},
7182
// if (refValue)
7283
/** @param {Identifier} node */

lib/rules/no-ref-object-reactivity-loss.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,17 @@ module.exports = {
5454
url: 'https://eslint.vuejs.org/rules/no-ref-object-reactivity-loss.html'
5555
},
5656
fixable: null,
57-
schema: [],
57+
schema: [
58+
{
59+
type: 'object',
60+
properties: {
61+
detectAutoImport: {
62+
type: 'boolean'
63+
}
64+
},
65+
additionalProperties: false
66+
}
67+
],
5868
messages: {
5969
getValueInSameScope:
6070
'Getting a value from the ref object in the same scope will cause the value to lose reactivity.',
@@ -76,8 +86,12 @@ module.exports = {
7686
let scopeStack = { upper: null, node: context.getSourceCode().ast }
7787
/** @type {Map<CallExpression, ScopeStack>} */
7888
const scopes = new Map()
89+
const detectAutoImport = !!context.options?.[0]?.detectAutoImport
7990

80-
const refObjectReferences = extractRefObjectReferences(context)
91+
const refObjectReferences = extractRefObjectReferences(
92+
context,
93+
detectAutoImport
94+
)
8195
const reactiveVariableReferences =
8296
extractReactiveVariableReferences(context)
8397

lib/rules/no-side-effects-in-computed-properties.js

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,17 @@ module.exports = {
2424
url: 'https://eslint.vuejs.org/rules/no-side-effects-in-computed-properties.html'
2525
},
2626
fixable: null,
27-
schema: [],
27+
schema: [
28+
{
29+
type: 'object',
30+
properties: {
31+
detectAutoImport: {
32+
type: 'boolean'
33+
}
34+
},
35+
additionalProperties: false
36+
}
37+
],
2838
messages: {
2939
unexpectedSideEffectInFunction:
3040
'Unexpected side effect in computed function.',
@@ -183,14 +193,18 @@ module.exports = {
183193
/** @param {Program} program */
184194
Program(program) {
185195
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+
)) {
194208
if (node.type !== 'CallExpression') {
195209
continue
196210
}

lib/rules/no-watch-after-await.js

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,17 @@ module.exports = {
4949
url: 'https://eslint.vuejs.org/rules/no-watch-after-await.html'
5050
},
5151
fixable: null,
52-
schema: [],
52+
schema: [
53+
{
54+
type: 'object',
55+
properties: {
56+
detectAutoImport: {
57+
type: 'boolean'
58+
}
59+
},
60+
additionalProperties: false
61+
}
62+
],
5363
messages: {
5464
forbidden: '`watch` is forbidden after an `await` expression.'
5565
}
@@ -78,19 +88,21 @@ module.exports = {
7888
/** @param {Program} program */
7989
Program(program) {
8090
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+
{
8396
[ReferenceTracker.ESM]: true,
8497
watch: {
8598
[ReferenceTracker.CALL]: true
8699
},
87100
watchEffect: {
88101
[ReferenceTracker.CALL]: true
89102
}
90-
}
91-
}
92-
93-
for (const { node } of tracker.iterateEsmReferences(traceMap)) {
103+
},
104+
detectAutoImport
105+
)) {
94106
watchCallNodes.add(node)
95107
}
96108
}

lib/rules/return-in-computed-property.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ module.exports = {
2626
properties: {
2727
treatUndefinedAsUnspecified: {
2828
type: 'boolean'
29+
},
30+
detectAutoImport: {
31+
type: 'boolean'
2932
}
3033
},
3134
additionalProperties: false
@@ -57,14 +60,19 @@ module.exports = {
5760
/** @param {Program} program */
5861
Program(program) {
5962
const tracker = new ReferenceTracker(utils.getScope(context, program))
60-
const traceMap = utils.createCompositionApiTraceMap({
63+
const map = {
6164
[ReferenceTracker.ESM]: true,
6265
computed: {
6366
[ReferenceTracker.CALL]: true
6467
}
65-
})
68+
}
6669

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+
)) {
6876
if (node.type !== 'CallExpression') {
6977
continue
7078
}

lib/utils/index.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2112,6 +2112,30 @@ module.exports = {
21122112
'@vue/composition-api': map
21132113
}),
21142114

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+
21152139
/**
21162140
* Checks whether or not the tokens of two given nodes are same.
21172141
* @param {ASTNode} left A node 1 to compare.

lib/utils/property-references.js

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -119,24 +119,29 @@ function definePropertyReferenceExtractor(
119119
context.getSourceCode().scopeManager.scopes[0]
120120
)
121121
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+
{
124126
[eslintUtils.ReferenceTracker.ESM]: true,
125127
toRef: {
126128
[eslintUtils.ReferenceTracker.CALL]: true
127129
}
128-
})
130+
},
131+
detectAutoImport
129132
)) {
130133
toRefNodes.add(node)
131134
}
132135
const toRefsNodes = new Set()
133-
for (const { node } of tracker.iterateEsmReferences(
134-
utils.createCompositionApiTraceMap({
136+
for (const { node } of utils.iterateReferencesTraceMap(
137+
tracker,
138+
{
135139
[eslintUtils.ReferenceTracker.ESM]: true,
136140
toRefs: {
137141
[eslintUtils.ReferenceTracker.CALL]: true
138142
}
139-
})
143+
},
144+
detectAutoImport
140145
)) {
141146
toRefsNodes.add(node)
142147
}

0 commit comments

Comments
 (0)