diff --git a/packages/eslint-plugin/src/rules/no-var-requires.ts b/packages/eslint-plugin/src/rules/no-var-requires.ts index 26c49cc9dd2..d7ed1d16f7f 100644 --- a/packages/eslint-plugin/src/rules/no-var-requires.ts +++ b/packages/eslint-plugin/src/rules/no-var-requires.ts @@ -25,20 +25,24 @@ export default util.createRule({ defaultOptions: [], create(context) { return { - CallExpression(node: TSESTree.CallExpression): void { + 'CallExpression[callee.name="require"]'( + node: TSESTree.CallExpression, + ): void { const parent = node.parent?.type === AST_NODE_TYPES.ChainExpression ? node.parent.parent : node.parent; + if ( - node.callee.type === AST_NODE_TYPES.Identifier && - node.callee.name === 'require' && parent && - (parent.type === AST_NODE_TYPES.VariableDeclarator || - parent.type === AST_NODE_TYPES.CallExpression || - parent.type === AST_NODE_TYPES.TSAsExpression || - parent.type === AST_NODE_TYPES.TSTypeAssertion || - parent.type === AST_NODE_TYPES.MemberExpression) + [ + AST_NODE_TYPES.CallExpression, + AST_NODE_TYPES.MemberExpression, + AST_NODE_TYPES.NewExpression, + AST_NODE_TYPES.TSAsExpression, + AST_NODE_TYPES.TSTypeAssertion, + AST_NODE_TYPES.VariableDeclarator, + ].includes(parent.type) ) { context.report({ node, diff --git a/packages/eslint-plugin/tests/rules/no-var-requires.test.ts b/packages/eslint-plugin/tests/rules/no-var-requires.test.ts index 688b010e417..8c6ef638a16 100644 --- a/packages/eslint-plugin/tests/rules/no-var-requires.test.ts +++ b/packages/eslint-plugin/tests/rules/no-var-requires.test.ts @@ -132,5 +132,24 @@ ruleTester.run('no-var-requires', rule, { }, ], }, + { + // https://github.com/typescript-eslint/typescript-eslint/issues/3883 + code: ` +const configValidator = new Validator(require('./a.json')); +configValidator.addSchema(require('./a.json')); + `, + errors: [ + { + messageId: 'noVarReqs', + line: 2, + column: 39, + }, + { + messageId: 'noVarReqs', + line: 3, + column: 27, + }, + ], + }, ], });