From b5cc2c5d4bec158d930b694612b3a29959f97e16 Mon Sep 17 00:00:00 2001 From: soobing Date: Sat, 22 Aug 2020 15:42:43 +0900 Subject: [PATCH 1/5] test: Function type callback --- packages/eslint-plugin/tests/rules/no-implied-eval.test.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/eslint-plugin/tests/rules/no-implied-eval.test.ts b/packages/eslint-plugin/tests/rules/no-implied-eval.test.ts index f5ceba4fe94a..6b69c80943f0 100644 --- a/packages/eslint-plugin/tests/rules/no-implied-eval.test.ts +++ b/packages/eslint-plugin/tests/rules/no-implied-eval.test.ts @@ -243,8 +243,9 @@ const fn = (foo: () => void) => { }; `, ` -import { Function } from './class'; -new Function('foo'); +const foo = (callback: Function) => { + setTimeout(callback, 0); +}; `, ], From 755896d88173c31de4c524585b8a44efaed00683 Mon Sep 17 00:00:00 2001 From: soobing Date: Sat, 22 Aug 2020 16:41:47 +0900 Subject: [PATCH 2/5] fix: symbol who has 33554497, Function --- packages/eslint-plugin/src/rules/no-implied-eval.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/eslint-plugin/src/rules/no-implied-eval.ts b/packages/eslint-plugin/src/rules/no-implied-eval.ts index afda630b6b6c..d6b50c74d9f9 100644 --- a/packages/eslint-plugin/src/rules/no-implied-eval.ts +++ b/packages/eslint-plugin/src/rules/no-implied-eval.ts @@ -80,6 +80,14 @@ export default util.createRule({ return true; } + if ( + symbol && + symbol.flags === 33554497 && + symbol.escapedName === 'Function' + ) { + return true; + } + const signatures = checker.getSignaturesOfType( type, ts.SignatureKind.Call, From 40b061d8def54398153eb59dcf67040464e10470 Mon Sep 17 00:00:00 2001 From: soobing Date: Sat, 29 Aug 2020 15:02:51 +0900 Subject: [PATCH 3/5] test: revert erased test --- packages/eslint-plugin/tests/rules/no-implied-eval.test.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/eslint-plugin/tests/rules/no-implied-eval.test.ts b/packages/eslint-plugin/tests/rules/no-implied-eval.test.ts index 6b69c80943f0..a9867d73018d 100644 --- a/packages/eslint-plugin/tests/rules/no-implied-eval.test.ts +++ b/packages/eslint-plugin/tests/rules/no-implied-eval.test.ts @@ -243,6 +243,10 @@ const fn = (foo: () => void) => { }; `, ` +import { Function } from './class'; +new Function('foo'); + `, + ` const foo = (callback: Function) => { setTimeout(callback, 0); }; From fad7efcbc79eef84516f3c48f6f555f8b4520e8c Mon Sep 17 00:00:00 2001 From: soobing Date: Sat, 29 Aug 2020 15:20:52 +0900 Subject: [PATCH 4/5] fix: update combination of symbol flags, const --- packages/eslint-plugin/src/rules/no-implied-eval.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/eslint-plugin/src/rules/no-implied-eval.ts b/packages/eslint-plugin/src/rules/no-implied-eval.ts index d6b50c74d9f9..e2df9c782df0 100644 --- a/packages/eslint-plugin/src/rules/no-implied-eval.ts +++ b/packages/eslint-plugin/src/rules/no-implied-eval.ts @@ -82,8 +82,13 @@ export default util.createRule({ if ( symbol && - symbol.flags === 33554497 && - symbol.escapedName === 'Function' + tsutils.isSymbolFlagSet( + symbol, + ts.SymbolFlags.FunctionScopedVariable | + ts.SymbolFlags.Interface | + ts.SymbolFlags.Transient, + ) && + symbol.escapedName === FUNCTION_CONSTRUCTOR ) { return true; } From 2f34f0ba45415d54a5a56a3d8c8ca83254e6adac Mon Sep 17 00:00:00 2001 From: soobing Date: Mon, 7 Sep 2020 22:27:28 +0900 Subject: [PATCH 5/5] refactor: check function --- .../src/rules/no-implied-eval.ts | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/packages/eslint-plugin/src/rules/no-implied-eval.ts b/packages/eslint-plugin/src/rules/no-implied-eval.ts index e2df9c782df0..1e063847da3f 100644 --- a/packages/eslint-plugin/src/rules/no-implied-eval.ts +++ b/packages/eslint-plugin/src/rules/no-implied-eval.ts @@ -80,17 +80,14 @@ export default util.createRule({ return true; } - if ( - symbol && - tsutils.isSymbolFlagSet( - symbol, - ts.SymbolFlags.FunctionScopedVariable | - ts.SymbolFlags.Interface | - ts.SymbolFlags.Transient, - ) && - symbol.escapedName === FUNCTION_CONSTRUCTOR - ) { - return true; + if (symbol && symbol.escapedName === FUNCTION_CONSTRUCTOR) { + const declarations = symbol.getDeclarations() ?? []; + for (const declaration of declarations) { + const sourceFile = declaration.getSourceFile(); + if (program.isSourceFileDefaultLibrary(sourceFile)) { + return true; + } + } } const signatures = checker.getSignaturesOfType(