diff --git a/lib/util/import-target.js b/lib/util/import-target.js index 34aa4318..238ce2a7 100644 --- a/lib/util/import-target.js +++ b/lib/util/import-target.js @@ -74,7 +74,7 @@ function getTSConfigAliases(context) { * @property {Partial} [resolverConfig] * @property {string} basedir */ -/** @typedef { 'unknown' | 'relative' | 'absolute' | 'node' | 'npm' | 'http' } ModuleType */ +/** @typedef { 'unknown' | 'relative' | 'absolute' | 'node' | 'npm' | 'http' | 'data' } ModuleType */ /** @typedef { 'import' | 'require' | 'type' } ModuleStyle */ /** @@ -176,6 +176,10 @@ module.exports = class ImportTarget { return "node" } + if (/^data:/.test(this.name)) { + return "data" + } + if (/^(@[\w~-][\w.~-]*\/)?[\w~-][\w.~-]*/.test(this.name)) { return "npm" } @@ -242,7 +246,7 @@ module.exports = class ImportTarget { * @returns {string | undefined} */ getModuleName() { - if (this.moduleType === "relative") return + if (this.moduleType === "relative" || this.moduleType === "data") return if (this.moduleType === "npm") { if (this.name.startsWith("@")) { @@ -296,6 +300,10 @@ module.exports = class ImportTarget { * @returns {string | null} The resolved path. */ getFilePath() { + if (this.moduleType === "data" && this.moduleStyle === "import") { + return this.name + } + const conditionNames = ["node", "require"] const mainFields = [] diff --git a/tests/lib/rules/no-missing-import.js b/tests/lib/rules/no-missing-import.js index 478e181f..f104b4c8 100644 --- a/tests/lib/rules/no-missing-import.js +++ b/tests/lib/rules/no-missing-import.js @@ -366,6 +366,12 @@ ruleTester.run("no-missing-import", rule, { options: [{ ignoreTypeImport: true }], }, + // data import + { + filename: fixture("test.js"), + code: "import 'data:text/javascript,const x = 123;';", + }, + // import() ...(DynamicImportSupported ? [ diff --git a/tests/lib/rules/no-missing-require.js b/tests/lib/rules/no-missing-require.js index f640e719..17653ce2 100644 --- a/tests/lib/rules/no-missing-require.js +++ b/tests/lib/rules/no-missing-require.js @@ -463,6 +463,14 @@ ruleTester.run("no-missing-require", rule, { code: "require('virtual:package-scope/name');", errors: cantResolve("virtual:package-scope/name"), }, + + // Sanity test for (wrong) attempt to require data + // (this should only be supported in imports) + { + filename: fixture("test.js"), + code: "require('data:text/javascript,const x = 123;');", + errors: cantResolve("data:text/javascript,const x = 123;"), + }, ], })