/
prefer-promise-reject-errors.js
128 lines (113 loc) · 4.69 KB
/
prefer-promise-reject-errors.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/**
* @fileoverview restrict values that can be used as Promise rejection reasons
* @author Teddy Katz
*/
"use strict";
//------------------------------------------------------------------------------
// Requirements
//------------------------------------------------------------------------------
const rule = require("../../../lib/rules/prefer-promise-reject-errors");
const { RuleTester } = require("../../../lib/rule-tester");
//------------------------------------------------------------------------------
// Tests
//------------------------------------------------------------------------------
const ruleTester = new RuleTester({ parserOptions: { ecmaVersion: 2021 } });
ruleTester.run("prefer-promise-reject-errors", rule, {
valid: [
"Promise.resolve(5)",
"Foo.reject(5)",
"Promise.reject(foo)",
"Promise.reject(foo.bar)",
"Promise.reject(foo.bar())",
"Promise.reject(new Error())",
"Promise.reject(new TypeError)",
"Promise.reject(new Error('foo'))",
"Promise.reject(foo || 5)",
"Promise.reject(5 && foo)",
"new Foo((resolve, reject) => reject(5))",
"new Promise(function(resolve, reject) { return function(reject) { reject(5) } })",
"new Promise(function(resolve, reject) { if (foo) { const reject = somethingElse; reject(5) } })",
"new Promise(function(resolve, {apply}) { apply(5) })",
"new Promise(function(resolve, reject) { resolve(5, reject) })",
"async function foo() { Promise.reject(await foo); }",
{
code: "Promise.reject()",
options: [{ allowEmptyReject: true }]
},
{
code: "new Promise(function(resolve, reject) { reject() })",
options: [{ allowEmptyReject: true }]
},
// Optional chaining
"Promise.reject(obj?.foo)",
"Promise.reject(obj?.foo())",
// Assignments
"Promise.reject(foo = new Error())",
"Promise.reject(foo ||= 5)",
"Promise.reject(foo.bar ??= 5)",
"Promise.reject(foo[bar] ??= 5)"
],
invalid: [
"Promise.reject(5)",
"Promise.reject('foo')",
"Promise.reject(`foo`)",
"Promise.reject(!foo)",
"Promise.reject(void foo)",
"Promise.reject()",
"Promise.reject(undefined)",
"Promise.reject({ foo: 1 })",
"Promise.reject([1, 2, 3])",
{
code: "Promise.reject()",
options: [{ allowEmptyReject: false }]
},
{
code: "new Promise(function(resolve, reject) { reject() })",
options: [{ allowEmptyReject: false }]
},
{
code: "Promise.reject(undefined)",
options: [{ allowEmptyReject: true }]
},
"Promise.reject('foo', somethingElse)",
"new Promise(function(resolve, reject) { reject(5) })",
"new Promise((resolve, reject) => { reject(5) })",
"new Promise((resolve, reject) => reject(5))",
"new Promise((resolve, reject) => reject())",
"new Promise(function(yes, no) { no(5) })",
`
new Promise((resolve, reject) => {
fs.readFile('foo.txt', (err, file) => {
if (err) reject('File not found')
else resolve(file)
})
})
`,
"new Promise(({foo, bar, baz}, reject) => reject(5))",
"new Promise(function(reject, reject) { reject(5) })",
"new Promise(function(foo, arguments) { arguments(5) })",
"new Promise((foo, arguments) => arguments(5))",
"new Promise(function({}, reject) { reject(5) })",
"new Promise(({}, reject) => reject(5))",
"new Promise((resolve, reject, somethingElse = reject(5)) => {})",
// Optional chaining
"Promise.reject?.(5)",
"Promise?.reject(5)",
"Promise?.reject?.(5)",
"(Promise?.reject)(5)",
"(Promise?.reject)?.(5)",
// Assignments with mathematical operators will either evaluate to a primitive value or throw a TypeError
"Promise.reject(foo += new Error())",
"Promise.reject(foo -= new Error())",
"Promise.reject(foo **= new Error())",
"Promise.reject(foo <<= new Error())",
"Promise.reject(foo |= new Error())",
"Promise.reject(foo &= new Error())",
// evaluates either to a falsy value of `foo` (which, then, cannot be an Error object), or to `5`
"Promise.reject(foo && 5)",
"Promise.reject(foo &&= 5)"
].map(invalidCase => {
const errors = { errors: [{ messageId: "rejectAnError", type: "CallExpression" }] };
return Object.assign({}, errors, typeof invalidCase === "string" ? { code: invalidCase } : invalidCase);
})
});