diff --git a/tests/src/rules/no-unresolved.js b/tests/src/rules/no-unresolved.js index da7d4dc5ae..3c0346283d 100644 --- a/tests/src/rules/no-unresolved.js +++ b/tests/src/rules/no-unresolved.js @@ -1,6 +1,6 @@ import * as path from 'path'; -import { test, SYNTAX_CASES } from '../utils'; +import { test, SYNTAX_CASES, testVersion } from '../utils'; import { CASE_SENSITIVE_FS } from 'eslint-module-utils/resolve'; @@ -93,7 +93,6 @@ function runResolverTests(resolver) { '\'./reallyfake/module\'.' }], }), - rest({ code: "import bar from './baz';", errors: [{ message: "Unable to resolve path to module './baz'.", @@ -382,3 +381,22 @@ ruleTester.run('no-unresolved syntax verification', rule, { valid: SYNTAX_CASES, invalid:[], }); + +// https://github.com/benmosher/eslint-plugin-import/issues/2024 +ruleTester.run('import() with built-in parser', rule, { + valid: [].concat( + testVersion('>=7', () => ({ + code: "import('fs');", + parser: require.resolve('espree'), + parserOptions: { ecmaVersion: 2021 }, + })) || [], + ), + invalid: [].concat( + testVersion('>=7', () => ({ + code: 'import("./does-not-exist").then(() => {})', + parser: require.resolve('espree'), + parserOptions: { ecmaVersion: 2021 }, + errors: ["Unable to resolve path to module './does-not-exist'."], + })) || [], + ), +}); diff --git a/utils/moduleVisitor.js b/utils/moduleVisitor.js index d801515bce..69269985bd 100644 --- a/utils/moduleVisitor.js +++ b/utils/moduleVisitor.js @@ -36,10 +36,17 @@ exports.default = function visitModules(visitor, options) { // for esmodule dynamic `import()` calls function checkImportCall(node) { - if (node.callee.type !== 'Import') return; - if (node.arguments.length !== 1) return; + let modulePath; + // refs https://github.com/estree/estree/blob/master/es2020.md#importexpression + if (node.type === 'ImportExpression') { + modulePath = node.source; + } else if (node.type === 'CallExpression') { + if (node.callee.type !== 'Import') return; + if (node.arguments.length !== 1) return; + + modulePath = node.arguments[0]; + } - const modulePath = node.arguments[0]; if (modulePath.type !== 'Literal') return; if (typeof modulePath.value !== 'string') return; @@ -87,6 +94,7 @@ exports.default = function visitModules(visitor, options) { 'ExportNamedDeclaration': checkSource, 'ExportAllDeclaration': checkSource, 'CallExpression': checkImportCall, + 'ImportExpression': checkImportCall, }); }