Skip to content

Commit 2178b27

Browse files
committed
Refactor
1 parent b9c282e commit 2178b27

12 files changed

+725
-658
lines changed

Diff for: lib/rules/no-async-in-computed-properties.js

+47-66
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ module.exports = {
7272
},
7373

7474
create (context) {
75-
const forbiddenNodes = []
75+
const computedPropertiesMap = new Map()
7676
let scopeStack = { upper: null, body: null }
7777

7878
const expressionTypes = {
@@ -83,13 +83,9 @@ module.exports = {
8383
timed: 'timed function'
8484
}
8585

86-
function onFunctionEnter (node) {
86+
function onFunctionEnter (node, { node: vueNode }) {
8787
if (node.async) {
88-
forbiddenNodes.push({
89-
node: node,
90-
type: 'async',
91-
targetBody: node.body
92-
})
88+
verify(node, node.body, 'async', computedPropertiesMap.get(vueNode))
9389
}
9490

9591
scopeStack = { upper: scopeStack, body: node.body }
@@ -98,68 +94,53 @@ module.exports = {
9894
function onFunctionExit () {
9995
scopeStack = scopeStack.upper
10096
}
101-
return Object.assign({},
102-
{
103-
':function': onFunctionEnter,
104-
':function:exit': onFunctionExit,
105-
106-
NewExpression (node) {
107-
if (node.callee.name === 'Promise') {
108-
forbiddenNodes.push({
109-
node: node,
110-
type: 'new',
111-
targetBody: scopeStack.body
112-
})
113-
}
114-
},
115-
116-
CallExpression (node) {
117-
if (isPromise(node)) {
118-
forbiddenNodes.push({
119-
node: node,
120-
type: 'promise',
121-
targetBody: scopeStack.body
122-
})
123-
} else if (isTimedFunction(node)) {
124-
forbiddenNodes.push({
125-
node: node,
126-
type: 'timed',
127-
targetBody: scopeStack.body
128-
})
129-
}
130-
},
131-
132-
AwaitExpression (node) {
133-
forbiddenNodes.push({
97+
98+
function verify (node, targetBody, type, computedProperties) {
99+
computedProperties.forEach(cp => {
100+
if (
101+
cp.value &&
102+
node.loc.start.line >= cp.value.loc.start.line &&
103+
node.loc.end.line <= cp.value.loc.end.line &&
104+
targetBody === cp.value
105+
) {
106+
context.report({
134107
node: node,
135-
type: 'await',
136-
targetBody: scopeStack.body
137-
})
138-
}
139-
},
140-
utils.executeOnVue(context, (obj) => {
141-
const computedProperties = utils.getComputedProperties(obj)
142-
143-
computedProperties.forEach(cp => {
144-
forbiddenNodes.forEach(el => {
145-
if (
146-
cp.value &&
147-
el.node.loc.start.line >= cp.value.loc.start.line &&
148-
el.node.loc.end.line <= cp.value.loc.end.line &&
149-
el.targetBody === cp.value
150-
) {
151-
context.report({
152-
node: el.node,
153-
message: 'Unexpected {{expressionName}} in "{{propertyName}}" computed property.',
154-
data: {
155-
expressionName: expressionTypes[el.type],
156-
propertyName: cp.key
157-
}
158-
})
108+
message: 'Unexpected {{expressionName}} in "{{propertyName}}" computed property.',
109+
data: {
110+
expressionName: expressionTypes[type],
111+
propertyName: cp.key
159112
}
160113
})
161-
})
114+
}
162115
})
163-
)
116+
}
117+
return utils.defineVueVisitor(context, {
118+
ObjectExpression (node, { node: vueNode }) {
119+
if (node !== vueNode) {
120+
return
121+
}
122+
computedPropertiesMap.set(node, utils.getComputedProperties(node))
123+
},
124+
':function': onFunctionEnter,
125+
':function:exit': onFunctionExit,
126+
127+
NewExpression (node, { node: vueNode }) {
128+
if (node.callee.name === 'Promise') {
129+
verify(node, scopeStack.body, 'new', computedPropertiesMap.get(vueNode))
130+
}
131+
},
132+
133+
CallExpression (node, { node: vueNode }) {
134+
if (isPromise(node)) {
135+
verify(node, scopeStack.body, 'promise', computedPropertiesMap.get(vueNode))
136+
} else if (isTimedFunction(node)) {
137+
verify(node, scopeStack.body, 'timed', computedPropertiesMap.get(vueNode))
138+
}
139+
},
140+
141+
AwaitExpression (node, { node: vueNode }) {
142+
verify(node, scopeStack.body, 'await', computedPropertiesMap.get(vueNode))
143+
}
144+
})
164145
}
165146
}

Diff for: lib/rules/no-deprecated-events-api.js

+7-18
Original file line numberDiff line numberDiff line change
@@ -30,28 +30,17 @@ module.exports = {
3030
},
3131

3232
create (context) {
33-
const forbiddenNodes = []
34-
35-
return Object.assign(
33+
return utils.defineVueVisitor(context,
3634
{
3735
'CallExpression > MemberExpression > ThisExpression' (node) {
3836
if (!['$on', '$off', '$once'].includes(node.parent.property.name)) return
39-
forbiddenNodes.push(node.parent.parent)
37+
38+
context.report({
39+
node: node.parent.parent,
40+
messageId: 'noDeprecatedEventsApi'
41+
})
4042
}
41-
},
42-
utils.executeOnVue(context, (obj) => {
43-
forbiddenNodes.forEach(node => {
44-
if (
45-
node.loc.start.line >= obj.loc.start.line &&
46-
node.loc.end.line <= obj.loc.end.line
47-
) {
48-
context.report({
49-
node,
50-
messageId: 'noDeprecatedEventsApi'
51-
})
52-
}
53-
})
54-
})
43+
}
5544
)
5645
}
5746
}

Diff for: lib/rules/no-lifecycle-after-await.js

+43-56
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,6 @@ module.exports = {
2525
create (context) {
2626
const lifecycleHookCallNodes = new Set()
2727
const setupFunctions = new Map()
28-
const forbiddenNodes = new Map()
29-
30-
function addForbiddenNode (property, node) {
31-
let list = forbiddenNodes.get(property)
32-
if (!list) {
33-
list = []
34-
forbiddenNodes.set(property, list)
35-
}
36-
list.push(node)
37-
}
3828

3929
let scopeStack = { upper: null, functionNode: null }
4030

@@ -56,56 +46,53 @@ module.exports = {
5646
for (const { node } of tracker.iterateEsmReferences(traceMap)) {
5747
lifecycleHookCallNodes.add(node)
5848
}
59-
},
60-
'Property[value.type=/^(Arrow)?FunctionExpression$/]' (node) {
61-
if (utils.getStaticPropertyName(node) !== 'setup') {
62-
return
63-
}
64-
65-
setupFunctions.set(node.value, {
66-
setupProperty: node,
67-
afterAwait: false
68-
})
69-
},
70-
':function' (node) {
71-
scopeStack = { upper: scopeStack, functionNode: node }
72-
},
73-
'AwaitExpression' () {
74-
const setupFunctionData = setupFunctions.get(scopeStack.functionNode)
75-
if (!setupFunctionData) {
76-
return
77-
}
78-
setupFunctionData.afterAwait = true
79-
},
80-
'CallExpression' (node) {
81-
const setupFunctionData = setupFunctions.get(scopeStack.functionNode)
82-
if (!setupFunctionData || !setupFunctionData.afterAwait) {
83-
return
84-
}
85-
86-
if (lifecycleHookCallNodes.has(node)) {
87-
addForbiddenNode(setupFunctionData.setupProperty, node)
88-
}
89-
},
90-
':function:exit' (node) {
91-
scopeStack = scopeStack.upper
92-
93-
setupFunctions.delete(node)
9449
}
9550
},
96-
utils.executeOnVue(context, obj => {
97-
const reportsList = obj.properties
98-
.map(item => forbiddenNodes.get(item))
99-
.filter(reports => !!reports)
100-
for (const reports of reportsList) {
101-
for (const node of reports) {
102-
context.report({
103-
node,
104-
messageId: 'forbidden'
51+
utils.defineVueVisitor(context,
52+
{
53+
'Property[value.type=/^(Arrow)?FunctionExpression$/]' (node, { node: vueNode }) {
54+
if (node.parent !== vueNode) {
55+
return
56+
}
57+
if (utils.getStaticPropertyName(node) !== 'setup') {
58+
return
59+
}
60+
61+
setupFunctions.set(node.value, {
62+
setupProperty: node,
63+
afterAwait: false
10564
})
65+
},
66+
':function' (node) {
67+
scopeStack = { upper: scopeStack, functionNode: node }
68+
},
69+
'AwaitExpression' () {
70+
const setupFunctionData = setupFunctions.get(scopeStack.functionNode)
71+
if (!setupFunctionData) {
72+
return
73+
}
74+
setupFunctionData.afterAwait = true
75+
},
76+
'CallExpression' (node) {
77+
const setupFunctionData = setupFunctions.get(scopeStack.functionNode)
78+
if (!setupFunctionData || !setupFunctionData.afterAwait) {
79+
return
80+
}
81+
82+
if (lifecycleHookCallNodes.has(node)) {
83+
context.report({
84+
node,
85+
messageId: 'forbidden'
86+
})
87+
}
88+
},
89+
':function:exit' (node) {
90+
scopeStack = scopeStack.upper
91+
92+
setupFunctions.delete(node)
10693
}
107-
}
108-
})
94+
},
95+
)
10996
)
11097
}
11198
}

0 commit comments

Comments
 (0)