diff --git a/CHANGELOG.md b/CHANGELOG.md index 438efefc98..13218e87bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ This change log adheres to standards from [Keep a CHANGELOG](http://keepachangel - [`no-extraneous-dependencies`]: Exclude flow `typeof` imports ([#1534], thanks [@devongovett]) - [`newline-after-import`]: respect decorator annotations ([#1985], thanks [@lilling]) - [`no-restricted-paths`]: enhance performance for zones with `except` paths ([#2022], thanks [@malykhinvi]) +- [`no-unresolved`]: check import() ([#2026], thanks [@aladdin-add]) ### Changed - [Generic Import Callback] Make callback for all imports once in rules ([#1237], thanks [@ljqx]) @@ -764,6 +765,7 @@ for info on changes for earlier releases. [`memo-parser`]: ./memo-parser/README.md +[#2026]: https://github.com/benmosher/eslint-plugin-import/pull/2026 [#2022]: https://github.com/benmosher/eslint-plugin-import/pull/2022 [#2021]: https://github.com/benmosher/eslint-plugin-import/pull/2021 [#1997]: https://github.com/benmosher/eslint-plugin-import/pull/1997 @@ -1355,3 +1357,4 @@ for info on changes for earlier releases. [@s-h-a-d-o-w]: https://github.com/s-h-a-d-o-w [@grit96]: https://github.com/grit96 [@lilling]: https://github.com/lilling +[@aladdin-add]: https://github.com/aladdin-add \ No newline at end of file diff --git a/tests/src/rules/no-unresolved.js b/tests/src/rules/no-unresolved.js index da7d4dc5ae..518a454cc2 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,20 @@ 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');", + parserOptions: { ecmaVersion: 2021 }, + })) || [], + ), + invalid: [].concat( + testVersion('>=7', () => ({ + code: 'import("./does-not-exist-l0w9ssmcqy9").then(() => {})', + parserOptions: { ecmaVersion: 2021 }, + errors: ["Unable to resolve path to module './does-not-exist-l0w9ssmcqy9'."], + })) || [], + ), +}); 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, }); }