Skip to content

Commit 33e3e6f

Browse files
authored
fix(eslint-plugin): [no-implied-eval] correct logic for ts3.8 (typescript-eslint#1652)
1 parent fc0a55e commit 33e3e6f

File tree

2 files changed

+49
-92
lines changed

2 files changed

+49
-92
lines changed

packages/eslint-plugin/src/rules/no-implied-eval.ts

+7-8
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
TSESTree,
44
AST_NODE_TYPES,
55
} from '@typescript-eslint/experimental-utils';
6+
import * as tsutils from 'tsutils';
67
import * as util from '../util';
78

89
const FUNCTION_CONSTRUCTOR = 'Function';
@@ -68,8 +69,11 @@ export default util.createRule({
6869
const symbol = type.getSymbol();
6970

7071
if (
71-
symbol?.flags === ts.SymbolFlags.Function ||
72-
symbol?.flags === ts.SymbolFlags.Method
72+
symbol &&
73+
tsutils.isSymbolFlagSet(
74+
symbol,
75+
ts.SymbolFlags.Function | ts.SymbolFlags.Method,
76+
)
7377
) {
7478
return true;
7579
}
@@ -79,12 +83,7 @@ export default util.createRule({
7983
ts.SignatureKind.Call,
8084
);
8185

82-
if (signatures.length) {
83-
const [{ declaration }] = signatures;
84-
return declaration?.kind === ts.SyntaxKind.FunctionType;
85-
}
86-
87-
return false;
86+
return signatures.length > 0;
8887
}
8988

9089
function isFunction(node: TSESTree.Node): boolean {

packages/eslint-plugin/tests/rules/no-implied-eval.test.ts

+42-84
Original file line numberDiff line numberDiff line change
@@ -36,38 +36,31 @@ ruleTester.run('no-implied-eval', rule, {
3636
`window.execScript(() => {});`,
3737
`window['execScript'](() => {});`,
3838

39-
{
40-
code: `
39+
`
4140
const foo = () => {};
4241
4342
setTimeout(foo, 0);
4443
setInterval(foo, 0);
4544
setImmediate(foo);
4645
execScript(foo);
47-
`,
48-
},
49-
{
50-
code: `
46+
`,
47+
`
5148
const foo = function () {};
5249
5350
setTimeout(foo, 0);
5451
setInterval(foo, 0);
5552
setImmediate(foo);
5653
execScript(foo);
57-
`,
58-
},
59-
{
60-
code: `
54+
`,
55+
`
6156
function foo() {};
6257
6358
setTimeout(foo, 0);
6459
setInterval(foo, 0);
6560
setImmediate(foo);
6661
execScript(foo);
67-
`,
68-
},
69-
{
70-
code: `
62+
`,
63+
`
7164
const foo = {
7265
fn: () => {},
7366
}
@@ -76,10 +69,8 @@ setTimeout(foo.fn, 0);
7669
setInterval(foo.fn, 0);
7770
setImmediate(foo.fn);
7871
execScript(foo.fn);
79-
`,
80-
},
81-
{
82-
code: `
72+
`,
73+
`
8374
const foo = {
8475
fn: function () {},
8576
}
@@ -88,10 +79,8 @@ setTimeout(foo.fn, 0);
8879
setInterval(foo.fn, 0);
8980
setImmediate(foo.fn);
9081
execScript(foo.fn);
91-
`,
92-
},
93-
{
94-
code: `
82+
`,
83+
`
9584
const foo = {
9685
fn: function foo() {},
9786
}
@@ -100,10 +89,8 @@ setTimeout(foo.fn, 0);
10089
setInterval(foo.fn, 0);
10190
setImmediate(foo.fn);
10291
execScript(foo.fn);
103-
`,
104-
},
105-
{
106-
code: `
92+
`,
93+
`
10794
const foo = {
10895
fn() {},
10996
}
@@ -112,10 +99,8 @@ setTimeout(foo.fn, 0);
11299
setInterval(foo.fn, 0);
113100
setImmediate(foo.fn);
114101
execScript(foo.fn);
115-
`,
116-
},
117-
{
118-
code: `
102+
`,
103+
`
119104
const foo = {
120105
fn: () => {},
121106
}
@@ -125,10 +110,8 @@ setTimeout(foo[fn], 0);
125110
setInterval(foo[fn], 0);
126111
setImmediate(foo[fn]);
127112
execScript(foo[fn]);
128-
`,
129-
},
130-
{
131-
code: `
113+
`,
114+
`
132115
const foo = {
133116
fn: () => {},
134117
}
@@ -137,21 +120,17 @@ setTimeout(foo['fn'], 0);
137120
setInterval(foo['fn'], 0);
138121
setImmediate(foo['fn']);
139122
execScript(foo['fn']);
140-
`,
141-
},
142-
{
143-
code: `
123+
`,
124+
`
144125
const foo: () => void = () => {
145126
};
146127
147128
setTimeout(foo, 0);
148129
setInterval(foo, 0);
149130
setImmediate(foo);
150131
execScript(foo);
151-
`,
152-
},
153-
{
154-
code: `
132+
`,
133+
`
155134
const foo: (() => () => void) = () => {
156135
return () => {};
157136
}
@@ -160,30 +139,24 @@ setTimeout(foo(), 0);
160139
setInterval(foo(), 0);
161140
setImmediate(foo());
162141
execScript(foo());
163-
`,
164-
},
165-
{
166-
code: `
142+
`,
143+
`
167144
const foo: (() => () => void) = () => () => {};
168145
169146
setTimeout(foo(), 0);
170147
setInterval(foo(), 0);
171148
setImmediate(foo());
172149
execScript(foo());
173-
`,
174-
},
175-
{
176-
code: `
150+
`,
151+
`
177152
const foo = () => () => {};
178153
179154
setTimeout(foo(), 0);
180155
setInterval(foo(), 0);
181156
setImmediate(foo());
182157
execScript(foo());
183-
`,
184-
},
185-
{
186-
code: `
158+
`,
159+
`
187160
const foo = function foo () {
188161
return function foo() {}
189162
}
@@ -192,10 +165,8 @@ setTimeout(foo(), 0);
192165
setInterval(foo(), 0);
193166
setImmediate(foo());
194167
execScript(foo());
195-
`,
196-
},
197-
{
198-
code: `
168+
`,
169+
`
199170
const foo = function () {
200171
return function () {
201172
return '';
@@ -206,10 +177,8 @@ setTimeout(foo(), 0);
206177
setInterval(foo(), 0);
207178
setImmediate(foo());
208179
execScript(foo());
209-
`,
210-
},
211-
{
212-
code: `
180+
`,
181+
`
213182
const foo: (() => () => void) = function foo () {
214183
return function foo() {}
215184
}
@@ -218,10 +187,8 @@ setTimeout(foo(), 0);
218187
setInterval(foo(), 0);
219188
setImmediate(foo());
220189
execScript(foo());
221-
`,
222-
},
223-
{
224-
code: `
190+
`,
191+
`
225192
function foo() {
226193
return function foo() {
227194
return () => {};
@@ -232,10 +199,8 @@ setTimeout(foo()(), 0);
232199
setInterval(foo()(), 0);
233200
setImmediate(foo()());
234201
execScript(foo()());
235-
`,
236-
},
237-
{
238-
code: `
202+
`,
203+
`
239204
class Foo {
240205
static fn = () => {};
241206
}
@@ -244,10 +209,8 @@ setTimeout(Foo.fn, 0);
244209
setInterval(Foo.fn, 0);
245210
setImmediate(Foo.fn);
246211
execScript(Foo.fn);
247-
`,
248-
},
249-
{
250-
code: `
212+
`,
213+
`
251214
class Foo {
252215
fn() {}
253216
}
@@ -258,10 +221,8 @@ setTimeout(foo.fn, 0);
258221
setInterval(foo.fn, 0);
259222
setImmediate(foo.fn);
260223
execScript(foo.fn);
261-
`,
262-
},
263-
{
264-
code: `
224+
`,
225+
`
265226
class Foo {
266227
fn() {}
267228
}
@@ -272,18 +233,15 @@ setTimeout(fn.bind(null), 0);
272233
setInterval(fn.bind(null), 0);
273234
setImmediate(fn.bind(null));
274235
execScript(fn.bind(null));
275-
`,
276-
},
277-
{
278-
code: `
236+
`,
237+
`
279238
const fn = (foo: () => void) => {
280239
setTimeout(foo, 0);
281240
setInterval(foo, 0);
282241
setImmediate(foo);
283242
execScript(foo);
284243
}
285-
`,
286-
},
244+
`,
287245
],
288246

289247
invalid: [

0 commit comments

Comments
 (0)