From 6acff3490cefcb13f87f141873065fa3ab7208f3 Mon Sep 17 00:00:00 2001 From: soobing Date: Sat, 1 Aug 2020 19:57:00 +0900 Subject: [PATCH 1/6] fix: importing symbol with name Function check --- .../eslint-plugin/src/rules/no-implied-eval.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/packages/eslint-plugin/src/rules/no-implied-eval.ts b/packages/eslint-plugin/src/rules/no-implied-eval.ts index dd36fb73ec4..f74918bfbcd 100644 --- a/packages/eslint-plugin/src/rules/no-implied-eval.ts +++ b/packages/eslint-plugin/src/rules/no-implied-eval.ts @@ -35,6 +35,7 @@ export default util.createRule({ defaultOptions: [], create(context) { const parserServices = util.getParserServices(context); + const program = parserServices.program; const checker = parserServices.program.getTypeChecker(); function getCalleeName( @@ -113,11 +114,27 @@ export default util.createRule({ function checkImpliedEval( node: TSESTree.NewExpression | TSESTree.CallExpression, ): void { + const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node); + const type = checker.getTypeAtLocation(tsNode); + const calleeName = getCalleeName(node.callee); if (calleeName === null) { return; } + const symbol = type.getSymbol(); + if (!symbol) { + return; + } + + const declarations = symbol.getDeclarations() ?? []; + for (const declaration of declarations) { + const sourceFile = declaration.getSourceFile(); + if (program.isSourceFileDefaultLibrary(sourceFile)) { + return; + } + } + if (calleeName === FUNCTION_CONSTRUCTOR) { context.report({ node, messageId: 'noFunctionConstructor' }); return; From e4e01b05013b95fa563178d2477d3478bc89899c Mon Sep 17 00:00:00 2001 From: soobing Date: Sun, 2 Aug 2020 13:32:26 +0900 Subject: [PATCH 2/6] =?UTF-8?q?test:=20function=20import=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/eslint-plugin/tests/rules/no-implied-eval.test.ts | 5 +++++ 1 file changed, 5 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 818514c6b0b..4b9307d0be0 100644 --- a/packages/eslint-plugin/tests/rules/no-implied-eval.test.ts +++ b/packages/eslint-plugin/tests/rules/no-implied-eval.test.ts @@ -6,6 +6,7 @@ const ruleTester = new RuleTester({ parserOptions: { tsconfigRootDir: rootDir, ecmaVersion: 2015, + sourceType: 'module', project: './tsconfig.json', }, parser: '@typescript-eslint/parser', @@ -241,6 +242,10 @@ const fn = (foo: () => void) => { execScript(foo); }; `, + ` +import { Function } from "./missing"; +new Function("foo"); + `, ], invalid: [ From b9af07cf51032cae88047f232240578049bcbec2 Mon Sep 17 00:00:00 2001 From: soobing Date: Sun, 2 Aug 2020 13:33:57 +0900 Subject: [PATCH 3/6] =?UTF-8?q?test:=20function=20fixture=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/eslint-plugin/tests/fixtures/class.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/eslint-plugin/tests/fixtures/class.ts b/packages/eslint-plugin/tests/fixtures/class.ts index 044e44e44ae..89f06af9e8e 100644 --- a/packages/eslint-plugin/tests/fixtures/class.ts +++ b/packages/eslint-plugin/tests/fixtures/class.ts @@ -8,3 +8,6 @@ export const console = { log() {} }; export class Reducable { reduce() {} } + +// used by no-implied-eval test function imports +export class Function {} From 2ca5940d22bf8da01bab6eb3e77a69778383465b Mon Sep 17 00:00:00 2001 From: soobing Date: Sun, 2 Aug 2020 14:04:15 +0900 Subject: [PATCH 4/6] test: check is SourceFileDefaultLibrary --- .../src/rules/no-implied-eval.ts | 20 +++++++++++++++++-- .../tests/rules/no-implied-eval.test.ts | 2 +- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/packages/eslint-plugin/src/rules/no-implied-eval.ts b/packages/eslint-plugin/src/rules/no-implied-eval.ts index dd36fb73ec4..dd811c09af9 100644 --- a/packages/eslint-plugin/src/rules/no-implied-eval.ts +++ b/packages/eslint-plugin/src/rules/no-implied-eval.ts @@ -36,6 +36,7 @@ export default util.createRule({ create(context) { const parserServices = util.getParserServices(context); const checker = parserServices.program.getTypeChecker(); + const program = parserServices.program; function getCalleeName( node: TSESTree.LeftHandSideExpression, @@ -113,14 +114,29 @@ export default util.createRule({ function checkImpliedEval( node: TSESTree.NewExpression | TSESTree.CallExpression, ): void { + const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node.callee); + const type = checker.getTypeAtLocation(tsNode); + const calleeName = getCalleeName(node.callee); if (calleeName === null) { return; } if (calleeName === FUNCTION_CONSTRUCTOR) { - context.report({ node, messageId: 'noFunctionConstructor' }); - return; + const symbol = type.getSymbol(); + if (symbol) { + const declarations = symbol.getDeclarations() ?? []; + for (const declaration of declarations) { + const sourceFile = declaration.getSourceFile(); + if (program.isSourceFileDefaultLibrary(sourceFile)) { + context.report({ node, messageId: 'noFunctionConstructor' }); + return; + } + } + } else { + context.report({ node, messageId: 'noFunctionConstructor' }); + return; + } } if (node.arguments.length === 0) { 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 4b9307d0be0..a88c6cbbb59 100644 --- a/packages/eslint-plugin/tests/rules/no-implied-eval.test.ts +++ b/packages/eslint-plugin/tests/rules/no-implied-eval.test.ts @@ -243,7 +243,7 @@ const fn = (foo: () => void) => { }; `, ` -import { Function } from "./missing"; +import { Function } from "./class"; new Function("foo"); `, ], From f670212f2f520733c860b184e335007b24be5a0f Mon Sep 17 00:00:00 2001 From: soobing Date: Sun, 2 Aug 2020 14:14:25 +0900 Subject: [PATCH 5/6] refactor: delete duplicate code --- packages/eslint-plugin/src/rules/no-implied-eval.ts | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/packages/eslint-plugin/src/rules/no-implied-eval.ts b/packages/eslint-plugin/src/rules/no-implied-eval.ts index 84acf22cf62..afda630b6b6 100644 --- a/packages/eslint-plugin/src/rules/no-implied-eval.ts +++ b/packages/eslint-plugin/src/rules/no-implied-eval.ts @@ -122,19 +122,6 @@ export default util.createRule({ return; } - const symbol = type.getSymbol(); - if (!symbol) { - return; - } - - const declarations = symbol.getDeclarations() ?? []; - for (const declaration of declarations) { - const sourceFile = declaration.getSourceFile(); - if (program.isSourceFileDefaultLibrary(sourceFile)) { - return; - } - } - if (calleeName === FUNCTION_CONSTRUCTOR) { const symbol = type.getSymbol(); if (symbol) { From e056278ef27dd8675e4c75a780e288d7f6600f3e Mon Sep 17 00:00:00 2001 From: soobing Date: Sun, 2 Aug 2020 14:37:58 +0900 Subject: [PATCH 6/6] fix: lint --- packages/eslint-plugin/tests/rules/no-implied-eval.test.ts | 4 ++-- 1 file changed, 2 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 a88c6cbbb59..f5ceba4fe94 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,8 @@ const fn = (foo: () => void) => { }; `, ` -import { Function } from "./class"; -new Function("foo"); +import { Function } from './class'; +new Function('foo'); `, ],