Skip to content

Commit 3a6fdbe

Browse files
authored
feat: add no-multiple-resolved rule (#369)
* feat: add `no-multiple-resolved` rule * fix index.js * minor refactor
1 parent df25e3c commit 3a6fdbe

File tree

6 files changed

+796
-1
lines changed

6 files changed

+796
-1
lines changed

__tests__/no-multiple-resolved.js

Lines changed: 310 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,310 @@
1+
'use strict'
2+
3+
const rule = require('../rules/no-multiple-resolved')
4+
const RuleTester = require('eslint').RuleTester
5+
const ruleTester = new RuleTester({
6+
parserOptions: {
7+
ecmaVersion: 2020,
8+
},
9+
})
10+
11+
ruleTester.run('no-multiple-resolved', rule, {
12+
valid: [
13+
`new Promise((resolve, reject) => {
14+
fn((error, value) => {
15+
if (error) {
16+
reject(error)
17+
} else {
18+
resolve(value)
19+
}
20+
})
21+
})`,
22+
`new Promise((resolve, reject) => {
23+
if (error) {
24+
reject(error)
25+
} else {
26+
resolve(value)
27+
}
28+
})`,
29+
`new Promise((resolve, reject) => {
30+
fn((error, value) => {
31+
if (error) {
32+
reject(error)
33+
return
34+
}
35+
resolve(value)
36+
})
37+
})`,
38+
`new Promise((resolve, reject) => {
39+
fn((error, value) => {
40+
if (error) {
41+
reject(error)
42+
}
43+
if (!error) {
44+
resolve(value)
45+
}
46+
})
47+
})`,
48+
`new Promise((resolve, reject) => {
49+
fn((error, value) => {
50+
if (error) {
51+
reject(error)
52+
}
53+
if (error) {
54+
return
55+
}
56+
resolve(value)
57+
})
58+
})`,
59+
`
60+
new Promise((resolve, reject) => {
61+
fn((error, value) => {
62+
if (error) {
63+
reject(error)
64+
}
65+
if (!error) {
66+
// process
67+
} else {
68+
// process
69+
}
70+
if(!error) {
71+
resolve(value)
72+
}
73+
})
74+
})`,
75+
`
76+
new Promise((resolve, reject) => {
77+
fn((error, value) => {
78+
if (error) {
79+
reject(error)
80+
return
81+
}
82+
if (!error) {
83+
// process
84+
} else {
85+
// process
86+
}
87+
88+
resolve(value)
89+
})
90+
})`,
91+
],
92+
93+
invalid: [
94+
{
95+
code: `
96+
new Promise((resolve, reject) => {
97+
fn((error, value) => {
98+
if (error) {
99+
reject(error)
100+
}
101+
102+
resolve(value)
103+
})
104+
})`,
105+
errors: [
106+
{
107+
message:
108+
'Promise should not be resolved multiple times. Promise is potentially resolved on line 5.',
109+
line: 8,
110+
},
111+
],
112+
},
113+
{
114+
code: `
115+
new Promise((resolve, reject) => {
116+
if (error) {
117+
reject(error)
118+
}
119+
120+
resolve(value)
121+
})`,
122+
errors: [
123+
{
124+
message:
125+
'Promise should not be resolved multiple times. Promise is potentially resolved on line 4.',
126+
line: 7,
127+
},
128+
],
129+
},
130+
{
131+
code: `
132+
new Promise((resolve, reject) => {
133+
reject(error)
134+
resolve(value)
135+
})`,
136+
errors: [
137+
{
138+
message:
139+
'Promise should not be resolved multiple times. Promise is already resolved on line 3.',
140+
line: 4,
141+
},
142+
],
143+
},
144+
{
145+
code: `
146+
new Promise((resolve, reject) => {
147+
fn((error, value) => {
148+
if (error) {
149+
reject(error)
150+
}
151+
if (!error) {
152+
// process
153+
} else {
154+
// process
155+
}
156+
157+
resolve(value)
158+
})
159+
})`,
160+
errors: [
161+
{
162+
message:
163+
'Promise should not be resolved multiple times. Promise is potentially resolved on line 5.',
164+
line: 13,
165+
},
166+
],
167+
},
168+
{
169+
code: `
170+
new Promise((resolve, reject) => {
171+
fn((error, value) => {
172+
if (error) {
173+
if (foo) {
174+
if (bar) reject(error)
175+
}
176+
}
177+
178+
resolve(value)
179+
})
180+
})`,
181+
errors: [
182+
{
183+
message:
184+
'Promise should not be resolved multiple times. Promise is potentially resolved on line 6.',
185+
line: 10,
186+
},
187+
],
188+
},
189+
{
190+
code: `
191+
new Promise((resolve, reject) => {
192+
fn((error, value) => {
193+
if (error) {
194+
reject(error)
195+
} else {
196+
return
197+
}
198+
199+
resolve(value)
200+
})
201+
})`,
202+
errors: [
203+
{
204+
message:
205+
'Promise should not be resolved multiple times. Promise is already resolved on line 5.',
206+
line: 10,
207+
},
208+
],
209+
},
210+
{
211+
code: `
212+
new Promise((resolve, reject) => {
213+
if(foo) {
214+
if (error) {
215+
reject(error)
216+
} else {
217+
return
218+
}
219+
resolve(value)
220+
}
221+
222+
resolve(value)
223+
})`,
224+
errors: [
225+
{
226+
message:
227+
'Promise should not be resolved multiple times. Promise is already resolved on line 5.',
228+
line: 9,
229+
},
230+
{
231+
message:
232+
'Promise should not be resolved multiple times. Promise is potentially resolved on line 9.',
233+
line: 12,
234+
},
235+
],
236+
},
237+
{
238+
code: `
239+
new Promise((resolve, reject) => {
240+
if (foo) {
241+
reject(error)
242+
} else {
243+
resolve(value)
244+
}
245+
if(bar) {
246+
resolve(value)
247+
}
248+
})`,
249+
errors: [
250+
{
251+
message:
252+
'Promise should not be resolved multiple times. Promise is already resolved on line 4.',
253+
line: 9,
254+
},
255+
],
256+
},
257+
{
258+
code: `
259+
new Promise((resolve, reject) => {
260+
while (error) {
261+
reject(error)
262+
}
263+
resolve(value)
264+
})`,
265+
errors: [
266+
{
267+
message:
268+
'Promise should not be resolved multiple times. Promise is potentially resolved on line 4.',
269+
line: 6,
270+
},
271+
],
272+
},
273+
{
274+
code: `
275+
new Promise((resolve, reject) => {
276+
try {
277+
reject(error)
278+
} finally {
279+
resolve(value)
280+
}
281+
})`,
282+
errors: [
283+
{
284+
message:
285+
'Promise should not be resolved multiple times. Promise is already resolved on line 4.',
286+
line: 6,
287+
},
288+
],
289+
},
290+
{
291+
code: `
292+
new Promise((resolve, reject) => {
293+
try {
294+
if (error) {
295+
reject(error)
296+
}
297+
} finally {
298+
resolve(value)
299+
}
300+
})`,
301+
errors: [
302+
{
303+
message:
304+
'Promise should not be resolved multiple times. Promise is potentially resolved on line 5.',
305+
line: 8,
306+
},
307+
],
308+
},
309+
],
310+
})

docs/rules/no-multiple-resolved.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# Disallow creating new promises with paths that resolve multiple times (no-multiple-resolved)
2+
3+
This rule warns of paths that resolve multiple times in executor functions that
4+
Promise constructors.
5+
6+
#### Valid
7+
8+
```js
9+
new Promise((resolve, reject) => {
10+
fn((error, value) => {
11+
if (error) {
12+
reject(error)
13+
} else {
14+
resolve(value)
15+
}
16+
})
17+
})
18+
```
19+
20+
#### Invalid
21+
22+
```js
23+
new Promise((resolve, reject) => {
24+
fn((error, value) => {
25+
if (error) {
26+
reject(error)
27+
}
28+
29+
resolve(value) // Both `reject` and `resolve` may be called.
30+
})
31+
})
32+
```

index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ module.exports = {
1616
'no-new-statics': require('./rules/no-new-statics'),
1717
'no-return-in-finally': require('./rules/no-return-in-finally'),
1818
'valid-params': require('./rules/valid-params'),
19+
'no-multiple-resolved': require('./rules/no-multiple-resolved'),
1920
},
2021
rulesConfig: {
2122
'param-names': 1,

0 commit comments

Comments
 (0)