From 8b4a758ed28e1d1268894f6d71d0847e365e286f Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 3 Feb 2023 14:38:40 +0100 Subject: [PATCH] eslint-plugin: add support for require calls Signed-off-by: Patrik Oldsberg --- packages/eslint-plugin/lib/visitImports.js | 36 ++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/packages/eslint-plugin/lib/visitImports.js b/packages/eslint-plugin/lib/visitImports.js index c89d65fb49..5184fb8d79 100644 --- a/packages/eslint-plugin/lib/visitImports.js +++ b/packages/eslint-plugin/lib/visitImports.js @@ -56,6 +56,36 @@ const getPackages = require('./getPackages'); * @param {LocalImport | InternalImport | ExternalImport | BuiltinImport} import */ +/** + * @param {import('estree').ImportDeclaration | import('estree').ExportAllDeclaration | import('estree').ExportNamedDeclaration | import('estree').ImportExpression | import('estree').SimpleCallExpression} node + * @returns {string | undefined} + */ +function getImportPath(node) { + /** @type {import('estree').Expression | import('estree').SpreadElement | undefined | null} */ + let pathNode; + + if (node.type === 'CallExpression') { + if ( + node.callee.type === 'Identifier' && + node.callee.name == 'require' && + node.arguments.length === 1 + ) { + pathNode = node.arguments[0]; + } + } else { + pathNode = node.source; + } + + if (pathNode?.type !== 'Literal') { + return undefined; + } + if (typeof pathNode.value !== 'string') { + return undefined; + } + + return pathNode.value; +} + /** * @param visitor - Visitor callback * @param {import('eslint').Rule.RuleContext} context @@ -68,10 +98,11 @@ module.exports = function visitImports(context, visitor) { } function visit(node) { - if (!node.source) { + const importPath = getImportPath(node); + if (!importPath) { return; } - const importPath = node.source.value; + if (importPath[0] === '.') { return visitor(node, { type: 'local', path: importPath }); } @@ -112,5 +143,6 @@ module.exports = function visitImports(context, visitor) { ExportAllDeclaration: visit, ExportNamedDeclaration: visit, ImportExpression: visit, + CallExpression: visit, }; };